diff --git a/.rubocop.yml b/.rubocop.yml index 1bd67f59709..ae173ff1fe2 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -190,6 +190,9 @@ Rails/FindEach: - limit - select - lock + Exclude: + - "spec/**/*" + - "modules/**/spec/**/*" # The http verbs in Rack::Test do not accept named parameters (params: params) Rails/HttpPositionalArguments: @@ -201,11 +204,13 @@ Rails/I18nLocaleAssignment: Enabled: true Exclude: - "spec/**/*.rb" + - "modules/*/spec/**/*.rb" Rails/I18nLocaleTexts: Enabled: true Exclude: - "spec/**/*.rb" + - "modules/*/spec/**/*.rb" # We have config.active_record.belongs_to_required_by_default = false , # which means, we do have to declare presence validators on belongs_to relations. @@ -219,6 +224,9 @@ Rails/RequireDependency: # Require save! to prevent saving without validation when saving outside of a condition. Rails/SaveBang: Enabled: true + Exclude: + - "spec/**/*" + - "modules/**/spec/**/*" # There are valid cases in which to use methods like: # * update_all @@ -325,6 +333,7 @@ RSpec/SpecFilePathFormat: CustomTransform: OpenIDConnect: openid_connect OAuthClients: oauth_clients + XWikiProviders: xwiki_providers EnforcedInflector: active_support IgnoreMethods: true @@ -475,6 +484,11 @@ Style/Proc: Style/RaiseArgs: Enabled: false +Style/RescueModifier: + Exclude: + - "spec/**/*" + - "modules/**/spec/**/*" + Style/RegexpLiteral: Enabled: false diff --git a/Gemfile b/Gemfile index afa3fb1128d..c86233ee537 100644 --- a/Gemfile +++ b/Gemfile @@ -227,7 +227,7 @@ gem "dry-validation" gem "store_attribute", "~> 2.0" # Appsignal integration -gem "appsignal", "~> 4.7", require: false +gem "appsignal", "~> 4.8", require: false # Yabeda integration gem "yabeda-activerecord" diff --git a/Gemfile.lock b/Gemfile.lock index c6ef1b70a8f..a54e6778bef 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -337,7 +337,7 @@ GEM android_key_attestation (0.3.0) anyway_config (2.8.0) ruby-next-core (~> 1.0) - appsignal (4.8.3) + appsignal (4.8.4) logger rack (>= 2.0.0) ast (2.4.3) @@ -1351,7 +1351,7 @@ GEM rubocop-factory_bot (2.28.0) lint_roller (~> 1.1) rubocop (~> 1.72, >= 1.72.1) - rubocop-openproject (0.3.0) + rubocop-openproject (0.4.0) rubocop rubocop-performance (1.26.1) lint_roller (~> 1.1) @@ -1577,7 +1577,7 @@ DEPENDENCIES acts_as_tree (~> 2.9.0) addressable (~> 2.8.9) airbrake (~> 13.0.0) - appsignal (~> 4.7) + appsignal (~> 4.8) auto_strip_attributes (~> 2.5) awesome_nested_set (~> 3.9.0) aws-sdk-core (~> 3.244) @@ -1820,7 +1820,7 @@ CHECKSUMS airbrake-ruby (6.2.2) sha256=293e34fb36e763e1b6d67ab584cce7c5b6fe9eea1a70c26d8c13c0f5d7de2fbc android_key_attestation (0.3.0) sha256=467eb01a99d2bb48ef9cf24cc13712669d7056cba5a52d009554ff037560570b anyway_config (2.8.0) sha256=f6797a7231f81202dcd3d0c07284e836e45713e761d320180348b13a5c7c9306 - appsignal (4.8.3) sha256=aa0ea5ffd39fe7530c56a6eb6efda60825ab061ef31376126cae93b009844dd7 + appsignal (4.8.4) sha256=5c708a41c2913383d19ae581140da1904dbf642b974220d6c1bc4c7fdb1cf667 ast (2.4.3) sha256=954615157c1d6a382bc27d690d973195e79db7f55e9765ac7c481c60bdb4d383 attr_required (1.0.2) sha256=f0ebfc56b35e874f4d0ae799066dbc1f81efefe2364ca3803dc9ea6a4de6cb99 auto_strip_attributes (2.6.0) sha256=a7e2e0cf744de2bcd947fd68014220702bcc88c81274c1cd9ce6f7316aae39b0 @@ -2233,7 +2233,7 @@ CHECKSUMS rubocop-ast (1.49.1) sha256=4412f3ee70f6fe4546cc489548e0f6fcf76cafcfa80fa03af67098ffed755035 rubocop-capybara (2.22.1) sha256=ced88caef23efea53f46e098ff352f8fc1068c649606ca75cb74650970f51c0c rubocop-factory_bot (2.28.0) sha256=4b17fc02124444173317e131759d195b0d762844a71a29fe8139c1105d92f0cb - rubocop-openproject (0.3.0) sha256=9554496e7ef0a2cf65dc2b32bee1bfa223b4f9ae058a5c603489d34e9001a828 + rubocop-openproject (0.4.0) sha256=ce56d9e591f9be5a4d98125b10a73564b0557a5e408f97918f9630fb15ae66ae rubocop-performance (1.26.1) sha256=cd19b936ff196df85829d264b522fd4f98b6c89ad271fa52744a8c11b8f71834 rubocop-rails (2.34.3) sha256=10d37989024865ecda8199f311f3faca990143fbac967de943f88aca11eb9ad2 rubocop-rspec (3.9.0) sha256=8fa70a3619408237d789aeecfb9beef40576acc855173e60939d63332fdb55e2 diff --git a/app/controllers/work_packages/dialogs_controller.rb b/app/controllers/work_packages/dialogs_controller.rb index 4caba9713a1..505dccafa29 100644 --- a/app/controllers/work_packages/dialogs_controller.rb +++ b/app/controllers/work_packages/dialogs_controller.rb @@ -45,7 +45,7 @@ class WorkPackages::DialogsController < ApplicationController call = WorkPackages::CreateService.new(user: current_user).call(create_params) if call.success? - flash[:notice] = I18n.t("work_package_relations_tab.relations.label_new_child_created") + flash[:notice] = create_success_message(call.result) redirect_back fallback_location: project_work_package_path(@project, call.result), status: :see_other else form_component = WorkPackages::Dialogs::CreateFormComponent.new(work_package: call.result, project: @project) @@ -99,4 +99,12 @@ class WorkPackages::DialogsController < ApplicationController project: @project } end + + def create_success_message(work_package) + if work_package.child? + I18n.t("work_package_relations_tab.relations.label_new_child_created") + else + I18n.t(:notice_successful_create) + end + end end diff --git a/app/helpers/pagination_helper.rb b/app/helpers/pagination_helper.rb index 84921efd886..c13aa981863 100644 --- a/app/helpers/pagination_helper.rb +++ b/app/helpers/pagination_helper.rb @@ -38,7 +38,7 @@ module PaginationHelper def pagination_links_full(paginator, params: {}, allowed_params: nil, per_page_links: true, **) return unless paginator.total_entries > 0 - content_tag(:div, class: "op-pagination") do + content_tag(:div, class: ["op-pagination", { "op-pagination--single-page": paginator.total_pages <= 1 }]) do concat pagination_pages_section(paginator, params:, allowed_params:, **) concat pagination_options_section(paginator, params:, allowed_params:) if per_page_links end diff --git a/app/models/import/jira_import.rb b/app/models/import/jira_import.rb index 438dbe6ccd7..10ce786c761 100644 --- a/app/models/import/jira_import.rb +++ b/app/models/import/jira_import.rb @@ -30,6 +30,8 @@ module Import class JiraImport < ApplicationRecord + include Import::JiraOpenProjectReferenceCreation + self.table_name = "jira_imports" belongs_to :jira, class_name: "Import::Jira" @@ -81,5 +83,93 @@ module Import Import::JiraUser.where(jira_import_id: id).destroy_all end # rubocop:enable Metrics/AbcSize + + def import_users + Import::JiraUser.where(jira_import_id: id).find_each do |jira_user| + import_user(jira_user) + end + end + + private + + # rubocop:disable Metrics/PerceivedComplexity + # rubocop:disable Metrics/AbcSize + def import_user(jira_user) + call = Users::CreateService + .new(user: User.system, contract_class: EmptyContract) + .call(jira_user.to_op_attributes) + + call.on_success do |_result| + create_reference!( + op_leg: call.result, + jira_leg: jira_user, + jira_import: self, + uses_existing: false + ) + end + call.on_failure do |_result| + if call.errors.find { |error| error.type == :taken }.present? + user = jira_user.try_to_find_existing_op_users.first + if user.present? + create_reference!( + op_leg: user, + jira_leg: jira_user, + jira_import: self, + uses_existing: true + ) + else + raise "Existing User is expected to be found, because there was an email " \ + "or login collision. See attributes: #{jira_user.to_op_attributes}" + end + else + raise call.message + end + end + + jira_user_groups = jira_user.payload["groups"]["items"].pluck("name") + + jira_user_groups.each do |group_name| + call = Groups::CreateService + .new(user: User.system, contract_class: EmptyContract) + .call(name: group_name) + call.on_success do |result| + group = result.result + create_reference!( + op_leg: group, + jira_leg: nil, + jira_import: self, + uses_existing: false + ) + end + call.on_failure do |_result| + if call.errors.find { |error| error.type == :taken }.present? + group = Group.where(name: group_name).first + if group.present? + create_reference!( + op_leg: group, + jira_leg: nil, + jira_import: self, + uses_existing: true + ) + else + raise "Existing Group is expected to be found. Group name: #{group_name}" + end + else + raise call.message + end + end + member_id = Import::JiraOpenProjectReference.where( + jira_import_id: id, + jira_entity_id: jira_user.id, + jira_entity_class: jira_user.class.to_s + ).pick(:op_entity_id) + group = Group.find_by!(name: group_name) + Groups::AddUsersService + .new(group, current_user: User.system) + .call(ids: [member_id], send_notifications: false) + end + end + # rubocop:enable Metrics/PerceivedComplexity + # rubocop:enable Metrics/AbcSize end end diff --git a/app/models/import/jira_user.rb b/app/models/import/jira_user.rb index da9d09f47a8..83a3f61dc98 100644 --- a/app/models/import/jira_user.rb +++ b/app/models/import/jira_user.rb @@ -43,7 +43,7 @@ module Import firstname, lastname = split_display_name(payload["displayName"]) { login: payload["name"], - password: SecureRandom.uuid, + password: OpenProject::Passwords::Generator.random_password, firstname:, lastname:, mail: payload["emailAddress"], diff --git a/app/workers/import/jira_fetch_and_import_projects_job.rb b/app/workers/import/jira_fetch_and_import_projects_job.rb index a93e2f39447..7d68aaf8c27 100644 --- a/app/workers/import/jira_fetch_and_import_projects_job.rb +++ b/app/workers/import/jira_fetch_and_import_projects_job.rb @@ -39,7 +39,7 @@ module Import fetch_and_save_users_data(jira_import) Journal::NotificationConfiguration.with(false) do - import_users(jira_import) + jira_import.import_users Import::JiraImportProjectsJob.perform_now(jira_import_id) end @@ -163,91 +163,5 @@ module Import raise "Error fetching user data for user key #{jira_user_key}: #{e.message}" end end - - def import_users(jira_import) - Import::JiraUser.where(jira_import_id: jira_import.id).find_each do |jira_user| - import_user(jira_user, jira_import) - end - end - - # rubocop:disable Metrics/PerceivedComplexity - # rubocop:disable Metrics/AbcSize - def import_user(jira_user, jira_import) - call = Users::CreateService - .new(user: User.system, contract_class: EmptyContract) - .call(jira_user.to_op_attributes) - - call.on_success do |_result| - create_reference!( - op_leg: call.result, - jira_leg: jira_user, - jira_import:, - uses_existing: false - ) - end - call.on_failure do |_result| - if call.errors.find { |error| error.type == :taken }.present? - user = jira_user.try_to_find_existing_op_users.first - if user.present? - create_reference!( - op_leg: user, - jira_leg: jira_user, - jira_import:, - uses_existing: true - ) - else - raise "Existing User is expected to be found, because there was an email " \ - "or login collision. See attributes: #{jira_user.to_op_attributes}" - end - else - raise call.message - end - end - - jira_user_groups = jira_user.payload["groups"]["items"].pluck("name") - - jira_user_groups.each do |group_name| - call = Groups::CreateService - .new(user: User.system, contract_class: EmptyContract) - .call(name: group_name) - call.on_success do |result| - group = result.result - create_reference!( - op_leg: group, - jira_leg: nil, - jira_import:, - uses_existing: false - ) - end - call.on_failure do |_result| - if call.errors.find { |error| error.type == :taken }.present? - group = Group.where(name: group_name).first - if group.present? - create_reference!( - op_leg: group, - jira_leg: nil, - jira_import:, - uses_existing: true - ) - else - raise "Existing Group is expected to be found. Group name: #{group_name}" - end - else - raise call.message - end - end - member_id = Import::JiraOpenProjectReference.where( - jira_import_id: jira_import.id, - jira_entity_id: jira_user.id, - jira_entity_class: jira_user.class.to_s - ).pick(:op_entity_id) - group = Group.find_by!(name: group_name) - Groups::AddUsersService - .new(group, current_user: User.system) - .call(ids: [member_id], send_notifications: false) - end - end - # rubocop:enable Metrics/PerceivedComplexity - # rubocop:enable Metrics/AbcSize end end diff --git a/config/locales/crowdin/es.yml b/config/locales/crowdin/es.yml index 7076819d871..88b1bfc56e7 100644 --- a/config/locales/crowdin/es.yml +++ b/config/locales/crowdin/es.yml @@ -108,13 +108,13 @@ es: trial: Prueba jemalloc_allocator: Asignador de memoria Jemalloc journal_aggregation: - caption: 'User actions on a work package (changing description, status, values, or writing comments) are grouped if performed within this period. It also controls notification and [webhook](webhook_link) delays. + caption: 'Las acciones del usuario en un paquete de trabajo (cambiar la descripción, el estado, los valores o escribir comentarios) se agrupan si se realizan dentro de este periodo. También controla los plazos de notificación y de [webhook](webhook_link). ' import: title: Importar jira: - title: Jira Migrator + title: Migrador Jira description: Utilice esta herramienta para importar datos desde su instancia de Jira. Puede configurar varios hosts de Jira y elegir qué importar en cada ejecución de importación. errors: cannot_delete_with_imports: No se puede eliminar el host de Jira con importaciones existentes @@ -125,8 +125,8 @@ es: title: Configuración de Jira new: Nueva configuración banner: - title: Limited import capabilities - description: 'This Jira Migrator is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time.' + title: Capacidades de importación limitadas + description: 'Este Migrador de Jira se encuentra actualmente en fase beta y solo puede importar datos básicos: proyectos, incidencias (nombre, título, descripción, archivos adjuntos), usuarios (nombre, correo electrónico, pertenencia a proyectos), estados y tipos. No puede importar flujos de trabajo, campos personalizados, relaciones entre incidencias ni permisos. Actualmente solo es compatible con las versiones 10.x y 11.x de Jira Server/Data Center. Por el momento, no es compatible con instancias en la nube.' form: fields: name: Nombre @@ -162,9 +162,9 @@ es: run: title: Importar ejecución history: Historial - remove_error: A Jira import run cannot be removed while it is running + remove_error: No se puede quitar una importación de Jira mientras se está ejecutando import_blocked_error: Actualmente hay otra importación de Jira en curso o pendiente de revisión. Complétela o revierta antes de iniciar una nueva importación. - project_identifier_taken: 'You are trying to import a project with an already used identifier: %{taken_identifier}. Please update the project identifier in Jira then click on Retry.' + project_identifier_taken: 'Estás intentando importar un proyecto con un identificador que ya está en uso: %{taken_identifier}. Actualiza el identificador del proyecto en Jira y, a continuación, haz clic en «Reintentar».' blank: title: Aún no se han configurado ejecuciones de importación description: Cree una ejecución de importación para comenzar a importar información de esta instancia de Jira @@ -273,9 +273,9 @@ es: button_revert: Revertir importación button_done: Finalizar importación preview_description: Los datos importados se encuentran actualmente en modo de revisión. Haga clic en «Finalizar importación» para que la importación sea permanente o en «Revertir importación» para deshacer todos los cambios realizados en esta importación. - label_finalize_import: Finalize import - label_finalizing: Finalizing import... - label_finalizing_done: Import finalized. + label_finalize_import: Finalizar importación + label_finalizing: Finalizando importación... + label_finalizing_done: Importación finalizada. label_revert_progress: Revirtiendo importación... label_reverted: Importación revertida. select_dialog: @@ -387,74 +387,74 @@ es: notification_text_default: "

Hola,

Se ha creado un nuevo proyecto: projectValue:name

Muchas gracias

\n" work_packages_identifier: page_header: - description: Choose between classic numerical work package IDs or semantic project-specific ones that prepend the project identifier to the work package ID. + description: Elige entre los ID numéricos clásicos de los paquetes de trabajo o los ID semánticos específicos del proyecto, que añaden el identificador del proyecto al principio del ID del paquete de trabajo. banner: - existing_identifiers_notice: 'Existing identifiers for %{project_count} projects don''t meet requirements for project-based semantic identifiers. OpenProject can automatically update these so that they are valid as in the examples below. Click on ''Autofix and save'' to update identifiers for all projects in this manner and enable project-based semantic identifiers. + existing_identifiers_notice: 'Los identificadores actuales de %{project_count} proyectos no cumplen los requisitos para ser identificadores semánticos basados en proyectos. OpenProject puede actualizarlos automáticamente para que sean válidos, tal y como se muestra en los ejemplos siguientes. Haz clic en «Corregir automáticamente y guardar» para actualizar los identificadores de todos los proyectos de esta manera y habilitar los identificadores semánticos basados en proyectos. ' box_header: - label_project: Project - label_previous_identifier: Previous identifier - label_autofixed_suggestion: Future identifier - label_example_work_package_id: Example work package ID + label_project: Proyecto + label_previous_identifier: Identificador anterior + label_autofixed_suggestion: Identificador futuro + label_example_work_package_id: Ejemplo de ID del paquete de trabajo autofix_preview: - error_too_long: Has to be 10 characters or fewer - error_numerical: Cannot be purely numerical - error_starts_with_number: Cannot start with a number - error_special_characters: Special characters not allowed - error_not_fully_uppercased: Must be uppercase - error_in_use: Already in use as another project's active handle - error_reserved: Reserved by another project's handle history - error_unknown: Needs manual review + error_too_long: Debe tener 10 caracteres o menos + error_numerical: No puede ser puramente numérico + error_starts_with_number: No puede comenzar con un número + error_special_characters: No se permiten caracteres especiales + error_not_fully_uppercased: Debe estar en mayúsculas + error_in_use: Ya está en uso como identificador activo de otro proyecto + error_reserved: Reservado por el historial de identificadores de otro proyecto + error_unknown: Necesita revisión manual remaining_projects: - one: "... 1 more project" - other: "... %{count} more projects" - button_autofix: Autofix and save + one: "... 1 proyecto más" + other: "... %{count} proyectos más" + button_autofix: Corregir automáticamente y guardar dialog: - title: Change work package identifiers - heading: Enable project-based work package IDs? - description: 'This will change IDs for all work packages in all projects in this instance. Previous identifiers and URLs will continue to redirect properly. This change will take some time to complete. + title: Cambiar los identificadores de los paquetes de trabajo + heading: "¿Activar los ID de paquetes de trabajo basados en proyectos?" + description: 'Esto cambiará los ID de todos los paquetes de trabajo de todos los proyectos de esta instancia. Los identificadores y las URL anteriores seguirán redirigiendo correctamente. Este cambio tardará un tiempo en completarse. ' - confirm_button: Change identifiers - checkbox_label: I understand that this will permanently change all work package IDs - success_banner: Successfully updated work package identifier format. + confirm_button: Cambiar identificadores + checkbox_label: Entiendo que esto cambiará de forma permanente todos los ID de los paquetes de trabajo + success_banner: Se ha actualizado correctamente el formato del identificador del paquete de trabajo. in_progress: - banner_message: Project identifiers are currently being updated to project-based semantic identifiers. This may take some time. + banner_message: Actualmente se están actualizando los identificadores de proyectos para convertirlos en identificadores semánticos basados en proyectos. Esto puede llevar algún tiempo. workflows: tabs: default_transitions: Transiciones predeterminadas user_author: Usuario es autor user_assignee: Usuario es asignado index: - description: Configure status transitions for each work package type. + description: Configura las transiciones de estado para cada tipo de paquete de trabajo. type_filter: - label: Filter by type name… - status_button: Status + label: Filtrar por nombre de tipo… + status_button: Estado statuses_dialog: - title: Statuses - label: Statuses enabled for this type - caption: Add or remove statuses you would like to associate with this type. Removing a status will also delete the workflow associated with it. + title: Estados + label: Estados habilitados para este tipo + caption: Añade o elimina los estados que quieras asociar a este tipo. Si eliminas un estado, también se borrará el flujo de trabajo asociado a él. statuses_removal_dialog: - title: Remove statuses + title: Eliminar estados heading: - one: Remove 1 status? - other: Remove %{count} statuses? - description: Removing these statuses will make them unavailable to this type and delete existing workflows. Are you sure you want to proceed? - confirm: Remove + one: "¿Eliminar 1 estado?" + other: "¿Eliminar %{count} estados?" + description: Si eliminas estos estados, dejarán de estar disponibles para este tipo y se borrarán los flujos de trabajo existentes. ¿Seguro que quieres continuar? + confirm: Eliminar leave_confirmation: - title: Save changes before continuing? - description: You are about to leave this page but you have unsaved changes. Would you like to save them before continuing? - ignore: Ignore changes - save: Save changes and continue + title: "¿Guardar los cambios antes de continuar?" + description: Estás a punto de salir de esta página, pero tienes cambios sin guardar. ¿Quieres guardarlos antes de continuar? + ignore: Descartar cambios + save: Guardar cambios y continuar role_selector: - label: 'Role: %{role}' - no_role: Select role + label: 'Rol: %{role}' + no_role: Seleccionar rol blankslate: - title: No status transitions configured - description: Add statuses to start configuring workflows for this role + title: No hay transiciones de estado configuradas + description: Añade estados para empezar a configurar los flujos de trabajo de este rol info: - database_deprecation_html: 'Starting with OpenProject 16.0, PostgreSQL 16 is required to use OpenProject. Your installation will remain functional with your current database, but anticipate incompatability in future releases.
We have prepared [upgrade guides for all installation methods](upgrade_guide). You can perform the upgrade ahead of the next release at any time by following the guides. + database_deprecation_html: 'A partir de OpenProject 16.0, se requiere PostgreSQL 16 para utilizar OpenProject. Tu instalación seguirá funcionando con tu base de datos actual, pero ten en cuenta que puede haber incompatibilidades en futuras versiones.
Hemos preparado [guías de actualización para todos los métodos de instalación](upgrade_guide). Puedes realizar la actualización antes del próximo lanzamiento en cualquier momento siguiendo las guías. ' authentication: @@ -684,13 +684,13 @@ es: confirmation_live_message_checked: El botón para continuar ya está activo. confirmation_live_message_unchecked: El botón para continuar ya está inactivo. Debe marcar la casilla para continuar. pagination: - label: Pagination - prev: Previous - prev_page: Previous Page - next: Next - next_page: Next Page - page: Page %{number} - page_with_more: Page %{number}... + label: Paginación + prev: Anterior + prev_page: Página anterior + next: Siguiente + next_page: Página siguiente + page: Página %{number} + page_with_more: Página %{number}... mcp_configurations: server_url_component: caption: La URL en la que se podrá acceder al servidor OpenProject MCP. Es necesaria para configurar los clientes de MCP. @@ -854,10 +854,10 @@ es: ' change_identifier: Cambiar identificador - change_identifier_dialog_title: Change project identifier - change_identifier_format_hint_semantic: Only uppercase letters (A–Z), numbers or underscores. Max 10 characters. Must start with a letter. - change_identifier_format_hint_legacy: Only lowercase letters (a–z), numbers, dashes or underscores. - change_identifier_warning: 'This will permanently change identifiers and URLs of all work packages in this project. The previous identifier and URLs will nevertheless continue to redirect properly. + change_identifier_dialog_title: Cambiar el identificador del proyecto + change_identifier_format_hint_semantic: Solo mayúsculas (A–Z), números o guiones bajos. Máximo 10 caracteres. Debe empezar por una letra. + change_identifier_format_hint_legacy: Solo letras minúsculas (a–z), números, guiones o guiones bajos. + change_identifier_warning: 'Esto cambiará de forma permanente los identificadores y las URL de todos los paquetes de trabajo de este proyecto. No obstante, los identificadores y las URL anteriores seguirán redirigiendo correctamente. ' subitems: @@ -1095,9 +1095,9 @@ es: groups: member_in_these_groups: 'Este usuario es miembro actualmente de los grupos siguientes:' no_results_title_text: Este usuario no es miembro actualmente de ningún grupo. - summary_with_more_html: Member of %{names} and %{count_link}. + summary_with_more_html: Miembro de %{names} y %{count_link}. more: "%{count} más" - summary_html: Member of %{names}. + summary_html: Miembro de %{names}. memberships: no_results_title_text: El usuario no es actualmente un miembro del proyecto. open_profile: Abrir perfil @@ -1155,29 +1155,29 @@ es: group: El grupo ya forma parte de %{project}. Mientras tanto, puede crear planes con ese grupo y asignar paquetes de trabajo a este. working_hours: current_schedule: - title: Current schedule - work_days: Work days - work_hours: Work hours - availability_factor: Availability factor - availability_subtitle: Dedicated to project work - effective_hours: Effective work hours - effective_subtitle: Per week - not_set: Not set + title: Planificación actual + work_days: Días laborables + work_hours: Horas laborales + availability_factor: Factor de disponibilidad + availability_subtitle: Dedicado al trabajo en proyectos + effective_hours: Horas efectivas de trabajo + effective_subtitle: A la semana + not_set: No establecido future: - title: Future schedules - description: Plan working schedule changes ahead of time. Once the date arrives your working schedules will be updated automatically. - add_button: Add future schedule - blank_title: No future schedules planned - blank_description: Create a future schedule to plan changes ahead of time + title: Horarios futuros + description: Planifica los cambios en los horarios de trabajo con antelación. Cuando llegue la fecha, los horarios se actualizarán automáticamente. + add_button: Añadir el horario futuro + blank_title: No hay horarios previstos para el futuro + blank_description: Crea un horario provisional para planificar los cambios con antelación history: - title: Schedule history - description: View your past work schedules. - blank_title: No schedule history yet - blank_description: Past schedule changes will appear here + title: Historial de horarios + description: Consulta tus horarios de trabajo anteriores. + blank_title: Aún no hay historial de horarios + blank_description: Los cambios de horario anteriores aparecerán aquí destroy: confirm: Are you sure you want to delete this working schedule? form: - title: Plan a future work schedule + title: Planifica tu programa para el futuro title_current: Edit current work schedule start_date: Start date start_date_caption: Select the date from when the new work schedule will be effective. @@ -1197,7 +1197,7 @@ es: total_available_hours: Total available work hours title_availability_factor: Availability factor title_days_and_hours: Days and hours - title_future_dates: Future dates + title_future_dates: Fechas futuras table: mobile_title: Working schedules start_date: Start date @@ -1220,12 +1220,12 @@ es: ' delete_tooltip: Eliminar usuario de marcador de posición deletion_info: - heading_html: Delete placeholder user %{name} + heading_html: Eliminar usuario de marcador de posición %{name} data_consequences: 'Todas las repeticiones del usuario de marcador de posición (por ejemplo, como asignado, responsable u otros valores de usuario) se reasignarán a una cuenta denominada «Usuario eliminado». Como los datos de todas las cuentas eliminadas se reasignarán a esta cuenta, no podrán distinguirse los datos del usuario de los datos creados con cualquier otra cuenta eliminada. ' irreversible: Esta acción no se puede deshacer - confirmation_html: Enter the placeholder user name %{name} to confirm the deletion. + confirmation_html: Escriba el nombre de usuario de marcador de posición %{name} para confirmar la eliminación. priorities: edit: priority_color_text: | @@ -1526,7 +1526,7 @@ es: ' login_with_auth_provider: o inicie sesión con su cuenta existente signup_with_auth_provider: o regístrate usando - auth_source_login_html: Please login as %{login} to activate your account. + auth_source_login_html: Inicia sesión como %{login} para activar tu cuenta. omniauth_login: Por favor inicie sesión para activar su cuenta. actionview_instancetag_blank_option: Por favor, elija activemodel: @@ -1546,7 +1546,7 @@ es: personal_access_token: Token de acceso personal import/jira_open_project_reference: jira: Jira - jira_import: Jira Migrator + jira_import: Migrador Jira announcements: show_until: Mostrar hasta attachment: @@ -1837,24 +1837,24 @@ es: start_date: Start date end_date: End date user_working_hours: - valid_from: Valid from - monday: Monday - monday_hours: Monday hours - tuesday: Tuesday - tuesday_hours: Tuesday hours - wednesday: Wednesday - wednesday_hours: Wednesday hours - thursday: Thursday - thursday_hours: Thursday hours - friday: Friday - friday_hours: Friday hours - saturday: Saturday - saturday_hours: Saturday hours - sunday: Sunday - sunday_hours: Sunday hours - availability_factor: Availability factor - shared_hours: Work hours - days: Working days + valid_from: Válido desde + monday: Lunes + monday_hours: Horario de los lunes + tuesday: Martes + tuesday_hours: Horario de los martes + wednesday: Miércoles + wednesday_hours: Horario de los miércoles + thursday: Jueves + thursday_hours: Horario de los jueves + friday: Viernes + friday_hours: Horario de los viernes + saturday: Sábado + saturday_hours: Horario de los sábados + sunday: Domingo + sunday_hours: Horario de los domingos + availability_factor: Factor de disponibilidad + shared_hours: Horas laborales + days: Días laborables version: effective_date: Fecha de finalización sharing: Compartiendo @@ -1909,8 +1909,8 @@ es: before: debe ser antes de %{date}. before_or_equal_to: debe ser antes o igual a %{date}. blank: no puede estar en blanco. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. + not_before_start_date: no debe ser anterior a la fecha de inicio. + overlapping_range: se solapa con un intervalo de días no laborables ya existente. blank_nested: necesita tener la propiedad '%{property}' definida. cannot_delete_mapping: es obligatorio. No se puede eliminar. is_for_all_cannot_modify: es para todos los proyectos y, por tanto, no puede modificarse. @@ -1947,9 +1947,9 @@ es: less_than_or_equal_to: debe ser menor o igual a %{count}. not_available: no está disponible debido a una configuración del sistema. not_deletable: no se puede eliminar. - not_editable: cannot be edited because it is already in effect. + not_editable: no se puede editar porque ya está en vigor. not_current_user: no es el usuario actual. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. + system_wide_non_working_day_exists: entra en conflicto con un día no laborable ya establecido para todo el sistema en esta fecha. not_found: no encontrado. not_a_date: no es una fecha válida. not_a_datetime: no es una fecha/hora válida. @@ -2305,7 +2305,7 @@ es: user_working_hours: attributes: days: - no_working_day: At least one day needs to be configured as a working day. + no_working_day: Hay que configurar al menos un día como día laborable. member: principal_blank: Por favor seleccione al menos un usuario o grupo. role_blank: necesita ser asignado. @@ -3298,13 +3298,13 @@ es: ' new_features_list: - line_0: 'Big Agile update: dedicated sprint objects, all work packages visible on Backlogs, and automatic sprint board creation.' - line_1: In-place editing of project attributes on the Project Overview page. - line_2: Sharing of meeting templates (Basic plan and higher). - line_3: Better search in Time and Costs, Boards, and more. - line_4: Option to safely change project identifiers. - line_5: Improved workflow configuration for administrators. - line_6: Action boards released to Community. + line_0: 'Gran actualización de Agile: objetos de sprint específicos, todos los paquetes de trabajo visibles en los backlogs y creación automática del tablero de sprints.' + line_1: Edición directa de los atributos del proyecto en la página «Resumen del proyecto». + line_2: Compartir plantillas de reuniones (plan Basic y superiores). + line_3: Mejora la búsqueda en «Tiempo y costes», «Tableros» y mucho más. + line_4: Opción para cambiar de forma segura los identificadores de proyecto. + line_5: Configuración mejorada del flujo de trabajo para los administradores. + line_6: Se han publicado los tableros de acciones en la comunidad. links: upgrade_enterprise_edition: Actualizar a Enterprise postgres_migration: Migrando su instalación a PostgreSQL @@ -3369,15 +3369,15 @@ es: progress_calculation_adjusted: Cálculo de progreso automático ajustado con la actualización de versión. scheduling_mode_adjusted: El modo de programación se ajusta automáticamente con la actualización de la versión. totals_removed_from_childless_work_packages: Los totales de trabajo y progreso se eliminan automáticamente para los paquetes de trabajo no padres con la actualización de la versión. Se trata de una tarea de mantenimiento y puede ignorarse con seguridad. - sprint_migration: Version '%{version_name}' has been copied as a sprint. + sprint_migration: La versión «%{version_name}» se ha copiado como sprint. total_percent_complete_mode_changed_to_work_weighted_average: Los paquetes de trabajo para niños sin Trabajo se ignoran. total_percent_complete_mode_changed_to_simple_average: Se ignoran los valores de trabajo de los paquetes de trabajo secundarios. links: configuration_guide: Guía de configuración get_in_touch: "¿Tiene alguna pregunta? Póngase en contacto con nosotros." - instructions_after_registration_link: You can sign in as soon as your account has been activated by clicking [here](signin_url). - instructions_after_logout_link: You can sign in again by clicking [here](signin_url). - instructions_after_error_link: You can try to sign in again by clicking [here](signin_url). If the error persists, ask your admin for help. + instructions_after_registration_link: Puedes iniciar sesión en cuanto se haya activado tu cuenta haciendo clic [aquí](signin_url). + instructions_after_logout_link: Puedes volver a iniciar sesión haciendo clic [aquí](signin_url). + instructions_after_error_link: Puedes intentar iniciar sesión de nuevo haciendo clic [aquí](signin_url). Si el error persiste, pide ayuda a tu administrador. menus: admin: ai: Inteligencia artificial (IA) @@ -3488,40 +3488,40 @@ es: submit_button: Update alerts notifications: participating: - title: Participating - submit_button: Update preferences - mentioned: Mentioned - watched: Watching - assignee: Assignee - responsible: Accountable - shared: Shared with me + title: Participando + submit_button: Actualizar preferencias + mentioned: Mencionado + watched: Observando + assignee: Asignado + responsible: Responsable + shared: Compartido conmigo date_alerts: - title: Date alerts - submit_button: Update date alerts - start_date: Start date - due_date: Finish date - overdue: Overdue + title: Alertas de fecha + submit_button: Alertas de fecha de actualización + start_date: Fecha de inicio + due_date: Fecha de finalización + overdue: Vencido times: - same_day: On the same day - one_day_before: 1 day before - three_days_before: 3 days before - seven_days_before: 7 days before - one_day_after: 1 day after - three_days_after: 3 days after - seven_days_after: 7 days after + same_day: El mismo día + one_day_before: 1 día antes + three_days_before: 3 días antes + seven_days_before: 7 días antes + one_day_after: 1 día después + three_days_after: 3 días después + seven_days_after: 7 días después non_participating: - title: Non-participating - submit_button: Update preferences - work_package_created: New work packages - work_package_commented: All new comments - work_package_processed: All status changes - work_package_prioritized: All priority changes - work_package_scheduled: All date changes + title: No participando + submit_button: Actualizar preferencias + work_package_created: Nuevos paquetes de trabajo + work_package_commented: Todos los nuevos comentarios + work_package_processed: Todos los cambios de estado + work_package_prioritized: Todos los cambios de prioridad + work_package_scheduled: Todos los cambios de fecha project_specific_settings: - title: Project-specific notification settings - add_button: Add project-specific notifications - dialog_title: Add project-specific notifications - list_header: Projects with specific notifications + title: Configuración de notificaciones específicas de proyectos + add_button: Añadir notificaciones específicas del proyecto + dialog_title: Añadir notificaciones específicas del proyecto + list_header: Proyectos con notificaciones específicas notifications: reasons: assigned: Asignado a @@ -3594,7 +3594,7 @@ es: label_ical_access_key_generation_hint: Se genera automáticamente al suscribirse a un calendario. label_ical_access_key_latest: último label_ical_access_key_revoke: Revocar - label_integrations: Integrations + label_integrations: Integraciones label_add_column: Añadir columna label_applied_status: Estado aplicado label_archive_project: Archivar proyecto @@ -3642,8 +3642,8 @@ es: label_calendar_show: Mostrar Calendario label_category: Categoría label_completed: Completado - label_committed_at_html: "%{committed_revision_link} at %{date}" - label_committed_link: committed revision %{revision_identifier} + label_committed_at_html: "%{committed_revision_link} el %{date}" + label_committed_link: revisión confirmada %{revision_identifier} label_consent_settings: Consentimiento del usuario label_wiki_menu_item: Elemento de menú wiki label_select_main_menu_item: Seleccione nuevo elemento de menú principal @@ -3810,7 +3810,7 @@ es: label_subject_or_id: Asunto o ID label_calendar_subscriptions: Suscripciones al calendario label_identifier: Identificador - label_project_identifier: Project identifier + label_project_identifier: Identificador del proyecto label_in: en label_in_less_than: en menos de label_in_more_than: en más de @@ -3845,7 +3845,7 @@ es: label_external_links: Enlaces externos label_locale: Idioma y región label_jump_to_a_project: Saltar a un proyecto... - label_jira_import: Jira Migrator + label_jira_import: Migrador Jira label_keyword_plural: Palabras clave label_language_based: Basado en el idioma del usuario label_last_activity: Última actividad @@ -3944,13 +3944,13 @@ es: label_news_view_all: Ver todas las noticias label_next: Siguiente label_next_week: La próxima semana - label_next_year: Next year + label_next_year: Próximo año label_no_change_option: "(No hay cambios)" label_no_data: No hay datos disponibles label_no_due_date: sin fecha de finalización label_no_start_date: sin fecha de inicio label_no_parent_page: Sin página principal - label_no_parent_group: "(No parent group)" + label_no_parent_group: "(Sin grupo principal)" label_notification_center_plural: Notificaciones label_nothing_display: Nada que mostrar label_nobody: nadie @@ -3979,7 +3979,7 @@ es: label_overall_activity: Actividad general label_overview: Resumen label_page_title: Título de la página - label_parent_group_caption: 'Setting a parent group will make this group a subgroup of the selected parent group. This will also inherit all memberships, including permissions of the parent group. + label_parent_group_caption: 'Si estableces un grupo principal, este grupo se convertirá en un subgrupo del grupo principal seleccionado. Además, heredará todas las pertenencias, incluidos los permisos, del grupo principal. ' label_part_of: parte de @@ -4008,7 +4008,7 @@ es: label_preview_not_available: Vista previa no disponible label_previous: Anterior label_previous_week: Semana anterior - label_previous_year: Previous year + label_previous_year: Año anterior label_principal_invite_via_email: " o invitar nuevos usuarios vía email" label_principal_search: Añadir usuarios o grupos existentes label_privacy_policy: Política de privacidad y seguridad de datos @@ -4120,7 +4120,7 @@ es: label_start_to_start: iniciar para iniciar label_statistics: Estadísticas label_status: Estado - label_status_plural: Statuses + label_status_plural: Estados label_storage_free_space: Espacio de disco restante label_storage_used_space: Espacio de disco utilizado label_storage_group: Sistema de archivos de almacenamiento %{identifier} @@ -4170,7 +4170,7 @@ es: label_user: Usuario label_user_and_permission: Usuarios y permisos label_user_named: Usuario %{name} - label_user_activity_html: "%{value}'s activity" + label_user_activity_html: Actividad de %{value} label_user_anonymous: Anónimo label_user_menu: Menú de usuario label_user_new: Nuevo usuario @@ -4258,14 +4258,14 @@ es: other: "%{count} archivos" zero: sin archivos label_x_days: - one: 1 day - other: "%{count} days" + one: 1 día + other: "%{count} días" label_x_working_days: - one: 1 working day - other: "%{count} working days" + one: 1 día laborable + other: "%{count} días laborables" label_x_working_days_time_off: - one: 'Time off: 1 working day' - other: 'Time off: %{count} working days' + one: 'Tiempo libre: 1 día laborable' + other: 'Tiempo libre: %{count} días laborables' label_yesterday: ayer label_zen_mode: Modo zen label_role_type: Tipo @@ -4274,22 +4274,22 @@ es: label_not_changeable: "(no modificable)" label_global: Global label_seeded_from_env_warning: Este registro se ha creado a través de una variable de entorno de configuración. No es editable a través de la interfaz de usuario. - label_schedule_and_availability: Schedule and availability - label_working_hours: Work schedule - label_non_working_days: Availability calendar - label_non_working_days_with_count: Non-working days (%{count}) - label_non_working_days_summary: Summary + label_schedule_and_availability: Horario y disponibilidad + label_working_hours: Horario de trabajo + label_non_working_days: Calendario de disponibilidad + label_non_working_days_with_count: Días no laborables (%{count}) + label_non_working_days_summary: Resumen button_add_non_working_time: Time off button_edit_non_working_time: Edit time off - label_continued_from_previous_year: continued from previous year - label_continues_into_next_year: continues into next year - label_end_date: Finish date - label_working_days: Working days - label_non_working_times_with_count: "%{year} time off (%{count})" - label_non_working_times_summary: "%{year} summary" - label_total_user_non_working_times: Personal non-working days - label_total_global_non_working_days: Global non-working days - label_total_days_off: Total days off + label_continued_from_previous_year: continuación del año anterior + label_continues_into_next_year: se prolongará hasta el año que viene + label_end_date: Fecha de finalización + label_working_days: Días laborables + label_non_working_times_with_count: Tiempo libre en %{year} (%{count}) + label_non_working_times_summary: Resumen de %{year} + label_total_user_non_working_times: Días libres por motivos personales + label_total_global_non_working_days: Días festivos a nivel mundial + label_total_days_off: Total de días libres macro_execution_error: Error ejecutando el macro %{macro_name} macro_unavailable: Macro %{macro_name} no puede ser mostrado. macros: @@ -4900,7 +4900,7 @@ es: setting_apiv3_cors_title: Intercambio de recursos entre orígenes (CORS) setting_apiv3_cors_enabled: Habilitar CORS setting_apiv3_cors_origins: Orígenes permitidos de la API de CORS (uso compartido de recursos entre orígenes) V3 - setting_apiv3_cors_origins_instructions_html: 'If CORS is enabled, these are the origins that are allowed to access OpenProject API.
Please check the [Documentation on the Origin header](docs_url) on how to specify the expected values. + setting_apiv3_cors_origins_instructions_html: 'Si CORS está habilitado, estos son los orígenes a los que se les permite acceder a la API de OpenProject.
Consulta la [documentación sobre el encabezado Origin](docs_url) para saber cómo especificar los valores esperados. ' setting_apiv3_write_readonly_attributes: Acceso de escritura a atributos de solo lectura @@ -4910,7 +4910,7 @@ es: setting_apiv3_write_readonly_attributes_warning: 'Este ajuste tiene un caso de uso para, por ejemplo, la importación de datos, pero permite a los administradores suplantar la creación de elementos como otros usuarios. Sin embargo, todas las solicitudes de creación se registran con el verdadero autor. ' - setting_apiv3_write_readonly_attributes_additional_html: 'For more information on attributes and supported resources, please see the [API documentation](api_documentation_link). + setting_apiv3_write_readonly_attributes_additional_html: 'Para obtener más información sobre los atributos y los recursos compatibles, consulta la [documentación de la API](api_documentation_link). ' setting_apiv3_max_page_size: Tamaño máximo de página API @@ -5095,12 +5095,12 @@ es: setting_welcome_text: Bloque de texto de bienvenida setting_welcome_title: Título del bloque de bienvenida setting_welcome_on_homescreen: Mostrar bloque de bienvenida en la pagina de inicio - setting_work_packages_identifier_classic: Instance-wide numerical sequence (default) - setting_work_packages_identifier_classic_caption: 'Every work package gets a sequential number starting with 1 and incremented with every new one. The numbers are unique within this instance so they remain the same even if work packages are moved between projects. + setting_work_packages_identifier_classic: Secuencia numérica para toda la instancia (predeterminada) + setting_work_packages_identifier_classic_caption: 'Cada paquete de trabajo recibe un número secuencial que empieza por 1 y se incrementa con cada nuevo paquete. Los números son únicos dentro de esta instancia, por lo que siguen siendo los mismos aunque los paquetes de trabajo se trasladen de un proyecto a otro. ' - setting_work_packages_identifier_semantic: Project-based semantic identifiers - setting_work_packages_identifier_semantic_caption: 'Every project has a unique identifier that is prefixed to the work package ID. If a work package moved to another project, a new identifier is generated but the old one continues to function. + setting_work_packages_identifier_semantic: Identificadores semánticos basados en proyectos + setting_work_packages_identifier_semantic_caption: 'Cada proyecto tiene un identificador único que se añade al principio del ID del paquete de trabajo. Si un paquete de trabajo se traslada a otro proyecto, se genera un nuevo identificador, pero el antiguo sigue funcionando. ' setting_work_package_list_default_highlighting_mode: Modo de resaltado predeterminado @@ -5433,10 +5433,10 @@ es: text_plugin_assets_writable: Directorio de extensiones activos escribible text_powered_by: Con tecnología de %{link} text_project_identifier_info: Se permiten sólo letras minúsculas (a-z), números, guiones y guiones bajos, debe comenzar con una letra minúscula. - text_project_identifier_description: The project identifier is prepended to all work package IDs. If the identifier is "PROJ" for example, the work package identifier will be "PROJ-12" or "PROJ-246". - text_project_identifier_url_description: The project identifier is included in the URL of the project. - text_project_identifier_handle_format: Must start with a letter and contain only uppercase letters, numbers, and underscores (max 10 characters). - text_project_identifier_format: Must start with a lowercase letter. Only lowercase letters (a-z), numbers, dashes and underscores are allowed. + text_project_identifier_description: El identificador del proyecto se antepone a todos los identificadores de los paquetes de trabajo. Si el identificador es «PROJ», por ejemplo, el identificador del paquete de trabajo será «PROJ-12» o «PROJ-246». + text_project_identifier_url_description: El identificador del proyecto aparece en la URL del proyecto. + text_project_identifier_handle_format: Debe empezar por una letra y contener solo letras mayúsculas, números y guiones bajos (máximo 10 caracteres). + text_project_identifier_format: Debe empezar con una letra minúscula. Solo se permiten letras minúsculas (a-z), números, guiones y guiones bajos. text_reassign: 'Reasignar al paquete de trabajo:' text_regexp_multiline: La expresión regular se aplica en modo multilínea. Por ejemplo, ^---\s+ text_repository_usernames_mapping: Seleccione o actualize el usuario de OpenProject asignado a cada nombre en el registro del repositorio. Los usuarios con el mismo nombre o email serán mapeados automáticamente. diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml index 539e4109dfd..0c9fc8d0761 100644 --- a/config/locales/crowdin/fr.yml +++ b/config/locales/crowdin/fr.yml @@ -126,7 +126,7 @@ fr: new: Nouvelle configuration banner: title: Capacités d'importation limitées - description: 'This Jira Migrator is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time.' + description: 'Cet outil Jora Migrator est actuellement en version bêta et ne peut importer que des données de base : projets, tickets (nom, titre, description, pièces jointes), utilisateurs (nom, e-mail, appartenance à un projet), statuts et types. Il ne peut pas importer les flux de travail, les champs personnalisés, les relations entre les tickets ou les autorisations. Nous ne prenons actuellement en charge que les versions 10.x et 11.x de Jira Server/Data Center. Les instances cloud ne sont pas prises en charge pour le moment.' form: fields: name: Nom @@ -164,7 +164,7 @@ fr: history: Historique remove_error: Une exécution d'importation Jira ne peut pas être supprimée lorsqu'elle est en cours d'exécution import_blocked_error: Un autre cycle d'importation Jira est actuellement en cours ou en attente de révision. Veuillez le terminer ou l'annuler avant de commencer une nouvelle importation. - project_identifier_taken: 'You are trying to import a project with an already used identifier: %{taken_identifier}. Please update the project identifier in Jira then click on Retry.' + project_identifier_taken: 'Vous essayez d''importer un projet avec un identifiant déjà utilisé : %{taken_identifier}. Veuillez mettre à jour l''identifiant du projet dans Jira, puis cliquez sur Réessayer.' blank: title: Aucun cycle d'importation n'a encore été configuré description: Créez un cycle d'importation pour commencer à importer des informations à partir de cette instance Jira @@ -387,9 +387,9 @@ fr: notification_text_default: "

Bonjour,

Un nouveau projet a été créé : projectValue:name

Nous vous remercions de votre attention et vous prions d'agréer nos salutations distinguées.

\n" work_packages_identifier: page_header: - description: Choose between classic numerical work package IDs or semantic project-specific ones that prepend the project identifier to the work package ID. + description: Vous avez le choix entre des identifiants numériques classiques pour les lots de travaux et des identifiants sémantiques spécifiques aux projets, qui ajoutent l'identifiant du projet à l'identifiant du lot de travaux. banner: - existing_identifiers_notice: 'Existing identifiers for %{project_count} projects don''t meet requirements for project-based semantic identifiers. OpenProject can automatically update these so that they are valid as in the examples below. Click on ''Autofix and save'' to update identifiers for all projects in this manner and enable project-based semantic identifiers. + existing_identifiers_notice: 'Les identifiants existants de %{project_count} projets ne répondent pas aux exigences des identifiants sémantiques basés sur les projets. OpenProject peut les mettre à jour automatiquement pour qu''ils soient valides, comme dans les exemples ci-dessous. Cliquez sur « Corriger automatiquement et enregistrer » pour mettre à jour les identifiants de tous les projets de cette manière et activer les identifiants sémantiques basés sur les projets. ' box_header: @@ -403,8 +403,8 @@ fr: error_starts_with_number: Ne peut pas commencer par un chiffre error_special_characters: Caractères spéciaux non autorisés error_not_fully_uppercased: Doit être en majuscules - error_in_use: Already in use as another project's active handle - error_reserved: Reserved by another project's handle history + error_in_use: Déjà utilisé comme alias actif d'un autre projet + error_reserved: Réservé par l'historique des alias d'un autre projet error_unknown: Nécessite une vérification manuelle remaining_projects: one: "... 1 projet supplémentaire" @@ -413,14 +413,14 @@ fr: dialog: title: Modifier les identifiants de lots de travaux heading: Activer les ID de lots de travaux basés sur le projet ? - description: 'This will change IDs for all work packages in all projects in this instance. Previous identifiers and URLs will continue to redirect properly. This change will take some time to complete. + description: 'Cette opération modifiera les identifiants de tous les lots de travaux de tous les projets dans cette instance. Les identifiants et URL précédents continueront de rediriger correctement. Cette modification prendra un certain temps. ' confirm_button: Modifier les identifiants checkbox_label: Je comprends que cela changera définitivement tous les identifiants du lot de travaux success_banner: Le format de l'identifiant du lot de travaux a été mis à jour. in_progress: - banner_message: Project identifiers are currently being updated to project-based semantic identifiers. This may take some time. + banner_message: Les identifiants de projet sont actuellement mis à jour pour devenir des identifiants sémantiques basés sur les projets. Cela peut prendre un certain temps. workflows: tabs: default_transitions: Transitions par défaut @@ -1176,15 +1176,15 @@ fr: blank_title: Pas encore d'historique des horaires blank_description: Les changements d'horaire antérieurs seront affichés ici destroy: - confirm: Are you sure you want to delete this working schedule? + confirm: Voulez-vous vraiment supprimer cet horaire de travail ? form: - title: Plan a future work schedule - title_current: Edit current work schedule + title: Planifier un futur horaire de travail + title_current: Modifier l'horaire de travail actuel start_date: Date de début - start_date_caption: Select the date from when the new work schedule will be effective. + start_date_caption: Sélectionnez la date à partir de laquelle le nouvel horaire de travail entrera en vigueur. work_days: Journées de travail working_hours_label: Heures de travail - hours_mode_label: Hours mode + hours_mode_label: Mode heures same_hours_mode: Mêmes heures par jour individual_hours_mode: Heures individuelles par jour work_hours: Heures de travail @@ -1194,8 +1194,8 @@ fr: total_work_hours: Heures de travail totales  availability_description: Le facteur de disponibilité représente le pourcentage réel de votre temps de travail consacré aux tâches du projet. Il tient compte des réunions, des courriels, du travail administratif et d'autres activités non liées au projet. availability_factor: Facteur de disponibilité - availability_factor_caption: Define the percentage of your working time dedicated to project work. - total_available_hours: Total available work hours + availability_factor_caption: Définissez le pourcentage de votre temps de travail consacré au projet. + total_available_hours: Total des heures de travail disponibles title_availability_factor: Facteur de disponibilité title_days_and_hours: Jours et heures title_future_dates: Dates futures @@ -1208,9 +1208,9 @@ fr: effective_work_hours: Heures de travail effectives work_days_count: one: 1 jour ouvrable - other: "%{count} working days" + other: "%{count} jours ouvrables" user_preferences: - disable_keyboard_shortcuts_caption: 'You can choose to disable default [keyboard shortcuts](docs_url) if you use a screen reader or want to avoid accidentally triggering an action with a shortcut. + disable_keyboard_shortcuts_caption: 'Vous pouvez choisir de désactiver les [raccourcis clavier](docs_url) par défaut si vous utilisez un lecteur d''écran ou si vous voulez éviter de déclencher accidentellement une action avec un raccourci. ' page: @@ -1221,12 +1221,12 @@ fr: ' delete_tooltip: Supprimer l’utilisateur fictif deletion_info: - heading_html: Delete placeholder user %{name} + heading_html: Supprimer l’utilisateur fictif %{name} data_consequences: 'Toutes les occurrences de l''utilisateur fictif (par exemple, en tant que responsable ou autre valeur utilisateur) seront réaffectées à un compte appelé « Utilisateur supprimé ». Comme les données de chaque compte supprimé sont réaffectées à ce compte, il ne sera pas possible de distinguer les données que l''utilisateur a créées des données d''un autre compte supprimé. ' irreversible: Cette action est irréversible - confirmation_html: Enter the placeholder user name %{name} to confirm the deletion. + confirmation_html: Saisissez le nom d'utilisateur fictif %{name} pour confirmer sa suppression. priorities: edit: priority_color_text: | @@ -1255,10 +1255,7 @@ fr: Elle peut être utilisée pour mettre en évidence les lots de travaux dans le tableau. status_default_text: Les nouveaux lots de travaux sont définis par défaut sur ce type. Ils ne peuvent pas être en lecture seule. status_excluded_from_totals_text: Cochez cette option pour exclure les lots de travaux ayant ce statut des totaux de Travail, Travail restant et % réalisé dans une hiérarchie. - status_percent_complete_text_html: |- - In [status-based progress calculation mode](setting_url), the % Complete of a work - package is automatically set to this value when this status is selected. - Ignored in work-based mode. + status_percent_complete_text_html: En [mode de calcul de la progression basé sur le statut](setting_url), le pourcentage d'achèvement d'un lot de travaux est automatiquement fixé sur cette valeur lorsque ce statut est sélectionné. Cette valeur est ignorée en mode basé sur le travail. status_readonly_html: | Cochez cette option pour marquer les lots de travaux avec ce statut en lecture seule. Aucun attribut ne peut être modifié à l'exception du statut. @@ -1527,7 +1524,7 @@ fr: ' login_with_auth_provider: ou connectez-vous avec votre compte existant signup_with_auth_provider: ou inscrivez-vous à l'aide de - auth_source_login_html: Please login as %{login} to activate your account. + auth_source_login_html: Veuillez vous connecter en tant que %{login} pour activer votre compte. omniauth_login: Veuillez vous connecter pour activer votre compte. actionview_instancetag_blank_option: Veuillez sélectionner activemodel: @@ -3036,8 +3033,8 @@ fr: ' domain_caption: Le jeton sera valable pour votre nom d'hôte actuellement configuré. - receive_newsletter: I want to receive the OpenProject [newsletter](newsletter_url). - consent: I agree with the [terms of service](tos_url) and the [privacy policy](privacy_url). + receive_newsletter: Je souhaite recevoir la [lettre d'information](newsletter_url) d'OpenProject. + consent: J'accepte les [conditions d'utilisation](tos_url) et la [politique de confidentialité](privacy_url). email_calendar_updates: state: disabled: Désactivé. @@ -3299,17 +3296,17 @@ fr: learn_about: En savoir plus sur les nouvelles fonctionnalités missing: Il n'y a pas encore de fonctionnalités mises en évidence. '17_3': - new_features_title: 'The release contains various new features and improvements, such as: + new_features_title: 'Cette version contient plusieurs nouvelles fonctionnalités et améliorations, telles que : ' new_features_list: - line_0: 'Big Agile update: dedicated sprint objects, all work packages visible on Backlogs, and automatic sprint board creation.' - line_1: In-place editing of project attributes on the Project Overview page. - line_2: Sharing of meeting templates (Basic plan and higher). - line_3: Better search in Time and Costs, Boards, and more. - line_4: Option to safely change project identifiers. - line_5: Improved workflow configuration for administrators. - line_6: Action boards released to Community. + line_0: 'Grande mise à jour agile : objets de sprint dédiés, tous les lots de travaux visibles sur les backlogs, et création automatique du tableau de sprint.' + line_1: Modification sur place des attributs du projet sur la page de vue d'ensemble du projet. + line_2: Partage de modèles de réunion (abonnements Basic et supérieurs). + line_3: Une meilleure recherche dans les délais et les coûts, les tableaux, etc. + line_4: Option permettant de modifier en toute sécurité les identifiants des projets. + line_5: Amélioration de la configuration du flux de travail pour les administrateurs. + line_6: Des tableaux d'action sont mis à la disposition de la communauté. links: upgrade_enterprise_edition: Passer à la version Enterprise postgres_migration: Migration de votre installation vers PostgreSQL @@ -3381,8 +3378,8 @@ fr: configuration_guide: Guide de configuration get_in_touch: Vous avez des questions ? Contactez-nous. instructions_after_registration_link: Vous pourrez vous connecter après avoir activé votre compte en cliquant [Ici](signin_url). - instructions_after_logout_link: You can sign in again by clicking [here](signin_url). - instructions_after_error_link: You can try to sign in again by clicking [here](signin_url). If the error persists, ask your admin for help. + instructions_after_logout_link: Vous pouvez vous reconnecter en cliquant [ici](signin_url). + instructions_after_error_link: Vous pouvez essayer de vous reconnecter en cliquant [ici](signin_url). Si l'erreur persiste, demandez de l'aide à votre administrateur. menus: admin: ai: Intelligence artificielle (IA) @@ -3395,10 +3392,10 @@ fr: label: Ajouter… my_account: notifications_and_email: - title: Notification and email + title: Notification et e-mail tabs: - notifications: Notification settings - email_reminders: Email reminders + notifications: Paramètres de notifications + email_reminders: Rappels par e-mail access_tokens: description: Les jetons de fournisseur sont émis par OpenProject, ce qui permet à d'autres applications d'y accéder. Les jetons clients sont émis par d'autres applications, permettant à OpenProject d'y accéder. no_results: @@ -3463,70 +3460,70 @@ fr: unknown_storage: Espace de stockage inconnu email_reminders: immediate_reminders: - title: Send me an email reminder - mentioned: Notify me when I am mentioned - personal_reminder: Notify me for personal reminders + title: M'envoyer un rappel par e-mail + mentioned: M'avertir lorsque je suis mentionné(e) + personal_reminder: M'avertir pour les rappels personnels daily_reminders: - title: Send me daily email reminders for unread notifications - caption: You will receive these reminders only for unread notifications and only at hours you specify. Until you configure a time zone for your account, the times will be interpreted to be in UTC. - enabled: Enable daily email reminders - add_time: Add time - remove_time: Remove time - time_slot_label: Reminder time (UTC) + title: M'envoyer des rappels quotidiens par e-mail pour les notifications non lues + caption: Vous ne recevrez ces rappels que pour les notifications non lues et seulement aux heures que vous aurez spécifiées. Tant que vous n'aurez pas configuré un fuseau horaire pour votre compte, les heures seront interprétées comme étant en UTC. + enabled: Activer les rappels quotidiens par e-mail + add_time: Ajouter une heure + remove_time: Supprimer l'heure + time_slot_label: Heure de rappel (UTC) workdays: - title: Receive email reminders on these days - submit_button: Update reminder days + title: Recevoir des rappels par e-mail aux jours spécifiés + submit_button: Mettre à jour les jours de rappel pause_reminders: - title: Pause email notifications - enabled: Temporarily pause daily email reminders - date_range: Pause period + title: Suspendre les notifications par e-mail + enabled: Suspendre temporairement les rappels quotidiens par e-mail + date_range: Période de pause email_alerts: - title: Email alerts for other items that are not work packages - news_added: News added - news_commented: Comment on a news item - document_added: Document added - forum_messages: Forum message posted - wiki_page_added: Wiki page added - wiki_page_updated: Wiki page updated - membership_added: Membership added - membership_updated: Membership updated - submit_button: Update alerts + title: Alertes par e-mail pour les autres éléments qui ne sont pas des lots de travaux + news_added: Actualités ajoutées + news_commented: Commenter un article d'actualité + document_added: Document ajouté + forum_messages: Message de forum publié + wiki_page_added: Page wiki ajoutée + wiki_page_updated: Page wiki mise à jour + membership_added: Adhésion ajoutée + membership_updated: Adhésion mise à jour + submit_button: Mettre à jour les alertes notifications: participating: - title: Participating - submit_button: Update preferences - mentioned: Mentioned - watched: Watching - assignee: Assignee - responsible: Accountable - shared: Shared with me + title: Participant + submit_button: Mettre à jour les préférences + mentioned: Mentionné + watched: En cours + assignee: Personne assignée + responsible: Responsable + shared: Partagé avec moi date_alerts: - title: Date alerts - submit_button: Update date alerts - start_date: Start date - due_date: Finish date - overdue: Overdue + title: Alertes de date + submit_button: Mettre à jour les alertes de date + start_date: Date de début + due_date: Date de fin + overdue: En retard times: - same_day: On the same day - one_day_before: 1 day before - three_days_before: 3 days before - seven_days_before: 7 days before - one_day_after: 1 day after - three_days_after: 3 days after - seven_days_after: 7 days after + same_day: Le même jour + one_day_before: 1 jour avant + three_days_before: 3 jours avant + seven_days_before: 7 jours avant + one_day_after: 1 jour après + three_days_after: 3 jours après + seven_days_after: 7 jours après non_participating: - title: Non-participating - submit_button: Update preferences - work_package_created: New work packages - work_package_commented: All new comments - work_package_processed: All status changes - work_package_prioritized: All priority changes - work_package_scheduled: All date changes + title: Non participant + submit_button: Mettre à jour les préférences + work_package_created: Nouveaux lots de travaux + work_package_commented: Tous les nouveaux commentaires + work_package_processed: Tous les changements de statut + work_package_prioritized: Tous les changements de priorité + work_package_scheduled: Tous les changements de date project_specific_settings: - title: Project-specific notification settings - add_button: Add project-specific notifications - dialog_title: Add project-specific notifications - list_header: Projects with specific notifications + title: Paramètres de notification spécifiques au projet + add_button: Ajouter des notifications spécifiques au projet + dialog_title: Ajouter des notifications spécifiques au projet + list_header: Projets avec notifications spécifiques notifications: reasons: assigned: Personne assignée @@ -3648,7 +3645,7 @@ fr: label_category: Catégorie label_completed: Terminé label_committed_at_html: "%{committed_revision_link} le %{date}" - label_committed_link: committed revision %{revision_identifier} + label_committed_link: révision validée %{revision_identifier} label_consent_settings: Accord de l'utilisateur label_wiki_menu_item: Élément de menu wiki label_select_main_menu_item: Sélectionner nouvel élément de menu principal @@ -4175,7 +4172,7 @@ fr: label_user: Utilisateur label_user_and_permission: Utilisateurs et autorisations label_user_named: Utilisateur %{name} - label_user_activity_html: "%{value}'s activity" + label_user_activity_html: Activité de %{value} label_user_anonymous: Anonyme label_user_menu: Menu utilisateur label_user_new: Nouvel utilisateur @@ -4266,8 +4263,8 @@ fr: one: un jour other: "%{count} jours" label_x_working_days: - one: 1 working day - other: "%{count} working days" + one: 1 jour ouvrable + other: "%{count} jours ouvrables" label_x_working_days_time_off: one: 'Temps libre : 1 jour ouvrable' other: 'Temps libre : %{count} jours ouvrables' @@ -4286,14 +4283,14 @@ fr: label_non_working_days_summary: Résumé button_add_non_working_time: Temps libre button_edit_non_working_time: Modifier les temps libres - label_continued_from_previous_year: continued from previous year + label_continued_from_previous_year: suite de l'année précédente label_continues_into_next_year: se poursuit dans l'année suivante label_end_date: Date de fin label_working_days: Journées de travail label_non_working_times_with_count: "%{year} de temps libre (%{count})" - label_non_working_times_summary: "%{year} summary" - label_total_user_non_working_times: Personal non-working days - label_total_global_non_working_days: Global non-working days + label_non_working_times_summary: Résumé de %{year} + label_total_user_non_working_times: Jours non travaillés personnels + label_total_global_non_working_days: Jours non travaillés généraux label_total_days_off: Nombre total de jours de congé macro_execution_error: Erreur lors de l'exécution de la macro %{macro_name} macro_unavailable: La macro %{macro_name} ne peut être affichée. @@ -4909,7 +4906,7 @@ fr: setting_apiv3_cors_title: Partage croisé des ressources (CORS) setting_apiv3_cors_enabled: Activer CORS setting_apiv3_cors_origins: Origines autorisées de l'API V3 Cross-Origin Resource Sharing (CORS) - setting_apiv3_cors_origins_instructions_html: 'If CORS is enabled, these are the origins that are allowed to access OpenProject API.
Please check the [Documentation on the Origin header](docs_url) on how to specify the expected values. + setting_apiv3_cors_origins_instructions_html: 'Si CORS est activé, ce sont les origines qui sont autorisées à accéder à l''API OpenProject.
Veuillez vérifier la [documentation sur l''en-tête original](docs_url) pour connaître la façon de spécifier les valeurs attendues. ' setting_apiv3_write_readonly_attributes: Accès en écriture aux attributs en lecture seule @@ -4919,7 +4916,7 @@ fr: setting_apiv3_write_readonly_attributes_warning: 'Ce paramètre est utile, par exemple, pour l''importation de données, mais il permet aux administrateurs de se faire passer pour d''autres utilisateurs lors de la création d''éléments. Toutes les demandes de création sont toutefois enregistrées avec le véritable auteur. ' - setting_apiv3_write_readonly_attributes_additional_html: 'For more information on attributes and supported resources, please see the [API documentation](api_documentation_link). + setting_apiv3_write_readonly_attributes_additional_html: 'Pour obtenir plus d''informations sur les attributs et les ressources prises en charge, veuillez consulter la [documentation de l''API](api_documentation_link). ' setting_apiv3_max_page_size: Taille maximale de page d'API @@ -5104,12 +5101,12 @@ fr: setting_welcome_text: Bloc de texte de bienvenue setting_welcome_title: Bloc de titre de bienvenue setting_welcome_on_homescreen: Afficher le bloc de bienvenue sur l'écran d'accueil - setting_work_packages_identifier_classic: Instance-wide numerical sequence (default) - setting_work_packages_identifier_classic_caption: 'Every work package gets a sequential number starting with 1 and incremented with every new one. The numbers are unique within this instance so they remain the same even if work packages are moved between projects. + setting_work_packages_identifier_classic: Séquence numérique à l'échelle de l'instance (par défaut) + setting_work_packages_identifier_classic_caption: 'Chaque lot de travaux obtient un numéro séquentiel commençant par 1 et incrémenté à chaque nouveau. Les nombres sont uniques dans cette instance, donc ils restent les mêmes même si les lots de travaux sont déplacés entre les projets. ' - setting_work_packages_identifier_semantic: Project-based semantic identifiers - setting_work_packages_identifier_semantic_caption: 'Every project has a unique identifier that is prefixed to the work package ID. If a work package moved to another project, a new identifier is generated but the old one continues to function. + setting_work_packages_identifier_semantic: Identifiants sémantiques basés sur le projet + setting_work_packages_identifier_semantic_caption: 'Chaque projet a un identifiant unique qui est préfixé à l''ID du lot de travaux. Si un lot de travaux a été déplacé vers un autre projet, un nouvel identifiant est généré, mais l''ancien continue de fonctionner. ' setting_work_package_list_default_highlighting_mode: Mode de surbrillance par défaut @@ -5297,7 +5294,7 @@ fr: not_allowed_text: Vous n'avez pas les autorisations nécessaires pour voir cette page. activities: enable_internal_comments: Activer les commentaires internes - helper_text_html: 'Internal comments allow an internal team to communicate amongst themselves privately. These are only visible to selected roles that have the necessary permissions and will not be visible publicly. [Click here to learn more](docs_url) + helper_text_html: 'Les commentaires internes permettent aux membres d''une équipe interne de communiquer entre eux en privé. Les commentaires ne sont visibles que pour les rôles sélectionnés qui ont les autorisations nécessaires et ne seront pas visibles publiquement. [Cliquez ici pour en savoir plus](docs_url) ' text_formatting: @@ -5447,7 +5444,7 @@ fr: text_project_identifier_description: L'identifiant du projet est préfixé à tous les identifiants du lot de travaux. Si, par exemple, l'identifiant est "PROJ", l'identifiant du lot de travaux sera "PROJ-12" ou "PROJ-246". text_project_identifier_url_description: L'identifiant du projet est inclus dans l'URL du projet. text_project_identifier_handle_format: Doit commencer par une lettre et ne contenir que des majuscules, des chiffres et des traits de soulignement (10 caractères au maximum). - text_project_identifier_format: Must start with a lowercase letter. Only lowercase letters (a-z), numbers, dashes and underscores are allowed. + text_project_identifier_format: Doit commencer par une lettre minuscule. Seules les lettres minuscules (a-z), les chiffres, les tirets et les traits de soulignement sont autorisés. text_reassign: 'Réaffecter au lot de travaux :' text_regexp_multiline: L'expression régulière est appliquée en mode multi-ligne, e.g. ^---\\s+ text_repository_usernames_mapping: |- @@ -5560,10 +5557,10 @@ fr: version_status_locked: verrouillé version_status_open: ouvert note: Note - note_password_login_disabled_link: Password login has been disabled through a [configuration setting](configuration_url). + note_password_login_disabled_link: La connexion par mot de passe a été désactivée par un [paramètre de configuration](configuration_url). warning: Attention warning_attachments_not_saved: "%{count} fichier(s) n'ont pu être sauvegardés." - warning_imminent_user_limit_html: 'You invited more users than are supported by your current plan. Invited users may not be able to join your OpenProject environment. Please [upgrade your plan](upgrade_url) or block existing users in order to allow invited and registered users to join. + warning_imminent_user_limit_html: 'Vous avez invité plus d''utilisateurs que ne le permet votre abonnement actuel. Les utilisateurs invités peuvent ne pas être en mesure de rejoindre votre environnement OpenProject. Veuillez [mettre à niveau votre abonnement](upgrade_url) ou bloquer les utilisateurs existants afin de permettre aux utilisateurs invités et enregistrés de rejoindre votre environnement. ' warning_registration_token_expired: 'L’émail d’activation a expiré. Nous vous avons envoyé un nouveau lien à l''adresse %{email}. Merci de cliquer sur ce lien pour activer votre compte. @@ -5572,7 +5569,7 @@ fr: warning_user_limit_reached: 'L''ajout d''utilisateurs supplémentaires dépassera la limite actuelle. Veuillez contacter un administrateur pour augmenter la limite d''utilisateurs afin que les utilisateurs externes puissent accéder à cette instance. ' - warning_user_limit_reached_admin_html: 'Adding additional users will exceed the current limit. Please [upgrade your plan](upgrade_url) to be able to ensure external users are able to access this instance. + warning_user_limit_reached_admin_html: 'L''ajout d''utilisateurs supplémentaires dépassera la limite actuelle. Veuillez [mettre à jour votre abonnement](upgrade_url) pour que les utilisateurs externes puissent accéder à cette instance. ' warning_user_limit_reached_instructions: 'Vous avez atteint le nombre limite d''utilisateurs (%{current}/%{max} utilisateurs actifs). Veuillez contacter sales@openproject.com pour mettre à jour votre abonnement Entreprise et ajouter des utilisateurs supplémentaires. @@ -5637,7 +5634,7 @@ fr: reminders: label_remind_at: Date note_placeholder: Pourquoi définissez-vous ce rappel ? - create_success_message_html: Reminder set successfully. You will receive a notification for this work package %{reminder_time}. + create_success_message_html: Le rappel a été défini avec succès. Vous recevrez une notification pour ce lot de travaux %{reminder_time}. success_update_message: Rappel mis à jour avec succès. success_deletion_message: Rappel supprimé avec succès. sharing: @@ -5669,7 +5666,7 @@ fr: warning_user_limit_reached: 'L''ajout d''utilisateurs supplémentaires dépassera la limite actuelle. Veuillez contacter un administrateur pour augmenter la limite d''utilisateurs afin que les utilisateurs externes puissent accéder à ce(tte) %{entity}. ' - warning_user_limit_reached_admin_html: 'Adding additional users will exceed the current limit. Please [upgrade your plan](upgrade_url) to be able to ensure external users are able to access this %{entity}. + warning_user_limit_reached_admin_html: 'L''ajout d''utilisateurs supplémentaires dépassera la limite actuelle. Veuillez [mettre à jour votre abonnement](upgrade_url) pour que les utilisateurs externes puissent accéder à cette %{entity}. ' warning_no_selected_user: Veuillez sélectionner les utilisateurs avec lesquels vous souhaitez partager ce(tte) %{entity} @@ -5793,7 +5790,7 @@ fr: project: Non divulgué - Le projet est invisible parce qu'il n'a pas les autorisations nécessaires. ancestor: Non divulgué - l'ancêtre est invisible en raison d'un manque de permissions. definingProject: Non divulgué - Le projet est invisible parce qu'il n'a pas les autorisations nécessaires. - definingWorkspace: Undisclosed - The workspace is invisible because of lacking permissions. + definingWorkspace: Non divulgué - L'espace de travail est invisible parce qu'il n'a pas les autorisations nécessaires. doorkeeper: pre_authorization: status: Préautorisation diff --git a/config/locales/crowdin/it.yml b/config/locales/crowdin/it.yml index fff657a1db3..04fd38d27f3 100644 --- a/config/locales/crowdin/it.yml +++ b/config/locales/crowdin/it.yml @@ -108,7 +108,7 @@ it: trial: Prova jemalloc_allocator: Allocatore di memoria Jemalloc journal_aggregation: - caption: 'User actions on a work package (changing description, status, values, or writing comments) are grouped if performed within this period. It also controls notification and [webhook](webhook_link) delays. + caption: 'Le azioni degli utenti su una macro-attività, come modificare descrizione, stato o valori, oppure aggiungere commenti, vengono raggruppate se eseguite entro questo intervallo. Questo controlla anche i ritardi delle notifiche e dei [webhook](webhook_link). ' import: @@ -125,8 +125,8 @@ it: title: Configurazione Jira new: Nuova configurazione banner: - title: Limited import capabilities - description: 'This Jira Migrator is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time.' + title: Funzionalità di importazione limitate + description: 'Jira Migrator è attualmente in versione beta e può importare solo dati di base: progetti, issue (nome, titolo, descrizione, allegati), utenti (nome, email, appartenenza al progetto), stati e tipi. Non può importare flussi di lavoro, campi personalizzati, relazioni tra issue o autorizzazioni. Al momento supportiamo solo le versioni 10.x e 11.x di Jira Server/Data Center. Le istanze cloud non sono supportate al momento.' form: fields: name: Nome @@ -162,9 +162,9 @@ it: run: title: Importa esecuzione history: Cronologia - remove_error: A Jira import run cannot be removed while it is running + remove_error: Un'importazione di Jira non può essere rimossa mentre è in esecuzione import_blocked_error: Un'altra importazione Jira è attualmente in corso o in attesa di revisione. Completala o annullala prima di iniziare una nuova importazione. - project_identifier_taken: 'You are trying to import a project with an already used identifier: %{taken_identifier}. Please update the project identifier in Jira then click on Retry.' + project_identifier_taken: 'Stai tentando di importare un progetto con un identificatore già utilizzato: %{taken_identifier}. Aggiorna l''identificatore del progetto in Jira e poi fai clic su Riprova.' blank: title: Nessuna importazione ancora impostata description: Crea un'esecuzione di importazione per iniziare a importare informazioni da questa istanza di Jira @@ -177,7 +177,7 @@ it: instance_meta_fetching: Recupero dei metadati instance_meta_error: Errore nel recupero dei metadati instance_meta_done: Metadati recuperati - import_scope: Select scope + import_scope: Seleziona l'ambito configuring: Seleziona l'ambito projects_meta_fetching: Recupero dei dati di progetto projects_meta_error: Errore nel recupero dei dati di progetto @@ -187,12 +187,12 @@ it: imported: Modalità di revisione reverting: Ripristino revert_error: Errore durante il ripristino - revert_cancelling: Cancelling revert - revert_cancelled: Revert cancelled + revert_cancelling: Annullamento ripristino + revert_cancelled: Ripristino annullato reverted: Ripristinato - finalizing: Finalizing - finalizing_error: Error during finalizing - finalizing_done: Completed + finalizing: Finalizzazione + finalizing_error: Errore durante la finalizzazione + finalizing_done: Completata wizard: button_retry: Riprova parts: @@ -273,9 +273,9 @@ it: button_revert: Annulla l'importazione button_done: Finalizza l'importazione preview_description: I dati importati sono attualmente in modalità di revisione. Fare clic su "Finalizza l'importazione" per rendere l'importazione permanente o su "Annulla l'importazione" per annullare tutte le modifiche apportate in questa importazione. - label_finalize_import: Finalize import - label_finalizing: Finalizing import... - label_finalizing_done: Import finalized. + label_finalize_import: Finalizza l'importazione + label_finalizing: Completamento dell'importazione... + label_finalizing_done: Importazione finalizzata. label_revert_progress: Annullamento dell'importazione in corso... label_reverted: Importazione annullata. select_dialog: @@ -387,74 +387,74 @@ it: notification_text_default: "

Ciao,

È stato creato un nuovo progetto: projectValue:name

Grazie

\n" work_packages_identifier: page_header: - description: Choose between classic numerical work package IDs or semantic project-specific ones that prepend the project identifier to the work package ID. + description: Scegli tra ID numerici classici delle macro-attività oppure ID semantici specifici del progetto che antepongono l'identificatore del progetto all'ID della macro-attività. banner: - existing_identifiers_notice: 'Existing identifiers for %{project_count} projects don''t meet requirements for project-based semantic identifiers. OpenProject can automatically update these so that they are valid as in the examples below. Click on ''Autofix and save'' to update identifiers for all projects in this manner and enable project-based semantic identifiers. + existing_identifiers_notice: 'Gli identificatori esistenti per %{project_count} progetti non soddisfano i requisiti per gli identificatori semantici basati sul progetto. OpenProject può aggiornarli automaticamente per renderli validi, come negli esempi sotto. Fai clic su "Correggi automaticamente e salva" per aggiornare gli identificatori di tutti i progetti in questo modo e abilitare gli identificatori semantici basati sul progetto. ' box_header: - label_project: Project - label_previous_identifier: Previous identifier - label_autofixed_suggestion: Future identifier - label_example_work_package_id: Example work package ID + label_project: Progetto + label_previous_identifier: Identificativo precedente + label_autofixed_suggestion: Identificativo futuro + label_example_work_package_id: Esempio di ID macro-attività autofix_preview: - error_too_long: Has to be 10 characters or fewer - error_numerical: Cannot be purely numerical - error_starts_with_number: Cannot start with a number - error_special_characters: Special characters not allowed - error_not_fully_uppercased: Must be uppercase - error_in_use: Already in use as another project's active handle - error_reserved: Reserved by another project's handle history - error_unknown: Needs manual review + error_too_long: Deve essere di 10 caratteri o meno + error_numerical: Non può essere puramente numerico + error_starts_with_number: Non può iniziare con un numero + error_special_characters: I caratteri speciali non sono consentiti + error_not_fully_uppercased: Deve essere maiuscolo + error_in_use: Già in uso come identificatore attivo di un altro progetto + error_reserved: Riservato dalla cronologia degli identificatori di un altro progetto + error_unknown: Necessita di controllo manuale remaining_projects: - one: "... 1 more project" - other: "... %{count} more projects" - button_autofix: Autofix and save + one: "... 1 altro progetto" + other: "... altri %{count} progetti" + button_autofix: Correggi automaticamente e salva dialog: - title: Change work package identifiers - heading: Enable project-based work package IDs? - description: 'This will change IDs for all work packages in all projects in this instance. Previous identifiers and URLs will continue to redirect properly. This change will take some time to complete. + title: Cambia gli identificatori della macro-attività + heading: Abilitare gli ID delle macro-attività basati sul progetto? + description: 'Questa operazione modificherà gli ID di tutte le macro-attività in tutti i progetti di questa istanza. Gli identificatori e gli URL precedenti continueranno a reindirizzare correttamente. Questa modifica richiederà un po'' di tempo per essere completata. ' - confirm_button: Change identifiers - checkbox_label: I understand that this will permanently change all work package IDs - success_banner: Successfully updated work package identifier format. + confirm_button: Cambia identificatori + checkbox_label: Comprendo che questa operazione modificherà in modo permanente tutti gli ID delle macro-attività + success_banner: Formato degli identificatori delle macro-attività aggiornato correttamente. in_progress: - banner_message: Project identifiers are currently being updated to project-based semantic identifiers. This may take some time. + banner_message: Gli identificatori dei progetti sono attualmente in fase di aggiornamento agli identificatori semantici basati sul progetto. Questa operazione potrebbe richiedere un po' di tempo. workflows: tabs: default_transitions: Transizioni predefinite user_author: L'utente è l'autore user_assignee: L'utente è l'assegnatario index: - description: Configure status transitions for each work package type. + description: Configura le transizioni di stato per ciascun tipo di macro-attività. type_filter: - label: Filter by type name… - status_button: Status + label: Filtra per nome tipo… + status_button: Stato statuses_dialog: - title: Statuses - label: Statuses enabled for this type - caption: Add or remove statuses you would like to associate with this type. Removing a status will also delete the workflow associated with it. + title: Stati + label: Stati abilitati per questo tipo + caption: Aggiungi o rimuovi gli stati che desideri associare a questo tipo. La rimozione di uno stato eliminerà anche il workflow associato. statuses_removal_dialog: - title: Remove statuses + title: Rimuovi gli stati heading: - one: Remove 1 status? - other: Remove %{count} statuses? - description: Removing these statuses will make them unavailable to this type and delete existing workflows. Are you sure you want to proceed? - confirm: Remove + one: Rimuovere 1 stato? + other: Rimuovere %{count} stati? + description: La rimozione di questi stati li renderà non disponibili per questo tipo ed eliminerà i flussi di lavoro esistenti. Procedere? + confirm: Rimuovi leave_confirmation: - title: Save changes before continuing? - description: You are about to leave this page but you have unsaved changes. Would you like to save them before continuing? - ignore: Ignore changes - save: Save changes and continue + title: Salvare le modifiche prima di continuare? + description: Stai per lasciare questa pagina, ma ci sono modifiche non salvate. Vuoi salvarle prima di continuare? + ignore: Ignora le modifiche + save: Salva le modifiche e continua role_selector: - label: 'Role: %{role}' - no_role: Select role + label: 'Ruolo: %{role}' + no_role: Seleziona il ruolo blankslate: - title: No status transitions configured - description: Add statuses to start configuring workflows for this role + title: Nessuna transizione di stato configurata + description: Aggiungi stati per iniziare a configurare i flussi di lavoro per questo ruolo info: - database_deprecation_html: 'Starting with OpenProject 16.0, PostgreSQL 16 is required to use OpenProject. Your installation will remain functional with your current database, but anticipate incompatability in future releases.
We have prepared [upgrade guides for all installation methods](upgrade_guide). You can perform the upgrade ahead of the next release at any time by following the guides. + database_deprecation_html: 'A partire da OpenProject 16.0, è necessario PostgreSQL 16 per utilizzare OpenProject. La tua installazione continuerà a funzionare con il database attuale, ma è prevedibile un''incompatibilità nelle versioni future.
Abbiamo preparato [guide di aggiornamento per tutti i metodi di installazione](upgrade_guide). Puoi effettuare l''aggiornamento in qualsiasi momento prima della prossima versione seguendo le guide. ' authentication: @@ -686,13 +686,13 @@ it: confirmation_live_message_checked: Il pulsante per procedere è ora attivo. confirmation_live_message_unchecked: Il pulsante per procedere è ora inattivo. Devi spuntare la casella per continuare. pagination: - label: Pagination - prev: Previous - prev_page: Previous Page - next: Next - next_page: Next Page - page: Page %{number} - page_with_more: Page %{number}... + label: Paginazione + prev: Precedente + prev_page: Pagina precedente + next: Successiva + next_page: Pagina successiva + page: Pagina %{number} + page_with_more: Pagina %{number}... mcp_configurations: server_url_component: caption: URL a cui sarà raggiungibile il server OpenProject MCP. Necessario per la configurazione dei client MCP. @@ -700,13 +700,13 @@ it: op_dry_validation: or: oppure errors: - unexpected_key: is not allowed. + unexpected_key: non è consentito. array?: deve essere un array. decimal?: deve essere un decimale. defined: non deve essere definito. eql?: deve essere uguale a %{left}. filled?: deve essere compilato. - format?: is in invalid format. + format?: è in un formato non valido. greater_or_equal_zero: deve essere maggiore o uguale a 0. gteq?: deve essere maggiore o uguale di %{num}. hash?: deve essere un hash. @@ -733,9 +733,9 @@ it: parent: not_descendant: deve essere un discendente della radice gerarchica. str?: deve essere una stringa. - time?: must be a time. + time?: deve essere un orario. type?: deve essere %{type}. - uri?: is not a valid URI. + uri?: non è un URI valido. rules: copy_workflow_from: Tipo per la copia del flusso di lavoro enabled: Attivata @@ -856,10 +856,10 @@ it: ' change_identifier: Cambia identificatore - change_identifier_dialog_title: Change project identifier - change_identifier_format_hint_semantic: Only uppercase letters (A–Z), numbers or underscores. Max 10 characters. Must start with a letter. - change_identifier_format_hint_legacy: Only lowercase letters (a–z), numbers, dashes or underscores. - change_identifier_warning: 'This will permanently change identifiers and URLs of all work packages in this project. The previous identifier and URLs will nevertheless continue to redirect properly. + change_identifier_dialog_title: Modifica l'identificatore del progetto + change_identifier_format_hint_semantic: Solo lettere maiuscole (A–Z), numeri o underscore. Massimo 10 caratteri. Deve iniziare con una lettera. + change_identifier_format_hint_legacy: Solo lettere minuscole (a–z), numeri, trattini o underscore. + change_identifier_warning: 'Questa operazione modificherà in modo permanente gli identificatori e gli URL di tutte le macro-attività in questo progetto. Gli identificatori e gli URL precedenti continueranno comunque a reindirizzare correttamente. ' subitems: @@ -1097,9 +1097,9 @@ it: groups: member_in_these_groups: 'Questo utente è attualmente membro dei seguenti gruppi:' no_results_title_text: Questo utente al momento non è un membro di alcun gruppo. - summary_with_more_html: Member of %{names} and %{count_link}. + summary_with_more_html: Membro di %{names} e %{count_link}. more: altri %{count} - summary_html: Member of %{names}. + summary_html: Membro di %{names}. memberships: no_results_title_text: Questo utente non è attualmente membro di alcun progetto. open_profile: Apri il profilo @@ -1157,61 +1157,61 @@ it: group: Il gruppo è ora parte di %{project}. Nel mentre puoi ad esempio già pianificare con quel gruppo e assegnare pacchetti di lavoro. working_hours: current_schedule: - title: Current schedule - work_days: Work days - work_hours: Work hours - availability_factor: Availability factor - availability_subtitle: Dedicated to project work - effective_hours: Effective work hours - effective_subtitle: Per week - not_set: Not set + title: Programmazione attuale + work_days: Giorni feriali + work_hours: Orario di lavoro + availability_factor: Fattore di disponibilità + availability_subtitle: Dedicato al lavoro di progetto + effective_hours: Orario di lavoro effettivo + effective_subtitle: A settimana + not_set: Non impostato future: - title: Future schedules - description: Plan working schedule changes ahead of time. Once the date arrives your working schedules will be updated automatically. - add_button: Add future schedule - blank_title: No future schedules planned - blank_description: Create a future schedule to plan changes ahead of time + title: Programmazioni future + description: Pianifica in anticipo le modifiche agli orari di lavoro. Alla data prevista, gli orari di lavoro verranno aggiornati automaticamente. + add_button: Aggiungi programmazione futura + blank_title: Nessuna programmazione futura pianificata + blank_description: Crea una programmazione futura per pianificare le modifiche in anticipo history: - title: Schedule history - description: View your past work schedules. - blank_title: No schedule history yet - blank_description: Past schedule changes will appear here + title: Cronologia programmazioni + description: Visualizza le programmazioni passate. + blank_title: Ancora nessuna cronologia di programmazioni + blank_description: Le modifiche di programmazioni precedenti verranno visualizzate qui destroy: - confirm: Are you sure you want to delete this working schedule? + confirm: Vuoi davvero eliminare questa programmazione di lavoro? form: - title: Plan a future work schedule - title_current: Edit current work schedule - start_date: Start date - start_date_caption: Select the date from when the new work schedule will be effective. - work_days: Work days - working_hours_label: Working hours - hours_mode_label: Hours mode - same_hours_mode: Same hours per day - individual_hours_mode: Individual hours per day - work_hours: Work hours - hours_per_day: Hours per day - per_day: per day - per_week: per week - total_work_hours: Total work hours - availability_description: The availability factor represents the actual percentage of your working time dedicated to project tasks. This accounts for meetings, emails, administrative work, and other non-project activities. - availability_factor: Availability factor - availability_factor_caption: Define the percentage of your working time dedicated to project work. - total_available_hours: Total available work hours - title_availability_factor: Availability factor - title_days_and_hours: Days and hours - title_future_dates: Future dates + title: Pianifica una programmazione di lavoro futuro + title_current: Modifica la programmazione di lavoro attuale + start_date: Data di inizio + start_date_caption: Selezioni la data di entrata in vigore della nuova programmazione di lavoro. + work_days: Giorni feriali + working_hours_label: Orario di lavoro + hours_mode_label: Modalità ore + same_hours_mode: Stesse ore al giorno + individual_hours_mode: Ore giornaliere separate + work_hours: Orario di lavoro + hours_per_day: Ore al giorno + per_day: al giorno + per_week: a settimana + total_work_hours: Ore di lavoro totali + availability_description: Il fattore di disponibilità rappresenta la percentuale effettiva del tuo tempo di lavoro dedicata alle attività di progetto. Tiene conto di riunioni, email, attività amministrative e altre attività non legate al progetto. + availability_factor: Fattore di disponibilità + availability_factor_caption: Definisci la percentuale del tuo tempo di lavoro dedicata al lavoro di progetto. + total_available_hours: Totale ore di lavoro disponibili + title_availability_factor: Fattore di disponibilità + title_days_and_hours: Giorni e ore + title_future_dates: Date future table: - mobile_title: Working schedules - start_date: Start date - work_days: Work days - work_hours: Work hours - availability_factor: Availability factor - effective_work_hours: Effective work hours + mobile_title: Programmazioni di lavoro + start_date: Data di inizio + work_days: Giorni feriali + work_hours: Orario di lavoro + availability_factor: Fattore di disponibilità + effective_work_hours: Orario di lavoro effettivo work_days_count: - one: 1 working day - other: "%{count} working days" + one: 1 giorno lavorativo + other: "%{count} giorni lavorativi" user_preferences: - disable_keyboard_shortcuts_caption: 'You can choose to disable default [keyboard shortcuts](docs_url) if you use a screen reader or want to avoid accidentally triggering an action with a shortcut. + disable_keyboard_shortcuts_caption: 'Puoi scegliere di disattivare le [scorciatoie da tastiera](docs_url) predefinite se utilizzi un lettore di schermo o vuoi evitare di attivare accidentalmente un''azione con una scorciatoia. ' page: @@ -1222,12 +1222,12 @@ it: ' delete_tooltip: Elimina utente segnaposto deletion_info: - heading_html: Delete placeholder user %{name} + heading_html: Elimina l'utente segnaposto %{name} data_consequences: 'Tutte le occorrenze dell''utente segnaposto (ad esempio, come assegnatario, responsabile o altri valori) saranno riassegnate a un account chiamato "Utente eliminato". Poiché i dati di ogni account eliminato vengono riassegnati a questo account, non sarà possibile distinguere i dati creati dall''utente dai dati di un altro account eliminato. ' irreversible: Questa azione è irreversibile - confirmation_html: Enter the placeholder user name %{name} to confirm the deletion. + confirmation_html: Inserisci il nome utente del segnaposto %{name} per confermare l'eliminazione. priorities: edit: priority_color_text: | @@ -1259,9 +1259,8 @@ it: Seleziona questa opzione per escludere i pacchetti di lavoro con questo stato dai totali di Lavoro, Lavoro rimanente e % Completamento in una gerarchia. status_percent_complete_text_html: |- - In [status-based progress calculation mode](setting_url), the % Complete of a work - package is automatically set to this value when this status is selected. - Ignored in work-based mode. + Nella modalità di [calcolo dell'avanzamento basato sullo stato](setting_url), la % di completamento di una macro-attività viene impostata automaticamente su questo valore quando viene selezionato questo stato. + Ignorato nella modalità basata sul lavoro. status_readonly_html: | Seleziona questa opzione per contrassegnare i pacchetti di lavoro con questo stato come di sola lettura. Nessun attributo può essere modificato a eccezione dello stato. @@ -1530,7 +1529,7 @@ it: ' login_with_auth_provider: o accedi con il tuo account esistente signup_with_auth_provider: o accedi utilizzando - auth_source_login_html: Please login as %{login} to activate your account. + auth_source_login_html: Accedi come %{login} per attivare il tuo account. omniauth_login: Accedi per attivare il tuo account. actionview_instancetag_blank_option: Si prega di selezionare activemodel: @@ -1540,8 +1539,8 @@ it: activerecord: attributes: work_package_semantic_alias: - identifier: Identifier - work_package: Work package + identifier: Identificatore + work_package: Macro-attività jira_import: projects: Progetti import/jira: @@ -1804,11 +1803,11 @@ it: consented_at: Consenso a group: identity_url: URL identificativo - parent: Parent group - organizational_unit: Organizational unit + parent: Gruppo padre + organizational_unit: Unità organizzativa group_detail: - parent: Parent group - organizational_unit: Organizational unit + parent: Gruppo padre + organizational_unit: Unità organizzativa user_preference: header_look_and_feel: Aspetto header_alerts: Avvisi @@ -1838,27 +1837,27 @@ it: principal_type: Tipo di invito id_or_email: Nome o indirizzo email user_non_working_time: - start_date: Start date - end_date: End date + start_date: Data di inizio + end_date: Data di fine user_working_hours: - valid_from: Valid from - monday: Monday - monday_hours: Monday hours - tuesday: Tuesday - tuesday_hours: Tuesday hours - wednesday: Wednesday - wednesday_hours: Wednesday hours - thursday: Thursday - thursday_hours: Thursday hours - friday: Friday - friday_hours: Friday hours - saturday: Saturday - saturday_hours: Saturday hours - sunday: Sunday - sunday_hours: Sunday hours - availability_factor: Availability factor - shared_hours: Work hours - days: Working days + valid_from: Valido dal + monday: Lunedi + monday_hours: Ore del lunedì + tuesday: Martedì + tuesday_hours: Ore del martedì + wednesday: Mercoledi + wednesday_hours: Ore del mercoledì + thursday: Giovedì + thursday_hours: Ore del giovedì + friday: Venerdi + friday_hours: Ore del venerdì + saturday: Sabato + saturday_hours: Ore del sabato + sunday: Domenica + sunday_hours: Ore della domenica + availability_factor: Fattore di disponibilità + shared_hours: Ore di lavoro + days: Giorni lavorativi version: effective_date: Data di fine sharing: Condivisione @@ -1913,8 +1912,8 @@ it: before: deve essere precedente al %{date}. before_or_equal_to: deve essere precedente o uguale al %{date}. blank: non può essere lasciato vuoto. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. + not_before_start_date: non deve essere prima della data di inizio. + overlapping_range: si sovrappone a un intervallo di giorni non lavorativi esistente. blank_nested: deve avere la proprietà '%{property}' impostata. cannot_delete_mapping: è necessario. Non può essere cancellato. is_for_all_cannot_modify: è per tutti i progetti e non può quindi essere modificato. @@ -1951,9 +1950,9 @@ it: less_than_or_equal_to: deve essere inferiore o uguale a %{count}. not_available: non è disponibile a causa di una configurazione di sistema. not_deletable: non può essere eliminato. - not_editable: cannot be edited because it is already in effect. + not_editable: non può essere modificato perché è già in vigore. not_current_user: non è l'utente attuale. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. + system_wide_non_working_day_exists: È in conflitto con un giorno non lavorativo già definito a livello di sistema per questa data. not_found: non trovato. not_a_date: non è una data valida. not_a_datetime: non è un'orario valido. @@ -1988,7 +1987,7 @@ it: group: attributes: parent_id: - circular_dependency: would create a circular group hierarchy. + circular_dependency: creerebbe una gerarchia circolare dei gruppi. ldap_auth_source: attributes: tls_certificate_string: @@ -2100,8 +2099,8 @@ it: types: in_use_by_work_packages: 'ancora in uso dalla macro-attività: %{types}' identifier: - must_start_with_letter: must start with a letter - no_special_characters: may only contain uppercase letters, numbers, and underscores + must_start_with_letter: deve iniziare con una lettera + no_special_characters: può contenere solo lettere maiuscole, numeri e underscore enabled_modules: dependency_missing: Anche il modulo '%{dependency}' deve essere abilitato dal momento che il modulo '%{module}' dipende da esso. format: "%{message}" @@ -2313,7 +2312,7 @@ it: user_working_hours: attributes: days: - no_working_day: At least one day needs to be configured as a working day. + no_working_day: È necessario configurare almeno un giorno come lavorativo. member: principal_blank: Si prega di scegliere almeno un utente o un gruppo. role_blank: deve essere assegnato. @@ -2580,7 +2579,7 @@ it: info: 'Dovrai generare un token di backup per poterne creare uno. Ogni volta che vorrai richiedere un backup dovrai fornire questo token. Puoi eliminare il token di backup per disabilitarli per questo utente. ' - verification_html: 'Enter %{word} to confirm you want to %{action} the backup token. + verification_html: 'Inserisci %{word} per confermare di voler %{action} il token di backup. ' verification_word_reset: ripristina @@ -3021,7 +3020,7 @@ it: title: one: Un giorno rimanente del token di prova %{trial_plan} other: "%{count} giorni rimanenti del token di prova %{trial_plan}" - description_html: You have access to all %{trial_plan} features. + description_html: Hai accesso a tutte le funzionalità %{trial_plan}. trial: not_found: Hai richiesto un token di prova, ma questa richiesta non è più disponibile. Riprova. wait_for_confirmation: Ti abbiamo inviato un'e-mail per confermare il tuo indirizzo al fine di recuperare un token di prova. @@ -3041,8 +3040,8 @@ it: ' domain_caption: Il token sarà valido per il tuo nome host attualmente configurato. - receive_newsletter: I want to receive the OpenProject [newsletter](newsletter_url). - consent: I agree with the [terms of service](tos_url) and the [privacy policy](privacy_url). + receive_newsletter: Desidero ricevere la [newsletter](newsletter_url) di OpenProject. + consent: Accetto i [termini di servizio](tos_url) e l'[informativa sulla privacy](privacy_url). email_calendar_updates: state: disabled: Disabilitati. @@ -3131,8 +3130,8 @@ it: work_package_edit: Macro-attività modificata work_package_note: Aggiunta nota alla macro-attività title: - project_html: 'Project: %{name}' - subproject_html: 'Subproject: %{name}' + project_html: 'Progetto: %{name}' + subproject_html: 'Sottoprogetto: %{name}' export: dialog: title: Esporta @@ -3304,17 +3303,17 @@ it: learn_about: Scopri di più su tutte le nuove funzionalità missing: Non ci sono ancora caratteristiche evidenziate. '17_3': - new_features_title: 'The release contains various new features and improvements, such as: + new_features_title: 'Questa versione contiene diverse nuove funzionalità e miglioramenti, come ad esempio: ' new_features_list: - line_0: 'Big Agile update: dedicated sprint objects, all work packages visible on Backlogs, and automatic sprint board creation.' - line_1: In-place editing of project attributes on the Project Overview page. - line_2: Sharing of meeting templates (Basic plan and higher). - line_3: Better search in Time and Costs, Boards, and more. - line_4: Option to safely change project identifiers. - line_5: Improved workflow configuration for administrators. - line_6: Action boards released to Community. + line_0: 'Grande aggiornamento Agile: oggetti sprint dedicati, tutte le macro-attività visibili nel Backlog e creazione automatica della bacheca sprint.' + line_1: Modifica in linea degli attributi del progetto nella pagina Panoramica del progetto. + line_2: Condivisione dei modelli di riunione (piano Basic e superiori). + line_3: Ricerca migliorata in Tempi e costi, Bacheche e altro. + line_4: Opzione per cambiare in modo sicuro gli identificatori del progetto. + line_5: Configurazione migliorata del flusso di lavoro per gli amministratori. + line_6: Le bacheche di azione sono disponibili su Community. links: upgrade_enterprise_edition: Aggiorna ad Enterprise edition postgres_migration: Migrazione dell'installazione su PostgreSQL @@ -3379,15 +3378,15 @@ it: progress_calculation_adjusted: Il calcolo dei progressi è modificato con l'aggiornamento della versione. scheduling_mode_adjusted: Modalità di programmazione regolata automaticamente con aggiornamento della versione. totals_removed_from_childless_work_packages: I totali di lavoro e avanzamento vengono rimossi automaticamente per le macro-attività non principali con l'aggiornamento della versione. Questa è un'attività di manutenzione e può essere tranquillamente ignorata. - sprint_migration: Version '%{version_name}' has been copied as a sprint. + sprint_migration: La versione '%{version_name}' è stata copiata come sprint. total_percent_complete_mode_changed_to_work_weighted_average: Le macro-attività figlie senza Lavoro vengono ignorate. total_percent_complete_mode_changed_to_simple_average: I valori di Lavoro delle macro-attività figlie vengono ignorati. links: configuration_guide: Guida di configurazione get_in_touch: Hai dei dubbi? Mettiti in contatto con noi. - instructions_after_registration_link: You can sign in as soon as your account has been activated by clicking [here](signin_url). - instructions_after_logout_link: You can sign in again by clicking [here](signin_url). - instructions_after_error_link: You can try to sign in again by clicking [here](signin_url). If the error persists, ask your admin for help. + instructions_after_registration_link: Puoi accedere non appena il tuo account sarà stato attivato facendo clic [qui](signin_url). + instructions_after_logout_link: Puoi accedere di nuovo cliccando [qui](signin_url). + instructions_after_error_link: Puoi provare ad accedere di nuovo facendo clic [qui](signin_url). Se l'errore persiste, contatta l'amministratore. menus: admin: ai: Intelligenza artificiale (IA) @@ -3400,10 +3399,10 @@ it: label: Aggiungi… my_account: notifications_and_email: - title: Notification and email + title: Notifiche ed email tabs: - notifications: Notification settings - email_reminders: Email reminders + notifications: Impostazioni delle notifiche + email_reminders: Promemoria email access_tokens: description: I token provider vengono emessi da OpenProject, consentendo ad altre applicazioni di accedervi. I token client vengono emessi da altre applicazioni, consentendo a OpenProject di accedervi. no_results: @@ -3468,70 +3467,70 @@ it: unknown_storage: Archivio sconosciuto email_reminders: immediate_reminders: - title: Send me an email reminder - mentioned: Notify me when I am mentioned - personal_reminder: Notify me for personal reminders + title: Inviami un promemoria email + mentioned: Avvisami quando qualcuno mi menziona + personal_reminder: Notificami i promemoria personali daily_reminders: - title: Send me daily email reminders for unread notifications - caption: You will receive these reminders only for unread notifications and only at hours you specify. Until you configure a time zone for your account, the times will be interpreted to be in UTC. - enabled: Enable daily email reminders - add_time: Add time - remove_time: Remove time - time_slot_label: Reminder time (UTC) + title: Inviami promemoria email giornalieri per le notifiche non lette + caption: Riceverai questi promemoria solo per le notifiche non lette e solo negli orari che specifichi. Finché non configuri un fuso orario per il tuo account, gli orari saranno interpretati come UTC. + enabled: Abilita promemoria email giornalieri + add_time: Aggiungi orario + remove_time: Rimuovi orario + time_slot_label: Ora del promemoria (UTC) workdays: - title: Receive email reminders on these days - submit_button: Update reminder days + title: Ricevi promemoria email in questi giorni + submit_button: Aggiorna i giorni di promemoria pause_reminders: - title: Pause email notifications - enabled: Temporarily pause daily email reminders - date_range: Pause period + title: Sospendi le notifiche email + enabled: Sospendi temporaneamente i promemoria email giornalieri + date_range: Periodo di sospensione email_alerts: - title: Email alerts for other items that are not work packages - news_added: News added - news_commented: Comment on a news item - document_added: Document added - forum_messages: Forum message posted - wiki_page_added: Wiki page added - wiki_page_updated: Wiki page updated - membership_added: Membership added - membership_updated: Membership updated - submit_button: Update alerts + title: Avvisi email per altri elementi che non sono macro-attività + news_added: Notizie aggiunte + news_commented: Commento su un articolo di notizie + document_added: Documento aggiunto + forum_messages: Messaggio del forum pubblicato + wiki_page_added: Pagina wiki aggiunta + wiki_page_updated: Pagina wiki aggiornata + membership_added: Iscrizione aggiunta + membership_updated: Iscrizione aggiornata + submit_button: Aggiorna gli avvisi notifications: participating: - title: Participating - submit_button: Update preferences - mentioned: Mentioned - watched: Watching - assignee: Assignee - responsible: Accountable - shared: Shared with me + title: Partecipazione + submit_button: Aggiorna impostazioni + mentioned: Menzionato + watched: Osservazione + assignee: Assegnatario + responsible: Responsabile + shared: Condivisi con me date_alerts: - title: Date alerts - submit_button: Update date alerts - start_date: Start date - due_date: Finish date - overdue: Overdue + title: Avvisi sulle date + submit_button: Aggiorna gli avvisi sulle date + start_date: Data di inizio + due_date: Data di fine + overdue: In ritardo times: - same_day: On the same day - one_day_before: 1 day before - three_days_before: 3 days before - seven_days_before: 7 days before - one_day_after: 1 day after - three_days_after: 3 days after - seven_days_after: 7 days after + same_day: Lo stesso giorno + one_day_before: 1 giorno prima + three_days_before: 3 giorni prima + seven_days_before: 7 giorni prima + one_day_after: 1 giorno dopo + three_days_after: 3 giorni dopo + seven_days_after: 7 giorni dopo non_participating: - title: Non-participating - submit_button: Update preferences - work_package_created: New work packages - work_package_commented: All new comments - work_package_processed: All status changes - work_package_prioritized: All priority changes - work_package_scheduled: All date changes + title: Non partecipante + submit_button: Aggiorna impostazioni + work_package_created: Nuove macro-attività + work_package_commented: Tutti i nuovi commenti + work_package_processed: Tutte le modifiche di stato + work_package_prioritized: Tutte le modifiche prioritarie + work_package_scheduled: Tutte le modifiche della data project_specific_settings: - title: Project-specific notification settings - add_button: Add project-specific notifications - dialog_title: Add project-specific notifications - list_header: Projects with specific notifications + title: Impostazioni di notifica specifiche del progetto + add_button: Aggiungi notifiche specifiche al progetto + dialog_title: Aggiungi notifiche specifiche al progetto + list_header: Progetti con notifiche specifiche notifications: reasons: assigned: Assegnatario @@ -3604,7 +3603,7 @@ it: label_ical_access_key_generation_hint: Generato automaticamente all'iscrizione a un calendario. label_ical_access_key_latest: più recente label_ical_access_key_revoke: Revoca - label_integrations: Integrations + label_integrations: Integrazioni label_add_column: Aggiungi colonna label_applied_status: Stato applicato label_archive_project: Archivia progetto @@ -3652,8 +3651,8 @@ it: label_calendar_show: Mostra Calendario label_category: Categoria label_completed: Completato - label_committed_at_html: "%{committed_revision_link} at %{date}" - label_committed_link: committed revision %{revision_identifier} + label_committed_at_html: "%{committed_revision_link} il giorno %{date}" + label_committed_link: revisione accettata %{revision_identifier} label_consent_settings: Consenso dell'utente label_wiki_menu_item: Voce di menu wiki label_select_main_menu_item: Seleziona una nuova voce del menu principale @@ -3820,7 +3819,7 @@ it: label_subject_or_id: Oggetto o ID label_calendar_subscriptions: Iscrizioni calendario label_identifier: Identificatore - label_project_identifier: Project identifier + label_project_identifier: Identificatore di progetto label_in: in label_in_less_than: in meno di label_in_more_than: in più di @@ -3954,13 +3953,13 @@ it: label_news_view_all: Vedi tutte le notizie label_next: Prossimo label_next_week: Prossima settimana - label_next_year: Next year + label_next_year: Anno successivo label_no_change_option: "(Nessuna modifica)" label_no_data: Nessun dato da visualizzare label_no_due_date: nessuna data di fine label_no_start_date: nessuna data di inizio label_no_parent_page: Nessuna pagina genitore - label_no_parent_group: "(No parent group)" + label_no_parent_group: "(Nessun gruppo genitore)" label_notification_center_plural: Notifiche label_nothing_display: Niente da visualizzare label_nobody: nessuno @@ -3989,7 +3988,7 @@ it: label_overall_activity: Totale attività label_overview: Panoramica label_page_title: Titolo della Pagina - label_parent_group_caption: 'Setting a parent group will make this group a subgroup of the selected parent group. This will also inherit all memberships, including permissions of the parent group. + label_parent_group_caption: 'Impostare un gruppo padre renderà questo gruppo un sottogruppo del gruppo padre selezionato. Verranno inoltre ereditate tutte le appartenenze, inclusi i permessi del gruppo padre. ' label_part_of: parte di @@ -4018,7 +4017,7 @@ it: label_preview_not_available: Anteprima non disponibile label_previous: Precedente label_previous_week: Settimana precedente - label_previous_year: Previous year + label_previous_year: Anno precedente label_principal_invite_via_email: " o invita nuovi utenti via e-mail" label_principal_search: Aggiungi utenti o gruppi esistenti label_privacy_policy: Politica di privacy e sicurezza dei dati @@ -4130,7 +4129,7 @@ it: label_start_to_start: dall'inizio all'inizio label_statistics: Statistiche label_status: Stato - label_status_plural: Statuses + label_status_plural: Stati label_storage_free_space: Spazio di archiviazione su disco rimanente label_storage_used_space: Spazio di archiviazione su disco utilizzato label_storage_group: File System di archiviazione %{identifier} @@ -4180,7 +4179,7 @@ it: label_user: Utente label_user_and_permission: Utenti e autorizzazioni label_user_named: Utente %{name} - label_user_activity_html: "%{value}'s activity" + label_user_activity_html: Attività di %{value} label_user_anonymous: Anonimo label_user_menu: Menu utente label_user_new: Nuovo utente @@ -4268,14 +4267,14 @@ it: other: "%{count} file" zero: nessun file label_x_days: - one: 1 day - other: "%{count} days" + one: 1 giorno + other: "%{count} giorni" label_x_working_days: - one: 1 working day - other: "%{count} working days" + one: 1 giorno lavorativo + other: "%{count} giorni lavorativi" label_x_working_days_time_off: - one: 'Time off: 1 working day' - other: 'Time off: %{count} working days' + one: 'Assenza: 1 giorno lavorativo' + other: 'Assenza: %{count} giorni lavorativi' label_yesterday: ieri label_zen_mode: Modalità Zen label_role_type: Tipo @@ -4284,22 +4283,22 @@ it: label_not_changeable: "(non modificabile)" label_global: Globale label_seeded_from_env_warning: Questo record è stato creato tramite l'impostazione di una variabile d'ambiente. Non è modificabile tramite l'interfaccia utente. - label_schedule_and_availability: Schedule and availability - label_working_hours: Work schedule - label_non_working_days: Availability calendar - label_non_working_days_with_count: Non-working days (%{count}) - label_non_working_days_summary: Summary - button_add_non_working_time: Time off - button_edit_non_working_time: Edit time off - label_continued_from_previous_year: continued from previous year - label_continues_into_next_year: continues into next year - label_end_date: Finish date - label_working_days: Working days - label_non_working_times_with_count: "%{year} time off (%{count})" - label_non_working_times_summary: "%{year} summary" - label_total_user_non_working_times: Personal non-working days - label_total_global_non_working_days: Global non-working days - label_total_days_off: Total days off + label_schedule_and_availability: Programma e disponibilità + label_working_hours: Orario di lavoro + label_non_working_days: Calendario disponibilità + label_non_working_days_with_count: Giorni non lavorativi (%{count}) + label_non_working_days_summary: Riepilogo + button_add_non_working_time: Assenze + button_edit_non_working_time: Modifica assenze + label_continued_from_previous_year: continua dall'anno precedente + label_continues_into_next_year: continua nel prossimo anno + label_end_date: Data di fine + label_working_days: Giorni lavorativi + label_non_working_times_with_count: Assenze %{year} (%{count}) + label_non_working_times_summary: Riepilogo %{year} + label_total_user_non_working_times: Giorni non lavorativi personali + label_total_global_non_working_days: Giorni non lavorativi globali + label_total_days_off: Totale assenze macro_execution_error: Errore nell'esecuzione della macro %{macro_name} macro_unavailable: Non può essere visualizzata la macro %{macro_name}. macros: @@ -4334,7 +4333,7 @@ it: center: Al centro notifiche see_in_center: Vedi commento nel centro notifiche settings: Modifica impostazioni email - salutation: Hello %{user}, + salutation: Ciao %{user}, salutation_full_name: Nome e cognome work_packages: created_at: 'Creato il %{timestamp} da %{user} ' @@ -4364,7 +4363,7 @@ it: note: 'Nota: "%{note}"' sharing: work_packages: - allowed_actions_html: You may %{allowed_actions} this work package. This can change depending on your project role and permissions. + allowed_actions_html: Puoi %{allowed_actions} questa macro-attività. Questa impostazione può cambiare a seconda del ruolo e delle autorizzazioni del progetto. create_account: Per accedere a questa macro-attività è necessario creare e attivare un account su %{instance} open_work_package: Apri macro-attività subject: 'La macro-attività #%{id} è stata condivisa con te' @@ -4464,8 +4463,8 @@ it: mail_user_activation_limit_reached: subject: Limite di attivazione dell'utente raggiunto message_html: | - A new user (%{email}) tried to create an account on an OpenProject environment that you manage (%{host}). - The user cannot activate their account since the user limit has been reached. + Un nuovo utente (%{email}) ha tentato di creare un account su un ambiente OpenProject che gestisci (%{host}). + L'utente non può attivare il proprio account dal momento che è stato raggiunto il limite di utente. steps: label: 'Per consentire all''utente di registrarsi puoi: ' a: Aggiorna il tuo piano di pagamento ([here](upgrade_url)) @@ -4527,7 +4526,7 @@ it: notice_parent_item_not_found: L'elemento genitore non è stato trovato. notice_project_not_deleted: Il progetto non è stato eliminato. notice_project_not_found: Progetto non trovato. - notice_smtp_address_unsafe_env_hint: SMTP address %{address} is not safe. Please add it to the whitelist using the %{env_name} environment variable. + notice_smtp_address_unsafe_env_hint: L'indirizzo SMTP %{address} non è sicuro. Aggiungilo alla whitelist utilizzando la variabile di ambiente %{env_name}. notice_successful_connection: Connesso con successo. notice_successful_create: Creato con successo. notice_successful_delete: Cancellato con successo. @@ -4652,12 +4651,12 @@ it: permission_manage_versions: Gestire le versioni permission_manage_wiki: Gestire le pagine wiki permission_manage_wiki_menu: Gestire i menu wiki - permission_manage_own_working_times: Manage own working times - permission_manage_own_working_times_explanation: 'Allows users to manage their own working times, and personal non-working days. + permission_manage_own_working_times: Gestire i propri orari di lavoro + permission_manage_own_working_times_explanation: 'Consente agli utenti di gestire i propri orari di lavoro e i giorni non lavorativi personali. ' - permission_manage_working_times: Manage working times for all users - permission_manage_working_times_explanation: 'Allows users to manage working times for all users, including personal non-working days. + permission_manage_working_times: Gestire gli orari di lavoro per tutti gli utenti + permission_manage_working_times_explanation: 'Consente agli utenti di gestire gli orari di lavoro di tutti gli utenti, inclusi i giorni non lavorativi personali. ' permission_move_work_packages: Spostare le macro-attività @@ -4810,10 +4809,10 @@ it: info: L'eliminazione del repository è un'operazione irreversibile. info_not_managed: 'Nota: questa azione NON eliminerà il contenuto di questo archivio, che non è gestito direttamente da OpenProject.' managed_path_note: 'La seguente cartella sarà eliminata: %{path}' - repository_verification_html: Enter the project's identifier %{identifier} to verify the deletion of its repository. + repository_verification_html: Immettere l'identificatore del progetto %{identifier} per verificare l'eliminazione del suo archivio gestito dal sistema. subtitle: Vuoi davvero eliminare la risorsa %{repository_type} del %{project_name} progetto? - subtitle_not_managed_html: Do you really want to remove the linked %{repository_type} %{url} from the project %{project_name}? - title_html: Delete the %{repository_type} + subtitle_not_managed_html: Vuoi davvero eliminare la risorsa %{repository_type} accessibile al link %{url} dal progetto %{project_name}? + title_html: Elimina %{repository_type} title_not_managed: Eliminare la risorsa collegata %{repository_type}? errors: build_failed: Impossibile creare il repository con la configurazione richiesta. %{reason} @@ -4864,7 +4863,7 @@ it: update_timeout: |- Mantieni l'ultima informazione sullo spazio su disco richiesto per un archivio di progetto per N minuti. Poichè il calcolo dello spazio su disco richiesto per un archivio di progetto può essere un'attività costosa, aumentare questo intervallo riduce l'impatto sulle prestazioni. - oauth_application_details_html: 'The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:' + oauth_application_details_html: 'Il valore segreto del client non sarà nuovamente accessibile dopo aver chiuso questa finestra. Copia questi valori nelle impostazioni d''integrazione di Nextcloud OpenProject:' oauth_application_details_link_text: Vai alla pagina delle impostazioni setup_documentation_details: 'Se hai bisogno di aiuto per configurare un nuovo archivio file, controlla la documentazione: ' setup_documentation_details_link_text: Configurazione archivi file @@ -4914,7 +4913,7 @@ it: setting_apiv3_cors_title: Condivisione incrociata delle risorse (CORS - Cross-Origin Resource Sharing) setting_apiv3_cors_enabled: Abilita CORS setting_apiv3_cors_origins: Origini di condivisione CORS (Cross-Origin Resource Sharing) API V3 consentite - setting_apiv3_cors_origins_instructions_html: 'If CORS is enabled, these are the origins that are allowed to access OpenProject API.
Please check the [Documentation on the Origin header](docs_url) on how to specify the expected values. + setting_apiv3_cors_origins_instructions_html: 'Se CORS è abilitato, queste sono le origini autorizzate ad accedere all''API di OpenProject.
Consulta la [documentazione sull''header Origin](docs_url) per sapere come specificare i valori attesi. ' setting_apiv3_write_readonly_attributes: Accesso in scrittura agli attributi di sola lettura @@ -4924,7 +4923,7 @@ it: setting_apiv3_write_readonly_attributes_warning: 'Questa impostazione è utile, ad esempio, per l''importazione di dati, ma consente agli amministratori di impersonare altri utenti nella creazione di elementi. Tutte le richieste di creazione vengono comunque registrate con il vero autore. ' - setting_apiv3_write_readonly_attributes_additional_html: 'For more information on attributes and supported resources, please see the [API documentation](api_documentation_link). + setting_apiv3_write_readonly_attributes_additional_html: 'Per maggiori informazioni sugli attributi e sulle risorse supportate, consulta la [documentazione API](api_documentation_link). ' setting_apiv3_max_page_size: Dimensione massima della pagina API @@ -5026,7 +5025,7 @@ it: setting_work_package_properties: Proprietà della macro-attività setting_work_package_startdate_is_adddate: Usa la data corrente come data di inizio per le nuove macro-attività setting_work_packages_projects_export_limit: Limite di esportazione di macro-attività/progetti - setting_journal_aggregation_time_minutes: Aggregation period + setting_journal_aggregation_time_minutes: Periodo di aggregazione setting_log_requesting_user: Registra il nome d'accesso, il nome utente, e l'indirizzo mail per tutte le richieste setting_login_required: Autenticazione richiesta setting_login_required_caption: Quando l'opzione è selezionata, tutte le richieste all'applicazione devono essere autenticate. @@ -5109,12 +5108,12 @@ it: setting_welcome_text: Blocco di testo di benvenuto setting_welcome_title: Blocco di testo del titolo setting_welcome_on_homescreen: Mostra il blocco testo di benvenuto nella pagina home - setting_work_packages_identifier_classic: Instance-wide numerical sequence (default) - setting_work_packages_identifier_classic_caption: 'Every work package gets a sequential number starting with 1 and incremented with every new one. The numbers are unique within this instance so they remain the same even if work packages are moved between projects. + setting_work_packages_identifier_classic: Sequenza numerica a livello di istanza (predefinita) + setting_work_packages_identifier_classic_caption: 'Ogni macro-attività riceve un numero sequenziale a partire da 1, incrementato a ogni nuova creazione. I numeri sono univoci all''interno di questa istanza, quindi restano invariati anche se le macro-attività vengono spostate tra progetti. ' - setting_work_packages_identifier_semantic: Project-based semantic identifiers - setting_work_packages_identifier_semantic_caption: 'Every project has a unique identifier that is prefixed to the work package ID. If a work package moved to another project, a new identifier is generated but the old one continues to function. + setting_work_packages_identifier_semantic: Identificatori semantici basati su progetti + setting_work_packages_identifier_semantic_caption: 'Ogni progetto ha un identificatore univoco che viene anteposto all''ID della macro-attività. Se una macro-attività viene spostata in un altro progetto, viene generato un nuovo identificatore, ma quello precedente continua a funzionare. ' setting_work_package_list_default_highlighting_mode: Modalità evidenziazione predefinita @@ -5298,11 +5297,11 @@ it: section_work_week: Settimana lavorativa section_holidays_and_closures: Festività e chiusure work_packages: - work_package_identifier: Work package identifier + work_package_identifier: Identificatore della macro-attività not_allowed_text: Non hai i permessi necessari per visualizzare questa pagina. activities: enable_internal_comments: Abilita commenti interni - helper_text_html: 'Internal comments allow an internal team to communicate amongst themselves privately. These are only visible to selected roles that have the necessary permissions and will not be visible publicly. [Click here to learn more](docs_url) + helper_text_html: 'I commenti interni consentono al team interno di comunicare tra loro in modo privato. Sono visibili solo ai ruoli selezionati che dispongono delle autorizzazioni necessarie e non saranno visibili pubblicamente. [Fai clic qui per saperne di più](docs_url) ' text_formatting: @@ -5390,7 +5389,7 @@ it: text_default_administrator_account_changed: Account amministratore predefinito cambiato text_default_encoding: 'Predefinito: UTF-8' text_destroy: Cancella - text_destroy_with_associated: 'There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:' + text_destroy_with_associated: 'Ci sono ulteriori oggetti associati con la/le macro-attività che devono essere eliminati. Tali oggetti sono dei seguenti tipi:' text_destroy_what_to_do: Cosa vuoi fare? text_diff_truncated: "... Questo diff è stato troncato perché supera la dimensione massima che può essere visualizzata." text_email_delivery_not_configured: |- @@ -5447,10 +5446,10 @@ it: text_plugin_assets_writable: Cartella del pool di plugin installati scrivibile text_powered_by: Offerto da %{link} text_project_identifier_info: Solo le lettere minuscole (a-z), numeri, trattini e trattini bassi sono consentiti, devi iniziare con una lettera maiuscola. - text_project_identifier_description: The project identifier is prepended to all work package IDs. If the identifier is "PROJ" for example, the work package identifier will be "PROJ-12" or "PROJ-246". - text_project_identifier_url_description: The project identifier is included in the URL of the project. - text_project_identifier_handle_format: Must start with a letter and contain only uppercase letters, numbers, and underscores (max 10 characters). - text_project_identifier_format: Must start with a lowercase letter. Only lowercase letters (a-z), numbers, dashes and underscores are allowed. + text_project_identifier_description: L'identificatore del progetto viene anteposto a tutti gli ID delle macro-attività. Se l'identificatore è "PROJ", ad esempio, l'identificatore della macro-attività sarà "PROJ-12" o "PROJ-246". + text_project_identifier_url_description: L'identificatore del progetto è incluso nell'URL del progetto. + text_project_identifier_handle_format: Deve iniziare con una lettera e contenere solo lettere maiuscole, numeri e underscore (massimo 10 caratteri). + text_project_identifier_format: Deve iniziare con una lettera minuscola. Sono ammesse solo lettere minuscole (a-z), numeri, trattini e underscore. text_reassign: 'Riassegna alla macro-attività:' text_regexp_multiline: L'espressione regolare viene applicata in modalità multi-linea. ad esempio, ^---\s+ text_repository_usernames_mapping: Seleziona o aggiorna l'utente OpenProject mappato per ogni nome utente trovato nel registro dell'archivio. Gli utenti con lo stesso nome utente e repository OpenProject o e-mail vengono mappati automaticamente. @@ -5561,10 +5560,10 @@ it: version_status_locked: bloccato version_status_open: aperte note: Nota - note_password_login_disabled_link: Password login has been disabled through a [configuration setting](configuration_url). + note_password_login_disabled_link: L'accesso tramite password è stato disabilitato tramite un'[impostazione di configurazione](configuration_url). warning: Attenzione warning_attachments_not_saved: "%{count} file non possono essere salvati." - warning_imminent_user_limit_html: 'You invited more users than are supported by your current plan. Invited users may not be able to join your OpenProject environment. Please [upgrade your plan](upgrade_url) or block existing users in order to allow invited and registered users to join. + warning_imminent_user_limit_html: 'Hai invitato più utenti di quanti ne siano supportati dal tuo piano attuale. Gli utenti invitati potrebbero non riuscire ad accedere al tuo ambiente OpenProject. Ti invitiamo ad [aggiornare il piano](upgrade_url) oppure a bloccare alcuni utenti esistenti per consentire agli utenti invitati e registrati di accedere. ' warning_registration_token_expired: | @@ -5573,7 +5572,7 @@ it: warning_user_limit_reached: 'L''aggiunta di ulteriori utenti supererà il limite attuale. Contatta un amministratore per aumentare il limite di utenti e garantire che gli utenti esterni possano accedere a questa istanza. ' - warning_user_limit_reached_admin_html: 'Adding additional users will exceed the current limit. Please [upgrade your plan](upgrade_url) to be able to ensure external users are able to access this instance. + warning_user_limit_reached_admin_html: 'L''aggiunta di ulteriori utenti supererà il limite attuale. Ti invitiamo a [aggiornare il piano](upgrade_url) per garantire che gli utenti esterni possano accedere a questa istanza. ' warning_user_limit_reached_instructions: 'Raggiunto il limite di utenti (%{current}/%{max} utenti attivi). Si prega di contattare sales@openproject.com per aggiornare il tuo piano dell''edizione Enterprise e aggiungere ulteriori utenti. @@ -5638,7 +5637,7 @@ it: reminders: label_remind_at: Data note_placeholder: Perché stai impostando questo promemoria? - create_success_message_html: Reminder set successfully. You will receive a notification for this work package %{reminder_time}. + create_success_message_html: Il promemoria è stato impostato con successo. Riceverai una notifica per questa macro-attività %{reminder_time}. success_update_message: Promemoria aggiornato con successo. success_deletion_message: Promemoria eliminato con successo. sharing: @@ -5670,7 +5669,7 @@ it: warning_user_limit_reached: 'Con l''aggiunta di ulteriori utenti, verrà superato il limite attuale. Contatta un amministratore per incrementare il limite di utenti e garantire che gli utenti esterni possano accedere a questo %{entity}. ' - warning_user_limit_reached_admin_html: 'Adding additional users will exceed the current limit. Please [upgrade your plan](upgrade_url) to be able to ensure external users are able to access this %{entity}. + warning_user_limit_reached_admin_html: 'L''aggiunta di ulteriori utenti supererà il limite attuale. Ti invitiamo a [aggiornare il piano](upgrade_url) per garantire che gli utenti esterni possano accedere a questa %{entity}. ' warning_no_selected_user: Seleziona gli utenti con cui condividere questo %{entity} @@ -5794,7 +5793,7 @@ it: project: Non divulgato - Il progetto è invisibile a causa della mancanza dei permessi. ancestor: Non divulgato - L'antenato è invisibile a causa della mancanza dei permessi. definingProject: Non divulgato - Il progetto è invisibile a causa della mancanza dei permessi. - definingWorkspace: Undisclosed - The workspace is invisible because of lacking permissions. + definingWorkspace: Non visibile - Lo spazio di lavoro è invisibile a causa della mancanza di autorizzazioni. doorkeeper: pre_authorization: status: Pre-autorizzazione diff --git a/config/locales/crowdin/js-it.yml b/config/locales/crowdin/js-it.yml index 803d3ddf105..33898afb707 100644 --- a/config/locales/crowdin/js-it.yml +++ b/config/locales/crowdin/js-it.yml @@ -1149,5 +1149,5 @@ it: network_on: La rete è tornata. Stiamo provando. projects: identifier_suggestion: - loading: Loading suggestion... - set_name_first: Please set the name first. + loading: Caricamento suggerimento... + set_name_first: Inserisci prima il nome. diff --git a/config/locales/crowdin/js-ko.yml b/config/locales/crowdin/js-ko.yml index 3b1f7db9ed7..61a1a16bb82 100644 --- a/config/locales/crowdin/js-ko.yml +++ b/config/locales/crowdin/js-ko.yml @@ -1145,5 +1145,5 @@ ko: network_on: 네트워크가 복원되었습니다. 작업 중입니다. projects: identifier_suggestion: - loading: Loading suggestion... - set_name_first: Please set the name first. + loading: 제안 로드 중... + set_name_first: 먼저 이름을 설정하세요. diff --git a/config/locales/crowdin/js-pt-BR.yml b/config/locales/crowdin/js-pt-BR.yml index f1e8a0ae67e..3adbc3bbed4 100644 --- a/config/locales/crowdin/js-pt-BR.yml +++ b/config/locales/crowdin/js-pt-BR.yml @@ -1149,5 +1149,5 @@ pt-BR: network_on: A rede voltou. Estamos tentando. projects: identifier_suggestion: - loading: Loading suggestion... - set_name_first: Please set the name first. + loading: Carregando sugestão... + set_name_first: Defina o nome primeiro. diff --git a/config/locales/crowdin/js-uk.yml b/config/locales/crowdin/js-uk.yml index dc94e87353a..1fdce90438c 100644 --- a/config/locales/crowdin/js-uk.yml +++ b/config/locales/crowdin/js-uk.yml @@ -1157,5 +1157,5 @@ uk: network_on: З’єднання відновлено. Ми намагаємося. projects: identifier_suggestion: - loading: Loading suggestion... - set_name_first: Please set the name first. + loading: Завантаження пропозиції… + set_name_first: Спочатку укажіть ім’я. diff --git a/config/locales/crowdin/js-zh-CN.yml b/config/locales/crowdin/js-zh-CN.yml index 887e1165909..8bac9cc6358 100644 --- a/config/locales/crowdin/js-zh-CN.yml +++ b/config/locales/crowdin/js-zh-CN.yml @@ -1145,5 +1145,5 @@ zh-CN: network_on: 网络已恢复。我们正在努力。 projects: identifier_suggestion: - loading: Loading suggestion... - set_name_first: Please set the name first. + loading: 正在加载建议... + set_name_first: 请先设置名称。 diff --git a/config/locales/crowdin/ko.yml b/config/locales/crowdin/ko.yml index 6b553e161d0..83fe6b2e830 100644 --- a/config/locales/crowdin/ko.yml +++ b/config/locales/crowdin/ko.yml @@ -404,47 +404,47 @@ ko: dialog: title: 작업 패키지 식별자 변경 heading: 프로젝트 기반 작업 패키지 ID를 활성화하시겠습니까? - description: 'This will change IDs for all work packages in all projects in this instance. Previous identifiers and URLs will continue to redirect properly. This change will take some time to complete. + description: '이렇게 하면 해당 인스턴스의 모든 프로젝트에 있는 모든 작업 패키지의 ID가 변경됩니다. 이전 식별자 및 URL은 계속해서 제대로 리디렉션됩니다. 이 변경 사항은 완료되는 데 다소 시간이 걸립니다. ' - confirm_button: Change identifiers - checkbox_label: I understand that this will permanently change all work package IDs - success_banner: Successfully updated work package identifier format. + confirm_button: 식별자 변경 + checkbox_label: 이렇게 하면 모든 작업 패키지 ID가 영구적으로 변경됨을 이해합니다 + success_banner: 작업 패키지 식별자 형식을 업데이트했습니다. in_progress: - banner_message: Project identifiers are currently being updated to project-based semantic identifiers. This may take some time. + banner_message: 프로젝트 기반 시맨틱 식별자로 프로젝트 식별자를 현재 업데이트하는 중입니다. 시간이 다소 걸릴 수 있습니다. workflows: tabs: default_transitions: 기본 전환 user_author: 사용자가 작성자입니다 user_assignee: 사용자가 담당자입니다 index: - description: Configure status transitions for each work package type. + description: 각 작업 패키지 유형에 대한 상태 전환을 구성합니다. type_filter: - label: Filter by type name… - status_button: Status + label: 유형 이름으로 필터링… + status_button: 상태 statuses_dialog: - title: Statuses - label: Statuses enabled for this type - caption: Add or remove statuses you would like to associate with this type. Removing a status will also delete the workflow associated with it. + title: 상태 + label: 이 유형에 대해 활성화된 상태 + caption: 이 유형과 연결하려는 상태를 추가하거나 제거하세요. 상태를 제거하면 연결된 워크플로도 삭제됩니다. statuses_removal_dialog: - title: Remove statuses + title: 상태 제거 heading: - other: Remove %{count} statuses? - description: Removing these statuses will make them unavailable to this type and delete existing workflows. Are you sure you want to proceed? - confirm: Remove + other: "%{count}개 상태를 제거하시겠습니까?" + description: 이러한 상태를 제거하면 이 유형에서 사용할 수 없게 되고 기존 워크플로가 삭제됩니다. 계속 진행하시겠습니까? + confirm: 제거 leave_confirmation: - title: Save changes before continuing? - description: You are about to leave this page but you have unsaved changes. Would you like to save them before continuing? - ignore: Ignore changes - save: Save changes and continue + title: 변경 사항을 저장한 후에 계속하시겠습니까? + description: 이 페이지를 나가려고 하는데, 저장되지 않은 변경 사항이 있습니다. 저장한 후에 계속하시겠습니까? + ignore: 변경 사항 무시 + save: 변경 사항을 저장하고 계속하기 role_selector: - label: 'Role: %{role}' - no_role: Select role + label: '역할: %{role}' + no_role: 역할 선택 blankslate: - title: No status transitions configured - description: Add statuses to start configuring workflows for this role + title: 구성된 상태 전환 없음 + description: 상태를 추가하여 이 역할에 대한 워크플로 구성을 시작합니다 info: - database_deprecation_html: 'Starting with OpenProject 16.0, PostgreSQL 16 is required to use OpenProject. Your installation will remain functional with your current database, but anticipate incompatability in future releases.
We have prepared [upgrade guides for all installation methods](upgrade_guide). You can perform the upgrade ahead of the next release at any time by following the guides. + database_deprecation_html: 'OpenProject 16.0부터, OpenProject를 사용하려면 PostgreSQL 16이 필요합니다. 현재 데이터베이스에서는 해당 설치가 계속 작동되지만, 향후 릴리스에서는 호환되지 않을 수 있습니다.
[모든 설치 방법에 대한 업그레이드 가이드](upgrade_guide)를 준비했습니다. 가이드에 따라 언제든지 다음 릴리스에 앞서 업그레이드를 수행할 수 있습니다. ' authentication: @@ -677,13 +677,13 @@ ko: confirmation_live_message_checked: 진행 버튼이 이제 활성화되었습니다. confirmation_live_message_unchecked: 진행 버튼이 이제 비활성화되었습니다. 계속하려면 확인란을 선택해야 합니다. pagination: - label: Pagination - prev: Previous - prev_page: Previous Page - next: Next - next_page: Next Page - page: Page %{number} - page_with_more: Page %{number}... + label: 페이지 매김 + prev: 이전 + prev_page: 이전 페이지 + next: 다음 + next_page: 다음 페이지 + page: "%{number}페이지" + page_with_more: "%{number}페이지..." mcp_configurations: server_url_component: caption: OpenProject MCP 서버에 연결할 수 있는 URL입니다. MCP 클라이언트를 설정하는 데 필요합니다. @@ -691,13 +691,13 @@ ko: op_dry_validation: or: 또는 errors: - unexpected_key: is not allowed. + unexpected_key: "- 허용되지 않습니다." array?: "- 배열이어야 합니다." decimal?: "- 소수여야 합니다." defined: "- 정의해서는 안 됩니다." eql?: "- %{left}과(와) 같아야 합니다." filled?: "- 입력해야 합니다." - format?: is in invalid format. + format?: "- 형식이 잘못되었습니다." greater_or_equal_zero: "- 0보다 크거나 같아야 합니다." gteq?: "- %{num}보다 크거나 같아야 합니다." hash?: "- 해시여야 합니다." @@ -724,9 +724,9 @@ ko: parent: not_descendant: "- 계층 루트의 하위 항목이어야 합니다." str?: "- 문자열이어야 합니다." - time?: must be a time. + time?: "- 시간이어야 합니다." type?: "- %{type}이어야(여야) 합니다." - uri?: is not a valid URI. + uri?: "- 올바른 URI가 아닙니다." rules: copy_workflow_from: 워크플로 복사의 유형 enabled: 활성화됨 @@ -846,10 +846,10 @@ ko: ' change_identifier: 식별자 변경 - change_identifier_dialog_title: Change project identifier - change_identifier_format_hint_semantic: Only uppercase letters (A–Z), numbers or underscores. Max 10 characters. Must start with a letter. - change_identifier_format_hint_legacy: Only lowercase letters (a–z), numbers, dashes or underscores. - change_identifier_warning: 'This will permanently change identifiers and URLs of all work packages in this project. The previous identifier and URLs will nevertheless continue to redirect properly. + change_identifier_dialog_title: 프로젝트 식별자 변경 + change_identifier_format_hint_semantic: 대문자(A-Z), 숫자 또는 밑줄만 사용할 수 있습니다. 최대 10자이고, 문자로 시작해야 합니다. + change_identifier_format_hint_legacy: 소문자(a-z), 숫자, 대시 또는 밑줄만 사용할 수 있습니다. + change_identifier_warning: '이렇게 하면 이 프로젝트에 있는 모든 작업 패키지의 식별자 및 URL이 영구적으로 변경됩니다. 그렇지만 이전 식별자 및 URL은 계속해서 제대로 리디렉션됩니다. ' subitems: @@ -1081,9 +1081,9 @@ ko: groups: member_in_these_groups: '이 사용자는 현재 다음 그룹의 멤버입니다:' no_results_title_text: 이 사용자는 현재 어떤 그룹의 멤버도 아닙니다. - summary_with_more_html: Member of %{names} and %{count_link}. + summary_with_more_html: "%{names} 및 %{count_link}의 멤버입니다." more: "%{count}개 더 보기" - summary_html: Member of %{names}. + summary_html: "%{names}의 멤버입니다." memberships: no_results_title_text: 이 사용자는 프로젝트의 멤버가 아닙니다. open_profile: 프로필 열기 @@ -1141,60 +1141,60 @@ ko: group: 이제 이 그룹은 %{project}의 일부입니다. 한편 당신은 해당 사용자에 대한 계획을 세우거나 작업 패키지를 할당할 수 있습니다. working_hours: current_schedule: - title: Current schedule - work_days: Work days - work_hours: Work hours - availability_factor: Availability factor - availability_subtitle: Dedicated to project work - effective_hours: Effective work hours - effective_subtitle: Per week - not_set: Not set + title: 현재 스케줄 + work_days: 근무일 + work_hours: 근무 시간 + availability_factor: 가용성 요소 + availability_subtitle: 프로젝트 작업 전용 + effective_hours: 유효한 근무 시간 + effective_subtitle: 주별 + not_set: 설정되지 않음 future: - title: Future schedules - description: Plan working schedule changes ahead of time. Once the date arrives your working schedules will be updated automatically. - add_button: Add future schedule - blank_title: No future schedules planned - blank_description: Create a future schedule to plan changes ahead of time + title: 향후 스케줄 + description: 근무 스케줄 변경 사항을 미리 계획하세요. 해당 날짜가 되면 근무 스케줄이 자동으로 업데이트됩니다. + add_button: 향후 스케줄 추가 + blank_title: 계획된 향후 스케줄 없음 + blank_description: 향후 스케줄을 만들어 변경 사항을 미리 계획합니다 history: - title: Schedule history - description: View your past work schedules. - blank_title: No schedule history yet - blank_description: Past schedule changes will appear here + title: 스케줄 기록 + description: 이전 근무 스케줄을 봅니다. + blank_title: 아직 스케줄 기록 없음 + blank_description: 이전 스케줄 변경 사항이 여기에 표시됩니다 destroy: - confirm: Are you sure you want to delete this working schedule? + confirm: 이 근무 스케줄을 삭제하시겠습니까? form: - title: Plan a future work schedule - title_current: Edit current work schedule - start_date: Start date - start_date_caption: Select the date from when the new work schedule will be effective. - work_days: Work days - working_hours_label: Working hours - hours_mode_label: Hours mode - same_hours_mode: Same hours per day - individual_hours_mode: Individual hours per day - work_hours: Work hours - hours_per_day: Hours per day - per_day: per day - per_week: per week - total_work_hours: Total work hours - availability_description: The availability factor represents the actual percentage of your working time dedicated to project tasks. This accounts for meetings, emails, administrative work, and other non-project activities. - availability_factor: Availability factor - availability_factor_caption: Define the percentage of your working time dedicated to project work. - total_available_hours: Total available work hours - title_availability_factor: Availability factor - title_days_and_hours: Days and hours - title_future_dates: Future dates + title: 향후 근무 스케줄 계획 + title_current: 현재 근무 스케줄 편집 + start_date: 시작 날짜 + start_date_caption: 새로운 근무 스케줄이 적용되는 날짜를 선택하세요. + work_days: 근무일 + working_hours_label: 근무 시간 + hours_mode_label: 시간 모드 + same_hours_mode: 일별 동일한 시간 + individual_hours_mode: 일별 개별 시간 + work_hours: 근무 시간 + hours_per_day: 일별 시간 + per_day: 일별 + per_week: 주별 + total_work_hours: 총 근무 시간 + availability_description: 가용성 요소는 프로젝트 작업에 투입된 실제 근무 시간 비율을 나타냅니다. 여기에는 미팅, 이메일, 관리 작업 및 프로젝트 이외의 기타 활동이 포함됩니다. + availability_factor: 가용성 요소 + availability_factor_caption: 프로젝트 작업에 투입된 근무 시간 비율을 정의하세요. + total_available_hours: 총 사용 가능한 근무 시간 + title_availability_factor: 가용성 요소 + title_days_and_hours: 일 및 시간 + title_future_dates: 향후 날짜 table: - mobile_title: Working schedules - start_date: Start date - work_days: Work days - work_hours: Work hours - availability_factor: Availability factor - effective_work_hours: Effective work hours + mobile_title: 근무 스케줄 + start_date: 시작 날짜 + work_days: 근무일 + work_hours: 근무 시간 + availability_factor: 가용성 요소 + effective_work_hours: 유효한 근무 시간 work_days_count: - other: "%{count} working days" + other: 근무일 %{count}일 user_preferences: - disable_keyboard_shortcuts_caption: 'You can choose to disable default [keyboard shortcuts](docs_url) if you use a screen reader or want to avoid accidentally triggering an action with a shortcut. + disable_keyboard_shortcuts_caption: '화면 리더를 사용하는 경우 또는 바로 가기로 실수로 액션을 트리거하지 않게 방지하려는 경우 기본 [키보드 바로 가기](docs_url)를 비활성화하도록 선택할 수 있습니다. ' page: @@ -1205,12 +1205,12 @@ ko: ' delete_tooltip: 플레이스홀더 사용자 삭제 deletion_info: - heading_html: Delete placeholder user %{name} + heading_html: 플레이스홀더 사용자 %{name} 삭제 data_consequences: '플레이스홀더 사용자의 모든 항목(예: 담당자, 책임자, 기타 사용자 값 등)은 "삭제된 사용자"라는 계정에 다시 할당됩니다. 삭제된 모든 계정의 데이터는 이 계정에 다시 할당되기 때문에 사용자가 생성한 데이터와 다른 삭제된 계정의 데이터를 구별할 수 없습니다. ' irreversible: 이 작업은 취소할 수 없습니다 - confirmation_html: Enter the placeholder user name %{name} to confirm the deletion. + confirmation_html: 삭제를 확인하려면 플레이스홀더 사용자 이름 %{name}(을)를 입력하세요. priorities: edit: priority_color_text: | @@ -1241,9 +1241,9 @@ ko: 계층의 총 작업, 남은 작업 및 완료 %에서 이 상태의 작업 패키지를 제외하려면 이 옵션을 선택하세요. status_percent_complete_text_html: |- - In [status-based progress calculation mode](setting_url), the % Complete of a work - package is automatically set to this value when this status is selected. - Ignored in work-based mode. + [상태 기반 진행률 계산 모드](setting_url)에서, 이 상태를 선택하면 작업 + 패키지의 완료 %가 자동으로 이 값으로 설정됩니다. + 작업 기반 모드에서는 무시됩니다. status_readonly_html: | 이 상태를 읽기 전용으로 작업 패키지에 표시하려면 이 옵션을 선택합니다. 상태를 제외하고 특성은 변경할 수 없습니다. @@ -1511,7 +1511,7 @@ ko: ' login_with_auth_provider: 또는 이미 있는 계정으로 로그인 signup_with_auth_provider: 또는 사용 가입하기 - auth_source_login_html: Please login as %{login} to activate your account. + auth_source_login_html: "%{login}(으)로 로그인하여 계정을 활성화하세요." omniauth_login: 계정을 활성화하려면 로그인하시기 바랍니다. actionview_instancetag_blank_option: 선택하십시오 activemodel: @@ -1521,8 +1521,8 @@ ko: activerecord: attributes: work_package_semantic_alias: - identifier: Identifier - work_package: Work package + identifier: 식별자 + work_package: 작업 패키지 jira_import: projects: 프로젝트 import/jira: @@ -1785,11 +1785,11 @@ ko: consented_at: '동의함:' group: identity_url: ID URL - parent: Parent group - organizational_unit: Organizational unit + parent: 부모 그룹 + organizational_unit: 조직 단위 group_detail: - parent: Parent group - organizational_unit: Organizational unit + parent: 부모 그룹 + organizational_unit: 조직 단위 user_preference: header_look_and_feel: 모양 및 느낌 header_alerts: 알림 @@ -1819,27 +1819,27 @@ ko: principal_type: 초대 유형 id_or_email: 이름 또는 이메일 주소 user_non_working_time: - start_date: Start date - end_date: End date + start_date: 시작 날짜 + end_date: 종료 날짜 user_working_hours: - valid_from: Valid from - monday: Monday - monday_hours: Monday hours - tuesday: Tuesday - tuesday_hours: Tuesday hours - wednesday: Wednesday - wednesday_hours: Wednesday hours - thursday: Thursday - thursday_hours: Thursday hours - friday: Friday - friday_hours: Friday hours - saturday: Saturday - saturday_hours: Saturday hours - sunday: Sunday - sunday_hours: Sunday hours - availability_factor: Availability factor - shared_hours: Work hours - days: Working days + valid_from: 다음부터 유효함 + monday: 월요일 + monday_hours: 월요일 시간 + tuesday: 화요일 + tuesday_hours: 화요일 시간 + wednesday: 수요일 + wednesday_hours: 수요일 시간 + thursday: 목요일 + thursday_hours: 목요일 시간 + friday: 금요일 + friday_hours: 금요일 시간 + saturday: 토요일 + saturday_hours: 토요일 시간 + sunday: 일요일 + sunday_hours: 일요일 시간 + availability_factor: 가용성 요소 + shared_hours: 근무 시간 + days: 근무일 version: effective_date: 완료 날짜 sharing: 공유 @@ -1894,8 +1894,8 @@ ko: before: 은(는) %{date} 보다 전이어야 합니다. before_or_equal_to: 은(는) %{date} 이전이어야 합니다. blank: 내용을 입력해주세요 - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. + not_before_start_date: "- 시작 날짜 전이 아니어야 합니다." + overlapping_range: "- 기존 휴무일 범위와 겹칩니다." blank_nested: "- '%{property}' 속성이 설정되어 있어야 합니다." cannot_delete_mapping: "- 필수입니다. 삭제할 수 없습니다." is_for_all_cannot_modify: "- 모든 프로젝트용므로 수정할 수 없습니다." @@ -1932,9 +1932,9 @@ ko: less_than_or_equal_to: 은(는) %{count} 보다 작거나 같아야 합니다 not_available: "- 시스템 구성으로 인해 사용 가능하지 않습니다." not_deletable: "- 삭제할 수 없습니다." - not_editable: cannot be edited because it is already in effect. + not_editable: "- 이미 적용 중이므로 편집할 수 없습니다." not_current_user: 은(는) 현재 유효한 사용자가 아닙니다. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. + system_wide_non_working_day_exists: "- 이 날짜의 기존 시스템 전체 휴무일과 충돌합니다." not_found: "- 찾을 수 없습니다." not_a_date: 은(는) 유효한 날짜가 아닙니다. not_a_datetime: 은(는) 유효한 날짜가 아닙니다. @@ -1969,7 +1969,7 @@ ko: group: attributes: parent_id: - circular_dependency: would create a circular group hierarchy. + circular_dependency: "- 순환 그룹 계층을 생성합니다." ldap_auth_source: attributes: tls_certificate_string: @@ -2080,8 +2080,8 @@ ko: types: in_use_by_work_packages: '아직 작업 패키지에 사용됨: %{types}' identifier: - must_start_with_letter: must start with a letter - no_special_characters: may only contain uppercase letters, numbers, and underscores + must_start_with_letter: "- 문자로 시작해야 합니다" + no_special_characters: "- 대문자, 숫자 및 밑줄만 포함될 수 있습니다" enabled_modules: dependency_missing: "'%{module}' 모듈이 '%{dependency}' 모듈에 의존하므로 해당 모듈도 활성화되어 있어야 합니다." format: "%{message}" @@ -2288,7 +2288,7 @@ ko: user_working_hours: attributes: days: - no_working_day: At least one day needs to be configured as a working day. + no_working_day: 하루 이상을 근무일로 구성해야 합니다. member: principal_blank: 하나 이상의 사용자 또는 그룹을 선택 하십시오. role_blank: 할당해야 합니다. @@ -2537,7 +2537,7 @@ ko: info: '백업을 생성하려면 백업 토큰을 생성해야 합니다. 백업을 요청할 때마다 토큰을 입력해야 합니다. 백업 토큰을 삭제하면 해당 사용자의 백업을 비활성화할 수 있습니다. ' - verification_html: 'Enter %{word} to confirm you want to %{action} the backup token. + verification_html: '백업 토큰을 %{action}하려면 %{word}(을)를 입력하여 확인하세요. ' verification_word_reset: 초기화 @@ -2977,7 +2977,7 @@ ko: teaser: title: other: "%{trial_plan} 평가판 토큰 %{count}일 남음" - description_html: You have access to all %{trial_plan} features. + description_html: 모든 %{trial_plan} 기능에 액세스할 수 있습니다. trial: not_found: 평가판 토큰을 요청했지만 해당 요청은 더 이상 사용할 수 없습니다. 다시 시도해 주세요. wait_for_confirmation: 평가판 토큰을 받을 수 있도록 주소를 확인하기 위한 이메일을 보내드렸습니다. @@ -2997,8 +2997,8 @@ ko: ' domain_caption: 토큰은 현재 구성된 호스트 이름에 유효하게 됩니다. - receive_newsletter: I want to receive the OpenProject [newsletter](newsletter_url). - consent: I agree with the [terms of service](tos_url) and the [privacy policy](privacy_url). + receive_newsletter: OpenProject [뉴스레터](newsletter_url)를 받고 싶습니다. + consent: 본인은 [서비스 약관](tos_url) 및 [개인정보 취급방침](privacy_url)에 동의합니다. email_calendar_updates: state: disabled: 비활성화되었습니다. @@ -3087,8 +3087,8 @@ ko: work_package_edit: 작업 패키지 편집됨 work_package_note: 작업 패키지 메모 추가됨 title: - project_html: 'Project: %{name}' - subproject_html: 'Subproject: %{name}' + project_html: '프로젝트: %{name}' + subproject_html: '하위 프로젝트: %{name}' export: dialog: title: 내보내기 @@ -3260,17 +3260,17 @@ ko: learn_about: 새로운 모든 기능에 대해 자세히 알아보기 missing: 아직 강조 표시된 기능이 없습니다. '17_3': - new_features_title: 'The release contains various new features and improvements, such as: + new_features_title: '이 릴리스에는 다음과 같은 다양한 새로운 기능과 개선 사항이 포함되어 있습니다. ' new_features_list: - line_0: 'Big Agile update: dedicated sprint objects, all work packages visible on Backlogs, and automatic sprint board creation.' - line_1: In-place editing of project attributes on the Project Overview page. - line_2: Sharing of meeting templates (Basic plan and higher). - line_3: Better search in Time and Costs, Boards, and more. - line_4: Option to safely change project identifiers. - line_5: Improved workflow configuration for administrators. - line_6: Action boards released to Community. + line_0: '대규모 애자일 업데이트: 전용 스프린트 개체, 백로그에 표시되는 모든 작업 패키지, 자동 스프린트 보드 생성.' + line_1: 프로젝트 개요 페이지에서 프로젝트 특성을 바로 편집 가능. + line_2: 미팅 템플릿 공유(Basic 플랜 이상). + line_3: 시간 및 비용, 보드 등에서 개선된 검색 기능. + line_4: 프로젝트 식별자를 안전하게 변경하는 옵션. + line_5: 개선된 관리자용 워크플로 구성. + line_6: 커뮤니티에 릴리스된 액션 보드. links: upgrade_enterprise_edition: Enterprise Edition으로 업그레이드 postgres_migration: 설치를 PostgreSQL로 마이그레이션 @@ -3335,15 +3335,15 @@ ko: progress_calculation_adjusted: 진행률 계산은 자동으로 버전 업데이트에 따라 조정됩니다. scheduling_mode_adjusted: 버전 업데이트에 따라 자동으로 조정되는 스케줄링 모드입니다. totals_removed_from_childless_work_packages: 버전 업데이트를 통해 부모가 아닌 작업 패키지의 작업 및 진행률 합계가 자동으로 제거됩니다. 유지 관리 작업이므로 무시해도 됩니다. - sprint_migration: Version '%{version_name}' has been copied as a sprint. + sprint_migration: 버전 '%{version_name}'이(가) 스프린트로 복사되었습니다. total_percent_complete_mode_changed_to_work_weighted_average: 작업이 없는 자식 작업 패키지는 무시됩니다. total_percent_complete_mode_changed_to_simple_average: 자식 작업 패키지의 작업 값은 무시됩니다. links: configuration_guide: 구성 가이드 get_in_touch: 질문이 있으신가요? 문의해 주세요. - instructions_after_registration_link: You can sign in as soon as your account has been activated by clicking [here](signin_url). - instructions_after_logout_link: You can sign in again by clicking [here](signin_url). - instructions_after_error_link: You can try to sign in again by clicking [here](signin_url). If the error persists, ask your admin for help. + instructions_after_registration_link: "[여기](signin_url)를 클릭하여 계정을 활성화하면 바로 로그인할 수 있습니다." + instructions_after_logout_link: "[여기](signin_url)를 클릭하면 다시 로그인할 수 있습니다." + instructions_after_error_link: "[여기](signin_url)를 클릭하여 다시 로그인해 볼 수 있습니다. 오류가 계속되면 관리자에게 도움을 요청하세요." menus: admin: ai: 인공 지능(AI) @@ -3356,10 +3356,10 @@ ko: label: 추가… my_account: notifications_and_email: - title: Notification and email + title: 알림 및 이메일 tabs: - notifications: Notification settings - email_reminders: Email reminders + notifications: 알림 설정 + email_reminders: 이메일 미리 알림 access_tokens: description: 공급자 토큰은 OpenProject에서 발급하며, 다른 애플리케이션이 액세스하도록 허용합니다. 클라이언트 토큰은 다른 애플리케이션에서 발급하며, OpenProject가 액세스하도록 허용합니다. no_results: @@ -3424,70 +3424,70 @@ ko: unknown_storage: 알 수 없는 저장소 email_reminders: immediate_reminders: - title: Send me an email reminder - mentioned: Notify me when I am mentioned - personal_reminder: Notify me for personal reminders + title: 이메일 미리 알림 보내기 + mentioned: 내가 멘션되면 알림 보내기 + personal_reminder: 개인 미리 알림 보내기 daily_reminders: - title: Send me daily email reminders for unread notifications - caption: You will receive these reminders only for unread notifications and only at hours you specify. Until you configure a time zone for your account, the times will be interpreted to be in UTC. - enabled: Enable daily email reminders - add_time: Add time - remove_time: Remove time - time_slot_label: Reminder time (UTC) + title: 읽지 않은 알림에 대한 일일 이메일 미리 알림 보내기 + caption: 읽지 않은 알림에 대해서만 그리고 사용자가 지정한 시간에만 이러한 미리 알림이 전송됩니다. 계정의 표준 시간대를 구성할 때까지, 시간은 UTC로 적용됩니다. + enabled: 일일 이메일 미리 알림 활성화 + add_time: 시간 추가 + remove_time: 시간 제거 + time_slot_label: 미리 알림 시간(UTC) workdays: - title: Receive email reminders on these days - submit_button: Update reminder days + title: 해당 요일에 이메일 미리 알림 받기 + submit_button: 미리 알림 요일 업데이트 pause_reminders: - title: Pause email notifications - enabled: Temporarily pause daily email reminders - date_range: Pause period + title: 이메일 알림 일시 중지 + enabled: 임시로 일일 이메일 미리 알림 일시 중지 + date_range: 일시 중지 기간 email_alerts: - title: Email alerts for other items that are not work packages - news_added: News added - news_commented: Comment on a news item - document_added: Document added - forum_messages: Forum message posted - wiki_page_added: Wiki page added - wiki_page_updated: Wiki page updated - membership_added: Membership added - membership_updated: Membership updated - submit_button: Update alerts + title: 작업 패키지가 아닌 기타 항목에 대한 이메일 알림 + news_added: 뉴스 추가됨 + news_commented: 뉴스 항목의 코멘트 + document_added: 문서 추가됨 + forum_messages: 포럼 메시지 게시됨 + wiki_page_added: 위키 페이지 추가됨 + wiki_page_updated: 위키 페이지 업데이트됨 + membership_added: 멤버십 추가됨 + membership_updated: 멤버십 업데이트됨 + submit_button: 알림 업데이트 notifications: participating: - title: Participating - submit_button: Update preferences - mentioned: Mentioned - watched: Watching - assignee: Assignee - responsible: Accountable - shared: Shared with me + title: 참여 + submit_button: 기본 설정 업데이트 + mentioned: 멘션됨 + watched: 지켜보는 중 + assignee: 담당자 + responsible: 담당 + shared: 나와 공유됨 date_alerts: - title: Date alerts - submit_button: Update date alerts - start_date: Start date - due_date: Finish date - overdue: Overdue + title: 날짜 알림 + submit_button: 날짜 알림 업데이트 + start_date: 시작 날짜 + due_date: 완료 날짜 + overdue: 기한 지남 times: - same_day: On the same day - one_day_before: 1 day before - three_days_before: 3 days before - seven_days_before: 7 days before - one_day_after: 1 day after - three_days_after: 3 days after - seven_days_after: 7 days after + same_day: 같은 날 + one_day_before: 1일 전 + three_days_before: 3일 전 + seven_days_before: 7일 전 + one_day_after: 1일 후 + three_days_after: 3일 후 + seven_days_after: 7일 후 non_participating: - title: Non-participating - submit_button: Update preferences - work_package_created: New work packages - work_package_commented: All new comments - work_package_processed: All status changes - work_package_prioritized: All priority changes - work_package_scheduled: All date changes + title: 참여하지 않음 + submit_button: 기본 설정 업데이트 + work_package_created: 새 작업 패키지 + work_package_commented: 모든 새로운 코멘트 + work_package_processed: 모든 상태 변경 사항 + work_package_prioritized: 모든 우선 순위 변경 사항 + work_package_scheduled: 모든 날짜 변경 사항 project_specific_settings: - title: Project-specific notification settings - add_button: Add project-specific notifications - dialog_title: Add project-specific notifications - list_header: Projects with specific notifications + title: 프로젝트별 알림 설정 + add_button: 프로젝트별 알림 추가 + dialog_title: 프로젝트별 알림 추가 + list_header: 특정 알림이 있는 프로젝트 notifications: reasons: assigned: 담당자 @@ -3560,7 +3560,7 @@ ko: label_ical_access_key_generation_hint: 캘린더 구독 시 자동으로 생성됩니다. label_ical_access_key_latest: 최신 label_ical_access_key_revoke: 취소 - label_integrations: Integrations + label_integrations: 통합 label_add_column: 열 추가 label_applied_status: 적용된 상태 label_archive_project: 프로젝트 아카이브하기 @@ -3608,8 +3608,8 @@ ko: label_calendar_show: 달력 표시 label_category: 카테고리 label_completed: 완료 - label_committed_at_html: "%{committed_revision_link} at %{date}" - label_committed_link: committed revision %{revision_identifier} + label_committed_at_html: "%{committed_revision_link}, %{date}" + label_committed_link: "%{revision_identifier} 리비전이 커밋됨" label_consent_settings: 사용자 동의 label_wiki_menu_item: 위키 메뉴 항목 label_select_main_menu_item: 새 기본 메뉴 항목 선택 @@ -3776,7 +3776,7 @@ ko: label_subject_or_id: 제목 또는 ID label_calendar_subscriptions: 캘린더 구독 label_identifier: 식별자 - label_project_identifier: Project identifier + label_project_identifier: 프로젝트 식별자 label_in: "-" label_in_less_than: 보다 작음 label_in_more_than: 보다 큼 @@ -3910,13 +3910,13 @@ ko: label_news_view_all: 모든 뉴스 보기 label_next: 다음 label_next_week: 다음 주 - label_next_year: Next year + label_next_year: 다음 연도 label_no_change_option: "(변경 없음)" label_no_data: 표시할 데이터가 없습니다. label_no_due_date: 완료 날짜 없음 label_no_start_date: 시작 날짜 없음 label_no_parent_page: 부모 페이지 없음 - label_no_parent_group: "(No parent group)" + label_no_parent_group: "(부모 그룹 없음)" label_notification_center_plural: 알림 label_nothing_display: 표시할 것이 없음 label_nobody: 아무도 없음 @@ -3945,7 +3945,7 @@ ko: label_overall_activity: 전체 작업 label_overview: 요약 label_page_title: 페이지 제목 - label_parent_group_caption: 'Setting a parent group will make this group a subgroup of the selected parent group. This will also inherit all memberships, including permissions of the parent group. + label_parent_group_caption: '부모 그룹을 설정하면 선택한 부모 그룹의 하위 그룹으로 이 그룹이 지정됩니다. 또한 부모 그룹의 권한을 포함한 모든 멤버십이 상속됩니다. ' label_part_of: 부분의 @@ -3974,7 +3974,7 @@ ko: label_preview_not_available: 미리 보기를 사용할 수 없음 label_previous: 이전 label_previous_week: 이전 주 - label_previous_year: Previous year + label_previous_year: 이전 연도 label_principal_invite_via_email: " 또는 이메일을 통해 새 사용자 초대하기" label_principal_search: 기존 사용자 또는 그룹 추가 label_privacy_policy: 데이터 프라이버시 및 보안 정책 @@ -4086,7 +4086,7 @@ ko: label_start_to_start: 시작 - 시작 label_statistics: 통계 label_status: 상태 - label_status_plural: Statuses + label_status_plural: 상태 label_storage_free_space: 남은 디스크 공간 label_storage_used_space: 사용 중 디스크 공간 label_storage_group: 저장 파일 시스템 %{identifier} @@ -4136,7 +4136,7 @@ ko: label_user: 사용자 label_user_and_permission: 사용자 및 권한 label_user_named: 사용자 %{name} - label_user_activity_html: "%{value}'s activity" + label_user_activity_html: "%{value}의 활동" label_user_anonymous: 익명 label_user_menu: 사용자 메뉴 label_user_new: 새 사용자 @@ -4224,11 +4224,11 @@ ko: other: 파일 %{count}개 zero: 파일 없음 label_x_days: - other: "%{count} days" + other: "%{count}일" label_x_working_days: - other: "%{count} working days" + other: 근무일 %{count}일 label_x_working_days_time_off: - other: 'Time off: %{count} working days' + other: '휴가: 근무일 %{count}일' label_yesterday: 어제 label_zen_mode: 젠 모드 label_role_type: 유형 @@ -4237,22 +4237,22 @@ ko: label_not_changeable: "(변경할 수 없음)" label_global: 글로벌 label_seeded_from_env_warning: 이 레코드는 설정 환경 변수를 통해 생성되었습니다. UI에서 편집할 수 없습니다. - label_schedule_and_availability: Schedule and availability - label_working_hours: Work schedule - label_non_working_days: Availability calendar - label_non_working_days_with_count: Non-working days (%{count}) - label_non_working_days_summary: Summary - button_add_non_working_time: Time off - button_edit_non_working_time: Edit time off - label_continued_from_previous_year: continued from previous year - label_continues_into_next_year: continues into next year - label_end_date: Finish date - label_working_days: Working days - label_non_working_times_with_count: "%{year} time off (%{count})" - label_non_working_times_summary: "%{year} summary" - label_total_user_non_working_times: Personal non-working days - label_total_global_non_working_days: Global non-working days - label_total_days_off: Total days off + label_schedule_and_availability: 스케줄 및 가능 여부 + label_working_hours: 근무 스케줄 + label_non_working_days: 가능 여부 캘린더 + label_non_working_days_with_count: 휴무일(%{count}) + label_non_working_days_summary: 요약 + button_add_non_working_time: 휴가 + button_edit_non_working_time: 휴가 편집 + label_continued_from_previous_year: 이전 연도에서 계속 + label_continues_into_next_year: 다음 연도에 계속 + label_end_date: 완료 날짜 + label_working_days: 근무일 + label_non_working_times_with_count: "%{year}년 휴가(%{count})" + label_non_working_times_summary: "%{year}년 요약" + label_total_user_non_working_times: 개인 휴무일 + label_total_global_non_working_days: 글로벌 휴무일 + label_total_days_off: 총 휴가 macro_execution_error: 매크로 %{macro_name} 실행 중에 오류 발생 macro_unavailable: 매크로 %{macro_name}은(는) 표시할 수 없습니다. macros: @@ -4287,7 +4287,7 @@ ko: center: 알림 센터로 see_in_center: 알림 센터의 코멘트 보기 settings: 이메일 설정 변경 - salutation: Hello %{user}, + salutation: 안녕하세요, %{user} 님, salutation_full_name: 전체 이름 work_packages: created_at: "%{timestamp}, %{user} 님이 생성함 " @@ -4316,7 +4316,7 @@ ko: note: '참고: "%{note}"' sharing: work_packages: - allowed_actions_html: You may %{allowed_actions} this work package. This can change depending on your project role and permissions. + allowed_actions_html: 이 작업 패키지를 %{allowed_actions}할 수 있습니다. 이는 프로젝트 역할 및 권한에 따라 변경될 수 있습니다. create_account: 이 작업 패키지에 액세스하려면 %{instance}에서 계정을 생성하고 활성화해야 합니다. open_work_package: 작업 패키지 열기 subject: '작업 패키지 #%{id}이(가) 귀하와 공유되었습니다' @@ -4416,8 +4416,8 @@ ko: mail_user_activation_limit_reached: subject: 사용자 활성화 제한에 도달함 message_html: | - A new user (%{email}) tried to create an account on an OpenProject environment that you manage (%{host}). - The user cannot activate their account since the user limit has been reached. + 회원님이 관리하는 OpenProject 환경(%{host})에서 새로운 사용자(%{email})가 계정을 만들려고 시도했습니다. + 사용자 제한에 도달한 후에는 해당 사용자가 계정을 활성화할 수 없습니다. steps: label: '사용자가 로그인하게 허용하려면 다음 중 하나를 수행할 수 있습니다. ' a: 결제 플랜([here](upgrade_url)) 업그레이드 @@ -4483,7 +4483,7 @@ ko: notice_parent_item_not_found: 부모 항목을 찾을 수 없습니다. notice_project_not_deleted: 프로젝트가 삭제되지 않았습니다. notice_project_not_found: 프로젝트를 찾을 수 없습니다. - notice_smtp_address_unsafe_env_hint: SMTP address %{address} is not safe. Please add it to the whitelist using the %{env_name} environment variable. + notice_smtp_address_unsafe_env_hint: SMTP 주소 %{address}은(는) 안전하지 않습니다. %{env_name} 환경 변수를 사용하여 허용 목록에 추가하세요. notice_successful_connection: 연결에 성공했습니다. notice_successful_create: 생성에 성공했습니다. notice_successful_delete: 삭제에 성공했습니다. @@ -4610,12 +4610,12 @@ ko: permission_manage_versions: 버전 관리 permission_manage_wiki: 위키 관리 permission_manage_wiki_menu: 위키 메뉴 관리 - permission_manage_own_working_times: Manage own working times - permission_manage_own_working_times_explanation: 'Allows users to manage their own working times, and personal non-working days. + permission_manage_own_working_times: 내 근무 시간 관리 + permission_manage_own_working_times_explanation: '사용자가 자신의 근무 시간과 개인 휴무일을 관리할 수 있습니다. ' - permission_manage_working_times: Manage working times for all users - permission_manage_working_times_explanation: 'Allows users to manage working times for all users, including personal non-working days. + permission_manage_working_times: 모든 사용자의 근무 시간 관리 + permission_manage_working_times_explanation: '사용자가 개인 휴무일을 포함하여 모든 사용자의 근무 시간을 관리할 수 있습니다. ' permission_move_work_packages: 작업 패키지 이동 @@ -4760,10 +4760,10 @@ ko: info: 리포지토리 삭제는 취소할 수 없는 작업입니다. info_not_managed: '참고: 이렇게 해도 이 리포지토리의 콘텐츠는 삭제되지 않습니다. OpenProject에 의해 관리되지 않기 때문입니다.' managed_path_note: 다음 디렉터리가 지워집니다. %{path} - repository_verification_html: Enter the project's identifier %{identifier} to verify the deletion of its repository. + repository_verification_html: 해당 리포지토리의 삭제를 확인하려면 프로젝트의 식별자 %{identifier}을(를) 입력하세요. subtitle: 프로젝트 %{project_name}의 %{repository_type}을(를) 삭제하시겠습니까? - subtitle_not_managed_html: Do you really want to remove the linked %{repository_type} %{url} from the project %{project_name}? - title_html: Delete the %{repository_type} + subtitle_not_managed_html: 프로젝트 %{project_name}에서 링크된 %{repository_type} %{url}을(를) 제거하시겠습니까? + title_html: "%{repository_type} 삭제" title_not_managed: 연결된 %{repository_type}을(를) 제거하시겠습니까? errors: build_failed: 선택한 구성으로 리포지토리를 만들 수 없습니다. %{reason} @@ -4814,7 +4814,7 @@ ko: update_timeout: |- N분 동안 리포지토리의 마지막 필요한 디스크 공간 정보를 유지하세요. 리포지토리의 필요한 디스크 저장소 공간 계산에는 비용이 많이 소요될 수 있으므로, 이 값을 늘려 성능 영향을 줄이세요. - oauth_application_details_html: 'The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:' + oauth_application_details_html: '이 창을 닫으면 클라이언트 비밀번호 값에 다시 액세스할 수 없습니다. 다음 값을 Nextcloud OpenProject 통합 설정에 복사하세요:' oauth_application_details_link_text: 설정 페이지로 이동 setup_documentation_details: '새 파일 저장소를 구성하는 데 도움이 필요하면 설명서를 확인하세요. ' setup_documentation_details_link_text: 파일 저장소 설정 @@ -4864,7 +4864,7 @@ ko: setting_apiv3_cors_title: CORS(크로스 원본 리소스 공유) setting_apiv3_cors_enabled: CORS 사용 setting_apiv3_cors_origins: API V3 CORS(크로스-원본 리소스 공유) 허용 원본 - setting_apiv3_cors_origins_instructions_html: 'If CORS is enabled, these are the origins that are allowed to access OpenProject API.
Please check the [Documentation on the Origin header](docs_url) on how to specify the expected values. + setting_apiv3_cors_origins_instructions_html: 'CORS가 활성화된 경우, OpenProject API에 액세스하도록 허용된 원본이 있습니다.
[원본 헤더의 문서](docs_url)에서 예상 값 지정 방법을 확인하세요. ' setting_apiv3_write_readonly_attributes: 읽기 전용 특성에 대한 쓰기 액세스 @@ -4874,7 +4874,7 @@ ko: setting_apiv3_write_readonly_attributes_warning: '이 설정에는 데이터 가져오기 등의 사용 사례가 있지만 관리자가 다른 사용자로 항목을 만든 것처럼 가장할 수 있습니다. 그러나 모든 생성 요청은 실제 작성자로 기록됩니다. ' - setting_apiv3_write_readonly_attributes_additional_html: 'For more information on attributes and supported resources, please see the [API documentation](api_documentation_link). + setting_apiv3_write_readonly_attributes_additional_html: '특성 및 지원되는 리소스에 대한 자세한 내용은 [API 문서](api_documentation_link)를 참조하세요. ' setting_apiv3_max_page_size: 최대 API 페이지 크기 @@ -4974,7 +4974,7 @@ ko: setting_work_package_properties: 작업 패키지 속성 setting_work_package_startdate_is_adddate: 새 작업 패키지에 대한 시작 날짜로 현재 날짜 사용 setting_work_packages_projects_export_limit: 작업 패키지/프로젝트 내보내기 제한 - setting_journal_aggregation_time_minutes: Aggregation period + setting_journal_aggregation_time_minutes: 집계 기간 setting_log_requesting_user: 모든 요청에 대한 로그 사용자 로그인, 이름 및 메일 주소 setting_login_required: 인증이 필요함 setting_login_required_caption: 이 옵션을 선택하면 애플리케이션에 대한 모든 요청이 인증되어야 합니다. @@ -5057,12 +5057,12 @@ ko: setting_welcome_text: 환영 블록 텍스트 setting_welcome_title: 환영 블록 제목 setting_welcome_on_homescreen: 홈 화면에 환영 블록 표시 - setting_work_packages_identifier_classic: Instance-wide numerical sequence (default) - setting_work_packages_identifier_classic_caption: 'Every work package gets a sequential number starting with 1 and incremented with every new one. The numbers are unique within this instance so they remain the same even if work packages are moved between projects. + setting_work_packages_identifier_classic: 인스턴스 전체의 숫자 시퀀스(기본값) + setting_work_packages_identifier_classic_caption: '모든 작업 패키지는 1로 시작하는 순차 번호가 있으며, 새로운 패키지마다 순차 번호가 증가합니다. 이 번호는 해당 인스턴스 내에서 고유하므로 작업 패키지가 프로젝트 간에 이동되더라도 동일하게 유지됩니다. ' - setting_work_packages_identifier_semantic: Project-based semantic identifiers - setting_work_packages_identifier_semantic_caption: 'Every project has a unique identifier that is prefixed to the work package ID. If a work package moved to another project, a new identifier is generated but the old one continues to function. + setting_work_packages_identifier_semantic: 프로젝트 기반 시맨틱 식별자 + setting_work_packages_identifier_semantic_caption: '모든 프로젝트에는 작업 패키지 ID 앞에 붙는 고유 식별자가 있습니다. 작업 패키지가 다른 프로젝트로 이동된 경우 새 식별자가 생성되지만 이전 식별자도 계속 작동됩니다. ' setting_work_package_list_default_highlighting_mode: 기본 강조 표시 모드 @@ -5246,11 +5246,11 @@ ko: section_work_week: 근무 주 section_holidays_and_closures: 공휴일 및 휴업일 work_packages: - work_package_identifier: Work package identifier + work_package_identifier: 작업 패키지 식별자 not_allowed_text: 이 페이지를 보는 데 필요한 권한이 없습니다. activities: enable_internal_comments: 내부 코멘트 활성화 - helper_text_html: 'Internal comments allow an internal team to communicate amongst themselves privately. These are only visible to selected roles that have the necessary permissions and will not be visible publicly. [Click here to learn more](docs_url) + helper_text_html: '내부 코멘트를 사용하여 내부 팀이 비공개로 서로 커뮤니케이션할 수 있습니다. 이러한 코멘트는 필요한 권한을 가진 선택된 역할에만 표시되며 공개적으로 표시되지 않습니다. [자세히 알아보려면 여기를 클릭하세요](docs_url) ' text_formatting: @@ -5338,7 +5338,7 @@ ko: text_default_administrator_account_changed: 기본 관리자 계정 변경됨 text_default_encoding: '기본: UTF-8' text_destroy: 삭제 - text_destroy_with_associated: 'There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:' + text_destroy_with_associated: '삭제할 작업 패키지와 연결된 추가 개체가 있습니다. 이러한 개체의 유형은 다음과 같습니다:' text_destroy_what_to_do: 어떤 작업을 수행하시겠습니까? text_diff_truncated: "... 이 차이점은 표시할 수 있는 최대 크기를 초과하므로 잘렸습니다." text_email_delivery_not_configured: |- @@ -5397,10 +5397,10 @@ ko: text_plugin_assets_writable: 플러그인 자산 디렉터리 쓰기 가능 text_powered_by: "%{link} 제공" text_project_identifier_info: 소문자(a-z), 숫자, 대시(-) 및 밑줄(_)만 허용됩니다. 소문자로 시작해야 합니다. - text_project_identifier_description: The project identifier is prepended to all work package IDs. If the identifier is "PROJ" for example, the work package identifier will be "PROJ-12" or "PROJ-246". - text_project_identifier_url_description: The project identifier is included in the URL of the project. - text_project_identifier_handle_format: Must start with a letter and contain only uppercase letters, numbers, and underscores (max 10 characters). - text_project_identifier_format: Must start with a lowercase letter. Only lowercase letters (a-z), numbers, dashes and underscores are allowed. + text_project_identifier_description: 프로젝트 식별자는 모든 작업 패키지 ID 앞에 붙습니다. 예를 들어, 식별자가 "PROJ"인 경우, 작업 패키지 식별자는 "PROJ-12" 또는 "PROJ-246"이 됩니다. + text_project_identifier_url_description: 프로젝트 식별자는 프로젝트의 URL에 포함되어 있습니다. + text_project_identifier_handle_format: 문자로 시작하고 대문자, 숫자 및 밑줄만 포함해야 합니다(최대 10자). + text_project_identifier_format: 소문자로 시작해야 합니다. 소문자(a-z), 숫자, 대시 및 밑줄만 허용됩니다. text_reassign: '작업 패키지에 다시 할당:' text_regexp_multiline: 멀티라인 모드에서 정규식이 적용됩니다. 예, e.g., ^---\s+ text_repository_usernames_mapping: |- @@ -5512,10 +5512,10 @@ ko: version_status_locked: 잠김 version_status_open: 열기 note: 메모 - note_password_login_disabled_link: Password login has been disabled through a [configuration setting](configuration_url). + note_password_login_disabled_link: 암호 로그인이 [구성 설정](configuration_url)에서 비활성화되었습니다. warning: 경고 warning_attachments_not_saved: "%{count}개 파일을 저장할 수 없습니다." - warning_imminent_user_limit_html: 'You invited more users than are supported by your current plan. Invited users may not be able to join your OpenProject environment. Please [upgrade your plan](upgrade_url) or block existing users in order to allow invited and registered users to join. + warning_imminent_user_limit_html: '현재 플랜으로 지원되는 사용자보다 많은 사용자를 초대했습니다. 초대된 사용자가 OpenProject 환경에 참여하지 못할 수 있습니다. 초대된 사용자와 등록된 사용자가 참여할 수 있도록 하려면 [플랜을 업그레이드](upgrade_url)하거나 기존 사용자를 차단하세요. ' warning_registration_token_expired: | @@ -5524,7 +5524,7 @@ ko: warning_user_limit_reached: '사용자를 더 추가하면 현재 한도가 초과됩니다. 외부 사용자가 이 인스턴스에 액세스할 수 있도록 관리자에게 문의하여 사용자 한도를 늘리세요. ' - warning_user_limit_reached_admin_html: 'Adding additional users will exceed the current limit. Please [upgrade your plan](upgrade_url) to be able to ensure external users are able to access this instance. + warning_user_limit_reached_admin_html: '사용자를 더 추가하면 현재 한도가 초과됩니다. 외부 사용자가 이 인스턴스에 액세스할 수 있도록 하려면 [플랜을 업그레이드](upgrade_url)하세요. ' warning_user_limit_reached_instructions: '사용자 제한(활성 사용자 %{current}/%{max}명)에 도달했습니다. sales@openproject.com으로 연락하여 Enterprise Edition 플랜을 업그레이드하고 사용자를 더 추가하세요. @@ -5589,7 +5589,7 @@ ko: reminders: label_remind_at: 날짜 note_placeholder: 이 미리 알림을 설정하는 이유는 무엇입니까? - create_success_message_html: Reminder set successfully. You will receive a notification for this work package %{reminder_time}. + create_success_message_html: 미리 알림이 설정되었습니다. %{reminder_time}에 이 작업 패키지에 대한 알림을 받게 됩니다. success_update_message: 미리 알림이 업데이트되었습니다. success_deletion_message: 미리 알림이 삭제되었습니다. sharing: @@ -5621,7 +5621,7 @@ ko: warning_user_limit_reached: '사용자를 더 추가하면 현재 한도가 초과됩니다. 외부 사용자가 이 %{entity}에 액세스할 수 있도록 관리자에게 문의하여 사용자 한도를 늘리세요. ' - warning_user_limit_reached_admin_html: 'Adding additional users will exceed the current limit. Please [upgrade your plan](upgrade_url) to be able to ensure external users are able to access this %{entity}. + warning_user_limit_reached_admin_html: '사용자를 더 추가하면 현재 한도가 초과됩니다. 외부 사용자가 이 %{entity}에 액세스할 수 있도록 하려면 [플랜을 업그레이드](upgrade_url)하세요. ' warning_no_selected_user: 이 %{entity}을(를) 공유할 사용자를 선택하세요 @@ -5745,7 +5745,7 @@ ko: project: 숨겨짐 - 권한이 없어 프로젝트를 볼 수 없습니다. ancestor: 숨겨짐 - 권한이 없어 상위 항목을 볼 수 없습니다. definingProject: 숨겨짐 - 권한이 없어 프로젝트를 볼 수 없습니다. - definingWorkspace: Undisclosed - The workspace is invisible because of lacking permissions. + definingWorkspace: 숨겨짐 - 권한이 없으므로 워크스페이스를 볼 수 없습니다. doorkeeper: pre_authorization: status: 사전 권한 부여 diff --git a/config/locales/crowdin/pl.yml b/config/locales/crowdin/pl.yml index c712b56898a..fbae2cc8eae 100644 --- a/config/locales/crowdin/pl.yml +++ b/config/locales/crowdin/pl.yml @@ -4248,7 +4248,7 @@ pl: label_subproject: Podprojekt label_subproject_new: Nowy podprojekt label_subproject_plural: Podprojekty - label_subitems: Podppzycje + label_subitems: Podpozycje label_subtask_plural: Zadania podrzędne label_summary: Podsumowanie label_system: System diff --git a/config/locales/crowdin/pt-BR.yml b/config/locales/crowdin/pt-BR.yml index fc8e191d9a5..71cba25ed29 100644 --- a/config/locales/crowdin/pt-BR.yml +++ b/config/locales/crowdin/pt-BR.yml @@ -177,7 +177,7 @@ pt-BR: instance_meta_fetching: Buscando metadados instance_meta_error: Erro ao buscar metadados instance_meta_done: Metadados obtidos - import_scope: Select scope + import_scope: Selecionar escopo configuring: Selecione o escopo projects_meta_fetching: Buscando dados do projeto projects_meta_error: Erro ao buscar dados do projeto @@ -187,12 +187,12 @@ pt-BR: imported: Modo de revisão reverting: Revertendo revert_error: Erro durante a reversão - revert_cancelling: Cancelling revert - revert_cancelled: Revert cancelled + revert_cancelling: Cancelando reversão + revert_cancelled: Reversão cancelada reverted: Revertido - finalizing: Finalizing - finalizing_error: Error during finalizing - finalizing_done: Completed + finalizing: Finalizando + finalizing_error: Erro ao finalizar + finalizing_done: Concluído wizard: button_retry: Tentar novamente parts: @@ -273,9 +273,9 @@ pt-BR: button_revert: Reverter importação button_done: Finalize importação preview_description: Os dados importados estão atualmente em modo de revisão. Clique em “Finalizar importação” para tornar a importação permanente ou em “Reverter importação” para desfazer todas as alterações feitas nesta execução de importação. - label_finalize_import: Finalize import - label_finalizing: Finalizing import... - label_finalizing_done: Import finalized. + label_finalize_import: Finalizar importação + label_finalizing: Finalizando importação... + label_finalizing_done: Importação finalizada. label_revert_progress: Revertendo importação... label_reverted: Importação revertida. select_dialog: @@ -398,63 +398,63 @@ pt-BR: label_autofixed_suggestion: Identificador futuro label_example_work_package_id: Exemplo de ID de pacote de trabalho autofix_preview: - error_too_long: Has to be 10 characters or fewer - error_numerical: Cannot be purely numerical - error_starts_with_number: Cannot start with a number - error_special_characters: Special characters not allowed - error_not_fully_uppercased: Must be uppercase - error_in_use: Already in use as another project's active handle - error_reserved: Reserved by another project's handle history - error_unknown: Needs manual review + error_too_long: Deve conter no máximo 10 caracteres + error_numerical: Não pode ser exclusivamente numérico + error_starts_with_number: Não pode começar com um número + error_special_characters: Caracteres especiais não são permitidos + error_not_fully_uppercased: Deve estar em maiúsculas + error_in_use: Já está em uso como identificador ativo de outro projeto + error_reserved: Reservado pelo histórico de identificadores de outro projeto + error_unknown: Requer revisão manual remaining_projects: - one: "... 1 more project" - other: "... %{count} more projects" - button_autofix: Autofix and save + one: "… mais 1 projeto" + other: "… mais %{count} projetos" + button_autofix: Corrigir e salvar dialog: - title: Change work package identifiers - heading: Enable project-based work package IDs? - description: 'This will change IDs for all work packages in all projects in this instance. Previous identifiers and URLs will continue to redirect properly. This change will take some time to complete. + title: Alterar identificadores do pacote de trabalho + heading: Ativar IDs de pacotes de trabalho por projeto? + description: 'Isso alterará os IDs de todos os pacotes de trabalho em todos os projetos nesta instância. Os identificadores e URLs anteriores continuarão redirecionando corretamente. Essa alteração levará algum tempo para ser concluída. ' - confirm_button: Change identifiers - checkbox_label: I understand that this will permanently change all work package IDs - success_banner: Successfully updated work package identifier format. + confirm_button: Alterar identificadores + checkbox_label: Estou ciente de que isso alterará permanentemente todos os IDs dos pacotes de trabalho + success_banner: Formato de identificador de pacote de trabalho atualizado com sucesso. in_progress: - banner_message: Project identifiers are currently being updated to project-based semantic identifiers. This may take some time. + banner_message: Os identificadores dos projetos estão sendo atualizados para identificadores semânticos baseados em projeto. Isso pode levar algum tempo. workflows: tabs: default_transitions: Transições padrão user_author: Usuário é autor user_assignee: Usuário é responsável index: - description: Configure status transitions for each work package type. + description: Configurar transições de status para cada tipo de pacote de trabalho. type_filter: - label: Filter by type name… + label: Filtrar por nome do tipo… status_button: Status statuses_dialog: - title: Statuses - label: Statuses enabled for this type - caption: Add or remove statuses you would like to associate with this type. Removing a status will also delete the workflow associated with it. + title: Status + label: Status habilitados para este tipo + caption: Adicione ou remova os status que deseja associar a este tipo. Remover um status também excluirá o fluxo de trabalho associado a ele. statuses_removal_dialog: - title: Remove statuses + title: Remover status heading: - one: Remove 1 status? - other: Remove %{count} statuses? - description: Removing these statuses will make them unavailable to this type and delete existing workflows. Are you sure you want to proceed? - confirm: Remove + one: Remover 1 status? + other: Remover %{count} status? + description: Ao remover esses status, eles ficarão indisponíveis para este tipo e os fluxos de trabalho existentes serão excluídos. Tem certeza de que deseja continuar? + confirm: Remover leave_confirmation: - title: Save changes before continuing? - description: You are about to leave this page but you have unsaved changes. Would you like to save them before continuing? - ignore: Ignore changes - save: Save changes and continue + title: Salvar alterações antes de continuar? + description: Você está prestes a sair desta página, mas há alterações não salvas. Deseja salvá-las antes de continuar? + ignore: Ignorar alterações + save: Salvar alterações e continuar role_selector: - label: 'Role: %{role}' - no_role: Select role + label: 'Função: %{role}' + no_role: Selecionar função blankslate: - title: No status transitions configured - description: Add statuses to start configuring workflows for this role + title: Nenhuma transição de status configurada + description: Adicione status para começar a configurar fluxos de trabalho para esta função info: - database_deprecation_html: 'Starting with OpenProject 16.0, PostgreSQL 16 is required to use OpenProject. Your installation will remain functional with your current database, but anticipate incompatability in future releases.
We have prepared [upgrade guides for all installation methods](upgrade_guide). You can perform the upgrade ahead of the next release at any time by following the guides. + database_deprecation_html: 'A partir do OpenProject 16.0, é necessário usar o PostgreSQL 16. Sua instalação atual continuará funcionando, mas futuras versões podem não ser compatíveis com o banco de dados atual.
Preparamos [guias de atualização para todos os métodos de instalação](upgrade_guide), que você pode seguir a qualquer momento antes do próximo lançamento. ' authentication: @@ -687,13 +687,13 @@ pt-BR: confirmation_live_message_checked: O botão para prosseguir agora está ativo. confirmation_live_message_unchecked: O botão para prosseguir está desativado. É necessário marcar a caixa de seleção para continuar. pagination: - label: Pagination - prev: Previous - prev_page: Previous Page - next: Next - next_page: Next Page - page: Page %{number} - page_with_more: Page %{number}... + label: Paginação + prev: Anterior + prev_page: Página anterior + next: Próxima + next_page: Próxima página + page: Página %{number} + page_with_more: Página %{number}... mcp_configurations: server_url_component: caption: O URL em que o servidor MCP do OpenProject estará acessível. Necessário para configurar os clientes MCP. @@ -701,13 +701,13 @@ pt-BR: op_dry_validation: or: ou errors: - unexpected_key: is not allowed. + unexpected_key: não é permitido. array?: deve ser um array. decimal?: deve ser um número decimal. defined: não deve ser definido. eql?: deve ser igual a %{left}. filled?: deve ser preenchido. - format?: is in invalid format. + format?: está em formato inválido. greater_or_equal_zero: deve ser maior ou igual a 0. gteq?: deve ser maior ou igual a %{num}. hash?: deve ser um hash. @@ -734,9 +734,9 @@ pt-BR: parent: not_descendant: deve ser um descendente da raiz da hierarquia. str?: deve ser uma cadeia de caracteres. - time?: must be a time. + time?: deve ser um horário. type?: dever ser %{type}. - uri?: is not a valid URI. + uri?: não é um URL válido. rules: copy_workflow_from: Tipo de cópia do fluxo de trabalho enabled: Habilitado @@ -857,10 +857,10 @@ pt-BR: ' change_identifier: Mudar identificador - change_identifier_dialog_title: Change project identifier - change_identifier_format_hint_semantic: Only uppercase letters (A–Z), numbers or underscores. Max 10 characters. Must start with a letter. - change_identifier_format_hint_legacy: Only lowercase letters (a–z), numbers, dashes or underscores. - change_identifier_warning: 'This will permanently change identifiers and URLs of all work packages in this project. The previous identifier and URLs will nevertheless continue to redirect properly. + change_identifier_dialog_title: Alterar identificador do projeto + change_identifier_format_hint_semantic: Apenas letras maiúsculas (A–Z), números ou sublinhados. Máximo de 10 caracteres. Deve começar com uma letra. + change_identifier_format_hint_legacy: Apenas letras minúsculas (a–z), números, hífens ou sublinhados. + change_identifier_warning: 'Isso alterará permanentemente os identificadores e URLs de todos os pacotes de trabalho deste projeto. No entanto, os identificadores e URLs anteriores continuarão a redirecionar corretamente. ' subitems: @@ -1098,9 +1098,9 @@ pt-BR: groups: member_in_these_groups: 'No momento, este usuário é um membro dos seguintes grupos: ' no_results_title_text: No momento, este usuário não é membro de nenhum grupo. - summary_with_more_html: Member of %{names} and %{count_link}. + summary_with_more_html: Membro de %{names} e %{count_link}. more: "%{count} a mais" - summary_html: Member of %{names}. + summary_html: Membro do %{names}. memberships: no_results_title_text: Atualmente, este usuário não é um membro de um projeto. open_profile: Abrir perfil @@ -1158,61 +1158,61 @@ pt-BR: group: O grupo agora faz parte de %{project}. Enquanto isso, você já pode planejar com este grupo e atribuir pacotes de trabalho por exemplo. working_hours: current_schedule: - title: Current schedule - work_days: Work days - work_hours: Work hours - availability_factor: Availability factor - availability_subtitle: Dedicated to project work - effective_hours: Effective work hours - effective_subtitle: Per week - not_set: Not set + title: Agenda atual + work_days: Dias úteis + work_hours: Horas de trabalho + availability_factor: Fator de disponibilidade + availability_subtitle: Dedicado ao trabalho do projeto + effective_hours: Horas efetivas de trabalho + effective_subtitle: Por semana + not_set: Não definido future: - title: Future schedules - description: Plan working schedule changes ahead of time. Once the date arrives your working schedules will be updated automatically. - add_button: Add future schedule - blank_title: No future schedules planned - blank_description: Create a future schedule to plan changes ahead of time + title: Agendas futuras + description: Planeje mudanças na agenda de trabalho com antecedência. Quando a data chegar, seus horários serão atualizados automaticamente. + add_button: Adicionar agenda futura + blank_title: Nenhuma agenda futura planejada + blank_description: Crie uma agenda futura para planejar alterações com antecedência history: - title: Schedule history - description: View your past work schedules. - blank_title: No schedule history yet - blank_description: Past schedule changes will appear here + title: Histórico de agendas + description: Veja seus cronogramas de trabalho anteriores. + blank_title: Ainda não há histórico de agendas + blank_description: As alterações de agenda anteriores aparecerão aqui destroy: - confirm: Are you sure you want to delete this working schedule? + confirm: Tem certeza de que deseja excluir esta agenda de trabalho? form: - title: Plan a future work schedule - title_current: Edit current work schedule - start_date: Start date - start_date_caption: Select the date from when the new work schedule will be effective. - work_days: Work days - working_hours_label: Working hours - hours_mode_label: Hours mode - same_hours_mode: Same hours per day - individual_hours_mode: Individual hours per day - work_hours: Work hours - hours_per_day: Hours per day - per_day: per day - per_week: per week - total_work_hours: Total work hours - availability_description: The availability factor represents the actual percentage of your working time dedicated to project tasks. This accounts for meetings, emails, administrative work, and other non-project activities. - availability_factor: Availability factor - availability_factor_caption: Define the percentage of your working time dedicated to project work. - total_available_hours: Total available work hours - title_availability_factor: Availability factor - title_days_and_hours: Days and hours - title_future_dates: Future dates + title: Planejar uma agenda de trabalho futura + title_current: Editar a agenda de trabalho atual + start_date: Data de início + start_date_caption: Selecione a data a partir da qual a nova agenda de trabalho será válida. + work_days: Dias úteis + working_hours_label: Horário comercial + hours_mode_label: Modo de horas + same_hours_mode: Mesmas horas por dia + individual_hours_mode: Horas individuais por dia + work_hours: Horas de trabalho + hours_per_day: Horas por dia + per_day: por dia + per_week: por semana + total_work_hours: Total de horas de trabalho + availability_description: O fator de disponibilidade representa a porcentagem real do seu tempo de trabalho dedicada às tarefas do projeto. Isso inclui reuniões, e-mails, atividades administrativas e outras tarefas que não estão diretamente relacionadas ao projeto. + availability_factor: Fator de disponibilidade + availability_factor_caption: Defina a porcentagem do seu tempo de trabalho dedicada aos trabalhos do projeto. + total_available_hours: Total de horas de trabalho disponíveis + title_availability_factor: Fator de disponibilidade + title_days_and_hours: Dias e horas + title_future_dates: Datas futuras table: - mobile_title: Working schedules - start_date: Start date - work_days: Work days - work_hours: Work hours - availability_factor: Availability factor - effective_work_hours: Effective work hours + mobile_title: Agendas de trabalho + start_date: Data de início + work_days: Dias úteis + work_hours: Horas de trabalho + availability_factor: Fator de disponibilidade + effective_work_hours: Horas efetivas de trabalho work_days_count: - one: 1 working day - other: "%{count} working days" + one: 1 dia de trabalho + other: "%{count} dias de trabalho" user_preferences: - disable_keyboard_shortcuts_caption: 'You can choose to disable default [keyboard shortcuts](docs_url) if you use a screen reader or want to avoid accidentally triggering an action with a shortcut. + disable_keyboard_shortcuts_caption: 'Você pode optar por desativar os [atalhos de teclado](docs_url) padrão caso use leitor de tela ou queira evitar acionar ações acidentalmente com atalhos. ' page: @@ -1223,12 +1223,12 @@ pt-BR: ' delete_tooltip: Excluir usuário de espaço reserva deletion_info: - heading_html: Delete placeholder user %{name} + heading_html: Excluir usuário de espaço reservado %{name} data_consequences: 'Todas as ocorrências do usuário de espaço reservado (por exemplo, como responsável, competente ou outros valores de usuário) serão reatribuídas a uma conta chamada "Usuário excluído". Como os dados de todas as contas excluídas são reatribuídos a esta conta, não será possível diferenciar os dados criados por usuários de dados excluídos por outra conta. ' irreversible: Esta ação é irreversível - confirmation_html: Enter the placeholder user name %{name} to confirm the deletion. + confirmation_html: Digite o nome do usuário de espaço reservado %{name} para confirmar a exclusão. priorities: edit: priority_color_text: | @@ -1258,9 +1258,8 @@ pt-BR: status_default_text: Por padrão, os novos pacotes de trabalho são definidos com este tipo. Eles não podem ser somente leitura. status_excluded_from_totals_text: Selecione esta opção para excluir pacotes de trabalho com este status dos totais de Trabalho, Trabalho Restante e % de conclusão em uma hierarquia. status_percent_complete_text_html: |- - In [status-based progress calculation mode](setting_url), the % Complete of a work - package is automatically set to this value when this status is selected. - Ignored in work-based mode. + No [modo de cálculo de progresso com base no status](setting_url), o % de conclusão de um pacote de trabalho é automaticamente ajustado para este valor quando o status é selecionado. + Ignorado no modo baseado em trabalho. status_readonly_html: | Marque esta opção para definir pacotes de trabalho com este status como somente leitura. Nenhum atributo poderá ser alterado, exceto o status. @@ -1529,7 +1528,7 @@ pt-BR: ' login_with_auth_provider: ou entre com a sua conta existente signup_with_auth_provider: ou cadastre-se usando - auth_source_login_html: Please login as %{login} to activate your account. + auth_source_login_html: Faça login como %{login} para ativar sua conta. omniauth_login: Faça login para ativar sua conta. actionview_instancetag_blank_option: Por favor selecione activemodel: @@ -1539,8 +1538,8 @@ pt-BR: activerecord: attributes: work_package_semantic_alias: - identifier: Identifier - work_package: Work package + identifier: Identificador + work_package: Pacote de trabalho jira_import: projects: Projetos import/jira: @@ -1549,7 +1548,7 @@ pt-BR: personal_access_token: Token de acesso de pessoal import/jira_open_project_reference: jira: Jira - jira_import: Jira Migrator + jira_import: Migrador do Jira announcements: show_until: Exibir até attachment: @@ -1803,11 +1802,11 @@ pt-BR: consented_at: Consentido em group: identity_url: URL de identidade - parent: Parent group - organizational_unit: Organizational unit + parent: Grupo principal + organizational_unit: Unidade organizacional group_detail: - parent: Parent group - organizational_unit: Organizational unit + parent: Grupo principal + organizational_unit: Unidade organizacional user_preference: header_look_and_feel: Aparência e comportamento header_alerts: Alertas @@ -1837,27 +1836,27 @@ pt-BR: principal_type: Tipo de convite id_or_email: Nome ou endereço de e-mail user_non_working_time: - start_date: Start date - end_date: End date + start_date: Data de início + end_date: Data de término user_working_hours: - valid_from: Valid from - monday: Monday - monday_hours: Monday hours + valid_from: Válido a partir de + monday: Segunda + monday_hours: Horário às segundas-feiras tuesday: Terça-feira tuesday_hours: Horário de funcionamento às terças-feiras wednesday: Quarta-feira wednesday_hours: Horário de funcionamento às quartas-feiras - thursday: Thursday - thursday_hours: Thursday hours - friday: Friday - friday_hours: Friday hours - saturday: Saturday - saturday_hours: Saturday hours - sunday: Sunday - sunday_hours: Sunday hours - availability_factor: Availability factor - shared_hours: Work hours - days: Working days + thursday: Quinta + thursday_hours: Horário às terças-feiras + friday: Sexta + friday_hours: Horário às sextas-feiras + saturday: Sábado + saturday_hours: Horário aos sábados + sunday: Domingo + sunday_hours: Horário aos domingos + availability_factor: Fator de disponibilidade + shared_hours: Horas de trabalho + days: Dias úteis version: effective_date: Data de conclusão sharing: Compartilhamento @@ -1912,8 +1911,8 @@ pt-BR: before: deve ser antes de %{date}. before_or_equal_to: deve ser antes ou igual a %{date}. blank: não pode ficar em branco. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. + not_before_start_date: não pode ser anterior à data de início. + overlapping_range: sobrepõe-se a um período já existente de dias não úteis. blank_nested: 'precisa ter a propriedade ''%{property}'' definida. ' cannot_delete_mapping: é obrigatório. Não pode ser excluído. is_for_all_cannot_modify: é aplicável a todos os projetos e, portanto, não pode ser modificado. @@ -1950,9 +1949,9 @@ pt-BR: less_than_or_equal_to: deve ser menor ou igual a %{count}. not_available: não está disponível devido a uma configuração do sistema. not_deletable: não pode ser excluído. - not_editable: cannot be edited because it is already in effect. + not_editable: não pode ser editado porque já está em vigor. not_current_user: não é o usuário atual. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. + system_wide_non_working_day_exists: conflita com um dia não útil já existente em todo o sistema para esta data. not_found: não encontrado. not_a_date: não é uma data válida. not_a_datetime: não é uma data/hora válida. @@ -1987,7 +1986,7 @@ pt-BR: group: attributes: parent_id: - circular_dependency: would create a circular group hierarchy. + circular_dependency: criaria uma hierarquia circular de grupos. ldap_auth_source: attributes: tls_certificate_string: @@ -2099,8 +2098,8 @@ pt-BR: types: in_use_by_work_packages: 'ainda em uso pelos pacotes de trabalho: %{types}' identifier: - must_start_with_letter: must start with a letter - no_special_characters: may only contain uppercase letters, numbers, and underscores + must_start_with_letter: precisa começar com uma letra + no_special_characters: pode conter apenas letras maiúsculas, números e underscores enabled_modules: dependency_missing: O módulo '%{dependency}' precisa ser habilitado, pois o módulo '%{module}' depende dele. format: "%{message}" @@ -2308,7 +2307,7 @@ pt-BR: user_working_hours: attributes: days: - no_working_day: At least one day needs to be configured as a working day. + no_working_day: Pelo menos um dia precisa ser configurado como dia útil. member: principal_blank: Por favor, escolha ao menos um usuário ou grupo. role_blank: precisa ser atribuído. @@ -2577,7 +2576,7 @@ pt-BR: info: 'Você precisará gerar um token de backup para poder criar um backup. Cada vez que você solicitar um backup você terá que fornecer esse token. Você pode excluir o token de backup para desabilitar backups deste usuário. ' - verification_html: 'Enter %{word} to confirm you want to %{action} the backup token. + verification_html: 'Digite %{word} para confirmar que deseja %{action} o token de backup. ' verification_word_reset: redefinir @@ -3018,7 +3017,7 @@ pt-BR: title: one: Falta um dia para o término do token de avaliação %{trial_plan} other: Faltam %{count} dias para o término do token de avaliação %{trial_plan} - description_html: You have access to all %{trial_plan} features. + description_html: Você possui acesso a todos os recursos do %{trial_plan}. trial: not_found: Você solicitou um token de avaliação, mas esta solicitação não está mais disponível. Tente novamente. wait_for_confirmation: Enviamos um e-mail para você confirmar seu endereço e assim resgatar um token de avaliação. @@ -3038,8 +3037,8 @@ pt-BR: ' domain_caption: O token será válido apenas para o nome de host configurado no momento. - receive_newsletter: I want to receive the OpenProject [newsletter](newsletter_url). - consent: I agree with the [terms of service](tos_url) and the [privacy policy](privacy_url). + receive_newsletter: Quero receber a [boletim informativo](newsletter_url) do OpenProject. + consent: Concordo com os [termos de serviço](tos_url) e com a [política de privacidade](privacy_url). email_calendar_updates: state: disabled: Desabilitado. @@ -3128,8 +3127,8 @@ pt-BR: work_package_edit: Pacote de Trabalho editado work_package_note: Anotação acrescentada ao Pacote de Trabalho title: - project_html: 'Project: %{name}' - subproject_html: 'Subproject: %{name}' + project_html: 'Projeto: %{name}' + subproject_html: 'Subprojeto: %{name}' export: dialog: title: Exportar @@ -3301,17 +3300,17 @@ pt-BR: learn_about: Saiba mais sobre todos os novos recursos missing: Ainda não há recursos destacados. '17_3': - new_features_title: 'The release contains various new features and improvements, such as: + new_features_title: 'A versão traz diversos novos recursos e melhorias, como: ' new_features_list: - line_0: 'Big Agile update: dedicated sprint objects, all work packages visible on Backlogs, and automatic sprint board creation.' - line_1: In-place editing of project attributes on the Project Overview page. - line_2: Sharing of meeting templates (Basic plan and higher). - line_3: Better search in Time and Costs, Boards, and more. - line_4: Option to safely change project identifiers. - line_5: Improved workflow configuration for administrators. - line_6: Action boards released to Community. + line_0: 'Grande atualização Agile: objetos de sprint dedicados, todos os pacotes de trabalho visíveis nos Backlogs e criação automática de quadros de sprint.' + line_1: Edição direta dos atributos do projeto na página de visão geral do projeto. + line_2: Compartilhamento de modelos de reunião (plano Basic ou superior). + line_3: Melhor busca em Tempo e Custos, Quadros e mais. + line_4: Opção para alterar identificadores de projeto com segurança. + line_5: Configuração de fluxo de trabalho aprimorada para administradores. + line_6: Quadros de ação lançados para a comunidade. links: upgrade_enterprise_edition: Atualizar para a edição Enterprise postgres_migration: Migrando sua instalação para PostgreSQL @@ -3376,15 +3375,15 @@ pt-BR: progress_calculation_adjusted: Cálculo de progresso automaticamente ajustado com a atualização de versão. scheduling_mode_adjusted: Modo de agendamento ajustado automaticamente com a atualização da versão. totals_removed_from_childless_work_packages: Os totais de trabalho e progresso foram removidos automaticamente para pacotes de trabalho que não são principais com a atualização de versão. Esta é uma tarefa de manutenção e pode ser ignorada com segurança. - sprint_migration: Version '%{version_name}' has been copied as a sprint. + sprint_migration: A versão "%{version_name}" foi copiada como um sprint. total_percent_complete_mode_changed_to_work_weighted_average: Pacotes de trabalho infantil sem Trabalho são ignorados. total_percent_complete_mode_changed_to_simple_average: Os valores de trabalho dos pacotes de trabalho filhos são ignorados. links: configuration_guide: Guia de configuração get_in_touch: Com dúvidas? Entre em contato conosco. - instructions_after_registration_link: You can sign in as soon as your account has been activated by clicking [here](signin_url). - instructions_after_logout_link: You can sign in again by clicking [here](signin_url). - instructions_after_error_link: You can try to sign in again by clicking [here](signin_url). If the error persists, ask your admin for help. + instructions_after_registration_link: Você pode entrar, assim que a sua conta for ativada clicando [aqui](signin_url). + instructions_after_logout_link: Você pode entrar novamente clicando [aqui](signin_url). + instructions_after_error_link: Você pode tentar entrar novamente, clicando [aqui](signin_url). Se o erro persistir, consulte seu administrador para obter ajuda. menus: admin: ai: Inteligência artificial (IA) @@ -3397,10 +3396,10 @@ pt-BR: label: Adicionar… my_account: notifications_and_email: - title: Notification and email + title: Notificação e e-mail tabs: - notifications: Notification settings - email_reminders: Email reminders + notifications: Configurações de notificação + email_reminders: Lembretes por e-mail access_tokens: description: Tokens de provedor são emitidos pelo OpenProject, permitindo que outros aplicativos tenham acesso a ele. Tokens de cliente são emitidos por outros aplicativos, permitindo que o OpenProject tenha acesso a eles. no_results: @@ -3465,70 +3464,70 @@ pt-BR: unknown_storage: Armazenamento desconhecido email_reminders: immediate_reminders: - title: Send me an email reminder - mentioned: Notify me when I am mentioned - personal_reminder: Notify me for personal reminders + title: Envie-me um lembrete por e-mail + mentioned: Avise-me quando eu for mencionado + personal_reminder: Notificar-me sobre lembretes pessoais daily_reminders: - title: Send me daily email reminders for unread notifications - caption: You will receive these reminders only for unread notifications and only at hours you specify. Until you configure a time zone for your account, the times will be interpreted to be in UTC. - enabled: Enable daily email reminders - add_time: Add time - remove_time: Remove time - time_slot_label: Reminder time (UTC) + title: Enviar lembretes diários por e-mail para notificações não lidas + caption: Você receberá esses lembretes apenas para notificações não lidas e somente nos horários que você especificar. Até que você configure um fuso horário para sua conta, os horários serão interpretados como UTC. + enabled: Ativar lembretes diários por e-mail + add_time: Adicionar horário + remove_time: Remover horário + time_slot_label: Horário do lembrete (UTC) workdays: - title: Receive email reminders on these days - submit_button: Update reminder days + title: Receber lembretes por e-mail nestes dias + submit_button: Atualizar dias do lembrete pause_reminders: - title: Pause email notifications - enabled: Temporarily pause daily email reminders - date_range: Pause period + title: Pausar notificações por e-mail + enabled: Pausar temporariamente os lembretes diários por e-mail + date_range: Período de pausa email_alerts: - title: Email alerts for other items that are not work packages - news_added: News added - news_commented: Comment on a news item - document_added: Document added - forum_messages: Forum message posted - wiki_page_added: Wiki page added - wiki_page_updated: Wiki page updated - membership_added: Membership added - membership_updated: Membership updated - submit_button: Update alerts + title: Alertas por e-mail para outros itens que não sejam pacotes de trabalho + news_added: Notícia adicionada + news_commented: Comentar em uma notícia + document_added: Documento adicionado + forum_messages: Mensagem publicada no fórum + wiki_page_added: Página wiki adicionada + wiki_page_updated: Página wiki atualizada + membership_added: Associação adicionada + membership_updated: Associação atualizada + submit_button: Atualizar alertas notifications: participating: - title: Participating - submit_button: Update preferences - mentioned: Mentioned - watched: Watching - assignee: Assignee - responsible: Accountable - shared: Shared with me + title: Participando + submit_button: Atualizar preferências + mentioned: Mencionado + watched: Assistindo + assignee: Encarregado + responsible: Responsável + shared: Compartilhados comigo date_alerts: - title: Date alerts - submit_button: Update date alerts - start_date: Start date - due_date: Finish date - overdue: Overdue + title: Alertas de data + submit_button: Atualizar alertas de data + start_date: Data de início + due_date: Data de conclusão + overdue: Atrasado times: - same_day: On the same day - one_day_before: 1 day before - three_days_before: 3 days before - seven_days_before: 7 days before - one_day_after: 1 day after - three_days_after: 3 days after - seven_days_after: 7 days after + same_day: No mesmo dia + one_day_before: 1 dia antes + three_days_before: 3 dias antes + seven_days_before: 7 dias antes + one_day_after: 1 dia depois + three_days_after: 3 dias depois + seven_days_after: 7 dias depois non_participating: - title: Non-participating - submit_button: Update preferences - work_package_created: New work packages - work_package_commented: All new comments - work_package_processed: All status changes - work_package_prioritized: All priority changes - work_package_scheduled: All date changes + title: Não participando + submit_button: Atualizar preferências + work_package_created: Novos pacotes de trabalho + work_package_commented: Todos os novos comentários + work_package_processed: Todas as mudanças de status + work_package_prioritized: Todas as mudanças de prioridade + work_package_scheduled: Todas as mudanças de data project_specific_settings: - title: Project-specific notification settings - add_button: Add project-specific notifications - dialog_title: Add project-specific notifications - list_header: Projects with specific notifications + title: Configurações de notificação específicas de projetos + add_button: Adicionar notificações específicas do projeto + dialog_title: Adicionar notificações específicas do projeto + list_header: Projetos com notificações específicas notifications: reasons: assigned: Cessionário @@ -3601,7 +3600,7 @@ pt-BR: label_ical_access_key_generation_hint: Gerado automaticamente ao assinar um calendário. label_ical_access_key_latest: último label_ical_access_key_revoke: Anular - label_integrations: Integrations + label_integrations: Integrações label_add_column: Adicionar coluna label_applied_status: Situação aplicada label_archive_project: Arquivar projeto @@ -3649,8 +3648,8 @@ pt-BR: label_calendar_show: Mostrar Calendário label_category: Categoria label_completed: Concluído - label_committed_at_html: "%{committed_revision_link} at %{date}" - label_committed_link: committed revision %{revision_identifier} + label_committed_at_html: "%{committed_revision_link} em %{date}" + label_committed_link: revisão commitada %{revision_identifier} label_consent_settings: Consentimento do usuário label_wiki_menu_item: Item do menu da wiki label_select_main_menu_item: Selecione novo item do menu principal @@ -3817,7 +3816,7 @@ pt-BR: label_subject_or_id: Assunto ou ID label_calendar_subscriptions: Assinaturas do calendários label_identifier: Identificador - label_project_identifier: Project identifier + label_project_identifier: Identificador do projeto label_in: em label_in_less_than: em menos de label_in_more_than: em mais de @@ -3852,7 +3851,7 @@ pt-BR: label_external_links: Links externos label_locale: Idioma e região label_jump_to_a_project: Saltar para um projeto... - label_jira_import: Jira Migrator + label_jira_import: Migrador do Jira label_keyword_plural: Palavras-chave label_language_based: Com base no idioma do usuário label_last_activity: Última atividade @@ -3951,13 +3950,13 @@ pt-BR: label_news_view_all: Ver todas as notícias label_next: Próxima label_next_week: Próxima semana - label_next_year: Next year + label_next_year: Próximo ano label_no_change_option: "(Sem alteração)" label_no_data: Sem dados para exibir label_no_due_date: sem data de conclusão label_no_start_date: nenhuma data de início label_no_parent_page: Nenhuma página pai - label_no_parent_group: "(No parent group)" + label_no_parent_group: "(Sem grupo pai)" label_notification_center_plural: Notificações label_nothing_display: Nada para exibir label_nobody: ninguém @@ -3986,7 +3985,7 @@ pt-BR: label_overall_activity: Atividade global label_overview: Visão geral label_page_title: Título da página - label_parent_group_caption: 'Setting a parent group will make this group a subgroup of the selected parent group. This will also inherit all memberships, including permissions of the parent group. + label_parent_group_caption: 'Definir um grupo pai fará com que este grupo se torne um subgrupo do grupo pai selecionado. Isso também fará com que herde todas as associações, incluindo as permissões do grupo pai. ' label_part_of: parte de @@ -4015,7 +4014,7 @@ pt-BR: label_preview_not_available: Visualização não disponível label_previous: Anterior label_previous_week: Semana anterior - label_previous_year: Previous year + label_previous_year: Ano anterior label_principal_invite_via_email: " ou convidar novos usuários via e-mail" label_principal_search: Adicionar usuários existentes ou grupos label_privacy_policy: Política de privacidade e segurança de dados @@ -4127,7 +4126,7 @@ pt-BR: label_start_to_start: início à início label_statistics: Estatísticas label_status: Situação - label_status_plural: Statuses + label_status_plural: Status label_storage_free_space: Espaço em disco restante label_storage_used_space: Espaço em disco utilizado label_storage_group: Armazenamento de arquivos %{identifier} @@ -4177,7 +4176,7 @@ pt-BR: label_user: Usuário label_user_and_permission: Usuários e permissões label_user_named: Usuário %{name} - label_user_activity_html: "%{value}'s activity" + label_user_activity_html: atividade do %{value} label_user_anonymous: Anônimo label_user_menu: Menu de usuários label_user_new: Novo usuário @@ -4265,14 +4264,14 @@ pt-BR: other: "%{count} arquivos" zero: nenhum arquivo label_x_days: - one: 1 day - other: "%{count} days" + one: 1 dia + other: "%{count} dias" label_x_working_days: - one: 1 working day - other: "%{count} working days" + one: 1 dia útil + other: "%{count} dias úteis" label_x_working_days_time_off: - one: 'Time off: 1 working day' - other: 'Time off: %{count} working days' + one: 'Dia de folga: 1 dia útil' + other: 'Dia de folga: %{count} dias úteis' label_yesterday: ontem label_zen_mode: Modo Zen label_role_type: Tipo @@ -4281,22 +4280,22 @@ pt-BR: label_not_changeable: "(não modificável)" label_global: Global label_seeded_from_env_warning: Este registro foi criado por meio de uma configuração de variável de ambiente e, portanto, não pode ser editado através da interface do usuário. - label_schedule_and_availability: Schedule and availability - label_working_hours: Work schedule - label_non_working_days: Availability calendar - label_non_working_days_with_count: Non-working days (%{count}) - label_non_working_days_summary: Summary - button_add_non_working_time: Time off - button_edit_non_working_time: Edit time off - label_continued_from_previous_year: continued from previous year - label_continues_into_next_year: continues into next year - label_end_date: Finish date - label_working_days: Working days - label_non_working_times_with_count: "%{year} time off (%{count})" - label_non_working_times_summary: "%{year} summary" - label_total_user_non_working_times: Personal non-working days - label_total_global_non_working_days: Global non-working days - label_total_days_off: Total days off + label_schedule_and_availability: Agenda e disponibilidade + label_working_hours: Programa de trabalho + label_non_working_days: Calendário de disponibilidade + label_non_working_days_with_count: Dias não úteis (%{count}) + label_non_working_days_summary: Resumo + button_add_non_working_time: Folga + button_edit_non_working_time: Editar folga + label_continued_from_previous_year: continuado do ano anterior + label_continues_into_next_year: continuado do próximo ano + label_end_date: Data de conclusão + label_working_days: Dias úteis + label_non_working_times_with_count: Folga de %{year} (%{count}) + label_non_working_times_summary: Resumo de %{year} + label_total_user_non_working_times: Dias não úteis pessoais + label_total_global_non_working_days: Dias não úteis globais + label_total_days_off: Total de dias de folga macro_execution_error: Erro de execução da macro %{macro_name} macro_unavailable: Macro %{macro_name} não pode ser exibida. macros: @@ -4331,7 +4330,7 @@ pt-BR: center: Para o centro de notificação see_in_center: Ver comentário no centro de notificações settings: Alterar configurações de e-mail - salutation: Hello %{user}, + salutation: Olá, %{user}, salutation_full_name: Nome completo work_packages: created_at: Criado em %{timestamp} por %{user} @@ -4361,7 +4360,7 @@ pt-BR: note: 'Nota: “%{note}”' sharing: work_packages: - allowed_actions_html: You may %{allowed_actions} this work package. This can change depending on your project role and permissions. + allowed_actions_html: Você pode %{allowed_actions} este pacote de trabalho. Isso pode mudar dependendo da sua função e permissões do projeto. create_account: Para acessar este pacote de trabalho, você terá que criar e ativar uma conta em %{instance}. open_work_package: Abrir pacote de trabalho subject: O Pacote de trabalho nº %{id} foi compartilhado com você @@ -4460,8 +4459,8 @@ pt-BR: mail_user_activation_limit_reached: subject: Limite de ativação de usuários atingido message_html: | - A new user (%{email}) tried to create an account on an OpenProject environment that you manage (%{host}). - The user cannot activate their account since the user limit has been reached. + Um novo usuário (%{email}) tentou criar uma conta em um ambiente do OpenProject que você gerencia (%{host}). + O usuário não conseguiu ativar sua conta pois o limite máximo de usuários foi atingido. steps: label: 'Para permitir que o usuário entre você pode: ' a: Atualizar seu plano de pagamento ([here](upgrade_url)) @@ -4525,7 +4524,7 @@ pt-BR: notice_parent_item_not_found: Item pai não encontrado. notice_project_not_deleted: O projeto não foi excluído. notice_project_not_found: Projeto não encontrado. - notice_smtp_address_unsafe_env_hint: SMTP address %{address} is not safe. Please add it to the whitelist using the %{env_name} environment variable. + notice_smtp_address_unsafe_env_hint: O endereço SMTP %{address} não é seguro. Adicione-o à lista de permissões usando a variável de ambiente %{env_name}. notice_successful_connection: Conectado com sucesso. notice_successful_create: Criado com sucesso. notice_successful_delete: Exclusão bem sucedida. @@ -4648,12 +4647,12 @@ pt-BR: permission_manage_versions: Gerenciar versões permission_manage_wiki: Gerenciar wiki permission_manage_wiki_menu: Gerenciar menu da wiki - permission_manage_own_working_times: Manage own working times - permission_manage_own_working_times_explanation: 'Allows users to manage their own working times, and personal non-working days. + permission_manage_own_working_times: Gerenciar seus próprios horários de trabalho + permission_manage_own_working_times_explanation: 'Permite que os usuários gerenciem seus próprios horários de trabalho e seus dias não úteis pessoais. ' - permission_manage_working_times: Manage working times for all users - permission_manage_working_times_explanation: 'Allows users to manage working times for all users, including personal non-working days. + permission_manage_working_times: Gerenciar horários de trabalho de todos os usuários + permission_manage_working_times_explanation: 'Permite que os usuários gerenciem os horários de trabalho de todos os usuários, incluindo os dias não úteis pessoais. ' permission_move_work_packages: Mover pacotes de trabalho @@ -4804,10 +4803,10 @@ pt-BR: info: Excluir o repositório é uma ação irreversível. info_not_managed: 'Nota: Isto NÃO irá excluir o conteúdo deste repositório, pois não é gerenciado pelo OpenProject.' managed_path_note: 'Será apagado o seguinte diretório: %{path}' - repository_verification_html: Enter the project's identifier %{identifier} to verify the deletion of its repository. + repository_verification_html: Digite o identificador do projeto %{identifier} para verificar a exclusão de seu repositório. subtitle: Você quer realmente excluir o %{repository_type} do projeto %{project_name}? - subtitle_not_managed_html: Do you really want to remove the linked %{repository_type} %{url} from the project %{project_name}? - title_html: Delete the %{repository_type} + subtitle_not_managed_html: Você quer realmente remover o %{repository_type} %{url} vinculado do projeto %{project_name}? + title_html: Excluir o %{repository_type} title_not_managed: Remover o %{repository_type} vinculado? errors: build_failed: Não é possível criar o repositório com a configuração selecionada. %{reason} @@ -4856,7 +4855,7 @@ pt-BR: storage: not_available: Consumo de armazenamento em disco não está disponível para este repositório. update_timeout: Manter as últimas informações de espaço em disco necessário para um repositório por N minutos. Como contar o espaço em disco necessário de um repositório pode ser custoso, aumente este valor para reduzir o impacto no desempenho. - oauth_application_details_html: 'The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:' + oauth_application_details_html: 'O valor do segredo do cliente não estará mais acessível após você fechar esta janela. Copie esses valores nas configurações de integração do Nextcloud OpenProject:' oauth_application_details_link_text: Ir para a página de configurações setup_documentation_details: 'Se você precisar de ajuda para configurar um novo armazenamento de arquivos, confira a documentação:' setup_documentation_details_link_text: Configuração dos armazenamentos de arquivo @@ -4904,7 +4903,7 @@ pt-BR: setting_apiv3_cors_title: Compartilhamento de recursos entre origens (CORS) setting_apiv3_cors_enabled: Habilitar CORS setting_apiv3_cors_origins: Cross-Origin Resource Sharing (CORS) permitidos pela API V3 - setting_apiv3_cors_origins_instructions_html: 'If CORS is enabled, these are the origins that are allowed to access OpenProject API.
Please check the [Documentation on the Origin header](docs_url) on how to specify the expected values. + setting_apiv3_cors_origins_instructions_html: 'Se o CORS estiver ativado, estas são as origens autorizadas a acessar a API do OpenProject.
Consulte a [documentação sobre o cabeçalho Origin](docs_url) para saber como especificar os valores esperados. ' setting_apiv3_write_readonly_attributes: Acesso de gravação a atributos somente leitura @@ -4914,7 +4913,7 @@ pt-BR: setting_apiv3_write_readonly_attributes_warning: 'Esta configuração tem casos de uso, por exemplo, para importação de dados, mas permite que administradores criem itens em nome de outros usuários. Todas as solicitações de criação, no entanto, são registradas com o autor verdadeiro. ' - setting_apiv3_write_readonly_attributes_additional_html: 'For more information on attributes and supported resources, please see the [API documentation](api_documentation_link). + setting_apiv3_write_readonly_attributes_additional_html: 'Para obter mais informações sobre atributos e recursos suportados, consulte a [documentação da API](api_documentation_link). ' setting_apiv3_max_page_size: Tamanho máximo da página de API @@ -5016,7 +5015,7 @@ pt-BR: setting_work_package_properties: Propriedades do pacote de trabalho setting_work_package_startdate_is_adddate: Usar a data atual como data para início dos novos pacotes de trabalho setting_work_packages_projects_export_limit: Limite de exportação de pacote de trabalho / projetos - setting_journal_aggregation_time_minutes: Aggregation period + setting_journal_aggregation_time_minutes: Período de agregação setting_log_requesting_user: Registrar início de sessão do usuário, nome e endereço de e-mail para todas as requisições setting_login_required: Autenticação requerida setting_login_required_caption: Quando ativado, todas as solicitações ao aplicativo devem ser autenticadas. @@ -5099,12 +5098,12 @@ pt-BR: setting_welcome_text: Texto do bloco de boas-vindas setting_welcome_title: Título do bloco de boas-vindas setting_welcome_on_homescreen: Exibir bloco de boas-vindas na tela inicial - setting_work_packages_identifier_classic: Instance-wide numerical sequence (default) - setting_work_packages_identifier_classic_caption: 'Every work package gets a sequential number starting with 1 and incremented with every new one. The numbers are unique within this instance so they remain the same even if work packages are moved between projects. + setting_work_packages_identifier_classic: Sequência numérica global da instância (padrão) + setting_work_packages_identifier_classic_caption: 'Cada pacote de trabalho recebe um número sequencial começando em 1, que é aumentado a cada novo item. Os números são únicos nesta instância, portanto permanecem os mesmos mesmo que os pacotes de trabalho sejam movidos entre projetos. ' - setting_work_packages_identifier_semantic: Project-based semantic identifiers - setting_work_packages_identifier_semantic_caption: 'Every project has a unique identifier that is prefixed to the work package ID. If a work package moved to another project, a new identifier is generated but the old one continues to function. + setting_work_packages_identifier_semantic: Identificadores semânticos baseados em projeto + setting_work_packages_identifier_semantic_caption: 'Cada projeto possui um identificador único que é prefixado ao ID do pacote de trabalho. Se um pacote de trabalho for movido para outro projeto, um novo identificador é gerado, mas o antigo continua funcionando. ' setting_work_package_list_default_highlighting_mode: Modo de destaque padrão @@ -5288,11 +5287,11 @@ pt-BR: section_work_week: Semana de trabalho section_holidays_and_closures: Feriados e fechamentos work_packages: - work_package_identifier: Work package identifier + work_package_identifier: Identificador do pacote de trabalho not_allowed_text: Você não tem as permissões necessárias para visualizar esta página. activities: enable_internal_comments: Habilitar comentários internos - helper_text_html: 'Internal comments allow an internal team to communicate amongst themselves privately. These are only visible to selected roles that have the necessary permissions and will not be visible publicly. [Click here to learn more](docs_url) + helper_text_html: 'Os comentários internos permitem que uma equipe interna se comunique de forma privada entre si. Eles são visíveis apenas para funções selecionadas que possuem as permissões necessárias e não serão exibidos publicamente. [Clique aqui para saber mais](docs_url) ' text_formatting: @@ -5380,7 +5379,7 @@ pt-BR: text_default_administrator_account_changed: Conta do administrador padrão alterada text_default_encoding: 'Padrão: UTF-8' text_destroy: Excluir - text_destroy_with_associated: 'There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:' + text_destroy_with_associated: 'Há objetos adicionais associados ao(s) pacote(s) de trabalho que será(ão) excluído(s). Esses objetos são dos seguintes tipos:' text_destroy_what_to_do: O que você quer fazer? text_diff_truncated: "... Este diff foi truncado porque excede o tamanho máximo que pode ser exibido." text_email_delivery_not_configured: |- @@ -5435,10 +5434,10 @@ pt-BR: text_plugin_assets_writable: Diretório de plugins ativos é gravável text_powered_by: Desenvolvido por %{link} text_project_identifier_info: Apenas letras minúsculas (a-z), números, hífens e sublinhados são permitidos, deve-se começar com uma letra minúscula. - text_project_identifier_description: The project identifier is prepended to all work package IDs. If the identifier is "PROJ" for example, the work package identifier will be "PROJ-12" or "PROJ-246". - text_project_identifier_url_description: The project identifier is included in the URL of the project. - text_project_identifier_handle_format: Must start with a letter and contain only uppercase letters, numbers, and underscores (max 10 characters). - text_project_identifier_format: Must start with a lowercase letter. Only lowercase letters (a-z), numbers, dashes and underscores are allowed. + text_project_identifier_description: O identificador do projeto é prefixado a todos os IDs de pacote de trabalho. Se o identificador for “PROJ”, por exemplo, o identificador do pacote de trabalho será “PROJ-12” ou “PROJ-246”. + text_project_identifier_url_description: O identificador do projeto está incluído no URL do projeto. + text_project_identifier_handle_format: Deve começar com uma letra e conter apenas letras maiúsculas, números e underscores (máximo de 10 caracteres). + text_project_identifier_format: Deve começar com uma letra minúscula. Apenas letras minúsculas (a-z), números, hífens e underscores são permitidos. text_reassign: 'Reatribua ao pacote de trabalho:' text_regexp_multiline: 'A expressão regular é aplicada no modo multilinha. Por exemplo: ^---\s+' text_repository_usernames_mapping: Selecionar ou atualizar o usuário do OpenProject mapeado para cada nome de usuário encontrado no log do repositório. Os usuários com o mesmo nome de usuário OpenProject e repositório ou e-mail serão mapeados automaticamente. @@ -5549,10 +5548,10 @@ pt-BR: version_status_locked: bloqueado version_status_open: aberto note: Nota - note_password_login_disabled_link: Password login has been disabled through a [configuration setting](configuration_url). + note_password_login_disabled_link: O login por senha foi desativado por meio de um [ajuste de configuração](configuration_url). warning: Aviso warning_attachments_not_saved: "%{count} arquivo(s) não pôde(m) ser salvo(s)." - warning_imminent_user_limit_html: 'You invited more users than are supported by your current plan. Invited users may not be able to join your OpenProject environment. Please [upgrade your plan](upgrade_url) or block existing users in order to allow invited and registered users to join. + warning_imminent_user_limit_html: 'Você convidou mais usuários do que o seu plano atual suporta. Usuários convidados podem não conseguir acessar o seu ambiente OpenProject. [Faça upgrade do seu plano](upgrade_url) ou bloqueie usuários existentes para permitir que usuários convidados e registrados consigam entrar. ' warning_registration_token_expired: 'O e-mail de ativação expirou. Enviamos um novo para %{email}. Por favor, clique no link dentro dele para ativar sua conta. @@ -5561,7 +5560,7 @@ pt-BR: warning_user_limit_reached: 'A adição de usuários adicionais fará com que o limite atual seja excedido. Entre em contato com um administrador para aumentar o limite de usuários e garantir que usuários externos possam acessar esta instância. ' - warning_user_limit_reached_admin_html: 'Adding additional users will exceed the current limit. Please [upgrade your plan](upgrade_url) to be able to ensure external users are able to access this instance. + warning_user_limit_reached_admin_html: 'Adicionar mais usuários excederá o limite atual. [Faça upgrade do seu plano](upgrade_url) para garantir que usuários externos possam acessar esta instância. ' warning_user_limit_reached_instructions: 'Você atingiu seu limite de usuários (%{current}/%{max} usuários ativos). Entre em contato com sales@openproject.com para atualizar seu plano da edição Enterprise e adicionar novos usuários. @@ -5626,7 +5625,7 @@ pt-BR: reminders: label_remind_at: Data note_placeholder: Por que você está configurando este lembrete? - create_success_message_html: Reminder set successfully. You will receive a notification for this work package %{reminder_time}. + create_success_message_html: Lembrete definido com sucesso. Você receberá uma notificação para este pacote de trabalho %{reminder_time}. success_update_message: Lembrete atualizado com sucesso. success_deletion_message: Lembrete excluído com sucesso. sharing: @@ -5658,7 +5657,7 @@ pt-BR: warning_user_limit_reached: 'A adição de usuários adicionais fará com que o limite atual seja excedido. Entre em contato com um administrador para aumentar o limite de usuários e garantir que usuários externos possam acessar esta %{entity}. ' - warning_user_limit_reached_admin_html: 'Adding additional users will exceed the current limit. Please [upgrade your plan](upgrade_url) to be able to ensure external users are able to access this %{entity}. + warning_user_limit_reached_admin_html: 'Adicionar mais usuários excederá o limite atual. [Faça upgrade do seu plano](upgrade_url) para garantir que usuários externos possam acessar este %{entity}. ' warning_no_selected_user: Selecione os usuários com quem compartilhar este %{entity} @@ -5782,7 +5781,7 @@ pt-BR: project: Não revelado - O projeto está invisível devido à falta de permissões. ancestor: Não revelado - O ancestral está invisível devido à falta de permissões. definingProject: Não revelado - O projeto está invisível devido à falta de permissões. - definingWorkspace: Undisclosed - The workspace is invisible because of lacking permissions. + definingWorkspace: Não revelado - O espaço de trabalho está invisível devido à falta de permissões. doorkeeper: pre_authorization: status: Pré-autorização diff --git a/config/locales/crowdin/uk.yml b/config/locales/crowdin/uk.yml index e7448d5abdd..1b0c7fcef47 100644 --- a/config/locales/crowdin/uk.yml +++ b/config/locales/crowdin/uk.yml @@ -108,7 +108,7 @@ uk: trial: Пробний період jemalloc_allocator: Розподіл пам'яті Jemalloc journal_aggregation: - caption: 'User actions on a work package (changing description, status, values, or writing comments) are grouped if performed within this period. It also controls notification and [webhook](webhook_link) delays. + caption: 'Дії користувача над пакетом робіт (зміни опису, статусу чи значень або написання коментарів) групуються, якщо їх було виконано протягом цього періоду. Це налаштування також керує сповіщеннями й затримками [вебхука](webhook_link). ' import: @@ -125,8 +125,8 @@ uk: title: Конфігурація Jira new: Нова конфігурація banner: - title: Limited import capabilities - description: 'This Jira Migrator is currently in beta and can only import basic data: projects, issues (name, title, description, attachments), users (name, email, project membership), statuses, and types. It cannot import workflows, custom fields, issue relations, or permissions. We currently only support Jira Server/Data Center versions 10.x and 11.x. Cloud instances are not supported at this time.' + title: Обмежені можливості імпорту + description: 'Інструмент Jira Migrator зараз доступний лише як бета-версія і може імпортувати тільки основні дані: проєкти, задачі (назву, заголовок, опис, вкладення), користувачів (ім’я, електронну адресу, дані про участь у проєктах), статуси й типи. Він не може імпортувати робочі процеси, користувацькі поля, зв’язки між задачами чи дозволи. Зараз ми підтримуємо лише версії Jira Server / Data Center 10.x і 11.x. Хмарні екземпляри поки що не підтримуються.' form: fields: name: Назва @@ -162,9 +162,9 @@ uk: run: title: Цикл імпорту history: Історія - remove_error: A Jira import run cannot be removed while it is running + remove_error: Цикл імпорту Jira не можна видалити, поки він виконується import_blocked_error: Зараз виконується або очікує на перевірку ще один цикл імпорту Jira. Завершіть або скасуйте його, якщо потрібно почати новий імпорт. - project_identifier_taken: 'You are trying to import a project with an already used identifier: %{taken_identifier}. Please update the project identifier in Jira then click on Retry.' + project_identifier_taken: 'Ви намагаєтесь імпортувати проєкт з ідентифікатором, який уже використовується: %{taken_identifier}. Будь ласка, оновіть ідентифікатор проєкту в Jira, а потім натисніть на кнопку «Повторити спробу».' blank: title: Немає налаштованих циклів імпорту description: Створіть цикл імпорту, щоб почати переносити інформацію із цього екземпляра Jira @@ -187,11 +187,11 @@ uk: imported: Режим перевірки reverting: Скасування внесених змін revert_error: Помилка під час скасування внесених змін - revert_cancelling: Cancelling revert - revert_cancelled: Revert cancelled + revert_cancelling: Відміна скасування внесених змін + revert_cancelled: Скасування внесених змін відмінено reverted: Внесені зміни скасовано - finalizing: Finalizing - finalizing_error: Error during finalizing + finalizing: Завершення + finalizing_error: Помилка під час завершення finalizing_done: Завершено wizard: button_retry: Повторити спробу @@ -399,78 +399,78 @@ uk: notification_text_default: "

Вітаємо,

Новий проєкт створено: projectValue:name

Дякуємо

\n" work_packages_identifier: page_header: - description: Choose between classic numerical work package IDs or semantic project-specific ones that prepend the project identifier to the work package ID. + description: Виберіть класичні числові ідентифікатори пакетів робіт або семантичні із зазначенням проєкту (до ідентифікатора пакета робіт додається префікс з ідентифікатором проєкту). banner: - existing_identifiers_notice: 'Existing identifiers for %{project_count} projects don''t meet requirements for project-based semantic identifiers. OpenProject can automatically update these so that they are valid as in the examples below. Click on ''Autofix and save'' to update identifiers for all projects in this manner and enable project-based semantic identifiers. + existing_identifiers_notice: 'Наявні ідентифікатори для кількох проєктів (%{project_count}) не відповідають вимогам до семантичних ідентифікаторів із зазначенням проєктів. OpenProject може автоматично оновити їх, щоб вони стали дійсними, як показано в прикладах нижче. Натисніть кнопку «Виправити й зберегти», щоб оновити в такий спосіб ідентифікатори для всіх проєктів і ввімкнути семантичні ідентифікатори із зазначенням проєктів. ' box_header: label_project: Проєкт - label_previous_identifier: Previous identifier - label_autofixed_suggestion: Future identifier - label_example_work_package_id: Example work package ID + label_previous_identifier: Попередній ідентифікатор + label_autofixed_suggestion: Майбутній ідентифікатор + label_example_work_package_id: Приклад ідентифікатора пакета робіт autofix_preview: - error_too_long: Has to be 10 characters or fewer - error_numerical: Cannot be purely numerical - error_starts_with_number: Cannot start with a number - error_special_characters: Special characters not allowed - error_not_fully_uppercased: Must be uppercase - error_in_use: Already in use as another project's active handle - error_reserved: Reserved by another project's handle history - error_unknown: Needs manual review + error_too_long: Має містити щонайбільше 10 символів + error_numerical: Не може містити лише числа + error_starts_with_number: Не може починатись із числа + error_special_characters: Не дозволяється використовувати спеціальні символи + error_not_fully_uppercased: Літери мають бути великими + error_in_use: Уже використовується як активний дескриптор іншого проєкту + error_reserved: Зарезервовано в історії дескрипторів іншого проєкту + error_unknown: Потребує ручної перевірки remaining_projects: - one: "... 1 more project" - few: "... %{count} more projects" - many: "... %{count} more projects" - other: "... %{count} more projects" - button_autofix: Autofix and save + one: "… ще 1 проєкт" + few: "… ще %{count} проєкти" + many: "… ще %{count} проєктів" + other: "… ще %{count} проєкту" + button_autofix: Виправити й зберегти dialog: - title: Change work package identifiers - heading: Enable project-based work package IDs? - description: 'This will change IDs for all work packages in all projects in this instance. Previous identifiers and URLs will continue to redirect properly. This change will take some time to complete. + title: Змінити ідентифікатори пакетів робіт + heading: Увімкнути ідентифікатори пакетів робіт із зазначенням проєктів? + description: 'Це призведе до зміни ідентифікаторів усіх пакетів робіт у всіх проєктах цього екземпляра. Попередні ідентифікатори і URL-адреси й далі перенаправлятимуть, куди слід. Для впровадження цієї зміни знадобиться деякий час. ' - confirm_button: Change identifiers - checkbox_label: I understand that this will permanently change all work package IDs - success_banner: Successfully updated work package identifier format. + confirm_button: Змінити ідентифікатори + checkbox_label: Я розумію, що ця дія назавжди змінить усі ідентифікатори пакетів робіт + success_banner: Формат ідентифікаторів пакетів робіт успішно оновлено. in_progress: - banner_message: Project identifiers are currently being updated to project-based semantic identifiers. This may take some time. + banner_message: Ідентифікатори проєктів зараз замінюються на семантичні ідентифікатори із зазначенням проєктів. Це може зайняти деякий час. workflows: tabs: default_transitions: Стандартні переходи user_author: Користувач є автором user_assignee: Користувач є призначеною особою index: - description: Configure status transitions for each work package type. + description: Налаштуйте переходи статусів для кожного типу пакета робіт. type_filter: - label: Filter by type name… - status_button: Стан + label: Фільтрувати за назвою типу… + status_button: Статус statuses_dialog: - title: Statuses - label: Statuses enabled for this type - caption: Add or remove statuses you would like to associate with this type. Removing a status will also delete the workflow associated with it. + title: Статуси + label: Статуси, увімкнені для цього типу + caption: Додайте або видаліть статуси, які ви хочете пов’язати із цим типом. Вилучення статусу також призведе до видалення пов’язаного з ним робочого процесу. statuses_removal_dialog: - title: Remove statuses + title: Видалити статуси heading: - one: Remove 1 status? - few: Remove %{count} statuses? - many: Remove %{count} statuses? - other: Remove %{count} statuses? - description: Removing these statuses will make them unavailable to this type and delete existing workflows. Are you sure you want to proceed? + one: Видалити 1 статус? + few: Видалити %{count} статуси? + many: Видалити %{count} статусів? + other: Видалити %{count} статусу? + description: Якщо ви вилучите ці статуси, вони стануть недоступні для цього типу, а наявні робочі процеси буде видалено. Справді продовжити? confirm: Вилучити leave_confirmation: - title: Save changes before continuing? - description: You are about to leave this page but you have unsaved changes. Would you like to save them before continuing? - ignore: Ignore changes - save: Save changes and continue + title: Зберегти зміни перед продовженням? + description: Ви збираєтеся покинути цю сторінку, однак деякі зміни не збережено. Бажаєте зберегти їх, перш ніж продовжити? + ignore: Ігнорувати зміни + save: Зберегти зміни й продовжити role_selector: - label: 'Role: %{role}' - no_role: Select role + label: 'Роль: %{role}' + no_role: Виберіть роль blankslate: - title: No status transitions configured - description: Add statuses to start configuring workflows for this role + title: Переходи статусів не налаштовано + description: Додайте статуси, щоб почати налаштовувати робочі процеси для цієї ролі info: - database_deprecation_html: 'Starting with OpenProject 16.0, PostgreSQL 16 is required to use OpenProject. Your installation will remain functional with your current database, but anticipate incompatability in future releases.
We have prepared [upgrade guides for all installation methods](upgrade_guide). You can perform the upgrade ahead of the next release at any time by following the guides. + database_deprecation_html: 'Починаючи з OpenProject 16.0, для використання OpenProject потрібна версія PostgreSQL 16. Ваша конфігурація працюватиме з поточною базою даних, але передбачається несумісність із майбутніми випусками.
Ми підготували [посібники з оновлення для всіх методів встановлення](upgrade_guide). Дотримуючись цих інструкцій, ви можете виконати оновлення до наступного випуску в будь-який час. ' authentication: @@ -703,13 +703,13 @@ uk: confirmation_live_message_checked: Кнопка для продовження активна. confirmation_live_message_unchecked: Кнопка для продовження зараз неактивна. Щоб продовжити, поставте прапорець. pagination: - label: Pagination + label: Розбиття на сторінки prev: Попереднє - prev_page: Previous Page + prev_page: Попередня сторінка next: Наступний - next_page: Next Page + next_page: Наступна сторінка page: Сторінка %{number} - page_with_more: Page %{number}... + page_with_more: Сторінка %{number}… mcp_configurations: server_url_component: caption: URL-адреса для доступу до сервера MCP OpenProject. Потрібна для налаштування клієнтів MCP. @@ -717,13 +717,13 @@ uk: op_dry_validation: or: або errors: - unexpected_key: is not allowed. + unexpected_key: не дозволяється. array?: має бути масивом. decimal?: має бути десятковим числом. defined: не має визначатися. eql?: має бути «%{left}». filled?: "— слід заповнити." - format?: is in invalid format. + format?: має недійсний формат. greater_or_equal_zero: має бути більше ніж 0 або дорівнювати йому. gteq?: має бути більше ніж %{num} або дорівнювати цьому значенню. hash?: має бути гешом. @@ -750,9 +750,9 @@ uk: parent: not_descendant: має бути нащадком кореня ієрархії. str?: має бути рядком. - time?: must be a time. + time?: має бути часом. type?: має бути типом «%{type}». - uri?: is not a valid URI. + uri?: не є дійсною URL-адресою. rules: copy_workflow_from: Тип копії робочого процесу enabled: Увімкнено @@ -875,10 +875,10 @@ uk: ' change_identifier: Ідентифікатор змін - change_identifier_dialog_title: Change project identifier - change_identifier_format_hint_semantic: Only uppercase letters (A–Z), numbers or underscores. Max 10 characters. Must start with a letter. - change_identifier_format_hint_legacy: Only lowercase letters (a–z), numbers, dashes or underscores. - change_identifier_warning: 'This will permanently change identifiers and URLs of all work packages in this project. The previous identifier and URLs will nevertheless continue to redirect properly. + change_identifier_dialog_title: Змінити ідентифікатор проєкту + change_identifier_format_hint_semantic: Може містити лише великі літери (A–Z), цифри або символи підкреслення; усього — щонайбільше 10 символів. Має починатися з літери. + change_identifier_format_hint_legacy: Може містити лише малі літери (a–z), цифри, тире або символи підкреслення. + change_identifier_warning: 'Ця дія назавжди змінить ідентифікатори і URL-адреси всіх пакетів робіт у цьому проєкті. Однак попередні ідентифікатори і URL-адреси й далі перенаправлятимуть, куди слід. ' subitems: @@ -1188,63 +1188,63 @@ uk: group: Ця група тепер входить у проєкт «%{project}». Тим часом ви вже можете включати її в план і призначати їй пакети робіт. working_hours: current_schedule: - title: Current schedule - work_days: Work days - work_hours: Work hours - availability_factor: Availability factor - availability_subtitle: Dedicated to project work - effective_hours: Effective work hours - effective_subtitle: Per week + title: Поточний розклад + work_days: Робочі дні + work_hours: Робочі години + availability_factor: Коефіцієнт доступності + availability_subtitle: Час на роботу над проєктами + effective_hours: Ефективні робочі години + effective_subtitle: На тиждень not_set: Не встановлено future: - title: Future schedules - description: Plan working schedule changes ahead of time. Once the date arrives your working schedules will be updated automatically. - add_button: Add future schedule - blank_title: No future schedules planned - blank_description: Create a future schedule to plan changes ahead of time + title: Майбутні розклади + description: Заздалегідь плануйте зміни розкладів роботи. Коли настане відповідна дата, розклади буде оновлено автоматично. + add_button: Додати майбутній розклад + blank_title: Немає запланованих майбутніх розкладів + blank_description: Створіть майбутній розклад, щоб запланувати зміни заздалегідь history: - title: Schedule history - description: View your past work schedules. - blank_title: No schedule history yet - blank_description: Past schedule changes will appear here + title: Історія розкладів + description: Перегляньте свої минулі розклади роботи. + blank_title: Історії розкладів ще немає + blank_description: Тут з’являться минулі зміни розкладу destroy: - confirm: Are you sure you want to delete this working schedule? + confirm: Справді видалити цей розклад роботи? form: - title: Plan a future work schedule - title_current: Edit current work schedule + title: Планування майбутнього розкладу роботи + title_current: Редагування поточного розкладу роботи start_date: Дата початку - start_date_caption: Select the date from when the new work schedule will be effective. - work_days: Work days - working_hours_label: Working hours - hours_mode_label: Hours mode - same_hours_mode: Same hours per day - individual_hours_mode: Individual hours per day - work_hours: Work hours + start_date_caption: Виберіть дату, з якої почне діяти новий розклад роботи. + work_days: Робочі дні + working_hours_label: Робочі години + hours_mode_label: Режим годин + same_hours_mode: Однакові години на день + individual_hours_mode: Індивідуальні години на день + work_hours: Робочі години hours_per_day: Годин на день - per_day: per day - per_week: per week - total_work_hours: Total work hours - availability_description: The availability factor represents the actual percentage of your working time dedicated to project tasks. This accounts for meetings, emails, administrative work, and other non-project activities. - availability_factor: Availability factor - availability_factor_caption: Define the percentage of your working time dedicated to project work. - total_available_hours: Total available work hours - title_availability_factor: Availability factor + per_day: на день + per_week: на тиждень + total_work_hours: Усього робочих годин + availability_description: Коефіцієнт доступності — це фактичний відсоток робочого часу, який ви присвячуєте роботі над завданнями проєктів. Це дає змогу врахувати час, потрібний на зустрічі, електронну пошту, адміністративну роботу й інші види діяльності, не пов’язані з проєктами. + availability_factor: Коефіцієнт доступності + availability_factor_caption: Визначте відсоток свого робочого часу, який ви присвячуєте роботі над проєктами. + total_available_hours: Усього доступних робочих годин + title_availability_factor: Коефіцієнт доступності title_days_and_hours: Дні й години - title_future_dates: Future dates + title_future_dates: Майбутні дати table: - mobile_title: Working schedules + mobile_title: Розклади роботи start_date: Дата початку - work_days: Work days - work_hours: Work hours - availability_factor: Availability factor - effective_work_hours: Effective work hours + work_days: Робочі дні + work_hours: Робочі години + availability_factor: Коефіцієнт доступності + effective_work_hours: Ефективні робочі години work_days_count: - one: 1 working day - few: "%{count} working days" - many: "%{count} working days" - other: "%{count} working days" + one: 1 робочий день + few: "%{count} робочих дні" + many: "%{count} робочих днів" + other: "%{count} робочого дня" user_preferences: - disable_keyboard_shortcuts_caption: 'You can choose to disable default [keyboard shortcuts](docs_url) if you use a screen reader or want to avoid accidentally triggering an action with a shortcut. + disable_keyboard_shortcuts_caption: 'Ви можете вимкнути стандартні [комбінації клавіш](docs_url), якщо використовуєте невізуальний екран або хочете, щоб відповідні дії не запускалися, коли ви натискаєте ці комбінації клавіш випадково. ' page: @@ -1292,9 +1292,8 @@ uk: status_default_text: Цей тип за замовчуванням мають нові пакети робіт. Вони не можуть бути доступні лише для читання. status_excluded_from_totals_text: Поставте цей прапорець, щоб виключити пакети робіт із цим статусом із підсумків атрибутів «Робота», «Залишок роботи» й «% завершення» в ієрархії. status_percent_complete_text_html: |- - In [status-based progress calculation mode](setting_url), the % Complete of a work - package is automatically set to this value when this status is selected. - Ignored in work-based mode. + У [режимі обчислення прогресу на основі статусу](setting_url) для атрибута «% завершення» пакета робіт автоматично встановлюється це значення, коли вибрано цей статус. + Ігнорується в режимі на основі роботи. status_readonly_html: | Установіть цей прапорець, щоб позначити пакети робіт із цим статусом як доступні лише для читання. Крім статусу, ви не зможете змінювати жодні атрибути. @@ -1837,11 +1836,11 @@ uk: consented_at: Згоден на group: identity_url: URL-адреса ідентичності - parent: Parent group - organizational_unit: Organizational unit + parent: Батьківська група + organizational_unit: Організаційний підрозділ group_detail: - parent: Parent group - organizational_unit: Organizational unit + parent: Батьківська група + organizational_unit: Організаційний підрозділ user_preference: header_look_and_feel: Оформлення header_alerts: Сповіщення @@ -1876,21 +1875,21 @@ uk: user_working_hours: valid_from: Діє з monday: Понеділок - monday_hours: Monday hours + monday_hours: Години понеділка tuesday: Вівторок - tuesday_hours: Tuesday hours + tuesday_hours: Години вівторка wednesday: Середа - wednesday_hours: Wednesday hours + wednesday_hours: Години середи thursday: Четвер - thursday_hours: Thursday hours + thursday_hours: Години четверга friday: П'ятниця - friday_hours: Friday hours + friday_hours: Години п’ятниці saturday: Субота - saturday_hours: Saturday hours + saturday_hours: Години суботи sunday: Неділя - sunday_hours: Sunday hours - availability_factor: Availability factor - shared_hours: Work hours + sunday_hours: Години неділі + availability_factor: Коефіцієнт доступності + shared_hours: Робочі години days: Робочі дні version: effective_date: Дата закінчення @@ -1946,8 +1945,8 @@ uk: before: має бути раніше %{date} before_or_equal_to: має бути до або %{date} blank: не може бути порожнім. - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. + not_before_start_date: не має передувати даті початку. + overlapping_range: збігається з наявним діапазоном неробочих днів. blank_nested: "– потрібно встановити властивість «%{property}»." cannot_delete_mapping: "– обов’язкове. Неможливо видалити." is_for_all_cannot_modify: призначений для всіх проєктів, тому його не можна бути змінити. @@ -1984,9 +1983,9 @@ uk: less_than_or_equal_to: має бути меншим або рівним %{count} not_available: "– недоступно через налаштування системи." not_deletable: не можна видалити. - not_editable: cannot be edited because it is already in effect. + not_editable: уже використовується, тому вносити зміни не можна. not_current_user: не поточний користувач. - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. + system_wide_non_working_day_exists: конфліктує з наявним загальним неробочим днем, указаним для цієї дати. not_found: не знайдено. not_a_date: не є дійсною датою. not_a_datetime: не є дійсним датою. @@ -2023,7 +2022,7 @@ uk: group: attributes: parent_id: - circular_dependency: would create a circular group hierarchy. + circular_dependency: призведе до створення ієрархії циклічної групи. ldap_auth_source: attributes: tls_certificate_string: @@ -2139,8 +2138,8 @@ uk: types: in_use_by_work_packages: 'як і раніше використовуються робочі пакети: %{types}' identifier: - must_start_with_letter: must start with a letter - no_special_characters: may only contain uppercase letters, numbers, and underscores + must_start_with_letter: має починатися з літери + no_special_characters: може містити лише великі літери, цифри й символи підкреслення enabled_modules: dependency_missing: Модуль «%{dependency}» потрібно також увімкнути, оскільки від нього залежить модуль «%{module}». format: "%{message}" @@ -2350,7 +2349,7 @@ uk: user_working_hours: attributes: days: - no_working_day: At least one day needs to be configured as a working day. + no_working_day: Принаймні один день має бути робочим. member: principal_blank: Виберіть принаймні одного користувача або групу. role_blank: повинні бути призначені. @@ -3158,8 +3157,8 @@ uk: ' domain_caption: Маркер буде дійсним для вашого поточного імені хосту. - receive_newsletter: I want to receive the OpenProject [newsletter](newsletter_url). - consent: I agree with the [terms of service](tos_url) and the [privacy policy](privacy_url). + receive_newsletter: Я хочу отримувати [інформаційний бюлетень](newsletter_url) OpenProject. + consent: Я погоджуюся з [умовами використання](tos_url) й [політикою конфіденційності](privacy_url). email_calendar_updates: state: disabled: Вимкнено. @@ -3425,13 +3424,13 @@ uk: ' new_features_list: - line_0: 'Big Agile update: dedicated sprint objects, all work packages visible on Backlogs, and automatic sprint board creation.' - line_1: In-place editing of project attributes on the Project Overview page. - line_2: Sharing of meeting templates (Basic plan and higher). - line_3: Better search in Time and Costs, Boards, and more. - line_4: Option to safely change project identifiers. - line_5: Improved workflow configuration for administrators. - line_6: Action boards released to Community. + line_0: 'Велике оновлення Agile: спеціальні об’єкти спринтів, відображення всіх пакетів робіт у розділі беклогів, а також автоматичне створення дощок спринтів.' + line_1: Редагування атрибутів проєкту на місці на сторінці «Огляд проєкту». + line_2: Надання доступу до шаблонів нарад (починаючи з тарифного плану Basic). + line_3: Покращений пошук у розділах «Час і витрати», «Дошки» тощо. + line_4: Налаштування, що дає змогу безпечно змінювати ідентифікатори проєктів. + line_5: Покращене налаштування робочих процесів для адміністраторів. + line_6: Випуск дощок дій для версії Community. links: upgrade_enterprise_edition: Оновлення до версії Enterprise postgres_migration: Міграція інсталяції в PostgreSQL @@ -3496,15 +3495,15 @@ uk: progress_calculation_adjusted: Результати обчислення прогресу автоматично скориговано відповідно до оновленої версії. scheduling_mode_adjusted: Режим планування автоматично змінюється з оновленням версії. totals_removed_from_childless_work_packages: Результати обчислення обсягу й прогресу виконання роботи автоматично вилучено з небатьківських пакетів робіт з оновленням версії. Це завдання з технічного обслуговування, і його можна ігнорувати. - sprint_migration: Version '%{version_name}' has been copied as a sprint. + sprint_migration: Версію «%{version_name}» скопійовано як спринт. total_percent_complete_mode_changed_to_work_weighted_average: Дочірні пакети робіт без атрибута «Робота» ігноруються. total_percent_complete_mode_changed_to_simple_average: Значення атрибута «Робота» дочірніх пакетів робіт ігноруються. links: configuration_guide: Посібник з налаштування get_in_touch: У вас виникли запитання? Зв'яжіться з нами. - instructions_after_registration_link: You can sign in as soon as your account has been activated by clicking [here](signin_url). - instructions_after_logout_link: You can sign in again by clicking [here](signin_url). - instructions_after_error_link: You can try to sign in again by clicking [here](signin_url). If the error persists, ask your admin for help. + instructions_after_registration_link: Щойно ваш обліковий запис буде активовано, ви зможете ввійти, перейшовши за [цим посиланням](signin_url). + instructions_after_logout_link: Ви можете ввійти знову, перейшовши за [цим посиланням](signin_url). + instructions_after_error_link: Ви можете спробувати ввійти знову, перейшовши за [цим посиланням](signin_url). Якщо помилка не зникне, зверніться до адміністратора за допомогою. menus: admin: ai: Штучний інтелект (ШІ) @@ -3517,10 +3516,10 @@ uk: label: Додати… my_account: notifications_and_email: - title: Notification and email + title: Сповіщення й електронні листи tabs: - notifications: Notification settings - email_reminders: Email reminders + notifications: Налаштування сповіщень + email_reminders: Нагадування електронною поштою access_tokens: description: Маркери постачальника послуг випускаються в OpenProject, що дає змогу іншим додаткам отримувати до них доступ. Клієнтські маркери випускаються іншими додатками, що дає змогу OpenProject отримати до них доступ. no_results: @@ -3585,70 +3584,70 @@ uk: unknown_storage: Невідоме сховище email_reminders: immediate_reminders: - title: Send me an email reminder - mentioned: Notify me when I am mentioned - personal_reminder: Notify me for personal reminders + title: Надсилати мені нагадування електронною поштою + mentioned: Повідомляти мене, коли мене згадують + personal_reminder: Повідомляти мене про персональні нагадування daily_reminders: - title: Send me daily email reminders for unread notifications - caption: You will receive these reminders only for unread notifications and only at hours you specify. Until you configure a time zone for your account, the times will be interpreted to be in UTC. - enabled: Enable daily email reminders - add_time: Add time - remove_time: Remove time - time_slot_label: Reminder time (UTC) + title: Надсилати мені щоденні нагадування електронною поштою про непрочитані сповіщення + caption: Ви отримуватимете лише нагадування про непрочитані сповіщення, і вони надходитимуть тільки у вказаний вами час. Доки ви не налаштуєте для свого облікового запису часовий пояс, використовуватиметься UTC. + enabled: Увімкнути щоденні нагадування електронною поштою + add_time: Додати час + remove_time: Вилучити час + time_slot_label: Час нагадування (UTC) workdays: - title: Receive email reminders on these days - submit_button: Update reminder days + title: Отримувати нагадування електронною поштою в ці дні + submit_button: Оновити дні нагадувань pause_reminders: - title: Pause email notifications - enabled: Temporarily pause daily email reminders - date_range: Pause period + title: Призупинити сповіщення електронною поштою + enabled: Тимчасово призупинити щоденні нагадування, що надсилаються електронною поштою + date_range: Період призупинення email_alerts: - title: Email alerts for other items that are not work packages - news_added: News added - news_commented: Comment on a news item - document_added: Document added - forum_messages: Forum message posted - wiki_page_added: Wiki page added - wiki_page_updated: Wiki page updated - membership_added: Membership added - membership_updated: Membership updated - submit_button: Update alerts + title: Сповіщення електронною поштою для інших елементів, які не є пакетами робіт + news_added: Новину додано + news_commented: Коментар щодо новини + document_added: Документ додано + forum_messages: Повідомлення на форумі опубліковано + wiki_page_added: Wiki-сторінку додано + wiki_page_updated: Wiki-сторінку оновлено + membership_added: Членство додано + membership_updated: Членство оновлено + submit_button: Оновити сповіщення notifications: participating: - title: Participating - submit_button: Update preferences - mentioned: Mentioned - watched: Watching - assignee: Assignee - responsible: Accountable - shared: Shared with me + title: Бере участь + submit_button: Оновити налаштування + mentioned: Вас згадали + watched: Відстеження + assignee: Виконавець + responsible: Відповідальний + shared: Доступ надано мені date_alerts: - title: Date alerts - submit_button: Update date alerts - start_date: Start date - due_date: Finish date - overdue: Overdue + title: Сповіщення про дати + submit_button: Оновити сповіщення про дати + start_date: Дата початку + due_date: Дата завершення + overdue: Прострочено times: - same_day: On the same day - one_day_before: 1 day before - three_days_before: 3 days before - seven_days_before: 7 days before - one_day_after: 1 day after - three_days_after: 3 days after - seven_days_after: 7 days after + same_day: Того самого дня + one_day_before: За 1 день + three_days_before: За 3 дні + seven_days_before: За 7 днів + one_day_after: Через 1 день + three_days_after: Через 3 дні + seven_days_after: Через 7 днів non_participating: - title: Non-participating - submit_button: Update preferences - work_package_created: New work packages - work_package_commented: All new comments - work_package_processed: All status changes - work_package_prioritized: All priority changes - work_package_scheduled: All date changes + title: Не бере участі + submit_button: Оновити налаштування + work_package_created: Нові пакети робіт + work_package_commented: Усі нові коментарі + work_package_processed: Усі зміни статусу + work_package_prioritized: Усі зміни пріоритету + work_package_scheduled: Усі зміни дат project_specific_settings: - title: Project-specific notification settings - add_button: Add project-specific notifications - dialog_title: Add project-specific notifications - list_header: Projects with specific notifications + title: Налаштування сповіщень щодо проєктів + add_button: Додати сповіщення щодо проєктів + dialog_title: Додати сповіщення щодо проєктів + list_header: Проєкти зі спеціальними сповіщеннями notifications: reasons: assigned: Виконавець @@ -3721,7 +3720,7 @@ uk: label_ical_access_key_generation_hint: Автоматично створено під час оформлення підписки на календар. label_ical_access_key_latest: останні label_ical_access_key_revoke: Анулювати - label_integrations: Integrations + label_integrations: Інтеграції label_add_column: Додати стовпець label_applied_status: Застосовний статус label_archive_project: Архівний проект @@ -3937,7 +3936,7 @@ uk: label_subject_or_id: Тема або ідентифікатор label_calendar_subscriptions: Підписки на календарі label_identifier: Ідентифікатор - label_project_identifier: Project identifier + label_project_identifier: Ідентифікатор проєкту label_in: в label_in_less_than: менш ніж label_in_more_than: більше ніж @@ -4071,13 +4070,13 @@ uk: label_news_view_all: Подивитися всі новини label_next: Далі label_next_week: Наступний тиждень - label_next_year: Next year + label_next_year: Наступний рік label_no_change_option: "(Немає змін)" label_no_data: Немає даних для відображення label_no_due_date: немає дати завершення label_no_start_date: немає дати початку label_no_parent_page: Немає початкової сторінки - label_no_parent_group: "(No parent group)" + label_no_parent_group: "(Немає батьківської групи)" label_notification_center_plural: Сповіщення label_nothing_display: Нічого не відображається label_nobody: жодні @@ -4106,7 +4105,7 @@ uk: label_overall_activity: Загальна активність label_overview: Огляд label_page_title: Заголовок сторінки - label_parent_group_caption: 'Setting a parent group will make this group a subgroup of the selected parent group. This will also inherit all memberships, including permissions of the parent group. + label_parent_group_caption: 'Якщо вказати батьківську групу, ця група стане її підгрупою. Вона також успадкує всі дані про членство, зокрема дозволи батьківської групи. ' label_part_of: частина @@ -4135,7 +4134,7 @@ uk: label_preview_not_available: Попередній перегляд недоступний label_previous: Попередній label_previous_week: Попередній тиждень - label_previous_year: Previous year + label_previous_year: Попередній рік label_principal_invite_via_email: або запрошувати нових користувачів електронною поштою label_principal_search: Додати існуючих користувачів або групи label_privacy_policy: Політика конфіденційності та безпеки даних @@ -4247,7 +4246,7 @@ uk: label_start_to_start: початок label_statistics: Статистика label_status: Стан - label_status_plural: Statuses + label_status_plural: Статуси label_storage_free_space: Залишок на диску label_storage_used_space: Використовується дисковий простір label_storage_group: Зберігання файлової системи %{identifier} @@ -4386,19 +4385,19 @@ uk: zero: немає файлів label_x_days: one: 1 день - few: "%{count} days" - many: "%{count} days" - other: "%{count} дн." + few: "%{count} дні" + many: "%{count} днів" + other: "%{count} дня" label_x_working_days: - one: 1 working day - few: "%{count} working days" - many: "%{count} working days" - other: "%{count} working days" + one: 1 робочий день + few: "%{count} робочих дні" + many: "%{count} робочих днів" + other: "%{count} робочого дня" label_x_working_days_time_off: - one: 'Time off: 1 working day' - few: 'Time off: %{count} working days' - many: 'Time off: %{count} working days' - other: 'Time off: %{count} working days' + one: 'Вільний час: 1 робочий день' + few: 'Вільний час: %{count} робочих дні' + many: 'Вільний час: %{count} робочих днів' + other: 'Вільний час: %{count} робочого дня' label_yesterday: вчора label_zen_mode: Режим «Дзен» label_role_type: Тип @@ -4407,22 +4406,22 @@ uk: label_not_changeable: "(не змінюється)" label_global: Глобальний label_seeded_from_env_warning: Цей запис створено за допомогою змінної середовища конфігурації. Його не можна змінити в інтерфейсі користувача. - label_schedule_and_availability: Schedule and availability - label_working_hours: Work schedule - label_non_working_days: Availability calendar - label_non_working_days_with_count: Non-working days (%{count}) + label_schedule_and_availability: Розклад і доступність + label_working_hours: Розклад роботи + label_non_working_days: Календар доступності + label_non_working_days_with_count: Неробочі дні (%{count}) label_non_working_days_summary: Резюме - button_add_non_working_time: Time off - button_edit_non_working_time: Edit time off - label_continued_from_previous_year: continued from previous year - label_continues_into_next_year: continues into next year + button_add_non_working_time: Вільний час + button_edit_non_working_time: Редагувати вільний час + label_continued_from_previous_year: продовжується з попереднього року + label_continues_into_next_year: продовжується наступного року label_end_date: Дата закінчення label_working_days: Робочі дні - label_non_working_times_with_count: "%{year} time off (%{count})" - label_non_working_times_summary: "%{year} summary" - label_total_user_non_working_times: Personal non-working days - label_total_global_non_working_days: Global non-working days - label_total_days_off: Total days off + label_non_working_times_with_count: Вільний час за %{year} р. (%{count}) + label_non_working_times_summary: Зведення за %{year} р. + label_total_user_non_working_times: Особисті неробочі дні + label_total_global_non_working_days: Загальні неробочі дні + label_total_days_off: Усього вихідних днів macro_execution_error: Помилка виконання макросу %{macro_name} macro_unavailable: Макрос %{macro_name} не може бути відображений. macros: @@ -4457,7 +4456,7 @@ uk: center: Центр сповіщень see_in_center: Переглянути коментарі у центрі сповіщень settings: Змінити налаштування електронної пошти - salutation: Hello %{user}, + salutation: Добрий день, %{user}! salutation_full_name: Повне ім’я work_packages: created_at: Створено о %{timestamp} користувачем %{user}  @@ -4651,7 +4650,7 @@ uk: notice_parent_item_not_found: Батьківський об’єкт не знайдено. notice_project_not_deleted: Проект не був видалений. notice_project_not_found: Проєкт не знайдено. - notice_smtp_address_unsafe_env_hint: SMTP address %{address} is not safe. Please add it to the whitelist using the %{env_name} environment variable. + notice_smtp_address_unsafe_env_hint: SMTP-адреса %{address} не є безпечною. Будь ласка, додайте її в білий список, використовуючи змінну середовища %{env_name}. notice_successful_connection: Підключення успішно встановлене. notice_successful_create: Створення успішно завершене. notice_successful_delete: Видалення успішно завершене. @@ -4778,12 +4777,12 @@ uk: permission_manage_versions: Управління версіями permission_manage_wiki: Управління wiki permission_manage_wiki_menu: Керування wiki-меню - permission_manage_own_working_times: Manage own working times - permission_manage_own_working_times_explanation: 'Allows users to manage their own working times, and personal non-working days. + permission_manage_own_working_times: Керувати власним робочим часом + permission_manage_own_working_times_explanation: 'Дозволяє користувачам керувати власним робочим часом і особистими неробочими днями. ' - permission_manage_working_times: Manage working times for all users - permission_manage_working_times_explanation: 'Allows users to manage working times for all users, including personal non-working days. + permission_manage_working_times: Керуйте робочим часом для всіх користувачів + permission_manage_working_times_explanation: 'Дозволяє керувати робочим часом усіх користувачів, зокрема особистими неробочими днями. ' permission_move_work_packages: Переміщення робочих пакетів @@ -5042,7 +5041,7 @@ uk: setting_apiv3_cors_title: Спільне використання ресурсів із різних джерел (CORS) setting_apiv3_cors_enabled: Увімкнути CORS setting_apiv3_cors_origins: Дозволені джерела CORS (Cross-Origin Resource Sharing) в API версії 3 - setting_apiv3_cors_origins_instructions_html: 'If CORS is enabled, these are the origins that are allowed to access OpenProject API.
Please check the [Documentation on the Origin header](docs_url) on how to specify the expected values. + setting_apiv3_cors_origins_instructions_html: 'Якщо CORS увімкнено, це джерела, які можуть отримувати доступ до OpenProject API.
Щоб дізнатися, як указати очікувані значення, ознайомтеся з [документацією щодо заголовка джерела](docs_url). ' setting_apiv3_write_readonly_attributes: Дозвіл для записування атрибутів лише для читання @@ -5052,7 +5051,7 @@ uk: setting_apiv3_write_readonly_attributes_warning: 'Це налаштування використовується, наприклад, для імпорту даних, але дає змогу адміністраторам створювати елементи від імені інших користувачів. Однак усі запити на створення реєструються із зазначенням справжнього автора. ' - setting_apiv3_write_readonly_attributes_additional_html: 'For more information on attributes and supported resources, please see the [API documentation](api_documentation_link). + setting_apiv3_write_readonly_attributes_additional_html: 'Щоб дізнатися більше про атрибути й підтримувані ресурси, ознайомтеся з [документацією API](api_documentation_link). ' setting_apiv3_max_page_size: Максимальний розмір сторінки API @@ -5154,7 +5153,7 @@ uk: setting_work_package_properties: Властивості робочого пакета setting_work_package_startdate_is_adddate: Використовувати поточну дату в якості дати початку роботи для нових пакетів setting_work_packages_projects_export_limit: Ліміт експорту пакетів робіт / проєктів - setting_journal_aggregation_time_minutes: Aggregation period + setting_journal_aggregation_time_minutes: Період агрегації setting_log_requesting_user: Запишіть логін користувача, ім'я та поштову адресу для всіх запитів setting_login_required: Необхідна аутентифікація setting_login_required_caption: Якщо встановлено, усі запити до додатка мають проходити автентифікацію. @@ -5237,12 +5236,12 @@ uk: setting_welcome_text: Текст блоку привітання setting_welcome_title: Заголовок вітального блоку setting_welcome_on_homescreen: Відображати вітальний блок на робочому столі - setting_work_packages_identifier_classic: Instance-wide numerical sequence (default) - setting_work_packages_identifier_classic_caption: 'Every work package gets a sequential number starting with 1 and incremented with every new one. The numbers are unique within this instance so they remain the same even if work packages are moved between projects. + setting_work_packages_identifier_classic: Числова послідовність для всього екземпляра (за умовчанням) + setting_work_packages_identifier_classic_caption: 'Кожному пакету робіт присвоюється порядковий номер, який починається з одиниці й збільшується з кожним новим пакетом. Номери є унікальними в межах цього екземпляра, тому залишаються незмінними, навіть якщо пакети робіт переміщуються між проєктами. ' - setting_work_packages_identifier_semantic: Project-based semantic identifiers - setting_work_packages_identifier_semantic_caption: 'Every project has a unique identifier that is prefixed to the work package ID. If a work package moved to another project, a new identifier is generated but the old one continues to function. + setting_work_packages_identifier_semantic: Семантичні ідентифікатори із зазначенням проєктів + setting_work_packages_identifier_semantic_caption: 'Кожен проєкт має унікальний ідентифікатор, який додається як префікс до ідентифікатора пакета робіт. Якщо пакет робіт переміщується в інший проєкт, генерується новий ідентифікатор, однак старий продовжує працювати. ' setting_work_package_list_default_highlighting_mode: Режим виділення за умовчанням @@ -5426,11 +5425,11 @@ uk: section_work_week: Робочий тиждень section_holidays_and_closures: Свята й вихідні work_packages: - work_package_identifier: Work package identifier + work_package_identifier: Ідентифікатор пакета робіт not_allowed_text: У вас немає дозволів для перегляду цієї сторінки. activities: enable_internal_comments: Увімкнути внутрішні коментарі - helper_text_html: 'Internal comments allow an internal team to communicate amongst themselves privately. These are only visible to selected roles that have the necessary permissions and will not be visible publicly. [Click here to learn more](docs_url) + helper_text_html: 'Завдяки внутрішнім коментарям учасники внутрішньої команди можуть спілкуватися одне з одним приватно. Ці коментарі доступні лише користувачам із певними ролями й необхідними дозволами; вони ніколи не відображаються для всіх. [Натисніть тут, щоб дізнатися більше.](docs_url) ' text_formatting: @@ -5518,7 +5517,7 @@ uk: text_default_administrator_account_changed: Обліковий запис адміністратора за замовчуванням змінений text_default_encoding: 'По замовчуванню: UTF-8' text_destroy: Видалити - text_destroy_with_associated: 'There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:' + text_destroy_with_associated: 'Існують додаткові об’єкти, пов’язані з пакетом(-ами) робіт, які потрібно видалити. Це об’єкти таких типів:' text_destroy_what_to_do: Що ти хочеш зробити? text_diff_truncated: "... Це порівняння (diff) було скорочене, оскільки воно перевищує максимальний розмір, який можна відобразити." text_email_delivery_not_configured: |- @@ -5577,10 +5576,10 @@ uk: text_plugin_assets_writable: Каталог ресурсів модулів доступний для запису text_powered_by: Працює на %{link} text_project_identifier_info: Допускаються тільки рядкові малі букви (a-z), цифри, тире та нижнє підкреслення. Початок має бути з малої літери. - text_project_identifier_description: The project identifier is prepended to all work package IDs. If the identifier is "PROJ" for example, the work package identifier will be "PROJ-12" or "PROJ-246". - text_project_identifier_url_description: The project identifier is included in the URL of the project. - text_project_identifier_handle_format: Must start with a letter and contain only uppercase letters, numbers, and underscores (max 10 characters). - text_project_identifier_format: Must start with a lowercase letter. Only lowercase letters (a-z), numbers, dashes and underscores are allowed. + text_project_identifier_description: Префікс з ідентифікатором проєкту додається до всіх ідентифікаторів пакетів робіт. Наприклад, якщо ідентифікатор проєкту — PROJ, то ідентифікатором пакета робіт може бути PROJ-12 чи PROJ-246. + text_project_identifier_url_description: Ідентифікатор проєкту міститься в URL-адресі проєкту. + text_project_identifier_handle_format: Має починатися з літери й містити лише великі літери, цифри й символи підкреслення (усього — щонайбільше 10). + text_project_identifier_format: Має починатися з малої літери й містити лише малі літери (a–z), цифри, тире й символи підкреслення. text_reassign: 'Перепризначити робочому пакету:' text_regexp_multiline: Реестр застосовується в багаторядковому режимі. наприклад, --- --- text_repository_usernames_mapping: |- @@ -5695,10 +5694,10 @@ uk: version_status_locked: Заблоковано version_status_open: відкрити note: Замітка - note_password_login_disabled_link: Password login has been disabled through a [configuration setting](configuration_url). + note_password_login_disabled_link: Вхід із використанням пароля було вимкнено за допомогою [налаштування конфігурації](configuration_url). warning: Попередження warning_attachments_not_saved: "%{count} Не вдалося зберегти файл (файли)." - warning_imminent_user_limit_html: 'You invited more users than are supported by your current plan. Invited users may not be able to join your OpenProject environment. Please [upgrade your plan](upgrade_url) or block existing users in order to allow invited and registered users to join. + warning_imminent_user_limit_html: 'Ви запросили більше користувачів, ніж кількість, яку підтримує ваш поточний план. У запрошених користувачів може не бути змоги приєднатися до вашого середовища OpenProject. Будь ласка, [оновіть свій план](upgrade_url) або заблокуйте наявних користувачів, щоб дати змогу приєднатися запрошеним користувачам, які зареєструвалися. ' warning_registration_token_expired: 'Термін дії електронної пошти для активації минув. Ми надіслали вам нову %{email} Натисніть посилання в ньому, щоб активувати свій обліковий запис. @@ -5707,7 +5706,7 @@ uk: warning_user_limit_reached: 'Додавання користувачів призведе до перевищення поточного ліміту. Зверніться до адміністратора, щоб збільшити ліміт користувачів і таким чином забезпечити доступ до цього екземпляра зовнішнім користувачам. ' - warning_user_limit_reached_admin_html: 'Adding additional users will exceed the current limit. Please [upgrade your plan](upgrade_url) to be able to ensure external users are able to access this instance. + warning_user_limit_reached_admin_html: 'Додавання користувачів призведе до перевищення поточного ліміту. [Оновіть свій план](upgrade_url), щоб забезпечити доступ до цього екземпляра зовнішнім користувачам. ' warning_user_limit_reached_instructions: 'Ви досягли обмеження користувача (%{current}/%{max} активних користувачів). Напишіть на адресу sales@openproject.com, щоб перейти на версію Enterprise і додати більше користувачів. @@ -5804,7 +5803,7 @@ uk: warning_user_limit_reached: 'Додавання користувачів призведе до перевищення поточного ліміту. Зверніться до адміністратора, щоб збільшити ліміт користувачів і таким чином забезпечити доступ до цього %{entity} зовнішнім користувачам. ' - warning_user_limit_reached_admin_html: 'Adding additional users will exceed the current limit. Please [upgrade your plan](upgrade_url) to be able to ensure external users are able to access this %{entity}. + warning_user_limit_reached_admin_html: 'Додавання користувачів призведе до перевищення поточного ліміту. [Оновіть свій план](upgrade_url), щоб забезпечити доступ до %{entity} зовнішнім користувачам. ' warning_no_selected_user: Виберіть користувачів, яким потрібно надати спільний доступ до цього %{entity} @@ -5928,7 +5927,7 @@ uk: project: 'Нерозкритий: проєкт невидимий через відсутність дозволів.' ancestor: Нерозкритий – предок невидимий через відсутність дозволів. definingProject: 'Нерозкритий: проєкт невидимий через відсутність дозволів.' - definingWorkspace: Undisclosed - The workspace is invisible because of lacking permissions. + definingWorkspace: 'Нерозкритий: робочий простір невидимий через відсутність дозволів.' doorkeeper: pre_authorization: status: Попередня авторизація diff --git a/config/locales/crowdin/zh-CN.yml b/config/locales/crowdin/zh-CN.yml index def7cd1a66c..f4127b8b680 100644 --- a/config/locales/crowdin/zh-CN.yml +++ b/config/locales/crowdin/zh-CN.yml @@ -108,7 +108,7 @@ zh-CN: trial: 试用 jemalloc_allocator: 使用 jemalloc 内存分配器 journal_aggregation: - caption: 'User actions on a work package (changing description, status, values, or writing comments) are grouped if performed within this period. It also controls notification and [webhook](webhook_link) delays. + caption: '如果用户对工作包执行的操作(更改描述、状态、数值或编写评论)是在此时间段内完成的,则会将这些操作分为一组。此设置还控制着通知和 [webhook](webhook_link) 延迟。 ' import: @@ -125,7 +125,7 @@ zh-CN: title: Jira 配置 new: 新配置 banner: - title: Limited import capabilities + title: 有限导入功能 description: Jira Migrator 目前处于测试阶段,只能导入基本数据:项目、问题(名称、标题、描述、附件)、用户(名称、电子邮件地址、项目成员资格)、状态和类型。不能导入工作流、自定义字段、问题关系或权限。我们目前仅支持 Jira Server/Data Center 版本 10.x 和 11.x。目前不支持云实例。 form: fields: @@ -162,9 +162,9 @@ zh-CN: run: title: 导入运行 history: 历史记录 - remove_error: A Jira import run cannot be removed while it is running + remove_error: 无法移除正在运行的 Jira 导入运行 import_blocked_error: 另一个 Jira 导入运行当前正在执行或等待审核。请先完成或撤消当前运行,然后再开始新的导入。 - project_identifier_taken: 'You are trying to import a project with an already used identifier: %{taken_identifier}. Please update the project identifier in Jira then click on Retry.' + project_identifier_taken: 您尝试导入的项目所使用的标识符 %{taken_identifier} 已经用过。请在 Jira 中更新项目标识符,然后点击“重试”。 blank: title: 尚未设置导入运行 description: 创建导入运行,开始从此 Jira 实例中导入信息 @@ -381,72 +381,78 @@ zh-CN: notification_text_default: "

您好!

已创建一个新项目:projectValue:name

谢谢

\n" work_packages_identifier: page_header: - description: Choose between classic numerical work package IDs or semantic project-specific ones that prepend the project identifier to the work package ID. + description: 可以选择经典的数字工作包 ID,或者工作包 ID 前面添加了项目标识符的语义化项目特定工作包 ID。 banner: - existing_identifiers_notice: 'Existing identifiers for %{project_count} projects don''t meet requirements for project-based semantic identifiers. OpenProject can automatically update these so that they are valid as in the examples below. Click on ''Autofix and save'' to update identifiers for all projects in this manner and enable project-based semantic identifiers. - - ' + existing_identifiers_notice: "%{project_count} 项目的现有标识符不符合基于项目的语义标识符要求。OpenProject 可自动更新这些标识符,使其成为如下例中的有效格式。点击“自动修复并保存”按钮,以这种方式更新所有项目的标识符,并启用基于项目的语义标识符。\n" box_header: - label_project: Project - label_previous_identifier: Previous identifier - label_autofixed_suggestion: Future identifier - label_example_work_package_id: Example work package ID + label_project: 项目 + label_previous_identifier: 上一标识符 + label_autofixed_suggestion: 未来标识符 + label_example_work_package_id: 示例工作包 ID autofix_preview: - error_too_long: Has to be 10 characters or fewer - error_numerical: Cannot be purely numerical - error_starts_with_number: Cannot start with a number - error_special_characters: Special characters not allowed - error_not_fully_uppercased: Must be uppercase - error_in_use: Already in use as another project's active handle - error_reserved: Reserved by another project's handle history - error_unknown: Needs manual review + error_too_long: 必须为 10 个字符或更少字符 + error_numerical: 不能只包含数字 + error_starts_with_number: 不能以数字开头 + error_special_characters: 不允许使用特殊字符 + error_not_fully_uppercased: 必须为大写字母 + error_in_use: 已用作另一项目的活跃句柄 + error_reserved: 由另一项目的处理历史保留 + error_unknown: 需要手动检查 remaining_projects: - other: "... %{count} more projects" - button_autofix: Autofix and save + other: |- + One + ... 另外 1 个项目 + Other + ... 另外 %{count} 个项目 + button_autofix: 自动修复并保存 dialog: - title: Change work package identifiers - heading: Enable project-based work package IDs? - description: 'This will change IDs for all work packages in all projects in this instance. Previous identifiers and URLs will continue to redirect properly. This change will take some time to complete. + title: 更改工作包标识符 + heading: 启用基于项目的工作包 ID? + description: '此操作将在此实例中更改所有项目中所有工作包的 ID。之前的标识符和 URL 将继续正确重定向。此更改需要一些时间才能完成。 ' - confirm_button: Change identifiers - checkbox_label: I understand that this will permanently change all work package IDs - success_banner: Successfully updated work package identifier format. + confirm_button: 更改标识符 + checkbox_label: 我了解此操作将永久更改所有工作包 ID + success_banner: 已成功更新工作包标识符格式。 in_progress: - banner_message: Project identifiers are currently being updated to project-based semantic identifiers. This may take some time. + banner_message: 项目标识符目前正在更新为基于项目的语义标识符。此过程可能需要一定的时间。 workflows: tabs: default_transitions: 默认转换 user_author: 用户是作者 user_assignee: 用户是指派人 index: - description: Configure status transitions for each work package type. + description: 为每个工作包类型配置状态过渡。 type_filter: - label: Filter by type name… - status_button: Status + label: 按类型名称筛选… + status_button: 状态 statuses_dialog: - title: Statuses - label: Statuses enabled for this type - caption: Add or remove statuses you would like to associate with this type. Removing a status will also delete the workflow associated with it. + title: 状态 + label: 已为此类型启用状态 + caption: 添加或移除您想要关联到该类型的状态。移除状态也会删除与之关联的工作流。 statuses_removal_dialog: - title: Remove statuses + title: 移除状态 heading: - other: Remove %{count} statuses? - description: Removing these statuses will make them unavailable to this type and delete existing workflows. Are you sure you want to proceed? - confirm: Remove + other: |- + One + 移除 1 种状态? + Other + 移除 %{count} 种状态? + description: 删除这些状态将使其无法用于此类型,并会删除现有工作流。确定要继续吗? + confirm: 移除 leave_confirmation: - title: Save changes before continuing? - description: You are about to leave this page but you have unsaved changes. Would you like to save them before continuing? - ignore: Ignore changes - save: Save changes and continue + title: 保存更改后再继续? + description: 您即将离开本页面,但您有未保存的更改。是否要保存更改后再继续? + ignore: 忽略更改 + save: 保存更改并继续 role_selector: - label: 'Role: %{role}' - no_role: Select role + label: 角色:%{role} + no_role: 选择角色 blankslate: - title: No status transitions configured - description: Add statuses to start configuring workflows for this role + title: 未配置状态过渡 + description: 添加状态,以开始为该角色配置工作流 info: - database_deprecation_html: 'Starting with OpenProject 16.0, PostgreSQL 16 is required to use OpenProject. Your installation will remain functional with your current database, but anticipate incompatability in future releases.
We have prepared [upgrade guides for all installation methods](upgrade_guide). You can perform the upgrade ahead of the next release at any time by following the guides. + database_deprecation_html: '自 OpenProject 16.0 起,使用 OpenProject 需搭配 PostgreSQL 16。您的安装仍可使用当前数据库正常使用,但预计未来版本将不会兼容。
我们已准备了[所有安装方式的升级指南](upgrade_guide)。在下一版本发布前,您可以随时按照指南执行升级。 ' authentication: @@ -678,13 +684,13 @@ zh-CN: confirmation_live_message_checked: 继续按钮现已激活。 confirmation_live_message_unchecked: 继续按钮现已失效。您需要勾选复选框才能继续。 pagination: - label: Pagination - prev: Previous - prev_page: Previous Page - next: Next - next_page: Next Page - page: Page %{number} - page_with_more: Page %{number}... + label: 分页 + prev: 上一个 + prev_page: 上一页 + next: 下一个 + next_page: 下一页 + page: 第 %{number} 页 + page_with_more: 第 %{number} 页... mcp_configurations: server_url_component: caption: 可以访问 OpenProject MCP 服务器的 URL。设置 MCP 客户端时需要使用。 @@ -692,13 +698,13 @@ zh-CN: op_dry_validation: or: 或 errors: - unexpected_key: is not allowed. + unexpected_key: 不允许使用。 array?: 必须为一个数组。 decimal?: 必须为小数。 defined: 不得定义。 eql?: 必须等于 %{left}。 filled?: 必须填写 - format?: is in invalid format. + format?: 格式无效。 greater_or_equal_zero: 必须大于或等于 0 gteq?: 必须大于或等于 %{num}。 hash?: 必须是一个哈希值。 @@ -725,9 +731,9 @@ zh-CN: parent: not_descendant: 必须是层级根节点的后代。 str?: 必须是一个字符串。 - time?: must be a time. + time?: 必须是时间。 type?: 必须是 %{type}。 - uri?: is not a valid URI. + uri?: 不是有效的 URI。 rules: copy_workflow_from: 工作流副本的类型 enabled: 已启用 @@ -847,10 +853,10 @@ zh-CN: ' change_identifier: 更改标识符 - change_identifier_dialog_title: Change project identifier - change_identifier_format_hint_semantic: Only uppercase letters (A–Z), numbers or underscores. Max 10 characters. Must start with a letter. - change_identifier_format_hint_legacy: Only lowercase letters (a–z), numbers, dashes or underscores. - change_identifier_warning: 'This will permanently change identifiers and URLs of all work packages in this project. The previous identifier and URLs will nevertheless continue to redirect properly. + change_identifier_dialog_title: 更改项目标识符 + change_identifier_format_hint_semantic: 只能使用大写字母 (A-Z)、数字或下划线。最多 10 个字符。必须以字母开头。 + change_identifier_format_hint_legacy: 只能使用小写字母(a-z)、数字、破折号或下划线。 + change_identifier_warning: '此操作将永久更改此项目中所有工作包的标识符和 URL。之前的标识符和 URL 将继续正常重定向。 ' subitems: @@ -1082,9 +1088,9 @@ zh-CN: groups: member_in_these_groups: 此用户当前是以下组的成员: no_results_title_text: 此用户当前不是任何组的成员。 - summary_with_more_html: Member of %{names} and %{count_link}. + summary_with_more_html: "%{names} 和 %{count_link} 的成员。" more: 还有 %{count} 个 - summary_html: Member of %{names}. + summary_html: "%{names} 的成员。" memberships: no_results_title_text: 该用户当前非项目成员。 open_profile: 人员详情 @@ -1142,60 +1148,64 @@ zh-CN: group: 该组现已加入 %{project}。同时,您已经可以与该组一起制定计划并分配工作包等。 working_hours: current_schedule: - title: Current schedule - work_days: Work days - work_hours: Work hours - availability_factor: Availability factor - availability_subtitle: Dedicated to project work - effective_hours: Effective work hours - effective_subtitle: Per week - not_set: Not set + title: 当前日程表 + work_days: 工作天数 + work_hours: 工作时数 + availability_factor: 可用时间系数 + availability_subtitle: 投入项目工作的时数 + effective_hours: 有效工作时数 + effective_subtitle: 每周 + not_set: 未设置 future: - title: Future schedules - description: Plan working schedule changes ahead of time. Once the date arrives your working schedules will be updated automatically. - add_button: Add future schedule - blank_title: No future schedules planned - blank_description: Create a future schedule to plan changes ahead of time + title: 未来日程表 + description: 提前计划工作日程表变更。到达指定日期后,您的工作日程表将自动更新。 + add_button: 添加未来日程表 + blank_title: 未规划未来时间表 + blank_description: 创建未来日程表,以提前规划变更 history: - title: Schedule history - description: View your past work schedules. - blank_title: No schedule history yet - blank_description: Past schedule changes will appear here + title: 日程表历史 + description: 查看您过去的工作日程表。 + blank_title: 尚无日程表历史 + blank_description: 过去的日程表变更将出现在此处 destroy: - confirm: Are you sure you want to delete this working schedule? + confirm: 确定要删除此工作日程表吗? form: - title: Plan a future work schedule - title_current: Edit current work schedule - start_date: Start date - start_date_caption: Select the date from when the new work schedule will be effective. - work_days: Work days - working_hours_label: Working hours - hours_mode_label: Hours mode - same_hours_mode: Same hours per day - individual_hours_mode: Individual hours per day - work_hours: Work hours - hours_per_day: Hours per day - per_day: per day - per_week: per week - total_work_hours: Total work hours - availability_description: The availability factor represents the actual percentage of your working time dedicated to project tasks. This accounts for meetings, emails, administrative work, and other non-project activities. - availability_factor: Availability factor - availability_factor_caption: Define the percentage of your working time dedicated to project work. - total_available_hours: Total available work hours - title_availability_factor: Availability factor - title_days_and_hours: Days and hours - title_future_dates: Future dates + title: 规划未来工作日程表 + title_current: 编辑当前工作日程表 + start_date: 开始日期 + start_date_caption: 选择新工作日程表的生效日期。 + work_days: 工作天数 + working_hours_label: 工作时数 + hours_mode_label: 小时模式 + same_hours_mode: 每天相同时数 + individual_hours_mode: 每天不同时数 + work_hours: 工作时数 + hours_per_day: 每天时数 + per_day: 每天 + per_week: 每周 + total_work_hours: 总工作时数 + availability_description: 可用时间系数表示您实际投入项目任务的工作时间百分比。该时间会计入会议、电子邮件、管理工作及其他非项目活动的时间。 + availability_factor: 可用时间系数 + availability_factor_caption: 定义您投入项目工作的工作时间百分比。 + total_available_hours: 可用工作时数总计 + title_availability_factor: 可用时间系数 + title_days_and_hours: 天数和时数 + title_future_dates: 未来日期 table: - mobile_title: Working schedules - start_date: Start date - work_days: Work days - work_hours: Work hours - availability_factor: Availability factor - effective_work_hours: Effective work hours + mobile_title: 工作日程表 + start_date: 开始日期 + work_days: 工作天数 + work_hours: 工作时数 + availability_factor: 可用时间系数 + effective_work_hours: 有效工作时数 work_days_count: - other: "%{count} working days" + other: |- + One + 1 个工作日 + Other + %{count} 个工作日 user_preferences: - disable_keyboard_shortcuts_caption: 'You can choose to disable default [keyboard shortcuts](docs_url) if you use a screen reader or want to avoid accidentally triggering an action with a shortcut. + disable_keyboard_shortcuts_caption: '如果您使用屏幕阅读器或希望避免意外触发快捷键,您可以选择禁用默认[键盘快捷键](docs_url)。 ' page: @@ -1206,12 +1216,12 @@ zh-CN: ' delete_tooltip: 删除占位符用户 deletion_info: - heading_html: Delete placeholder user %{name} + heading_html: 删除占位符用户 %{name} data_consequences: '出现的所有占位符用户(例如,作为受理人、负责人或其他用户值)将被重新分配给一个名为“已删除用户”的帐户。 由于每个已删除帐户的数据都会被重新分配给此帐户,因此无法将用户创建的数据与另一个已删除帐户的数据区分。 ' irreversible: 此操作不可逆 - confirmation_html: Enter the placeholder user name %{name} to confirm the deletion. + confirmation_html: 输入占位符用户名 %{name} 以确认删除。 priorities: edit: priority_color_text: | @@ -1242,9 +1252,8 @@ zh-CN: 选中此选项可将具有此状态的工作包排除在层次结构中的 "工时"、 "剩余工时 "和 "完成百分比 "总数之外。 status_percent_complete_text_html: |- - In [status-based progress calculation mode](setting_url), the % Complete of a work - package is automatically set to this value when this status is selected. - Ignored in work-based mode. + 在[基于状态的进度计算模式](setting_url)下,当选择该状态时,工作包的完成进度百分比会自动设置为该值。 + 在基于工作的模式下忽略。 status_readonly_html: | 选中此选项将此状态的工作包标记为只读。 除了状态外,不能更改其他属性。 @@ -1512,7 +1521,7 @@ zh-CN: ' login_with_auth_provider: 或使用您的现有帐户登录 signup_with_auth_provider: 或注册使用 - auth_source_login_html: Please login as %{login} to activate your account. + auth_source_login_html: 请以 %{login} 身份登录,以激活您的帐户。 omniauth_login: 请登录以激活您的帐户。 actionview_instancetag_blank_option: 请选择 activemodel: @@ -1522,8 +1531,8 @@ zh-CN: activerecord: attributes: work_package_semantic_alias: - identifier: Identifier - work_package: Work package + identifier: 标识符 + work_package: 工作包 jira_import: projects: 项目 import/jira: @@ -1786,11 +1795,11 @@ zh-CN: consented_at: 同意在 group: identity_url: 身份 URL - parent: Parent group - organizational_unit: Organizational unit + parent: 父级组 + organizational_unit: 组织单元 group_detail: - parent: Parent group - organizational_unit: Organizational unit + parent: 父级组 + organizational_unit: 组织单元 user_preference: header_look_and_feel: 外观和风格 header_alerts: 提醒 @@ -1820,27 +1829,27 @@ zh-CN: principal_type: 邀请类型 id_or_email: 用户名或电子邮件地址 user_non_working_time: - start_date: Start date - end_date: End date + start_date: 开始日期 + end_date: 结束日期 user_working_hours: - valid_from: Valid from - monday: Monday - monday_hours: Monday hours - tuesday: Tuesday - tuesday_hours: Tuesday hours - wednesday: Wednesday - wednesday_hours: Wednesday hours - thursday: Thursday - thursday_hours: Thursday hours - friday: Friday - friday_hours: Friday hours - saturday: Saturday - saturday_hours: Saturday hours - sunday: Sunday - sunday_hours: Sunday hours - availability_factor: Availability factor - shared_hours: Work hours - days: Working days + valid_from: 有效起始日期 + monday: 星期一 + monday_hours: 星期一工作时数 + tuesday: 星期二 + tuesday_hours: 星期二工作时数 + wednesday: 星期三 + wednesday_hours: 星期三工作时数 + thursday: 星期四 + thursday_hours: 星期四工作时数 + friday: 星期五 + friday_hours: 星期五工作时数 + saturday: 星期六 + saturday_hours: 星期六工作时数 + sunday: 星期日 + sunday_hours: 星期日工作时数 + availability_factor: 可用时间系数 + shared_hours: 工作时数 + days: 工作天数 version: effective_date: 完成日期 sharing: 共享 @@ -1895,8 +1904,8 @@ zh-CN: before: 必须在 %{date} 之前。 before_or_equal_to: 必须在早于或等于 %{date} blank: 不能为空。 - not_before_start_date: must not be before the start date. - overlapping_range: overlaps with an existing non-working day range. + not_before_start_date: 不得在开始日期之前。 + overlapping_range: 与现有的非工作日范围重叠。 blank_nested: 需要设置属性“%{property}”。 cannot_delete_mapping: 必需项,不能删除 is_for_all_cannot_modify: 适用于所有项目,因此不能修改。 @@ -1933,9 +1942,9 @@ zh-CN: less_than_or_equal_to: 必须小于或等于 %{count}。 not_available: 因系统配置而不可用。 not_deletable: 无法删除。 - not_editable: cannot be edited because it is already in effect. + not_editable: 不能编辑,因为其已经生效。 not_current_user: 不是当前用户。 - system_wide_non_working_day_exists: conflicts with an existing system-wide non-working day for this date. + system_wide_non_working_day_exists: 与该日期现有的系统范围非工作日冲突。 not_found: 未找到 not_a_date: 不是有效的日期。 not_a_datetime: 不是有效的日期时间。 @@ -1970,7 +1979,7 @@ zh-CN: group: attributes: parent_id: - circular_dependency: would create a circular group hierarchy. + circular_dependency: 将创建循环组层次结构。 ldap_auth_source: attributes: tls_certificate_string: @@ -2081,8 +2090,8 @@ zh-CN: types: in_use_by_work_packages: '仍在使用的工作包: %{types}' identifier: - must_start_with_letter: must start with a letter - no_special_characters: may only contain uppercase letters, numbers, and underscores + must_start_with_letter: 必须以字母开头 + no_special_characters: 只能包含大写字母、数字和下划线 enabled_modules: dependency_missing: 还需要启用模块“%{dependency}”,因为模块“%{module}”依赖于该模块。 format: "%{message}" @@ -2289,7 +2298,7 @@ zh-CN: user_working_hours: attributes: days: - no_working_day: At least one day needs to be configured as a working day. + no_working_day: 至少需要将一天配置为工作日。 member: principal_blank: 请选择至少一个用户或组。 role_blank: 需要进行分配。 @@ -2540,7 +2549,7 @@ zh-CN: info: '您需要生成备份令牌才能创建备份。每次您要请求备份时,都必须提供此令牌。您可以删除备份令牌以禁用此用户的备份。 ' - verification_html: 'Enter %{word} to confirm you want to %{action} the backup token. + verification_html: '输入 %{word} 以确认您要%{action}备份令牌。 ' verification_word_reset: 重置 @@ -2960,7 +2969,7 @@ zh-CN: teaser: title: other: "%{trial_plan} 试用令牌剩余 %{count} 天" - description_html: You have access to all %{trial_plan} features. + description_html: 您可以访问 %{trial_plan} 的所有功能。 trial: not_found: 您已申请试用令牌,但该申请已不再可用。请重试。 wait_for_confirmation: 我们向您发送了一封电子邮件来确认地址,以便检索试用令牌。 @@ -2980,8 +2989,8 @@ zh-CN: ' domain_caption: 该令牌将对您当前配置的主机名有效。 - receive_newsletter: I want to receive the OpenProject [newsletter](newsletter_url). - consent: I agree with the [terms of service](tos_url) and the [privacy policy](privacy_url). + receive_newsletter: 我希望接收 OpenProject [简报](newsletter_url)。 + consent: 我同意[服务条款](tos_url)和[隐私政策](privacy_url)。 email_calendar_updates: state: disabled: 已禁用。 @@ -3070,8 +3079,8 @@ zh-CN: work_package_edit: 编辑工作包 work_package_note: 添加工作包注释 title: - project_html: 'Project: %{name}' - subproject_html: 'Subproject: %{name}' + project_html: 项目:%{name} + subproject_html: 子项目:%{name} export: dialog: title: 导出 @@ -3243,17 +3252,17 @@ zh-CN: learn_about: 详细了解所有新功能 missing: 目前还没有高亮显示的功能。 '17_3': - new_features_title: 'The release contains various new features and improvements, such as: + new_features_title: '此版本包含各种新功能和改进,例如: ' new_features_list: - line_0: 'Big Agile update: dedicated sprint objects, all work packages visible on Backlogs, and automatic sprint board creation.' - line_1: In-place editing of project attributes on the Project Overview page. - line_2: Sharing of meeting templates (Basic plan and higher). - line_3: Better search in Time and Costs, Boards, and more. - line_4: Option to safely change project identifiers. - line_5: Improved workflow configuration for administrators. - line_6: Action boards released to Community. + line_0: 重大敏捷更新:专用的冲刺对象、在待办清单上显示所有工作包,以及自动创建冲刺面板。 + line_1: 在“项目概览”页面直接编辑项目属性 + line_2: 共享会议模板(基本方案及更高版本)。 + line_3: 提升了“时间和成本”、面板等的搜索性能。 + line_4: 增加了安全更改项目标识符的选项。 + line_5: 改进管理员的工作流程配置。 + line_6: 向社区发布操作面板。 links: upgrade_enterprise_edition: 升级到企业版 postgres_migration: 将您的安装迁移到 PostgreSQL @@ -3318,15 +3327,15 @@ zh-CN: progress_calculation_adjusted: 进度计算自动设置为基于工时的模式,并随版本更新而调整。 scheduling_mode_adjusted: 随版本更新自动适配调度模式。 totals_removed_from_childless_work_packages: 使用 版本更新的非父工作包的工作和进度总计自动移除。 这是一个维护任务,可以安全地被忽略。 - sprint_migration: Version '%{version_name}' has been copied as a sprint. + sprint_migration: 版本“%{version_name}”已作为冲刺复制。 total_percent_complete_mode_changed_to_work_weighted_average: 无工时的子工作包被忽略。 total_percent_complete_mode_changed_to_simple_average: 忽略子工作包的工时值。 links: configuration_guide: 配置指南 get_in_touch: 遇到问题了?与我们联系。 - instructions_after_registration_link: You can sign in as soon as your account has been activated by clicking [here](signin_url). - instructions_after_logout_link: You can sign in again by clicking [here](signin_url). - instructions_after_error_link: You can try to sign in again by clicking [here](signin_url). If the error persists, ask your admin for help. + instructions_after_registration_link: 您的帐户激活后,可点击[此处](signin_url)登录。 + instructions_after_logout_link: 您可以点击[此处](signin_url)重新登录。 + instructions_after_error_link: 您可以点击[此处](signin_url)尝试重新登录。如果错误仍然存在,请向您的管理员寻求帮助。 menus: admin: ai: 人工智能 (AI) @@ -3339,10 +3348,10 @@ zh-CN: label: 添加… my_account: notifications_and_email: - title: Notification and email + title: 通知和电子邮件 tabs: - notifications: Notification settings - email_reminders: Email reminders + notifications: 通知设置 + email_reminders: 电子邮件提醒 access_tokens: description: 提供商令牌由 OpenProject 签发,允许其他应用程序访问。客户端令牌由其他应用程序签发,允许 OpenProject 对其进行访问。 no_results: @@ -3407,70 +3416,70 @@ zh-CN: unknown_storage: 未知存储 email_reminders: immediate_reminders: - title: Send me an email reminder - mentioned: Notify me when I am mentioned - personal_reminder: Notify me for personal reminders + title: 向我发送电子邮件提醒 + mentioned: 当我被提及时通知我 + personal_reminder: 有个人提醒时通知我 daily_reminders: - title: Send me daily email reminders for unread notifications - caption: You will receive these reminders only for unread notifications and only at hours you specify. Until you configure a time zone for your account, the times will be interpreted to be in UTC. - enabled: Enable daily email reminders - add_time: Add time - remove_time: Remove time - time_slot_label: Reminder time (UTC) + title: 向我发送针对未读通知的每日电子邮件提醒 + caption: 您仅会收到针对未读通知的提醒,且仅会在您指定的时间收到提醒。在您为帐户配置时区前,时间将解释为采用 UTC 格式。 + enabled: 启用每日电子邮件提醒 + add_time: 添加时间 + remove_time: 移除时间 + time_slot_label: 提醒时间 (UTC) workdays: - title: Receive email reminders on these days - submit_button: Update reminder days + title: 在如下日期接收电子邮件提醒 + submit_button: 更新提醒日期 pause_reminders: - title: Pause email notifications - enabled: Temporarily pause daily email reminders - date_range: Pause period + title: 暂停电子邮件通知 + enabled: 临时暂停每日电子邮件提醒 + date_range: 暂停时间段 email_alerts: - title: Email alerts for other items that are not work packages - news_added: News added - news_commented: Comment on a news item - document_added: Document added - forum_messages: Forum message posted - wiki_page_added: Wiki page added - wiki_page_updated: Wiki page updated - membership_added: Membership added - membership_updated: Membership updated - submit_button: Update alerts + title: 其他项目(非工作包)的电子邮件提醒 + news_added: 新闻已添加 + news_commented: 评论新闻项目 + document_added: 文档已添加 + forum_messages: 论坛消息已发布 + wiki_page_added: Wiki 页面已添加 + wiki_page_updated: Wiki 页面已更新 + membership_added: 成员资格已添加 + membership_updated: 成员资格已更新 + submit_button: 更新提醒 notifications: participating: - title: Participating - submit_button: Update preferences - mentioned: Mentioned - watched: Watching - assignee: Assignee - responsible: Accountable - shared: Shared with me + title: 参与 + submit_button: 更新偏好设置 + mentioned: 被提及 + watched: 关注中 + assignee: 受理人 + responsible: 负责人 + shared: 已与我共享 date_alerts: - title: Date alerts - submit_button: Update date alerts - start_date: Start date - due_date: Finish date - overdue: Overdue + title: 日期提醒 + submit_button: 更新日期提醒 + start_date: 开始日期 + due_date: 完成日期 + overdue: 逾期 times: - same_day: On the same day - one_day_before: 1 day before - three_days_before: 3 days before - seven_days_before: 7 days before - one_day_after: 1 day after - three_days_after: 3 days after - seven_days_after: 7 days after + same_day: 当天 + one_day_before: 提前 1 天 + three_days_before: 提前 3 天 + seven_days_before: 提前 7 天 + one_day_after: 推后 1 天 + three_days_after: 推后 3 天 + seven_days_after: 推后 7 天 non_participating: - title: Non-participating - submit_button: Update preferences - work_package_created: New work packages - work_package_commented: All new comments - work_package_processed: All status changes - work_package_prioritized: All priority changes - work_package_scheduled: All date changes + title: 不参与 + submit_button: 更新偏好设置 + work_package_created: 新工作包 + work_package_commented: 所有新评论 + work_package_processed: 所有状态更改 + work_package_prioritized: 所有优先级更改 + work_package_scheduled: 所有日期更改 project_specific_settings: - title: Project-specific notification settings - add_button: Add project-specific notifications - dialog_title: Add project-specific notifications - list_header: Projects with specific notifications + title: 项目特定通知设置 + add_button: 添加项目特定通知 + dialog_title: 添加项目特定通知 + list_header: 具有特定通知的项目 notifications: reasons: assigned: 指定人 @@ -3543,7 +3552,7 @@ zh-CN: label_ical_access_key_generation_hint: 订阅日历时自动生成的。 label_ical_access_key_latest: 最近 label_ical_access_key_revoke: 撤消 - label_integrations: Integrations + label_integrations: 集成 label_add_column: 添加列 label_applied_status: 应用的状态 label_archive_project: 归档项目 @@ -3591,8 +3600,8 @@ zh-CN: label_calendar_show: 显示日历 label_category: 类别 label_completed: 已完成 - label_committed_at_html: "%{committed_revision_link} at %{date}" - label_committed_link: committed revision %{revision_identifier} + label_committed_at_html: 在 %{date} %{committed_revision_link} + label_committed_link: 提交了修订 %{revision_identifier} label_consent_settings: 用户同意 label_wiki_menu_item: 维基菜单项 label_select_main_menu_item: 选择新的主菜单项 @@ -3759,7 +3768,7 @@ zh-CN: label_subject_or_id: 主题或ID label_calendar_subscriptions: 日历订阅 label_identifier: 标识符 - label_project_identifier: Project identifier + label_project_identifier: 项目标识符 label_in: 在 label_in_less_than: 在小于 label_in_more_than: 在多于 @@ -3893,13 +3902,13 @@ zh-CN: label_news_view_all: 查看所有新闻 label_next: 下一个 label_next_week: 下周 - label_next_year: Next year + label_next_year: 明年 label_no_change_option: "(不变)" label_no_data: 没有要显示的数据 label_no_due_date: 没有完成日期 label_no_start_date: 没有开始日期 label_no_parent_page: 无父级页面 - label_no_parent_group: "(No parent group)" + label_no_parent_group: "(无父级组)" label_notification_center_plural: 通知 label_nothing_display: 不显示 label_nobody: 没人 @@ -3928,7 +3937,7 @@ zh-CN: label_overall_activity: 总体活动 label_overview: 概述 label_page_title: 页面标题 - label_parent_group_caption: 'Setting a parent group will make this group a subgroup of the selected parent group. This will also inherit all memberships, including permissions of the parent group. + label_parent_group_caption: '设置父级组将使该组成为所选父级组的子组。该组也将继承父级组的所有成员资格,包括权限。 ' label_part_of: 一部分 @@ -3957,7 +3966,7 @@ zh-CN: label_preview_not_available: 预览不可用 label_previous: 上一个 label_previous_week: 前一周 - label_previous_year: Previous year + label_previous_year: 去年 label_principal_invite_via_email: " 或通过电子邮件邀请新用户" label_principal_search: 添加现有用户或组 label_privacy_policy: 数据隐私和安全政策 @@ -4069,7 +4078,7 @@ zh-CN: label_start_to_start: 开始开始 label_statistics: 统计数据 label_status: 状态 - label_status_plural: Statuses + label_status_plural: 状态 label_storage_free_space: 剩余磁盘空间 label_storage_used_space: 已用磁盘空间 label_storage_group: 存储文件系统 %{identifier} @@ -4119,7 +4128,7 @@ zh-CN: label_user: 用户 label_user_and_permission: 用户和权限 label_user_named: 用户 %{name} - label_user_activity_html: "%{value}'s activity" + label_user_activity_html: "%{value} 的活动" label_user_anonymous: 匿名 label_user_menu: 用户菜单 label_user_new: 新用户 @@ -4207,11 +4216,23 @@ zh-CN: other: "%{count} 个文件" zero: 无文件 label_x_days: - other: "%{count} days" + other: |- + One + 1 天 + Other + %{count} 天 label_x_working_days: - other: "%{count} working days" + other: |- + One + 1 个工作日 + Other + %{count} 个工作日 label_x_working_days_time_off: - other: 'Time off: %{count} working days' + other: |- + One + 休息时间:1 个工作日 + Other + 休息时间:%{count} 个工作日 label_yesterday: 昨天 label_zen_mode: 极简模式 label_role_type: 类型 @@ -4220,22 +4241,22 @@ zh-CN: label_not_changeable: "(不变)" label_global: 全局 label_seeded_from_env_warning: 此记录是通过设置环境变量创建的,无法通过 UI 编辑。 - label_schedule_and_availability: Schedule and availability - label_working_hours: Work schedule - label_non_working_days: Availability calendar - label_non_working_days_with_count: Non-working days (%{count}) - label_non_working_days_summary: Summary - button_add_non_working_time: Time off - button_edit_non_working_time: Edit time off - label_continued_from_previous_year: continued from previous year - label_continues_into_next_year: continues into next year - label_end_date: Finish date - label_working_days: Working days - label_non_working_times_with_count: "%{year} time off (%{count})" - label_non_working_times_summary: "%{year} summary" - label_total_user_non_working_times: Personal non-working days - label_total_global_non_working_days: Global non-working days - label_total_days_off: Total days off + label_schedule_and_availability: 日程表和可用时间 + label_working_hours: 工作日程表 + label_non_working_days: 可用时间日历 + label_non_working_days_with_count: 非工作日天数 (%{count}) + label_non_working_days_summary: 摘要 + button_add_non_working_time: 休息时间 + button_edit_non_working_time: 编辑休息时间 + label_continued_from_previous_year: 延续去年情况 + label_continues_into_next_year: 延续到明年 + label_end_date: 完成日期 + label_working_days: 工作日 + label_non_working_times_with_count: "%{year} 年休息天数 (%{count})" + label_non_working_times_summary: "%{year} 年摘要" + label_total_user_non_working_times: 个人非工作日 + label_total_global_non_working_days: 全球非工作日 + label_total_days_off: 总休息日数 macro_execution_error: 执行宏 %{macro_name} 出错 macro_unavailable: 无法显示宏 %{macro_name} 。 macros: @@ -4270,7 +4291,7 @@ zh-CN: center: 前往通知中心 see_in_center: 在通知中心查看评论 settings: 更改电子邮件设置 - salutation: Hello %{user}, + salutation: "%{user},您好" salutation_full_name: 全名 work_packages: created_at: 由 %{user} 于 %{timestamp} 创建 @@ -4299,7 +4320,7 @@ zh-CN: note: 注:"%{note}" sharing: work_packages: - allowed_actions_html: You may %{allowed_actions} this work package. This can change depending on your project role and permissions. + allowed_actions_html: 您可以%{allowed_actions}此工作包。允许的操作可根据您的项目角色和权限而变化。 create_account: 要访问此工作包,您需要创建一个 %{instance} 帐户。 open_work_package: 打开工作包 subject: '工作包 #%{id} 已被分享给你' @@ -4398,8 +4419,8 @@ zh-CN: mail_user_activation_limit_reached: subject: 已达到用户激活限制 message_html: | - A new user (%{email}) tried to create an account on an OpenProject environment that you manage (%{host}). - The user cannot activate their account since the user limit has been reached. + 新用户 (%{email}) 试图在您管理的 OpenProject 环境 (%{host}) 上创建帐户。 + 由于已达到用户限制,此用户无法激活其帐户。 steps: label: '要允许用户登录, 您可以: ' a: "([在这里](upgrade_url)) 升级付款计划" @@ -4465,7 +4486,7 @@ zh-CN: notice_parent_item_not_found: 未找到父项 notice_project_not_deleted: 项目没有被删除 notice_project_not_found: 未找到项目。 - notice_smtp_address_unsafe_env_hint: SMTP address %{address} is not safe. Please add it to the whitelist using the %{env_name} environment variable. + notice_smtp_address_unsafe_env_hint: SMTP 地址 %{address} 不安全。请使用 %{env_name} 环境变量将其添加到白名单。 notice_successful_connection: 成功连接。 notice_successful_create: 成功创建。 notice_successful_delete: 成功删除。 @@ -4589,12 +4610,12 @@ zh-CN: permission_manage_versions: 管理版本 permission_manage_wiki: 管理维基 permission_manage_wiki_menu: 管理维基菜单 - permission_manage_own_working_times: Manage own working times - permission_manage_own_working_times_explanation: 'Allows users to manage their own working times, and personal non-working days. + permission_manage_own_working_times: 管理自己的工作时间 + permission_manage_own_working_times_explanation: '允许用户管理自己的工作时间和个人非工作日。 ' - permission_manage_working_times: Manage working times for all users - permission_manage_working_times_explanation: 'Allows users to manage working times for all users, including personal non-working days. + permission_manage_working_times: 管理所有用户的工作时间 + permission_manage_working_times_explanation: '允许用户管理所有用户的工作时间,包括个人非工作日。 ' permission_move_work_packages: 移动工作包 @@ -4743,10 +4764,10 @@ zh-CN: info: 删除存储库是一个不可逆转的操作。 info_not_managed: '注意: 这不会删除该存储库的内容,它不由 OpenProject 托管。' managed_path_note: '以下目录将被删除: %{path}' - repository_verification_html: Enter the project's identifier %{identifier} to verify the deletion of its repository. + repository_verification_html: 输入项目的标识符 %{identifier},以确认删除其存储库。 subtitle: 你确定要删除项目 %{project_name} 的 %{repository_type} 吗? - subtitle_not_managed_html: Do you really want to remove the linked %{repository_type} %{url} from the project %{project_name}? - title_html: Delete the %{repository_type} + subtitle_not_managed_html: 是否确定要从项目 %{project_name} 删除关联的 %{repository_type} %{url}? + title_html: 删除 %{repository_type} title_not_managed: 删除链接的 %{repository_type} 吗? errors: build_failed: 在所选的配置下无法创建存储库。%{reason} @@ -4795,7 +4816,7 @@ zh-CN: storage: not_available: 磁盘存储开销不可用于此存储库。 update_timeout: 在 N 分钟内保留存储库最后所需磁盘空间的信息。由于计算存储库所需的磁盘空间可能增加系统开销,增加该值可以减少性能影响。 - oauth_application_details_html: 'The client secret value will not be accessible again after you close this window. Please copy these values into the Nextcloud OpenProject Integration settings:' + oauth_application_details_html: 关闭此窗口后,将无法再次访问客户端密钥值。请将这些值复制到 Nextcloud OpenProject 集成设置中: oauth_application_details_link_text: 转到设置页面 setup_documentation_details: 如果您在配置新文件存储方面需要帮助,请查看文档: setup_documentation_details_link_text: 文件存储设置 @@ -4843,7 +4864,7 @@ zh-CN: setting_apiv3_cors_title: 跨源资源共享 (CORS) setting_apiv3_cors_enabled: 启用 CORS setting_apiv3_cors_origins: API v3 跨域资源共享 (CORS) 允许的域 - setting_apiv3_cors_origins_instructions_html: 'If CORS is enabled, these are the origins that are allowed to access OpenProject API.
Please check the [Documentation on the Origin header](docs_url) on how to specify the expected values. + setting_apiv3_cors_origins_instructions_html: '如果启用了 CORS ,则允许这些源访问 OpenProject API。
请查看[有关源标头的文档](docs_url),了解如何指定预期值。 ' setting_apiv3_write_readonly_attributes: 对只读属性的写访问权限 @@ -4853,7 +4874,7 @@ zh-CN: setting_apiv3_write_readonly_attributes_warning: '此设置可用于数据导入等用例,但允许管理员以其他用户身份模拟项目创建。不过,所有创建请求都会记录真实作者信息。 ' - setting_apiv3_write_readonly_attributes_additional_html: 'For more information on attributes and supported resources, please see the [API documentation](api_documentation_link). + setting_apiv3_write_readonly_attributes_additional_html: '有关特性和受支持资源的详细信息,请参阅 [API 文档](api_documentation_link)。 ' setting_apiv3_max_page_size: 最大 API 页面大小 @@ -4955,7 +4976,7 @@ zh-CN: setting_work_package_properties: 工作包属性 setting_work_package_startdate_is_adddate: 使用当前日期作为新工作包的开始日期 setting_work_packages_projects_export_limit: 工作包/项目导出限制 - setting_journal_aggregation_time_minutes: Aggregation period + setting_journal_aggregation_time_minutes: 聚合周期 setting_log_requesting_user: 记录所有请求的用户帐户,名称和邮件地址 setting_login_required: 需要身份验证 setting_login_required_caption: 如果选中,应用程序的所有请求都必须经过验证。 @@ -5038,12 +5059,12 @@ zh-CN: setting_welcome_text: 欢迎块文本 setting_welcome_title: 欢迎块标题 setting_welcome_on_homescreen: 在主屏幕上显示欢迎信息 - setting_work_packages_identifier_classic: Instance-wide numerical sequence (default) - setting_work_packages_identifier_classic_caption: 'Every work package gets a sequential number starting with 1 and incremented with every new one. The numbers are unique within this instance so they remain the same even if work packages are moved between projects. + setting_work_packages_identifier_classic: 实例范围的数字序列(默认) + setting_work_packages_identifier_classic_caption: '每个工作包会获得一个从 1 开始的顺序号,每新增一个工作包,编号会加 1。这些编号在该实例中是唯一的,因此即使工作包在项目之间移动,编号也不会改变。 ' - setting_work_packages_identifier_semantic: Project-based semantic identifiers - setting_work_packages_identifier_semantic_caption: 'Every project has a unique identifier that is prefixed to the work package ID. If a work package moved to another project, a new identifier is generated but the old one continues to function. + setting_work_packages_identifier_semantic: 基于项目的语义标识符 + setting_work_packages_identifier_semantic_caption: '每个项目都有一个唯一标识符,该标识符会附加到工作包 ID 前面。如果工作包移至另一项目,则会生成新的标识符,但原标识符仍可继续使用。 ' setting_work_package_list_default_highlighting_mode: 默认突出显示模式 @@ -5227,11 +5248,11 @@ zh-CN: section_work_week: 工作周 section_holidays_and_closures: 节假日与停业 work_packages: - work_package_identifier: Work package identifier + work_package_identifier: 工作包标识符 not_allowed_text: 您没有查看此页面的权限。 activities: enable_internal_comments: 启用内部评论 - helper_text_html: 'Internal comments allow an internal team to communicate amongst themselves privately. These are only visible to selected roles that have the necessary permissions and will not be visible publicly. [Click here to learn more](docs_url) + helper_text_html: '内部评论允许内部团队私下沟通。这些仅对具有必要权限的选定角色可见,并且永远不会公开显示。[点击此处了解更多信息](docs_url) ' text_formatting: @@ -5319,7 +5340,7 @@ zh-CN: text_default_administrator_account_changed: 更改默认管理员帐户 text_default_encoding: 默认值: UTF-8 text_destroy: 删除 - text_destroy_with_associated: 'There are additional objects associated with the work package(s) that are to be deleted. Those objects are of the following types:' + text_destroy_with_associated: 有额外的对象关联到要删除的工作包。这些对象是以下类型: text_destroy_what_to_do: 你想做什么? text_diff_truncated: "...这个比较被截断,因为它超出了可显示的最大大小。" text_email_delivery_not_configured: |- @@ -5378,10 +5399,10 @@ zh-CN: text_plugin_assets_writable: 插件资产目录可写 text_powered_by: Powered by %{link} text_project_identifier_info: 只有小写字母 (a-z)、 数字、 短划线和下划线被允许,必须以小写字母开头。 - text_project_identifier_description: The project identifier is prepended to all work package IDs. If the identifier is "PROJ" for example, the work package identifier will be "PROJ-12" or "PROJ-246". - text_project_identifier_url_description: The project identifier is included in the URL of the project. - text_project_identifier_handle_format: Must start with a letter and contain only uppercase letters, numbers, and underscores (max 10 characters). - text_project_identifier_format: Must start with a lowercase letter. Only lowercase letters (a-z), numbers, dashes and underscores are allowed. + text_project_identifier_description: 项目标识符会附加到所有工作包 ID 的前面。例如,如果项目标识符为“PROJ”,则工作包标识符将为“PROJ-12”或“PROJ-246”。 + text_project_identifier_url_description: 项目标识符包含在项目的 URL 中。 + text_project_identifier_handle_format: 必须以字母开头,且仅包含大写字母、数字和下划线(最多 10 个字符)。 + text_project_identifier_format: 必须以小写字母开头。仅允许使用小写字母 (a-z)、数字、 短划线和下划线。 text_reassign: '重新分配工作包:' text_regexp_multiline: 以多行模式应用正则表达式,如 ^---\s+ text_repository_usernames_mapping: |- @@ -5493,10 +5514,10 @@ zh-CN: version_status_locked: 锁定 version_status_open: 打开 note: 请注意 - note_password_login_disabled_link: Password login has been disabled through a [configuration setting](configuration_url). + note_password_login_disabled_link: 密码登录已通过[配置设置](configuration_url)禁用。 warning: 警告 warning_attachments_not_saved: "%{count} 文件不能被保存。" - warning_imminent_user_limit_html: 'You invited more users than are supported by your current plan. Invited users may not be able to join your OpenProject environment. Please [upgrade your plan](upgrade_url) or block existing users in order to allow invited and registered users to join. + warning_imminent_user_limit_html: '您邀请的用户数超过了当前计划支持的用户数。受邀用户可能无法加入您的 OpenProject 环境。请[升级您的方案](upgrade_url)或阻止现有用户,以允许受邀用户和已注册用户加入。 ' warning_registration_token_expired: '激活邮件已过期,我们给您发送了一封新邮件到%{email}。请单击内部的链接以激活您的帐户。 @@ -5505,7 +5526,7 @@ zh-CN: warning_user_limit_reached: '添加额外的用户将超出当前限制。请联系管理员以增加用户限制,以确保外部用户能够访问此实例。 ' - warning_user_limit_reached_admin_html: 'Adding additional users will exceed the current limit. Please [upgrade your plan](upgrade_url) to be able to ensure external users are able to access this instance. + warning_user_limit_reached_admin_html: '添加额外的用户将超出当前限制。请[升级您的方案](upgrade_url),以确保外部用户能够访问此实例。 ' warning_user_limit_reached_instructions: '您达到了用户限制(%{current}/%{max}活跃用户)。 请联系sales@openproject.com以升级您的Enterprise edition计划并添加其他用户。 @@ -5570,7 +5591,7 @@ zh-CN: reminders: label_remind_at: 日期 note_placeholder: 您为什么要设置此提醒? - create_success_message_html: Reminder set successfully. You will receive a notification for this work package %{reminder_time}. + create_success_message_html: 提醒设置成功。您将在 %{reminder_time} 收到此工作包的通知。 success_update_message: 提醒更新成功。 success_deletion_message: 提醒已成功删除。 sharing: @@ -5602,7 +5623,7 @@ zh-CN: warning_user_limit_reached: '添加其他用户将超出当前限制。请联系管理员增加用户限制,以确保外部用户能够访问 %{entity}。 ' - warning_user_limit_reached_admin_html: 'Adding additional users will exceed the current limit. Please [upgrade your plan](upgrade_url) to be able to ensure external users are able to access this %{entity}. + warning_user_limit_reached_admin_html: '添加额外的用户将超出当前限制。请[升级您的方案](upgrade_url),以确保外部用户能够访问此 %{entity}。 ' warning_no_selected_user: 请选择要与之共享此 %{entity} 的用户 @@ -5726,7 +5747,7 @@ zh-CN: project: 未公开 - 由于缺少权限,项目不可见。 ancestor: 未公开 - 由于缺少权限,上级不可见。 definingProject: 未公开 - 由于缺少权限,项目不可见。 - definingWorkspace: Undisclosed - The workspace is invisible because of lacking permissions. + definingWorkspace: 未公开 - 由于缺少权限,工作空间不可见。 doorkeeper: pre_authorization: status: 预授权 diff --git a/docker/dev/xwiki/README.md b/docker/dev/xwiki/README.md index 4935b6d3109..7832c8e3e63 100644 --- a/docker/dev/xwiki/README.md +++ b/docker/dev/xwiki/README.md @@ -1,7 +1,6 @@ # Setup guide -A minimal setup guide for using a local XWiki inside a docker stack. The example compose file is connected to the -standard setup of the TLS-ready stack with `traefik`. +A minimal setup guide for using a local XWiki inside a docker stack. The example compose file is connected to the standard setup of the [TLS-ready](https://www.openproject.org/docs/development/development-environment/docker/#tls-support) stack with `traefik`. ## First steps @@ -9,4 +8,37 @@ standard setup of the TLS-ready stack with `traefik`. - Go to https://xwiki.local - Wait for initialisation to succeed - Create admin user -- Select XWiki standard flavor and install it +- Select XWiki standard flavor and install it — **this is highly recommended** as many XWiki + features and the OpenProject plugin depend on it + +## Recommended extensions + +For integration with OpenProject, install the following after the standard flavor is set up: + +- **[OpenProject Integration](https://store.xwiki.com/xwiki/bin/view/Extension/OpenProjectIntegration)** — connects XWiki with OpenProject + +Install it via the Extension Manager (Administration → Extensions → search for "OpenProject Integration"). + +## Updating XWiki + +To update XWiki to a newer version, pull the latest image and recreate the container: + +```bash +docker compose --project-directory docker/dev/xwiki/ pull +docker compose --project-directory docker/dev/xwiki/ up -d +``` + +After the container starts, go to — XWiki will detect the new version and +present an upgrade wizard. Follow it to completion before using XWiki again. + +## Certificates + +### Trusting the local CA in XWiki (for outbound HTTPS calls) + +XWiki runs on Java/Tomcat which has its own certificate truststore, independent of the system CA +bundle. If XWiki needs to make HTTPS requests to OpenProject (e.g. for OAuth), it must trust the +local step-ca root certificate. + +Copy `docker-compose.override.example.yml` to `docker-compose.override.yml` — it wraps the XWiki +entrypoint to automatically import the step-ca certificate into Java's truststore on every container +start, including after recreations. Requires the TLS stack (`docker/dev/tls`) to be running. diff --git a/docker/dev/xwiki/docker-compose.override.example.yml b/docker/dev/xwiki/docker-compose.override.example.yml new file mode 100644 index 00000000000..39b8877bbc4 --- /dev/null +++ b/docker/dev/xwiki/docker-compose.override.example.yml @@ -0,0 +1,22 @@ +services: + web: + volumes: + - step-certs:/step:ro + # Automatically imports the local step-ca root certificate into Java's truststore on every + # container start, so XWiki can make HTTPS calls to OpenProject without certificate errors. + # Requires the TLS stack (docker/dev/tls) to be running. + entrypoint: + - /bin/bash + - -c + - | + keytool -import -trustcacerts \ + -keystore /opt/java/openjdk/lib/security/cacerts \ + -storepass changeit -noprompt \ + -alias step-ca \ + -file /step/certs/root_ca.crt 2>/dev/null || true + exec docker-entrypoint.sh xwiki + +volumes: + step-certs: + external: true + name: tls_step # volume created by the TLS stack (docker/dev/tls) diff --git a/docs/security-and-privacy/statement-on-security/README.md b/docs/security-and-privacy/statement-on-security/README.md index 79861ce3d82..596800c6600 100644 --- a/docs/security-and-privacy/statement-on-security/README.md +++ b/docs/security-and-privacy/statement-on-security/README.md @@ -3,14 +3,14 @@ sidebar_navigation: title: Statement on security priority: 600 description: Statement of data security in OpenProject -keywords: GDPR, data security, security, OpenProject security, security alerts, single sign-on, password security, mailing list +keywords: GDPR, data security, security, OpenProject security, security alerts, single sign-on, password security, mailing list, vulnerability, responsible disclosure, bug bounty --- # Statement on security At its core, OpenProject is an open-source software that is [developed and published on GitHub](https://github.com/opf/openproject). Every change to the OpenProject code base ends up in an open repository accessible to everyone. This results in a transparent software where every commit can be traced back to the contributor. -Automated tests and manual code reviews ensure that these contributions are safe for the entire community of OpenProject. These tests encompass the correctness of security and access control features. We have ongoing collaborations with security professionals from to test the OpenProject code base for security exploits. +Automated tests and manual code reviews ensure that these contributions are safe for the entire community of OpenProject. These tests encompass the correctness of security and access control features. We have ongoing collaborations with security professionals to test the OpenProject code base for security exploits. For more information on security and data privacy for OpenProject, please visit: [www.openproject.org/security-and-privacy](https://www.openproject.org/security-and-privacy/). @@ -21,7 +21,9 @@ You can find our `security.txt` here: [www.openproject.org/security.txt](https:/ Please see [securitytxt.org](https://securitytxt.org/) for more information. -## Security announcements mailing list +## Communication channels + +### Security announcements mailing list If you want to receive immediate security notifications via email as we publish them, please sign up to our [security mailing list](https://www.openproject.org/security-and-privacy/#mailing-list). @@ -29,28 +31,19 @@ No messages except for security advisories or security related announcements wil To unsubscribe, you will find a link at the end of every email. -Any security related information will also be published on our [blog](https://www.openproject.org/blog/) and in the [release notes](../../release-notes/). +Any security related information will also be published in the [release notes](../../release-notes/) and as [GitHub Security Advisories](https://github.com/opf/openproject/security/advisories). -## Security advisory list +### Security advisory list -OpenProject uses GitHub to manage and publish [security advisory listings](https://github.com/opf/openproject/security/advisories) +OpenProject uses GitHub to manage and publish [security advisory listings](https://github.com/opf/openproject/security/advisories). All publicly known security issues on OpenProject with at least a medium CVSS score are reported as CVEs and can be found through these advisories. All published CVEs will also be listed on [cve.org](https://www.cve.org/CVERecord/SearchResults?query=OpenProject). -## Security vulnerability processing +### Email -When we receive vulnerability reports from researchers or through internal identification, the following process is taking place immediately: - -1. A security vulnerability is reported internally or through [security@openproject.com](mailto:security@openproject.com) (see below on how to disclose vulnerabilities responsibly). -2. A security engineer is receiving and validating the report. An internal tracking ticket is created with a checklist template on how to process the report. -3. The reporter receives a timely response with an acknowledgement of the report, further questions if present, and an estimated timeline and complexity of a potential fix. -4. The security engineer coordinates with the security and development team to prepare and test a fix for the report. -5. A GitHub advisory draft is created and a CVE is requested, if appropriate. Security researchers are invited to collaborate on the draft, if available. -6. A patch is returned to the reporter and awaited for confirmation unless fix is trivial -7. A patch release is created, published and distributed for all supported installations -8. The security vulnerability is publicly disclosed on GitHub and communicated through the mailing list +Next to GitHub advisories, you may also directly reach out to the security team via email using [security@openproject.com](mailto:security@openproject.com). ## Reporting a vulnerability -We take all facets of security seriously at OpenProject. If you want to report a security concerns, have remarks, or contributions regarding security at OpenProject, please reach out to us at [security@openproject.com](mailto:security@openproject.com). +We take all facets of security seriously at OpenProject. If you want to report a security concern, have remarks, or contributions regarding security at OpenProject, please reach out to us at [security@openproject.com](mailto:security@openproject.com). If you can, please send us a PGP-encrypted email using the following key: @@ -58,15 +51,103 @@ If you can, please send us a PGP-encrypted email using the following key: - Fingerprint BDCF E01E DE84 EA19 9AE1 72CE 7D66 9C6D 4753 3958 - You may also find the key [attached in our OpenProject repository.](security-at-openproject.com.asc) -You can also [report a vulnerability directly in GitHub](https://github.com/opf/openproject/security/advisories/new), if you prefer. In that case, please _also_ send an informal email to [security@openproject.com](mailto:security@openproject.com) with the link to the advisory, as GitHub notifications are sometimes hard to fully dig through, and we wouldn't want to miss your report. +You can also [report a vulnerability directly in GitHub](https://github.com/opf/openproject/security/advisories/new), if you prefer. When in doubt, please _also_ send an informal email to [security@openproject.com](mailto:security@openproject.com) with the link to the advisory. The advisories allows us to communicate and collaborate privately with you, and it will remain private until we publish the vulnerability. -Please include a description on how to reproduce the issue if possible. Our security team will get your email and will attempt to reproduce and fix the issue as soon as possible. +### What to include in a report + +To help us validate and address the issue efficiently, your report should include: + +- A general description of the vulnerability +- Details about the impacted function and specific conditions to be met, including the vulnerable code snippet (if applicable) +- The impacted version of OpenProject +- Step-by-step instructions to reliably reproduce the issue +- Screenshots, videos, logs, or other evidence demonstrating the full exploitation +- The security impact on the application, its users, and the organization +- Recommendations and fix suggestions (optional, but appreciated) + +Providing clear reproduction steps is essential. Reports that lack sufficient detail for us to validate the issue may take significantly longer to process. + +### Responsible disclosure and testing policy + +Please adhere to the following rules when reporting or researching security issues: + +- **Only test your own instances**: Targeting other users' instances is forbidden. Only test against your own OpenProject installation. If you need additional testing instances or other data from us, feel free to reach out. +- **No public disclosure without agreement**: No vulnerability disclosure, full, partial, or otherwise, is allowed without prior agreement from us. Please avoid submitting security issues on our public repositories before reporting them through the proper channels. +- **Redact sensitive data**: Do not include Personally Identifiable Information (PII) in your report. Redact or obfuscate PII, secrets, keys, and credentials that appear in screenshots, server responses, or other evidence. +- **Human interaction required:** Please do not report unchecked and obvious AI-generated reports, or we may have to close them without further comments. + +## Criteria for security vulnerabilities + +We appreciate your time in every security report you communicate to us. There are a number of cases that can be viewed as security vulnerabilities, but for which we might either reject or not follow up with a full CVE publication. We still welcome you to reach out and discuss potential mitigations or attack vectors with us. Examples for these cases could be + +- Outdated versions of OpenProject. Please ensure you have confirmed the vulnerability against the latest stable version of OpenProject. If you have found new issues as part of the unreleased `dev` branch, of course please also contact us for that. +- Tab nabbing +- Content/text injections that do not result in an XSS attack due to other mitigations +- Denial of service attacks through memory exhaustion, content size, or similar measures +- Race conditions for business logic constraints (e.g., duplicating unique names through timing attacks) without further impact +- HTML injection in formattable content (e.g., links, images) that duplicates what Markdown already allows. Formattable content is sanitized, and reports need to demonstrate impact beyond basic HTML injection +- Clickjacking / UI redressing due to inline CSS styles being allowed in certain formattable places. +- Recently disclosed CVEs (less than 30 days since patch release) for third party libraries +- Presence of autocomplete attribute on web forms +- Vulnerabilities affecting outdated browsers or platforms +- Hypothetical flaws or best practice recommendation without an exploitable vulnerability and proof of concept +- Reports with attack scenarios requiring MITM or physical access to the victim's device +- Disclosure of information without exploitable vulnerabilities (e.g., stack traces, path disclosure, directory listings, software versions, IP disclosure, third-party secrets, EXIF metadata, origin IP) +- Blind SSRF without exploitable vulnerabilities and proof of concept (e.g., DNS and HTTP pingback) +- Ability to spam users (email, SMS, or direct message flooding) +- Exploits that rely on a voluntarily downgraded configuration, or on not-recommended security settings +- Stolen secrets, credentials, or information gathered from a third-party asset outside our control + +## Severity assessment + +The severity of security issues is assessed on a case-by-case basis by our security team using the [CVSS v3.1 calculator](https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator). We consider both the potential impact (e.g., a vulnerability affecting all users is more severe than one requiring specific conditions) and the difficulty to exploit (e.g., a vulnerability requiring administrator access or advanced permissions is less severe than one exploitable by unauthenticated users). + +As a general guideline: + +- **Critical**: Vulnerabilities with a high CVSS score that can be exploited remotely with no or low privileges, no user interaction, and high impact on confidentiality, integrity, or availability. +- **High**: Vulnerabilities with significant impact but that require some privileges, user interaction, or have high attack complexity. +- **Medium/Low**: Vulnerabilities with limited impact or that require high privileges, unusual configurations, or active user interaction to exploit. + +## Security vulnerability processing + +When we receive vulnerability reports from researchers or through internal identification, the following process takes place: + +1. A security vulnerability is reported internally, through GitHub advisories, an active bug bounty program, or through [security@openproject.com](mailto:security@openproject.com). +2. A security engineer receives and validates the report. An internal tracking ticket is created with a checklist template on how to process the report. +3. The reporter receives a timely response with an acknowledgement of the report, further questions if present, and an estimated timeline and complexity of a potential fix. +4. The security engineer coordinates with the security and development team to prepare and test a fix. +5. A GitHub advisory draft is created and a CVE is requested, if appropriate. Security researchers are invited to collaborate on the draft, if available. +6. If possible, a patch or fixed version is provided to the reporter for feedback and confirmation. +7. For critical and high-severity issues, a **pre-release notification** is sent to the security mailing list at least 7 days before the planned release, including the release date and severity (but no vulnerability details). + - This information will include the current releases an upgrade will be available for. + - For security fixes deemed critical, we will attempt to provide fixes for the newest versions of the last two major releases + - Generally, OpenProject only supports the latest major release. Please consult your enterprise contract or our [terms of services](https://www.openproject.org/legal/terms-of-service/) for details. +9. A patch release is created, published, and distributed for all supported installations. The CVE, advisory, and full details are disclosed **simultaneously** with the release. +10. The security mailing list is notified of the publication with upgrade guidance. + +### How long does it take to fix a security issue? + +All vulnerabilities are treated with the highest priority. Critical and high impact vulnerabilities are aimed to be available as an upgradable fix within 21 days after confirmation of the vulnerability, so 14 days until the pre-announcement. This timeline represents our targets. Actual resolution times may vary depending on the complexity of the issue and the availability of our team. + +### When is a security issue considered fixed? + +A security issue is considered fixed only once the fix has been released for all supported versions affected by the issue. + +### Pre-release notification + +For critical and high-severity vulnerabilities, subscribers of our [security mailing list](#security-announcements-mailing-list) will receive a pre-release notification **7 days before** the security release. This notification will include the planned release date and the severity of the issue, but will **not** include vulnerability details or patches. This gives administrators time to schedule maintenance windows and prepare for an upgrade. + +### Public disclosure + +Because OpenProject is open source, any fix committed to our public repository is inherently visible. Adding additional wait time between official releases and communication about vulnerabilities would allow exploitation of the vulnerabilities by simply reading the published code. For this reason, we follow a **simultaneous disclosure** approach: + +- The CVE, GitHub security advisory, and full vulnerability details are published **at the same time** as the patch release. +- The security mailing list is notified immediately upon publication. +- Fixed security issues will appear in the corresponding release notes. ## Bug bounty program -OpenProject is currently subject of a bug bounty program, kindly sponsored by the European Commission. Please see https://yeswehack.com/programs/openproject for more details. - -Please note that OpenProject does not offer its own bug bounty program. For any security vulnerability you responsibly disclose to it, whether it's through another bug bounty program or through our website, we will do our best to give you the appropriate credits for responsibly disclosing a security vulnerability to us. We will gladly reference your work, name, website on every publication we do related to the security update. +Please note that OpenProject does not currently offer its own bug bounty program. For any security vulnerability you responsibly disclose to us, whether through another bug bounty program or through our website, we will do our best to give you appropriate credit. We will gladly reference your work, name, and website on every publication we make related to the security update. ## OpenProject security features @@ -96,7 +177,7 @@ Security updates allow a fast fix of security issues in the system. Relevant cha ### LDAP sync (Enterprise add-on) -Synchronize OpenProject users and groups with your company’s LDAP to update users and group memberships based on LDAP group members. +Synchronize OpenProject users and groups with your company's LDAP to update users and group memberships based on LDAP group members. ### Single sign-on diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 89247893c59..6df5080db5d 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -138,8 +138,8 @@ "@angular-eslint/template-parser": "20.7.0", "@angular/language-service": "21.1.6", "@eslint/js": "^9.39.2", - "@html-eslint/eslint-plugin": "^0.57.1", - "@html-eslint/parser": "^0.57.1", + "@html-eslint/eslint-plugin": "^0.58.1", + "@html-eslint/parser": "^0.58.1", "@jsdevtools/coverage-istanbul-loader": "3.0.5", "@stylistic/eslint-plugin": "^5.7.1", "@types/codemirror": "5.60.5", @@ -172,7 +172,7 @@ "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^7.0.1", "globals": "^17.3.0", - "jasmine-core": "~6.0.1", + "jasmine-core": "~6.1.0", "jasmine-spec-reporter": "~7.0.0", "karma": "~6.4.4", "karma-chrome-launcher": "~3.2.0", @@ -4803,19 +4803,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/css-tree": { - "version": "3.6.9", - "resolved": "https://registry.npmjs.org/@eslint/css-tree/-/css-tree-3.6.9.tgz", - "integrity": "sha512-3D5/OHibNEGk+wKwNwMbz63NMf367EoR4mVNNpxddCHKEb2Nez7z62J2U6YjtErSsZDoY0CsccmoUpdEbkogNA==", - "dev": true, - "dependencies": { - "mdn-data": "2.23.0", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, "node_modules/@eslint/eslintrc": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", @@ -5301,13 +5288,12 @@ } }, "node_modules/@html-eslint/core": { - "version": "0.57.0", - "resolved": "https://registry.npmjs.org/@html-eslint/core/-/core-0.57.0.tgz", - "integrity": "sha512-X/cKrOmXrxZSdgyKwtbaCuuJ1k/u82MK58Q6p1TzfwPatwIYx+icfBv1Vp1dLui0L0y1fwBW4H+TKhBf7mMKmg==", + "version": "0.58.1", + "resolved": "https://registry.npmjs.org/@html-eslint/core/-/core-0.58.1.tgz", + "integrity": "sha512-GHYDt2Q3ws9aa0/bmMhkv21ExQJnrjKY/iByjdBVp3lBq49wlzIzvAfcx4Bsp+RMV3oPZhzlnLhPpXLuVYt2mQ==", "dev": true, "dependencies": { - "@html-eslint/types": "^0.57.0", - "eslint": "^9.39.1", + "@html-eslint/types": "^0.58.1", "html-standard": "^0.0.13" }, "engines": { @@ -5315,17 +5301,17 @@ } }, "node_modules/@html-eslint/eslint-plugin": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.57.1.tgz", - "integrity": "sha512-IDfdk3V27eebNpdXD2NLy/lnTSbUuKrro/6YJICBn/9aiXPXagNqWJB38qcSWEoxADbXfSSn17DJWcXvQTkHBg==", + "version": "0.58.1", + "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.58.1.tgz", + "integrity": "sha512-aizTTKbNF2sW+lXWP+uWBoo5Ud9xtUkr70+0pYhItwJF0yhRqLQ91PhW+9afC0daymQjn13MunzDPwGPG0seDg==", "dev": true, "dependencies": { "@eslint/plugin-kit": "^0.4.1", - "@html-eslint/core": "^0.57.0", - "@html-eslint/parser": "^0.57.1", - "@html-eslint/template-parser": "^0.57.0", - "@html-eslint/template-syntax-parser": "^0.57.0", - "@html-eslint/types": "^0.57.0", + "@html-eslint/core": "^0.58.1", + "@html-eslint/parser": "^0.58.1", + "@html-eslint/template-parser": "^0.58.1", + "@html-eslint/template-syntax-parser": "^0.58.1", + "@html-eslint/types": "^0.58.1", "@rviscomi/capo.js": "^2.1.0", "html-standard": "^0.0.13" }, @@ -5337,47 +5323,45 @@ } }, "node_modules/@html-eslint/parser": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.57.1.tgz", - "integrity": "sha512-nQ5vw7Os+Snjxq9hLLBak2bv502Obn77BNOWfGK2+GIrShxtGd8w1ehlKW3EB5/RQzqBk6VDK8nPfexlR3M7kg==", + "version": "0.58.1", + "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.58.1.tgz", + "integrity": "sha512-a87peH9HcVDrKZZIYdfMlPZ+72nIktAitKcdoHQevuaXWsgvDtClKihJyy5dZS9md6hIbCh62Og5gQRhl85ZMg==", "dev": true, "dependencies": { - "@eslint/css-tree": "^3.6.9", - "@html-eslint/template-syntax-parser": "^0.57.0", - "@html-eslint/types": "^0.57.0", + "@html-eslint/template-syntax-parser": "^0.58.1", + "@html-eslint/types": "^0.58.1", "css-tree": "^3.1.0", "es-html-parser": "0.3.1" } }, "node_modules/@html-eslint/template-parser": { - "version": "0.57.0", - "resolved": "https://registry.npmjs.org/@html-eslint/template-parser/-/template-parser-0.57.0.tgz", - "integrity": "sha512-tddyBo4dEl4W4Ehxuyd6H4jsSqvsfL5F7Bj9/aFfdQyv36q7BGWM2BRHb6FMmYKAPGZ3VzyEbUlcqIwXpDkY3w==", + "version": "0.58.1", + "resolved": "https://registry.npmjs.org/@html-eslint/template-parser/-/template-parser-0.58.1.tgz", + "integrity": "sha512-qo6jTc4Y6vVgwPc2w+EQigH7uCAn+LExxE5oG1URRT98UiJ7dItX0Qk44r/+5XQwSS1TsdvBNLxM2NAktETSWA==", "dev": true, "dependencies": { - "@html-eslint/types": "^0.57.0", + "@html-eslint/types": "^0.58.1", "es-html-parser": "0.3.1" } }, "node_modules/@html-eslint/template-syntax-parser": { - "version": "0.57.0", - "resolved": "https://registry.npmjs.org/@html-eslint/template-syntax-parser/-/template-syntax-parser-0.57.0.tgz", - "integrity": "sha512-vHp5y4TR+HhgMDi3rAkgm90LBptSZaQUJudZSj+WdvnSBjLe/fgJC4aVjtLVHTS9ynORrFio8AmH1Bz20kYk4g==", + "version": "0.58.1", + "resolved": "https://registry.npmjs.org/@html-eslint/template-syntax-parser/-/template-syntax-parser-0.58.1.tgz", + "integrity": "sha512-P1ZhxIPm9qFWSees2/EZ7Etg1OXziqzRZEuI9goO91fJS6dmdT4JnHLugN06FLL706RwpvenBUlE0iZA9/MXdg==", "dev": true, "dependencies": { - "@html-eslint/types": "^0.57.0" + "@html-eslint/types": "^0.58.1" } }, "node_modules/@html-eslint/types": { - "version": "0.57.0", - "resolved": "https://registry.npmjs.org/@html-eslint/types/-/types-0.57.0.tgz", - "integrity": "sha512-wZAHc9FHZRVAcKyx1NdMNGpw1Jo/Anh+9y+bTQ/cKjh5MHJlbs8ogthIG8efBVFIVlIgzxEA8yrX+DPXmuWisA==", + "version": "0.58.1", + "resolved": "https://registry.npmjs.org/@html-eslint/types/-/types-0.58.1.tgz", + "integrity": "sha512-1F2A5XXpgfHQ8dm14E/EztyERoVldT91VGMZCJECZpidf5Cbc21vxeHLT6/POTJm0ICJOmyBlocF62i/rkoVEQ==", "dev": true, "dependencies": { "@types/css-tree": "^2.3.11", "@types/estree": "^1.0.6", - "es-html-parser": "0.3.1", - "eslint": "^9.39.1" + "es-html-parser": "0.3.1" } }, "node_modules/@humanfs/core": { @@ -17029,9 +17013,9 @@ } }, "node_modules/jasmine-core": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-6.0.1.tgz", - "integrity": "sha512-gUtzV5ASR0MLBwDNqri4kBsgKNCcRQd9qOlNw/w/deavD0cl3JmWXXfH8JhKM4LTg6LPTt2IOQ4px3YYfgh2Xg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-6.1.0.tgz", + "integrity": "sha512-p/tjBw58O6vxKIWMlrU+yys8lqR3+l3UrqwNTT7wpj+dQ7N4etQekFM8joI+cWzPDYqZf54kN+hLC1+s5TvZvg==", "dev": true }, "node_modules/jasmine-spec-reporter": { @@ -18577,12 +18561,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/mdn-data": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.23.0.tgz", - "integrity": "sha512-786vq1+4079JSeu2XdcDjrhi/Ry7BWtjDl9WtGPWLiIHb2T66GvIVflZTBoSNZ5JqTtJGYEVMuFA/lbQlMOyDQ==", - "dev": true - }, "node_modules/mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", @@ -28755,16 +28733,6 @@ "@types/json-schema": "^7.0.15" } }, - "@eslint/css-tree": { - "version": "3.6.9", - "resolved": "https://registry.npmjs.org/@eslint/css-tree/-/css-tree-3.6.9.tgz", - "integrity": "sha512-3D5/OHibNEGk+wKwNwMbz63NMf367EoR4mVNNpxddCHKEb2Nez7z62J2U6YjtErSsZDoY0CsccmoUpdEbkogNA==", - "dev": true, - "requires": { - "mdn-data": "2.23.0", - "source-map-js": "^1.0.1" - } - }, "@eslint/eslintrc": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", @@ -29125,74 +29093,71 @@ } }, "@html-eslint/core": { - "version": "0.57.0", - "resolved": "https://registry.npmjs.org/@html-eslint/core/-/core-0.57.0.tgz", - "integrity": "sha512-X/cKrOmXrxZSdgyKwtbaCuuJ1k/u82MK58Q6p1TzfwPatwIYx+icfBv1Vp1dLui0L0y1fwBW4H+TKhBf7mMKmg==", + "version": "0.58.1", + "resolved": "https://registry.npmjs.org/@html-eslint/core/-/core-0.58.1.tgz", + "integrity": "sha512-GHYDt2Q3ws9aa0/bmMhkv21ExQJnrjKY/iByjdBVp3lBq49wlzIzvAfcx4Bsp+RMV3oPZhzlnLhPpXLuVYt2mQ==", "dev": true, "requires": { - "@html-eslint/types": "^0.57.0", - "eslint": "^9.39.1", + "@html-eslint/types": "^0.58.1", "html-standard": "^0.0.13" } }, "@html-eslint/eslint-plugin": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.57.1.tgz", - "integrity": "sha512-IDfdk3V27eebNpdXD2NLy/lnTSbUuKrro/6YJICBn/9aiXPXagNqWJB38qcSWEoxADbXfSSn17DJWcXvQTkHBg==", + "version": "0.58.1", + "resolved": "https://registry.npmjs.org/@html-eslint/eslint-plugin/-/eslint-plugin-0.58.1.tgz", + "integrity": "sha512-aizTTKbNF2sW+lXWP+uWBoo5Ud9xtUkr70+0pYhItwJF0yhRqLQ91PhW+9afC0daymQjn13MunzDPwGPG0seDg==", "dev": true, "requires": { "@eslint/plugin-kit": "^0.4.1", - "@html-eslint/core": "^0.57.0", - "@html-eslint/parser": "^0.57.1", - "@html-eslint/template-parser": "^0.57.0", - "@html-eslint/template-syntax-parser": "^0.57.0", - "@html-eslint/types": "^0.57.0", + "@html-eslint/core": "^0.58.1", + "@html-eslint/parser": "^0.58.1", + "@html-eslint/template-parser": "^0.58.1", + "@html-eslint/template-syntax-parser": "^0.58.1", + "@html-eslint/types": "^0.58.1", "@rviscomi/capo.js": "^2.1.0", "html-standard": "^0.0.13" } }, "@html-eslint/parser": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.57.1.tgz", - "integrity": "sha512-nQ5vw7Os+Snjxq9hLLBak2bv502Obn77BNOWfGK2+GIrShxtGd8w1ehlKW3EB5/RQzqBk6VDK8nPfexlR3M7kg==", + "version": "0.58.1", + "resolved": "https://registry.npmjs.org/@html-eslint/parser/-/parser-0.58.1.tgz", + "integrity": "sha512-a87peH9HcVDrKZZIYdfMlPZ+72nIktAitKcdoHQevuaXWsgvDtClKihJyy5dZS9md6hIbCh62Og5gQRhl85ZMg==", "dev": true, "requires": { - "@eslint/css-tree": "^3.6.9", - "@html-eslint/template-syntax-parser": "^0.57.0", - "@html-eslint/types": "^0.57.0", + "@html-eslint/template-syntax-parser": "^0.58.1", + "@html-eslint/types": "^0.58.1", "css-tree": "^3.1.0", "es-html-parser": "0.3.1" } }, "@html-eslint/template-parser": { - "version": "0.57.0", - "resolved": "https://registry.npmjs.org/@html-eslint/template-parser/-/template-parser-0.57.0.tgz", - "integrity": "sha512-tddyBo4dEl4W4Ehxuyd6H4jsSqvsfL5F7Bj9/aFfdQyv36q7BGWM2BRHb6FMmYKAPGZ3VzyEbUlcqIwXpDkY3w==", + "version": "0.58.1", + "resolved": "https://registry.npmjs.org/@html-eslint/template-parser/-/template-parser-0.58.1.tgz", + "integrity": "sha512-qo6jTc4Y6vVgwPc2w+EQigH7uCAn+LExxE5oG1URRT98UiJ7dItX0Qk44r/+5XQwSS1TsdvBNLxM2NAktETSWA==", "dev": true, "requires": { - "@html-eslint/types": "^0.57.0", + "@html-eslint/types": "^0.58.1", "es-html-parser": "0.3.1" } }, "@html-eslint/template-syntax-parser": { - "version": "0.57.0", - "resolved": "https://registry.npmjs.org/@html-eslint/template-syntax-parser/-/template-syntax-parser-0.57.0.tgz", - "integrity": "sha512-vHp5y4TR+HhgMDi3rAkgm90LBptSZaQUJudZSj+WdvnSBjLe/fgJC4aVjtLVHTS9ynORrFio8AmH1Bz20kYk4g==", + "version": "0.58.1", + "resolved": "https://registry.npmjs.org/@html-eslint/template-syntax-parser/-/template-syntax-parser-0.58.1.tgz", + "integrity": "sha512-P1ZhxIPm9qFWSees2/EZ7Etg1OXziqzRZEuI9goO91fJS6dmdT4JnHLugN06FLL706RwpvenBUlE0iZA9/MXdg==", "dev": true, "requires": { - "@html-eslint/types": "^0.57.0" + "@html-eslint/types": "^0.58.1" } }, "@html-eslint/types": { - "version": "0.57.0", - "resolved": "https://registry.npmjs.org/@html-eslint/types/-/types-0.57.0.tgz", - "integrity": "sha512-wZAHc9FHZRVAcKyx1NdMNGpw1Jo/Anh+9y+bTQ/cKjh5MHJlbs8ogthIG8efBVFIVlIgzxEA8yrX+DPXmuWisA==", + "version": "0.58.1", + "resolved": "https://registry.npmjs.org/@html-eslint/types/-/types-0.58.1.tgz", + "integrity": "sha512-1F2A5XXpgfHQ8dm14E/EztyERoVldT91VGMZCJECZpidf5Cbc21vxeHLT6/POTJm0ICJOmyBlocF62i/rkoVEQ==", "dev": true, "requires": { "@types/css-tree": "^2.3.11", "@types/estree": "^1.0.6", - "es-html-parser": "0.3.1", - "eslint": "^9.39.1" + "es-html-parser": "0.3.1" } }, "@humanfs/core": { @@ -36867,9 +36832,9 @@ } }, "jasmine-core": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-6.0.1.tgz", - "integrity": "sha512-gUtzV5ASR0MLBwDNqri4kBsgKNCcRQd9qOlNw/w/deavD0cl3JmWXXfH8JhKM4LTg6LPTt2IOQ4px3YYfgh2Xg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-6.1.0.tgz", + "integrity": "sha512-p/tjBw58O6vxKIWMlrU+yys8lqR3+l3UrqwNTT7wpj+dQ7N4etQekFM8joI+cWzPDYqZf54kN+hLC1+s5TvZvg==", "dev": true }, "jasmine-spec-reporter": { @@ -37986,12 +37951,6 @@ "@types/mdast": "^4.0.0" } }, - "mdn-data": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.23.0.tgz", - "integrity": "sha512-786vq1+4079JSeu2XdcDjrhi/Ry7BWtjDl9WtGPWLiIHb2T66GvIVflZTBoSNZ5JqTtJGYEVMuFA/lbQlMOyDQ==", - "dev": true - }, "mdurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index c06f5e829b7..3ea57a86d73 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -14,8 +14,8 @@ "@angular-eslint/template-parser": "20.7.0", "@angular/language-service": "21.1.6", "@eslint/js": "^9.39.2", - "@html-eslint/eslint-plugin": "^0.57.1", - "@html-eslint/parser": "^0.57.1", + "@html-eslint/eslint-plugin": "^0.58.1", + "@html-eslint/parser": "^0.58.1", "@jsdevtools/coverage-istanbul-loader": "3.0.5", "@stylistic/eslint-plugin": "^5.7.1", "@types/codemirror": "5.60.5", @@ -48,7 +48,7 @@ "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^7.0.1", "globals": "^17.3.0", - "jasmine-core": "~6.0.1", + "jasmine-core": "~6.1.0", "jasmine-spec-reporter": "~7.0.0", "karma": "~6.4.4", "karma-chrome-launcher": "~3.2.0", diff --git a/frontend/src/app/core/global_search/input/global-search-input.component.ts b/frontend/src/app/core/global_search/input/global-search-input.component.ts index 5a48ecf60b7..35158e66d93 100644 --- a/frontend/src/app/core/global_search/input/global-search-input.component.ts +++ b/frontend/src/app/core/global_search/input/global-search-input.component.ts @@ -7,7 +7,6 @@ import { ElementRef, HostListener, Input, - NgZone, OnDestroy, ViewChild, ViewEncapsulation, @@ -141,7 +140,6 @@ export class GlobalSearchInputComponent implements AfterViewInit, OnDestroy { readonly deviceService:DeviceService, readonly cdRef:ChangeDetectorRef, readonly halNotification:HalResourceNotificationService, - readonly ngZone:NgZone, readonly recentItemsService:RecentItemsService, ) { populateInputsFromDataset(this); diff --git a/frontend/src/app/features/bim/bcf/fields/display/bcf-thumbnail-field.module.ts b/frontend/src/app/features/bim/bcf/fields/display/bcf-thumbnail-field.module.ts index c0dcd569e31..98a531bca47 100644 --- a/frontend/src/app/features/bim/bcf/fields/display/bcf-thumbnail-field.module.ts +++ b/frontend/src/app/features/bim/bcf/fields/display/bcf-thumbnail-field.module.ts @@ -34,13 +34,14 @@ import { HalLink } from 'core-app/features/hal/hal-link/hal-link'; export class BcfThumbnailDisplayField extends DisplayField { @InjectField() bcfPathHelper:BcfPathHelperService; - public render(element:HTMLElement, displayText:string):void { - const viewpoints = this.resource.bcfViewpoints; + public render(element:HTMLElement, _displayText:string):void { + const viewpoints = this.resource.bcfViewpoints as HalLink[]; if (viewpoints && viewpoints.length > 0) { const viewpoint = viewpoints[0]; - element.innerHTML = ` - - `; + const img = document.createElement('img'); + img.src = this.bcfPathHelper.snapshotPath(viewpoint); + img.classList.add('thumbnail'); + element.appendChild(img); } else { element.innerHTML = ''; } diff --git a/frontend/src/app/features/bim/ifc_models/bcf/list/bcf-list.component.ts b/frontend/src/app/features/bim/ifc_models/bcf/list/bcf-list.component.ts index d41eef463e6..6593200dd8f 100644 --- a/frontend/src/app/features/bim/ifc_models/bcf/list/bcf-list.component.ts +++ b/frontend/src/app/features/bim/ifc_models/bcf/list/bcf-list.component.ts @@ -27,7 +27,7 @@ //++ import { - ChangeDetectionStrategy, Component, Input, NgZone, OnInit, + ChangeDetectionStrategy, Component, Input, OnInit, } from '@angular/core'; import { UIRouterGlobals } from '@uirouter/core'; import { States } from 'core-app/core/states/states.service'; @@ -81,8 +81,6 @@ export class BcfListComponent extends WorkPackageListViewComponent implements Un @InjectField() bcfApi:BcfApiService; - @InjectField() zone:NgZone; - public wpTableConfiguration = { dragAndDropEnabled: false, }; @@ -105,9 +103,7 @@ export class BcfListComponent extends WorkPackageListViewComponent implements Un if (!this.showViewPointInFlight) { this.showViewPointInFlight = true; - this.zone.runOutsideAngular(() => { - setTimeout(() => { this.showViewPointInFlight = false; }, 500); - }); + setTimeout(() => { this.showViewPointInFlight = false; }, 500); const wp = this.states.workPackages.get(workPackageId).value; diff --git a/frontend/src/app/features/plugins/plugin-context.ts b/frontend/src/app/features/plugins/plugin-context.ts index c51d0a50d79..fd8ac7963db 100644 --- a/frontend/src/app/features/plugins/plugin-context.ts +++ b/frontend/src/app/features/plugins/plugin-context.ts @@ -1,4 +1,4 @@ -import { ApplicationRef, Injector, NgZone } from '@angular/core'; +import { ApplicationRef, Injector } from '@angular/core'; import { ToastService } from 'core-app/shared/components/toaster/toast.service'; import { I18nService } from 'core-app/core/i18n/i18n.service'; import { @@ -89,8 +89,13 @@ export class OpenProjectPluginContext { /* eslint-disable-next-line @typescript-eslint/no-explicit-any */ public readonly hooks:Record unknown) => void> = {}; - // Angular zone reference - @InjectField() public readonly zone:NgZone; + /** + * @deprecated Noop shim — the app is zoneless. Remove usages. + */ + public readonly zone = { + run: (cb:() => T):T => cb(), + runOutsideAngular: (cb:() => T):T => cb(), + }; // Angular application reference @InjectField() public readonly appRef:ApplicationRef; @@ -105,12 +110,10 @@ export class OpenProjectPluginContext { } /** - * Run the given callback in the angular zone, - * resulting in triggered change detection that would otherwise not occur. - * - * @param cb + * @deprecated This method is a no-op since the app is zoneless. + * Replace calls with direct invocation of the callback. */ public runInZone(cb:() => void) { - this.zone.run(cb); + cb(); } } diff --git a/frontend/src/app/features/work-packages/components/wp-custom-actions/date-action/custom-date-action-admin.component.spec.ts b/frontend/src/app/features/work-packages/components/wp-custom-actions/date-action/custom-date-action-admin.component.spec.ts new file mode 100644 index 00000000000..e9ff1d4b079 --- /dev/null +++ b/frontend/src/app/features/work-packages/components/wp-custom-actions/date-action/custom-date-action-admin.component.spec.ts @@ -0,0 +1,81 @@ +//-- copyright +// OpenProject is an open source project management software. +// Copyright (C) the OpenProject GmbH +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License version 3. +// +// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +// Copyright (C) 2006-2013 Jean-Philippe Lang +// Copyright (C) 2010-2013 the ChiliProject Team +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +// See COPYRIGHT and LICENSE files for more details. +//++ + +import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { FormsModule } from '@angular/forms'; +import { By } from '@angular/platform-browser'; +import { I18nService } from 'core-app/core/i18n/i18n.service'; +import { CustomDateActionAdminComponent } from './custom-date-action-admin.component'; + +describe('CustomDateActionAdminComponent', () => { + let fixture:ComponentFixture; + let component:CustomDateActionAdminComponent; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [CustomDateActionAdminComponent], + imports: [FormsModule], + providers: [ + { + provide: I18nService, + useValue: { + t:(key:string) => { + switch (key) { + case 'js.custom_actions.date.specific': + return 'on'; + case 'js.custom_actions.date.current_date': + return 'Current date'; + default: + return key; + } + }, + }, + }, + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA], + }).compileComponents(); + + fixture = TestBed.createComponent(CustomDateActionAdminComponent); + component = fixture.componentInstance; + fixture.nativeElement.dataset.fieldName = 'custom_action[actions][date]'; + }); + + it('stores the current date sentinel when the operator is changed to current date', () => { + fixture.detectChanges(); + + const select = fixture.debugElement.query(By.css('select')).nativeElement as HTMLSelectElement; + const hiddenInput = fixture.debugElement.query(By.css('input[type="hidden"]')).nativeElement as HTMLInputElement; + + select.value = 'current'; + select.dispatchEvent(new Event('change')); + + expect(component.selectedOperatorKey).toBe('current'); + expect(hiddenInput.value).toBe('%CURRENT_DATE%'); + }); +}); diff --git a/frontend/src/app/features/work-packages/components/wp-custom-actions/date-action/custom-date-action-admin.component.ts b/frontend/src/app/features/work-packages/components/wp-custom-actions/date-action/custom-date-action-admin.component.ts index 3685e3af233..cfb0e4f987e 100644 --- a/frontend/src/app/features/work-packages/components/wp-custom-actions/date-action/custom-date-action-admin.component.ts +++ b/frontend/src/app/features/work-packages/components/wp-custom-actions/date-action/custom-date-action-admin.component.ts @@ -94,6 +94,7 @@ export class CustomDateActionAdminComponent implements OnInit { } this.updateDbValue(); + this.cdRef.detectChanges(); } private updateDbValue() { diff --git a/frontend/src/app/features/work-packages/components/wp-relations/wp-relations-create/wp-relations-autocomplete/wp-relations-autocomplete.component.ts b/frontend/src/app/features/work-packages/components/wp-relations/wp-relations-create/wp-relations-autocomplete/wp-relations-autocomplete.component.ts index 5e79e5fb615..d126b2a93b9 100644 --- a/frontend/src/app/features/work-packages/components/wp-relations/wp-relations-create/wp-relations-autocomplete/wp-relations-autocomplete.component.ts +++ b/frontend/src/app/features/work-packages/components/wp-relations/wp-relations-create/wp-relations-autocomplete/wp-relations-autocomplete.component.ts @@ -94,14 +94,12 @@ export class WorkPackageRelationsAutocompleteComponent extends OpAutocompleterCo opened() { // Force reposition as a workaround for BUG // https://github.com/ng-select/ng-select/issues/1259 - this.ngZone.runOutsideAngular(() => { - setTimeout(() => { - this.ngSelectInstance.dropdownPanel.adjustPosition(); - document.querySelector(this.hiddenOverflowContainer)?.addEventListener('scroll', () => { - this.ngSelectInstance.close(); - }, { once: true }); - }, 25); - }); + setTimeout(() => { + this.ngSelectInstance.dropdownPanel.adjustPosition(); + document.querySelector(this.hiddenOverflowContainer)?.addEventListener('scroll', () => { + this.ngSelectInstance.close(); + }, { once: true }); + }, 25); } getAutocompleterData(query:string|null):Observable { diff --git a/frontend/src/app/features/work-packages/components/wp-table/wp-table.component.ts b/frontend/src/app/features/work-packages/components/wp-table/wp-table.component.ts index b370d26c6c2..311f9a11443 100644 --- a/frontend/src/app/features/work-packages/components/wp-table/wp-table.component.ts +++ b/frontend/src/app/features/work-packages/components/wp-table/wp-table.component.ts @@ -34,7 +34,6 @@ import { EventEmitter, Injector, Input, - NgZone, OnInit, Output, ViewEncapsulation, OnDestroy, @@ -144,7 +143,6 @@ export class WorkPackagesTableComponent extends UntilDestroyedMixin implements O readonly querySpace:IsolatedQuerySpace, readonly I18n:I18nService, readonly cdRef:ChangeDetectorRef, - readonly zone:NgZone, readonly wpTableGroupBy:WorkPackageViewGroupByService, readonly wpTableTimeline:WorkPackageViewTimelineService, readonly wpTableColumns:WorkPackageViewColumnsService, diff --git a/frontend/src/app/features/work-packages/routing/wp-list-view/wp-list-view.component.ts b/frontend/src/app/features/work-packages/routing/wp-list-view/wp-list-view.component.ts index 6f0bc5e1db0..913a7fa4b57 100644 --- a/frontend/src/app/features/work-packages/routing/wp-list-view/wp-list-view.component.ts +++ b/frontend/src/app/features/work-packages/routing/wp-list-view/wp-list-view.component.ts @@ -33,7 +33,6 @@ import { ElementRef, inject, Injector, - NgZone, OnInit, } from '@angular/core'; import { take } from 'rxjs/operators'; @@ -83,8 +82,7 @@ export class WorkPackageListViewComponent extends UntilDestroyedMixin implements readonly CurrentProject = inject(CurrentProjectService); readonly wpDisplayRepresentation = inject(WorkPackageViewDisplayRepresentationService); readonly cdRef = inject(ChangeDetectorRef); - readonly elementRef = inject(ElementRef); - readonly ngZone = inject(NgZone); + readonly elementRef = inject>(ElementRef); readonly wpTableBaseline = inject(WorkPackageViewBaselineService); readonly pathHelper = inject(PathHelperService); @@ -135,24 +133,21 @@ export class WorkPackageListViewComponent extends UntilDestroyedMixin implements // the 'back button', the last selected card is visible on this list. // ngAfterViewInit doesn't find the .-checked elements on components // that inherit from this class (BcfListContainerComponent) so - // opting for a timeout 'runOutsideAngular' to avoid running change - // detection on the entire app - this.ngZone.runOutsideAngular(() => { - setTimeout(() => { - const selectedRow = this.elementRef.nativeElement.querySelector('.wp-table--row.-checked'); - const selectedCard = this.elementRef.nativeElement.querySelector('[data-test-selector="op-wp-single-card"].-checked'); + // opting for a timeout to defer until the DOM is ready + setTimeout(() => { + const selectedRow = this.elementRef.nativeElement.querySelector('.wp-table--row.-checked'); + const selectedCard = this.elementRef.nativeElement.querySelector('[data-test-selector="op-wp-single-card"].-checked'); - // The header of the table hides the scrolledIntoView element - // so we scrollIntoView the previous element, if any - if (selectedRow?.previousSibling) { - selectedRow.previousSibling.scrollIntoView({ block: 'start' }); - } + // The header of the table hides the scrolledIntoView element + // so we scrollIntoView the previous element, if any + if (selectedRow?.previousElementSibling) { + selectedRow.previousElementSibling.scrollIntoView({ block: 'start' }); + } - if (selectedCard) { - selectedCard.scrollIntoView({ block: 'start' }); - } - }, 0); - }); + if (selectedCard) { + selectedCard.scrollIntoView({ block: 'start' }); + } + }, 0); } protected setupInformationLoadedListener() { diff --git a/frontend/src/app/shared/components/autocompleter/op-autocompleter/op-autocompleter.component.ts b/frontend/src/app/shared/components/autocompleter/op-autocompleter/op-autocompleter.component.ts index 8a9a0d59bde..f60b346e471 100644 --- a/frontend/src/app/shared/components/autocompleter/op-autocompleter/op-autocompleter.component.ts +++ b/frontend/src/app/shared/components/autocompleter/op-autocompleter/op-autocompleter.component.ts @@ -12,7 +12,6 @@ import { HostBinding, Injector, Input, - NgZone, OnChanges, OnInit, Output, @@ -306,7 +305,6 @@ export class OpAutocompleterComponent { - setTimeout(() => { - this.ngSelectInstance.focus(); - }, 25); - }); + setTimeout(() => { + this.ngSelectInstance.focus(); + }, 25); } public closed():void { diff --git a/frontend/src/global_styles/content/_pagination.sass b/frontend/src/global_styles/content/_pagination.sass index c93cf0c981d..02983059d5b 100644 --- a/frontend/src/global_styles/content/_pagination.sass +++ b/frontend/src/global_styles/content/_pagination.sass @@ -34,6 +34,10 @@ $pagination--font-size: 0.8125rem width: 100% min-height: 45px + &--single-page + @media screen and (max-width: $breakpoint-sm) + display: none + &--pages display: flex flex-grow: 2 diff --git a/frontend/src/stimulus/controllers/dynamic/meetings/participants/update-occurrence-participants.controller.ts b/frontend/src/stimulus/controllers/dynamic/meetings/participants/update-occurrence-participants.controller.ts new file mode 100644 index 00000000000..5f70ce88172 --- /dev/null +++ b/frontend/src/stimulus/controllers/dynamic/meetings/participants/update-occurrence-participants.controller.ts @@ -0,0 +1,71 @@ +/* + * -- copyright + * OpenProject is an open source project management software. + * Copyright (C) the OpenProject GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version 3. + * + * OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: + * Copyright (C) 2006-2013 Jean-Philippe Lang + * Copyright (C) 2010-2013 the ChiliProject Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * See COPYRIGHT and LICENSE files for more details. + * ++ + */ + +import { Controller } from '@hotwired/stimulus'; + +export default class UpdateOccurrenceParticipantsController extends Controller { + static targets = ['removeButton', 'controlCheckbox']; + + // Tracks checkbox state so it isn't reset after every action + // Initially true to match the rendered default + private applyToUpcoming = true; + + controlCheckboxTargetConnected(element:HTMLInputElement):void { + element.checked = this.applyToUpcoming; + element.addEventListener('change', this.handleCheckboxChange); + } + + controlCheckboxTargetDisconnected(element:HTMLInputElement):void { + element.removeEventListener('change', this.handleCheckboxChange); + } + + removeButtonTargetConnected(element:HTMLAnchorElement):void { + element.addEventListener('click', this.handleRemoveClick); + } + + removeButtonTargetDisconnected(element:HTMLAnchorElement):void { + element.removeEventListener('click', this.handleRemoveClick); + } + + private handleCheckboxChange = (event:Event):void => { + this.applyToUpcoming = (event.target as HTMLInputElement).checked; + }; + + private handleRemoveClick = (event:MouseEvent):void => { + const button = event.currentTarget as HTMLAnchorElement; + const url = new URL(button.href); + if (this.applyToUpcoming) { + url.searchParams.set('apply_to_upcoming', '1'); + } else { + url.searchParams.delete('apply_to_upcoming'); + } + button.href = url.toString(); + }; +} diff --git a/frontend/src/turbo/action-menu-morph-remount.ts b/frontend/src/turbo/action-menu-morph-remount.ts new file mode 100644 index 00000000000..29266102da8 --- /dev/null +++ b/frontend/src/turbo/action-menu-morph-remount.ts @@ -0,0 +1,60 @@ +/* + * -- copyright + * OpenProject is an open source project management software. + * Copyright (C) the OpenProject GmbH + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License version 3. + * + * OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: + * Copyright (C) 2006-2013 Jean-Philippe Lang + * Copyright (C) 2010-2013 the ChiliProject Team + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * See COPYRIGHT and LICENSE files for more details. + * ++ + */ + +/** + * Primer `` with `src` (via `Primer::Alpha::ActionMenu`) lazy loads + * the menu items via ``. + * It registers `include-fragment-replaced` only in `connectedCallback`, while Turbo + * Idiomorph can leave the same `` host connected while swapping + * in a new ``. Since the `` is not replaced, the fragment + * replaced event is never fired, the component will stay in a loading state after morph. + * + * Replacing each affected `` host forces `connectedCallback` and + * a correct listener. We hook `turbo:morph-element` so this applies to turbo-stream + * morph, frame morph, and full-page morph alike. + */ + +interface TurboMorphElementDetail { + currentElement:HTMLElement; + newElement:HTMLElement; +} + +export function registerActionMenuMorphRemount():void { + document.addEventListener('turbo:morph-element', (event:Event) => { + const { detail } = event as CustomEvent; + const currentElement = detail?.currentElement; + if (!currentElement?.matches('action-menu:has(include-fragment[src])')) { + return; + } + + const clone = currentElement.cloneNode(true); + currentElement.replaceWith(clone); + }); +} diff --git a/frontend/src/turbo/setup.ts b/frontend/src/turbo/setup.ts index c384b98ab41..2b1f597f3a7 100644 --- a/frontend/src/turbo/setup.ts +++ b/frontend/src/turbo/setup.ts @@ -11,6 +11,7 @@ import { debugLog, whenDebugging } from 'core-app/shared/helpers/debug_output'; import { TURBO_EVENTS } from './constants'; import { StreamActions } from '@hotwired/turbo'; import { addTurboAngularWrapper } from 'core-turbo/turbo-angular-wrapper'; +import { registerActionMenuMorphRemount } from './action-menu-morph-remount'; Turbo.session.drive = true; Turbo.config.drive.progressBarDelay = 100; @@ -37,6 +38,7 @@ whenDebugging(() => { // Register our own actions addTurboEventListeners(); addTurboGlobalListeners(); +registerActionMenuMorphRemount(); registerDialogStreamAction(); registerFlashStreamAction(); registerLiveRegionStreamAction(); diff --git a/modules/auth_saml/app/components/saml/providers/confirm_destroy_dialog_component.html.erb b/modules/auth_saml/app/components/saml/providers/confirm_destroy_dialog_component.html.erb new file mode 100644 index 00000000000..cdbe646bcb0 --- /dev/null +++ b/modules/auth_saml/app/components/saml/providers/confirm_destroy_dialog_component.html.erb @@ -0,0 +1,55 @@ +<%#-- copyright +OpenProject is an open source project management software. +Copyright (C) the OpenProject GmbH + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License version 3. + +OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +Copyright (C) 2006-2013 Jean-Philippe Lang +Copyright (C) 2010-2013 the ChiliProject Team + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +See COPYRIGHT and LICENSE files for more details. + +++#%> + +<%= + render( + Primer::OpenProject::DangerDialog.new( + title: I18n.t("saml.delete_title"), + form_arguments:, + size: :large + ) + ) do |dialog| +%> + <% dialog.with_confirmation_message do |message| + message.with_heading(tag: :h2) { I18n.t("saml.delete_heading") } + message.with_description_content( + I18n.t("provider.delete_warning.provider_html", name: @provider.display_name) + ) + end %> + <% dialog.with_additional_details do %> +
    +
  • <%= I18n.t("provider.delete_warning.delete_result_1") %>
  • +
  • <%= I18n.t("provider.delete_warning.delete_result_user_count", count: @provider.user_count) %>
  • + <% if direct_login? %> +
  • <%= I18n.t("provider.delete_warning.delete_result_direct") %>
  • + <% end %> +
+ <% end %> + <% dialog.with_confirmation_check_box_content(I18n.t(:text_permanent_delete_confirmation_checkbox_label)) %> +<% end %> diff --git a/modules/auth_saml/app/components/saml/providers/confirm_destroy_dialog_component.rb b/modules/auth_saml/app/components/saml/providers/confirm_destroy_dialog_component.rb new file mode 100644 index 00000000000..8d6063c49cf --- /dev/null +++ b/modules/auth_saml/app/components/saml/providers/confirm_destroy_dialog_component.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module Saml + module Providers + class ConfirmDestroyDialogComponent < ApplicationComponent + include OpTurbo::Streamable + + def initialize(provider:) + super + @provider = provider + end + + def form_arguments + { + action: saml_provider_path(@provider), + method: :delete + } + end + + def direct_login? + Setting.omniauth_direct_login_provider == @provider.slug + end + end + end +end diff --git a/modules/auth_saml/app/components/saml/providers/row_component.rb b/modules/auth_saml/app/components/saml/providers/row_component.rb index 9fadd742ec4..a545365e80b 100644 --- a/modules/auth_saml/app/components/saml/providers/row_component.rb +++ b/modules/auth_saml/app/components/saml/providers/row_component.rb @@ -51,8 +51,8 @@ module Saml link_to( helpers.op_icon("icon icon-delete button--link"), - url_for(action: :destroy, id: provider.id), - data: { turbo_method: :delete, turbo_confirm: I18n.t(:text_are_you_sure) }, + url_for(action: :confirm_destroy, id: provider.id), + data: { turbo_stream: true }, title: t(:button_delete) ) end diff --git a/modules/auth_saml/app/controllers/saml/providers_controller.rb b/modules/auth_saml/app/controllers/saml/providers_controller.rb index 2c52d37e8fc..4a56f348405 100644 --- a/modules/auth_saml/app/controllers/saml/providers_controller.rb +++ b/modules/auth_saml/app/controllers/saml/providers_controller.rb @@ -84,7 +84,9 @@ module Saml end end - def confirm_destroy; end + def confirm_destroy + respond_with_dialog Saml::Providers::ConfirmDestroyDialogComponent.new(provider: @provider) + end def destroy call = ::Saml::Providers::DeleteService diff --git a/modules/auth_saml/app/views/saml/providers/confirm_destroy.html.erb b/modules/auth_saml/app/views/saml/providers/confirm_destroy.html.erb deleted file mode 100644 index 57788a906b8..00000000000 --- a/modules/auth_saml/app/views/saml/providers/confirm_destroy.html.erb +++ /dev/null @@ -1,69 +0,0 @@ -<%# -- copyright -OpenProject is an open source project management software. -Copyright (C) the OpenProject GmbH - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License version 3. - -OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -Copyright (C) 2006-2013 Jean-Philippe Lang -Copyright (C) 2010-2013 the ChiliProject Team - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -See COPYRIGHT and LICENSE files for more details. - -++# %> -<%= styled_form_tag( - saml_provider_path(@provider), - class: "danger-zone", - method: :delete - ) do %> -
-

- <%= t("saml.delete_title") %> -

-

- <%= t("provider.delete_warning.provider_html", name: content_tag(:strong, @provider.display_name)) %> -

-
    -
  • <%= t("provider.delete_warning.delete_result_1") %>
  • -
  • <%= t("provider.delete_warning.delete_result_user_count", count: @provider.user_count) %>
  • - <% if Setting.omniauth_direct_login_provider == @provider.slug %> -
  • <%= t("provider.delete_warning.delete_result_direct") %>
  • - <% end %> -
-

- - <%= t("provider.delete_warning.irreversible_notice") %> -

-

- <%= t("provider.delete_warning.input_delete_confirmation_html", - name: content_tag(:em, @provider.display_name, class: "danger-zone--expected-value")) %> -

-
- <%= text_field_tag :delete_confirmation %> - <%= styled_button_tag title: t(:button_delete), class: "-primary", disabled: true do - concat content_tag :i, "", class: "button--icon icon-delete" - concat content_tag :span, t(:button_delete), class: "button--text" - end %> - <%= link_to saml_providers_path, - title: t(:button_cancel), - class: "button -with-icon icon-cancel" do %> - <%= t(:button_cancel) %> - <% end %> -
-
-<% end %> diff --git a/modules/auth_saml/app/views/saml/providers/show.html.erb b/modules/auth_saml/app/views/saml/providers/show.html.erb index 62ac4375b3f..ba4aaacc253 100644 --- a/modules/auth_saml/app/views/saml/providers/show.html.erb +++ b/modules/auth_saml/app/views/saml/providers/show.html.erb @@ -18,6 +18,7 @@ size: :medium, href: confirm_destroy_saml_provider_path(@provider), aria: { label: I18n.t(:button_delete) }, + data: { turbo_stream: true }, title: I18n.t(:button_delete) ) do |button| button.with_leading_visual_icon(icon: :trash) diff --git a/modules/auth_saml/config/locales/crowdin/af.yml b/modules/auth_saml/config/locales/crowdin/af.yml index f99c8730e8d..36600b59a5a 100644 --- a/modules/auth_saml/config/locales/crowdin/af.yml +++ b/modules/auth_saml/config/locales/crowdin/af.yml @@ -34,6 +34,7 @@ af: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/ar.yml b/modules/auth_saml/config/locales/crowdin/ar.yml index 8371bd36283..636a624beaf 100644 --- a/modules/auth_saml/config/locales/crowdin/ar.yml +++ b/modules/auth_saml/config/locales/crowdin/ar.yml @@ -34,6 +34,7 @@ ar: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/az.yml b/modules/auth_saml/config/locales/crowdin/az.yml index 4471234fdf4..79942bfabf2 100644 --- a/modules/auth_saml/config/locales/crowdin/az.yml +++ b/modules/auth_saml/config/locales/crowdin/az.yml @@ -34,6 +34,7 @@ az: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/be.yml b/modules/auth_saml/config/locales/crowdin/be.yml index 598a68158cf..812ed9874e7 100644 --- a/modules/auth_saml/config/locales/crowdin/be.yml +++ b/modules/auth_saml/config/locales/crowdin/be.yml @@ -34,6 +34,7 @@ be: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/bg.yml b/modules/auth_saml/config/locales/crowdin/bg.yml index fc3364c1577..39d92d8ff5d 100644 --- a/modules/auth_saml/config/locales/crowdin/bg.yml +++ b/modules/auth_saml/config/locales/crowdin/bg.yml @@ -34,6 +34,7 @@ bg: saml: menu_title: Доставчици на SAML delete_title: Изтриване на SAML доставчик + delete_heading: Delete this SAML provider? info: title: Параметри на конфигурацията на протокола SAML description: 'Използвайте тези параметри, за да конфигурирате връзката на вашия доставчик на идентичност с OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/ca.yml b/modules/auth_saml/config/locales/crowdin/ca.yml index 3afe5e78c83..29a2fc9592a 100644 --- a/modules/auth_saml/config/locales/crowdin/ca.yml +++ b/modules/auth_saml/config/locales/crowdin/ca.yml @@ -34,6 +34,7 @@ ca: saml: menu_title: Proveïdors SAML delete_title: Suprimeix el proveïdor SAML + delete_heading: Delete this SAML provider? info: title: Paràmetres de configuració del protocol SAML description: 'Utilitzeu aquests paràmetres per configurar la connexió del vostre proveïdor d''identitat a OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/ckb-IR.yml b/modules/auth_saml/config/locales/crowdin/ckb-IR.yml index da9c6c05f24..bf96224fc28 100644 --- a/modules/auth_saml/config/locales/crowdin/ckb-IR.yml +++ b/modules/auth_saml/config/locales/crowdin/ckb-IR.yml @@ -34,6 +34,7 @@ ckb-IR: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/cs.yml b/modules/auth_saml/config/locales/crowdin/cs.yml index 13eff939460..c5f59e29631 100644 --- a/modules/auth_saml/config/locales/crowdin/cs.yml +++ b/modules/auth_saml/config/locales/crowdin/cs.yml @@ -34,6 +34,7 @@ cs: saml: menu_title: Poskytovatelé SAML delete_title: Smazat poskytovatele SAML + delete_heading: Delete this SAML provider? info: title: Parametry konfigurace SAML protokolu description: 'Pomocí těchto parametrů nakonfigurujte připojení poskytovatele identit k aplikaci OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/da.yml b/modules/auth_saml/config/locales/crowdin/da.yml index 7d8a7ebcdd2..d97bdad6eb2 100644 --- a/modules/auth_saml/config/locales/crowdin/da.yml +++ b/modules/auth_saml/config/locales/crowdin/da.yml @@ -34,6 +34,7 @@ da: saml: menu_title: SAML-udbydere delete_title: Slet SAML-udbyder + delete_heading: Delete this SAML provider? info: title: SAML-protokolopsætnningsparametre description: 'Brug disse parametre til at opsætte identitetsudbyderforbindelsen til OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/de.yml b/modules/auth_saml/config/locales/crowdin/de.yml index 16b206f4e26..041764f0a09 100644 --- a/modules/auth_saml/config/locales/crowdin/de.yml +++ b/modules/auth_saml/config/locales/crowdin/de.yml @@ -34,6 +34,7 @@ de: saml: menu_title: SAML-Anbieter delete_title: SAML-Anbieter löschen + delete_heading: Delete this SAML provider? info: title: Konfigurationsparameter für das SAML-Protokoll description: 'Verwenden Sie diese Parameter, um Ihre Identitätsanbieter-Verbindung zu OpenProject zu konfigurieren. diff --git a/modules/auth_saml/config/locales/crowdin/el.yml b/modules/auth_saml/config/locales/crowdin/el.yml index 49760fe8a61..3dbd942f551 100644 --- a/modules/auth_saml/config/locales/crowdin/el.yml +++ b/modules/auth_saml/config/locales/crowdin/el.yml @@ -34,6 +34,7 @@ el: saml: menu_title: Πάροχοι SAML delete_title: Διαγραφή παρόχου SAML + delete_heading: Delete this SAML provider? info: title: Παράμετροι Διαμόρφωσης Πρωτοκόλλου SAML description: 'Χρησιμοποιήστε αυτές τις παραμέτρους για να ρυθμίσετε τη σύνδεση του παρόχου ταυτότητας με το OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/eo.yml b/modules/auth_saml/config/locales/crowdin/eo.yml index 2b26ddedc77..5f6f63e4c87 100644 --- a/modules/auth_saml/config/locales/crowdin/eo.yml +++ b/modules/auth_saml/config/locales/crowdin/eo.yml @@ -34,6 +34,7 @@ eo: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/es.yml b/modules/auth_saml/config/locales/crowdin/es.yml index c6c61233ba0..10d3ad175d6 100644 --- a/modules/auth_saml/config/locales/crowdin/es.yml +++ b/modules/auth_saml/config/locales/crowdin/es.yml @@ -34,6 +34,7 @@ es: saml: menu_title: Proveedores SAML delete_title: Eliminar proveedor SAML + delete_heading: Delete this SAML provider? info: title: Parámetros de configuración del protocolo SAML description: 'Utilice estos parámetros para configurar la conexión de su proveedor de identidad con OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/et.yml b/modules/auth_saml/config/locales/crowdin/et.yml index 84c6c8ad7a8..1bafcff7533 100644 --- a/modules/auth_saml/config/locales/crowdin/et.yml +++ b/modules/auth_saml/config/locales/crowdin/et.yml @@ -34,6 +34,7 @@ et: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/eu.yml b/modules/auth_saml/config/locales/crowdin/eu.yml index 7c0cf86b759..8daea4f87bb 100644 --- a/modules/auth_saml/config/locales/crowdin/eu.yml +++ b/modules/auth_saml/config/locales/crowdin/eu.yml @@ -34,6 +34,7 @@ eu: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/fa.yml b/modules/auth_saml/config/locales/crowdin/fa.yml index 1c57e4e8263..16a0ac07a16 100644 --- a/modules/auth_saml/config/locales/crowdin/fa.yml +++ b/modules/auth_saml/config/locales/crowdin/fa.yml @@ -34,6 +34,7 @@ fa: saml: menu_title: ارائه دهندگان سخت افزاری delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: پارامترهای پیکربندی پروتکل احراز هویت سخت افزاری description: 'جهت پیکربندی ابزار احراز هویت سخت افزاری از این پارامترها استفاده نمایید. diff --git a/modules/auth_saml/config/locales/crowdin/fi.yml b/modules/auth_saml/config/locales/crowdin/fi.yml index d730c4b5aea..d57e1c0ea02 100644 --- a/modules/auth_saml/config/locales/crowdin/fi.yml +++ b/modules/auth_saml/config/locales/crowdin/fi.yml @@ -34,6 +34,7 @@ fi: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/fil.yml b/modules/auth_saml/config/locales/crowdin/fil.yml index 978328b9efb..4441d30067c 100644 --- a/modules/auth_saml/config/locales/crowdin/fil.yml +++ b/modules/auth_saml/config/locales/crowdin/fil.yml @@ -34,6 +34,7 @@ fil: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/fr.yml b/modules/auth_saml/config/locales/crowdin/fr.yml index 5049bb602fc..86f2dd446df 100644 --- a/modules/auth_saml/config/locales/crowdin/fr.yml +++ b/modules/auth_saml/config/locales/crowdin/fr.yml @@ -34,6 +34,7 @@ fr: saml: menu_title: Fournisseurs SAML delete_title: Supprimer le fournisseur SAML + delete_heading: Supprimer ce fournisseur SAML ? info: title: Paramètres de configuration du protocole SAML description: 'Utilisez ces paramètres pour configurer la connexion de votre fournisseur d''identité à OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/he.yml b/modules/auth_saml/config/locales/crowdin/he.yml index df0b6c577ef..4479a920ea8 100644 --- a/modules/auth_saml/config/locales/crowdin/he.yml +++ b/modules/auth_saml/config/locales/crowdin/he.yml @@ -34,6 +34,7 @@ he: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/hi.yml b/modules/auth_saml/config/locales/crowdin/hi.yml index 932169a8433..2bf80d82f76 100644 --- a/modules/auth_saml/config/locales/crowdin/hi.yml +++ b/modules/auth_saml/config/locales/crowdin/hi.yml @@ -34,6 +34,7 @@ hi: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/hr.yml b/modules/auth_saml/config/locales/crowdin/hr.yml index f506a312398..5508eae4385 100644 --- a/modules/auth_saml/config/locales/crowdin/hr.yml +++ b/modules/auth_saml/config/locales/crowdin/hr.yml @@ -34,6 +34,7 @@ hr: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/hu.yml b/modules/auth_saml/config/locales/crowdin/hu.yml index 502499f1e7e..367844c57de 100644 --- a/modules/auth_saml/config/locales/crowdin/hu.yml +++ b/modules/auth_saml/config/locales/crowdin/hu.yml @@ -34,6 +34,7 @@ hu: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/id.yml b/modules/auth_saml/config/locales/crowdin/id.yml index 8a7de304586..f4c814e5923 100644 --- a/modules/auth_saml/config/locales/crowdin/id.yml +++ b/modules/auth_saml/config/locales/crowdin/id.yml @@ -34,6 +34,7 @@ id: saml: menu_title: Penyedia SAML delete_title: Hapus penyedia SAML + delete_heading: Delete this SAML provider? info: title: Parameter Konfigurasi Protokol SAML description: 'Gunakan parameter ini untuk mengkonfigurasi koneksi penyedia identitas Anda ke OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/it.yml b/modules/auth_saml/config/locales/crowdin/it.yml index 4acb4c43cc4..7c1dbf55cc1 100644 --- a/modules/auth_saml/config/locales/crowdin/it.yml +++ b/modules/auth_saml/config/locales/crowdin/it.yml @@ -34,6 +34,7 @@ it: saml: menu_title: Fornitori SAML delete_title: Elimina fornitore SAML + delete_heading: Eliminare questo provider SAML? info: title: Parametri di configurazione del protocollo SAML description: 'Utilizzare questi parametri per configurare la connessione del fornitore di identità a OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/ja.yml b/modules/auth_saml/config/locales/crowdin/ja.yml index 7b2df53a334..247c542620b 100644 --- a/modules/auth_saml/config/locales/crowdin/ja.yml +++ b/modules/auth_saml/config/locales/crowdin/ja.yml @@ -34,6 +34,7 @@ ja: saml: menu_title: SAML プロバイダ delete_title: SAML プロバイダの削除 + delete_heading: Delete this SAML provider? info: title: SAML プロトコル構成パラメータ description: 'これらのパラメータを使用して、OpenProject への ID プロバイダ接続を設定します。 diff --git a/modules/auth_saml/config/locales/crowdin/ka.yml b/modules/auth_saml/config/locales/crowdin/ka.yml index 58833a7795a..8af2aa6c716 100644 --- a/modules/auth_saml/config/locales/crowdin/ka.yml +++ b/modules/auth_saml/config/locales/crowdin/ka.yml @@ -34,6 +34,7 @@ ka: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/kk.yml b/modules/auth_saml/config/locales/crowdin/kk.yml index b2ab8214dfa..8b556f13080 100644 --- a/modules/auth_saml/config/locales/crowdin/kk.yml +++ b/modules/auth_saml/config/locales/crowdin/kk.yml @@ -34,6 +34,7 @@ kk: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/ko.yml b/modules/auth_saml/config/locales/crowdin/ko.yml index 9cab1c02b80..bfa6cd74e8a 100644 --- a/modules/auth_saml/config/locales/crowdin/ko.yml +++ b/modules/auth_saml/config/locales/crowdin/ko.yml @@ -34,6 +34,7 @@ ko: saml: menu_title: SAML 공급자 delete_title: SAML 공급자 삭제 + delete_heading: Delete this SAML provider? info: title: SAML 프로토콜 구성 매개 변수 description: '이러한 매개 변수를 사용하여 OpenProject에 대한 ID 공급자 연결을 구성합니다. diff --git a/modules/auth_saml/config/locales/crowdin/lt.yml b/modules/auth_saml/config/locales/crowdin/lt.yml index be020256cdb..24f060d22c3 100644 --- a/modules/auth_saml/config/locales/crowdin/lt.yml +++ b/modules/auth_saml/config/locales/crowdin/lt.yml @@ -34,6 +34,7 @@ lt: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/lv.yml b/modules/auth_saml/config/locales/crowdin/lv.yml index 4a559cd865a..eae507b9461 100644 --- a/modules/auth_saml/config/locales/crowdin/lv.yml +++ b/modules/auth_saml/config/locales/crowdin/lv.yml @@ -34,6 +34,7 @@ lv: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/mn.yml b/modules/auth_saml/config/locales/crowdin/mn.yml index 77fde4ff60a..03a00b7711a 100644 --- a/modules/auth_saml/config/locales/crowdin/mn.yml +++ b/modules/auth_saml/config/locales/crowdin/mn.yml @@ -34,6 +34,7 @@ mn: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/ms.yml b/modules/auth_saml/config/locales/crowdin/ms.yml index 4c6c4ad0016..c429036067d 100644 --- a/modules/auth_saml/config/locales/crowdin/ms.yml +++ b/modules/auth_saml/config/locales/crowdin/ms.yml @@ -34,6 +34,7 @@ ms: saml: menu_title: Penyedia SAML delete_title: Padam Penyedia SAML + delete_heading: Delete this SAML provider? info: title: Parameter Konfigurasi Protokol SAML description: 'Gunakan parameter ini untuk mengkonfigurasi sambungan pembekal identiti anda kepada OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/ne.yml b/modules/auth_saml/config/locales/crowdin/ne.yml index 0d6773c38e2..edd3460a6a8 100644 --- a/modules/auth_saml/config/locales/crowdin/ne.yml +++ b/modules/auth_saml/config/locales/crowdin/ne.yml @@ -34,6 +34,7 @@ ne: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/nl.yml b/modules/auth_saml/config/locales/crowdin/nl.yml index 1612f9b0dfd..5c87d884bb5 100644 --- a/modules/auth_saml/config/locales/crowdin/nl.yml +++ b/modules/auth_saml/config/locales/crowdin/nl.yml @@ -34,6 +34,7 @@ nl: saml: menu_title: SAML-leveranciers delete_title: SAML provider verwijderen + delete_heading: Delete this SAML provider? info: title: SAML-protocol configuratieparameters description: 'Gebruik deze parameters om uw identity provider verbinding met OpenProject te configureren. diff --git a/modules/auth_saml/config/locales/crowdin/no.yml b/modules/auth_saml/config/locales/crowdin/no.yml index 3c711720e18..939dcc5b35d 100644 --- a/modules/auth_saml/config/locales/crowdin/no.yml +++ b/modules/auth_saml/config/locales/crowdin/no.yml @@ -34,6 +34,7 @@ saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/pl.yml b/modules/auth_saml/config/locales/crowdin/pl.yml index b287fc6ef6d..26484c5e413 100644 --- a/modules/auth_saml/config/locales/crowdin/pl.yml +++ b/modules/auth_saml/config/locales/crowdin/pl.yml @@ -34,6 +34,7 @@ pl: saml: menu_title: Dostawcy SAML delete_title: Usuń dostawcę SAML + delete_heading: Delete this SAML provider? info: title: Parametry konfiguracji protokołu SAML description: 'Użyj tych parametrów, aby skonfigurować połączenie dostawcy tożsamości z OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/pt-BR.yml b/modules/auth_saml/config/locales/crowdin/pt-BR.yml index ea76954ca5f..b7ca47cf570 100644 --- a/modules/auth_saml/config/locales/crowdin/pt-BR.yml +++ b/modules/auth_saml/config/locales/crowdin/pt-BR.yml @@ -34,6 +34,7 @@ pt-BR: saml: menu_title: Provedores SAML delete_title: Excluir provedor SAML + delete_heading: Deseja excluir este provedor SAML? info: title: Parâmetros de configuração do protocolo SAML description: 'Use esses parâmetros para configurar a conexão do seu provedor de identidade ao OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/pt-PT.yml b/modules/auth_saml/config/locales/crowdin/pt-PT.yml index 15ec07c1ce7..fb58285827c 100644 --- a/modules/auth_saml/config/locales/crowdin/pt-PT.yml +++ b/modules/auth_saml/config/locales/crowdin/pt-PT.yml @@ -34,6 +34,7 @@ pt-PT: saml: menu_title: Fornecedores SAML delete_title: Eliminar fornecedor SAML + delete_heading: Delete this SAML provider? info: title: Parâmetros de configuração do protocolo SAML description: 'Utilize estes parâmetros para configurar a ligação do seu fornecedor de identidade ao OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/ro.yml b/modules/auth_saml/config/locales/crowdin/ro.yml index 2415886c92c..50f14b6f1ff 100644 --- a/modules/auth_saml/config/locales/crowdin/ro.yml +++ b/modules/auth_saml/config/locales/crowdin/ro.yml @@ -34,6 +34,7 @@ ro: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/ru.yml b/modules/auth_saml/config/locales/crowdin/ru.yml index 386079c662f..ad4362d254a 100644 --- a/modules/auth_saml/config/locales/crowdin/ru.yml +++ b/modules/auth_saml/config/locales/crowdin/ru.yml @@ -34,6 +34,7 @@ ru: saml: menu_title: Провайдеры SAML delete_title: Удалить провайдера SAML + delete_heading: Delete this SAML provider? info: title: Параметры конфигурации протокола SAML description: 'Используйте эти параметры для настройки подключения провайдера идентификации. diff --git a/modules/auth_saml/config/locales/crowdin/rw.yml b/modules/auth_saml/config/locales/crowdin/rw.yml index eb23e63a339..d0fc8577c42 100644 --- a/modules/auth_saml/config/locales/crowdin/rw.yml +++ b/modules/auth_saml/config/locales/crowdin/rw.yml @@ -34,6 +34,7 @@ rw: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/si.yml b/modules/auth_saml/config/locales/crowdin/si.yml index 52cc26d7e72..9259643391a 100644 --- a/modules/auth_saml/config/locales/crowdin/si.yml +++ b/modules/auth_saml/config/locales/crowdin/si.yml @@ -34,6 +34,7 @@ si: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/sk.yml b/modules/auth_saml/config/locales/crowdin/sk.yml index e17d40a8144..4ccc15d4ec8 100644 --- a/modules/auth_saml/config/locales/crowdin/sk.yml +++ b/modules/auth_saml/config/locales/crowdin/sk.yml @@ -34,6 +34,7 @@ sk: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/sl.yml b/modules/auth_saml/config/locales/crowdin/sl.yml index 1adfb4f5a6b..ebc966a6c4c 100644 --- a/modules/auth_saml/config/locales/crowdin/sl.yml +++ b/modules/auth_saml/config/locales/crowdin/sl.yml @@ -34,6 +34,7 @@ sl: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/sr.yml b/modules/auth_saml/config/locales/crowdin/sr.yml index d2147b4661a..db13f4def80 100644 --- a/modules/auth_saml/config/locales/crowdin/sr.yml +++ b/modules/auth_saml/config/locales/crowdin/sr.yml @@ -34,6 +34,7 @@ sr: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/sv.yml b/modules/auth_saml/config/locales/crowdin/sv.yml index f1d00ed2674..35a01d20c80 100644 --- a/modules/auth_saml/config/locales/crowdin/sv.yml +++ b/modules/auth_saml/config/locales/crowdin/sv.yml @@ -34,6 +34,7 @@ sv: saml: menu_title: SAML leverantörer delete_title: Ta bort SAML-leverantör + delete_heading: Delete this SAML provider? info: title: Konfigurationsparametrar för SAML-protokoll description: 'Använd dessa parametrar för att konfigurera din identitetsleverantörsanslutning till OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/th.yml b/modules/auth_saml/config/locales/crowdin/th.yml index b7c1ac2f430..1ac0e47350f 100644 --- a/modules/auth_saml/config/locales/crowdin/th.yml +++ b/modules/auth_saml/config/locales/crowdin/th.yml @@ -34,6 +34,7 @@ th: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/tr.yml b/modules/auth_saml/config/locales/crowdin/tr.yml index 26a0ddba42e..a8d2cadf307 100644 --- a/modules/auth_saml/config/locales/crowdin/tr.yml +++ b/modules/auth_saml/config/locales/crowdin/tr.yml @@ -34,6 +34,7 @@ tr: saml: menu_title: SAML sağlayıcıları delete_title: SAML sağlayıcısını sil + delete_heading: Delete this SAML provider? info: title: SAML Protokolü Yapılandırma Parametreleri description: 'OpenProject ile kimlik sağlayıcı bağlantınızı yapılandırmak için bu parametreleri kullanın. diff --git a/modules/auth_saml/config/locales/crowdin/uk.yml b/modules/auth_saml/config/locales/crowdin/uk.yml index c82b9719d39..45d0f3357e1 100644 --- a/modules/auth_saml/config/locales/crowdin/uk.yml +++ b/modules/auth_saml/config/locales/crowdin/uk.yml @@ -34,6 +34,7 @@ uk: saml: menu_title: Постачальники SAML delete_title: Видалити постачальника SAML + delete_heading: Delete this SAML provider? info: title: Параметри конфігурації протоколу SAML description: 'Використовуйте ці параметри, щоб налаштувати підключення свого постачальника ідентифікаційних даних в OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/uz.yml b/modules/auth_saml/config/locales/crowdin/uz.yml index a23a8faf03a..1b33f8105a4 100644 --- a/modules/auth_saml/config/locales/crowdin/uz.yml +++ b/modules/auth_saml/config/locales/crowdin/uz.yml @@ -34,6 +34,7 @@ uz: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: SAML Protocol Configuration Parameters description: 'Use these parameters to configure your identity provider connection to OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/vi.yml b/modules/auth_saml/config/locales/crowdin/vi.yml index 0506cea8b58..320281b1569 100644 --- a/modules/auth_saml/config/locales/crowdin/vi.yml +++ b/modules/auth_saml/config/locales/crowdin/vi.yml @@ -34,6 +34,7 @@ vi: saml: menu_title: Nhà cung cấp SAML delete_title: Xóa nhà cung cấp SAML + delete_heading: Delete this SAML provider? info: title: Thông số cấu hình giao thức SAML description: 'Sử dụng các tham số này để định cấu hình kết nối nhà cung cấp danh tính của bạn với OpenProject. diff --git a/modules/auth_saml/config/locales/crowdin/zh-CN.yml b/modules/auth_saml/config/locales/crowdin/zh-CN.yml index 193d1d47110..c46e28839ba 100644 --- a/modules/auth_saml/config/locales/crowdin/zh-CN.yml +++ b/modules/auth_saml/config/locales/crowdin/zh-CN.yml @@ -34,6 +34,7 @@ zh-CN: saml: menu_title: SAML 提供商 delete_title: 删除 SAML 提供商 + delete_heading: 删除此 SAML 提供程序? info: title: SAML 协议配置参数 description: '使用这些参数配置您的身份提供商与 OpenProject 的连接。 diff --git a/modules/auth_saml/config/locales/crowdin/zh-TW.yml b/modules/auth_saml/config/locales/crowdin/zh-TW.yml index 7b5597402c9..91b92e6066d 100644 --- a/modules/auth_saml/config/locales/crowdin/zh-TW.yml +++ b/modules/auth_saml/config/locales/crowdin/zh-TW.yml @@ -34,6 +34,7 @@ zh-TW: saml: menu_title: SAML 提供商 delete_title: 刪除 SAML 提供者 + delete_heading: Delete this SAML provider? info: title: SAML 通訊協定組態參數 description: '使用這些參數設定您與 OpenProject 的身分提供者連線。 diff --git a/modules/auth_saml/config/locales/en.yml b/modules/auth_saml/config/locales/en.yml index d80d83c622f..7c14b9f77fd 100644 --- a/modules/auth_saml/config/locales/en.yml +++ b/modules/auth_saml/config/locales/en.yml @@ -33,6 +33,7 @@ en: saml: menu_title: SAML providers delete_title: Delete SAML provider + delete_heading: Delete this SAML provider? info: title: "SAML Protocol Configuration Parameters" description: > diff --git a/modules/auth_saml/spec/features/administration/saml_crud_spec.rb b/modules/auth_saml/spec/features/administration/saml_crud_spec.rb index 22949918fae..9e8c7df9e06 100644 --- a/modules/auth_saml/spec/features/administration/saml_crud_spec.rb +++ b/modules/auth_saml/spec/features/administration/saml_crud_spec.rb @@ -34,7 +34,6 @@ require_module_spec_helper RSpec.describe "SAML administration CRUD", :js do shared_let(:user) { create(:admin) } - let(:danger_zone) { DangerZone.new(page) } before do login_as(user) @@ -110,20 +109,9 @@ RSpec.describe "SAML administration CRUD", expect(provider.limit_self_registration).to be true click_link_or_button "Delete" - # Confirm the deletion - # Without confirmation, the button is disabled - expect(danger_zone).to be_disabled - # With wrong confirmation, the button is disabled - danger_zone.confirm_with("foo") - - expect(danger_zone).to be_disabled - - # With correct confirmation, the button is enabled - # and the project can be deleted - danger_zone.confirm_with(provider.display_name) - expect(danger_zone).not_to be_disabled - danger_zone.danger_button.click + check "I understand that this deletion cannot be reversed" + click_on "Delete permanently" expect(page).to have_text "No SAML providers configured yet." expect { provider.reload }.to raise_error ActiveRecord::RecordNotFound diff --git a/modules/backlogs/app/components/backlogs/backlog_component.html.erb b/modules/backlogs/app/components/backlogs/backlog_component.html.erb index dd18db687a7..5ce7f8ffec2 100644 --- a/modules/backlogs/app/components/backlogs/backlog_component.html.erb +++ b/modules/backlogs/app/components/backlogs/backlog_component.html.erb @@ -56,7 +56,7 @@ See COPYRIGHT and LICENSE files for more details. ), tabindex: 0 ) do %> - <%= render(Backlogs::StoryComponent.new(story:, project:, sprint:, max_position:)) %> + <%= render(Backlogs::StoryComponent.new(story:, project:, sprint:)) %> <% end %> <% end %> <% end %> diff --git a/modules/backlogs/app/components/backlogs/backlog_component.rb b/modules/backlogs/app/components/backlogs/backlog_component.rb index 888de7921d6..5d17e318a82 100644 --- a/modules/backlogs/app/components/backlogs/backlog_component.rb +++ b/modules/backlogs/app/components/backlogs/backlog_component.rb @@ -65,10 +65,6 @@ module Backlogs current_user.backlogs_preference(:versions_default_fold_state) == "closed" end - def max_position - stories.filter_map(&:position).max - end - def drop_target_config { generic_drag_and_drop_target: "container", diff --git a/modules/backlogs/app/components/backlogs/inbox_component.html.erb b/modules/backlogs/app/components/backlogs/inbox_component.html.erb index 3322752ec0b..9165cd7de7f 100644 --- a/modules/backlogs/app/components/backlogs/inbox_component.html.erb +++ b/modules/backlogs/app/components/backlogs/inbox_component.html.erb @@ -76,8 +76,7 @@ See COPYRIGHT and LICENSE files for more details. <%= render Backlogs::InboxItemComponent.with_collection( paginate? ? first_page : work_packages, container: border_box, - project:, - max_position: + project: ) %> <% if paginate? %> @@ -109,8 +108,7 @@ See COPYRIGHT and LICENSE files for more details. <%= render Backlogs::InboxItemComponent.with_collection( last_page, container: border_box, - project:, - max_position: + project: ) %> <% end %> <% end %> diff --git a/modules/backlogs/app/components/backlogs/inbox_component.rb b/modules/backlogs/app/components/backlogs/inbox_component.rb index a010b510abb..6749070823d 100644 --- a/modules/backlogs/app/components/backlogs/inbox_component.rb +++ b/modules/backlogs/app/components/backlogs/inbox_component.rb @@ -99,9 +99,5 @@ module Backlogs target_allowed_drag_type: "story" } end - - def max_position - work_packages.maximum(:position) - end end end diff --git a/modules/backlogs/app/components/backlogs/inbox_item_component.html.erb b/modules/backlogs/app/components/backlogs/inbox_item_component.html.erb index 8ee498beaaf..b56c2466e64 100644 --- a/modules/backlogs/app/components/backlogs/inbox_item_component.html.erb +++ b/modules/backlogs/app/components/backlogs/inbox_item_component.html.erb @@ -49,7 +49,21 @@ See COPYRIGHT and LICENSE files for more details. <% end %> <% end %> <% grid.with_area(:menu) do %> - <%= render(Backlogs::InboxMenuComponent.new(work_package:, project:, max_position:)) %> + <%= render( + Primer::Alpha::ActionMenu.new( + menu_id: dom_target(work_package, :menu), + src: menu_project_inbox_path(project, work_package), + anchor_align: :end, + classes: "hide-when-print" + ) + ) do |menu| %> + <% menu.with_show_button( + scheme: :invisible, + icon: :"kebab-horizontal", + "aria-label": t(".label_actions"), + tooltip_direction: :se + ) %> + <% end %> <% end %> <% grid.with_area(:subject) do %> <%= render(Primer::Beta::Text.new(font_weight: :semibold)) { work_package.subject } %> diff --git a/modules/backlogs/app/components/backlogs/inbox_item_component.rb b/modules/backlogs/app/components/backlogs/inbox_item_component.rb index 8c480bbbe95..bad17f8b371 100644 --- a/modules/backlogs/app/components/backlogs/inbox_item_component.rb +++ b/modules/backlogs/app/components/backlogs/inbox_item_component.rb @@ -32,15 +32,14 @@ module Backlogs class InboxItemComponent < ApplicationComponent include OpPrimer::ComponentHelpers - attr_reader :work_package, :project, :container, :max_position, :current_user + attr_reader :work_package, :project, :container, :current_user - def initialize(inbox_item:, project:, container:, max_position:, current_user: User.current) + def initialize(inbox_item:, project:, container:, current_user: User.current) super() @work_package = inbox_item @project = project @container = container - @max_position = max_position @current_user = current_user end diff --git a/modules/backlogs/app/components/backlogs/inbox_menu_component.html.erb b/modules/backlogs/app/components/backlogs/inbox_menu_component.html.erb index 0d6614f107b..94fd84e98f9 100644 --- a/modules/backlogs/app/components/backlogs/inbox_menu_component.html.erb +++ b/modules/backlogs/app/components/backlogs/inbox_menu_component.html.erb @@ -28,15 +28,8 @@ See COPYRIGHT and LICENSE files for more details. ++# %> <%= - render(Primer::Alpha::ActionMenu.new(**@system_arguments)) do |menu| - menu.with_show_button( - scheme: :invisible, - icon: :"kebab-horizontal", - "aria-label": t(".label_actions"), - tooltip_direction: :se - ) - - menu.with_item( + render(Primer::Alpha::ActionMenu::List.new(menu_id:)) do |list| + list.with_item( id: dom_target(work_package, :menu, :open_details), tag: :a, label: t(:"js.button_open_details"), @@ -46,7 +39,7 @@ See COPYRIGHT and LICENSE files for more details. item.with_leading_visual_icon(icon: :"op-view-split") end - menu.with_item( + list.with_item( id: dom_target(work_package, :menu, :open_fullscreen), tag: :a, label: t(:"js.button_open_fullscreen"), @@ -56,7 +49,7 @@ See COPYRIGHT and LICENSE files for more details. item.with_leading_visual_icon(icon: :"screen-full") end - menu.with_item( + list.with_item( id: dom_target(work_package, :menu, :copy_url_to_clipboard), tag: :"clipboard-copy", label: t(".action_menu.copy_url_to_clipboard"), @@ -65,7 +58,7 @@ See COPYRIGHT and LICENSE files for more details. item.with_leading_visual_icon(icon: :copy) end - menu.with_item( + list.with_item( id: dom_target(work_package, :menu, :copy_work_package_id), tag: :"clipboard-copy", label: t(".action_menu.copy_work_package_id"), @@ -75,9 +68,14 @@ See COPYRIGHT and LICENSE files for more details. end if show_move_submenu? - menu.with_divider + list.with_divider - menu.with_sub_menu_item(label: t(".action_menu.move_menu")) do |move_menu| + list.with_item( + component_klass: Primer::Alpha::ActionMenu::SubMenuItem, + label: t(".action_menu.move_menu"), + select_variant: :none, + form_arguments: {} + ) do |move_menu| move_menu.with_leading_visual_icon(icon: :"op-arrow-in") with_item_group(move_menu) do diff --git a/modules/backlogs/app/components/backlogs/inbox_menu_component.rb b/modules/backlogs/app/components/backlogs/inbox_menu_component.rb index 8a2209faaaa..02d6ffa4195 100644 --- a/modules/backlogs/app/components/backlogs/inbox_menu_component.rb +++ b/modules/backlogs/app/components/backlogs/inbox_menu_component.rb @@ -29,26 +29,25 @@ #++ module Backlogs + # Renders Primer::Alpha::ActionMenu::List for the deferred menu (InboxController#menu). + # +menu_id+ must match the row ActionMenu in InboxItemComponent. class InboxMenuComponent < ApplicationComponent include OpPrimer::ComponentHelpers - attr_reader :work_package, :project, :max_position, :current_user + attr_reader :work_package, :project, :max_position, :current_user, :open_sprints_exist - def initialize(work_package:, project:, max_position:, current_user: User.current, **system_arguments) + def initialize(work_package:, project:, max_position:, open_sprints_exist:, current_user: User.current) super() @work_package = work_package @project = project - @max_position = max_position @current_user = current_user + @max_position = max_position + @open_sprints_exist = open_sprints_exist + end - @system_arguments = system_arguments - @system_arguments[:menu_id] = dom_target(work_package, :menu) - @system_arguments[:anchor_align] = :end - @system_arguments[:classes] = class_names( - @system_arguments[:classes], - "hide-when-print" - ) + def menu_id + dom_target(work_package, :menu) end private @@ -59,12 +58,11 @@ module Backlogs def show_move_items? allowed_to_manage_sprint_items? && - !(first_item? && last_item?) + !(first_item? && last_item?) end def show_move_to_sprint? - allowed_to_manage_sprint_items? && - Agile::Sprint.for_project(project).not_completed.exists? + allowed_to_manage_sprint_items? && open_sprints_exist end def allowed_to_manage_sprint_items? diff --git a/modules/backlogs/app/components/backlogs/sprint_component.html.erb b/modules/backlogs/app/components/backlogs/sprint_component.html.erb index c6c1bbd5c06..675a2ce4ccf 100644 --- a/modules/backlogs/app/components/backlogs/sprint_component.html.erb +++ b/modules/backlogs/app/components/backlogs/sprint_component.html.erb @@ -49,7 +49,7 @@ See COPYRIGHT and LICENSE files for more details. data: story_data_attribute(story), tabindex: 0 ) do %> - <%= render(Backlogs::StoryComponent.new(story:, sprint:, project:, max_position:)) %> + <%= render(Backlogs::StoryComponent.new(story:, sprint:, project:)) %> <% end %> <% end %> <% end %> diff --git a/modules/backlogs/app/components/backlogs/sprint_component.rb b/modules/backlogs/app/components/backlogs/sprint_component.rb index 5bc6d06421c..ad819f90219 100644 --- a/modules/backlogs/app/components/backlogs/sprint_component.rb +++ b/modules/backlogs/app/components/backlogs/sprint_component.rb @@ -44,7 +44,7 @@ module Backlogs @project = project @current_user = current_user @active_sprint_ids = active_sprint_ids - @stories = stories || sprint.work_packages_for(project) + @stories = stories || sprint.work_packages_for(project).includes(:status, :type) @system_arguments = system_arguments @system_arguments[:id] = dom_id(sprint) @@ -67,10 +67,6 @@ module Backlogs current_user.backlogs_preference(:versions_default_fold_state) == "closed" end - def max_position - stories.filter_map(&:position).max - end - def drop_target_config { generic_drag_and_drop_target: "container", diff --git a/modules/backlogs/app/components/backlogs/story_component.html.erb b/modules/backlogs/app/components/backlogs/story_component.html.erb index 37dd1cc7bc0..9465c851ea9 100644 --- a/modules/backlogs/app/components/backlogs/story_component.html.erb +++ b/modules/backlogs/app/components/backlogs/story_component.html.erb @@ -51,7 +51,21 @@ See COPYRIGHT and LICENSE files for more details. <% end %> <% grid.with_area(:menu) do %> - <%= render(Backlogs::StoryMenuComponent.new(story:, sprint:, project:, max_position:)) %> + <%= render( + Primer::Alpha::ActionMenu.new( + menu_id: dom_target(story, :menu), + src: menu_backlogs_project_sprint_story_path(project, sprint, story), + anchor_align: :end, + classes: "hide-when-print" + ) + ) do |menu| %> + <% menu.with_show_button( + scheme: :invisible, + icon: :"kebab-horizontal", + "aria-label": t(".label_actions"), + tooltip_direction: :se + ) %> + <% end %> <% end %> <% grid.with_area(:subject) do %> diff --git a/modules/backlogs/app/components/backlogs/story_component.rb b/modules/backlogs/app/components/backlogs/story_component.rb index 50f2841b6d1..3e23fb94a32 100644 --- a/modules/backlogs/app/components/backlogs/story_component.rb +++ b/modules/backlogs/app/components/backlogs/story_component.rb @@ -32,15 +32,14 @@ module Backlogs class StoryComponent < ApplicationComponent include OpPrimer::ComponentHelpers - attr_reader :story, :sprint, :project, :max_position, :current_user + attr_reader :story, :sprint, :project, :current_user - def initialize(story:, sprint:, project:, max_position:, current_user: User.current) + def initialize(story:, sprint:, project:, current_user: User.current) super() @story = story @sprint = sprint @project = project - @max_position = max_position @current_user = current_user end diff --git a/modules/backlogs/app/components/backlogs/story_menu_component.html.erb b/modules/backlogs/app/components/backlogs/story_menu_list_component.html.erb similarity index 85% rename from modules/backlogs/app/components/backlogs/story_menu_component.html.erb rename to modules/backlogs/app/components/backlogs/story_menu_list_component.html.erb index 3b9f1d4b560..7d8d01fe645 100644 --- a/modules/backlogs/app/components/backlogs/story_menu_component.html.erb +++ b/modules/backlogs/app/components/backlogs/story_menu_list_component.html.erb @@ -28,15 +28,8 @@ See COPYRIGHT and LICENSE files for more details. ++# %> <%= - render(Primer::Alpha::ActionMenu.new(**@system_arguments)) do |menu| - menu.with_show_button( - scheme: :invisible, - icon: :"kebab-horizontal", - "aria-label": t(".label_actions"), - tooltip_direction: :se - ) - - menu.with_item( + render(Primer::Alpha::ActionMenu::List.new(menu_id:)) do |list| + list.with_item( id: dom_target(story, :menu, :open_details), tag: :a, label: t(:"js.button_open_details"), @@ -46,7 +39,7 @@ See COPYRIGHT and LICENSE files for more details. item.with_leading_visual_icon(icon: :"op-view-split") end - menu.with_item( + list.with_item( id: dom_target(story, :menu, :open_fullscreen), tag: :a, label: t(:"js.button_open_fullscreen"), @@ -56,7 +49,7 @@ See COPYRIGHT and LICENSE files for more details. item.with_leading_visual_icon(icon: :"screen-full") end - menu.with_item( + list.with_item( id: dom_target(story, :menu, :copy_url_to_clipboard), tag: :"clipboard-copy", label: t(".action_menu.copy_url_to_clipboard"), @@ -65,7 +58,7 @@ See COPYRIGHT and LICENSE files for more details. item.with_leading_visual_icon(icon: :copy) end - menu.with_item( + list.with_item( id: dom_target(story, :menu, :copy_work_package_id), tag: :"clipboard-copy", label: t(".action_menu.copy_work_package_id"), @@ -75,9 +68,13 @@ See COPYRIGHT and LICENSE files for more details. end if show_move_items? - menu.with_divider - - menu.with_sub_menu_item(label: t(".action_menu.move_menu")) do |move_menu| + list.with_divider + list.with_item( + component_klass: Primer::Alpha::ActionMenu::SubMenuItem, + label: t(".action_menu.move_menu"), + select_variant: :none, + form_arguments: {} + ) do |move_menu| move_menu.with_leading_visual_icon(icon: :"op-arrow-in") with_item_group(move_menu) do diff --git a/modules/backlogs/app/components/backlogs/story_menu_component.rb b/modules/backlogs/app/components/backlogs/story_menu_list_component.rb similarity index 87% rename from modules/backlogs/app/components/backlogs/story_menu_component.rb rename to modules/backlogs/app/components/backlogs/story_menu_list_component.rb index 4f486f81a15..c4bf7b66cc8 100644 --- a/modules/backlogs/app/components/backlogs/story_menu_component.rb +++ b/modules/backlogs/app/components/backlogs/story_menu_list_component.rb @@ -29,12 +29,14 @@ #++ module Backlogs - class StoryMenuComponent < ApplicationComponent + # Renders Primer::Alpha::ActionMenu::List for the deferred menu (RbStoriesController#menu). + # +menu_id+ must match the row ActionMenu in StoryComponent. + class StoryMenuListComponent < ApplicationComponent include OpPrimer::ComponentHelpers attr_reader :story, :sprint, :project, :max_position, :current_user - def initialize(story:, sprint:, project:, max_position:, current_user: User.current, **system_arguments) + def initialize(story:, sprint:, project:, max_position:, current_user: User.current) super() @story = story @@ -42,21 +44,17 @@ module Backlogs @project = project @max_position = max_position @current_user = current_user + end - @system_arguments = system_arguments - @system_arguments[:menu_id] = dom_target(story, :menu) - @system_arguments[:anchor_align] = :end - @system_arguments[:classes] = class_names( - @system_arguments[:classes], - "hide-when-print" - ) + def menu_id + dom_target(story, :menu) end private def show_move_items? allowed_to_manage_sprint_items? && - !(first_item? && last_item?) + !(first_item? && last_item?) end def allowed_to_manage_sprint_items? diff --git a/modules/backlogs/app/controllers/inbox_controller.rb b/modules/backlogs/app/controllers/inbox_controller.rb index ed02f55b91f..8b44cfe30f4 100644 --- a/modules/backlogs/app/controllers/inbox_controller.rb +++ b/modules/backlogs/app/controllers/inbox_controller.rb @@ -34,6 +34,21 @@ class InboxController < RbApplicationController before_action :not_authorized_on_feature_flag_inactive before_action :load_work_package + # Deferred ActionMenu items (Primer include-fragment). + def menu + max_position = Backlog.inbox_for(project: @project).maximum(:position) || 0 + open_sprints_exist = Agile::Sprint.for_project(@project).visible.not_completed.exists? + + render(Backlogs::InboxMenuComponent.new( + work_package: @work_package, + project: @project, + max_position:, + open_sprints_exist:, + current_user: + ), + layout: false) + end + def move_to_sprint_dialog respond_with_dialog Backlogs::MoveToSprintDialogComponent.new( work_package: @work_package, @@ -71,22 +86,22 @@ class InboxController < RbApplicationController private def load_work_package - @work_package = WorkPackage.visible.find(params[:id]) + @work_package = WorkPackage.visible.where(project: @project).find(params[:id]) end def replace_inbox_component_via_turbo_stream - inbox_work_packages = Backlog.inbox_for(project: @project) + work_packages = Backlog.inbox_for(project: @project) replace_via_turbo_stream( - component: Backlogs::InboxComponent.new(work_packages: inbox_work_packages, project: @project), + component: Backlogs::InboxComponent.new( + work_packages:, + project: @project + ), method: :morph ) end def replace_sprint_component_via_turbo_stream(sprint_id) sprint = Agile::Sprint.for_project(@project).visible.find(sprint_id) - render_success_flash_message_via_turbo_stream( - message: I18n.t(:notice_successful_move, from: I18n.t(:label_inbox), to: sprint.name) - ) replace_via_turbo_stream( component: Backlogs::SprintComponent.new(sprint: sprint, project: @project), method: :morph diff --git a/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb b/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb index faaf07fd6af..8a9eb43c553 100644 --- a/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb +++ b/modules/backlogs/app/controllers/rb_master_backlogs_controller.rb @@ -91,6 +91,7 @@ class RbMasterBacklogsController < RbApplicationController @sprints = Agile::Sprint.for_project(@project).not_completed.order_by_date @stories_by_sprint_id = WorkPackage .where(sprint: @sprints, project: @project) + .includes(:type, :status) .order_by_position .group_by(&:sprint_id) @active_sprint_ids = @sprints.select(&:active?).map(&:id) diff --git a/modules/backlogs/app/controllers/rb_stories_controller.rb b/modules/backlogs/app/controllers/rb_stories_controller.rb index 54718eb2d1b..4696e703515 100644 --- a/modules/backlogs/app/controllers/rb_stories_controller.rb +++ b/modules/backlogs/app/controllers/rb_stories_controller.rb @@ -33,6 +33,20 @@ class RbStoriesController < RbApplicationController before_action :load_story + # Deferred ActionMenu items (Primer include-fragment). + def menu + max_position = @allowed_stories.maximum(:position) || 0 + + render(Backlogs::StoryMenuListComponent.new( + story: @story, + sprint: @sprint, + project: @project, + max_position:, + current_user: + ), + layout: false) + end + # Move a story from a Sprint to another Sprint or an Agile::Sprint. def move_legacy # The update service reloads the story internally (via #move_after), @@ -127,9 +141,9 @@ class RbStoriesController < RbApplicationController render_success_flash_message_via_turbo_stream( message: I18n.t(:notice_successful_move, from: @sprint.name, to: I18n.t(:label_inbox)) ) - inbox_work_packages = Backlog.inbox_for(project: @project) + work_packages = Backlog.inbox_for(project: @project) replace_via_turbo_stream( - component: Backlogs::InboxComponent.new(work_packages: inbox_work_packages, project: @project), + component: Backlogs::InboxComponent.new(work_packages:, project: @project), method: :morph ) end @@ -201,11 +215,13 @@ class RbStoriesController < RbApplicationController end def load_story - @story = if OpenProject::FeatureDecisions.scrum_projects_active? - WorkPackage.visible.find(params[:id]) - else - Story.visible.find(params[:id]) - end + @allowed_stories = + if OpenProject::FeatureDecisions.scrum_projects_active? + WorkPackage.visible.where(sprint: @sprint, project: @project) + else + Story.visible.where(Story.condition(@project, @sprint)) + end + @story = @allowed_stories.find(params[:id]) end def move_params diff --git a/modules/backlogs/app/helpers/rb_common_helper.rb b/modules/backlogs/app/helpers/rb_common_helper.rb index a4a1578e152..babf00ca127 100644 --- a/modules/backlogs/app/helpers/rb_common_helper.rb +++ b/modules/backlogs/app/helpers/rb_common_helper.rb @@ -142,6 +142,10 @@ module RbCommonHelper !project.receive_shared_sprints? end + def show_all_backlog + ActiveRecord::Type::Boolean.new.cast(params[:all]) || false + end + private def work_package_status_for_id(id) diff --git a/modules/backlogs/app/models/backlog.rb b/modules/backlogs/app/models/backlog.rb index 0b94bc71d38..59da4f36ab0 100644 --- a/modules/backlogs/app/models/backlog.rb +++ b/modules/backlogs/app/models/backlog.rb @@ -43,6 +43,7 @@ class Backlog .visible .with_status_open .where(project:, sprint_id: nil) + .includes(:type) .order(Arel.sql(Story::ORDER)) end diff --git a/modules/backlogs/app/views/rb_master_backlogs/_backlog_list.html.erb b/modules/backlogs/app/views/rb_master_backlogs/_backlog_list.html.erb index 5b48016c7cc..598080216ae 100644 --- a/modules/backlogs/app/views/rb_master_backlogs/_backlog_list.html.erb +++ b/modules/backlogs/app/views/rb_master_backlogs/_backlog_list.html.erb @@ -35,7 +35,7 @@ See COPYRIGHT and LICENSE files for more details. <%= render Backlogs::InboxComponent.new( work_packages: @inbox_work_packages, project: @project, - show_all: params[:all].present? + show_all: show_all_backlog ) %>
<% content_for :content_body do %> - <%= turbo_frame_tag :backlogs_container, refresh: :morph, src: backlog_backlogs_project_backlogs_path(@project), class: "op-backlogs-page" %> + <%= turbo_frame_tag :backlogs_container, + refresh: :morph, + src: backlog_backlogs_project_backlogs_path(@project, all: show_all_backlog), + class: "op-backlogs-page" %> <% end %> <% content_for :content_body_right do %> diff --git a/modules/backlogs/config/locales/crowdin/af.yml b/modules/backlogs/config/locales/crowdin/af.yml index e360c42d2b8..9b89b06f417 100644 --- a/modules/backlogs/config/locales/crowdin/af.yml +++ b/modules/backlogs/config/locales/crowdin/af.yml @@ -143,8 +143,8 @@ af: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,8 +198,8 @@ af: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/ar.yml b/modules/backlogs/config/locales/crowdin/ar.yml index 55ec7128827..0d0d458cffd 100644 --- a/modules/backlogs/config/locales/crowdin/ar.yml +++ b/modules/backlogs/config/locales/crowdin/ar.yml @@ -27,15 +27,15 @@ ar: activerecord: attributes: agile/sprint: - duration: Duration - finish_date: Finish date + duration: المدة + finish_date: تاريخ الانتهاء goal: Sprint goal name: Sprint name - sharing: Sharing + sharing: المشاركة statuses: - in_planning: In planning - active: Active - completed: Completed + in_planning: مرحلة التخطيط + active: نشط + completed: مكتمل project: sprint_sharing: Sprint sharing sprint: @@ -50,7 +50,7 @@ ar: story_points: نقاط القصة errors: messages: - must_be_in_planning: must be in planning to start. + must_be_in_planning: يجب أن يكون في مرحلة التخطيط للبدء. only_one_active_sprint_allowed: only one active sprint is allowed per project. dates_required: Start and finish dates are required in order to start the sprint. models: @@ -82,22 +82,22 @@ ar: other: There are %{count} work packages that were not completed in this sprint. format: "%{message}" status: - not_active: is not active so it cannot be closed. + not_active: غير نشِط لذا لا يمكن إغلاقه. sprint: cannot_end_before_it_starts: لا يمكن أن ينتهي السباق قبل أن يبدأ. models: sprint: Sprint attributes: - task_type: Task type + task_type: نوع المهمة backlogs: any: أي caption_sprints_default_fold_state: Sprints will not be expanded by default when viewing the 'Backlog and sprints' page. Each one has to be manually expanded. - column_width: Column width + column_width: عرض العمود definition_of_done: تعريف ما تم definition_of_done_caption: Work packages with these statuses are treated as completed in backlog views and reporting. done_status: Done status sharing_description: This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing). - sharing: Sharing + sharing: المشاركة impediment: عائق label_versions_default_fold_state: إظهار الإصدارات مطوية label_burndown_chart: Burndown chart @@ -106,11 +106,11 @@ ar: label_is_done_status: الحالة %{status_name} تعني أنها منجزة points_label: zero: points - one: point + one: نقطة two: points few: points many: points - other: points + other: نِقَاط positions_could_not_be_rebuilt: تعذَر إعادة بناء المواقع. positions_rebuilt_successfully: تم إعادة بناء المواقع بنجاح. rebuild: إعِدْ بناء @@ -135,10 +135,10 @@ ar: header_backlogs: '' button_update_backlogs: Update backlogs module backlog_component: - blankslate_title: "%{name} is empty" + blankslate_title: "%{name} فارغ" blankslate_description: No items planned yet. Drag items here to add them. sprint_component: - blankslate_title: "%{name} is empty" + blankslate_title: "%{name} فارغ" blankslate_description: No items planned yet. Drag items here to add them. backlog_header_component: label_toggle_backlog: Collapse/Expand %{name} @@ -149,18 +149,18 @@ ar: inbox_component: blankslate_title: Backlog inbox is empty blankslate_description: All open work packages in this project will automatically appear here. - label_drag_work_package: Move %{name} + label_drag_work_package: نقل %{name} show_more: zero: Show %{count} more items - one: Show 1 more item + one: عرض 1 عنصر آخر two: Show %{count} more items few: Show %{count} more items many: Show %{count} more items - other: Show %{count} more items + other: عرض %{count} عناصر أخرى inbox_item_component: - label_drag_work_package: Move %{name} - inbox_menu_component: + label_drag_work_package: نقل %{name} label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -180,8 +180,8 @@ ar: receive_shared_no_actions_description_text: This project receives shared sprints from a different project, but none are available right now. settings_link_text: project settings sprint_header_component: - label_start_sprint: Start - label_complete_sprint: Complete + label_start_sprint: ابدأ + label_complete_sprint: مكتمل start_sprint_disabled_reason_active_sprint: Another sprint is already active. start_sprint_disabled_reason_missing_dates: Start and finish dates are required in order to start the sprint. label_story_count: @@ -194,9 +194,9 @@ ar: edit_sprint: Edit sprint new_story: New story stories_tasks: Stories/Tasks - task_board: Task board - wiki: Wiki - properties: Properties + task_board: لوحة المهام + wiki: الموسوعة + properties: الخصائص finish_sprint_dialog_component: title: There are work in progress items body: "%{message} What would you like to do with these?" @@ -213,9 +213,9 @@ ar: edit_sprint: Edit sprint add_work_package: Add work package story_component: - label_drag_story: Move %{name} - story_menu_component: + label_drag_story: نقل %{name} label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -227,7 +227,7 @@ ar: backlogs_task: المهمة backlogs_task_type: نوع المهمة backlogs_wiki_template: نموذج لصفحة ويكي wiki الخاصة بالسباق - backlogs_empty_title: No versions are defined yet + backlogs_empty_title: لم يعَّرَّف أي إصدار بعد backlogs_empty_action_text: To start using backlogs, please create a version first backlogs_not_configured_title: Backlogs not configured backlogs_not_configured_description: Story and task types need to be set before using this module. @@ -240,7 +240,7 @@ ar: task_type: cannot_be_story_type: can not also be a story type label_backlog: Backlog - label_inbox: Inbox + label_inbox: الوارد label_backlogs: الأعمال المتراكمة غير المنجزة label_backlogs_unconfigured: لم تقم بإنشاء الأعمال المتراكمة غير المنجزة بعد. من فضلك اذهب إلى %{administration} > %{plugins}، ثم اضغط على رابط %{configure} لهذا البرنامج المساعد. عندما تنتهي من تعيين الحقول، ارجع إلى هذه الصفحة لتبدأ باستخدام الأداة. label_blocks_ids: الهويات المعرِّفة لمجموعات العمل المحظورة @@ -273,14 +273,14 @@ ar: backlog_sharing: options: no_sharing: - label: Don't share + label: لا تشارك caption: Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects. receive_shared: label: Receive shared sprints caption: This project can only use sprints shared by other projects. warning: This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible. share_all_projects: - label: All projects + label: جميع المشاريع caption: Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects. disabled_caption: Option not available since project "%{name}" is currently sharing with all projects and only one project can do this. disabled_caption_anonymous: Option not available since another project is currently sharing with all projects and only one project can do this. diff --git a/modules/backlogs/config/locales/crowdin/az.yml b/modules/backlogs/config/locales/crowdin/az.yml index 39cbe1520f4..1cc9fbef5d1 100644 --- a/modules/backlogs/config/locales/crowdin/az.yml +++ b/modules/backlogs/config/locales/crowdin/az.yml @@ -143,8 +143,8 @@ az: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,8 +198,8 @@ az: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/be.yml b/modules/backlogs/config/locales/crowdin/be.yml index b22fdb63edd..fb1a07def9f 100644 --- a/modules/backlogs/config/locales/crowdin/be.yml +++ b/modules/backlogs/config/locales/crowdin/be.yml @@ -151,8 +151,8 @@ be: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -206,8 +206,8 @@ be: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/bg.yml b/modules/backlogs/config/locales/crowdin/bg.yml index 5efad1e587b..59ec5b52e25 100644 --- a/modules/backlogs/config/locales/crowdin/bg.yml +++ b/modules/backlogs/config/locales/crowdin/bg.yml @@ -143,8 +143,8 @@ bg: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,8 +198,8 @@ bg: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/ca.yml b/modules/backlogs/config/locales/crowdin/ca.yml index ab09fed7b12..0314128d1ca 100644 --- a/modules/backlogs/config/locales/crowdin/ca.yml +++ b/modules/backlogs/config/locales/crowdin/ca.yml @@ -143,8 +143,8 @@ ca: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,8 +198,8 @@ ca: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/ckb-IR.yml b/modules/backlogs/config/locales/crowdin/ckb-IR.yml index a3a279877de..138f17125ac 100644 --- a/modules/backlogs/config/locales/crowdin/ckb-IR.yml +++ b/modules/backlogs/config/locales/crowdin/ckb-IR.yml @@ -143,8 +143,8 @@ ckb-IR: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,8 +198,8 @@ ckb-IR: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/cs.yml b/modules/backlogs/config/locales/crowdin/cs.yml index 2c3ea30e48a..35392edaa75 100644 --- a/modules/backlogs/config/locales/crowdin/cs.yml +++ b/modules/backlogs/config/locales/crowdin/cs.yml @@ -151,8 +151,8 @@ cs: other: Show %{count} more items inbox_item_component: label_drag_work_package: Přesunout %{name} + label_actions: Work package actions inbox_menu_component: - label_actions: Operace na pracovním balíčku action_menu: copy_url_to_clipboard: Kopírovat odkaz do schránky copy_work_package_id: Kopírovat pracovní balíček @@ -206,12 +206,12 @@ cs: add_work_package: Přidat pracovní balíček story_component: label_drag_story: Přesunout %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: - copy_url_to_clipboard: Kopírovat odkaz do schránky - copy_work_package_id: Kopírovat ID pracovního balíčku - move_menu: Přesunout + copy_url_to_clipboard: Copy URL to clipboard + copy_work_package_id: Copy work package ID + move_menu: Move backlogs_points_burn_direction: Body popáleniny nahoru/dolů backlogs_product_backlog: Nevyřízené produkty backlogs_story: Příběh diff --git a/modules/backlogs/config/locales/crowdin/da.yml b/modules/backlogs/config/locales/crowdin/da.yml index e0eba5f9879..edae3eb240a 100644 --- a/modules/backlogs/config/locales/crowdin/da.yml +++ b/modules/backlogs/config/locales/crowdin/da.yml @@ -143,8 +143,8 @@ da: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,8 +198,8 @@ da: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/de.yml b/modules/backlogs/config/locales/crowdin/de.yml index df349f6eb61..8571931e73a 100644 --- a/modules/backlogs/config/locales/crowdin/de.yml +++ b/modules/backlogs/config/locales/crowdin/de.yml @@ -143,8 +143,8 @@ de: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,12 +198,12 @@ de: add_work_package: Add work package story_component: label_drag_story: "%{name} verschieben" - story_menu_component: - label_actions: Weitere Aktionen + label_actions: Story actions + story_menu_list_component: action_menu: - copy_url_to_clipboard: URL in die Zwischenablage kopieren - copy_work_package_id: Arbeitspaket-ID kopieren - move_menu: Verschieben + copy_url_to_clipboard: Copy URL to clipboard + copy_work_package_id: Copy work package ID + move_menu: Move backlogs_points_burn_direction: Burnup/-down Punkte backlogs_product_backlog: Produkt-Backlog backlogs_story: Story diff --git a/modules/backlogs/config/locales/crowdin/el.yml b/modules/backlogs/config/locales/crowdin/el.yml index 85b48e33983..40291f5bacb 100644 --- a/modules/backlogs/config/locales/crowdin/el.yml +++ b/modules/backlogs/config/locales/crowdin/el.yml @@ -143,8 +143,8 @@ el: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,8 +198,8 @@ el: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/eo.yml b/modules/backlogs/config/locales/crowdin/eo.yml index cedca4fa28a..9ae0c131e7a 100644 --- a/modules/backlogs/config/locales/crowdin/eo.yml +++ b/modules/backlogs/config/locales/crowdin/eo.yml @@ -143,8 +143,8 @@ eo: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,8 +198,8 @@ eo: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/es.yml b/modules/backlogs/config/locales/crowdin/es.yml index fc1a6d5ecaa..5195e9e240a 100644 --- a/modules/backlogs/config/locales/crowdin/es.yml +++ b/modules/backlogs/config/locales/crowdin/es.yml @@ -33,11 +33,11 @@ es: name: Nombre del sprint sharing: Uso compartido statuses: - in_planning: In planning - active: Active - completed: Completed + in_planning: En planificación + active: Activo + completed: Completado project: - sprint_sharing: Sprint sharing + sprint_sharing: Compartir Sprint sprint: duration: Duración del sprint user_preference: @@ -50,16 +50,16 @@ es: story_points: Puntos de Historia errors: messages: - must_be_in_planning: must be in planning to start. + must_be_in_planning: debe estar en planificación para comenzar. only_one_active_sprint_allowed: solo se permite un sprint activo por proyecto. - dates_required: Start and finish dates are required in order to start the sprint. + dates_required: Es necesario indicar las fechas de inicio y finalización para poder comenzar el sprint. models: project: - receiving_sprints: is receiving shared sprints. Own sprints cannot be created. + receiving_sprints: estás recibiendo sprints compartidos. No se pueden crear sprints propios. attributes: sprint_sharing: - share_all_projects_already_taken: cannot be set because project "%{name}" is already sharing with all projects. - share_all_projects_already_taken_anonymous: cannot be set because another project is already sharing with all projects. + share_all_projects_already_taken: no se puede establecer porque el proyecto "%{name}" ya está compartiendo con todos los proyectos. + share_all_projects_already_taken_anonymous: no se puede establecer porque otro proyecto ya está compartiendo con todos los proyectos. work_package: attributes: blocks_ids: @@ -68,17 +68,17 @@ es: version_id: task_version_must_be_the_same_as_story_version: debe coincidir con la versión de la historia principal. sprint: - not_shared_with_project: is not shared with the project the work package is in. - not_eligible_for_moving: is not an active sprint in the project which holds the sprint the work package is moved out of. + not_shared_with_project: no se comparte con el proyecto en el que se encuentra el paquete de trabajo. + not_eligible_for_moving: no es un sprint activo en el proyecto que tiene el sprint del que se desplaza el paquete de trabajo. agile/sprint: attributes: base: unfinished_work_packages: - one: There is %{count} work package that was not completed in this sprint. - other: There are %{count} work packages that were not completed in this sprint. + one: Hay %{count} paquete de trabajo que no se completó en este sprint. + other: Hay %{count} paquetes de trabajo que no se completaron en este sprint. format: "%{message}" status: - not_active: is not active so it cannot be closed. + not_active: no está activo, por lo que no puede cerrarse. sprint: cannot_end_before_it_starts: El sprint no puede terminar antes del inicio. models: @@ -90,14 +90,14 @@ es: caption_sprints_default_fold_state: Sprints will not be expanded by default when viewing the 'Backlog and sprints' page. Each one has to be manually expanded. column_width: Ancho de columna definition_of_done: Criterio de Aceptación - definition_of_done_caption: Work packages with these statuses are treated as completed in backlog views and reporting. - done_status: Done status - sharing_description: This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing). - sharing: Sharing + definition_of_done_caption: Los paquetes de trabajo con estos estados se tratan como completados en las vistas de backlog y en los informes. + done_status: Estado completado + sharing_description: Este proyecto puede compartir sus propios sprints, recibir sprints compartidos o gestionar los sprints de forma independiente (sin compartir). + sharing: Uso compartido impediment: Impedimento label_versions_default_fold_state: Mostrar versiones colapsadas - label_burndown_chart: Burndown chart - label_sprint_board: Sprint board + label_burndown_chart: Diagrama Burndown + label_sprint_board: Tablero Sprint work_package_is_closed: El paquete de trabajo esta terminado, cuando label_is_done_status: El estado %{status_name} significa completado points_label: @@ -108,7 +108,7 @@ es: rebuild: Reconstruir rebuild_positions: Reconstruir posiciones remaining_hours: Trabajo restante - show_burndown_chart: Burndown chart + show_burndown_chart: Diagrama Burndown story: Historia story_points: one: "%{count} punto de historia" @@ -117,8 +117,8 @@ es: task_color: Color de la tarea unassigned: No asignado administration_blankslate: - title: Backlog admin settings are evolving - text: We are currently redesigning the Backlogs module. Admin settings for sprints and backlogs will be visible here in the near future. Project-level settings remain available. + title: Las opciones de configuración de Backlog están cambiando + text: Ahora mismo estamos rediseñando el módulo «Backlogs». La configuración de administración para los sprints y los backlogs estará disponible aquí en breve. La configuración a nivel de proyecto sigue estando disponible. user_preference: header_backlogs: Módulo de trabajos pendientes button_update_backlogs: Actualizar módulo de trabajos pendientes @@ -135,23 +135,23 @@ es: one: "%{count} historia en backlog" other: "%{count} historias en backlog" inbox_component: - blankslate_title: Backlog inbox is empty - blankslate_description: All open work packages in this project will automatically appear here. - label_drag_work_package: Move %{name} + blankslate_title: La bandeja de entrada de backlog está vacía + blankslate_description: Todos los paquetes de trabajo abiertos en este proyecto aparecerán automáticamente aquí. + label_drag_work_package: Mover %{name} show_more: - one: Show 1 more item - other: Show %{count} more items + one: Mostrar 1 artículo más + other: Mostrar %{count} artículos más inbox_item_component: - label_drag_work_package: Move %{name} + label_drag_work_package: Mover %{name} + label_actions: Acciones del paquete de trabajo inbox_menu_component: - label_actions: Work package actions action_menu: - copy_url_to_clipboard: Copy URL to clipboard - copy_work_package_id: Copy work package ID - move_menu: Move - label_move_to_sprint: Move to sprint + copy_url_to_clipboard: Copiar URL al portapapeles + copy_work_package_id: Copia del ID del paquete de trabajo + move_menu: Mover + label_move_to_sprint: Mover al sprint move_to_sprint_dialog_component: - title: Move to sprint + title: Mover al sprint label_sprint: Sprint backlog: blankslate: @@ -164,10 +164,10 @@ es: receive_shared_no_actions_description_text: This project receives shared sprints from a different project, but none are available right now. settings_link_text: project settings sprint_header_component: - label_start_sprint: Start - label_complete_sprint: Complete - start_sprint_disabled_reason_active_sprint: Another sprint is already active. - start_sprint_disabled_reason_missing_dates: Start and finish dates are required in order to start the sprint. + label_start_sprint: Iniciar + label_complete_sprint: Completar + start_sprint_disabled_reason_active_sprint: Otro sprint ya está activo. + start_sprint_disabled_reason_missing_dates: Es necesario indicar las fechas de inicio y finalización para poder comenzar el sprint. label_story_count: zero: No hay historias en sprint one: "%{count} historia en sprint" @@ -182,28 +182,28 @@ es: wiki: Wiki properties: Propiedades finish_sprint_dialog_component: - title: There are work in progress items - body: "%{message} What would you like to do with these?" - legend: Action for unfinished work packages + title: Hay elementos en curso + body: "%{message} ¿Qué te gustaría hacer con ellos?" + legend: Acción para los paquetes de trabajo inacabados actions: - move_to_top_of_backlog: Move them to the top of the backlog - move_to_bottom_of_backlog: Move them to the bottom of the backlog - move_to_sprint: Move them to another sprint - select_sprint_label: Select sprint - button_complete_sprint: Complete sprint + move_to_top_of_backlog: Muévelos a la parte superior del backlog + move_to_bottom_of_backlog: Muévelos a la parte inferior del backlog + move_to_sprint: Muévelos a otro sprint + select_sprint_label: Seleccionar sprint + button_complete_sprint: Completar sprint sprint_menu_component: label_actions: Acciones de sprint action_menu: edit_sprint: Editar sprint - add_work_package: Add work package + add_work_package: Añadir paquete de trabajo story_component: label_drag_story: Mover %{name} - story_menu_component: - label_actions: Acciones de la historia + label_actions: Acciones de historia + story_menu_list_component: action_menu: - copy_url_to_clipboard: Copy URL to clipboard - copy_work_package_id: Copy work package ID - move_menu: Move + copy_url_to_clipboard: Copiar URL al portapapeles + copy_work_package_id: Copia del ID del paquete de trabajo + move_menu: Mover backlogs_points_burn_direction: Puntos de quemado arriba/abajo backlogs_product_backlog: Cartera de producto backlogs_story: Historia @@ -224,27 +224,27 @@ es: task_type: cannot_be_story_type: no puede ser también un tipo de historia label_backlog: Backlog - label_inbox: Inbox + label_inbox: Bandeja de entrada label_backlogs: Backlogs label_backlogs_unconfigured: Todavía no ha configurado backlogs. Por favor, visite %{administration} > %{plugins}, luego haga clic en el enlace de %{configure} para esta extensión. Cuando haya establecido los campos, vuelva a esta página para empezar a usar la herramienta. label_blocks_ids: ID de los paquetes de trabajo bloqueados - label_burndown_chart: Burndown chart + label_burndown_chart: Diagrama Burndown label_column_in_backlog: Columna en backlog label_used_as_backlog: Se usa como backlog - label_sprint_board: Sprint board + label_sprint_board: Tablero Sprint label_points_burn_down: Abajo label_points_burn_up: Arriba label_sprint_edit: Editar sprint label_sprint_impediments: Impedimentos de sprint label_sprint_new: Nuevo sprint - label_backlog_and_sprints: Backlog and sprints + label_backlog_and_sprints: Backlog y sprints label_task_board: Tablero de tareas - notice_successful_start: The sprint was started. - notice_successful_finish: The sprint was completed. - notice_unsuccessful_start: The sprint could not be started. - notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' - notice_unsuccessful_finish: The sprint could not be completed. - notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_successful_start: Se inició el sprint. + notice_successful_finish: El sprint se completó. + notice_unsuccessful_start: El sprint no pudo iniciarse. + notice_unsuccessful_start_with_reason: 'El sprint no pudo iniciarse: %{reason}' + notice_unsuccessful_finish: El sprint no pudo completarse. + notice_unsuccessful_finish_with_reason: 'El sprint no pudo completarse: %{reason}' permission_create_sprints: Crear sprints permission_manage_sprint_items: Gestionar elementos de sprint permission_select_done_statuses: Seleccionar estados de finalización @@ -257,22 +257,22 @@ es: backlog_sharing: options: no_sharing: - label: Don't share - caption: Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects. + label: No compartir + caption: Los sprints creados en este proyecto sólo estarán disponibles y visibles para este proyecto. Tampoco serán visibles para los subproyectos. receive_shared: - label: Receive shared sprints - caption: This project can only use sprints shared by other projects. - warning: This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible. + label: Recibir sprints compartidos + caption: Este proyecto sólo puede utilizar sprints compartidos por otros proyectos. + warning: Este proyecto sólo puede utilizar sprints compartidos por otros proyectos. Los sprints no utilizados creados previamente en este proyecto ya no serán visibles. share_all_projects: - label: All projects - caption: Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects. - disabled_caption: Option not available since project "%{name}" is currently sharing with all projects and only one project can do this. - disabled_caption_anonymous: Option not available since another project is currently sharing with all projects and only one project can do this. + label: Todos los proyectos + caption: Los sprints creados en este proyecto estarán disponibles para todos los proyectos de esta instancia. Si seleccionas esta opción, dejará de estar disponible para otros proyectos. + disabled_caption: Esta opción no está disponible porque el proyecto «%{name}» se está compartiendo actualmente con todos los proyectos y solo un proyecto puede hacerlo. + disabled_caption_anonymous: Esta opción no está disponible porque otro proyecto ya la está compartiendo con todos los proyectos, y solo un proyecto puede hacerlo. share_subprojects: - label: Subprojects - caption: Sprints created in this project will be available to all subprojects of the current project. - info: Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints. - sprint_sharing: Share sprints + label: Subproyectos + caption: Los sprints creados en este proyecto estarán disponibles para todos los subproyectos del proyecto actual. + info: Al compartir un sprint, se compartirán el nombre, el estado y las fechas de inicio y finalización en todos los proyectos. Estos datos no se pueden modificar en los proyectos que reciben y utilizan estos sprints. + sprint_sharing: Compartir sprints rb_burndown_charts: show: blankslate_title: No hay datos de trabajo pendiente disponibles diff --git a/modules/backlogs/config/locales/crowdin/et.yml b/modules/backlogs/config/locales/crowdin/et.yml index 276fb10d3e4..9565739834c 100644 --- a/modules/backlogs/config/locales/crowdin/et.yml +++ b/modules/backlogs/config/locales/crowdin/et.yml @@ -143,8 +143,8 @@ et: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,8 +198,8 @@ et: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/eu.yml b/modules/backlogs/config/locales/crowdin/eu.yml index 46de3af2bfb..09722615073 100644 --- a/modules/backlogs/config/locales/crowdin/eu.yml +++ b/modules/backlogs/config/locales/crowdin/eu.yml @@ -143,8 +143,8 @@ eu: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,8 +198,8 @@ eu: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/fa.yml b/modules/backlogs/config/locales/crowdin/fa.yml index bb63e7a3900..fe628e53b81 100644 --- a/modules/backlogs/config/locales/crowdin/fa.yml +++ b/modules/backlogs/config/locales/crowdin/fa.yml @@ -143,8 +143,8 @@ fa: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,8 +198,8 @@ fa: add_work_package: Add work package story_component: label_drag_story: انتقال %{name} - story_menu_component: - label_actions: اقدامات داستانی + label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/fi.yml b/modules/backlogs/config/locales/crowdin/fi.yml index 82c92ab2bcd..18e284b0f7b 100644 --- a/modules/backlogs/config/locales/crowdin/fi.yml +++ b/modules/backlogs/config/locales/crowdin/fi.yml @@ -143,8 +143,8 @@ fi: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,8 +198,8 @@ fi: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/fil.yml b/modules/backlogs/config/locales/crowdin/fil.yml index aa3a1e0cc23..ed9d94570b9 100644 --- a/modules/backlogs/config/locales/crowdin/fil.yml +++ b/modules/backlogs/config/locales/crowdin/fil.yml @@ -143,8 +143,8 @@ fil: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,8 +198,8 @@ fil: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/fr.yml b/modules/backlogs/config/locales/crowdin/fr.yml index c0fe74318a4..ee04b56c367 100644 --- a/modules/backlogs/config/locales/crowdin/fr.yml +++ b/modules/backlogs/config/locales/crowdin/fr.yml @@ -41,8 +41,8 @@ fr: sprint: duration: Durée du sprint user_preference: - backlogs_task_color: Task color - backlogs_versions_default_fold_state: Show sprints folded + backlogs_task_color: Couleur de la tâche + backlogs_versions_default_fold_state: Afficher les sprints repliés work_package: backlogs_work_package_type: Type de backlog position: Position @@ -69,13 +69,13 @@ fr: task_version_must_be_the_same_as_story_version: doit être identique à la version de l'histoire parente. sprint: not_shared_with_project: n'est pas partagé avec le projet dans lequel se trouve le lot de travaux. - not_eligible_for_moving: is not an active sprint in the project which holds the sprint the work package is moved out of. + not_eligible_for_moving: n'est pas un sprint actif dans le projet qui contient le sprint duquel le lot de travail est déplacé. agile/sprint: attributes: base: unfinished_work_packages: - one: Il y a %{count} work package qui n'a pas été achevé dans ce sprint. - other: There are %{count} work packages that were not completed in this sprint. + one: Il y a %{count} lot de travaux qui n'a pas été achevé dans ce sprint. + other: Il y a %{count} lots de travaux qui n'ont pas été achevés dans ce sprint. format: "%{message}" status: not_active: n'est pas actif et ne peut donc pas être fermé. @@ -87,7 +87,7 @@ fr: task_type: Type de tâche backlogs: any: tout - caption_sprints_default_fold_state: Sprints will not be expanded by default when viewing the 'Backlog and sprints' page. Each one has to be manually expanded. + caption_sprints_default_fold_state: Les sprints ne sont pas développés par défaut lorsque vous consultez la page « Backlog et sprints ». Chacun d'entre eux doit être développé manuellement. column_width: Largeur de colonne definition_of_done: Définition de Fait definition_of_done_caption: Les work packages ayant ces statuts sont traités comme terminés dans les vues du carnet de commandes et dans les rapports. @@ -96,8 +96,8 @@ fr: sharing: Partage impediment: Obstacle label_versions_default_fold_state: Afficher les versions de manière repliée - label_burndown_chart: Burndown chart - label_sprint_board: Sprint board + label_burndown_chart: Graphique burndown + label_sprint_board: Tableau de sprint work_package_is_closed: Le lot de travaux est fait lorsque label_is_done_status: Le statut %{status_name} signifie fait points_label: @@ -108,7 +108,7 @@ fr: rebuild: Reconstruire rebuild_positions: Reconstruire les positions remaining_hours: Travail restant - show_burndown_chart: Burndown chart + show_burndown_chart: Graphique burndown story: Histoire story_points: one: "%{count} story point" @@ -143,8 +143,8 @@ fr: other: Afficher %{count} articles supplémentaires inbox_item_component: label_drag_work_package: Déplacer %{name} + label_actions: Actions du lot de travaux inbox_menu_component: - label_actions: Work package actions action_menu: copy_url_to_clipboard: Copier l'URL dans le presse-papier copy_work_package_id: Copier l'ID du lot de travail @@ -155,19 +155,19 @@ fr: label_sprint: Sprint backlog: blankslate: - title: No sprints present yet - description_html: To start planning your sprint, create one here or go to the %{settings_link} to receive sprints from a different project. - create_sprint_description_text: To start planning your sprint, create one here. - share_sprint_description_html: To start planning your sprint, go to the %{settings_link} to receive sprints from a different project. - no_actions_description_text: No sprints are available for this project yet. - receive_shared_description_html: This project receives sprints from a different project. Manage this in the %{settings_link}. - receive_shared_no_actions_description_text: This project receives shared sprints from a different project, but none are available right now. - settings_link_text: project settings + title: Il n'y a pas encore de sprints + description_html: Pour commencer à planifier votre sprint, créez-en un ici ou rendez-vous sur %{settings_link} pour recevoir les sprints d'un autre projet. + create_sprint_description_text: Pour commencer à planifier votre sprint, créez-en un ici. + share_sprint_description_html: Pour commencer à planifier votre sprint, rendez-vous sur %{settings_link} pour recevoir les sprints d'un autre projet. + no_actions_description_text: Il n'y a pas encore de sprints disponibles pour ce projet. + receive_shared_description_html: Ce projet reçoit des sprints d'un autre projet. Gérez cela à l'adresse %{settings_link}. + receive_shared_no_actions_description_text: Ce projet reçoit des sprints partagés d'un autre projet, mais aucun n'est disponible pour le moment. + settings_link_text: paramètres du projet sprint_header_component: - label_start_sprint: Start - label_complete_sprint: Complete - start_sprint_disabled_reason_active_sprint: Another sprint is already active. - start_sprint_disabled_reason_missing_dates: Start and finish dates are required in order to start the sprint. + label_start_sprint: Début + label_complete_sprint: Terminé + start_sprint_disabled_reason_active_sprint: Un autre sprint est déjà actif. + start_sprint_disabled_reason_missing_dates: Les dates de début et de fin sont nécessaires pour lancer le sprint. label_story_count: zero: Aucune story dans le sprint one: "%{count} story dans le sprint" @@ -190,7 +190,7 @@ fr: move_to_bottom_of_backlog: Déplacez-les en bas du backlog move_to_sprint: Déplacez-les vers un autre sprint select_sprint_label: Sélectionnez le sprint - button_complete_sprint: Complete sprint + button_complete_sprint: Terminer le sprint sprint_menu_component: label_actions: Actions du sprint action_menu: @@ -198,11 +198,11 @@ fr: add_work_package: Ajouter un lot de travaux story_component: label_drag_story: Déplacer %{name} - story_menu_component: - label_actions: Actions de l'histoire + label_actions: Actions du récit + story_menu_list_component: action_menu: copy_url_to_clipboard: Copier l'URL dans le presse-papier - copy_work_package_id: Copier le lot de travaux + copy_work_package_id: Copier l'ID du lot de travail move_menu: Déplacer backlogs_points_burn_direction: Les points évoluent vers le haut/bas backlogs_product_backlog: Backlog de produit @@ -228,16 +228,16 @@ fr: label_backlogs: Backlogs label_backlogs_unconfigured: Vous n'avez pas encore configuré Backlogs. Veuillez vous rendre dans %{administration} > %{plugins}, puis cliquer sur le lien %{configure} pour ce plugin. Une fois que vous avez défini les champs, revenez sur cette page pour commencer à utiliser l'outil. label_blocks_ids: ID des lots de travaux bloqués - label_burndown_chart: Burndown chart + label_burndown_chart: Graphique burndown label_column_in_backlog: Colonne dans le backlog label_used_as_backlog: Utilisé comme backlog - label_sprint_board: Sprint board + label_sprint_board: Tableau de sprint label_points_burn_down: Vers le bas label_points_burn_up: Vers le haut label_sprint_edit: Modifier le sprint label_sprint_impediments: Obstacles de sprint label_sprint_new: Nouveau sprint - label_backlog_and_sprints: Backlog and sprints + label_backlog_and_sprints: Backlog et sprints label_task_board: Tableau des tâches notice_successful_start: Le sprint a commencé. notice_successful_finish: Le sprint est terminé. diff --git a/modules/backlogs/config/locales/crowdin/he.yml b/modules/backlogs/config/locales/crowdin/he.yml index 1b0cca09ed3..c33d4bda277 100644 --- a/modules/backlogs/config/locales/crowdin/he.yml +++ b/modules/backlogs/config/locales/crowdin/he.yml @@ -151,8 +151,8 @@ he: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -206,8 +206,8 @@ he: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/hi.yml b/modules/backlogs/config/locales/crowdin/hi.yml index 4ebd664d936..3809e2374ed 100644 --- a/modules/backlogs/config/locales/crowdin/hi.yml +++ b/modules/backlogs/config/locales/crowdin/hi.yml @@ -143,8 +143,8 @@ hi: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,8 +198,8 @@ hi: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/hr.yml b/modules/backlogs/config/locales/crowdin/hr.yml index a52bd6ac293..731e42deb27 100644 --- a/modules/backlogs/config/locales/crowdin/hr.yml +++ b/modules/backlogs/config/locales/crowdin/hr.yml @@ -147,8 +147,8 @@ hr: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -202,8 +202,8 @@ hr: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/hu.yml b/modules/backlogs/config/locales/crowdin/hu.yml index a932415e711..6e1ae3df74b 100644 --- a/modules/backlogs/config/locales/crowdin/hu.yml +++ b/modules/backlogs/config/locales/crowdin/hu.yml @@ -143,8 +143,8 @@ hu: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,8 +198,8 @@ hu: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/id.yml b/modules/backlogs/config/locales/crowdin/id.yml index e32ca9cc479..44d1998cf71 100644 --- a/modules/backlogs/config/locales/crowdin/id.yml +++ b/modules/backlogs/config/locales/crowdin/id.yml @@ -139,8 +139,8 @@ id: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -194,8 +194,8 @@ id: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/it.yml b/modules/backlogs/config/locales/crowdin/it.yml index 32d3484de70..d16dcea4c60 100644 --- a/modules/backlogs/config/locales/crowdin/it.yml +++ b/modules/backlogs/config/locales/crowdin/it.yml @@ -33,16 +33,16 @@ it: name: Nome dello sprint sharing: Condivisione statuses: - in_planning: In planning - active: Active - completed: Completed + in_planning: In pianificazione + active: Attivo + completed: Completato project: - sprint_sharing: Sprint sharing + sprint_sharing: Condivisione dello sprint sprint: duration: Durata dello sprint user_preference: - backlogs_task_color: Task color - backlogs_versions_default_fold_state: Show sprints folded + backlogs_task_color: Colore attività + backlogs_versions_default_fold_state: Mostra gli sprint compressi work_package: backlogs_work_package_type: Tipo di backlog position: Posizione @@ -50,16 +50,16 @@ it: story_points: Punti della storia errors: messages: - must_be_in_planning: must be in planning to start. + must_be_in_planning: deve essere in pianificazione per iniziare. only_one_active_sprint_allowed: è consentito un solo sprint attivo per progetto. - dates_required: Start and finish dates are required in order to start the sprint. + dates_required: Per avviare lo sprint sono necessarie le date di inizio e fine. models: project: - receiving_sprints: is receiving shared sprints. Own sprints cannot be created. + receiving_sprints: riceve sprint condivisi. Non è possibile creare sprint propri. attributes: sprint_sharing: - share_all_projects_already_taken: cannot be set because project "%{name}" is already sharing with all projects. - share_all_projects_already_taken_anonymous: cannot be set because another project is already sharing with all projects. + share_all_projects_already_taken: non può essere impostato perché il progetto "%{name}" è già condiviso con tutti i progetti. + share_all_projects_already_taken_anonymous: non può essere impostato perché un altro progetto è già condiviso con tutti i progetti. work_package: attributes: blocks_ids: @@ -68,17 +68,17 @@ it: version_id: task_version_must_be_the_same_as_story_version: deve essere uguale alla versione della storia del genitore. sprint: - not_shared_with_project: is not shared with the project the work package is in. - not_eligible_for_moving: is not an active sprint in the project which holds the sprint the work package is moved out of. + not_shared_with_project: non è condiviso con il progetto in cui si trova la macro-attività. + not_eligible_for_moving: non è uno sprint attivo nel progetto che contiene lo sprint da cui la macro-attività viene spostata. agile/sprint: attributes: base: unfinished_work_packages: - one: There is %{count} work package that was not completed in this sprint. - other: There are %{count} work packages that were not completed in this sprint. + one: C'è %{count} macro-attività che non è stata completata in questo sprint. + other: Ci sono %{count} macro-attività che non sono state completate in questo sprint. format: "%{message}" status: - not_active: is not active so it cannot be closed. + not_active: non è attivo, quindi non può essere chiuso. sprint: cannot_end_before_it_starts: Uno sprint non può terminare prima che venga avviato. models: @@ -87,17 +87,17 @@ it: task_type: Tipo di attività backlogs: any: qualsiasi - caption_sprints_default_fold_state: Sprints will not be expanded by default when viewing the 'Backlog and sprints' page. Each one has to be manually expanded. + caption_sprints_default_fold_state: Gli sprint non verranno espansi automaticamente nella pagina "Backlog e sprint". Ognuno dovrà essere espanso manualmente. column_width: Larghezza della colonna definition_of_done: Definizione di fatto - definition_of_done_caption: Work packages with these statuses are treated as completed in backlog views and reporting. - done_status: Done status - sharing_description: This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing). - sharing: Sharing + definition_of_done_caption: Le macro-attività con questi stati sono considerate completate nelle viste backlog e nei report. + done_status: Stato Fatto + sharing_description: Questo progetto può condividere i propri sprint, ricevere sprint condivisi oppure gestire gli sprint in modo indipendente (senza condivisione). + sharing: Condivisione impediment: Impedimento label_versions_default_fold_state: Espandi le versioni - label_burndown_chart: Burndown chart - label_sprint_board: Sprint board + label_burndown_chart: Grafico Burndown + label_sprint_board: Bacheca sprint work_package_is_closed: Il pacchetto di lavoro è fatto, quando label_is_done_status: Lo stato %{status_name} vuol dire completato points_label: @@ -108,7 +108,7 @@ it: rebuild: Ricostruisci rebuild_positions: Ricostruisce le posizioni remaining_hours: Lavoro residuo - show_burndown_chart: Burndown chart + show_burndown_chart: Grafico Burndown story: Storia story_points: one: "%{count} punto story" @@ -117,8 +117,8 @@ it: task_color: Colore attività unassigned: Non assegnato administration_blankslate: - title: Backlog admin settings are evolving - text: We are currently redesigning the Backlogs module. Admin settings for sprints and backlogs will be visible here in the near future. Project-level settings remain available. + title: Le impostazioni amministrative del backlog sono in divenire + text: Stiamo attualmente riprogettando il modulo Backlog. Le impostazioni amministrative per sprint e backlog saranno presto disponibili qui. Le impostazioni a livello di progetto restano disponibili. user_preference: header_backlogs: Modulo backlog button_update_backlogs: Aggiorna il modulo backlog @@ -135,39 +135,39 @@ it: one: "%{count} story nel backlog" other: "%{count} story nel backlog" inbox_component: - blankslate_title: Backlog inbox is empty - blankslate_description: All open work packages in this project will automatically appear here. - label_drag_work_package: Move %{name} + blankslate_title: La casella del backlog è vuota + blankslate_description: Tutte le macro-attività aperte in questo progetto verranno visualizzate automaticamente qui. + label_drag_work_package: Sposta %{name} show_more: - one: Show 1 more item - other: Show %{count} more items + one: Mostra 1 altro elemento + other: Mostra altri %{count} elementi inbox_item_component: - label_drag_work_package: Move %{name} - inbox_menu_component: + label_drag_work_package: Sposta %{name} label_actions: Work package actions + inbox_menu_component: action_menu: - copy_url_to_clipboard: Copy URL to clipboard - copy_work_package_id: Copy work package ID - move_menu: Move - label_move_to_sprint: Move to sprint + copy_url_to_clipboard: Copia URL negli appunti + copy_work_package_id: Copia ID macro-attività + move_menu: Sposta + label_move_to_sprint: Sposta nello sprint move_to_sprint_dialog_component: - title: Move to sprint + title: Sposta nello sprint label_sprint: Sprint backlog: blankslate: - title: No sprints present yet - description_html: To start planning your sprint, create one here or go to the %{settings_link} to receive sprints from a different project. - create_sprint_description_text: To start planning your sprint, create one here. - share_sprint_description_html: To start planning your sprint, go to the %{settings_link} to receive sprints from a different project. - no_actions_description_text: No sprints are available for this project yet. - receive_shared_description_html: This project receives sprints from a different project. Manage this in the %{settings_link}. - receive_shared_no_actions_description_text: This project receives shared sprints from a different project, but none are available right now. - settings_link_text: project settings + title: Non ci sono ancora sprint + description_html: Per iniziare a pianificare il tuo sprint, creane uno qui oppure vai alle %{settings_link} per ricevere sprint da un altro progetto. + create_sprint_description_text: Per iniziare a pianificare il tuo sprint, creane uno qui. + share_sprint_description_html: Per iniziare a pianificare il tuo sprint, vai alle %{settings_link} per ricevere sprint da un altro progetto. + no_actions_description_text: Non ci sono ancora sprint disponibili per questo progetto. + receive_shared_description_html: Questo progetto riceve sprint da un altro progetto. Gestisci questa impostazione nelle %{settings_link}. + receive_shared_no_actions_description_text: Questo progetto riceve sprint condivisi da un altro progetto, ma al momento non sono disponibili. + settings_link_text: impostazioni del progetto sprint_header_component: - label_start_sprint: Start - label_complete_sprint: Complete - start_sprint_disabled_reason_active_sprint: Another sprint is already active. - start_sprint_disabled_reason_missing_dates: Start and finish dates are required in order to start the sprint. + label_start_sprint: Inizio + label_complete_sprint: Completo + start_sprint_disabled_reason_active_sprint: Un altro sprint è già attivo. + start_sprint_disabled_reason_missing_dates: Per avviare lo sprint sono necessarie le date di inizio e fine. label_story_count: zero: Nessuna story nello sprint one: "%{count} story nello sprint" @@ -182,24 +182,24 @@ it: wiki: Wiki properties: Proprietà finish_sprint_dialog_component: - title: There are work in progress items - body: "%{message} What would you like to do with these?" - legend: Action for unfinished work packages + title: Ci sono elementi in corso + body: "%{message} Cosa desideri fare con questi?" + legend: Azione per le macro-attività non completate actions: - move_to_top_of_backlog: Move them to the top of the backlog - move_to_bottom_of_backlog: Move them to the bottom of the backlog - move_to_sprint: Move them to another sprint - select_sprint_label: Select sprint - button_complete_sprint: Complete sprint + move_to_top_of_backlog: Spostale in cima al backlog + move_to_bottom_of_backlog: Spostale in fondo al backlog + move_to_sprint: Spostale in un altro sprint + select_sprint_label: Seleziona sprint + button_complete_sprint: Completa lo sprint sprint_menu_component: label_actions: Azioni dello sprint action_menu: edit_sprint: Modifica sprint - add_work_package: Add work package + add_work_package: Aggiungi macro-attività story_component: label_drag_story: Sposta %{name} - story_menu_component: - label_actions: Azioni della story + label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -224,27 +224,27 @@ it: task_type: cannot_be_story_type: non può essere anche un tipo di storia label_backlog: Backlog - label_inbox: Inbox + label_inbox: Posta in arrivo label_backlogs: Backlog label_backlogs_unconfigured: Non hai ancora configurato i Backlog. Vai su %{administration} > %{plugins}, quindi fai clic sul link %{configure} per il plugin. Dopo aver impostato i campi, torna su questa pagina per iniziare a utilizzare lo strumento. label_blocks_ids: ID dei pacchetti di lavoro bloccati - label_burndown_chart: Burndown chart + label_burndown_chart: Grafico Burndown label_column_in_backlog: Colonna nel backlog label_used_as_backlog: Usato come backlog - label_sprint_board: Sprint board + label_sprint_board: Bacheca sprint label_points_burn_down: Verso il basso label_points_burn_up: Verso l'alto label_sprint_edit: Modifica sprint label_sprint_impediments: Impedimenti allo sprint label_sprint_new: Nuovo sprint - label_backlog_and_sprints: Backlog and sprints + label_backlog_and_sprints: Backlog e sprint label_task_board: Pannello delle attività - notice_successful_start: The sprint was started. - notice_successful_finish: The sprint was completed. - notice_unsuccessful_start: The sprint could not be started. - notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' - notice_unsuccessful_finish: The sprint could not be completed. - notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_successful_start: Lo sprint è stato avviato. + notice_successful_finish: Lo sprint è stato completato. + notice_unsuccessful_start: Impossibile avviare lo sprint. + notice_unsuccessful_start_with_reason: 'Impossibile avviare lo sprint: %{reason}' + notice_unsuccessful_finish: Impossibile completare lo sprint. + notice_unsuccessful_finish_with_reason: 'Impossibile completare lo sprint: %{reason}' permission_create_sprints: Crea gli sprint permission_manage_sprint_items: Gestisci gli elementi dello sprint permission_select_done_statuses: Seleziona gli stati terminati @@ -257,22 +257,22 @@ it: backlog_sharing: options: no_sharing: - label: Don't share - caption: Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects. + label: Non condividere + caption: Gli sprint creati in questo progetto saranno disponibili e visibili solo per questo progetto. Non saranno visibili neanche ai sottoprogetti. receive_shared: - label: Receive shared sprints - caption: This project can only use sprints shared by other projects. - warning: This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible. + label: Ricevi sprint condivisi + caption: Questo progetto può utilizzare solo sprint condivisi da altri progetti. + warning: Questo progetto può utilizzare solo sprint condivisi da altri progetti. Gli sprint non utilizzati creati in passato in questo progetto non saranno più visibili. share_all_projects: - label: All projects - caption: Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects. - disabled_caption: Option not available since project "%{name}" is currently sharing with all projects and only one project can do this. - disabled_caption_anonymous: Option not available since another project is currently sharing with all projects and only one project can do this. + label: Tutti i progetti + caption: Gli sprint creati in questo progetto saranno disponibili per tutti i progetti in questa istanza. Se selezioni questa opzione, non saranno più disponibili per altri progetti. + disabled_caption: Opzione non disponibile perché il progetto "%{name}" sta attualmente condividendo con tutti i progetti e solo un progetto può farlo. + disabled_caption_anonymous: Opzione non disponibile perché un altro progetto sta attualmente condividendo con tutti i progetti e solo un progetto può farlo. share_subprojects: - label: Subprojects - caption: Sprints created in this project will be available to all subprojects of the current project. - info: Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints. - sprint_sharing: Share sprints + label: Sottoprogetti + caption: Gli sprint creati in questo progetto saranno disponibili per tutti i sottoprogetti del progetto corrente. + info: La condivisione di uno sprint comporta la condivisione del nome, dello stato e delle date di inizio e fine in tutti i progetti. Questi non possono essere modificati nei progetti che ricevono e utilizzano tali sprint. + sprint_sharing: Condividi sprint rb_burndown_charts: show: blankslate_title: Non sono disponibili dati di burndown diff --git a/modules/backlogs/config/locales/crowdin/ja.yml b/modules/backlogs/config/locales/crowdin/ja.yml index 1e3ca7145ff..b907b9a35a5 100644 --- a/modules/backlogs/config/locales/crowdin/ja.yml +++ b/modules/backlogs/config/locales/crowdin/ja.yml @@ -139,8 +139,8 @@ ja: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -194,8 +194,8 @@ ja: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/js-ar.yml b/modules/backlogs/config/locales/crowdin/js-ar.yml index e4c29d15e1e..ae04e57434d 100644 --- a/modules/backlogs/config/locales/crowdin/js-ar.yml +++ b/modules/backlogs/config/locales/crowdin/js-ar.yml @@ -26,5 +26,5 @@ ar: properties: storyPoints: نقاط القصة burndown: - day: Day - points: Points + day: يوم + points: نِقَاط diff --git a/modules/backlogs/config/locales/crowdin/ka.yml b/modules/backlogs/config/locales/crowdin/ka.yml index 16e5e807a2a..ec574953396 100644 --- a/modules/backlogs/config/locales/crowdin/ka.yml +++ b/modules/backlogs/config/locales/crowdin/ka.yml @@ -143,8 +143,8 @@ ka: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,8 +198,8 @@ ka: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/kk.yml b/modules/backlogs/config/locales/crowdin/kk.yml index deebd7d3f1c..0b460e3018d 100644 --- a/modules/backlogs/config/locales/crowdin/kk.yml +++ b/modules/backlogs/config/locales/crowdin/kk.yml @@ -143,8 +143,8 @@ kk: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,8 +198,8 @@ kk: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/ko.yml b/modules/backlogs/config/locales/crowdin/ko.yml index 35d3d43f5f3..58b4a1fc7df 100644 --- a/modules/backlogs/config/locales/crowdin/ko.yml +++ b/modules/backlogs/config/locales/crowdin/ko.yml @@ -41,8 +41,8 @@ ko: sprint: duration: 스프린트 기간 user_preference: - backlogs_task_color: Task color - backlogs_versions_default_fold_state: Show sprints folded + backlogs_task_color: 작업 색상 + backlogs_versions_default_fold_state: 접힌 스프린트 표시 work_package: backlogs_work_package_type: 백로그 유형 position: 위치 @@ -86,7 +86,7 @@ ko: task_type: 작업 유형 backlogs: any: 모두 - caption_sprints_default_fold_state: Sprints will not be expanded by default when viewing the 'Backlog and sprints' page. Each one has to be manually expanded. + caption_sprints_default_fold_state: "'백로그 및 스프린트' 페이지를 볼 때 스프린트는 기본적으로 확장되지 않습니다. 각각을 수동으로 확장해야 합니다." column_width: 열 너비 definition_of_done: 완료 정의 definition_of_done_caption: 이러한 상태의 작업 패키지는 백로그 보기 및 보고에서 완료로 처리됩니다. @@ -139,8 +139,8 @@ ko: other: "%{count}개 항목 더 보기" inbox_item_component: label_drag_work_package: "%{name} 이동" + label_actions: Work package actions inbox_menu_component: - label_actions: 작업 패키지 액션 action_menu: copy_url_to_clipboard: 클립보드에 URL 복사 copy_work_package_id: 작업 패키지 ID 복사 @@ -151,14 +151,14 @@ ko: label_sprint: 스프린트 backlog: blankslate: - title: No sprints present yet - description_html: To start planning your sprint, create one here or go to the %{settings_link} to receive sprints from a different project. - create_sprint_description_text: To start planning your sprint, create one here. - share_sprint_description_html: To start planning your sprint, go to the %{settings_link} to receive sprints from a different project. - no_actions_description_text: No sprints are available for this project yet. - receive_shared_description_html: This project receives sprints from a different project. Manage this in the %{settings_link}. - receive_shared_no_actions_description_text: This project receives shared sprints from a different project, but none are available right now. - settings_link_text: project settings + title: 아직 스프린트 없음 + description_html: 스프린트 계획을 시작하려면 여기에서 스프린트를 만들거나 %{settings_link}(으)로 이동하여 다른 프로젝트의 스프린트를 받아보세요. + create_sprint_description_text: 스프린트 계획을 시작하려면 여기에서 스프린트를 생성하세요. + share_sprint_description_html: 스프린트 계획을 시작하려면 %{settings_link}(으)로 이동하여 다른 프로젝트의 스프린트를 받아보세요. + no_actions_description_text: 아직 이 프로젝트에 사용할 수 있는 스프린트가 없습니다. + receive_shared_description_html: 이 프로젝트는 다른 프로젝트에서 스프린트를 받습니다. %{settings_link}에서 관리하세요. + receive_shared_no_actions_description_text: 이 프로젝트는 다른 프로젝트에서 공유 스프린트를 받지만, 현재 사용할 수 있는 스프린트가 없습니다. + settings_link_text: 프로젝트 설정 sprint_header_component: label_start_sprint: 시작 label_complete_sprint: 완료 @@ -194,12 +194,12 @@ ko: add_work_package: 작업 패키지 추가 story_component: label_drag_story: "%{name} 이동" - story_menu_component: - label_actions: 스토리 작업 + label_actions: Story actions + story_menu_list_component: action_menu: - copy_url_to_clipboard: 클립보드에 URL 복사 - copy_work_package_id: 작업 패키지 ID 복사 - move_menu: 이동 + copy_url_to_clipboard: Copy URL to clipboard + copy_work_package_id: Copy work package ID + move_menu: Move backlogs_points_burn_direction: 포인트 번 업/다운 backlogs_product_backlog: 제품 백로그 backlogs_story: 스토리 @@ -233,7 +233,7 @@ ko: label_sprint_edit: 스프린트 편집 label_sprint_impediments: 스프린트 제한 label_sprint_new: 새로운 스프린트 - label_backlog_and_sprints: Backlog and sprints + label_backlog_and_sprints: 백로그 및 스프린트 label_task_board: 작업 보드 notice_successful_start: 스프린트가 시작되었습니다. notice_successful_finish: 스프린트가 완료되었습니다. diff --git a/modules/backlogs/config/locales/crowdin/lt.yml b/modules/backlogs/config/locales/crowdin/lt.yml index 0fc922beea1..6701c7548c5 100644 --- a/modules/backlogs/config/locales/crowdin/lt.yml +++ b/modules/backlogs/config/locales/crowdin/lt.yml @@ -151,8 +151,8 @@ lt: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -206,8 +206,8 @@ lt: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/lv.yml b/modules/backlogs/config/locales/crowdin/lv.yml index 0a21aa0bec2..10d2d8b9031 100644 --- a/modules/backlogs/config/locales/crowdin/lv.yml +++ b/modules/backlogs/config/locales/crowdin/lv.yml @@ -147,8 +147,8 @@ lv: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -202,8 +202,8 @@ lv: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/mn.yml b/modules/backlogs/config/locales/crowdin/mn.yml index 8e4e5308534..8bf5bcde5d4 100644 --- a/modules/backlogs/config/locales/crowdin/mn.yml +++ b/modules/backlogs/config/locales/crowdin/mn.yml @@ -143,8 +143,8 @@ mn: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,8 +198,8 @@ mn: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/ms.yml b/modules/backlogs/config/locales/crowdin/ms.yml index b8a0ae67f77..3d237286b64 100644 --- a/modules/backlogs/config/locales/crowdin/ms.yml +++ b/modules/backlogs/config/locales/crowdin/ms.yml @@ -139,8 +139,8 @@ ms: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -194,8 +194,8 @@ ms: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/ne.yml b/modules/backlogs/config/locales/crowdin/ne.yml index 9a1c05a49a2..db49945eac4 100644 --- a/modules/backlogs/config/locales/crowdin/ne.yml +++ b/modules/backlogs/config/locales/crowdin/ne.yml @@ -143,8 +143,8 @@ ne: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,8 +198,8 @@ ne: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/nl.yml b/modules/backlogs/config/locales/crowdin/nl.yml index 3459ff04be1..314b3d915b7 100644 --- a/modules/backlogs/config/locales/crowdin/nl.yml +++ b/modules/backlogs/config/locales/crowdin/nl.yml @@ -143,8 +143,8 @@ nl: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,8 +198,8 @@ nl: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/no.yml b/modules/backlogs/config/locales/crowdin/no.yml index d919cf82d59..ec0850d2da4 100644 --- a/modules/backlogs/config/locales/crowdin/no.yml +++ b/modules/backlogs/config/locales/crowdin/no.yml @@ -143,8 +143,8 @@ other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,8 +198,8 @@ add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/pl.yml b/modules/backlogs/config/locales/crowdin/pl.yml index ad2fa4171ad..d8f7bc747f7 100644 --- a/modules/backlogs/config/locales/crowdin/pl.yml +++ b/modules/backlogs/config/locales/crowdin/pl.yml @@ -151,8 +151,8 @@ pl: other: Pokaż jeszcze %{count} elementu inbox_item_component: label_drag_work_package: Przenieś %{name} + label_actions: Work package actions inbox_menu_component: - label_actions: Działania pakietu roboczego action_menu: copy_url_to_clipboard: Skopiuj adres URL do schowka copy_work_package_id: Skopiuj identyfikator pakietu roboczego @@ -206,12 +206,12 @@ pl: add_work_package: Dodaj pakiet roboczy story_component: label_drag_story: Przenieś %{name} - story_menu_component: - label_actions: Działania historii + label_actions: Story actions + story_menu_list_component: action_menu: - copy_url_to_clipboard: Skopiuj adres URL do schowka - copy_work_package_id: Skopiuj identyfikator pakietu roboczego - move_menu: Przenieś + copy_url_to_clipboard: Copy URL to clipboard + copy_work_package_id: Copy work package ID + move_menu: Move backlogs_points_burn_direction: Punkty burn up/down backlogs_product_backlog: Backlog produktu backlogs_story: Story diff --git a/modules/backlogs/config/locales/crowdin/pt-BR.yml b/modules/backlogs/config/locales/crowdin/pt-BR.yml index 03ab7a1f286..c9c46303b4b 100644 --- a/modules/backlogs/config/locales/crowdin/pt-BR.yml +++ b/modules/backlogs/config/locales/crowdin/pt-BR.yml @@ -41,8 +41,8 @@ pt-BR: sprint: duration: Duração da sprint user_preference: - backlogs_task_color: Task color - backlogs_versions_default_fold_state: Show sprints folded + backlogs_task_color: Cor da tarefa + backlogs_versions_default_fold_state: Exibir sprints recolhidas work_package: backlogs_work_package_type: Tipo de backlog position: Posição @@ -50,7 +50,7 @@ pt-BR: story_points: Pontos de história errors: messages: - must_be_in_planning: deve estar em fase de planejamento para começar. + must_be_in_planning: deve estar em planejamento para iniciar. only_one_active_sprint_allowed: apenas uma sprint ativa é permitida por projeto. dates_required: As datas de início e término são obrigatórias para iniciar a sprint. models: @@ -87,11 +87,11 @@ pt-BR: task_type: Tipo de tarefa backlogs: any: qualquer - caption_sprints_default_fold_state: Sprints will not be expanded by default when viewing the 'Backlog and sprints' page. Each one has to be manually expanded. + caption_sprints_default_fold_state: As sprints não serão expandidas por padrão ao visualizar a página “Backlog e sprints”. Cada uma deve ser expandida manualmente. column_width: Largura da coluna definition_of_done: Definição de pronto - definition_of_done_caption: Os pacotes de trabalho com esses status são considerados concluídos nas visualizações da carteira de projetos e nos relatórios. - done_status: Status "Concluído" + definition_of_done_caption: Pacotes de trabalho com estes status são tratados como concluídos nas visualizações de backlog e nos relatórios. + done_status: Status de concluído sharing_description: Este projeto pode compartilhar suas próprias sprints, receber sprints compartilhadas ou gerenciar sprints de forma independente (sem compartilhamento). sharing: Compartilhamento impediment: Impedimento @@ -143,11 +143,11 @@ pt-BR: other: Mostrar mais %{count} itens inbox_item_component: label_drag_work_package: Mover %{name} - inbox_menu_component: label_actions: Ações do pacote de trabalho + inbox_menu_component: action_menu: copy_url_to_clipboard: Copiar URL para a área de transferência - copy_work_package_id: Copiar ID do pacotes de trabalho + copy_work_package_id: Copiar ID do pacote de trabalho move_menu: Mover label_move_to_sprint: Mover para sprint move_to_sprint_dialog_component: @@ -155,14 +155,14 @@ pt-BR: label_sprint: Sprint backlog: blankslate: - title: No sprints present yet - description_html: To start planning your sprint, create one here or go to the %{settings_link} to receive sprints from a different project. - create_sprint_description_text: To start planning your sprint, create one here. - share_sprint_description_html: To start planning your sprint, go to the %{settings_link} to receive sprints from a different project. - no_actions_description_text: No sprints are available for this project yet. - receive_shared_description_html: This project receives sprints from a different project. Manage this in the %{settings_link}. - receive_shared_no_actions_description_text: This project receives shared sprints from a different project, but none are available right now. - settings_link_text: project settings + title: Nenhuma sprint criada até o momento + description_html: Para começar a planejar sua sprint, crie uma aqui ou acesse %{settings_link} para receber sprints de outro projeto. + create_sprint_description_text: Para começar a planejar sua sprint, crie uma aqui. + share_sprint_description_html: Para começar a planejar sua sprint, acesse %{settings_link} para receber sprints de outro projeto. + no_actions_description_text: Ainda não há sprints disponíveis para este projeto. + receive_shared_description_html: Este projeto recebe sprints de outro projeto. Gerencie isso em %{settings_link}. + receive_shared_no_actions_description_text: Este projeto recebe sprints compartilhadas de outro projeto, mas não há nenhum disponível no momento. + settings_link_text: configurações do projeto sprint_header_component: label_start_sprint: Iniciar label_complete_sprint: Concluir @@ -198,11 +198,11 @@ pt-BR: add_work_package: Adicionar pacote de trabalho story_component: label_drag_story: Mover %{name} - story_menu_component: label_actions: Ações da história + story_menu_list_component: action_menu: copy_url_to_clipboard: Copiar URL para a área de transferência - copy_work_package_id: Copiar ID do pacotes de trabalho + copy_work_package_id: Copiar o ID do pacote de trabalho move_menu: Mover backlogs_points_burn_direction: Pontos burn up/down backlogs_product_backlog: Backlog do produto @@ -237,7 +237,7 @@ pt-BR: label_sprint_edit: Editar sprint label_sprint_impediments: Impedimentos da Sprint label_sprint_new: Nova sprint - label_backlog_and_sprints: Backlog and sprints + label_backlog_and_sprints: Backlog e sprints label_task_board: Quadro de tarefas notice_successful_start: A sprint foi iniciada. notice_successful_finish: A sprint foi concluída. diff --git a/modules/backlogs/config/locales/crowdin/pt-PT.yml b/modules/backlogs/config/locales/crowdin/pt-PT.yml index a25ae98d29d..fcb998e69ff 100644 --- a/modules/backlogs/config/locales/crowdin/pt-PT.yml +++ b/modules/backlogs/config/locales/crowdin/pt-PT.yml @@ -143,8 +143,8 @@ pt-PT: other: Mostrar mais %{count} elementos inbox_item_component: label_drag_work_package: Mover %{name} + label_actions: Work package actions inbox_menu_component: - label_actions: Ações do pacote de trabalho action_menu: copy_url_to_clipboard: Copiar URL para a área de transferência copy_work_package_id: Copiar ID do pacote de trabalho @@ -198,12 +198,12 @@ pt-PT: add_work_package: Adicionar pacote de trabalho story_component: label_drag_story: Mover %{name} - story_menu_component: - label_actions: Ações de história + label_actions: Story actions + story_menu_list_component: action_menu: - copy_url_to_clipboard: Copiar URL para a área de transferência - copy_work_package_id: Copiar ID do pacote de trabalho - move_menu: Mover + copy_url_to_clipboard: Copy URL to clipboard + copy_work_package_id: Copy work package ID + move_menu: Move backlogs_points_burn_direction: Pontos queimam para cima/para baixo backlogs_product_backlog: Backlog do produto backlogs_story: História diff --git a/modules/backlogs/config/locales/crowdin/ro.yml b/modules/backlogs/config/locales/crowdin/ro.yml index 011b4635f1a..1816fe125ba 100644 --- a/modules/backlogs/config/locales/crowdin/ro.yml +++ b/modules/backlogs/config/locales/crowdin/ro.yml @@ -147,8 +147,8 @@ ro: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -202,8 +202,8 @@ ro: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/ru.yml b/modules/backlogs/config/locales/crowdin/ru.yml index d477b8068bf..793675c7b66 100644 --- a/modules/backlogs/config/locales/crowdin/ru.yml +++ b/modules/backlogs/config/locales/crowdin/ru.yml @@ -151,8 +151,8 @@ ru: other: Показать еще %{count} элементов inbox_item_component: label_drag_work_package: Переместить %{name} + label_actions: Work package actions inbox_menu_component: - label_actions: Действия пакета работ action_menu: copy_url_to_clipboard: Скопировать URL в буфер обмена copy_work_package_id: Скопировать ID пакета работ @@ -206,12 +206,12 @@ ru: add_work_package: Добавить пакет работ story_component: label_drag_story: Переместить %{name} - story_menu_component: - label_actions: Действия истории + label_actions: Story actions + story_menu_list_component: action_menu: - copy_url_to_clipboard: Скопировать URL в буфер обмена - copy_work_package_id: Скопировать ID пакета работ - move_menu: Переместить + copy_url_to_clipboard: Copy URL to clipboard + copy_work_package_id: Copy work package ID + move_menu: Move backlogs_points_burn_direction: Точки выгорания вверх/вниз backlogs_product_backlog: Требования к продукту, с приоритетами backlogs_story: История diff --git a/modules/backlogs/config/locales/crowdin/rw.yml b/modules/backlogs/config/locales/crowdin/rw.yml index ecdaaf0e50d..a25cc5fa94d 100644 --- a/modules/backlogs/config/locales/crowdin/rw.yml +++ b/modules/backlogs/config/locales/crowdin/rw.yml @@ -143,8 +143,8 @@ rw: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,8 +198,8 @@ rw: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/si.yml b/modules/backlogs/config/locales/crowdin/si.yml index 8a0cd69340f..04115ceecea 100644 --- a/modules/backlogs/config/locales/crowdin/si.yml +++ b/modules/backlogs/config/locales/crowdin/si.yml @@ -143,8 +143,8 @@ si: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,8 +198,8 @@ si: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/sk.yml b/modules/backlogs/config/locales/crowdin/sk.yml index 91f76ed292d..5b128ba2ced 100644 --- a/modules/backlogs/config/locales/crowdin/sk.yml +++ b/modules/backlogs/config/locales/crowdin/sk.yml @@ -151,8 +151,8 @@ sk: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -206,8 +206,8 @@ sk: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/sl.yml b/modules/backlogs/config/locales/crowdin/sl.yml index 6959410a182..d69dac2e072 100644 --- a/modules/backlogs/config/locales/crowdin/sl.yml +++ b/modules/backlogs/config/locales/crowdin/sl.yml @@ -151,8 +151,8 @@ sl: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -206,8 +206,8 @@ sl: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/sr.yml b/modules/backlogs/config/locales/crowdin/sr.yml index fdbefae2fbe..98217f497e2 100644 --- a/modules/backlogs/config/locales/crowdin/sr.yml +++ b/modules/backlogs/config/locales/crowdin/sr.yml @@ -147,8 +147,8 @@ sr: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -202,8 +202,8 @@ sr: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/sv.yml b/modules/backlogs/config/locales/crowdin/sv.yml index 7ef32c48662..d59385b0453 100644 --- a/modules/backlogs/config/locales/crowdin/sv.yml +++ b/modules/backlogs/config/locales/crowdin/sv.yml @@ -143,8 +143,8 @@ sv: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,8 +198,8 @@ sv: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/th.yml b/modules/backlogs/config/locales/crowdin/th.yml index 61976084a6a..d914e0e1e9c 100644 --- a/modules/backlogs/config/locales/crowdin/th.yml +++ b/modules/backlogs/config/locales/crowdin/th.yml @@ -139,8 +139,8 @@ th: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -194,8 +194,8 @@ th: add_work_package: Add work package story_component: label_drag_story: ย้าย %{name} - story_menu_component: - label_actions: การจัดการสตอรี่ + label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/tr.yml b/modules/backlogs/config/locales/crowdin/tr.yml index a877081a031..ce48167d0eb 100644 --- a/modules/backlogs/config/locales/crowdin/tr.yml +++ b/modules/backlogs/config/locales/crowdin/tr.yml @@ -143,8 +143,8 @@ tr: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,8 +198,8 @@ tr: add_work_package: Add work package story_component: label_drag_story: Taşı %{name} - story_menu_component: - label_actions: Hikaye eylemleri + label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/uk.yml b/modules/backlogs/config/locales/crowdin/uk.yml index d533f9631a8..fa143ab4348 100644 --- a/modules/backlogs/config/locales/crowdin/uk.yml +++ b/modules/backlogs/config/locales/crowdin/uk.yml @@ -33,16 +33,16 @@ uk: name: Ім’я спринту sharing: Надання доступу statuses: - in_planning: Планування - active: Активні - completed: Завершено + in_planning: На етапі планування + active: Активний + completed: Завершений project: sprint_sharing: Спільний доступ до спринту sprint: duration: Тривалість спринту user_preference: - backlogs_task_color: Task color - backlogs_versions_default_fold_state: Show sprints folded + backlogs_task_color: Колір завдання + backlogs_versions_default_fold_state: Показувати спринти згорнутими work_package: backlogs_work_package_type: Тип Backlog-у position: Позиція @@ -50,12 +50,12 @@ uk: story_points: Сторі-поінти errors: messages: - must_be_in_planning: має бути на етапі планування, перш ніж можна буде почати. + must_be_in_planning: має бути на етапі планування, перш ніж його можна буде почати. only_one_active_sprint_allowed: дозволяється лише один активний спринт для кожного проєкту. dates_required: Щоб запустити спринт, необхідно вказати дату початку й завершення. models: project: - receiving_sprints: отримує спільні спринти. Власні спринти створювати не можна. + receiving_sprints: використовує спринти, до яких надано доступ. Власні спринти створювати не можна. attributes: sprint_sharing: share_all_projects_already_taken: не можна налаштувати, оскільки проєкт «%{name}» уже надає спільний доступ усім проєктам. @@ -68,7 +68,7 @@ uk: version_id: task_version_must_be_the_same_as_story_version: має збігатись із версією батьківської історії. sprint: - not_shared_with_project: не може спільно використовуватися з проєктом, у якому міститься пакет робіт. + not_shared_with_project: не надається проєкту, у якому міститься пакет робіт. not_eligible_for_moving: не є активним спринтом у проєкті, який включає спринт, з якого переміщується пакет робіт. agile/sprint: attributes: @@ -89,12 +89,12 @@ uk: task_type: Тип завдання backlogs: any: будь-який - caption_sprints_default_fold_state: Sprints will not be expanded by default when viewing the 'Backlog and sprints' page. Each one has to be manually expanded. + caption_sprints_default_fold_state: Спринти не розгортатимуться за замовчуванням при перегляді сторінки «Беклог і спринти». Кожен спринт потрібно буде розгортати вручну. column_width: Ширина стовпця definition_of_done: Визначення завершено definition_of_done_caption: Пакети робіт із цими статусами вважаються завершеними в переглядах беклогу й звітності. done_status: Статус «Виконано» - sharing_description: Цей проєкт може надавати доступ до власних спринтів, отримувати доступ до спринтів, якими з ним поділилися, або працювати зі спринтами самостійно (без спільного доступу). + sharing_description: Цей проєкт може надавати доступ до власних спринтів, використовувати спринти, до яких надано доступ, або працювати зі спринтами самостійно (без спільного доступу). sharing: Надання доступу impediment: Перешкода label_versions_default_fold_state: Показати складені версії @@ -123,7 +123,7 @@ uk: task_color: Колір завдання unassigned: Не призначено administration_blankslate: - title: Налаштування адміністратора в модулі беклогів змінюються + title: Ми змінюємо налаштування адміністратора в модулі беклогів text: Зараз ми переробляємо модуль невиконаних завдань (беклогів). Налаштування адміністратора для спринтів і беклогів з’являться тут найближчим часом. Налаштування на рівні проєктів залишаються доступними. user_preference: header_backlogs: Модуль невиконаних завдань @@ -141,18 +141,18 @@ uk: one: У беклозі %{count} історія other: 'У беклозі стільки історій: %{count}' inbox_component: - blankslate_title: Backlog inbox is empty + blankslate_title: Немає вхідних завдань беклогу blankslate_description: Тут автоматично з’являтимуться всі відкриті пакети робіт цього проєкту. label_drag_work_package: Перемістити історію «%{name}» show_more: - one: Показати ще 1 об’єкт - few: Показати ще %{count} об’єкти - many: Показати ще %{count} об’єктів - other: Показати ще %{count} об’єкта + one: Показати ще 1 елемент + few: Показати ще %{count} елементи + many: Показати ще %{count} елементів + other: Показати ще %{count} елемента inbox_item_component: label_drag_work_package: Перемістити історію «%{name}» + label_actions: Work package actions inbox_menu_component: - label_actions: Дії пакета робіт action_menu: copy_url_to_clipboard: Скопіювати URL-адресу в буфер обміну copy_work_package_id: Копіювати ідентифікатор пакета робіт @@ -163,18 +163,18 @@ uk: label_sprint: Спринт backlog: blankslate: - title: No sprints present yet - description_html: To start planning your sprint, create one here or go to the %{settings_link} to receive sprints from a different project. - create_sprint_description_text: To start planning your sprint, create one here. - share_sprint_description_html: To start planning your sprint, go to the %{settings_link} to receive sprints from a different project. - no_actions_description_text: No sprints are available for this project yet. - receive_shared_description_html: This project receives sprints from a different project. Manage this in the %{settings_link}. - receive_shared_no_actions_description_text: This project receives shared sprints from a different project, but none are available right now. - settings_link_text: project settings + title: Спринтів ще немає + description_html: Щоб почати планувати спринт, створіть його тут або перейдіть на сторінку %{settings_link}, щоб отримати спринти з інших проєктів. + create_sprint_description_text: Щоб почати планувати спринт, створіть його тут. + share_sprint_description_html: Щоб почати планувати спринт, перейдіть на сторінку %{settings_link}, щоб отримати спринти з інших проєктів. + no_actions_description_text: Ще немає спринтів, доступних для цього проєкту. + receive_shared_description_html: Цей проєкт може використовувати спринти з іншого проєкту. Щоб змінити параметри, перейдіть на сторінку %{settings_link}. + receive_shared_no_actions_description_text: Цей проєкт може використовувати спринти з іншого проєкту, до яких надано доступ. Однак зараз доступних спринтів немає. + settings_link_text: налаштування проєкту sprint_header_component: label_start_sprint: Початок label_complete_sprint: Завершити - start_sprint_disabled_reason_active_sprint: Інший спринт уже активний. + start_sprint_disabled_reason_active_sprint: Інший спринт уже розпочато. start_sprint_disabled_reason_missing_dates: Щоб запустити спринт, необхідно вказати дату початку й завершення. label_story_count: zero: У спринті немає історій @@ -190,7 +190,7 @@ uk: wiki: Wiki properties: Властивості finish_sprint_dialog_component: - title: Є об’єкти, роботу над якими ще не завершено + title: Є елементи, роботу над якими ще не завершено body: "%{message} Що б ви хотіли з ними зробити?" legend: Дія для незавершених пакетів робіт actions: @@ -206,12 +206,12 @@ uk: add_work_package: Додати пакет робіт story_component: label_drag_story: Перемістити історію «%{name}» - story_menu_component: - label_actions: Дії історії + label_actions: Story actions + story_menu_list_component: action_menu: - copy_url_to_clipboard: Скопіювати URL-адресу в буфер обміну - copy_work_package_id: Копіювати ідентифікатор пакета робіт - move_menu: Перемістити + copy_url_to_clipboard: Copy URL to clipboard + copy_work_package_id: Copy work package ID + move_menu: Move backlogs_points_burn_direction: Бали спалюються вгору/вниз backlogs_product_backlog: Backlog продукту backlogs_story: Історія @@ -239,20 +239,20 @@ uk: label_burndown_chart: Діаграма згорання завдань label_column_in_backlog: Стовпець у backlog-у label_used_as_backlog: Використовується як беклог - label_sprint_board: Sprint board + label_sprint_board: Дошка спринту label_points_burn_down: Вниз label_points_burn_up: Вгору label_sprint_edit: Редагувати спринт label_sprint_impediments: Перешкоди спринту label_sprint_new: Новий спринт - label_backlog_and_sprints: Backlog and sprints + label_backlog_and_sprints: Беклог і спринти label_task_board: Дошка завдань - notice_successful_start: The sprint was started. - notice_successful_finish: The sprint was completed. - notice_unsuccessful_start: The sprint could not be started. - notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' - notice_unsuccessful_finish: The sprint could not be completed. - notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_successful_start: Спринт розпочато. + notice_successful_finish: Спринт завершено. + notice_unsuccessful_start: Спринт не вдалося розпочати. + notice_unsuccessful_start_with_reason: 'Спринт не вдалося розпочати: %{reason}' + notice_unsuccessful_finish: Спринт не вдалося завершити. + notice_unsuccessful_finish_with_reason: 'Спринт не вдалося завершити: %{reason}' permission_create_sprints: Створення спринтів permission_manage_sprint_items: Керування елементами спринтів permission_select_done_statuses: Виберіть завершені статуси @@ -265,22 +265,22 @@ uk: backlog_sharing: options: no_sharing: - label: Don't share - caption: Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects. + label: Не надавати доступ + caption: Спринти, створені в цьому проєкті, будуть доступні й видимі лише для цього проєкту. Вони також не будуть видимі для підпроєктів. receive_shared: - label: Receive shared sprints - caption: This project can only use sprints shared by other projects. - warning: This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible. + label: Отримувати доступ до спринтів + caption: Цей проєкт може використовувати лише спринти, до яких надали доступ інші проєкти. + warning: Цей проєкт може використовувати лише спринти, до яких надали доступ інші проєкти. Невикористані спринти, створені в цьому проєкті в минулому, більше не будуть видимими. share_all_projects: label: Усі проєкти - caption: Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects. - disabled_caption: Option not available since project "%{name}" is currently sharing with all projects and only one project can do this. - disabled_caption_anonymous: Option not available since another project is currently sharing with all projects and only one project can do this. + caption: Спринти, створені в цьому проєкті, будуть доступні для всіх проєктів, наявних у цьому екземплярі. Якщо ви виберете цю опцію, вона більше не буде доступна для інших проєктів. + disabled_caption: Опція недоступна, оскільки проєкт «%{name}» зараз надає спільний доступ усім проєктам і це може робити лише один проєкт. + disabled_caption_anonymous: Опція недоступна, оскільки інший проєкт зараз надає спільний доступ усім проєктам і це може робити лише один проєкт. share_subprojects: label: Підпроєкти - caption: Sprints created in this project will be available to all subprojects of the current project. - info: Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints. - sprint_sharing: Share sprints + caption: Спринти, створені в цьому проєкті, будуть доступні для всіх його підпроєктів. + info: Надавши спільний доступ до спринту, ви дозволяєте переглядати його назву, статус, а також дати початку й завершення в усіх проєктах. Ці дані не можна змінити в проєктах, які отримують доступ до таких спринтів і використовують їх. + sprint_sharing: Надання доступу до спринтів rb_burndown_charts: show: blankslate_title: Немає даних про згорання завдань diff --git a/modules/backlogs/config/locales/crowdin/uz.yml b/modules/backlogs/config/locales/crowdin/uz.yml index 70fd1a888a3..74f062f5178 100644 --- a/modules/backlogs/config/locales/crowdin/uz.yml +++ b/modules/backlogs/config/locales/crowdin/uz.yml @@ -143,8 +143,8 @@ uz: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -198,8 +198,8 @@ uz: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/vi.yml b/modules/backlogs/config/locales/crowdin/vi.yml index 4a054f51711..eecf8abc344 100644 --- a/modules/backlogs/config/locales/crowdin/vi.yml +++ b/modules/backlogs/config/locales/crowdin/vi.yml @@ -141,8 +141,8 @@ vi: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -196,8 +196,8 @@ vi: add_work_package: Add work package story_component: label_drag_story: Move %{name} - story_menu_component: label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/crowdin/zh-CN.yml b/modules/backlogs/config/locales/crowdin/zh-CN.yml index 17e7259a75b..7e3058dbcfa 100644 --- a/modules/backlogs/config/locales/crowdin/zh-CN.yml +++ b/modules/backlogs/config/locales/crowdin/zh-CN.yml @@ -33,33 +33,33 @@ zh-CN: name: 冲刺名称 sharing: 共享 statuses: - in_planning: In planning - active: Active - completed: Completed + in_planning: 规划中 + active: 活跃 + completed: 已完成 project: - sprint_sharing: Sprint sharing + sprint_sharing: 冲刺共享 sprint: duration: 冲刺持续时间 user_preference: - backlogs_task_color: Task color - backlogs_versions_default_fold_state: Show sprints folded + backlogs_task_color: 任务颜色 + backlogs_versions_default_fold_state: 以折叠形式显示冲刺 work_package: backlogs_work_package_type: 待办清单类型 position: 位置 - sprint: Sprint + sprint: 冲刺 story_points: 故事点 errors: messages: - must_be_in_planning: must be in planning to start. + must_be_in_planning: 必须处于规划中状态才能开始。 only_one_active_sprint_allowed: 每个项目只允许有一个有效冲刺。 - dates_required: Start and finish dates are required in order to start the sprint. + dates_required: 必须设置开始和结束日期才能开始冲刺。 models: project: - receiving_sprints: is receiving shared sprints. Own sprints cannot be created. + receiving_sprints: 正在接收共享冲刺。无法创建自己的冲刺。 attributes: sprint_sharing: - share_all_projects_already_taken: cannot be set because project "%{name}" is already sharing with all projects. - share_all_projects_already_taken_anonymous: cannot be set because another project is already sharing with all projects. + share_all_projects_already_taken: 无法设置,因为项目“%{name}”已经与所有项目共享。 + share_all_projects_already_taken_anonymous: 无法设置,因为另一项目已经与所有项目共享。 work_package: attributes: blocks_ids: @@ -68,16 +68,16 @@ zh-CN: version_id: task_version_must_be_the_same_as_story_version: 必须与父级故事的版本相同。 sprint: - not_shared_with_project: is not shared with the project the work package is in. - not_eligible_for_moving: is not an active sprint in the project which holds the sprint the work package is moved out of. + not_shared_with_project: 未与工作包所在的项目共享。 + not_eligible_for_moving: 该工作包被移出的冲刺所属的项目中,没有处于活跃状态的冲刺。 agile/sprint: attributes: base: unfinished_work_packages: - other: There are %{count} work packages that were not completed in this sprint. + other: 此冲刺中,有 %{count} 个未完成的工作包。 format: "%{message}" status: - not_active: is not active so it cannot be closed. + not_active: 未处于活跃状态,因此无法关闭。 sprint: cannot_end_before_it_starts: 比赛不可以在开始前结束。 models: @@ -86,17 +86,17 @@ zh-CN: task_type: 任务类型 backlogs: any: 任一 - caption_sprints_default_fold_state: Sprints will not be expanded by default when viewing the 'Backlog and sprints' page. Each one has to be manually expanded. + caption_sprints_default_fold_state: 查看“待办清单和冲刺”页面时,默认情况下不会展开冲刺。每个冲刺都必须手动展开。 column_width: 列宽 definition_of_done: 完成的定义 - definition_of_done_caption: Work packages with these statuses are treated as completed in backlog views and reporting. - done_status: Done status - sharing_description: This project can either share its own sprints, receive shared sprints or handle sprints independently (no sharing). - sharing: Sharing + definition_of_done_caption: 具有这些状态的工作包在待办清单视图和报告中会被视为已完成。 + done_status: 已完成状态 + sharing_description: 词项目可以共享自己的冲刺、接收共享的冲刺或独立处理冲刺(不共享)。 + sharing: 共享中 impediment: 障碍 label_versions_default_fold_state: 显示已折叠的版本 - label_burndown_chart: Burndown chart - label_sprint_board: Sprint board + label_burndown_chart: 燃尽图 + label_sprint_board: 冲刺面板 work_package_is_closed: 工作包已完成,当 label_is_done_status: 状态 %{status_name} 表示已完成 points_label: @@ -106,7 +106,7 @@ zh-CN: rebuild: 重建 rebuild_positions: 重建顺序 remaining_hours: 剩余工时 - show_burndown_chart: Burndown chart + show_burndown_chart: 燃尽图 story: 故事 story_points: other: "%{count} 个故事点" @@ -114,8 +114,8 @@ zh-CN: task_color: 任务颜色 unassigned: 未指定 administration_blankslate: - title: Backlog admin settings are evolving - text: We are currently redesigning the Backlogs module. Admin settings for sprints and backlogs will be visible here in the near future. Project-level settings remain available. + title: 待办清单管理设置正在升级 + text: 我们目前正在重新设计待办清单模块。冲刺和代办清单的管理设置不久后将显示在此处。项目级设置仍然可用。 user_preference: header_backlogs: 积压工作模块 button_update_backlogs: 更新积压工作模块 @@ -132,38 +132,42 @@ zh-CN: one: 积压工作中有 %{count} 个故事 other: 积压工作中有 %{count} 个故事 inbox_component: - blankslate_title: Backlog inbox is empty - blankslate_description: All open work packages in this project will automatically appear here. - label_drag_work_package: Move %{name} + blankslate_title: 待办清单收件箱为空 + blankslate_description: 此项目中所有开放的工作包都会自动出现在此处。 + label_drag_work_package: 移动 %{name} show_more: - other: Show %{count} more items + other: |- + One + 显示另外 1 个项目 + Other + 显示另外 %{count} 个项目 inbox_item_component: - label_drag_work_package: Move %{name} + label_drag_work_package: 移动 %{name} + label_actions: 工作包操作 inbox_menu_component: - label_actions: Work package actions action_menu: - copy_url_to_clipboard: Copy URL to clipboard - copy_work_package_id: Copy work package ID - move_menu: Move - label_move_to_sprint: Move to sprint + copy_url_to_clipboard: 将 URL 复制到剪贴板 + copy_work_package_id: 复制工作包 ID + move_menu: 移动 + label_move_to_sprint: 移动到冲刺 move_to_sprint_dialog_component: - title: Move to sprint - label_sprint: Sprint + title: 移动到冲刺 + label_sprint: 冲刺 backlog: blankslate: - title: No sprints present yet - description_html: To start planning your sprint, create one here or go to the %{settings_link} to receive sprints from a different project. - create_sprint_description_text: To start planning your sprint, create one here. - share_sprint_description_html: To start planning your sprint, go to the %{settings_link} to receive sprints from a different project. - no_actions_description_text: No sprints are available for this project yet. - receive_shared_description_html: This project receives sprints from a different project. Manage this in the %{settings_link}. - receive_shared_no_actions_description_text: This project receives shared sprints from a different project, but none are available right now. - settings_link_text: project settings + title: 还不存在冲刺 + description_html: 要开始计划冲刺,请在此处创建一个冲刺,或转到 %{settings_link} 从其他项目接收冲刺。 + create_sprint_description_text: 要开始计划冲刺,请在此处创建一个冲刺。 + share_sprint_description_html: 要开始计划冲刺,请转到 %{settings_link} 从其他项目接收冲刺。 + no_actions_description_text: 此项目还没有可用的冲刺。 + receive_shared_description_html: 此项目从其他项目接收冲刺。请在 %{settings_link} 中管理此设置。 + receive_shared_no_actions_description_text: 此项目从其他项目接收共享冲刺,但目前没有可用冲刺。 + settings_link_text: 项目设置 sprint_header_component: - label_start_sprint: Start - label_complete_sprint: Complete - start_sprint_disabled_reason_active_sprint: Another sprint is already active. - start_sprint_disabled_reason_missing_dates: Start and finish dates are required in order to start the sprint. + label_start_sprint: 开始 + label_complete_sprint: 完成 + start_sprint_disabled_reason_active_sprint: 另一个冲刺已处于活跃状态。 + start_sprint_disabled_reason_missing_dates: 必须设置开始和结束日期才能开始冲刺。 label_story_count: zero: 冲刺中没有故事 one: 冲刺中有 %{count} 个故事 @@ -178,28 +182,28 @@ zh-CN: wiki: 维基 properties: 属性 finish_sprint_dialog_component: - title: There are work in progress items - body: "%{message} What would you like to do with these?" - legend: Action for unfinished work packages + title: 有工作正在进行中的项目 + body: "%{message} 您想用它们做什么?" + legend: 为未完成的工作包执行的操作 actions: - move_to_top_of_backlog: Move them to the top of the backlog - move_to_bottom_of_backlog: Move them to the bottom of the backlog - move_to_sprint: Move them to another sprint - select_sprint_label: Select sprint - button_complete_sprint: Complete sprint + move_to_top_of_backlog: 将它们移动到待办清单顶部。 + move_to_bottom_of_backlog: 将它们移动到待办清单底部。 + move_to_sprint: 将它们移动到另一冲刺 + select_sprint_label: 选择冲刺 + button_complete_sprint: 完成冲刺 sprint_menu_component: label_actions: 冲刺操作 action_menu: edit_sprint: 编辑冲刺 - add_work_package: Add work package + add_work_package: 添加工作包 story_component: label_drag_story: 移动 %{name} - story_menu_component: label_actions: 故事操作 + story_menu_list_component: action_menu: - copy_url_to_clipboard: Copy URL to clipboard - copy_work_package_id: Copy work package ID - move_menu: Move + copy_url_to_clipboard: 将 URL 复制到剪贴板 + copy_work_package_id: 复制工作包 ID + move_menu: 移动 backlogs_points_burn_direction: 点数燃尽曲线 backlogs_product_backlog: 产品待办清单 backlogs_story: 故事 @@ -219,28 +223,28 @@ zh-CN: attributes: task_type: cannot_be_story_type: 不能同时为故事类型 - label_backlog: Backlog - label_inbox: Inbox + label_backlog: 待办清单 + label_inbox: 收件箱 label_backlogs: 待办清单 label_backlogs_unconfigured: 您尚未配置待办清单。请转到“%{administration} > %{plugins}”,然后单击此插件的 %{configure} 链接。设置字段后,返回到此页面开始使用工具。 label_blocks_ids: 被阻止的工作包 ID - label_burndown_chart: Burndown chart + label_burndown_chart: 燃尽图 label_column_in_backlog: 待办清单中的列 label_used_as_backlog: 用作积压工作 - label_sprint_board: Sprint board + label_sprint_board: 冲刺面板 label_points_burn_down: 减少 label_points_burn_up: 增加 label_sprint_edit: 编辑冲刺 label_sprint_impediments: 冲刺 (sprint) 障碍 label_sprint_new: 新冲刺 - label_backlog_and_sprints: Backlog and sprints + label_backlog_and_sprints: 待办清单和冲刺 label_task_board: 任务板 - notice_successful_start: The sprint was started. - notice_successful_finish: The sprint was completed. - notice_unsuccessful_start: The sprint could not be started. - notice_unsuccessful_start_with_reason: 'The sprint could not be started: %{reason}' - notice_unsuccessful_finish: The sprint could not be completed. - notice_unsuccessful_finish_with_reason: 'The sprint could not be completed: %{reason}' + notice_successful_start: 冲刺已开始。 + notice_successful_finish: 冲刺已完成。 + notice_unsuccessful_start: 无法开始冲刺。 + notice_unsuccessful_start_with_reason: 无法开始冲刺:%{reason} + notice_unsuccessful_finish: 无法完成冲刺。 + notice_unsuccessful_finish_with_reason: 无法完成冲刺:%{reason} permission_create_sprints: 创建冲刺 permission_manage_sprint_items: 管理冲刺条目 permission_select_done_statuses: 选择完成状态 @@ -253,22 +257,22 @@ zh-CN: backlog_sharing: options: no_sharing: - label: Don't share - caption: Sprints created in this project will only be available and visible to this project. They will also not be visible to subprojects. + label: 不共享 + caption: 在此项目中创建的冲刺将仅在此项目中可用和可见。这些冲刺对子项目也不可见。 receive_shared: - label: Receive shared sprints - caption: This project can only use sprints shared by other projects. - warning: This project can only use sprints shared by other projects. Unused sprints created in this project in the past, will no longer be visible. + label: 接收共享冲刺 + caption: 此项目只能使用其他项目共享的冲刺。 + warning: 此项目只能使用其他项目共享的冲刺。之前在此项目中创建的未使用的冲刺将不再可见。 share_all_projects: - label: All projects - caption: Sprints created in this project will be available to all projects in this instance. If you select this option, it will no longer be available to other projects. - disabled_caption: Option not available since project "%{name}" is currently sharing with all projects and only one project can do this. + label: 所有项目 + caption: 在此项目中创建的冲刺将可用于此实例中的所有项目。如果选择此选项,这些冲刺将不再可用于其他项目。 + disabled_caption: 选项不可用,因为项目“%{name}”目前正在与所有项目共享,仅允许一个项目进行此操作。 disabled_caption_anonymous: Option not available since another project is currently sharing with all projects and only one project can do this. share_subprojects: - label: Subprojects - caption: Sprints created in this project will be available to all subprojects of the current project. - info: Sharing a sprint will share the name, status and the start and finish dates in all projects. These cannot be modified in projects that receive and use these sprints. - sprint_sharing: Share sprints + label: 子项目 + caption: 在此项目中创建的冲刺将对当前项目的所有子项目可用。 + info: 共享冲刺将在所有项目中共享名称、状态,以及开始和结束日期。不能在接收和使用这些冲刺的项目中修改这些内容。 + sprint_sharing: 共享冲刺 rb_burndown_charts: show: blankslate_title: 没有可用的燃尽数据 diff --git a/modules/backlogs/config/locales/crowdin/zh-TW.yml b/modules/backlogs/config/locales/crowdin/zh-TW.yml index ae924be818a..0aa97351333 100644 --- a/modules/backlogs/config/locales/crowdin/zh-TW.yml +++ b/modules/backlogs/config/locales/crowdin/zh-TW.yml @@ -139,8 +139,8 @@ zh-TW: other: Show %{count} more items inbox_item_component: label_drag_work_package: Move %{name} - inbox_menu_component: label_actions: Work package actions + inbox_menu_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID @@ -194,8 +194,8 @@ zh-TW: add_work_package: Add work package story_component: label_drag_story: 移動 %{name} - story_menu_component: - label_actions: 故事相關操作 + label_actions: Story actions + story_menu_list_component: action_menu: copy_url_to_clipboard: Copy URL to clipboard copy_work_package_id: Copy work package ID diff --git a/modules/backlogs/config/locales/en.yml b/modules/backlogs/config/locales/en.yml index bc08a813d37..999c419c142 100644 --- a/modules/backlogs/config/locales/en.yml +++ b/modules/backlogs/config/locales/en.yml @@ -162,9 +162,9 @@ en: inbox_item_component: label_drag_work_package: "Move %{name}" + label_actions: "Work package actions" inbox_menu_component: - label_actions: "Work package actions" action_menu: copy_url_to_clipboard: "Copy URL to clipboard" copy_work_package_id: "Copy work package ID" @@ -225,9 +225,9 @@ en: story_component: label_drag_story: "Move %{name}" - - story_menu_component: label_actions: "Story actions" + + story_menu_list_component: action_menu: copy_url_to_clipboard: "Copy URL to clipboard" copy_work_package_id: "Copy work package ID" diff --git a/modules/backlogs/config/routes.rb b/modules/backlogs/config/routes.rb index 7e89f414066..f11657e7291 100644 --- a/modules/backlogs/config/routes.rb +++ b/modules/backlogs/config/routes.rb @@ -48,6 +48,7 @@ Rails.application.routes.draw do resources :stories, controller: :rb_stories, only: [] do member do + get :menu put :move end end @@ -55,6 +56,7 @@ Rails.application.routes.draw do resources :inbox, only: [] do member do + get :menu put :move post :reorder get :move_to_sprint_dialog @@ -99,6 +101,7 @@ Rails.application.routes.draw do resources :stories, controller: :rb_stories, only: [] do member do + get :menu put :move_legacy post :reorder end diff --git a/modules/backlogs/lib/open_project/backlogs/engine.rb b/modules/backlogs/lib/open_project/backlogs/engine.rb index efb7dd705e8..004587ec6c8 100644 --- a/modules/backlogs/lib/open_project/backlogs/engine.rb +++ b/modules/backlogs/lib/open_project/backlogs/engine.rb @@ -71,7 +71,8 @@ module OpenProject::Backlogs { rb_master_backlogs: %i[index backlog details], rb_sprints: %i[index show show_name], rb_wikis: :show, - rb_stories: %i[index show], + rb_stories: %i[index show menu], + inbox: :menu, rb_queries: :show, rb_burndown_charts: :show, rb_taskboards: :show, diff --git a/modules/backlogs/spec/components/backlogs/inbox_component_spec.rb b/modules/backlogs/spec/components/backlogs/inbox_component_spec.rb index 57318834034..6454b8aa8e1 100644 --- a/modules/backlogs/spec/components/backlogs/inbox_component_spec.rb +++ b/modules/backlogs/spec/components/backlogs/inbox_component_spec.rb @@ -41,8 +41,15 @@ RSpec.describe Backlogs::InboxComponent, type: :component do let(:work_packages) { WorkPackage.none } let(:show_all) { false } - def render_component(**) - render_inline(described_class.new(work_packages:, project:, current_user: user, **)) + def render_component(**extra) + render_inline( + described_class.new( + work_packages:, + project:, + current_user: user, + **extra + ) + ) end def create_inbox_work_package(subject: "WP", position: nil) diff --git a/modules/backlogs/spec/components/backlogs/inbox_item_component_spec.rb b/modules/backlogs/spec/components/backlogs/inbox_item_component_spec.rb index 19b0f1a84b1..d6f038344c2 100644 --- a/modules/backlogs/spec/components/backlogs/inbox_item_component_spec.rb +++ b/modules/backlogs/spec/components/backlogs/inbox_item_component_spec.rb @@ -52,7 +52,13 @@ RSpec.describe Backlogs::InboxItemComponent, type: :component do let(:work_packages) { WorkPackage.where(id: work_package.id).order(Arel.sql(Story::ORDER)) } before do - render_inline(Backlogs::InboxComponent.new(work_packages:, project:, current_user: user)) + render_inline( + Backlogs::InboxComponent.new( + work_packages:, + project:, + current_user: user + ) + ) end it "rendering renders the Inbox Component", :aggregate_failures do @@ -62,8 +68,10 @@ RSpec.describe Backlogs::InboxItemComponent, type: :component do expect(page).to have_octicon(:grabber) # renders WorkPackages::InfoLineComponent with type and ID expect(page).to have_text("##{work_package.id}") - # renders an InboxMenuComponent action menu + # deferred action menu (kebab + include-fragment src) expect(page).to have_css("action-menu") + expect(page).to have_css(%(include-fragment[src*="menu"])) + expect(page).to have_element(:button, id: /\Awork_package_#{work_package.id}_menu-button\z/) end describe "row data attributes" do diff --git a/modules/backlogs/spec/components/backlogs/inbox_menu_component_spec.rb b/modules/backlogs/spec/components/backlogs/inbox_menu_component_spec.rb index f9e469729a9..4a50d13c1bf 100644 --- a/modules/backlogs/spec/components/backlogs/inbox_menu_component_spec.rb +++ b/modules/backlogs/spec/components/backlogs/inbox_menu_component_spec.rb @@ -56,16 +56,23 @@ RSpec.describe Backlogs::InboxMenuComponent, type: :component do roles: [create(:project_role, permissions:)]) end - def render_component(position: 2, max_position: 3) + def render_component(position: 2, max_position: 3, open_sprints_exist: true) work_package.update!(position:) - render_inline(described_class.new(work_package:, project:, max_position:, current_user: user)) + render_inline( + described_class.new( + work_package:, + project:, + max_position:, + open_sprints_exist:, + current_user: user + ) + ) end describe "standard items" do - it "renders stable ids for the action menu and primary actions" do + it "renders stable ids for the list and primary actions" do render_component - expect(page).to have_element(:button, id: /\Awork_package_#{work_package.id}_menu-button\z/) expect(page).to have_element(:ul, id: /\Awork_package_#{work_package.id}_menu-list\z/) expect(page).to have_element(:a, id: /\Awork_package_#{work_package.id}_menu_open_details\z/) expect(page).to have_element(:a, id: /\Awork_package_#{work_package.id}_menu_open_fullscreen\z/) @@ -164,14 +171,32 @@ RSpec.describe Backlogs::InboxMenuComponent, type: :component do expect(page).to have_no_text(I18n.t(:label_sort_lowest)) end - it "hides the Move submenu when there is only one item" do - render_component(position: 1, max_position: 1) + it "hides the Move submenu when there is only one item and no open sprints" do + render_component(position: 1, max_position: 1, open_sprints_exist: false) expect(page).to have_no_selector( :menuitem, text: I18n.t("backlogs.inbox_menu_component.action_menu.move_menu") ) end + + context "when open_sprints_exist is true" do + it "shows Move to sprint in the Move submenu" do + render_component(open_sprints_exist: true) + + expect(page).to have_link(I18n.t("backlogs.inbox_menu_component.label_move_to_sprint")) + end + end + + context "when open_sprints_exist is false" do + it "hides Move to sprint but keeps reorder actions in the Move submenu" do + render_component(open_sprints_exist: false) + + expect(page).to have_no_link(I18n.t("backlogs.inbox_menu_component.label_move_to_sprint")) + expect(page).to have_text(I18n.t(:label_sort_higher)) + expect(page).to have_text(I18n.t(:label_sort_lower)) + end + end end context "without :manage_sprint_items permission" do diff --git a/modules/backlogs/spec/components/backlogs/story_component_spec.rb b/modules/backlogs/spec/components/backlogs/story_component_spec.rb index 15ebdefa699..8871a242cc4 100644 --- a/modules/backlogs/spec/components/backlogs/story_component_spec.rb +++ b/modules/backlogs/spec/components/backlogs/story_component_spec.rb @@ -52,7 +52,6 @@ RSpec.describe Backlogs::StoryComponent, type: :component do position: 1, version: sprint) end - let(:max_position) { 3 } let(:permissions) { %i[manage_sprint_items] } before do @@ -66,7 +65,7 @@ RSpec.describe Backlogs::StoryComponent, type: :component do end def render_component - render_inline(described_class.new(story:, sprint:, project:, max_position:, current_user: user)) + render_inline(described_class.new(story:, sprint:, project:, current_user: user)) end it "renders WorkPackages::InfoLineComponent" do @@ -89,10 +88,12 @@ RSpec.describe Backlogs::StoryComponent, type: :component do expect(page).to have_text("5 points", normalize_ws: true) end - it "renders StoryMenuComponent" do + it "renders deferred action menu with include-fragment src" do render_component expect(page).to have_css("action-menu") + expect(page).to have_css(%(include-fragment[src*="menu"])) + expect(page).to have_element(:button, id: /\Astory_#{story.id}_menu-button\z/) end describe "drag handle behaviour" do diff --git a/modules/backlogs/spec/components/backlogs/story_menu_component_spec.rb b/modules/backlogs/spec/components/backlogs/story_menu_list_component_spec.rb similarity index 92% rename from modules/backlogs/spec/components/backlogs/story_menu_component_spec.rb rename to modules/backlogs/spec/components/backlogs/story_menu_list_component_spec.rb index 72430ef9b39..7d0d9e6d826 100644 --- a/modules/backlogs/spec/components/backlogs/story_menu_component_spec.rb +++ b/modules/backlogs/spec/components/backlogs/story_menu_list_component_spec.rb @@ -30,7 +30,7 @@ require "rails_helper" -RSpec.describe Backlogs::StoryMenuComponent, type: :component do +RSpec.describe Backlogs::StoryMenuListComponent, type: :component do shared_let(:type_feature) { create(:type_feature) } shared_let(:type_task) { create(:type_task) } shared_let(:default_status) { create(:default_status) } @@ -66,10 +66,9 @@ RSpec.describe Backlogs::StoryMenuComponent, type: :component do end describe "standard items" do - it "renders stable ids for the action menu and primary actions" do + it "renders stable ids for the list and primary actions" do render_component - expect(page).to have_element(:button, id: /\Astory_#{story.id}_menu-button\z/) expect(page).to have_element(:ul, id: /\Astory_#{story.id}_menu-list\z/) expect(page).to have_element(:a, id: /\Astory_#{story.id}_menu_open_details\z/) expect(page).to have_element(:a, id: /\Astory_#{story.id}_menu_open_fullscreen\z/) @@ -107,7 +106,7 @@ RSpec.describe Backlogs::StoryMenuComponent, type: :component do :"clipboard-copy", id: "story_#{story.id}_menu_copy_url_to_clipboard", value: /\/work_packages\/#{story.id}\z/, - text: I18n.t("backlogs.story_menu_component.action_menu.copy_url_to_clipboard") + text: "Copy URL to clipboard" ) end @@ -119,7 +118,7 @@ RSpec.describe Backlogs::StoryMenuComponent, type: :component do :"clipboard-copy", id: "story_#{story.id}_menu_copy_work_package_id", value: story.id.to_s, - text: I18n.t("backlogs.story_menu_component.action_menu.copy_work_package_id") + text: "Copy work package ID" ) end @@ -132,7 +131,7 @@ RSpec.describe Backlogs::StoryMenuComponent, type: :component do it "shows the Move submenu with incoming-arrow icon" do render_component - expect(page).to have_selector(:menuitem, text: I18n.t("backlogs.story_menu_component.action_menu.move_menu")) + expect(page).to have_selector(:menuitem, text: "Move") expect(page).to have_octicon(:"op-arrow-in") end end @@ -226,7 +225,7 @@ RSpec.describe Backlogs::StoryMenuComponent, type: :component do expect(page).to have_no_selector( :menuitem, - text: I18n.t("backlogs.story_menu_component.action_menu.move_menu") + text: "Move" ) end end diff --git a/modules/backlogs/spec/controllers/inbox_controller_spec.rb b/modules/backlogs/spec/controllers/inbox_controller_spec.rb index 08503a48060..29c7f8cec2e 100644 --- a/modules/backlogs/spec/controllers/inbox_controller_spec.rb +++ b/modules/backlogs/spec/controllers/inbox_controller_spec.rb @@ -142,7 +142,9 @@ RSpec.describe InboxController, with_flag: { scrum_projects_active: true } do target: "backlogs-inbox-component-#{project.id}" expect(response).to have_turbo_stream action: "replace", target: "backlogs-sprint-component-#{agile_sprint.id}" - expect(response).to have_turbo_stream action: "flash", target: "op-primer-flash-component" + + # Flash message is omitted here on purpose (#73600) + expect(response).not_to have_turbo_stream action: "flash", target: "op-primer-flash-component" end end @@ -203,6 +205,38 @@ RSpec.describe InboxController, with_flag: { scrum_projects_active: true } do it_behaves_like "checks permissions for private projects" end + describe "GET #menu" do + subject do + get :menu, params: { project_id: project.id, id: work_package.id }, format: :html + end + + it "returns deferred action menu list HTML", :aggregate_failures do + subject + expect(response).to have_http_status :ok + expect(response.body).to include(I18n.t(:"js.button_open_details")) + end + + context "when the work package belongs to another project" do + let(:other_project) { create(:project) } + let(:work_package) { create(:work_package, project: other_project) } + + it "responds with 404" do + expect(response).to have_http_status :not_found + end + end + + context "with a user lacking project permission" do + let(:user) { create(:user) } + + it "responds with 404" do + subject + expect(response).to have_http_status :not_found + end + end + + it_behaves_like "checks permissions for private projects" + end + describe "GET #move_to_sprint_dialog" do let!(:sprint) { create(:agile_sprint, name: "Sprint 1", project:) } diff --git a/modules/backlogs/spec/controllers/rb_stories_controller_spec.rb b/modules/backlogs/spec/controllers/rb_stories_controller_spec.rb index be2f00c5b75..215608223ed 100644 --- a/modules/backlogs/spec/controllers/rb_stories_controller_spec.rb +++ b/modules/backlogs/spec/controllers/rb_stories_controller_spec.rb @@ -51,6 +51,57 @@ RSpec.describe RbStoriesController do .and_return({ "story_types" => [type_feature.id], "task_type" => type_task.id }) end + describe "load_story" do + subject do + get :menu, + params: { project_id: project.id, sprint_id: requested_sprint.id, id: load_story_id }, + format: :html + end + + context "when scrum_projects flag is inactive", with_flag: { scrum_projects: false } do + let(:load_story_id) { story.id } + let(:requested_sprint) { version_sprint } + + context "when the story is in the requested sprint" do + it "assigns the visible story", :aggregate_failures do + subject + expect(response).to be_successful + expect(response).to have_http_status :ok + expect(assigns(:story)).to eq(story) + end + end + + context "when the story is not in the requested sprint" do + let(:requested_sprint) { create(:sprint, name: "Sprint load_story other", project:) } + + it { is_expected.to have_http_status :not_found } + end + end + + context "when scrum_projects flag is active", with_flag: { scrum_projects: true } do + let(:agile_sprint) { create(:agile_sprint, name: "Agile Sprint load_story", project:) } + let(:work_package_in_sprint) { create(:work_package, status:, sprint: agile_sprint, project:) } + let(:load_story_id) { work_package_in_sprint.id } + + context "when the work package is in the requested sprint" do + let(:requested_sprint) { agile_sprint } + + it "assigns the visible work package", :aggregate_failures do + subject + expect(response).to be_successful + expect(response).to have_http_status :ok + expect(assigns(:story)).to eq(work_package_in_sprint) + end + end + + context "when the work package is not in the requested sprint" do + let(:requested_sprint) { create(:agile_sprint, name: "Other Sprint load_story", project:) } + + it { is_expected.to have_http_status :not_found } + end + end + end + describe "PUT #move_legacy" do context "with a user lacking project permission" do let(:user) { create(:user) } @@ -334,4 +385,25 @@ RSpec.describe RbStoriesController do end end end + + describe "GET #menu" do + subject do + get :menu, params: { project_id: project.id, sprint_id: version_sprint.id, id: story.id }, format: :html + end + + it "returns deferred action menu list HTML", :aggregate_failures do + subject + expect(response).to have_http_status :ok + expect(response.body).to include(I18n.t(:"js.button_open_details")) + end + + context "with a user lacking project permission" do + let(:user) { create(:user) } + + it "responds with 404" do + subject + expect(response).to have_http_status :not_found + end + end + end end diff --git a/modules/backlogs/spec/features/backlogs/create_spec.rb b/modules/backlogs/spec/features/backlogs/create_spec.rb index d4a5b263468..1958971dc0d 100644 --- a/modules/backlogs/spec/features/backlogs/create_spec.rb +++ b/modules/backlogs/spec/features/backlogs/create_spec.rb @@ -87,7 +87,7 @@ RSpec.describe "Create", :js do click_on "Create" end - expect_and_dismiss_flash(message: "Successful creation.") + expect_and_dismiss_flash(exact_message: "Successful creation.") planning_page.expect_sprint_names_in_order(initial_sprint.name, "Created sprint") sprint = project.reload.sprints.last diff --git a/modules/backlogs/spec/features/backlogs/create_story_spec.rb b/modules/backlogs/spec/features/backlogs/create_story_spec.rb index c792dff6adf..896cbd758a6 100644 --- a/modules/backlogs/spec/features/backlogs/create_story_spec.rb +++ b/modules/backlogs/spec/features/backlogs/create_story_spec.rb @@ -118,7 +118,7 @@ RSpec.describe "Backlogs", :js do click_on "Create" end - expect_and_dismiss_flash type: :success, message: "New work package created" + expect_and_dismiss_flash type: :success, exact_message: "Successful creation." # velocity should be summed up immediately # TODO: removed in OP #57688, to be reimplemented diff --git a/modules/backlogs/spec/features/backlogs/edit_spec.rb b/modules/backlogs/spec/features/backlogs/edit_spec.rb index d5b7cc14a59..38963c51ba2 100644 --- a/modules/backlogs/spec/features/backlogs/edit_spec.rb +++ b/modules/backlogs/spec/features/backlogs/edit_spec.rb @@ -100,7 +100,7 @@ RSpec.describe "Edit", :js do wait_for_reload - expect_and_dismiss_flash type: :success, message: "New work package created and added as a child" + expect_and_dismiss_flash type: :success, exact_message: "Successful creation." created_wp = first_sprint.reload.work_packages.last expect(created_wp.subject).to eq("Story created in sprint") planning_page.expect_story_in_sprint(created_wp, first_sprint) diff --git a/modules/backlogs/spec/features/inbox_column_spec.rb b/modules/backlogs/spec/features/inbox_column_spec.rb index 26a9d6d2cd7..6a6762cef16 100644 --- a/modules/backlogs/spec/features/inbox_column_spec.rb +++ b/modules/backlogs/spec/features/inbox_column_spec.rb @@ -276,7 +276,6 @@ RSpec.describe "Inbox column in sprint planning view", :js, with_flag: { scrum_p end planning_page.expect_no_inbox_item(inbox_wp1) - expect_and_dismiss_flash(message: "Successful move from Inbox to Sprint 1.") planning_page.expect_story_in_sprint(inbox_wp1, sprint) planning_page.expect_work_packages_in_sprint_in_order(sprint, work_packages: [sprint_wp, inbox_wp1]) end @@ -286,15 +285,12 @@ RSpec.describe "Inbox column in sprint planning view", :js, with_flag: { scrum_p it "moves multiple items into the sprint one by one" do planning_page.drag_inbox_item_to_sprint(inbox_wp1, sprint) planning_page.expect_no_inbox_item(inbox_wp1) - expect_and_dismiss_flash(message: "Successful move from Inbox to Sprint 1.") planning_page.drag_inbox_item_to_sprint(inbox_wp2, sprint) planning_page.expect_no_inbox_item(inbox_wp2) - expect_and_dismiss_flash(message: "Successful move from Inbox to Sprint 1.") planning_page.drag_inbox_item_to_sprint(inbox_wp3, sprint) planning_page.expect_no_inbox_item(inbox_wp3) - expect_and_dismiss_flash(message: "Successful move from Inbox to Sprint 1.") planning_page.expect_inbox_blankslate planning_page.expect_story_in_sprint(inbox_wp1, sprint) @@ -319,7 +315,6 @@ RSpec.describe "Inbox column in sprint planning view", :js, with_flag: { scrum_p it "moves a backlog item to the sprint without an error (Regression#73416)" do planning_page.drag_inbox_item_to_sprint(inbox_wp1, sprint) planning_page.expect_no_inbox_item(inbox_wp1) - expect_and_dismiss_flash(message: "Successful move from Inbox to Sprint 1.") end end end diff --git a/modules/backlogs/spec/features/work_packages/create_work_package_spec.rb b/modules/backlogs/spec/features/work_packages/create_work_package_spec.rb index c79e4ff322b..e8641776ca0 100644 --- a/modules/backlogs/spec/features/work_packages/create_work_package_spec.rb +++ b/modules/backlogs/spec/features/work_packages/create_work_package_spec.rb @@ -100,7 +100,7 @@ RSpec.describe "Create work package in sprint", :js, with_flag: { scrum_projects click_on "Create" end - expect_and_dismiss_flash type: :success, message: "New work package created" + expect_and_dismiss_flash type: :success, exact_message: "Successful creation." created_work_package = WorkPackage.last @@ -144,7 +144,7 @@ RSpec.describe "Create work package in sprint", :js, with_flag: { scrum_projects click_on "Create" end - expect_and_dismiss_flash type: :success, message: "New work package created" + expect_and_dismiss_flash type: :success, exact_message: "Successful creation." created_work_package = WorkPackage.last @@ -166,7 +166,7 @@ RSpec.describe "Create work package in sprint", :js, with_flag: { scrum_projects click_on "Create" end - expect_and_dismiss_flash type: :success, message: "New work package created" + expect_and_dismiss_flash type: :success, exact_message: "Successful creation." created_work_package = WorkPackage.last diff --git a/modules/backlogs/spec/helpers/rb_common_helper_spec.rb b/modules/backlogs/spec/helpers/rb_common_helper_spec.rb index 7e9b2ffe23b..6db734c227c 100644 --- a/modules/backlogs/spec/helpers/rb_common_helper_spec.rb +++ b/modules/backlogs/spec/helpers/rb_common_helper_spec.rb @@ -72,4 +72,42 @@ RSpec.describe RbCommonHelper do end end end + + describe "#show_all_backlog" do + before do + allow(helper).to receive(:params).and_return(params) + end + + context "when the all param is absent" do + let(:params) { {} } + + it "is false" do + expect(helper.show_all_backlog).to be false + end + end + + context "when the all param is a Rails boolean truthy string" do + let(:params) { { all: "1" } } + + it "is true" do + expect(helper.show_all_backlog).to be true + end + end + + context "when the all param is the string false" do + let(:params) { { all: "false" } } + + it "is false" do + expect(helper.show_all_backlog).to be false + end + end + + context "when the all param is the string zero" do + let(:params) { { all: "0" } } + + it "is false" do + expect(helper.show_all_backlog).to be false + end + end + end end diff --git a/modules/backlogs/spec/lib/open_project/backlogs/permissions_spec.rb b/modules/backlogs/spec/lib/open_project/backlogs/permissions_spec.rb index 4e4a5724a2d..7aaa9c0605f 100644 --- a/modules/backlogs/spec/lib/open_project/backlogs/permissions_spec.rb +++ b/modules/backlogs/spec/lib/open_project/backlogs/permissions_spec.rb @@ -37,6 +37,10 @@ RSpec.describe OpenProject::AccessControl, "Backlogs module permissions" do # ru it "depends on view_work_packages and show_board_views" do expect(subject.dependencies).to contain_exactly(:view_work_packages, :show_board_views) end + + it "includes deferred backlog story and inbox menu fragments" do + expect(subject.controller_actions).to include("rb_stories/menu", "inbox/menu") + end end describe "create_sprints" do diff --git a/modules/backlogs/spec/requests/rb_master_backlogs_spec.rb b/modules/backlogs/spec/requests/rb_master_backlogs_spec.rb index f63b2fd387c..9562eb91885 100644 --- a/modules/backlogs/spec/requests/rb_master_backlogs_spec.rb +++ b/modules/backlogs/spec/requests/rb_master_backlogs_spec.rb @@ -96,12 +96,19 @@ RSpec.describe "RbMasterBacklogs", :skip_csrf, type: :rails_request do expect(response).to have_http_status(:ok) expect(response).to render_template(:backlog) - expect(response).to have_turbo_frame "backlogs_container", - src: "/projects/#{project.identifier}/backlogs/backlog" + src: "/projects/#{project.identifier}/backlogs/backlog?all=false" expect(response).to have_turbo_frame "content-bodyRight" end + it "passes all=true on the backlog turbo frame when requested" do + get "/projects/#{project.identifier}/backlogs/backlog", params: { all: "1" } + + expect(response).to have_http_status(:ok) + expect(response).to have_turbo_frame "backlogs_container", + src: "/projects/#{project.identifier}/backlogs/backlog?all=true" + end + context "with a Turbo Frame request" do it "renders the sprint planning list partial" do get "/projects/#{project.identifier}/backlogs/backlog", headers: { "Turbo-Frame" => "backlogs_container" } diff --git a/modules/backlogs/spec/routing/inbox_routing_spec.rb b/modules/backlogs/spec/routing/inbox_routing_spec.rb index 21a81f2ddb3..cfa1e7288da 100644 --- a/modules/backlogs/spec/routing/inbox_routing_spec.rb +++ b/modules/backlogs/spec/routing/inbox_routing_spec.rb @@ -49,5 +49,14 @@ RSpec.describe InboxController, with_flag: { scrum_projects_active: true } do id: "85" ) } + + it { + expect(get("/projects/project_42/inbox/85/menu")).to route_to( + controller: "inbox", + action: "menu", + project_id: "project_42", + id: "85" + ) + } end end diff --git a/modules/backlogs/spec/routing/rb_stories_routing_spec.rb b/modules/backlogs/spec/routing/rb_stories_routing_spec.rb index 910795cf440..4bf6b239918 100644 --- a/modules/backlogs/spec/routing/rb_stories_routing_spec.rb +++ b/modules/backlogs/spec/routing/rb_stories_routing_spec.rb @@ -67,5 +67,15 @@ RSpec.describe RbStoriesController do id: "85" ) } + + it { + expect(get("/projects/project_42/sprints/21/stories/85/menu")).to route_to( + controller: "rb_stories", + action: "menu", + project_id: "project_42", + sprint_id: "21", + id: "85" + ) + } end end diff --git a/modules/bim/config/locales/crowdin/ar.seeders.yml b/modules/bim/config/locales/crowdin/ar.seeders.yml index 2ae45077aae..3a6c51bdfce 100644 --- a/modules/bim/config/locales/crowdin/ar.seeders.yml +++ b/modules/bim/config/locales/crowdin/ar.seeders.yml @@ -13,7 +13,7 @@ ar: item_2: name: مرتفعة item_3: - name: Critical + name: حَرِج statuses: item_0: name: جديد @@ -42,7 +42,7 @@ ar: item_4: name: Remark item_5: - name: Request + name: طلب item_6: name: Clash global_queries: @@ -69,7 +69,7 @@ ar: item_6: name: Planners item_7: - name: Structural Engineers + name: المهندسون الهيكليون welcome: title: Welcome to OpenProject BIM edition! text: | @@ -92,10 +92,10 @@ ar: description: This is a short summary of the goals of this demo construction project. news: item_0: - title: Welcome to your demo project + title: مرحباً بك في مشروعك التجريبي summary: | - We are glad you joined. - In this module you can communicate project news to your team members. + يسعدنا انضمامك إلينا. + في هذه الوحدة يمكنك توصيل أخبار المشروع إلى أعضاء فريقك. description: The actual news categories: item_0: Category 1 (to be changed in Project settings) @@ -105,17 +105,17 @@ ar: item_1: name: الأحداث الرئيسية item_2: - name: Tasks + name: المهام item_3: name: مخطط الفريق boards: bcf: - name: Simple drag'n drop workflow + name: عملية السحب والإفلات بسيطة project-overview: widgets: item_0: options: - name: Welcome + name: أهلا item_1: options: name: الشروع في البدء @@ -154,7 +154,7 @@ ar: description: This is a short summary of the goals of this demo planning and constructing project. news: item_0: - title: Welcome to your demo project + title: مرحباً بك في مشروعك التجريبي summary: | We are glad you joined. In this module you can communicate project news to your team members. @@ -167,14 +167,14 @@ ar: item_1: name: الأحداث الرئيسية item_2: - name: Tasks + name: المهامّ item_3: name: مخطط الفريق project-overview: widgets: item_0: options: - name: Welcome + name: أهلا item_1: options: name: الشروع في البدء @@ -321,7 +321,7 @@ ar: * Get the team together * ... item_1: - subject: Foundation + subject: الأساس description: |- ## Goal @@ -408,27 +408,27 @@ ar: description: This is a short summary of the goals of this demo BIM project. news: item_0: - title: Welcome to your demo project + title: مرحباً بك في مشروعك التجريبي summary: | - We are glad you joined. - In this module you can communicate project news to your team members. + يسعدنا انضمامك إلينا. + في هذه الوحدة يمكنك توصيل أخبار المشروع إلى أعضاء فريقك. description: The actual news categories: item_0: Category 1 (to be changed in Project settings) queries: item_0: - name: Project plan + name: خُطَّة المشروع item_1: name: الأحداث الرئيسية item_2: - name: Tasks + name: المهام item_3: name: مخطط الفريق project-overview: widgets: item_0: options: - name: Welcome + name: أهلا item_1: options: name: الشروع في البدء @@ -665,7 +665,7 @@ ar: * The model can be used for the operating system of the building * ... item_14: - subject: Asset Management + subject: إدارة الأصول description: Enjoy your building :) demo-bcf-management-project: name: "(Demo) BCF management" @@ -686,7 +686,7 @@ ar: item_1: name: Clashes item_2: - name: Requests + name: الطلبات item_3: name: Remarks item_4: @@ -694,7 +694,7 @@ ar: item_5: name: الأحداث الرئيسية item_6: - name: Tasks + name: المهام item_7: name: مخطط الفريق boards: @@ -704,7 +704,7 @@ ar: widgets: item_0: options: - name: Welcome + name: أهلا item_1: options: name: الشروع في البدء diff --git a/modules/bim/lib/api/bim/utilities/path_helper.rb b/modules/bim/lib/api/bim/utilities/path_helper.rb index 4bf70f85552..0344899dd24 100644 --- a/modules/bim/lib/api/bim/utilities/path_helper.rb +++ b/modules/bim/lib/api/bim/utilities/path_helper.rb @@ -51,20 +51,27 @@ module API end def project(identifier) - "#{root}projects/#{identifier}" + path_segments("projects", identifier) end def topics(project_identifier) - "#{project(project_identifier)}/topics" + path_segments("projects", project_identifier, "topics") end def topic(project_identifier, uuid) - "#{topics(project_identifier)}/#{uuid}" + path_segments("projects", project_identifier, "topics", uuid) end def viewpoint(project_identifier, topic_uuid, viewpoint_topic) - "#{topic(project_identifier, topic_uuid)}/viewpoints/#{viewpoint_topic}" + path_segments("projects", project_identifier, "topics", topic_uuid, "viewpoints", viewpoint_topic) end + + def path_segments(*segments) + subpath = segments.map { |segment| ::ERB::Util.url_encode(segment.to_s) }.join("/") + "#{root}#{subpath}" + end + + private_class_method :path_segments end def bcf_v2_1_paths diff --git a/modules/bim/spec/lib/api/bim/utilities/path_helper_spec.rb b/modules/bim/spec/lib/api/bim/utilities/path_helper_spec.rb new file mode 100644 index 00000000000..75fb6885f16 --- /dev/null +++ b/modules/bim/spec/lib/api/bim/utilities/path_helper_spec.rb @@ -0,0 +1,52 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ +require "spec_helper" + +RSpec.describe API::Bim::Utilities::PathHelper::BCF2_1Path do # rubocop:disable RSpec/SpecFilePathFormat + before do + allow(described_class) + .to receive(:root_path) + .and_return("/openproject/") + end + + describe ".project" do + it "escapes slash characters in project identifiers" do + expect(described_class.project("project/with/path")) + .to eq("/openproject/api/bcf/2.1/projects/project%2Fwith%2Fpath") + end + end + + describe ".topic" do + it "escapes topic UUIDs so they stay a single path segment" do + expect(described_class.topic("my/project", "topic/with/path")) + .to eq("/openproject/api/bcf/2.1/projects/my%2Fproject/topics/topic%2Fwith%2Fpath") + end + end +end diff --git a/modules/documents/config/locales/crowdin/es.yml b/modules/documents/config/locales/crowdin/es.yml index 19934b903ef..10606cc5f4b 100644 --- a/modules/documents/config/locales/crowdin/es.yml +++ b/modules/documents/config/locales/crowdin/es.yml @@ -70,8 +70,8 @@ es: show_edit_view: connection_error_notice: description_server_unavailable: |- - Unable to open document because the real-time text collaboration server is unreachable. - Please contact the administrator if the problem persists. + No se puede abrir el documento porque no se puede acceder al servidor de colaboración de texto en tiempo real. + Ponte en contacto con el administrador si el problema persiste. action: Intentar otra vez tabs: Pestañas del documento index_page: @@ -85,8 +85,8 @@ es: collaboration_settings: Colaboración en tiempo real last_updated_at: Última vez guardado a las %{time}. info_line: - currently_offline: You are currently offline. - connection_restored: You are now back online. + currently_offline: Estás desconectado. + connection_restored: Ya estás de nuevo en línea. active_editors: Activar editores active_editors_count: one: 1 editor activo diff --git a/modules/documents/config/locales/crowdin/it.yml b/modules/documents/config/locales/crowdin/it.yml index 6553223dd38..697a2f72f48 100644 --- a/modules/documents/config/locales/crowdin/it.yml +++ b/modules/documents/config/locales/crowdin/it.yml @@ -72,8 +72,8 @@ it: show_edit_view: connection_error_notice: description_server_unavailable: |- - Unable to open document because the real-time text collaboration server is unreachable. - Please contact the administrator if the problem persists. + Impossibile aprire il documento perché il server della collaborazione in tempo reale sul testo non è raggiungibile. + Se il problema persiste, contatta l'amministratore. action: Riprova tabs: Schede dei documenti index_page: @@ -87,8 +87,8 @@ it: collaboration_settings: Collaborazione in tempo reale last_updated_at: Ultimo salvataggio %{time}. info_line: - currently_offline: You are currently offline. - connection_restored: You are now back online. + currently_offline: Sei attualmente offline. + connection_restored: Ora sei di nuovo online. active_editors: Editor attivi active_editors_count: one: 1 editor attivo diff --git a/modules/documents/config/locales/crowdin/uk.yml b/modules/documents/config/locales/crowdin/uk.yml index e6111af7882..9ab125121f3 100644 --- a/modules/documents/config/locales/crowdin/uk.yml +++ b/modules/documents/config/locales/crowdin/uk.yml @@ -87,8 +87,8 @@ uk: collaboration_settings: Спільне редагування в реальному часі last_updated_at: Востаннє збережено о %{time}. info_line: - currently_offline: You are currently offline. - connection_restored: You are now back online. + currently_offline: Ви зараз не в мережі. + connection_restored: Ви знову в мережі. active_editors: Активні редактори active_editors_count: one: 1 активний редактор diff --git a/modules/documents/config/locales/crowdin/zh-CN.yml b/modules/documents/config/locales/crowdin/zh-CN.yml index 3054b7377fd..b2cc5b345c9 100644 --- a/modules/documents/config/locales/crowdin/zh-CN.yml +++ b/modules/documents/config/locales/crowdin/zh-CN.yml @@ -72,8 +72,8 @@ zh-CN: show_edit_view: connection_error_notice: description_server_unavailable: |- - Unable to open document because the real-time text collaboration server is unreachable. - Please contact the administrator if the problem persists. + 无法打开文档,因为无法访问实时文本协作服务器。 + 如果问题一直存在,请联系管理员。 action: 重试 tabs: "“文档”选项卡" index_page: @@ -87,8 +87,8 @@ zh-CN: collaboration_settings: 实时协作 last_updated_at: 最后保存时间:%{time}。 info_line: - currently_offline: You are currently offline. - connection_restored: You are now back online. + currently_offline: 您目前处于离线状态。 + connection_restored: 您已恢复在线状态。 active_editors: 有效编辑器 active_editors_count: other: "%{count} 位活跃编辑者" diff --git a/modules/github_integration/config/locales/crowdin/es.yml b/modules/github_integration/config/locales/crowdin/es.yml index 92e5b4fec31..407b9303dd5 100644 --- a/modules/github_integration/config/locales/crowdin/es.yml +++ b/modules/github_integration/config/locales/crowdin/es.yml @@ -43,8 +43,8 @@ es: label_github_integration: Integración con GitHub notice_deploy_target_created: Objetivo de despliegue creado notice_deploy_target_destroyed: Objetivo de despliegue eliminado - label_github_comment_user: GitHub actor - label_github_webhook_secret: Webhook secret + label_github_comment_user: Usuario de GitHub + label_github_webhook_secret: Secreto de webhook text_github_comment_user_info: 'The OpenProject user whose API key must be used to authenticate incoming webhook requests. When set, requests authenticated with any other user''s credentials are rejected. This user also posts automated deploy-status comments on work packages. Defaults to the system user when not set. ' diff --git a/modules/github_integration/config/locales/crowdin/fr.yml b/modules/github_integration/config/locales/crowdin/fr.yml index e23a5bd60bc..9f773d1106e 100644 --- a/modules/github_integration/config/locales/crowdin/fr.yml +++ b/modules/github_integration/config/locales/crowdin/fr.yml @@ -43,15 +43,15 @@ fr: label_github_integration: Intégration GitHub notice_deploy_target_created: Objectif de déploiement créé notice_deploy_target_destroyed: Objectif de déploiement supprimé - label_github_comment_user: GitHub actor - label_github_webhook_secret: Webhook secret - text_github_comment_user_info: 'The OpenProject user whose API key must be used to authenticate incoming webhook requests. When set, requests authenticated with any other user''s credentials are rejected. This user also posts automated deploy-status comments on work packages. Defaults to the system user when not set. + label_github_comment_user: Acteur GitHub + label_github_webhook_secret: Secret du webhook + text_github_comment_user_info: 'L''utilisateur d''OpenProject dont la clé d''API doit être utilisée pour authentifier les demandes de webhook entrantes. Lorsqu''il est défini, les demandes authentifiées avec les informations d''identification de tout autre utilisateur sont rejetées. Cet utilisateur publie également des commentaires automatisés sur l''état de déploiement des lors de travaux. Par défaut, il s''agit de l''utilisateur du système s''il n''est pas défini. ' - text_github_webhook_secret_missing_warning: 'No webhook secret is configured. Any request to the GitHub webhook endpoint will be accepted without verification, which may allow unauthorized actors to forge events. It is strongly recommended to set a secret. + text_github_webhook_secret_missing_warning: 'Aucun secret de webhook n''est configuré. Toute demande adressée au point de terminaison du webhook de GitHub sera acceptée sans vérification, ce qui peut permettre à des personnes non autorisées de falsifier des événements. Il est fortement recommandé de définir un secret. ' - text_github_webhook_secret_info: 'A secret token shared with GitHub when configuring the webhook. When set, OpenProject verifies the X-Hub-Signature-256 header on every incoming request, rejecting payloads that do not match. Leave blank to skip verification (not recommended). + text_github_webhook_secret_info: 'Un jeton secret partagé avec GitHub lors de la configuration du webhook. Lorsqu''il est défini, OpenProject vérifie l''en-tête X-Hub-Signature-256 sur chaque requête entrante et rejette les charges utiles qui ne correspondent pas. Laissez l''espace vide pour ignorer la vérification (non recommandé). ' plugin_openproject_github_integration: diff --git a/modules/github_integration/config/locales/crowdin/it.yml b/modules/github_integration/config/locales/crowdin/it.yml index 3c624b3762a..68584ba3e1f 100644 --- a/modules/github_integration/config/locales/crowdin/it.yml +++ b/modules/github_integration/config/locales/crowdin/it.yml @@ -43,15 +43,15 @@ it: label_github_integration: Integrazione GitHub notice_deploy_target_created: Destinazione di installazione creata notice_deploy_target_destroyed: Destinazione di installazione rilevata - label_github_comment_user: GitHub actor + label_github_comment_user: Attore GitHub label_github_webhook_secret: Webhook secret - text_github_comment_user_info: 'The OpenProject user whose API key must be used to authenticate incoming webhook requests. When set, requests authenticated with any other user''s credentials are rejected. This user also posts automated deploy-status comments on work packages. Defaults to the system user when not set. + text_github_comment_user_info: 'L''utente OpenProject la cui chiave API deve essere utilizzata per autenticare le richieste webhook in ingresso. Se impostato, le richieste autenticate con le credenziali di qualsiasi altro utente verranno rifiutate. Questo utente pubblica anche commenti automatici sullo stato di distribuzione nelle macro-attività. Se non impostato, viene utilizzato l''utente di sistema. ' - text_github_webhook_secret_missing_warning: 'No webhook secret is configured. Any request to the GitHub webhook endpoint will be accepted without verification, which may allow unauthorized actors to forge events. It is strongly recommended to set a secret. + text_github_webhook_secret_missing_warning: 'Nessun webhook secret è configurato. Qualsiasi richiesta all''endpoint webhook di GitHub verrà accettata senza verifica, il che potrebbe consentire ad attori non autorizzati di falsificare eventi. Si consiglia vivamente di impostare un secret. ' - text_github_webhook_secret_info: 'A secret token shared with GitHub when configuring the webhook. When set, OpenProject verifies the X-Hub-Signature-256 header on every incoming request, rejecting payloads that do not match. Leave blank to skip verification (not recommended). + text_github_webhook_secret_info: 'Un token segreto condiviso con GitHub durante la configurazione del webhook. Se impostato, OpenProject verifica l''header X-Hub-Signature-256 su ogni richiesta in ingresso, rifiutando i payload che non corrispondono. Lascia vuoto per saltare la verifica (non consigliato). ' plugin_openproject_github_integration: diff --git a/modules/github_integration/config/locales/crowdin/ko.yml b/modules/github_integration/config/locales/crowdin/ko.yml index e29176e1f1e..2b567570f8f 100644 --- a/modules/github_integration/config/locales/crowdin/ko.yml +++ b/modules/github_integration/config/locales/crowdin/ko.yml @@ -43,15 +43,15 @@ ko: label_github_integration: GitHub 통합 notice_deploy_target_created: 배포 대상 생성됨 notice_deploy_target_destroyed: 배포 대상 삭제됨 - label_github_comment_user: GitHub actor - label_github_webhook_secret: Webhook secret - text_github_comment_user_info: 'The OpenProject user whose API key must be used to authenticate incoming webhook requests. When set, requests authenticated with any other user''s credentials are rejected. This user also posts automated deploy-status comments on work packages. Defaults to the system user when not set. + label_github_comment_user: GitHub 수행자 + label_github_webhook_secret: Webhook 비밀번호 + text_github_comment_user_info: '들어오는 webhook 요청을 인증하는 데 API 키를 사용해야 하는 OpenProject 사용자입니다. 설정하면, 다른 사용자의 자격 증명으로 인증된 요청은 거부됩니다. 이 사용자는 작업 패키지에 자동화된 배포 상태 코멘트를 게시하기도 합니다. 설정하지 않으면, 시스템 사용자로 기본 설정됩니다. ' - text_github_webhook_secret_missing_warning: 'No webhook secret is configured. Any request to the GitHub webhook endpoint will be accepted without verification, which may allow unauthorized actors to forge events. It is strongly recommended to set a secret. + text_github_webhook_secret_missing_warning: 'Webhook 비밀번호가 구성되지 않았습니다. GitHub webhook 엔드포인트에 대한 모든 요청이 확인 없이 수락되므로 권한이 없는 수행자가 이벤트를 위조할 수 있습니다. 비밀번호를 설정하는 것이 좋습니다. ' - text_github_webhook_secret_info: 'A secret token shared with GitHub when configuring the webhook. When set, OpenProject verifies the X-Hub-Signature-256 header on every incoming request, rejecting payloads that do not match. Leave blank to skip verification (not recommended). + text_github_webhook_secret_info: 'Webhook을 구성할 때 GitHub와 공유되는 비밀 토큰입니다. 설정하면, OpenProject는 들어오는 모든 요청에서 X-Hub-Signature-256 헤더를 확인하여 일치하지 않는 페이로드를 거부합니다. 확인을 건너뛰려면 비워 두세요(권장하지 않음). ' plugin_openproject_github_integration: diff --git a/modules/github_integration/config/locales/crowdin/uk.yml b/modules/github_integration/config/locales/crowdin/uk.yml index 1d656a088e5..0568ce3d7ce 100644 --- a/modules/github_integration/config/locales/crowdin/uk.yml +++ b/modules/github_integration/config/locales/crowdin/uk.yml @@ -43,15 +43,15 @@ uk: label_github_integration: Інтеграція GitHub notice_deploy_target_created: Створено ціль розгортання notice_deploy_target_destroyed: Ціль розгортання видалено - label_github_comment_user: GitHub actor - label_github_webhook_secret: Webhook secret - text_github_comment_user_info: 'The OpenProject user whose API key must be used to authenticate incoming webhook requests. When set, requests authenticated with any other user''s credentials are rejected. This user also posts automated deploy-status comments on work packages. Defaults to the system user when not set. + label_github_comment_user: Суб’єкт GitHub + label_github_webhook_secret: Секрет вебхука + text_github_comment_user_info: 'Це користувач OpenProject, чий API-ключ має використовуватися для автентифікації вхідних запитів вебхука. Якщо налаштовано, запити, автентифіковані за допомогою облікових даних будь-якого іншого користувача, буде відхилено. Цей користувач також автоматично додає коментарі щодо статусу розгортання до пакетів робіт. За замовчуванням це системний користувач, якщо не вказати іншого. ' - text_github_webhook_secret_missing_warning: 'No webhook secret is configured. Any request to the GitHub webhook endpoint will be accepted without verification, which may allow unauthorized actors to forge events. It is strongly recommended to set a secret. + text_github_webhook_secret_missing_warning: 'Секрет вебхука не налаштовано. Усі запити до кінцевої точки вебхука GitHub прийматимуться без перевірки, через що у неавторизованих суб’єктів може бути змога підробляти події. Наполегливо рекомендуємо налаштувати секрет. ' - text_github_webhook_secret_info: 'A secret token shared with GitHub when configuring the webhook. When set, OpenProject verifies the X-Hub-Signature-256 header on every incoming request, rejecting payloads that do not match. Leave blank to skip verification (not recommended). + text_github_webhook_secret_info: 'Це секретний маркер, який передається GitHub при налаштуванні вебхука. Якщо налаштовано, OpenProject перевіряє заголовок X-Hub-Signature-256 для кожного вхідного запиту й відхиляє корисне навантаження, яке не відповідає вимогам. Залиште поле порожнім, щоб пропускати перевірку (не рекомендуємо). ' plugin_openproject_github_integration: diff --git a/modules/github_integration/config/locales/crowdin/zh-CN.yml b/modules/github_integration/config/locales/crowdin/zh-CN.yml index fc749cd0511..9868acfa388 100644 --- a/modules/github_integration/config/locales/crowdin/zh-CN.yml +++ b/modules/github_integration/config/locales/crowdin/zh-CN.yml @@ -43,15 +43,15 @@ zh-CN: label_github_integration: GitHub 集成 notice_deploy_target_created: 部署目标已创建 notice_deploy_target_destroyed: 部署目标已删除 - label_github_comment_user: GitHub actor - label_github_webhook_secret: Webhook secret - text_github_comment_user_info: 'The OpenProject user whose API key must be used to authenticate incoming webhook requests. When set, requests authenticated with any other user''s credentials are rejected. This user also posts automated deploy-status comments on work packages. Defaults to the system user when not set. + label_github_comment_user: GitHub 执行者 + label_github_webhook_secret: Webhook 密钥 + text_github_comment_user_info: '必须使用其 API 密钥对传入的 Webhook 请求进行身份验证的 OpenProject 用户。如果设置了此用户,则会拒绝使用其他任何用户凭据进行身份验证的请求。该用户还会对工作包发布自动部署状态评论。如果未设置此用户,则默认使用系统用户。 ' - text_github_webhook_secret_missing_warning: 'No webhook secret is configured. Any request to the GitHub webhook endpoint will be accepted without verification, which may allow unauthorized actors to forge events. It is strongly recommended to set a secret. + text_github_webhook_secret_missing_warning: '未配置 webhook 密钥。任何向 GitHub webhook 端点发出的请求都会被接受,无需验证,这可能导致未经授权的执行者伪造事件。强烈建议设置密钥 。 ' - text_github_webhook_secret_info: 'A secret token shared with GitHub when configuring the webhook. When set, OpenProject verifies the X-Hub-Signature-256 header on every incoming request, rejecting payloads that do not match. Leave blank to skip verification (not recommended). + text_github_webhook_secret_info: '配置 webhook 时与 GitHub 共享的密钥令牌。设置后,OpenProject 会验证每个传入请求的 X-Hub-Signature-256 标头,拒绝不匹配的有效载荷。留空表示跳过验证(不推荐)。 ' plugin_openproject_github_integration: diff --git a/modules/gitlab_integration/config/locales/crowdin/es.yml b/modules/gitlab_integration/config/locales/crowdin/es.yml index d15ef37e583..6c635e8e631 100644 --- a/modules/gitlab_integration/config/locales/crowdin/es.yml +++ b/modules/gitlab_integration/config/locales/crowdin/es.yml @@ -49,9 +49,9 @@ es: attributes: labels: invalid_schema: 'debe ser una matriz de hashes con las claves: color, título' - label_gitlab_integration: GitLab Integration - label_gitlab_actor: GitLab actor - label_gitlab_webhook_secret: Webhook secret + label_gitlab_integration: Integración con GitLab + label_gitlab_actor: Usuario de GitLab + label_gitlab_webhook_secret: Secreto de webhook text_gitlab_actor_info: 'The OpenProject user whose API key must be used to authenticate incoming webhook requests. When set, requests authenticated with any other user''s credentials are rejected. This user also posts automated comments on work packages. Defaults to the system user when not set. ' diff --git a/modules/gitlab_integration/config/locales/crowdin/fr.yml b/modules/gitlab_integration/config/locales/crowdin/fr.yml index ffca9ec7d74..e685028eb6c 100644 --- a/modules/gitlab_integration/config/locales/crowdin/fr.yml +++ b/modules/gitlab_integration/config/locales/crowdin/fr.yml @@ -49,16 +49,16 @@ fr: attributes: labels: invalid_schema: 'doit être un tableau de hachages avec les clés : color, title' - label_gitlab_integration: GitLab Integration - label_gitlab_actor: GitLab actor - label_gitlab_webhook_secret: Webhook secret - text_gitlab_actor_info: 'The OpenProject user whose API key must be used to authenticate incoming webhook requests. When set, requests authenticated with any other user''s credentials are rejected. This user also posts automated comments on work packages. Defaults to the system user when not set. + label_gitlab_integration: Intégration de GitLab + label_gitlab_actor: Acteur GitLab + label_gitlab_webhook_secret: Secret du webhook + text_gitlab_actor_info: 'L''utilisateur d''OpenProject dont la clé d''API doit être utilisée pour authentifier les demandes de webhook entrantes. Lorsqu''il est défini, les demandes authentifiées avec les informations d''identification de tout autre utilisateur sont rejetées. Cet utilisateur publie également des commentaires automatisés sur les lots de travaux. Par défaut, il s''agit de l''utilisateur du système s''il n''est pas défini. ' - text_gitlab_webhook_secret_info: 'A secret token shared with GitLab when configuring the webhook. When set, OpenProject verifies the X-Gitlab-Token header on every incoming request, rejecting payloads that do not match. Leave blank to skip verification (not recommended). + text_gitlab_webhook_secret_info: 'Un jeton secret partagé avec GitLab lors de la configuration du webhook. Lorsqu''il est défini, OpenProject vérifie l''en-tête X-Gitlab-Token sur chaque requête entrante et rejette les charges utiles qui ne correspondent pas. Laissez l''espace vide pour ignorer la vérification (non recommandé). ' - text_gitlab_webhook_secret_missing_warning: 'No webhook secret is configured. Any request to the GitLab webhook endpoint will be accepted without verification, which may allow unauthorized actors to forge events. It is strongly recommended to set a secret. + text_gitlab_webhook_secret_missing_warning: 'Aucun secret de webhook n''est configuré. Toute demande adressée au point de terminaison du webhook de GitLab sera acceptée sans vérification, ce qui peut permettre à des personnes non autorisées de falsifier des événements. Il est fortement recommandé de définir un secret. ' project_module_gitlab: GitLab diff --git a/modules/gitlab_integration/config/locales/crowdin/it.yml b/modules/gitlab_integration/config/locales/crowdin/it.yml index b1cf3c3d331..250da997037 100644 --- a/modules/gitlab_integration/config/locales/crowdin/it.yml +++ b/modules/gitlab_integration/config/locales/crowdin/it.yml @@ -49,16 +49,16 @@ it: attributes: labels: invalid_schema: 'deve essere un array di hash con le chiavi: colore, titolo' - label_gitlab_integration: GitLab Integration - label_gitlab_actor: GitLab actor + label_gitlab_integration: Integrazione GitLab + label_gitlab_actor: Attore GitLab label_gitlab_webhook_secret: Webhook secret - text_gitlab_actor_info: 'The OpenProject user whose API key must be used to authenticate incoming webhook requests. When set, requests authenticated with any other user''s credentials are rejected. This user also posts automated comments on work packages. Defaults to the system user when not set. + text_gitlab_actor_info: 'L''utente OpenProject la cui chiave API deve essere utilizzata per autenticare le richieste webhook in ingresso. Se impostato, le richieste autenticate con le credenziali di qualsiasi altro utente verranno rifiutate. Questo utente pubblica anche commenti automatici sulle macro-attività. Se non impostato, viene utilizzato l''utente di sistema. ' - text_gitlab_webhook_secret_info: 'A secret token shared with GitLab when configuring the webhook. When set, OpenProject verifies the X-Gitlab-Token header on every incoming request, rejecting payloads that do not match. Leave blank to skip verification (not recommended). + text_gitlab_webhook_secret_info: 'Un token segreto condiviso con GitLab durante la configurazione del webhook. Se impostato, OpenProject verifica l''header X-Gitlab-Token su ogni richiesta in ingresso, rifiutando i payload che non corrispondono. Lascia vuoto per saltare la verifica (non consigliato). ' - text_gitlab_webhook_secret_missing_warning: 'No webhook secret is configured. Any request to the GitLab webhook endpoint will be accepted without verification, which may allow unauthorized actors to forge events. It is strongly recommended to set a secret. + text_gitlab_webhook_secret_missing_warning: 'Nessun webhook secret è configurato. Qualsiasi richiesta all''endpoint webhook di GitLab verrà accettata senza verifica, il che potrebbe consentire ad attori non autorizzati di falsificare eventi. Si consiglia vivamente di impostare un secret. ' project_module_gitlab: GitLab diff --git a/modules/gitlab_integration/config/locales/crowdin/ko.yml b/modules/gitlab_integration/config/locales/crowdin/ko.yml index 868c914be89..178096d80b4 100644 --- a/modules/gitlab_integration/config/locales/crowdin/ko.yml +++ b/modules/gitlab_integration/config/locales/crowdin/ko.yml @@ -49,16 +49,16 @@ ko: attributes: labels: invalid_schema: '키가 있는 해시 배열이어야 합니다: color, title' - label_gitlab_integration: GitLab Integration - label_gitlab_actor: GitLab actor - label_gitlab_webhook_secret: Webhook secret - text_gitlab_actor_info: 'The OpenProject user whose API key must be used to authenticate incoming webhook requests. When set, requests authenticated with any other user''s credentials are rejected. This user also posts automated comments on work packages. Defaults to the system user when not set. + label_gitlab_integration: GitLab 통합 + label_gitlab_actor: GitLab 수행자 + label_gitlab_webhook_secret: Webhook 비밀번호 + text_gitlab_actor_info: '들어오는 webhook 요청을 인증하는 데 API 키를 사용해야 하는 OpenProject 사용자입니다. 설정하면, 다른 사용자의 자격 증명으로 인증된 요청은 거부됩니다. 이 사용자는 작업 패키지에 자동화된 코멘트를 게시하기도 합니다. 설정하지 않으면, 시스템 사용자로 기본 설정됩니다. ' - text_gitlab_webhook_secret_info: 'A secret token shared with GitLab when configuring the webhook. When set, OpenProject verifies the X-Gitlab-Token header on every incoming request, rejecting payloads that do not match. Leave blank to skip verification (not recommended). + text_gitlab_webhook_secret_info: 'Webhook을 구성할 때 GitLab과 공유되는 비밀 토큰입니다. 설정하면, OpenProject는 들어오는 모든 요청에서 X-Gitlab-Token 헤더를 확인하여 일치하지 않는 페이로드를 거부합니다. 확인을 건너뛰려면 비워 두세요(권장하지 않음). ' - text_gitlab_webhook_secret_missing_warning: 'No webhook secret is configured. Any request to the GitLab webhook endpoint will be accepted without verification, which may allow unauthorized actors to forge events. It is strongly recommended to set a secret. + text_gitlab_webhook_secret_missing_warning: 'Webhook 비밀번호가 구성되지 않았습니다. GitLab webhook 엔드포인트에 대한 모든 요청이 확인 없이 수락되므로 권한이 없는 수행자가 이벤트를 위조할 수 있습니다. 비밀번호를 설정하는 것이 좋습니다. ' project_module_gitlab: GitLab diff --git a/modules/gitlab_integration/config/locales/crowdin/pt-BR.yml b/modules/gitlab_integration/config/locales/crowdin/pt-BR.yml index 6446149baa4..f49631ff513 100644 --- a/modules/gitlab_integration/config/locales/crowdin/pt-BR.yml +++ b/modules/gitlab_integration/config/locales/crowdin/pt-BR.yml @@ -23,7 +23,7 @@ --- pt-BR: attributes: - commit: Commit + commit: Confirmar gitlab: Identificador do GitLab gitlab_avatar_url: URL da imagem de perfil gitlab_email: E-mail do GitLab @@ -49,16 +49,16 @@ pt-BR: attributes: labels: invalid_schema: 'deve ser um array de hashes com as chaves: cor, título' - label_gitlab_integration: GitLab Integration - label_gitlab_actor: GitLab actor - label_gitlab_webhook_secret: Webhook secret - text_gitlab_actor_info: 'The OpenProject user whose API key must be used to authenticate incoming webhook requests. When set, requests authenticated with any other user''s credentials are rejected. This user also posts automated comments on work packages. Defaults to the system user when not set. + label_gitlab_integration: Integração do GitLab + label_gitlab_actor: Ator do GitLab + label_gitlab_webhook_secret: Segredo do webhook + text_gitlab_actor_info: 'O usuário do OpenProject cuja chave de API deve ser usada para autenticar requisições de webhook recebidas. Quando definido, requisições autenticadas com credenciais de qualquer outro usuário são rejeitadas. Este usuário também publica comentários automatizados em pacotes de trabalho. O padrão é o usuário do sistema quando não for definido. ' - text_gitlab_webhook_secret_info: 'A secret token shared with GitLab when configuring the webhook. When set, OpenProject verifies the X-Gitlab-Token header on every incoming request, rejecting payloads that do not match. Leave blank to skip verification (not recommended). + text_gitlab_webhook_secret_info: 'Um token secreto compartilhado com o GitLab ao configurar o webhook. Quando definido, o OpenProject verifica o cabeçalho X-Gitlab-Token em cada requisição recebida, rejeitando payloads que não correspondam. Deixe em branco para pular a verificação (não recomendado). ' - text_gitlab_webhook_secret_missing_warning: 'No webhook secret is configured. Any request to the GitLab webhook endpoint will be accepted without verification, which may allow unauthorized actors to forge events. It is strongly recommended to set a secret. + text_gitlab_webhook_secret_missing_warning: 'Nenhum segredo de webhook está configurado. Qualquer requisição ao endpoint de webhook do GitLab será aceita sem verificação, o que pode permitir que agentes não autorizados falsifiquem eventos. É altamente recomendado definir um segredo. ' project_module_gitlab: GitLab diff --git a/modules/gitlab_integration/config/locales/crowdin/uk.yml b/modules/gitlab_integration/config/locales/crowdin/uk.yml index f654e310a39..78a3b1cd553 100644 --- a/modules/gitlab_integration/config/locales/crowdin/uk.yml +++ b/modules/gitlab_integration/config/locales/crowdin/uk.yml @@ -49,16 +49,16 @@ uk: attributes: labels: invalid_schema: 'має бути масивом гешів із ключами: color, title' - label_gitlab_integration: GitLab Integration - label_gitlab_actor: GitLab actor - label_gitlab_webhook_secret: Webhook secret - text_gitlab_actor_info: 'The OpenProject user whose API key must be used to authenticate incoming webhook requests. When set, requests authenticated with any other user''s credentials are rejected. This user also posts automated comments on work packages. Defaults to the system user when not set. + label_gitlab_integration: Інтеграція з GitLab + label_gitlab_actor: Суб’єкт GitLab + label_gitlab_webhook_secret: Секрет вебхука + text_gitlab_actor_info: 'Це користувач OpenProject, чий API-ключ має використовуватися для автентифікації вхідних запитів вебхука. Якщо налаштовано, запити, автентифіковані за допомогою облікових даних будь-якого іншого користувача, буде відхилено. Цей користувач також автоматично додає коментарі до пакетів робіт. За замовчуванням це системний користувач, якщо не вказати іншого. ' - text_gitlab_webhook_secret_info: 'A secret token shared with GitLab when configuring the webhook. When set, OpenProject verifies the X-Gitlab-Token header on every incoming request, rejecting payloads that do not match. Leave blank to skip verification (not recommended). + text_gitlab_webhook_secret_info: 'Це секретний маркер, який передається GitLab при налаштуванні вебхука. Якщо налаштовано, OpenProject перевіряє заголовок X-Gitlab-Token для кожного вхідного запиту й відхиляє корисне навантаження, яке не відповідає вимогам. Залиште поле порожнім, щоб пропускати перевірку (не рекомендуємо). ' - text_gitlab_webhook_secret_missing_warning: 'No webhook secret is configured. Any request to the GitLab webhook endpoint will be accepted without verification, which may allow unauthorized actors to forge events. It is strongly recommended to set a secret. + text_gitlab_webhook_secret_missing_warning: 'Секрет вебхука не налаштовано. Усі запити до кінцевої точки вебхука GitLab прийматимуться без перевірки, через що у неавторизованих суб’єктів може бути змога підробляти події. Наполегливо рекомендуємо налаштувати секрет. ' project_module_gitlab: GitLab diff --git a/modules/gitlab_integration/config/locales/crowdin/zh-CN.yml b/modules/gitlab_integration/config/locales/crowdin/zh-CN.yml index 8de0547dcb9..cfd0d17bd72 100644 --- a/modules/gitlab_integration/config/locales/crowdin/zh-CN.yml +++ b/modules/gitlab_integration/config/locales/crowdin/zh-CN.yml @@ -49,16 +49,16 @@ zh-CN: attributes: labels: invalid_schema: 必须是键为“颜色,标题”的哈希数组 - label_gitlab_integration: GitLab Integration - label_gitlab_actor: GitLab actor - label_gitlab_webhook_secret: Webhook secret - text_gitlab_actor_info: 'The OpenProject user whose API key must be used to authenticate incoming webhook requests. When set, requests authenticated with any other user''s credentials are rejected. This user also posts automated comments on work packages. Defaults to the system user when not set. + label_gitlab_integration: GitLab 集成 + label_gitlab_actor: GitLab 执行者 + label_gitlab_webhook_secret: Webhook 密钥 + text_gitlab_actor_info: '必须使用其 API 密钥对传入的 Webhook 请求进行身份验证的 OpenProject 用户。如果设置了此用户,则会拒绝使用其他任何用户凭据进行身份验证的请求。该用户还会对工作包发布自动评论。如果未设置此用户,则默认使用系统用户。 ' - text_gitlab_webhook_secret_info: 'A secret token shared with GitLab when configuring the webhook. When set, OpenProject verifies the X-Gitlab-Token header on every incoming request, rejecting payloads that do not match. Leave blank to skip verification (not recommended). + text_gitlab_webhook_secret_info: '配置 webhook 时与 GitLab 共享的密钥令牌。设置后,OpenProject 会验证每个传入请求的 X-Gitlab-Token 标头,拒绝不匹配的有效载荷。留空表示跳过验证(不推荐)。 ' - text_gitlab_webhook_secret_missing_warning: 'No webhook secret is configured. Any request to the GitLab webhook endpoint will be accepted without verification, which may allow unauthorized actors to forge events. It is strongly recommended to set a secret. + text_gitlab_webhook_secret_missing_warning: '未配置 webhook 密钥。任何向 GitLab webhook 端点发出的请求都会被接受,无需验证,这可能导致未经授权的执行者伪造事件。强烈建议设置密钥 。 ' project_module_gitlab: GitLab diff --git a/modules/grids/config/locales/crowdin/js-pl.yml b/modules/grids/config/locales/crowdin/js-pl.yml index 2f7dd13170e..99daad242b8 100644 --- a/modules/grids/config/locales/crowdin/js-pl.yml +++ b/modules/grids/config/locales/crowdin/js-pl.yml @@ -30,7 +30,7 @@ pl: finished: Zakończone discontinued: Przerwane subprojects: - title: Podppzycje + title: Podpozycje project_favorites: title: Ulubione projekty no_results: Obecnie nie masz żadnych ulubionych projektów. Kliknij ikonę gwiazdki na pulpicie nawigacyjnym projektu, aby dodać go do ulubionych. diff --git a/modules/grids/config/locales/crowdin/pl.yml b/modules/grids/config/locales/crowdin/pl.yml index ea9c0b2e5f7..c17022c17e6 100644 --- a/modules/grids/config/locales/crowdin/pl.yml +++ b/modules/grids/config/locales/crowdin/pl.yml @@ -6,9 +6,9 @@ pl: empty: Ten widżet jest obecnie pusty. not_available: Ten widżet jest niedostępny. subitems: - title: Podppzycje + title: Podpozycje no_results: Nie ma żadnych widocznych elementów podrzędnych. - view_all_subitems: Wyświetl wszystkie podppzycje + view_all_subitems: Wyświetl wszystkie podpozycje button_text: Podelement members: title: Członkowie diff --git a/modules/job_status/config/locales/crowdin/es.yml b/modules/job_status/config/locales/crowdin/es.yml index cc04d479a1d..b90aa8181f8 100644 --- a/modules/job_status/config/locales/crowdin/es.yml +++ b/modules/job_status/config/locales/crowdin/es.yml @@ -6,7 +6,7 @@ es: description: Listado y estado de los trabajos en segundo plano. job_status_dialog: download_starts: La descarga debería iniciarse automáticamente. - click_to_download: Or, [click here](download_url) to download. + click_to_download: O bien, [haz clic aquí](download_url) para descargarlo. title: Estado de trabajo en segundo plano. redirect: Se le está redirigiendo. redirect_link: Haga clic aquí para continuar. diff --git a/modules/job_status/config/locales/crowdin/it.yml b/modules/job_status/config/locales/crowdin/it.yml index c6fdedc4937..175d3febe7b 100644 --- a/modules/job_status/config/locales/crowdin/it.yml +++ b/modules/job_status/config/locales/crowdin/it.yml @@ -6,7 +6,7 @@ it: description: Elenco e stato dei job in background. job_status_dialog: download_starts: Il download dovrebbe iniziare automaticamente. - click_to_download: Or, [click here](download_url) to download. + click_to_download: Oppure, [clicca qui](download_url) per scaricare. title: Stato del lavoro in background redirect: È in corso il reindirizzamento. redirect_link: Clicca qui per continuare. diff --git a/modules/job_status/config/locales/crowdin/ko.yml b/modules/job_status/config/locales/crowdin/ko.yml index 29d589848d7..fdb152d18d3 100644 --- a/modules/job_status/config/locales/crowdin/ko.yml +++ b/modules/job_status/config/locales/crowdin/ko.yml @@ -6,7 +6,7 @@ ko: description: 백그라운드 작업 목록 및 상태. job_status_dialog: download_starts: 자동으로 다운로드가 시작됩니다. - click_to_download: Or, [click here](download_url) to download. + click_to_download: 또는 [여기를 클릭](download_url)하여 다운로드하세요. title: 백그라운드 작업 상태 redirect: 리디렉션 중입니다. redirect_link: 계속하려면 여기를 클릭하세요. diff --git a/modules/job_status/config/locales/crowdin/pt-BR.yml b/modules/job_status/config/locales/crowdin/pt-BR.yml index d1c9c061ccb..028fd843a4c 100644 --- a/modules/job_status/config/locales/crowdin/pt-BR.yml +++ b/modules/job_status/config/locales/crowdin/pt-BR.yml @@ -6,7 +6,7 @@ pt-BR: description: Listagem e situação dos trabalhos em segundo plano. job_status_dialog: download_starts: O download deverá começar automaticamente. - click_to_download: Or, [click here](download_url) to download. + click_to_download: Ou [clique aqui](download_url) para baixar. title: Status do trabalho em segundo plano redirect: Você está sendo redirecionado. redirect_link: Clique aqui para continuar. diff --git a/modules/job_status/config/locales/crowdin/uk.yml b/modules/job_status/config/locales/crowdin/uk.yml index 547eef0ffa0..cdce93a0dd3 100644 --- a/modules/job_status/config/locales/crowdin/uk.yml +++ b/modules/job_status/config/locales/crowdin/uk.yml @@ -6,7 +6,7 @@ uk: description: Список і статус фонових завдань. job_status_dialog: download_starts: Завантаження має початись автоматично. - click_to_download: Or, [click here](download_url) to download. + click_to_download: Або [натисніть тут](download_url), щоб завантажити. title: Статус фонового завдання redirect: Вас буде переспрямовано. redirect_link: Натисніть тут, щоб продовжити. diff --git a/modules/job_status/config/locales/crowdin/zh-CN.yml b/modules/job_status/config/locales/crowdin/zh-CN.yml index 3a02aa4d8d7..6990e7d0d0f 100644 --- a/modules/job_status/config/locales/crowdin/zh-CN.yml +++ b/modules/job_status/config/locales/crowdin/zh-CN.yml @@ -6,7 +6,7 @@ zh-CN: description: 后台作业的列表和状态。 job_status_dialog: download_starts: 下载会自动开始。 - click_to_download: Or, [click here](download_url) to download. + click_to_download: 或[点击此处](download_url)进行下载。 title: 后台作业状态 redirect: 正在将您重定向。 redirect_link: 请点击此处继续。 diff --git a/modules/ldap_groups/app/components/ldap_groups/synchronized_filters/destroy_dialog_component.html.erb b/modules/ldap_groups/app/components/ldap_groups/synchronized_filters/destroy_dialog_component.html.erb new file mode 100644 index 00000000000..14fbefd25ac --- /dev/null +++ b/modules/ldap_groups/app/components/ldap_groups/synchronized_filters/destroy_dialog_component.html.erb @@ -0,0 +1,64 @@ +<%#-- copyright +OpenProject is an open source project management software. +Copyright (C) the OpenProject GmbH + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License version 3. + +OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +Copyright (C) 2006-2013 Jean-Philippe Lang +Copyright (C) 2010-2013 the ChiliProject Team + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +See COPYRIGHT and LICENSE files for more details. + +++#%> + +<%= + render( + Primer::OpenProject::DangerDialog.new( + title: I18n.t("ldap_groups.synchronized_filters.destroy.title", name: @filter.name), + form_arguments:, + size: :large + ) + ) do |dialog| + dialog.with_confirmation_message do |message| + message.with_heading(tag: :h2) { I18n.t("ldap_groups.synchronized_filters.destroy.heading", name: @filter.name) } + message.with_description_content( + I18n.t( + "ldap_groups.synchronized_filters.destroy.confirmation", + name: @filter.name, + groups_count: @filter.groups.count + ) + ) + end + if @filter.groups.any? + dialog.with_additional_details do + concat content_tag(:p, I18n.t("ldap_groups.synchronized_filters.destroy.removed_groups")) + concat( + content_tag(:ul) do + safe_join( + @filter.groups.map do |synced_group| + content_tag(:li, link_to(synced_group.group.name, edit_group_path(synced_group.group), target: "_blank", rel: "noopener")) + end + ) + end + ) + end + end + dialog.with_confirmation_check_box_content(I18n.t(:text_permanent_delete_confirmation_checkbox_label)) + end +%> diff --git a/modules/ldap_groups/app/components/ldap_groups/synchronized_filters/destroy_dialog_component.rb b/modules/ldap_groups/app/components/ldap_groups/synchronized_filters/destroy_dialog_component.rb new file mode 100644 index 00000000000..07e961f5727 --- /dev/null +++ b/modules/ldap_groups/app/components/ldap_groups/synchronized_filters/destroy_dialog_component.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module LdapGroups + module SynchronizedFilters + class DestroyDialogComponent < ApplicationComponent + include OpTurbo::Streamable + + def initialize(filter:) + super + @filter = filter + end + + def form_arguments + { + action: ldap_groups_synchronized_filter_path(@filter), + method: :delete + } + end + end + end +end diff --git a/modules/ldap_groups/app/components/ldap_groups/synchronized_filters/row_component.rb b/modules/ldap_groups/app/components/ldap_groups/synchronized_filters/row_component.rb index b6890df1ba1..2c6a0ed10b9 100644 --- a/modules/ldap_groups/app/components/ldap_groups/synchronized_filters/row_component.rb +++ b/modules/ldap_groups/app/components/ldap_groups/synchronized_filters/row_component.rb @@ -75,7 +75,8 @@ module LdapGroups link_to I18n.t(:button_delete), { controller: table.target_controller, ldap_filter_id: model.id, action: :destroy_info }, class: "icon icon-delete", - title: t(:button_delete) + title: t(:button_delete), + data: { turbo_stream: true } end end end diff --git a/modules/ldap_groups/app/components/ldap_groups/synchronized_groups/destroy_dialog_component.html.erb b/modules/ldap_groups/app/components/ldap_groups/synchronized_groups/destroy_dialog_component.html.erb new file mode 100644 index 00000000000..1f3f0c1f945 --- /dev/null +++ b/modules/ldap_groups/app/components/ldap_groups/synchronized_groups/destroy_dialog_component.html.erb @@ -0,0 +1,53 @@ +<%#-- copyright +OpenProject is an open source project management software. +Copyright (C) the OpenProject GmbH + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License version 3. + +OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +Copyright (C) 2006-2013 Jean-Philippe Lang +Copyright (C) 2010-2013 the ChiliProject Team + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +See COPYRIGHT and LICENSE files for more details. + +++#%> + +<%= + render( + Primer::OpenProject::DangerDialog.new( + title: I18n.t("ldap_groups.synchronized_groups.destroy.title", name: @group.dn), + form_arguments:, + size: :large + ) + ) do |dialog| + dialog.with_confirmation_message do |message| + message.with_heading(tag: :h2) { I18n.t("ldap_groups.synchronized_groups.destroy.heading", name: @group.dn) } + message.with_description_content( + I18n.t( + "ldap_groups.synchronized_groups.destroy.confirmation", + name: @group.dn, + users_count: @group.users.count + ) + ) + end + dialog.with_additional_details do + I18n.t("ldap_groups.synchronized_groups.destroy.info") + end + dialog.with_confirmation_check_box_content(I18n.t(:text_permanent_delete_confirmation_checkbox_label)) + end +%> diff --git a/modules/ldap_groups/app/components/ldap_groups/synchronized_groups/destroy_dialog_component.rb b/modules/ldap_groups/app/components/ldap_groups/synchronized_groups/destroy_dialog_component.rb new file mode 100644 index 00000000000..fb451b2906f --- /dev/null +++ b/modules/ldap_groups/app/components/ldap_groups/synchronized_groups/destroy_dialog_component.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module LdapGroups + module SynchronizedGroups + class DestroyDialogComponent < ApplicationComponent + include OpTurbo::Streamable + + def initialize(group:) + super + @group = group + end + + def form_arguments + { + action: ldap_groups_synchronized_group_path(@group), + method: :delete + } + end + end + end +end diff --git a/modules/ldap_groups/app/components/ldap_groups/synchronized_groups/row_component.rb b/modules/ldap_groups/app/components/ldap_groups/synchronized_groups/row_component.rb index 372b3ad912f..6fde8228579 100644 --- a/modules/ldap_groups/app/components/ldap_groups/synchronized_groups/row_component.rb +++ b/modules/ldap_groups/app/components/ldap_groups/synchronized_groups/row_component.rb @@ -65,7 +65,8 @@ module LdapGroups link_to I18n.t(:button_delete), { controller: table.target_controller, ldap_group_id: model.id, action: :destroy_info }, class: "icon icon-delete", - title: t(:button_delete) + title: t(:button_delete), + data: { turbo_stream: true } end end end diff --git a/modules/ldap_groups/app/controllers/ldap_groups/synchronized_filters_controller.rb b/modules/ldap_groups/app/controllers/ldap_groups/synchronized_filters_controller.rb index f9cc03e0e25..b386f89992e 100644 --- a/modules/ldap_groups/app/controllers/ldap_groups/synchronized_filters_controller.rb +++ b/modules/ldap_groups/app/controllers/ldap_groups/synchronized_filters_controller.rb @@ -1,5 +1,7 @@ module LdapGroups class SynchronizedFiltersController < ::ApplicationController + include OpTurbo::ComponentStream + before_action :require_admin guard_enterprise_feature(:ldap_groups, except: %i[show destroy]) do @@ -19,7 +21,9 @@ module LdapGroups def end; end - def destroy_info; end + def destroy_info + respond_with_dialog LdapGroups::SynchronizedFilters::DestroyDialogComponent.new(filter: @filter) + end def create @filter = SynchronizedFilter.new permitted_params diff --git a/modules/ldap_groups/app/controllers/ldap_groups/synchronized_groups_controller.rb b/modules/ldap_groups/app/controllers/ldap_groups/synchronized_groups_controller.rb index 092f8e80c1a..6457c65a3eb 100644 --- a/modules/ldap_groups/app/controllers/ldap_groups/synchronized_groups_controller.rb +++ b/modules/ldap_groups/app/controllers/ldap_groups/synchronized_groups_controller.rb @@ -29,6 +29,8 @@ #++ module LdapGroups class SynchronizedGroupsController < ::ApplicationController + include OpTurbo::ComponentStream + before_action :require_admin guard_enterprise_feature(:ldap_groups, except: %i[index show destroy]) do @@ -79,7 +81,7 @@ module LdapGroups end def destroy_info - render + respond_with_dialog LdapGroups::SynchronizedGroups::DestroyDialogComponent.new(group: @group) end def destroy diff --git a/modules/ldap_groups/app/views/ldap_groups/synchronized_filters/destroy_info.html.erb b/modules/ldap_groups/app/views/ldap_groups/synchronized_filters/destroy_info.html.erb deleted file mode 100644 index 1dfc6e42304..00000000000 --- a/modules/ldap_groups/app/views/ldap_groups/synchronized_filters/destroy_info.html.erb +++ /dev/null @@ -1,72 +0,0 @@ -<% html_title(t(:label_administration), t("ldap_groups.synchronized_filters.destroy.title")) -%> - -<%= styled_form_tag( - { action: :destroy, ldap_group_id: @filter.id }, - class: "danger-zone", - method: :delete - ) do %> -
-

- <%= t("ldap_groups.synchronized_filters.destroy.title", name: @filter.name) %> -

-

-

-

- - <%= t("ldap_groups.synchronized_filters.destroy.confirmation", name: @filter.name, groups_count: @filter.groups.count) %> -

- - <% if @filter.groups.count > 0 %> -

<%= t("ldap_groups.synchronized_filters.destroy.removed_groups") %>

-
-
- - - - - - - <% @filter.groups.find_each do |synced_group| %> - - - - - <% end %> - -
-
- <%= t("attributes.name") %> - -
-
-
- <%= ::LdapGroups::SynchronizedGroup.human_attribute_name :dn %> - -
-
<%= link_to synced_group.group.name, - edit_group_path(synced_group.group), - target: "_blank" %> - <%= synced_group.dn %>
-
-
- <% end %> -

- <%= t( - "ldap_groups.synchronized_filters.destroy.verification_html", - name: content_tag(:em, @filter.name, class: "danger-zone--expected-value") - ) %> -

- -
- - <%= styled_button_tag title: t(:button_delete), class: "-primary", disabled: true do - concat content_tag :i, "", class: "button--icon icon-delete" - concat content_tag :span, t(:button_delete), class: "button--text" - end %> - <%= link_to t(:button_cancel), - ldap_groups_synchronized_groups_path, - title: t(:button_cancel), - class: "button -with-icon icon-cancel" %> -
-
-<% end %> diff --git a/modules/ldap_groups/app/views/ldap_groups/synchronized_groups/destroy_info.html.erb b/modules/ldap_groups/app/views/ldap_groups/synchronized_groups/destroy_info.html.erb deleted file mode 100644 index e928e49f766..00000000000 --- a/modules/ldap_groups/app/views/ldap_groups/synchronized_groups/destroy_info.html.erb +++ /dev/null @@ -1,38 +0,0 @@ -<% html_title(t(:label_administration), t("ldap_groups.synchronized_groups.destroy.title")) -%> - -<%= styled_form_tag( - { action: :destroy, ldap_group_id: @group.id }, - class: "danger-zone", - method: :delete - ) do %> -
-

- <%= t("ldap_groups.synchronized_groups.destroy.title", name: @group.dn) %> -

-

-

-

- - <%= t("ldap_groups.synchronized_groups.destroy.confirmation", name: @group.dn, users_count: @group.users.count) %> -

-

- <%= t("ldap_groups.synchronized_groups.destroy.info") %> -
- <%= t( - "ldap_groups.synchronized_groups.destroy.verification_html", - name: content_tag(:em, @group.dn, class: "danger-zone--expected-value") - ) %> -

-
- - <%= styled_button_tag title: t(:button_delete), class: "-primary", disabled: true do - concat content_tag :i, "", class: "button--icon icon-delete" - concat content_tag :span, t(:button_delete), class: "button--text" - end %> - <%= link_to t(:button_cancel), - { action: :index }, - title: t(:button_cancel), - class: "button -with-icon icon-cancel" %> -
-
-<% end %> diff --git a/modules/ldap_groups/config/locales/crowdin/af.yml b/modules/ldap_groups/config/locales/crowdin/af.yml index 3f456025828..c44214c1db0 100644 --- a/modules/ldap_groups/config/locales/crowdin/af.yml +++ b/modules/ldap_groups/config/locales/crowdin/af.yml @@ -46,6 +46,7 @@ af: zero: No groups were found by the filter destroy: title: Remove synchronized filter %{name} + heading: Remove synchronized filter %{name}? confirmation: If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ af: add_new: Add synchronized LDAP group destroy: title: Remove synchronized group %{name} + heading: Remove synchronized group %{name}? confirmation: If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed. - info: 'Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/ar.yml b/modules/ldap_groups/config/locales/crowdin/ar.yml index d47af2986e6..491e467c13a 100644 --- a/modules/ldap_groups/config/locales/crowdin/ar.yml +++ b/modules/ldap_groups/config/locales/crowdin/ar.yml @@ -46,6 +46,7 @@ ar: zero: No groups were found by the filter destroy: title: Remove synchronized filter %{name} + heading: Remove synchronized filter %{name}? confirmation: If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ ar: add_new: Add synchronized LDAP group destroy: title: Remove synchronized group %{name} + heading: Remove synchronized group %{name}? confirmation: If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed. - info: 'Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/az.yml b/modules/ldap_groups/config/locales/crowdin/az.yml index 0e1d8e7d7da..c226dbd2209 100644 --- a/modules/ldap_groups/config/locales/crowdin/az.yml +++ b/modules/ldap_groups/config/locales/crowdin/az.yml @@ -46,6 +46,7 @@ az: zero: No groups were found by the filter destroy: title: Remove synchronized filter %{name} + heading: Remove synchronized filter %{name}? confirmation: If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ az: add_new: Add synchronized LDAP group destroy: title: Remove synchronized group %{name} + heading: Remove synchronized group %{name}? confirmation: If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed. - info: 'Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/be.yml b/modules/ldap_groups/config/locales/crowdin/be.yml index 57baf1e53a5..006713bfd43 100644 --- a/modules/ldap_groups/config/locales/crowdin/be.yml +++ b/modules/ldap_groups/config/locales/crowdin/be.yml @@ -46,6 +46,7 @@ be: zero: No groups were found by the filter destroy: title: Remove synchronized filter %{name} + heading: Remove synchronized filter %{name}? confirmation: If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ be: add_new: Add synchronized LDAP group destroy: title: Remove synchronized group %{name} + heading: Remove synchronized group %{name}? confirmation: If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed. - info: 'Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/bg.yml b/modules/ldap_groups/config/locales/crowdin/bg.yml index fce460176b3..a8529af0b71 100644 --- a/modules/ldap_groups/config/locales/crowdin/bg.yml +++ b/modules/ldap_groups/config/locales/crowdin/bg.yml @@ -46,6 +46,7 @@ bg: zero: Филтърът не откри групи destroy: title: Премахване на синхронизирания филтър %{name} + heading: Remove synchronized filter %{name}? confirmation: Ако продължите, синхронизираният филтър %{name} и всички групи %{groups_count} , създадени чрез него, ще бъдат премахнати. removed_groups: 'Предупреждение: Това ще премахне следните групи от OpenProject, и ще ги премахне от всички проекти!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ bg: add_new: Добавяне на синхронизирана LDAP група destroy: title: Премахване на синхронизирана група %{name} + heading: Remove synchronized group %{name}? confirmation: Ако продължите, синхронизираната група %{name} и всички %{users_count} потребители синхронизирани чрез нея, ще бъдат премахнати. - info: 'Забележка: Група OpenProject и членовете, добавени извън LDAP синхронизацията, няма да бъдат премахнати.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/ca.yml b/modules/ldap_groups/config/locales/crowdin/ca.yml index a694fb45615..0ceda291ad7 100644 --- a/modules/ldap_groups/config/locales/crowdin/ca.yml +++ b/modules/ldap_groups/config/locales/crowdin/ca.yml @@ -48,6 +48,7 @@ ca: zero: No s'ha trobat cap grup a través del filtre destroy: title: Elimina el filtre de sincronització %{name} + heading: Remove synchronized filter %{name}? confirmation: Si continues, el filtre de sincronització %{name} i tots els grups %{groups_count} creats seran eliminats. removed_groups: 'Alerta: Aquest eliminarà els següents grups d''OpenProject i l''eliminarà de tots els projectes!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -61,9 +62,9 @@ ca: add_new: Afegeix grup de sincronització LDAP destroy: title: Elimina el grup de sincronització %{name} + heading: Remove synchronized group %{name}? confirmation: Si continues, el grup de sincronització %{name} i tots els %{users_count} usuaris sincronitzats seran eliminats. - info: 'Nota: El grup d''OpenProject i els membres afegits fora d''aquesta sincronització de LDAP no seran eliminats.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | Aquest mòdul et permet configurar sincronitzacions entre grups de LDAP i OpenProject. Depénent dels grups de LDAP s'ha d'utilitzar els atributs groupOfNames / memberOf configurats per poder treballar amb OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/ckb-IR.yml b/modules/ldap_groups/config/locales/crowdin/ckb-IR.yml index f7d8ebfa410..e3eb72b948b 100644 --- a/modules/ldap_groups/config/locales/crowdin/ckb-IR.yml +++ b/modules/ldap_groups/config/locales/crowdin/ckb-IR.yml @@ -46,6 +46,7 @@ ckb-IR: zero: No groups were found by the filter destroy: title: Remove synchronized filter %{name} + heading: Remove synchronized filter %{name}? confirmation: If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ ckb-IR: add_new: Add synchronized LDAP group destroy: title: Remove synchronized group %{name} + heading: Remove synchronized group %{name}? confirmation: If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed. - info: 'Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/cs.yml b/modules/ldap_groups/config/locales/crowdin/cs.yml index 93ac443e28c..176664848a8 100644 --- a/modules/ldap_groups/config/locales/crowdin/cs.yml +++ b/modules/ldap_groups/config/locales/crowdin/cs.yml @@ -46,6 +46,7 @@ cs: zero: Ve filtru nebyly nalezeny žádné skupiny destroy: title: Odstranit synchronizovaný filtr %{name} + heading: Remove synchronized filter %{name}? confirmation: Pokud budete pokračovat, synchronizovaný filtr %{name} a všechny skupiny %{groups_count} vytvořené prostřednictvím tohoto filtru budou odstraněny. removed_groups: 'Varování: Toto odstraní následující skupiny z OpenProject a odstraní je ze všech projektů!' verification_html: Zadejte název filtru %{name} pro potvrzení odstranění. @@ -59,9 +60,9 @@ cs: add_new: Přidat synchronizovanou LDAP skupinu destroy: title: Odstranit synchronizovanou skupinu %{name} + heading: Remove synchronized group %{name}? confirmation: Pokud budete pokračovat, synchronizovaná skupina %{name} a všichni uživatelé %{users_count} synchronizovaní přes ni budou odstraněni. - info: 'Poznámka: Samotná OpenProject skupina a členové přidaní mimo tuto LDAP synchronizaci nebudou odstraněni.' - verification_html: Zadejte název skupiny %{name} pro potvrzení odstranění. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | Tento modul umožňuje nastavit synchronizaci mezi LDAP a OpenProject skupinami. Závisí na LDAP skupinách musí použít atribut groupOfNames / memberOf nastavený pro práci s OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/da.yml b/modules/ldap_groups/config/locales/crowdin/da.yml index 8344764f578..fd3a362142b 100644 --- a/modules/ldap_groups/config/locales/crowdin/da.yml +++ b/modules/ldap_groups/config/locales/crowdin/da.yml @@ -46,6 +46,7 @@ da: zero: Ingen grupper blev fundet af filteret destroy: title: Remove synchronized filter %{name} + heading: Remove synchronized filter %{name}? confirmation: If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ da: add_new: Add synchronized LDAP group destroy: title: Remove synchronized group %{name} + heading: Remove synchronized group %{name}? confirmation: If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed. - info: 'Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/de.yml b/modules/ldap_groups/config/locales/crowdin/de.yml index f529e109d36..2cddebcd80d 100644 --- a/modules/ldap_groups/config/locales/crowdin/de.yml +++ b/modules/ldap_groups/config/locales/crowdin/de.yml @@ -46,6 +46,7 @@ de: zero: Es wurden keine Gruppen durch den Filter gefunden destroy: title: Synchronisierten LDAP-Filter %{name} entfernen + heading: Remove synchronized filter %{name}? confirmation: Wenn Sie fortfahren, wird der Filter %{name} und alle %{groups_count} Gruppen, die durch ihn synchronisiert wurden, entfernt. removed_groups: 'Warnung: Die folgenden Gruppen werden aus OpenProject entfernt und aus allen Projekten entfernt!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ de: add_new: Synchronisierte LDAP-Gruppe hinzufügen destroy: title: Synchronisierte Gruppe %{name} entfernen + heading: Remove synchronized group %{name}? confirmation: Wenn Sie fortfahren, werden die synchronisierte Gruppe %{name} und alle %{users_count} Benutzer, die durch sie synchronisiert wurden, entfernt. - info: 'Hinweis: Die OpenProject Gruppe selbst und die Mitglieder, die außerhalb dieser LDAP-Synchronisation hinzugefügt wurden, werden nicht entfernt.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | Mit diesem Modul können Sie eine Synchronisation zwischen LDAP und OpenProject Gruppen einrichten. Es ist abhängig von LDAP-Gruppen müssen das groupOfNames / member Of Attribut verwenden, das für die Arbeit mit OpenProject eingestellt ist. diff --git a/modules/ldap_groups/config/locales/crowdin/el.yml b/modules/ldap_groups/config/locales/crowdin/el.yml index 36de9f18903..1c4168871e6 100644 --- a/modules/ldap_groups/config/locales/crowdin/el.yml +++ b/modules/ldap_groups/config/locales/crowdin/el.yml @@ -46,6 +46,7 @@ el: zero: Δεν βρέθηκαν ομάδες από το φίλτρο destroy: title: Αφαίρεση του συγχρονισμένου φίλτρου %{name} + heading: Remove synchronized filter %{name}? confirmation: Αν συνεχίσετε, το συγχρονισμένο φίλτρο %{name} και όλες οι ομάδες %{groups_count} που δημιουργήθηκαν μέσω αυτού θα αφαιρεθούν. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ el: add_new: Προσθήκη συγχρονισμένης LDAP ομάδας destroy: title: Αφαίρεση της συγχρονισμένης ομάδας %{name} + heading: Remove synchronized group %{name}? confirmation: Αν συνεχίσετε, η συγχρονισμένη ομάδα %{name} και οι %{users_count} χρήστες που έχουν συγχρονιστεί μέσω αυτής θα αφαιρεθούν. - info: 'Σημείωση: Η ομάδας OpenProject και τα μέλη που προστέθηκαν εκτός του συγχρονισμού LDAP δεν θα αφαιρεθούν.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | Αυτή η ενότητα σάς επιτρέπει να ρυθμίσετε συγχρονισμό μεταξύ ομάδων LDAP και OpenProject. Εξαρτάται από τις ομάδες LDAP που πρέπει να χρησιμοποιήσουν το σύνολο χαρακτηριστικών groupOfNames / memberOf που θα λειτουργούν με το OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/eo.yml b/modules/ldap_groups/config/locales/crowdin/eo.yml index 3d13671a63e..3773027e6d6 100644 --- a/modules/ldap_groups/config/locales/crowdin/eo.yml +++ b/modules/ldap_groups/config/locales/crowdin/eo.yml @@ -46,6 +46,7 @@ eo: zero: No groups were found by the filter destroy: title: Remove synchronized filter %{name} + heading: Remove synchronized filter %{name}? confirmation: If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ eo: add_new: Add synchronized LDAP group destroy: title: Remove synchronized group %{name} + heading: Remove synchronized group %{name}? confirmation: If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed. - info: 'Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/es.yml b/modules/ldap_groups/config/locales/crowdin/es.yml index 8d89cda0ce2..6df3d3a2cf8 100644 --- a/modules/ldap_groups/config/locales/crowdin/es.yml +++ b/modules/ldap_groups/config/locales/crowdin/es.yml @@ -46,9 +46,10 @@ es: zero: No se encontraron grupos con el filtro destroy: title: Quitar filtro sincronizado %{name} + heading: "¿Deseas eliminar el filtro sincronizado %{name}?" confirmation: Si continúa, el filtro sincronizado %{name} y los %{groups_count} grupos creados se eliminarán. removed_groups: 'Advertencia: Se eliminarán los grupos siguientes de OpenProject y se quitarán de todos los proyectos.' - verification_html: Enter the filter name %{name} to verify the deletion. + verification_html: Escribe el nombre del filtro %{name} para confirmar la eliminación. form: group_name_attribute_text: Especifique el atributo del grupo de LDAP usado para configurar el nombre del grupo de OpenProject. filter_string_text: Especifique el filtro LDAP RFC4515 que muestra los grupos en su entorno de LDAP que se sincronizarán con OpenProject. @@ -59,9 +60,9 @@ es: add_new: Agregar grupo de LDAP sincronizado destroy: title: Quitar grupo sincronizado %{name} + heading: "¿Deseas eliminar el grupo sincronizado %{name}?" confirmation: Si continúa, se eliminarán el grupo sincronizado %{name} y %{users_count} usuarios sincronizados mediante este. - info: 'Nota: El grupo de OpenProject en sí y los miembros agregados fuera de esta sincronización de LDAP no se eliminarán.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: El propio grupo OpenProject y los miembros añadidos fuera de esta sincronización LDAP no se eliminarán. help_text_html: | Este módulo le permite configurar una sincronización entre los grupos LDAP y el proyecto abierto Depende de que los grupos LDAP que necesiten usar el groupOfNames / memberOf diff --git a/modules/ldap_groups/config/locales/crowdin/et.yml b/modules/ldap_groups/config/locales/crowdin/et.yml index a15dd881a81..666e1c5b966 100644 --- a/modules/ldap_groups/config/locales/crowdin/et.yml +++ b/modules/ldap_groups/config/locales/crowdin/et.yml @@ -46,6 +46,7 @@ et: zero: No groups were found by the filter destroy: title: Remove synchronized filter %{name} + heading: Remove synchronized filter %{name}? confirmation: If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ et: add_new: Add synchronized LDAP group destroy: title: Remove synchronized group %{name} + heading: Remove synchronized group %{name}? confirmation: If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed. - info: 'Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/eu.yml b/modules/ldap_groups/config/locales/crowdin/eu.yml index 353b9c35524..939c46c5344 100644 --- a/modules/ldap_groups/config/locales/crowdin/eu.yml +++ b/modules/ldap_groups/config/locales/crowdin/eu.yml @@ -46,6 +46,7 @@ eu: zero: No groups were found by the filter destroy: title: Remove synchronized filter %{name} + heading: Remove synchronized filter %{name}? confirmation: If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ eu: add_new: Add synchronized LDAP group destroy: title: Remove synchronized group %{name} + heading: Remove synchronized group %{name}? confirmation: If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed. - info: 'Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/fa.yml b/modules/ldap_groups/config/locales/crowdin/fa.yml index 1a4e284143d..6280b005f11 100644 --- a/modules/ldap_groups/config/locales/crowdin/fa.yml +++ b/modules/ldap_groups/config/locales/crowdin/fa.yml @@ -46,6 +46,7 @@ fa: zero: هیچ گروهی با این فیلتر یافت نشد destroy: title: Remove synchronized filter %{name} + heading: Remove synchronized filter %{name}? confirmation: If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ fa: add_new: Add synchronized LDAP group destroy: title: Remove synchronized group %{name} + heading: Remove synchronized group %{name}? confirmation: If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed. - info: 'Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/fi.yml b/modules/ldap_groups/config/locales/crowdin/fi.yml index 58d994b8033..3d1553ec6b6 100644 --- a/modules/ldap_groups/config/locales/crowdin/fi.yml +++ b/modules/ldap_groups/config/locales/crowdin/fi.yml @@ -46,6 +46,7 @@ fi: zero: No groups were found by the filter destroy: title: Remove synchronized filter %{name} + heading: Remove synchronized filter %{name}? confirmation: If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ fi: add_new: Add synchronized LDAP group destroy: title: Remove synchronized group %{name} + heading: Remove synchronized group %{name}? confirmation: If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed. - info: 'Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/fil.yml b/modules/ldap_groups/config/locales/crowdin/fil.yml index 55725ff72e2..58c20f17039 100644 --- a/modules/ldap_groups/config/locales/crowdin/fil.yml +++ b/modules/ldap_groups/config/locales/crowdin/fil.yml @@ -46,6 +46,7 @@ fil: zero: No groups were found by the filter destroy: title: Remove synchronized filter %{name} + heading: Remove synchronized filter %{name}? confirmation: If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ fil: add_new: Add synchronized LDAP group destroy: title: Remove synchronized group %{name} + heading: Remove synchronized group %{name}? confirmation: If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed. - info: 'Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/fr.yml b/modules/ldap_groups/config/locales/crowdin/fr.yml index 192293948cf..78c0c2991e5 100644 --- a/modules/ldap_groups/config/locales/crowdin/fr.yml +++ b/modules/ldap_groups/config/locales/crowdin/fr.yml @@ -46,6 +46,7 @@ fr: zero: Aucun groupe trouvé par le filtre destroy: title: Supprimer le filtre synchronisé %{name} + heading: Supprimer le filtre synchronisé %{name} ? confirmation: Si vous continuez, le filtre synchronisé %{name} et tous les groupes %{groups_count} créés seront supprimés. removed_groups: 'Attention : ceci supprimera les groupes suivants d''OpenProject et le supprimera de tous les projets !' verification_html: Saisissez le nom du filtre %{name} pour valider la suppression. @@ -59,9 +60,9 @@ fr: add_new: Ajouter un groupe LDAP synchronisé destroy: title: Supprimer le groupe synchronisé %{name} + heading: Supprimer le groupe synchronisé %{name} ? confirmation: Si vous continuez, le groupe synchronisé %{name} et tous les utilisateurs %{users_count} synchronisés par le biais de celui-ci seront supprimés. - info: 'Remarque : Le groupe OpenProject lui-même et les membres ajoutés en dehors de cette synchronisation LDAP ne seront pas supprimés.' - verification_html: Saisissez le nom du groupe %{name} pour valider la suppression. + info: Le groupe OpenProject lui-même et les membres ajoutés en dehors de cette synchronisation LDAP ne seront pas supprimés. help_text_html: | Ce module vous permet de configurer une synchronisation entre les groupes LDAP et OpenProject. Les groupes LDAP doivent avoir l'attribut groupOfNames / memberOf défini pour fonctionner avec OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/he.yml b/modules/ldap_groups/config/locales/crowdin/he.yml index 0a75d33fc3c..88a86e2d8d4 100644 --- a/modules/ldap_groups/config/locales/crowdin/he.yml +++ b/modules/ldap_groups/config/locales/crowdin/he.yml @@ -46,6 +46,7 @@ he: zero: No groups were found by the filter destroy: title: Remove synchronized filter %{name} + heading: Remove synchronized filter %{name}? confirmation: If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ he: add_new: Add synchronized LDAP group destroy: title: Remove synchronized group %{name} + heading: Remove synchronized group %{name}? confirmation: If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed. - info: 'Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/hi.yml b/modules/ldap_groups/config/locales/crowdin/hi.yml index 92b1393e787..a6fb705309b 100644 --- a/modules/ldap_groups/config/locales/crowdin/hi.yml +++ b/modules/ldap_groups/config/locales/crowdin/hi.yml @@ -46,6 +46,7 @@ hi: zero: No groups were found by the filter destroy: title: Remove synchronized filter %{name} + heading: Remove synchronized filter %{name}? confirmation: If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ hi: add_new: Add synchronized LDAP group destroy: title: Remove synchronized group %{name} + heading: Remove synchronized group %{name}? confirmation: If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed. - info: 'Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/hr.yml b/modules/ldap_groups/config/locales/crowdin/hr.yml index b100ef38a75..6fc8914ed52 100644 --- a/modules/ldap_groups/config/locales/crowdin/hr.yml +++ b/modules/ldap_groups/config/locales/crowdin/hr.yml @@ -46,6 +46,7 @@ hr: zero: No groups were found by the filter destroy: title: Remove synchronized filter %{name} + heading: Remove synchronized filter %{name}? confirmation: If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ hr: add_new: Add synchronized LDAP group destroy: title: Remove synchronized group %{name} + heading: Remove synchronized group %{name}? confirmation: If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed. - info: 'Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/hu.yml b/modules/ldap_groups/config/locales/crowdin/hu.yml index 1feb8657ea3..b46a1d4a1ed 100644 --- a/modules/ldap_groups/config/locales/crowdin/hu.yml +++ b/modules/ldap_groups/config/locales/crowdin/hu.yml @@ -52,6 +52,7 @@ hu: zero: A szűrő nem talált csoportokat destroy: title: Szinkronizált szűrő eltávolítása %{name} + heading: Remove synchronized filter %{name}? confirmation: Az összes szinkronizált szűrő%{name} és az összes csoport %{groups_count} amit létrehozott törölve lesz, ha folytatja. removed_groups: 'Figyelmeztetés: Ez eltávolítja a következő csoportokat az OpenProject -ből, és eltávolítja az összes projektből! @@ -71,9 +72,9 @@ hu: add_new: Szinkronizált LDAP csoport hozzáadása destroy: title: Szinkronizált csoport %{name} visszavonása + heading: Remove synchronized group %{name}? confirmation: Az összes szinkronizált csoport%{name} és az összes %{users_count} amit létrehozott törölve lesz, ha folytatja. - info: 'Megjegyzés: Maga az OpenProject csoport és az ezen az LDAP szinkronizáláson kívül hozzáadott tagok nem kerülnek eltávolításra.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | Ez a modul lehetővé teszi az LDAP és az OpenProject csoportok közötti szinkronizálást. Attól függ, hogy az LDAP-csoportoknak az OpenProject használatához a groupOfNames / memberOf attribútumot kell használniuk. diff --git a/modules/ldap_groups/config/locales/crowdin/id.yml b/modules/ldap_groups/config/locales/crowdin/id.yml index 1882442e533..e7675c7306b 100644 --- a/modules/ldap_groups/config/locales/crowdin/id.yml +++ b/modules/ldap_groups/config/locales/crowdin/id.yml @@ -46,6 +46,7 @@ id: zero: Tidak ada grup yang ditemukan oleh filter destroy: title: Hapus filter tersinkronisasi %{name} + heading: Remove synchronized filter %{name}? confirmation: Jika Anda melanjutkan, filter tersinkronisasi %{name} dan semua grup %{groups_count} yang dibuat melaluinya akan dihapus. removed_groups: 'Peringatan: Ini akan menghapus grup berikut dari OpenProject dan menghapusnya dari semua proyek!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ id: add_new: Tambahkan grup LDAP tersinkronisasi destroy: title: Hapus grup tersinkronisasi %{name} + heading: Remove synchronized group %{name}? confirmation: Jika Anda melanjutkan, grup yang disinkronkan %{name} dan semua %{users_count} pengguna yang disinkronkan melaluinya akan dihapus. - info: 'Catatan: Grup OpenProject itu sendiri dan anggota yang ditambahkan di luar sinkronisasi LDAP ini tidak akan dihapus.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: 'Modul ini memungkinkan Anda mengatur sinkronisasi antara grup LDAP dan OpenProject. Itu tergantung pada grup LDAP yang perlu menggunakan atribut groupOfNames / memberOf yang disetel untuk bekerja dengan OpenProject.
Grup disinkronkan setiap jam melalui tugas cron. Lihat dokumentasi kami tentang topik ini. ' diff --git a/modules/ldap_groups/config/locales/crowdin/it.yml b/modules/ldap_groups/config/locales/crowdin/it.yml index 243edbb506e..33e71bebd7e 100644 --- a/modules/ldap_groups/config/locales/crowdin/it.yml +++ b/modules/ldap_groups/config/locales/crowdin/it.yml @@ -46,9 +46,10 @@ it: zero: Nessun gruppo trovato dal filtro destroy: title: Rimuovi filtro sincronizzato %{name} + heading: Rimuovere il filtro sincronizzato %{name}? confirmation: Se continui, il filtro sincronizzato %{name} e tutti i gruppi %{groups_count} creati attraverso di esso verranno rimossi. removed_groups: 'Attenzione: Questo rimuoverà i seguenti gruppi da OpenProject e lo rimuoverà da tutti i progetti!' - verification_html: Enter the filter name %{name} to verify the deletion. + verification_html: Inserisci il nome del filtro %{name} per verificare l'eliminazione. form: group_name_attribute_text: Inserisci l'attributo del gruppo LDAP usato per impostare il nome del gruppo OpenProject. filter_string_text: Inserisci il filtro LDAP RFC4515 che restituisce i gruppi nel tuo LDAP per sincronizzare con OpenProject. @@ -59,9 +60,9 @@ it: add_new: Aggiungi gruppo LDAP sincronizzato destroy: title: Rimuovi gruppo sincronizzato %{name} + heading: Rimuovere il gruppo sincronizzato %{name}? confirmation: Se continui, il gruppo sincronizzato %{name} e tutti i %{users_count} utenti sincronizzati con esso verranno rimossi. - info: 'Nota: il gruppo OpenProject stesso e i membri aggiunti al di fuori di questa sincronizzazione LDAP non verranno rimossi.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: Il gruppo OpenProject stesso e i membri aggiunti al di fuori di questa sincronizzazione LDAP non verranno rimossi. help_text_html: | Questo modulo permette di impostare una sincronizzazione tra l'LDAP e i gruppi di OpenProject. Dipende dall'impostazione dell'attributo groupOfNames / memberOf nei gruppi LDAP la possibilità di funzionare correttamente con OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/ja.yml b/modules/ldap_groups/config/locales/crowdin/ja.yml index 98d5a27504a..aa59e5f9610 100644 --- a/modules/ldap_groups/config/locales/crowdin/ja.yml +++ b/modules/ldap_groups/config/locales/crowdin/ja.yml @@ -46,6 +46,7 @@ ja: zero: このフィルタではグループが見つかりませんでした destroy: title: 同期されたフィルター %{name} を削除 + heading: Remove synchronized filter %{name}? confirmation: 続行すると、同期フィルター %{name} とそれを通して作成されたすべてのグループ %{groups_count} が削除されます。 removed_groups: '警告: 以下のグループを OpenProject から削除し、すべてのプロジェクトから削除します!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ ja: add_new: 同期済 LDAP グループを追加 destroy: title: 同期済グループ %{name} を削除 + heading: Remove synchronized group %{name}? confirmation: 続行すると、同期済グループ %{name} と、それを通じて同期された %{users_count} ユーザーがすべて削除されます。 - info: '注: OpenProject グループ自体と、この LDAP 同期外で追加されたメンバーは削除されません。' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | このモジュールは LDAP グループと Op​​enProject グループ間の同期を可能にします。 これは LDAPグループ が OpenProject で動作するように設定された groupOfNames / memberOf 属性を使用する必要があるかどうかに依存します。 diff --git a/modules/ldap_groups/config/locales/crowdin/ka.yml b/modules/ldap_groups/config/locales/crowdin/ka.yml index 86e23115d6c..79d6887dc3a 100644 --- a/modules/ldap_groups/config/locales/crowdin/ka.yml +++ b/modules/ldap_groups/config/locales/crowdin/ka.yml @@ -46,6 +46,7 @@ ka: zero: No groups were found by the filter destroy: title: Remove synchronized filter %{name} + heading: Remove synchronized filter %{name}? confirmation: If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ ka: add_new: Add synchronized LDAP group destroy: title: Remove synchronized group %{name} + heading: Remove synchronized group %{name}? confirmation: If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed. - info: 'Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/kk.yml b/modules/ldap_groups/config/locales/crowdin/kk.yml index babea9c4473..3134527a0ad 100644 --- a/modules/ldap_groups/config/locales/crowdin/kk.yml +++ b/modules/ldap_groups/config/locales/crowdin/kk.yml @@ -46,6 +46,7 @@ kk: zero: No groups were found by the filter destroy: title: Remove synchronized filter %{name} + heading: Remove synchronized filter %{name}? confirmation: If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ kk: add_new: Add synchronized LDAP group destroy: title: Remove synchronized group %{name} + heading: Remove synchronized group %{name}? confirmation: If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed. - info: 'Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/ko.yml b/modules/ldap_groups/config/locales/crowdin/ko.yml index 7f4955708ce..b7f1da77c41 100644 --- a/modules/ldap_groups/config/locales/crowdin/ko.yml +++ b/modules/ldap_groups/config/locales/crowdin/ko.yml @@ -46,6 +46,7 @@ ko: zero: 필터로 그룹 찾지 못함 destroy: title: 동기화된 필터 %{name} 제거 + heading: Remove synchronized filter %{name}? confirmation: 계속하는 경우, 동기화된 필터 %{name} 및 이를 통해 생성된 모든 그룹 %{groups_count}개가 제거됩니다. removed_groups: '경고: 이렇게 하면 OpenProject에서 다음 그룹이 제거되고 모든 프로젝트에서 이것이 제거됩니다.' verification_html: 삭제를 확인하려면 필터 이름 %{name}(을)를 입력하세요. @@ -59,9 +60,9 @@ ko: add_new: 동기화된 LDAP 그룹 추가 destroy: title: 동기화된 그룹 %{name} 제거 + heading: Remove synchronized group %{name}? confirmation: 계속하는 경우, 동기화된 그룹 %{name} 및 이를 통해 동기화된 %{users_count}명의 사용자 모두가 제거됩니다. - info: '참고: OpenProject 그룹 자체 그리고 이 LDAP 동기화 이외에서 추가된 멤버는 제거되지 않습니다.' - verification_html: 삭제를 확인하려면 프로젝트 이름 %{name}(을)를 입력하세요. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | 이 모듈을 통해 LDAP 및 OpenProject 그룹 간에 동기화를 설정할 수 있습니다. LDAP 그룹은 OpenProject와 작동하도록 설정된 groupOfNames / memberOf 특성을 사용해야 합니다. diff --git a/modules/ldap_groups/config/locales/crowdin/lt.yml b/modules/ldap_groups/config/locales/crowdin/lt.yml index ee944a89b1d..91b64e0d796 100644 --- a/modules/ldap_groups/config/locales/crowdin/lt.yml +++ b/modules/ldap_groups/config/locales/crowdin/lt.yml @@ -46,6 +46,7 @@ lt: zero: Nei vienos grupės nerasta pagal filtrą destroy: title: Panaikinti sinchronizavimo filtrą %{name} + heading: Remove synchronized filter %{name}? confirmation: Jei tęsite, sinchronizavimo filtras %{name} ir visos grupės (%{groups_count}), kurias jis sukūrė, bus panaikintos. removed_groups: 'Dėmesio: Tai OpenProjecte panaikins tokias grupes ir ištrins jas iš visų projektų!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ lt: add_new: Pridėti sinchronizuotą LDAP grupę destroy: title: Išimti sinchronizuotą grupę %{name} + heading: Remove synchronized group %{name}? confirmation: Jei tęsite, sinchronizuota grupė %{name} ir visi %{users_count} per ją sinchronizuotų naudotojų bus pašalinti. - info: 'Pastaba: OpenProject grupė pati ir nariai, pridėti už šios LDAP sinchronizacijos, nebus pašalinti.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | Šis modulis leidžia jums nustatyti sinchronizavimą tarp LDAP ir OpenProject grupių. Jis remiasi tuo, kad LDAP grupės turi naudoti groupOfNames / memberOf atributų rinkinį, kad dirbtų su OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/lv.yml b/modules/ldap_groups/config/locales/crowdin/lv.yml index c348603f26c..b819db8c913 100644 --- a/modules/ldap_groups/config/locales/crowdin/lv.yml +++ b/modules/ldap_groups/config/locales/crowdin/lv.yml @@ -46,6 +46,7 @@ lv: zero: No groups were found by the filter destroy: title: Remove synchronized filter %{name} + heading: Remove synchronized filter %{name}? confirmation: If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ lv: add_new: Add synchronized LDAP group destroy: title: Remove synchronized group %{name} + heading: Remove synchronized group %{name}? confirmation: If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed. - info: 'Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/mn.yml b/modules/ldap_groups/config/locales/crowdin/mn.yml index 64922bc93b5..126a18d748b 100644 --- a/modules/ldap_groups/config/locales/crowdin/mn.yml +++ b/modules/ldap_groups/config/locales/crowdin/mn.yml @@ -46,6 +46,7 @@ mn: zero: No groups were found by the filter destroy: title: Remove synchronized filter %{name} + heading: Remove synchronized filter %{name}? confirmation: If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ mn: add_new: Add synchronized LDAP group destroy: title: Remove synchronized group %{name} + heading: Remove synchronized group %{name}? confirmation: If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed. - info: 'Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/ms.yml b/modules/ldap_groups/config/locales/crowdin/ms.yml index 3cda835abed..c50e8b261ff 100644 --- a/modules/ldap_groups/config/locales/crowdin/ms.yml +++ b/modules/ldap_groups/config/locales/crowdin/ms.yml @@ -46,6 +46,7 @@ ms: zero: Tiada kumpulan yang ditemui penyaring destroy: title: Buang saringan yang diselaraskan %{name} + heading: Remove synchronized filter %{name}? confirmation: Jika anda teruskan, saringan yang diselaraskan %{name} dan semua kumpulan %{groups_count} yang dicipta melaluinya akan dikeluarkan. removed_groups: 'Amaran: Ini akan mengeluarkan kumpulan berikut daripada OpenProject dan mengeluarkannya daripada semua projek!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ ms: add_new: Tambah kumpulan LDAP yang diselaraskan destroy: title: Keluarkan kumpulan yang diselaraskan %{name} + heading: Remove synchronized group %{name}? confirmation: Jika anda teruskan, kumpulan yang diselaraskan %{name} dan semua %{users_count} pengguna yang diselaraskan melaluinya akan dikeluarkan. - info: 'Perhatian: Kumpulan OpenProject sendiri dan ahli-ahli yang ditambah di luar sinkronisasi LDAP tidak akan dikeluarkan.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | Modul ini membenarkan anda untuk menyediakan sinkronisasi antara LDAP dan kumpulan-kumpulan OpenProject. Ia bergantung kepada keperluan kumpulan LDAP untuk menggunakan kumpulanNama / ahliKepada
set atribut untuk bekerjasama dengan OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/ne.yml b/modules/ldap_groups/config/locales/crowdin/ne.yml index ace52cdfcaa..bf4c02a81c7 100644 --- a/modules/ldap_groups/config/locales/crowdin/ne.yml +++ b/modules/ldap_groups/config/locales/crowdin/ne.yml @@ -46,6 +46,7 @@ ne: zero: No groups were found by the filter destroy: title: Remove synchronized filter %{name} + heading: Remove synchronized filter %{name}? confirmation: If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ ne: add_new: Add synchronized LDAP group destroy: title: Remove synchronized group %{name} + heading: Remove synchronized group %{name}? confirmation: If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed. - info: 'Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/nl.yml b/modules/ldap_groups/config/locales/crowdin/nl.yml index c6c6884edcc..99285df5d45 100644 --- a/modules/ldap_groups/config/locales/crowdin/nl.yml +++ b/modules/ldap_groups/config/locales/crowdin/nl.yml @@ -46,6 +46,7 @@ nl: zero: Er zijn geen groepen gevonden door het filter destroy: title: Gesynchroniseerd filter %{name} verwijderen + heading: Remove synchronized filter %{name}? confirmation: Als u doorgaat, zal het gesynchroniseerde filter %{name} en alle groepen %{groups_count} die erdoor zijn aangemaakt worden verwijderd. removed_groups: 'Waarschuwing: Dit verwijdert de volgende groepen uit OpenProject en verwijdert deze uit alle projecten!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ nl: add_new: Gesynchroniseerde LDAP groep toevoegen destroy: title: Verwijder gesynchroniseerde groep %{name} + heading: Remove synchronized group %{name}? confirmation: Als u doorgaat zal de gesynchroniseerde groep %{name} en alle %{users_count} gebruikers erdoor gesynchroniseerd verwijderd worden. - info: 'Nota: De OpenProject groep zelf en leden toegevoegd buiten deze LDAP synchronisatie zullen niet verwijderd worden.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | Deze module laat u toe synchronisatie tussen LDAP en OpenProject groepen in te stellen. Het hangt af van LDAP groepen nood om het groupOfNames / memberOf attribuut te gebruiken ingesteld om te werken met OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/no.yml b/modules/ldap_groups/config/locales/crowdin/no.yml index 71db0c47958..52d0b2990e0 100644 --- a/modules/ldap_groups/config/locales/crowdin/no.yml +++ b/modules/ldap_groups/config/locales/crowdin/no.yml @@ -46,6 +46,7 @@ zero: Ingen grupper ble funnet av filteret destroy: title: Fjern synkronisert filter %{name} + heading: Remove synchronized filter %{name}? confirmation: Hvis du fortsetter, fjernes det synkroniserte filteret %{name} og alle gruppene %{groups_count} opprettet gjennom det. removed_groups: 'Advarsel: Dette fjerner følgende grupper fra OpenProject og fjerner dem fra alle prosjekter!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ add_new: Legg til synkronisert LDAP-gruppe destroy: title: Fjern synkronisert gruppe %{name} + heading: Remove synchronized group %{name}? confirmation: Hvis du fortsetter, fjernes den synkroniserte gruppen %{name} og alle %{users_count} brukere som er synkronisert gjennom den. - info: 'Merk: Selve OpenProject-gruppen og medlemmer lagt til utenfor denne LDAP-synkroniseringen vil ikke bli fjernet.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | Denne modulen lar deg sette opp en synkronisering mellom LDAP og OpenProject-grupper. Det avhenger av at LDAP-grupper bruker groupOfNames/memberOf-attributten for å fungere med OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/pl.yml b/modules/ldap_groups/config/locales/crowdin/pl.yml index 40e4055f785..e63f6e3ad15 100644 --- a/modules/ldap_groups/config/locales/crowdin/pl.yml +++ b/modules/ldap_groups/config/locales/crowdin/pl.yml @@ -46,6 +46,7 @@ pl: zero: Przy użyciu filtra nie znaleziono żadnych grup! destroy: title: Usuń synchronizowany filtr %{name} + heading: Remove synchronized filter %{name}? confirmation: W razie kontynuacji usunięty zostanie synchronizowany filtr %{name} i wszystkie grupy (%{groups_count}) utworzone przy jego użyciu. removed_groups: 'Ostrzeżenie: w ten sposób usuniesz następujące grupy z OpenProject i ze wszystkich projektów!' verification_html: Wprowadź nazwę filtru %{name}, aby potwierdzić usunięcie. @@ -59,9 +60,9 @@ pl: add_new: Dodaj synchronizowaną grupę LDAP destroy: title: Usuń synchronizowaną grupę %{name} + heading: Remove synchronized group %{name}? confirmation: W przypadku kontynuacji usunięta zostanie synchronizowana grupa %{name} i wszyscy użytkownicy (%{users_count}) synchronizowani za jej pośrednictwem. - info: 'Uwaga: nie zostanie usunięta sama grupa OpenProject ani członkowie dodani poza tą synchronizacją LDAP.' - verification_html: Wprowadź nazwę grupy %{name}, aby potwierdzić usunięcie. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | Ten moduł umożliwia skonfigurowanie synchronizacji między grupami LDAP i OpenProject. Zależy to od tego, czy grupy LDAP muszą do pracy z OpenProject używać ustawionego atrybutu groupOfNames / memberOf. diff --git a/modules/ldap_groups/config/locales/crowdin/pt-BR.yml b/modules/ldap_groups/config/locales/crowdin/pt-BR.yml index 6214569de56..6bb208f6ca7 100644 --- a/modules/ldap_groups/config/locales/crowdin/pt-BR.yml +++ b/modules/ldap_groups/config/locales/crowdin/pt-BR.yml @@ -46,6 +46,7 @@ pt-BR: zero: Nenhum grupo encontrado pelo filtro destroy: title: Remover filtro sincronizado %{name} + heading: Deseja remover o filtro sincronizado %{name}? confirmation: Se você continuar, o filtro sincronizado %{name} e todos os grupos %{groups_count} criados por meio dele serão removidos. removed_groups: 'Aviso: Isto removerá os seguintes grupos do OpenProject e removê-los de todos os projetos!' verification_html: Digite o nome do filtro %{name} para confirmar a exclusão. @@ -59,9 +60,9 @@ pt-BR: add_new: Adicionar grupo LDAP sincronizado destroy: title: Remover grupo sincronizado %{name} + heading: Deseja remover o grupo sincronizado %{name}? confirmation: Se você continuar, o grupo sincronizado %{name} e todos os %{users_count} usuários sincronizados por meio dele serão removidos. - info: 'Nota: O próprio grupo OpenProject e membros adicionados fora desta sincronização LDAP não serão removidos.' - verification_html: Digite o nome do grupo %{name} para confirmar a exclusão. + info: O próprio grupo OpenProject e os membros adicionados fora desta sincronização LDAP não serão removidos. help_text_html: | Este módulo permite que você configure uma sincronização entre os grupos LDAP e OpenProject. Depende dos grupos LDAP que precisam usar o atributo groupOfNames / memberOf para trabalhar com o OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/pt-PT.yml b/modules/ldap_groups/config/locales/crowdin/pt-PT.yml index 4e3c538f961..87accc91953 100644 --- a/modules/ldap_groups/config/locales/crowdin/pt-PT.yml +++ b/modules/ldap_groups/config/locales/crowdin/pt-PT.yml @@ -46,6 +46,7 @@ pt-PT: zero: Não foram encontrados grupos pelo filtro destroy: title: Remover filtro sincronizado %{name} + heading: Remove synchronized filter %{name}? confirmation: Se continuar, o filtro sincronizado %{name} e todos os grupos %{groups_count} criados por meio dele serão removidos. removed_groups: 'Aviso: Isto removerá os seguintes grupos do OpenProject e removê-los de todos os projetos!' verification_html: Insira o nome do filtro %{name} para verificar a eliminação. @@ -59,9 +60,9 @@ pt-PT: add_new: Adicionar grupo LDAP sincronizado destroy: title: Remover grupo sincronizado %{name} + heading: Remove synchronized group %{name}? confirmation: Se continuar, o grupo sincronizado %{name} e todos os utilizadores sincronizados com %{users_count} serão removidos. - info: 'Nota: O próprio grupo OpenProject e membros adicionados fora desta sincronização LDAP não serão removidos.' - verification_html: Insira o nome do grupo %{name} para verificar a eliminação. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | Este módulo permite-lhe configurar uma sincronização entre os grupos LDAP e OpenProject. Está dependente dos grupos LDAP que precisam de utilizar o atributo groupOfNames / memberOf para trabalhar com o OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/ro.yml b/modules/ldap_groups/config/locales/crowdin/ro.yml index 8afd37a51bb..ff0d5a4f99a 100644 --- a/modules/ldap_groups/config/locales/crowdin/ro.yml +++ b/modules/ldap_groups/config/locales/crowdin/ro.yml @@ -46,6 +46,7 @@ ro: zero: Nu au fost găsite grupuri prin filtru destroy: title: Elimină filtrul sincronizat %{name} + heading: Remove synchronized filter %{name}? confirmation: Dacă continuați, filtrul sincronizat %{name} și toate grupurile %{groups_count} create prin intermediul acestuia vor fi eliminate. removed_groups: 'Avertisment: Acest lucru va elimina următoarele grupuri din OpenProject și le va elimina din toate proiectele!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ ro: add_new: Adaugă grup LDAP sincronizat destroy: title: Îndepărtați grupul sincronizat %{name} + heading: Remove synchronized group %{name}? confirmation: Dacă, continui, grupul sincronizat %{name} și toți utilizatorii %{users_count} sincronizați prin intermediul acestuia vor fi eliminați. - info: 'Notă: Grupul OpenProject în sine și membrii adăugați în afara acestei sincronizări LDAP nu vor fi eliminați.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | Acest modul vă permite să configurați o sincronizare între grupurile LDAP și OpenProject. Depinde de grupurile LDAP trebuie să utilizeze setul de atribute groupOfNames / memberOf pentru a funcționa cu OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/ru.yml b/modules/ldap_groups/config/locales/crowdin/ru.yml index 09c07c8d0d7..04d6fa04292 100644 --- a/modules/ldap_groups/config/locales/crowdin/ru.yml +++ b/modules/ldap_groups/config/locales/crowdin/ru.yml @@ -46,6 +46,7 @@ ru: zero: Группы не были найдены фильтром destroy: title: Удалить синхронизированный фильтр %{name} + heading: Remove synchronized filter %{name}? confirmation: Если вы продолжите, синхронизированный фильтр %{name} и все группы %{groups_count} , созданные через него, будут удалены. removed_groups: 'Предупреждение: Это удалит следующие группы из OpenProject и удалит их из всех проектов!' verification_html: Введите имя фильтра %{name} для проверки удаления. @@ -59,9 +60,9 @@ ru: add_new: Добавить синхронизированную LDAP-группу destroy: title: Удалить синхронизированную группу %{name} + heading: Remove synchronized group %{name}? confirmation: Если продолжите, синхронизированная группа %{name} и все %{users_count} пользователи синхронизированые через нее будут удалены. - info: 'Примечание: сама группа OpenProject и члены, добавленные за пределами этой синхронизации LDAP, удалены не будут.' - verification_html: Введите имя группы %{name} для проверки удаления. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | Этот модуль позволяет настроить синхронизацию между группами LDAP и OpenProject. Для работы с OpenProject в зависимости от групп LDAP необходимо использовать набор атрибутов groupOfNames / memberOf. diff --git a/modules/ldap_groups/config/locales/crowdin/rw.yml b/modules/ldap_groups/config/locales/crowdin/rw.yml index 347fe7a66da..37f005c5294 100644 --- a/modules/ldap_groups/config/locales/crowdin/rw.yml +++ b/modules/ldap_groups/config/locales/crowdin/rw.yml @@ -46,6 +46,7 @@ rw: zero: No groups were found by the filter destroy: title: Remove synchronized filter %{name} + heading: Remove synchronized filter %{name}? confirmation: If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ rw: add_new: Add synchronized LDAP group destroy: title: Remove synchronized group %{name} + heading: Remove synchronized group %{name}? confirmation: If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed. - info: 'Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/si.yml b/modules/ldap_groups/config/locales/crowdin/si.yml index 2350feaaf6d..38d5a25bd5f 100644 --- a/modules/ldap_groups/config/locales/crowdin/si.yml +++ b/modules/ldap_groups/config/locales/crowdin/si.yml @@ -46,6 +46,7 @@ si: zero: No groups were found by the filter destroy: title: Remove synchronized filter %{name} + heading: Remove synchronized filter %{name}? confirmation: If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ si: add_new: Add synchronized LDAP group destroy: title: Remove synchronized group %{name} + heading: Remove synchronized group %{name}? confirmation: If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed. - info: 'Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/sk.yml b/modules/ldap_groups/config/locales/crowdin/sk.yml index 61b014fab41..ef8589d0277 100644 --- a/modules/ldap_groups/config/locales/crowdin/sk.yml +++ b/modules/ldap_groups/config/locales/crowdin/sk.yml @@ -46,6 +46,7 @@ sk: zero: No groups were found by the filter destroy: title: Remove synchronized filter %{name} + heading: Remove synchronized filter %{name}? confirmation: If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ sk: add_new: Add synchronized LDAP group destroy: title: Remove synchronized group %{name} + heading: Remove synchronized group %{name}? confirmation: If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed. - info: 'Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/sl.yml b/modules/ldap_groups/config/locales/crowdin/sl.yml index e9265d53903..72185f1d581 100644 --- a/modules/ldap_groups/config/locales/crowdin/sl.yml +++ b/modules/ldap_groups/config/locales/crowdin/sl.yml @@ -52,6 +52,7 @@ sl: zero: Filter ni našel nobenih skupin destroy: title: Odstrani sinhronizirani filter %{name} + heading: Remove synchronized filter %{name}? confirmation: 'Če nadaljujete, bo sinhronizirani filter %{name} in vse skupine %{groups_count}, ustvarjene prek njega, odstranjene. ' @@ -69,9 +70,9 @@ sl: add_new: dodaj sinhronizirano LDAP skupino destroy: title: Odstrani sinhronizirano skupino %{name} + heading: Remove synchronized group %{name}? confirmation: Če nadaljujete, bo sinhronizirana skupina %{name} in vsi %{users_count} uporabniki, ki so bili sinhronizirani prek nje, odstranjeni. - info: 'Opozorilo: Sama skupina OpenProject in člani, dodani zunaj te sinhronizacije LDAP, ne bodo odstranjeni.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | Ta modul vam omogoča, da nastavite sinhronizacijo med skupinama LDAP in OpenProject. Odvisno od tega, ali morajo skupine LDAP uporabiti atributskupinaOdIme / članOd , ki deluje za OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/sr.yml b/modules/ldap_groups/config/locales/crowdin/sr.yml index ee8926660d4..dfbfdcfc99d 100644 --- a/modules/ldap_groups/config/locales/crowdin/sr.yml +++ b/modules/ldap_groups/config/locales/crowdin/sr.yml @@ -46,6 +46,7 @@ sr: zero: No groups were found by the filter destroy: title: Remove synchronized filter %{name} + heading: Remove synchronized filter %{name}? confirmation: If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ sr: add_new: Add synchronized LDAP group destroy: title: Remove synchronized group %{name} + heading: Remove synchronized group %{name}? confirmation: If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed. - info: 'Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/sv.yml b/modules/ldap_groups/config/locales/crowdin/sv.yml index 3c91eb1b7d8..ac075789252 100644 --- a/modules/ldap_groups/config/locales/crowdin/sv.yml +++ b/modules/ldap_groups/config/locales/crowdin/sv.yml @@ -46,6 +46,7 @@ sv: zero: Inga grupper hittades av filtret destroy: title: Ta bort synkroniserat filter %{name} + heading: Remove synchronized filter %{name}? confirmation: Om du fortsätter kommer det synkroniserade filtret %{name} och alla grupper %{groups_count} som skapats genom det att tas bort. removed_groups: 'Varning: Detta kommer att ta bort följande grupper från OpenProject och ta bort den från alla projekt!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ sv: add_new: Lägg till synkroniserad LDAP-grupp destroy: title: Ta bort synkroniserad grupp %{name} + heading: Remove synchronized group %{name}? confirmation: Om du fortsätter kommer den synkroniserade gruppen %{name} och alla %{users_count} användare som synkroniserats genom den att tas bort. - info: 'Obs: OpenProject-gruppen själv och medlemmar som lagts till utanför denna LDAP-synkronisering kommer inte att tas bort.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | Modulen låter dig konfigurera en synkronisering mellan LDAP och OpenProject-grupper. Det beror på LDAP-grupper måste använda groupOfNames / memberOf attributset för att arbeta med OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/th.yml b/modules/ldap_groups/config/locales/crowdin/th.yml index 28e7d190f36..874e5c5eddc 100644 --- a/modules/ldap_groups/config/locales/crowdin/th.yml +++ b/modules/ldap_groups/config/locales/crowdin/th.yml @@ -46,6 +46,7 @@ th: zero: No groups were found by the filter destroy: title: Remove synchronized filter %{name} + heading: Remove synchronized filter %{name}? confirmation: If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ th: add_new: Add synchronized LDAP group destroy: title: Remove synchronized group %{name} + heading: Remove synchronized group %{name}? confirmation: If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed. - info: 'Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/tr.yml b/modules/ldap_groups/config/locales/crowdin/tr.yml index 121389b57ee..376b52fa730 100644 --- a/modules/ldap_groups/config/locales/crowdin/tr.yml +++ b/modules/ldap_groups/config/locales/crowdin/tr.yml @@ -46,6 +46,7 @@ tr: zero: Filtrede grup bulunamadı destroy: title: "%{name} senkronize filtresini kaldır" + heading: Remove synchronized filter %{name}? confirmation: Devam ederseniz, senkronize edilmiş %{name} filtresi ve bu kanaldan oluşturulan %{groups_count} tüm gruplar kaldırılacak. removed_groups: 'Uyarı: Bu işlem aşağıdaki grupları OpenProject''ten kaldıracak ve tüm projelerden kaldıracaktır!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ tr: add_new: Senkronize LDAP grubu ekle destroy: title: "%{name} adlı senkronize grubu kaldır" + heading: Remove synchronized group %{name}? confirmation: Devam ederseniz, %{name}} ile senkronize edilmiş grup ve içinden senkronize olan tüm %{users_count} kullanıcısı kaldırılacak. - info: 'Not: OpenProject grubunun kendisi ve bu LDAP senkronizasyonunun dışına eklenen üyeler kaldırılmaz.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | Bu modül, LDAP ve OpenProject grupları arasında bir senkronizasyon ayarlamanıza izin verir. Bu, LDAP gruplarının OpenProject ile çalışmak için ayarlanmış groupOfNames / memberOf özelliğini kullanması gerektiğine bağlıdır. diff --git a/modules/ldap_groups/config/locales/crowdin/uk.yml b/modules/ldap_groups/config/locales/crowdin/uk.yml index 9153740f727..23a31a7a26d 100644 --- a/modules/ldap_groups/config/locales/crowdin/uk.yml +++ b/modules/ldap_groups/config/locales/crowdin/uk.yml @@ -46,6 +46,7 @@ uk: zero: Груп за фільтром не знайдено destroy: title: Вилучити синхронізований фільтр %{name} + heading: Remove synchronized filter %{name}? confirmation: Якщо ви продовжите, синхронізований фільтр %{name} і всі групи (%{groups_count}), створені через нього, буде вилучено. removed_groups: Увага! Це призведе до вилучення наведених нижче груп з OpenProject і з усіх проєктів! verification_html: Введіть назву фільтра «%{name}», щоб підтвердити видалення. @@ -59,9 +60,9 @@ uk: add_new: Додати синхронізовану групу LDAP destroy: title: Вилучити синхронізовану групу %{name} + heading: Remove synchronized group %{name}? confirmation: Якщо ви продовжите, синхронізовану групу %{name} і всіх користувачі (%{users_count}), синхронізованих через неї, буде вилучено. - info: 'Примітка: групу OpenProject і учасників, доданих з-поза меж цієї синхронізації LDAP, не буде вилучено.' - verification_html: Введіть назву групи %{name}, щоб підтвердити видалення. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | Цей модуль дає змогу налаштувати синхронізацію між групами LDAP і OpenProject. Це залежить від того, чи має LDAP-група використовувати набір атрибутів groupOfNames / memberOf для роботи з OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/uz.yml b/modules/ldap_groups/config/locales/crowdin/uz.yml index 43821d4fe06..847304c9276 100644 --- a/modules/ldap_groups/config/locales/crowdin/uz.yml +++ b/modules/ldap_groups/config/locales/crowdin/uz.yml @@ -46,6 +46,7 @@ uz: zero: No groups were found by the filter destroy: title: Remove synchronized filter %{name} + heading: Remove synchronized filter %{name}? confirmation: If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed. removed_groups: 'Warning: This will remove the following groups from OpenProject and remove it from all projects!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ uz: add_new: Add synchronized LDAP group destroy: title: Remove synchronized group %{name} + heading: Remove synchronized group %{name}? confirmation: If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed. - info: 'Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/vi.yml b/modules/ldap_groups/config/locales/crowdin/vi.yml index 231fc4080e0..f97bfea04b9 100644 --- a/modules/ldap_groups/config/locales/crowdin/vi.yml +++ b/modules/ldap_groups/config/locales/crowdin/vi.yml @@ -46,6 +46,7 @@ vi: zero: Không có nhóm nào được bộ lọc tìm thấy destroy: title: Xóa bộ lọc đã đồng bộ hóa %{name} + heading: Remove synchronized filter %{name}? confirmation: Nếu bạn tiếp tục, bộ lọc đã đồng bộ hóa %{name} và tất cả các nhóm %{groups_count} được tạo thông qua bộ lọc đó sẽ bị xóa. removed_groups: 'Cảnh báo: Thao tác này sẽ xóa các nhóm sau khỏi OpenProject và xóa nó khỏi tất cả các dự án!' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ vi: add_new: Thêm nhóm LDAP được đồng bộ hóa destroy: title: Xóa nhóm đã đồng bộ hóa %{name} + heading: Remove synchronized group %{name}? confirmation: Nếu bạn tiếp tục, nhóm được đồng bộ hóa %{name} và tất cả người dùng %{users_count} được đồng bộ hóa thông qua nhóm đó sẽ bị xóa. - info: 'Lưu ý: Bản thân nhóm OpenProject và các thành viên được thêm vào bên ngoài quá trình đồng bộ hóa LDAP này sẽ không bị xóa.' - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | Mô-đun này cho phép bạn thiết lập đồng bộ hóa giữa các nhóm LDAP và OpenProject. Nó phụ thuộc vào các nhóm LDAP cần sử dụng thuộc tính groupOfNames / memberOf để hoạt động với OpenProject. diff --git a/modules/ldap_groups/config/locales/crowdin/zh-CN.yml b/modules/ldap_groups/config/locales/crowdin/zh-CN.yml index c91bcd32090..348082839c1 100644 --- a/modules/ldap_groups/config/locales/crowdin/zh-CN.yml +++ b/modules/ldap_groups/config/locales/crowdin/zh-CN.yml @@ -46,9 +46,10 @@ zh-CN: zero: 筛选器未找到组 destroy: title: 移除同步的筛选器 %{name} + heading: 移除同步的筛选器 %{name}? confirmation: 如果您继续,将移除同步的筛选器 %{name} 和通过该筛选器创建的全部 %{groups_count} 个组。 removed_groups: 警告:这将从 OpenProject 中移除以下组并将该筛选器从所有项目中移除! - verification_html: Enter the filter name %{name} to verify the deletion. + verification_html: 输入筛选器名称 %{name} 以验证删除。 form: group_name_attribute_text: 输入用于设置 OpenProject 组名称的 LDAP 组的属性。 filter_string_text: 输入 RFC4515 LDAP 筛选器,该筛选器将返回 LDAP 中的组以与 OpenProject 同步。 @@ -59,9 +60,9 @@ zh-CN: add_new: 添加同步的 LDAP 组 destroy: title: 移除同步组 %{name} + heading: 移除同步的组 %{name}? confirmation: 如果您继续,将移除同步组 %{name} 和通过该组同步的全部 %{users_count} 个用户。 - info: 注意:OpenProject 组本身以及在 LDAP 同步之外添加的成员将不会被移除。 - verification_html: Enter the group's name %{name} to verify the deletion. + info: OpenProject 组本身以及在此 LDAP 同步之外添加的成员将不会被移除。 help_text_html: | 此模块允许您在 LDAP 与 OpenProject 组之间设置同步。 它要求 LDAP 组使用 groupOfNames / memberOf 属性集才能与 OpenProject 一起使用。 diff --git a/modules/ldap_groups/config/locales/crowdin/zh-TW.yml b/modules/ldap_groups/config/locales/crowdin/zh-TW.yml index 9090bc94dba..874edfa368f 100644 --- a/modules/ldap_groups/config/locales/crowdin/zh-TW.yml +++ b/modules/ldap_groups/config/locales/crowdin/zh-TW.yml @@ -46,6 +46,7 @@ zh-TW: zero: 篩選條件不到任何群組 destroy: title: 移除同步篩選條件 %{name} + heading: Remove synchronized filter %{name}? confirmation: 如果繼續,本同步篩選 %{name} 和藉此創建的群組 %{groups_count} 將會刪除 removed_groups: '警告: 將從OpenProject和專案中移除以下群組' verification_html: Enter the filter name %{name} to verify the deletion. @@ -59,9 +60,9 @@ zh-TW: add_new: 新增 LDAP 同步群組 destroy: title: 移除同步群組 %{name} + heading: Remove synchronized group %{name}? confirmation: 如繼續,將移除同步的群組 %{name} 和所有透過該群組同步的全部 %{users_count} 個用戶。 - info: 注意:OpenProject 群組本身以及在 LDAP 同步之外添加的成員將不會被移除。 - verification_html: Enter the group's name %{name} to verify the deletion. + info: The OpenProject group itself and members added outside this LDAP synchronization will not be removed. help_text_html: | 此模組允許您在 LDAP 與 OpenProject 群組之間設置同步。 它要求 LDAP 群組使用 groupOfNames / memberOf 屬性集才能與 OpenProject 一起使用。 diff --git a/modules/ldap_groups/config/locales/en.yml b/modules/ldap_groups/config/locales/en.yml index fce21491f55..374f72a199e 100644 --- a/modules/ldap_groups/config/locales/en.yml +++ b/modules/ldap_groups/config/locales/en.yml @@ -46,6 +46,7 @@ en: zero: "No groups were found by the filter" destroy: title: 'Remove synchronized filter %{name}' + heading: 'Remove synchronized filter %{name}?' confirmation: "If you continue, the synchronized filter %{name} and all groups %{groups_count} created through it will be removed." removed_groups: "Warning: This will remove the following groups from OpenProject and remove it from all projects!" verification_html: "Enter the filter name %{name} to verify the deletion." @@ -61,9 +62,9 @@ en: add_new: 'Add synchronized LDAP group' destroy: title: 'Remove synchronized group %{name}' + heading: 'Remove synchronized group %{name}?' confirmation: "If you continue, the synchronized group %{name} and all %{users_count} users synchronized through it will be removed." - info: "Note: The OpenProject group itself and members added outside this LDAP synchronization will not be removed." - verification_html: "Enter the group's name %{name} to verify the deletion." + info: "The OpenProject group itself and members added outside this LDAP synchronization will not be removed." help_text_html: | This module allows you to set up a synchronization between LDAP and OpenProject groups. It depends on LDAP groups need to use the groupOfNames / memberOf attribute set to be working with OpenProject. diff --git a/modules/ldap_groups/spec/controllers/synchronized_groups_controller_spec.rb b/modules/ldap_groups/spec/controllers/synchronized_groups_controller_spec.rb index 0ed0521fe7b..573ede10186 100644 --- a/modules/ldap_groups/spec/controllers/synchronized_groups_controller_spec.rb +++ b/modules/ldap_groups/spec/controllers/synchronized_groups_controller_spec.rb @@ -170,15 +170,16 @@ RSpec.describe LdapGroups::SynchronizedGroupsController, with_ee: %i[ldap_groups let!(:group) { build_stubbed(:ldap_synchronized_group) } let(:id) { "foo" } - it "renders the page" do + it "renders the dialog" do expect(LdapGroups::SynchronizedGroup) .to receive(:find) .with("foo") .and_return(group) - get :destroy_info, params: { ldap_group_id: id } + get :destroy_info, params: { ldap_group_id: id }, format: :turbo_stream expect(response).to be_successful - expect(response).to render_template "destroy_info" + expect(response).to have_turbo_stream action: "dialog", + target: "ldap-groups-synchronized-groups-destroy-dialog-component" end end end diff --git a/modules/ldap_groups/spec/features/administration_spec.rb b/modules/ldap_groups/spec/features/administration_spec.rb index 656c8eb7c27..d857f193c71 100644 --- a/modules/ldap_groups/spec/features/administration_spec.rb +++ b/modules/ldap_groups/spec/features/administration_spec.rb @@ -73,10 +73,10 @@ RSpec.describe "LDAP group sync administration spec", :js do find(".buttons a", text: "Delete").click SeleniumHubWaiter.wait - find(".danger-zone--verification input").set "cn=bar,ou=groups,dc=example,dc=com" + check "I understand that this deletion cannot be reversed" + click_on "Delete permanently" SeleniumHubWaiter.wait - click_on "Delete" expect_flash(message: I18n.t(:notice_successful_delete)) expect(page).to have_css ".generic-table--empty-row" diff --git a/modules/meeting/app/components/meeting_agenda_items/item_component/show_component.rb b/modules/meeting/app/components/meeting_agenda_items/item_component/show_component.rb index bdf068cd992..c32e2e19b9a 100644 --- a/modules/meeting/app/components/meeting_agenda_items/item_component/show_component.rb +++ b/modules/meeting/app/components/meeting_agenda_items/item_component/show_component.rb @@ -233,7 +233,7 @@ module MeetingAgendaItems def next_meeting_action_item(menu, label:, action:, icon:) return unless has_next_occurrence? - from_time = @meeting.start_time.past? ? Time.current : @meeting.start_time + from_time = @meeting.start_time.past? ? Time.current : @meeting.scheduled_meeting.start_time result = @series.first_non_cancelled_occurrence(from_time:) return if result.nil? diff --git a/modules/meeting/app/components/meetings/participants/box_row_component.html.erb b/modules/meeting/app/components/meetings/participants/box_row_component.html.erb index 21e1271b731..83d978a7cef 100644 --- a/modules/meeting/app/components/meetings/participants/box_row_component.html.erb +++ b/modules/meeting/app/components/meetings/participants/box_row_component.html.erb @@ -58,10 +58,7 @@ href: project_meeting_participant_path(@meeting.project, @meeting, @participant), icon: :x, aria: { label: I18n.t("meeting.participants.label.remove_participant") }, - data: { - turbo_method: :delete, - test_selector: "remove_button_#{@participant.user_id}" - } + data: remove_button_data_attributes ) ) end diff --git a/modules/meeting/app/components/meetings/participants/box_row_component.rb b/modules/meeting/app/components/meetings/participants/box_row_component.rb index 26c7015871e..eb87256a795 100644 --- a/modules/meeting/app/components/meetings/participants/box_row_component.rb +++ b/modules/meeting/app/components/meetings/participants/box_row_component.rb @@ -45,5 +45,15 @@ module Meetings def wrapper_uniq_by @participant.id end + + private + + def remove_button_data_attributes + { + turbo_method: :delete, + test_selector: "remove_button_#{@participant.user_id}", + "meetings--participants--update-occurrence-participants-target": (@meeting.series_template? ? "removeButton" : nil) + } + end end end diff --git a/modules/meeting/app/components/meetings/participants/manage_participants_dialog.html.erb b/modules/meeting/app/components/meetings/participants/manage_participants_dialog.html.erb index fa6d5dd8fc4..db0a0df9828 100644 --- a/modules/meeting/app/components/meetings/participants/manage_participants_dialog.html.erb +++ b/modules/meeting/app/components/meetings/participants/manage_participants_dialog.html.erb @@ -5,7 +5,7 @@ id: DIALOG_ID, size: :xlarge, title: I18n.t("meeting.participants.label.manage_participants"), - data: { "keep-open-on-submit": true } + data: { "keep-open-on-submit": true, controller: "meetings--participants--update-occurrence-participants" } ) ) do |d| d.with_header(variant: :large) diff --git a/modules/meeting/app/controllers/meeting_participants_controller.rb b/modules/meeting/app/controllers/meeting_participants_controller.rb index b670f6c6089..f62795210ab 100644 --- a/modules/meeting/app/controllers/meeting_participants_controller.rb +++ b/modules/meeting/app/controllers/meeting_participants_controller.rb @@ -73,11 +73,16 @@ class MeetingParticipantsController < ApplicationController end def destroy + user_id = @participant.user_id call = MeetingParticipants::DeleteService .new(user: User.current, model: @participant) .call if call.success? + if @meeting.series_template? && params[:apply_to_upcoming] == "1" + remove_from_upcoming_occurrences(user_id) + end + update_add_user_form_component_via_turbo_stream update_list_component_via_turbo_stream update_sidebar_participants_component_via_turbo_stream(meeting: @meeting) @@ -105,11 +110,38 @@ class MeetingParticipantsController < ApplicationController def create_new_participants(user_ids) user_ids.each { |user_id| create_new_participant(user_id) } + if @meeting.series_template? && params.dig(:meeting_participant, :apply_to_upcoming) == "1" + add_to_upcoming_occurrences(user_ids) + end + update_list_component_via_turbo_stream update_add_user_form_component_via_turbo_stream update_sidebar_participants_component_via_turbo_stream(meeting: @meeting) end + def remove_from_upcoming_occurrences(user_id) + @meeting.recurring_meeting.instantiated_meetings.upcoming.each do |meeting| + participant = meeting.participants.find_by(user_id:) + next unless participant + + MeetingParticipants::DeleteService + .new(user: User.current, model: participant) + .call + end + end + + def add_to_upcoming_occurrences(user_ids) + @meeting.recurring_meeting.instantiated_meetings.upcoming.each do |meeting| + user_ids.each do |user_id| + next if meeting.participants.exists?(user_id:) + + MeetingParticipants::CreateService + .new(user: User.current) + .call(meeting:, user_id:, invited: true, attended: false) + end + end + end + def create_new_participant(user_id) MeetingParticipants::CreateService .new(user: User.current) diff --git a/modules/meeting/app/forms/meeting/participant.rb b/modules/meeting/app/forms/meeting/participant.rb index e43f2e6ce6f..5b68f1abe04 100644 --- a/modules/meeting/app/forms/meeting/participant.rb +++ b/modules/meeting/app/forms/meeting/participant.rb @@ -54,6 +54,15 @@ class Meeting::Participant < ApplicationForm } } ) + + if meeting.series_template? + participant_form.check_box( + name: :apply_to_upcoming, + label: I18n.t("meeting.participants.label.apply_to_upcoming_meetings"), + checked: true, + data: { "meetings--participants--update-occurrence-participants-target": "controlCheckbox" } + ) + end end private diff --git a/modules/meeting/app/models/meeting.rb b/modules/meeting/app/models/meeting.rb index c69486ff5ca..bdea4584913 100644 --- a/modules/meeting/app/models/meeting.rb +++ b/modules/meeting/app/models/meeting.rb @@ -306,6 +306,7 @@ class Meeting < ApplicationRecord def send_emails? return false if onetime_template? return false if template? && recurring_meeting.scheduled_meetings.none? + return false if closed? persisted? && notify? end diff --git a/modules/meeting/config/locales/crowdin/af.yml b/modules/meeting/config/locales/crowdin/af.yml index 3a2f3375f3a..d54902b5366 100644 --- a/modules/meeting/config/locales/crowdin/af.yml +++ b/modules/meeting/config/locales/crowdin/af.yml @@ -211,6 +211,7 @@ af: manage_participants: Manage participants no_participants: No participants show_all: Show all + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/ar.yml b/modules/meeting/config/locales/crowdin/ar.yml index 50125b9f62a..c767a4b4cf3 100644 --- a/modules/meeting/config/locales/crowdin/ar.yml +++ b/modules/meeting/config/locales/crowdin/ar.yml @@ -231,6 +231,7 @@ ar: manage_participants: Manage participants no_participants: No participants show_all: إظهار الجميع + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/az.yml b/modules/meeting/config/locales/crowdin/az.yml index 0cdf9d227a0..994c68385f8 100644 --- a/modules/meeting/config/locales/crowdin/az.yml +++ b/modules/meeting/config/locales/crowdin/az.yml @@ -211,6 +211,7 @@ az: manage_participants: Manage participants no_participants: No participants show_all: Show all + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/be.yml b/modules/meeting/config/locales/crowdin/be.yml index 4e14b44cc2a..cf66f6bdce0 100644 --- a/modules/meeting/config/locales/crowdin/be.yml +++ b/modules/meeting/config/locales/crowdin/be.yml @@ -221,6 +221,7 @@ be: manage_participants: Manage participants no_participants: No participants show_all: Show all + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/bg.yml b/modules/meeting/config/locales/crowdin/bg.yml index 0f494d5cafc..229e9aa1c68 100644 --- a/modules/meeting/config/locales/crowdin/bg.yml +++ b/modules/meeting/config/locales/crowdin/bg.yml @@ -211,6 +211,7 @@ bg: manage_participants: Управление на участниците no_participants: Няма участници show_all: Показване на всичко + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/ca.yml b/modules/meeting/config/locales/crowdin/ca.yml index 8e9f3b41340..ee51b2b3e5d 100644 --- a/modules/meeting/config/locales/crowdin/ca.yml +++ b/modules/meeting/config/locales/crowdin/ca.yml @@ -211,6 +211,7 @@ ca: manage_participants: Gestiona els participants no_participants: No hi ha participants show_all: Mostrar tots + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/ckb-IR.yml b/modules/meeting/config/locales/crowdin/ckb-IR.yml index a0e612f2912..15e5c950afe 100644 --- a/modules/meeting/config/locales/crowdin/ckb-IR.yml +++ b/modules/meeting/config/locales/crowdin/ckb-IR.yml @@ -211,6 +211,7 @@ ckb-IR: manage_participants: Manage participants no_participants: No participants show_all: Show all + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/cs.yml b/modules/meeting/config/locales/crowdin/cs.yml index a00b518786d..9da0ea5b15f 100644 --- a/modules/meeting/config/locales/crowdin/cs.yml +++ b/modules/meeting/config/locales/crowdin/cs.yml @@ -223,6 +223,7 @@ cs: manage_participants: Spravovat účastníky no_participants: Nikdo tu není show_all: Zobrazit vše + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: Tito účastníci budou automaticky pozváni na všechna budoucí zasedání po jejich vytvoření. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/da.yml b/modules/meeting/config/locales/crowdin/da.yml index fc2ae134d19..62e459ae38f 100644 --- a/modules/meeting/config/locales/crowdin/da.yml +++ b/modules/meeting/config/locales/crowdin/da.yml @@ -211,6 +211,7 @@ da: manage_participants: Manage participants no_participants: No participants show_all: Vis alt + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/de.yml b/modules/meeting/config/locales/crowdin/de.yml index df7a6e7bd30..76425103e74 100644 --- a/modules/meeting/config/locales/crowdin/de.yml +++ b/modules/meeting/config/locales/crowdin/de.yml @@ -211,6 +211,7 @@ de: manage_participants: Teilnehmer verwalten no_participants: Keine Teilnehmer show_all: Alle anzeigen + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: Diese Teilnehmer werden automatisch zu allen zukünftigen Besprechungen eingeladen, sobald diese erstellt werden. manage_participants: Suchen Sie nach Projektmitgliedern, um sie als Teilnehmer zu dieser Besprechung hinzuzufügen. diff --git a/modules/meeting/config/locales/crowdin/el.yml b/modules/meeting/config/locales/crowdin/el.yml index c00ee4a3c69..06f59c1e3a9 100644 --- a/modules/meeting/config/locales/crowdin/el.yml +++ b/modules/meeting/config/locales/crowdin/el.yml @@ -211,6 +211,7 @@ el: manage_participants: Διαχείριση συμμετεχόντων no_participants: Δεν υπάρχουν συμμετέχοντες show_all: Εμφάνιση όλων + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/eo.yml b/modules/meeting/config/locales/crowdin/eo.yml index 74af61e13f3..b94e0d1e098 100644 --- a/modules/meeting/config/locales/crowdin/eo.yml +++ b/modules/meeting/config/locales/crowdin/eo.yml @@ -211,6 +211,7 @@ eo: manage_participants: Manage participants no_participants: No participants show_all: Show all + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/es.yml b/modules/meeting/config/locales/crowdin/es.yml index 436b06d1636..1eb09022c33 100644 --- a/modules/meeting/config/locales/crowdin/es.yml +++ b/modules/meeting/config/locales/crowdin/es.yml @@ -189,7 +189,7 @@ es: label_notify: Enviar para revisión label_icalendar: Enviar iCalendar label_icalendar_download: Descargar evento iCalendar - label_view_meeting: View meeting + label_view_meeting: Ver reunión label_view_meeting_series: Ver serie de reuniones label_meeting_series: Serie de reuniones label_version: Versión @@ -198,8 +198,8 @@ es: label_subscribe_icalendar: Suscribirse al calendario caption_meeting_template_select: Seleccione una plantilla para copiar automáticamente sus puntos del orden del día caption_template_project_select: Seleccione el proyecto en el que desea crear esta plantilla de reunión - placeholder_meeting_template_select_project_first: Select a project first - placeholder_meeting_template_no_templates_for_project: No templates available for this project + placeholder_meeting_template_select_project_first: Primero selecciona un proyecto + placeholder_meeting_template_no_templates_for_project: No hay plantillas disponibles para este proyecto meeting: participants: label: @@ -211,6 +211,7 @@ es: manage_participants: Gestionar participantes no_participants: Sin participantes show_all: Mostrar todo + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: Estos participantes serán invitados automáticamente a todas las reuniones futuras a medida que se vayan creando. manage_participants: Busque y añada miembros del proyecto como participantes en esta reunión. @@ -219,8 +220,8 @@ es: heading: Sin participantes description: Aún no hay participantes. attachments: - onetime_template: These attached files will be included in all future meetings using this template. - series_template: These attached files will be included in all future meetings in the series. + onetime_template: Estos archivos adjuntos se incluirán en todas las reuniones futuras en las que se utilice esta plantilla. + series_template: Estos archivos adjuntos se incluirán en todas las reuniones futuras de la serie. text: Los archivos adjuntos están a disposición de todos los participantes en la reunión. También puede arrastrarlos y soltarlos en las notas de los puntos del orden del día. copy: title: Copiar reunión %{title} diff --git a/modules/meeting/config/locales/crowdin/et.yml b/modules/meeting/config/locales/crowdin/et.yml index 74f30ec97a6..37089bc1522 100644 --- a/modules/meeting/config/locales/crowdin/et.yml +++ b/modules/meeting/config/locales/crowdin/et.yml @@ -211,6 +211,7 @@ et: manage_participants: Manage participants no_participants: No participants show_all: Näita kõiki + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/eu.yml b/modules/meeting/config/locales/crowdin/eu.yml index b087ba885d3..426b4f06ab8 100644 --- a/modules/meeting/config/locales/crowdin/eu.yml +++ b/modules/meeting/config/locales/crowdin/eu.yml @@ -211,6 +211,7 @@ eu: manage_participants: Manage participants no_participants: No participants show_all: Show all + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/fa.yml b/modules/meeting/config/locales/crowdin/fa.yml index 288c768169f..744da4a2698 100644 --- a/modules/meeting/config/locales/crowdin/fa.yml +++ b/modules/meeting/config/locales/crowdin/fa.yml @@ -211,6 +211,7 @@ fa: manage_participants: Manage participants no_participants: No participants show_all: Show all + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/fi.yml b/modules/meeting/config/locales/crowdin/fi.yml index 03aa1ac1d78..60f7a40c13e 100644 --- a/modules/meeting/config/locales/crowdin/fi.yml +++ b/modules/meeting/config/locales/crowdin/fi.yml @@ -211,6 +211,7 @@ fi: manage_participants: Manage participants no_participants: No participants show_all: Näytä kaikki + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/fil.yml b/modules/meeting/config/locales/crowdin/fil.yml index d80942705bc..a9582a6a2d3 100644 --- a/modules/meeting/config/locales/crowdin/fil.yml +++ b/modules/meeting/config/locales/crowdin/fil.yml @@ -211,6 +211,7 @@ fil: manage_participants: Manage participants no_participants: No participants show_all: Ipakita ang lahat + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/fr.yml b/modules/meeting/config/locales/crowdin/fr.yml index 76973318bdb..5bf664e389a 100644 --- a/modules/meeting/config/locales/crowdin/fr.yml +++ b/modules/meeting/config/locales/crowdin/fr.yml @@ -198,8 +198,8 @@ fr: label_subscribe_icalendar: S'abonner au calendrier caption_meeting_template_select: Sélectionnez un modèle pour copier automatiquement ses points de l'ordre du jour caption_template_project_select: Veuillez sélectionner le projet dans lequel vous souhaitez créer ce modèle de réunion - placeholder_meeting_template_select_project_first: Select a project first - placeholder_meeting_template_no_templates_for_project: No templates available for this project + placeholder_meeting_template_select_project_first: Sélectionnez d'abord un projet + placeholder_meeting_template_no_templates_for_project: Aucun modèle n'est disponible pour ce projet meeting: participants: label: @@ -211,6 +211,7 @@ fr: manage_participants: Gérer les participants no_participants: Aucun participant show_all: Afficher tout + apply_to_upcoming_meetings: Appliquez ces changements à toutes les prochaines réunions de cette série text: template: Ces participants seront automatiquement invités à toutes les réunions futures au fur et à mesure qu'elles seront créées. manage_participants: Recherchez et ajoutez des membres du projet en tant que participants à cette réunion. @@ -382,7 +383,7 @@ fr: disabled: 'Les mises à jour du calendrier par e-mail sont désactivées. Les participants ne recevront pas d''e-mail les informant de l''ajout ou de la suppression de participants. ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. + draft_disabled: 'Les participants ne recevront pas d''e-mail les informant de l''ajout ou de la suppression de participants. ' onetime: diff --git a/modules/meeting/config/locales/crowdin/he.yml b/modules/meeting/config/locales/crowdin/he.yml index 6e50c1e8bf5..29b8b3cccaf 100644 --- a/modules/meeting/config/locales/crowdin/he.yml +++ b/modules/meeting/config/locales/crowdin/he.yml @@ -221,6 +221,7 @@ he: manage_participants: Manage participants no_participants: No participants show_all: Show all + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/hi.yml b/modules/meeting/config/locales/crowdin/hi.yml index 90665076ec8..8549e36b734 100644 --- a/modules/meeting/config/locales/crowdin/hi.yml +++ b/modules/meeting/config/locales/crowdin/hi.yml @@ -211,6 +211,7 @@ hi: manage_participants: Manage participants no_participants: No participants show_all: सभी दिखाएँ + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/hr.yml b/modules/meeting/config/locales/crowdin/hr.yml index b9194436a07..b5566a0e17e 100644 --- a/modules/meeting/config/locales/crowdin/hr.yml +++ b/modules/meeting/config/locales/crowdin/hr.yml @@ -216,6 +216,7 @@ hr: manage_participants: Manage participants no_participants: No participants show_all: Prikaži sve + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/hu.yml b/modules/meeting/config/locales/crowdin/hu.yml index ba3228b534b..dd898968f16 100644 --- a/modules/meeting/config/locales/crowdin/hu.yml +++ b/modules/meeting/config/locales/crowdin/hu.yml @@ -211,6 +211,7 @@ hu: manage_participants: Résztvevők kezelése no_participants: Nincsenek résztvevők show_all: Minden megjelenítése + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: Ezek a résztvevők automatikusan meghívást kapnak minden jövőbeli megbeszélésre, amint azok létrejönnek. manage_participants: Projekttagok keresés és hozzáadása a megbeszéléshez résztvevőként. diff --git a/modules/meeting/config/locales/crowdin/id.yml b/modules/meeting/config/locales/crowdin/id.yml index 68f3fa87f88..25c02fc2f3a 100644 --- a/modules/meeting/config/locales/crowdin/id.yml +++ b/modules/meeting/config/locales/crowdin/id.yml @@ -206,6 +206,7 @@ id: manage_participants: Kelola peserta no_participants: Tidak ada peserta show_all: Tampilkan semua + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: Para peserta ini akan diundang secara otomatis ke semua pertemuan mendatang yang akan dibuat. manage_participants: Cari dan tambahkan anggota proyek sebagai peserta dalam pertemuan ini. diff --git a/modules/meeting/config/locales/crowdin/it.yml b/modules/meeting/config/locales/crowdin/it.yml index cfc9d922c32..209bbb9e7d6 100644 --- a/modules/meeting/config/locales/crowdin/it.yml +++ b/modules/meeting/config/locales/crowdin/it.yml @@ -189,7 +189,7 @@ it: label_notify: Invia per revisione label_icalendar: Invia iCalendar label_icalendar_download: Scarica l'evento iCalendar - label_view_meeting: View meeting + label_view_meeting: Visualizza riunione label_view_meeting_series: Visualizza la serie di riunioni label_meeting_series: Serie di riunioni label_version: Versione @@ -198,8 +198,8 @@ it: label_subscribe_icalendar: Iscriviti al calendario caption_meeting_template_select: Seleziona un modello per copiare automaticamente i suoi elementi dell'ordine del giorno caption_template_project_select: Seleziona il progetto in cui creare questo modello di riunione - placeholder_meeting_template_select_project_first: Select a project first - placeholder_meeting_template_no_templates_for_project: No templates available for this project + placeholder_meeting_template_select_project_first: Seleziona prima un progetto + placeholder_meeting_template_no_templates_for_project: Non ci sono modelli disponibili per questo progetto meeting: participants: label: @@ -211,6 +211,7 @@ it: manage_participants: Gestisci partecipanti no_participants: Nessun partecipante show_all: Mostra tutti + apply_to_upcoming_meetings: Applica queste modifiche a tutte le riunioni future di questa serie text: template: Questi partecipanti saranno invitati automaticamente a tutte le riunioni future, man mano che vengono create. manage_participants: Cerca e aggiungi membri del progetto come partecipanti a questa riunione. @@ -219,8 +220,8 @@ it: heading: Nessun partecipante description: Non ci sono ancora partecipanti. attachments: - onetime_template: These attached files will be included in all future meetings using this template. - series_template: These attached files will be included in all future meetings in the series. + onetime_template: Questi file allegati saranno inclusi in tutte le riunioni future che utilizzano questo modello. + series_template: Questi file allegati saranno inclusi in tutte le prossime riunioni della serie. text: I file allegati sono disponibili per tutti i partecipanti alla riunione. Puoi anche trascinarli nelle note dei punti all'ordine del giorno. copy: title: 'Copia riunione: %{title}' @@ -298,7 +299,7 @@ it: template: title: Elimina modello heading: Eliminare questo modello? - confirmation_message_html: 'This action is not reversible. Please proceed with caution. Existing meetings that were created using this template will not be affected. + confirmation_message_html: 'Questa azione è irreversibile. Procedi con cautela. Le riunioni già create utilizzando questo modello non saranno influenzate. ' occurrence: @@ -382,7 +383,7 @@ it: disabled: 'Gli aggiornamenti del calendario via e-mail sono disattivati. I partecipanti non riceveranno un''e-mail quando aggiungi o rimuovi partecipanti. ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. + draft_disabled: 'I partecipanti non riceveranno un''e-mail quando aggiungi o rimuovi partecipanti. ' onetime: diff --git a/modules/meeting/config/locales/crowdin/ja.yml b/modules/meeting/config/locales/crowdin/ja.yml index 1104bd13da6..a0aef7c53ba 100644 --- a/modules/meeting/config/locales/crowdin/ja.yml +++ b/modules/meeting/config/locales/crowdin/ja.yml @@ -206,6 +206,7 @@ ja: manage_participants: 参加者の管理 no_participants: 参加者なし show_all: すべて表示 + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: これらの参加者は、今後作成されるすべての会議に自動的に招待される。 manage_participants: プロジェクトメンバーを検索し、この会議の参加者として追加する。 diff --git a/modules/meeting/config/locales/crowdin/ka.yml b/modules/meeting/config/locales/crowdin/ka.yml index f4d66fd1f0c..07c78acfe9a 100644 --- a/modules/meeting/config/locales/crowdin/ka.yml +++ b/modules/meeting/config/locales/crowdin/ka.yml @@ -211,6 +211,7 @@ ka: manage_participants: Manage participants no_participants: No participants show_all: ყველაფრის ჩვენება + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/kk.yml b/modules/meeting/config/locales/crowdin/kk.yml index 1db46e6e9cd..d7cdd1fa842 100644 --- a/modules/meeting/config/locales/crowdin/kk.yml +++ b/modules/meeting/config/locales/crowdin/kk.yml @@ -211,6 +211,7 @@ kk: manage_participants: Manage participants no_participants: No participants show_all: Show all + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/ko.yml b/modules/meeting/config/locales/crowdin/ko.yml index 4bc754e70f9..31b529494de 100644 --- a/modules/meeting/config/locales/crowdin/ko.yml +++ b/modules/meeting/config/locales/crowdin/ko.yml @@ -193,8 +193,8 @@ ko: label_subscribe_icalendar: 캘린더 구독 caption_meeting_template_select: 템플릿을 선택하면 의제 항목이 자동으로 복사됩니다. caption_template_project_select: 이 미팅 템플릿을 만들 프로젝트를 선택하세요 - placeholder_meeting_template_select_project_first: Select a project first - placeholder_meeting_template_no_templates_for_project: No templates available for this project + placeholder_meeting_template_select_project_first: 먼저 프로젝트를 선택하세요 + placeholder_meeting_template_no_templates_for_project: 이 프로젝트에 사용할 수 있는 템플릿이 없습니다 meeting: participants: label: @@ -206,6 +206,7 @@ ko: manage_participants: 참가자 관리 no_participants: 참가자 없음 show_all: 모두 표시 + apply_to_upcoming_meetings: 이 시리즈의 모든 향후 미팅에 해당 변경 사항 적용 text: template: 이러한 참가자는 향후 생성되는 모든 미팅에 자동으로 초대됩니다. manage_participants: 프로젝트 멤버를 검색하여 이 미팅에 참가자로 추가하세요. @@ -377,7 +378,7 @@ ko: disabled: '이메일 캘린더 업데이트가 비활성화되었습니다. 참가자를 추가 또는 제거하는 경우 알려주는 이메일이 참가자에게 전송되지 않습니다. ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. + draft_disabled: '참가자를 추가 또는 제거하는 경우 알려주는 이메일이 참가자에게 전송되지 않습니다. ' onetime: diff --git a/modules/meeting/config/locales/crowdin/lt.yml b/modules/meeting/config/locales/crowdin/lt.yml index 58099181e14..2dd6c8ee98d 100644 --- a/modules/meeting/config/locales/crowdin/lt.yml +++ b/modules/meeting/config/locales/crowdin/lt.yml @@ -221,6 +221,7 @@ lt: manage_participants: Valdyti dalyvius no_participants: Nėra dalyvių show_all: Rodyti viską + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/lv.yml b/modules/meeting/config/locales/crowdin/lv.yml index 972a4135fed..8fdc3bfc36a 100644 --- a/modules/meeting/config/locales/crowdin/lv.yml +++ b/modules/meeting/config/locales/crowdin/lv.yml @@ -216,6 +216,7 @@ lv: manage_participants: Manage participants no_participants: No participants show_all: Rādīt visus + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/mn.yml b/modules/meeting/config/locales/crowdin/mn.yml index 50d98558d18..d4b9c828385 100644 --- a/modules/meeting/config/locales/crowdin/mn.yml +++ b/modules/meeting/config/locales/crowdin/mn.yml @@ -211,6 +211,7 @@ mn: manage_participants: Manage participants no_participants: No participants show_all: Show all + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/ms.yml b/modules/meeting/config/locales/crowdin/ms.yml index 67b663e115a..0567d21974a 100644 --- a/modules/meeting/config/locales/crowdin/ms.yml +++ b/modules/meeting/config/locales/crowdin/ms.yml @@ -208,6 +208,7 @@ ms: manage_participants: Urus peserta no_participants: Tiada peserta show_all: Paparkan semua + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: Peserta ini akan dijemput secara automatik ke semua mesyuarat akan datang apabila ia dibuat. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/ne.yml b/modules/meeting/config/locales/crowdin/ne.yml index 97ee6911a25..3e96b758a98 100644 --- a/modules/meeting/config/locales/crowdin/ne.yml +++ b/modules/meeting/config/locales/crowdin/ne.yml @@ -211,6 +211,7 @@ ne: manage_participants: Manage participants no_participants: No participants show_all: Show all + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/nl.yml b/modules/meeting/config/locales/crowdin/nl.yml index 5420e7bb2ad..dafe99c3f23 100644 --- a/modules/meeting/config/locales/crowdin/nl.yml +++ b/modules/meeting/config/locales/crowdin/nl.yml @@ -211,6 +211,7 @@ nl: manage_participants: Deelnemers beheren no_participants: Geen deelnemers show_all: Toon alle + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: Deze deelnemers worden automatisch uitgenodigd voor alle toekomstige vergaderingen wanneer deze worden aangemaakt. manage_participants: Zoek projectleden en voeg ze toe als deelnemers aan deze vergadering. diff --git a/modules/meeting/config/locales/crowdin/no.yml b/modules/meeting/config/locales/crowdin/no.yml index c0259c665e1..51c77af96da 100644 --- a/modules/meeting/config/locales/crowdin/no.yml +++ b/modules/meeting/config/locales/crowdin/no.yml @@ -211,6 +211,7 @@ manage_participants: Administrer deltagere no_participants: Ingen deltakere show_all: Vis alle + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/pl.yml b/modules/meeting/config/locales/crowdin/pl.yml index ac1f38ff1b7..b5c8278f6a6 100644 --- a/modules/meeting/config/locales/crowdin/pl.yml +++ b/modules/meeting/config/locales/crowdin/pl.yml @@ -221,6 +221,7 @@ pl: manage_participants: Zarządzaj uczestnikami no_participants: Brak uczestników show_all: Pokaż wszystkie + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: Uczestnicy ci będą automatycznie zapraszani na wszystkie przyszłe spotkania w miarę ich tworzenia. manage_participants: Wyszukaj członków projektu i dodaj ich jako uczestników tego spotkania. diff --git a/modules/meeting/config/locales/crowdin/pt-BR.yml b/modules/meeting/config/locales/crowdin/pt-BR.yml index 001bf0d9247..5328de47c42 100644 --- a/modules/meeting/config/locales/crowdin/pt-BR.yml +++ b/modules/meeting/config/locales/crowdin/pt-BR.yml @@ -198,8 +198,8 @@ pt-BR: label_subscribe_icalendar: Assinar calendário caption_meeting_template_select: Selecione um modelo para copiar automaticamente os itens da pauta caption_template_project_select: Selecione o projeto no qual deseja criar este modelo de reunião - placeholder_meeting_template_select_project_first: Select a project first - placeholder_meeting_template_no_templates_for_project: No templates available for this project + placeholder_meeting_template_select_project_first: Primeiro, selecionar um projeto + placeholder_meeting_template_no_templates_for_project: Não há templates disponíveis para este projeto meeting: participants: label: @@ -211,6 +211,7 @@ pt-BR: manage_participants: Gerenciar participantes no_participants: Sem participantes show_all: Mostrar todos + apply_to_upcoming_meetings: Aplique essas alterações a todas as próximas reuniões desta série text: template: Esses participantes serão convidados automaticamente para todas as futuras reuniões à medida que forem criadas. manage_participants: Pesquisar e adicionar membros do projeto como participantes desta reunião. @@ -219,8 +220,8 @@ pt-BR: heading: Sem participantes description: Ainda não há participantes. attachments: - onetime_template: These attached files will be included in all future meetings using this template. - series_template: These attached files will be included in all future meetings in the series. + onetime_template: Esses arquivos anexados serão adicionados a todas as reuniões futuras usando este modelo. + series_template: Esses arquivos anexados serão adicionados a todas as reuniões futuras da série. text: Os arquivos anexados estão disponíveis para todos os participantes da reunião. Você também pode arrastá-los e soltá-los nas anotações dos itens da pauta. copy: title: 'Copiar reunião: %{title}' @@ -298,7 +299,7 @@ pt-BR: template: title: Excluir modelo heading: Excluir este modelo? - confirmation_message_html: 'This action is not reversible. Please proceed with caution. Existing meetings that were created using this template will not be affected. + confirmation_message_html: 'Esta ação não é reversível. Prossiga com cautela. As reuniões existentes criadas com este modelo não serão afetadas. ' occurrence: @@ -382,7 +383,7 @@ pt-BR: disabled: 'As atualizações de calendário por e-mail estão desativadas. Os participantes não receberão e-mails quando você adicionar ou remover participantes. ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. + draft_disabled: 'Os participantes não receberão e-mail informando quando você adicionar ou remover participantes. ' onetime: diff --git a/modules/meeting/config/locales/crowdin/pt-PT.yml b/modules/meeting/config/locales/crowdin/pt-PT.yml index a9d293209ab..36b4df413b0 100644 --- a/modules/meeting/config/locales/crowdin/pt-PT.yml +++ b/modules/meeting/config/locales/crowdin/pt-PT.yml @@ -211,6 +211,7 @@ pt-PT: manage_participants: Gerir participantes no_participants: Sem participantes show_all: Mostrar todos + apply_to_upcoming_meetings: Aplicar estas alterações a todas as próximas reuniões desta série text: template: Estes participantes serão convidados automaticamente para todas as reuniões futuras à medida que forem sendo criadas. manage_participants: Procure e adicione membros do projeto como participantes nesta reunião. diff --git a/modules/meeting/config/locales/crowdin/ro.yml b/modules/meeting/config/locales/crowdin/ro.yml index c5f8fa73529..f613dc6979e 100644 --- a/modules/meeting/config/locales/crowdin/ro.yml +++ b/modules/meeting/config/locales/crowdin/ro.yml @@ -216,6 +216,7 @@ ro: manage_participants: Manage participants no_participants: No participants show_all: Afișează tot + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/ru.yml b/modules/meeting/config/locales/crowdin/ru.yml index ba9ea7bcaea..449158975c7 100644 --- a/modules/meeting/config/locales/crowdin/ru.yml +++ b/modules/meeting/config/locales/crowdin/ru.yml @@ -221,6 +221,7 @@ ru: manage_participants: Управление участниками no_participants: Нет участников show_all: Показывать всё + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: Эти участники будут автоматически приглашаться на все будущие совещания по мере их создания. manage_participants: Найдите и добавьте членов проекта в качестве участников совещания. diff --git a/modules/meeting/config/locales/crowdin/rw.yml b/modules/meeting/config/locales/crowdin/rw.yml index 2e2022aeea0..3c27820e7eb 100644 --- a/modules/meeting/config/locales/crowdin/rw.yml +++ b/modules/meeting/config/locales/crowdin/rw.yml @@ -211,6 +211,7 @@ rw: manage_participants: Manage participants no_participants: No participants show_all: Show all + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/si.yml b/modules/meeting/config/locales/crowdin/si.yml index 8e8802d1cae..f99f5989d26 100644 --- a/modules/meeting/config/locales/crowdin/si.yml +++ b/modules/meeting/config/locales/crowdin/si.yml @@ -211,6 +211,7 @@ si: manage_participants: Manage participants no_participants: No participants show_all: සියල්ල පෙන්වන්න + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/sk.yml b/modules/meeting/config/locales/crowdin/sk.yml index 54cbb235eb7..0a838e7e9f9 100644 --- a/modules/meeting/config/locales/crowdin/sk.yml +++ b/modules/meeting/config/locales/crowdin/sk.yml @@ -221,6 +221,7 @@ sk: manage_participants: Manage participants no_participants: No participants show_all: Zobraziť všetko + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/sl.yml b/modules/meeting/config/locales/crowdin/sl.yml index c6c15ebf240..a542974d15f 100644 --- a/modules/meeting/config/locales/crowdin/sl.yml +++ b/modules/meeting/config/locales/crowdin/sl.yml @@ -221,6 +221,7 @@ sl: manage_participants: Manage participants no_participants: No participants show_all: Prikaži vse + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/sr.yml b/modules/meeting/config/locales/crowdin/sr.yml index 6ed31825608..2a161adc124 100644 --- a/modules/meeting/config/locales/crowdin/sr.yml +++ b/modules/meeting/config/locales/crowdin/sr.yml @@ -216,6 +216,7 @@ sr: manage_participants: Manage participants no_participants: No participants show_all: Show all + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/sv.yml b/modules/meeting/config/locales/crowdin/sv.yml index 834c90e1571..78bf1278d02 100644 --- a/modules/meeting/config/locales/crowdin/sv.yml +++ b/modules/meeting/config/locales/crowdin/sv.yml @@ -211,6 +211,7 @@ sv: manage_participants: Hantera deltagare no_participants: Inga deltagare show_all: Visa alla + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: Dessa deltagare kommer automatiskt att bjudas in till alla framtida möten när de skapas. manage_participants: Sök efter och lägg till projektmedlemmar som deltagare till detta möte. diff --git a/modules/meeting/config/locales/crowdin/th.yml b/modules/meeting/config/locales/crowdin/th.yml index 43d1808629a..bf3f7d9f136 100644 --- a/modules/meeting/config/locales/crowdin/th.yml +++ b/modules/meeting/config/locales/crowdin/th.yml @@ -206,6 +206,7 @@ th: manage_participants: Manage participants no_participants: No participants show_all: แสดงทั้งหมด + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/tr.yml b/modules/meeting/config/locales/crowdin/tr.yml index a01a4755de4..b64ea708f42 100644 --- a/modules/meeting/config/locales/crowdin/tr.yml +++ b/modules/meeting/config/locales/crowdin/tr.yml @@ -211,6 +211,7 @@ tr: manage_participants: Katılımcıları yönet no_participants: Katılımcı yok show_all: Tümünü göster + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: Oluşturuldukça bu katılımcılar, gelecekteki tüm toplantılara otomatik olarak davet edilecektir. manage_participants: Proje üyelerini arayın ve bu toplantıya katılımcı olarak ekleyin. diff --git a/modules/meeting/config/locales/crowdin/uk.yml b/modules/meeting/config/locales/crowdin/uk.yml index 666d3cde97c..9062610fb4c 100644 --- a/modules/meeting/config/locales/crowdin/uk.yml +++ b/modules/meeting/config/locales/crowdin/uk.yml @@ -199,7 +199,7 @@ uk: label_notify: Надіслати на розгляд label_icalendar: Надіслати iCalendar label_icalendar_download: Завантажити подію iCalendar - label_view_meeting: View meeting + label_view_meeting: Переглянути зустріч label_view_meeting_series: Переглянути серію нарад label_meeting_series: Серія нарад label_version: Версія @@ -208,8 +208,8 @@ uk: label_subscribe_icalendar: Підписатися на календар caption_meeting_template_select: Виберіть шаблон, щоб автоматично скопіювати з нього пункти порядку денного caption_template_project_select: Виберіть проєкт, у якому ви хочете створити цей шаблон наради - placeholder_meeting_template_select_project_first: Select a project first - placeholder_meeting_template_no_templates_for_project: No templates available for this project + placeholder_meeting_template_select_project_first: Спершу виберіть проєкт + placeholder_meeting_template_no_templates_for_project: Немає шаблонів, доступних для цього проєкту meeting: participants: label: @@ -221,6 +221,7 @@ uk: manage_participants: Керувати учасниками no_participants: Немає учасників show_all: Показати всі + apply_to_upcoming_meetings: Застосувати ці зміни до всіх майбутніх нарад цієї серії text: template: Ці учасники автоматично отримуватимуть запрошення на всі майбутні наради, які ви створюватимете. manage_participants: Знайдіть учасників проєкту й додайте їх у цю нараду в ролі учасників. @@ -229,7 +230,7 @@ uk: heading: Немає учасників description: Учасників ще немає. attachments: - onetime_template: These attached files will be included in all future meetings using this template. + onetime_template: Ці прикріплені файли додаватимуться в усі наради, які буде створено із використанням цього шаблону в майбутньому. series_template: Ці прикріплені файли додаватимуться до всіх майбутніх нарад серії. text: Прикріплені файли доступні всім учасникам наради. Ви також можете перетягнути їх у примітки до пунктів порядку денного. copy: @@ -308,7 +309,7 @@ uk: template: title: Видалити шаблон heading: Видалити цей шаблон? - confirmation_message_html: 'This action is not reversible. Please proceed with caution. Existing meetings that were created using this template will not be affected. + confirmation_message_html: 'Зверніть увагу: цю дію не можна відмінити. Вона не вплине на наради, які було створено за допомогою цього шаблону раніше. ' occurrence: @@ -392,7 +393,7 @@ uk: disabled: 'Надсилання електронною поштою оновлень із календаря вимкнено. Якщо ви додасте нових учасників чи вилучите наявних, учасники не отримають листа з інформацією про це. ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. + draft_disabled: 'Учасники не отримають електронного листа з відповідним повідомленням після того, як ви додасте чи вилучите когось із них. ' onetime: diff --git a/modules/meeting/config/locales/crowdin/uz.yml b/modules/meeting/config/locales/crowdin/uz.yml index 4f68d88a2f0..70d25d29134 100644 --- a/modules/meeting/config/locales/crowdin/uz.yml +++ b/modules/meeting/config/locales/crowdin/uz.yml @@ -211,6 +211,7 @@ uz: manage_participants: Manage participants no_participants: No participants show_all: Show all + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: These participants will be invited automatically to all future meetings as they are created. manage_participants: Search for and add project members as participants to this meeting. diff --git a/modules/meeting/config/locales/crowdin/vi.yml b/modules/meeting/config/locales/crowdin/vi.yml index 99c1e2f4504..872c02b8dc5 100644 --- a/modules/meeting/config/locales/crowdin/vi.yml +++ b/modules/meeting/config/locales/crowdin/vi.yml @@ -206,6 +206,7 @@ vi: manage_participants: Quản lý người tham gia no_participants: Không có người tham gia show_all: Hiển thị tất cả + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: Những người tham gia này sẽ tự động được mời tham gia tất cả các cuộc họp trong tương lai khi chúng được tạo. manage_participants: Tìm kiếm và thêm thành viên dự án làm người tham gia cuộc họp này. diff --git a/modules/meeting/config/locales/crowdin/zh-CN.yml b/modules/meeting/config/locales/crowdin/zh-CN.yml index b20924c8727..3fbce2ebd96 100644 --- a/modules/meeting/config/locales/crowdin/zh-CN.yml +++ b/modules/meeting/config/locales/crowdin/zh-CN.yml @@ -184,7 +184,7 @@ zh-CN: label_notify: 发送待审阅 label_icalendar: 发送 iCalendar label_icalendar_download: 下载 iCalendar 事件 - label_view_meeting: View meeting + label_view_meeting: 查看会议 label_view_meeting_series: 查看会议系列 label_meeting_series: 会议系列 label_version: 版本 @@ -193,8 +193,8 @@ zh-CN: label_subscribe_icalendar: 订阅日历 caption_meeting_template_select: 选择一个模板,以自动复制其议程条目 caption_template_project_select: 请选择要在其中创建此会议模板的项目 - placeholder_meeting_template_select_project_first: Select a project first - placeholder_meeting_template_no_templates_for_project: No templates available for this project + placeholder_meeting_template_select_project_first: 先选择项目 + placeholder_meeting_template_no_templates_for_project: 此项目没有可用模板 meeting: participants: label: @@ -206,6 +206,7 @@ zh-CN: manage_participants: 管理与会者 no_participants: 无参加者 show_all: 全部显示 + apply_to_upcoming_meetings: 将这些更改应用于此系列中所有即将召开的会议 text: template: 这些与会者将被自动邀请参加之后创建的所有会议。 manage_participants: 搜索并添加项目成员作为本次会议的参与者。 @@ -377,7 +378,7 @@ zh-CN: disabled: '电子邮件日历更新已禁用。在您添加或移除参与者时,参与者不会收到电子邮件通知。 ' - draft_disabled: 'Participants will not receive an email informing them when you add or remove participants. + draft_disabled: '在您添加或移除参与者时,参与者不会收到电子邮件通知。 ' onetime: diff --git a/modules/meeting/config/locales/crowdin/zh-TW.yml b/modules/meeting/config/locales/crowdin/zh-TW.yml index 839f156820c..94dd7253464 100644 --- a/modules/meeting/config/locales/crowdin/zh-TW.yml +++ b/modules/meeting/config/locales/crowdin/zh-TW.yml @@ -208,6 +208,7 @@ zh-TW: manage_participants: 管理參與者 no_participants: 沒有參與者 show_all: 顯示全部 + apply_to_upcoming_meetings: Apply these changes to all upcoming meetings in this series text: template: 這些參與者將自動被邀請參加未來所有建立的會議。 manage_participants: 搜尋並新增專案成員為此會議的參與者。 diff --git a/modules/meeting/config/locales/en.yml b/modules/meeting/config/locales/en.yml index 24e0328853b..030883a79a4 100644 --- a/modules/meeting/config/locales/en.yml +++ b/modules/meeting/config/locales/en.yml @@ -230,6 +230,7 @@ en: manage_participants: "Manage participants" no_participants: "No participants" show_all: "Show all" + apply_to_upcoming_meetings: "Apply these changes to all upcoming meetings in this series" text: template: "These participants will be invited automatically to all future meetings as they are created." manage_participants: "Search for and add project members as participants to this meeting." diff --git a/modules/meeting/spec/components/meeting_agenda_items/item_component/show_component_spec.rb b/modules/meeting/spec/components/meeting_agenda_items/item_component/show_component_spec.rb index c55053fe64a..c7caba49369 100644 --- a/modules/meeting/spec/components/meeting_agenda_items/item_component/show_component_spec.rb +++ b/modules/meeting/spec/components/meeting_agenda_items/item_component/show_component_spec.rb @@ -79,6 +79,7 @@ RSpec.describe MeetingAgendaItems::ItemComponent::ShowComponent, type: :componen context "when the meeting is in the future" do let(:meeting_start_time) { 1.week.from_now } + let!(:scheduled_meeting) { create(:scheduled_meeting, recurring_meeting: series, start_time: meeting_start_time, meeting:) } it "calculates next occurrence from meeting start time" do next_occurrence = series.next_occurrence(from_time: meeting.start_time) @@ -138,6 +139,7 @@ RSpec.describe MeetingAgendaItems::ItemComponent::ShowComponent, type: :componen start_time: 1.week.from_now, author: user) end + let!(:scheduled_meeting) { create(:scheduled_meeting, recurring_meeting: series, start_time: meeting.start_time, meeting:) } it "shows the duplicate submenu" do expect(series.next_occurrence(from_time: meeting.start_time)).to be_present diff --git a/modules/meeting/spec/features/recurring_meetings/recurring_meeting_create_spec.rb b/modules/meeting/spec/features/recurring_meetings/recurring_meeting_create_spec.rb index e91d16f84e6..f729b87b8bb 100644 --- a/modules/meeting/spec/features/recurring_meetings/recurring_meeting_create_spec.rb +++ b/modules/meeting/spec/features/recurring_meetings/recurring_meeting_create_spec.rb @@ -171,6 +171,7 @@ RSpec.describe "Recurring meetings creation", template_page.expect_participant(other_user, editable: false) template_page.expect_available_participants(count: 2) + template_page.uncheck_apply_to_upcoming template_page.select_participant(third_user) template_page.expect_participant(third_user, editable: false) template_page.expect_available_participants(count: 3) diff --git a/modules/meeting/spec/features/recurring_meetings/recurring_meeting_move_to_next_spec.rb b/modules/meeting/spec/features/recurring_meetings/recurring_meeting_move_to_next_spec.rb index d0899918f3f..ba28076e203 100644 --- a/modules/meeting/spec/features/recurring_meetings/recurring_meeting_move_to_next_spec.rb +++ b/modules/meeting/spec/features/recurring_meetings/recurring_meeting_move_to_next_spec.rb @@ -163,6 +163,47 @@ RSpec.describe "Recurring meetings move to next meeting", :js do end end + context "when the occurrence has been rescheduled to an earlier time (Bug #73741)" do + let(:current_user) { user_with_manage_permissions } + let(:first_occurrence_time) { series.next_occurrence(from_time: Time.current) } + + let!(:rescheduled_occurrence) do + call = RecurringMeetings::InitOccurrenceService + .new(user: User.system, recurring_meeting: series) + .call(start_time: first_occurrence_time) + occurrence_meeting = call.result + + # Reschedule to an earlier time + # This updates meeting.start_time, but not meeting.scheduled_meeting.start_time + occurrence_meeting.update!(start_time: first_occurrence_time - 1.day) + occurrence_meeting + end + + let(:meeting) { rescheduled_occurrence } + + it "moves the item to the occurrence after the original scheduled time" do + meeting_page.expect_agenda_item(title: "Test notes") + + meeting_page.select_action(agenda_item, "Move to next meeting") + expect(page).to have_text("Move to next meeting?") + + page.within_modal "Move to next meeting?" do + click_on "Move" + end + + expect_and_dismiss_flash(message: "Agenda item moved to the next meeting") + + meeting_page.expect_no_agenda_item(title: "Test notes") + + next_meeting = Meeting.find(agenda_item.reload.meeting_id) + expect(next_meeting.id).not_to eq(rescheduled_occurrence.id) + + next_meeting_page = Pages::Meetings::Show.new(next_meeting) + next_meeting_page.visit! + next_meeting_page.expect_agenda_item(title: "Test notes") + end + end + context "with view permission only" do let(:current_user) { user_with_view_permissions } diff --git a/modules/meeting/spec/features/recurring_meetings/recurring_meeting_participants_spec.rb b/modules/meeting/spec/features/recurring_meetings/recurring_meeting_participants_spec.rb new file mode 100644 index 00000000000..4b95f9850f8 --- /dev/null +++ b/modules/meeting/spec/features/recurring_meetings/recurring_meeting_participants_spec.rb @@ -0,0 +1,162 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +require "spec_helper" +require_relative "../../support/pages/meetings/show" + +RSpec.describe "Series template participant management", + :js do + include Components::Autocompleter::NgSelectAutocompleteHelpers + + shared_let(:project) { create(:project, enabled_module_names: %w[meetings]) } + shared_let(:user) do + create(:user, member_with_permissions: { project => %i[view_meetings create_meetings edit_meetings] }) + end + shared_let(:participant_a) do + create(:user, member_with_permissions: { project => %i[view_meetings] }) + end + shared_let(:participant_b) do + create(:user, member_with_permissions: { project => %i[view_meetings] }) + end + + let(:recurring_meeting) { create(:recurring_meeting, project:, author: user) } + let(:template) { recurring_meeting.template } + let(:template_page) { Pages::Meetings::Show.new(template) } + + before do + login_as user + template_page.visit! + end + + describe "'apply to upcoming' checkbox state" do + context "when adding multiple participants with checkbox unchecked" do + it "keeps the checkbox unchecked after each addition" do + template_page.open_participant_form + template_page.in_participant_form do + template_page.uncheck_apply_to_upcoming + template_page.expect_apply_to_upcoming_unchecked + + wait_for_turbo_stream do + template_page.select_participant(participant_a) + end + template_page.expect_apply_to_upcoming_unchecked + + wait_for_turbo_stream do + template_page.select_participant(participant_b) + end + template_page.expect_apply_to_upcoming_unchecked + end + end + + it "does not add participants to occurrences" do + open_scheduled = create(:scheduled_meeting, :persisted, recurring_meeting:, start_time: 1.day.from_now) + + template_page.open_participant_form + template_page.in_participant_form do + template_page.uncheck_apply_to_upcoming + template_page.expect_apply_to_upcoming_unchecked + + wait_for_turbo_stream do + template_page.select_participant(participant_a) + end + wait_for_turbo_stream do + template_page.select_participant(participant_b) + end + end + + expect(open_scheduled.meeting.participants.pluck(:user_id)) + .not_to include(participant_a.id, participant_b.id) + end + end + + context "when removing multiple participants with checkbox unchecked" do + let!(:meeting_participant_a) do + create(:meeting_participant, meeting: template, user: participant_a, invited: true) + end + let!(:meeting_participant_b) do + create(:meeting_participant, meeting: template, user: participant_b, invited: true) + end + + it "keeps the checkbox unchecked after each removal" do + template_page.open_participant_form + template_page.in_participant_form do + template_page.uncheck_apply_to_upcoming + template_page.expect_apply_to_upcoming_unchecked + + wait_for_turbo_stream do + template_page.remove_participant(participant_a) + end + template_page.expect_apply_to_upcoming_unchecked + + wait_for_turbo_stream do + template_page.remove_participant(participant_b) + end + template_page.expect_apply_to_upcoming_unchecked + end + end + + it "does not remove participants from occurrences" do + open_scheduled = create(:scheduled_meeting, :persisted, recurring_meeting:, start_time: 1.day.from_now) + create(:meeting_participant, meeting: open_scheduled.meeting, user: participant_a, invited: true) + create(:meeting_participant, meeting: open_scheduled.meeting, user: participant_b, invited: true) + + template_page.open_participant_form + template_page.in_participant_form do + template_page.uncheck_apply_to_upcoming + template_page.expect_apply_to_upcoming_unchecked + + wait_for_turbo_stream do + template_page.remove_participant(participant_a) + end + wait_for_turbo_stream do + template_page.remove_participant(participant_b) + end + end + + expect(open_scheduled.meeting.participants.reload.pluck(:user_id)) + .to include(participant_a.id, participant_b.id) + end + end + + it "defaults to checked when the dialog is reopened" do + template_page.open_participant_form + template_page.in_participant_form do + template_page.uncheck_apply_to_upcoming + template_page.expect_apply_to_upcoming_unchecked + page.find(".close-button").click + end + + template_page.open_participant_form + template_page.in_participant_form do + template_page.expect_apply_to_upcoming_checked + end + end + end +end diff --git a/modules/meeting/spec/requests/meeting_participants_spec.rb b/modules/meeting/spec/requests/meeting_participants_spec.rb index 691ed01c984..8fff3132d68 100644 --- a/modules/meeting/spec/requests/meeting_participants_spec.rb +++ b/modules/meeting/spec/requests/meeting_participants_spec.rb @@ -248,10 +248,207 @@ RSpec.describe "MeetingParticipants requests", end describe "GET /meetings/:meeting_id/participants/manage_participants_dialog" do + let(:apply_to_upcoming_checkbox) { "meeting_participant[apply_to_upcoming]" } + it "responds with the manage participants dialog" do get manage_participants_dialog_project_meeting_participants_path(project, meeting), as: :turbo_stream expect(response).to have_http_status(:ok) end + + context "for a one-time meeting" do + it "does not show the apply to upcoming checkbox" do + get manage_participants_dialog_project_meeting_participants_path(project, meeting), as: :turbo_stream + + expect(response.body).not_to include(apply_to_upcoming_checkbox) + end + end + + context "for a one-time template" do + let(:onetime_template) { create(:onetime_template, project:, author: user) } + + it "does not show the apply to upcoming checkbox" do + get manage_participants_dialog_project_meeting_participants_path(project, onetime_template), as: :turbo_stream + + expect(response.body).not_to include(apply_to_upcoming_checkbox) + end + end + + context "for a series template" do + let(:recurring_meeting) { create(:recurring_meeting, project:, author: user) } + + it "shows the apply to upcoming checkbox" do + get manage_participants_dialog_project_meeting_participants_path(project, recurring_meeting.template), as: :turbo_stream + + expect(response.body).to include(apply_to_upcoming_checkbox) + end + end + + context "for a series occurrence" do + let(:recurring_meeting) { create(:recurring_meeting, project:, author: user) } + let(:occurrence) { create(:meeting, project:, author: user, recurring_meeting:) } + + it "does not show the apply to upcoming checkbox" do + get manage_participants_dialog_project_meeting_participants_path(project, occurrence), as: :turbo_stream + + expect(response.body).not_to include(apply_to_upcoming_checkbox) + end + end + end + + describe "series template participant management" do + let!(:recurring_meeting) { create(:recurring_meeting, project:, author: user) } + let!(:template) { recurring_meeting.template } + + let!(:open_scheduled) { create(:scheduled_meeting, :persisted, recurring_meeting:, start_time: 1.day.from_now) } + let!(:open_occurrence) { open_scheduled.meeting } + + let!(:closed_scheduled) { create(:scheduled_meeting, :persisted, recurring_meeting:, start_time: 2.days.from_now) } + let!(:closed_occurrence) { closed_scheduled.meeting.tap { |m| m.update!(state: :closed) } } + + before { ActionMailer::Base.deliveries.clear } + + describe "POST - adding participants" do + let(:add_params) do + { + meeting_id: template.id, + project_id: project.id, + meeting_participant: { user_id: [user_with_meeting_permissions.id] } + } + end + + context "without apply_to_upcoming" do + it "only adds participant to the series template" do + post project_meeting_participants_path(project, template), params: add_params, as: :turbo_stream + + expect(template.participants.reload.pluck(:user_id)).to include(user_with_meeting_permissions.id) + expect(open_occurrence.participants.reload.pluck(:user_id)).not_to include(user_with_meeting_permissions.id) + expect(closed_occurrence.participants.reload.pluck(:user_id)).not_to include(user_with_meeting_permissions.id) + end + + it "only sends series invitation emails" do + post project_meeting_participants_path(project, template), params: add_params, as: :turbo_stream + perform_enqueued_jobs + + # 1 series invite to new participant + 1 participant added email to existing participant + expect(ActionMailer::Base.deliveries.size).to eq(2) + expect(ActionMailer::Base.deliveries.map(&:to).flatten).to include(user_with_meeting_permissions.mail) + end + end + + context "with apply_to_upcoming" do + let(:params) { add_params.deep_merge(meeting_participant: { apply_to_upcoming: "1" }) } + + it "adds participant to template and all instantiated occurrences" do + post project_meeting_participants_path(project, template), params:, as: :turbo_stream + + expect(template.participants.reload.pluck(:user_id)).to include(user_with_meeting_permissions.id) + expect(open_occurrence.participants.reload.pluck(:user_id)).to include(user_with_meeting_permissions.id) + expect(closed_occurrence.participants.reload.pluck(:user_id)).to include(user_with_meeting_permissions.id) + end + + it "does not add participant to past instantiated occurrences" do + past_scheduled = create(:scheduled_meeting, :persisted, recurring_meeting:, start_time: 1.week.ago) + + post project_meeting_participants_path(project, template), params:, as: :turbo_stream + + expect(past_scheduled.meeting.participants.reload.pluck(:user_id)) + .not_to include(user_with_meeting_permissions.id) + end + + it "does not automatically instantiate future unscheduled occurrences" do + future_uninstantiated = create(:scheduled_meeting, recurring_meeting:, start_time: 2.weeks.from_now) + + post project_meeting_participants_path(project, template), params:, as: :turbo_stream + + expect(future_uninstantiated.reload.meeting).to be_nil + end + + it "sends emails for series and open occurrences, but not closed" do + post project_meeting_participants_path(project, template), params:, as: :turbo_stream + perform_enqueued_jobs + + # 1 series invite to new participant + 1 participant added email to existing participant + 1 occurrence invite + expect(ActionMailer::Base.deliveries.size).to eq(3) + expect(ActionMailer::Base.deliveries.map(&:to).flatten) + .to include(user_with_meeting_permissions.mail, user.mail) + end + end + end + + describe "DELETE - removing participants" do + let!(:template_participant) do + create(:meeting_participant, meeting: template, user: user_with_meeting_permissions, invited: true) + end + let!(:open_occurrence_participant) do + create(:meeting_participant, meeting: open_occurrence, user: user_with_meeting_permissions, invited: true) + end + let!(:closed_occurrence_participant) do + create(:meeting_participant, meeting: closed_occurrence, user: user_with_meeting_permissions, invited: true) + end + + context "without apply_to_upcoming" do + it "only removes participant from the series template" do + delete project_meeting_participant_path(project, template, template_participant), as: :turbo_stream + + expect(template.participants.reload.pluck(:user_id)).not_to include(user_with_meeting_permissions.id) + expect(open_occurrence.participants.reload.pluck(:user_id)).to include(user_with_meeting_permissions.id) + expect(closed_occurrence.participants.reload.pluck(:user_id)).to include(user_with_meeting_permissions.id) + end + + it "only sends template cancellation emails" do + delete project_meeting_participant_path(project, template, template_participant), as: :turbo_stream + perform_enqueued_jobs + + # 1 cancelled series to removed participant + 1 participant removed to remaining template participant + expect(ActionMailer::Base.deliveries.size).to eq(2) + expect(ActionMailer::Base.deliveries.map(&:to).flatten).to include(user_with_meeting_permissions.mail) + end + end + + context "with apply_to_upcoming" do + let(:delete_params) { { apply_to_upcoming: "1" } } + + it "removes participant from template and upcoming instantiated occurrences" do + delete project_meeting_participant_path(project, template, template_participant), + params: delete_params, as: :turbo_stream + + expect(template.participants.reload.pluck(:user_id)).not_to include(user_with_meeting_permissions.id) + expect(open_occurrence.participants.reload.pluck(:user_id)).not_to include(user_with_meeting_permissions.id) + expect(closed_occurrence.participants.reload.pluck(:user_id)).not_to include(user_with_meeting_permissions.id) + end + + it "does not remove participant from past instantiated occurrences" do + past_scheduled = create(:scheduled_meeting, :persisted, recurring_meeting:, start_time: 1.week.ago) + create(:meeting_participant, meeting: past_scheduled.meeting, user: user_with_meeting_permissions, invited: true) + + delete project_meeting_participant_path(project, template, template_participant), + params: delete_params, as: :turbo_stream + + expect(past_scheduled.meeting.participants.reload.pluck(:user_id)) + .to include(user_with_meeting_permissions.id) + end + + it "does not automatically instantiate future unscheduled occurrences" do + future_uninstantiated = create(:scheduled_meeting, recurring_meeting:, start_time: 2.weeks.from_now) + + delete project_meeting_participant_path(project, template, template_participant), + params: delete_params, as: :turbo_stream + + expect(future_uninstantiated.reload.meeting).to be_nil + end + + it "sends cancellation emails for template and open occurrences, but not closed" do + delete project_meeting_participant_path(project, template, template_participant), + params: delete_params, as: :turbo_stream + perform_enqueued_jobs + + # 1 cancelled series to removed participant + 1 participant removed to remaining participant + + # 1 occurrence cancelled + expect(ActionMailer::Base.deliveries.size).to eq(3) + expect(ActionMailer::Base.deliveries.map(&:to).flatten).to include(user_with_meeting_permissions.mail) + end + end + end end end diff --git a/modules/meeting/spec/support/pages/meetings/show.rb b/modules/meeting/spec/support/pages/meetings/show.rb index 5c0c6a64e52..2000899ded6 100644 --- a/modules/meeting/spec/support/pages/meetings/show.rb +++ b/modules/meeting/spec/support/pages/meetings/show.rb @@ -575,6 +575,18 @@ module Pages::Meetings click_on "Add" end + def uncheck_apply_to_upcoming + page.find('input[type="checkbox"][name="meeting_participant[apply_to_upcoming]"]').set(false) + end + + def expect_apply_to_upcoming_checked + expect(page).to have_checked_field("meeting_participant[apply_to_upcoming]") + end + + def expect_apply_to_upcoming_unchecked + expect(page).to have_unchecked_field("meeting_participant[apply_to_upcoming]") + end + def expect_no_participant(participant) autocomplete = page.find('[data-test-selector="participants-dialog-autocomplete"]') search_autocomplete(autocomplete, query: participant.lastname, results_selector: "body") diff --git a/modules/openid_connect/app/components/openid_connect/providers/confirm_destroy_dialog_component.html.erb b/modules/openid_connect/app/components/openid_connect/providers/confirm_destroy_dialog_component.html.erb new file mode 100644 index 00000000000..b86753121e9 --- /dev/null +++ b/modules/openid_connect/app/components/openid_connect/providers/confirm_destroy_dialog_component.html.erb @@ -0,0 +1,55 @@ +<%#-- copyright +OpenProject is an open source project management software. +Copyright (C) the OpenProject GmbH + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License version 3. + +OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +Copyright (C) 2006-2013 Jean-Philippe Lang +Copyright (C) 2010-2013 the ChiliProject Team + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +See COPYRIGHT and LICENSE files for more details. + +++#%> + +<%= + render( + Primer::OpenProject::DangerDialog.new( + title: I18n.t("openid_connect.delete_title"), + form_arguments:, + size: :large + ) + ) do |dialog| +%> + <% dialog.with_confirmation_message do |message| + message.with_heading(tag: :h2) { I18n.t("openid_connect.delete_heading") } + message.with_description_content( + I18n.t("provider.delete_warning.provider_html", name: @provider.display_name) + ) + end %> + <% dialog.with_additional_details do %> +
    +
  • <%= I18n.t("provider.delete_warning.delete_result_1") %>
  • +
  • <%= I18n.t("provider.delete_warning.delete_result_user_count", count: @provider.user_count) %>
  • + <% if direct_login? %> +
  • <%= I18n.t("provider.delete_warning.delete_result_direct") %>
  • + <% end %> +
+ <% end %> + <% dialog.with_confirmation_check_box_content(I18n.t(:text_permanent_delete_confirmation_checkbox_label)) %> +<% end %> diff --git a/modules/openid_connect/app/components/openid_connect/providers/confirm_destroy_dialog_component.rb b/modules/openid_connect/app/components/openid_connect/providers/confirm_destroy_dialog_component.rb new file mode 100644 index 00000000000..5680e8684a4 --- /dev/null +++ b/modules/openid_connect/app/components/openid_connect/providers/confirm_destroy_dialog_component.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module OpenIDConnect + module Providers + class ConfirmDestroyDialogComponent < ApplicationComponent + include OpTurbo::Streamable + + def initialize(provider:) + super + @provider = provider + end + + def form_arguments + { + action: openid_connect_provider_path(@provider), + method: :delete + } + end + + def direct_login? + Setting.omniauth_direct_login_provider == @provider.slug + end + end + end +end diff --git a/modules/openid_connect/app/controllers/openid_connect/providers_controller.rb b/modules/openid_connect/app/controllers/openid_connect/providers_controller.rb index 0ea50c86405..ef8f31e9fc1 100644 --- a/modules/openid_connect/app/controllers/openid_connect/providers_controller.rb +++ b/modules/openid_connect/app/controllers/openid_connect/providers_controller.rb @@ -104,7 +104,9 @@ module OpenIDConnect end end - def confirm_destroy; end + def confirm_destroy + respond_with_dialog OpenIDConnect::Providers::ConfirmDestroyDialogComponent.new(provider: @provider) + end def destroy if @provider.destroy diff --git a/modules/openid_connect/app/views/openid_connect/providers/confirm_destroy.html.erb b/modules/openid_connect/app/views/openid_connect/providers/confirm_destroy.html.erb deleted file mode 100644 index a5457d66dba..00000000000 --- a/modules/openid_connect/app/views/openid_connect/providers/confirm_destroy.html.erb +++ /dev/null @@ -1,70 +0,0 @@ -<%# -- copyright -OpenProject is an open source project management software. -Copyright (C) the OpenProject GmbH - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License version 3. - -OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: -Copyright (C) 2006-2013 Jean-Philippe Lang -Copyright (C) 2010-2013 the ChiliProject Team - -This program is free software; you can redistribute it and/or -modify it under the terms of the GNU General Public License -as published by the Free Software Foundation; either version 2 -of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - -See COPYRIGHT and LICENSE files for more details. - -++# %> -<%= styled_form_tag( - openid_connect_provider_path(@provider), - class: "danger-zone", - method: :delete - ) do %> -
-

- <%= t("openid_connect.delete_title") %> -

-

- <%= t("provider.delete_warning.provider_html", - name: content_tag(:strong, @provider.display_name)) %> -

-
    -
  • <%= t("provider.delete_warning.delete_result_1") %>
  • -
  • <%= t("provider.delete_warning.delete_result_user_count", count: @provider.user_count) %>
  • - <% if Setting.omniauth_direct_login_provider == @provider.slug %> -
  • <%= t("provider.delete_warning.delete_result_direct") %>
  • - <% end %> -
-

- - <%= t("provider.delete_warning.irreversible_notice") %> -

-

- <%= t("provider.delete_warning.input_delete_confirmation_html", - name: content_tag(:em, @provider.display_name, class: "danger-zone--expected-value")) %> -

-
- <%= text_field_tag :delete_confirmation %> - <%= styled_button_tag title: t(:button_delete), class: "-primary", disabled: true do - concat content_tag :i, "", class: "button--icon icon-delete" - concat content_tag :span, t(:button_delete), class: "button--text" - end %> - <%= link_to openid_connect_providers_path, - title: t(:button_cancel), - class: "button -with-icon icon-cancel" do %> - <%= t(:button_cancel) %> - <% end %> -
-
-<% end %> diff --git a/modules/openid_connect/app/views/openid_connect/providers/show.html.erb b/modules/openid_connect/app/views/openid_connect/providers/show.html.erb index 8fecba61ba7..269bade8a09 100644 --- a/modules/openid_connect/app/views/openid_connect/providers/show.html.erb +++ b/modules/openid_connect/app/views/openid_connect/providers/show.html.erb @@ -19,7 +19,8 @@ size: :medium, href: confirm_destroy_openid_connect_provider_path(@provider), aria: { label: I18n.t(:button_delete) }, - title: I18n.t(:button_delete) + title: I18n.t(:button_delete), + data: { turbo_stream: true } ) do |button| button.with_leading_visual_icon(icon: :trash) t(:button_delete) diff --git a/modules/openid_connect/config/locales/crowdin/af.yml b/modules/openid_connect/config/locales/crowdin/af.yml index d4e3bcce22e..25d38b0d29a 100644 --- a/modules/openid_connect/config/locales/crowdin/af.yml +++ b/modules/openid_connect/config/locales/crowdin/af.yml @@ -53,7 +53,7 @@ af: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ af: openid_connect: menu_title: OpenID providers delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/ar.yml b/modules/openid_connect/config/locales/crowdin/ar.yml index b65930f8fa6..cc795572cb9 100644 --- a/modules/openid_connect/config/locales/crowdin/ar.yml +++ b/modules/openid_connect/config/locales/crowdin/ar.yml @@ -53,7 +53,7 @@ ar: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ ar: openid_connect: menu_title: مزودو OpenID delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/az.yml b/modules/openid_connect/config/locales/crowdin/az.yml index ce3ccf4e855..ea3b7f726dd 100644 --- a/modules/openid_connect/config/locales/crowdin/az.yml +++ b/modules/openid_connect/config/locales/crowdin/az.yml @@ -53,7 +53,7 @@ az: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ az: openid_connect: menu_title: OpenID providers delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/be.yml b/modules/openid_connect/config/locales/crowdin/be.yml index b4cc7220c3f..3ef556d63c7 100644 --- a/modules/openid_connect/config/locales/crowdin/be.yml +++ b/modules/openid_connect/config/locales/crowdin/be.yml @@ -53,7 +53,7 @@ be: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ be: openid_connect: menu_title: OpenID providers delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/bg.yml b/modules/openid_connect/config/locales/crowdin/bg.yml index adb4088a6fd..832e04b914e 100644 --- a/modules/openid_connect/config/locales/crowdin/bg.yml +++ b/modules/openid_connect/config/locales/crowdin/bg.yml @@ -53,7 +53,7 @@ bg: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ bg: openid_connect: menu_title: OpenID доставчици delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/ca.yml b/modules/openid_connect/config/locales/crowdin/ca.yml index 6bbdd0c9c58..7d8120d83a6 100644 --- a/modules/openid_connect/config/locales/crowdin/ca.yml +++ b/modules/openid_connect/config/locales/crowdin/ca.yml @@ -53,7 +53,7 @@ ca: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ ca: openid_connect: menu_title: Proveïdor d’OpenID delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/ckb-IR.yml b/modules/openid_connect/config/locales/crowdin/ckb-IR.yml index 2762dbe3951..564cd764df5 100644 --- a/modules/openid_connect/config/locales/crowdin/ckb-IR.yml +++ b/modules/openid_connect/config/locales/crowdin/ckb-IR.yml @@ -53,7 +53,7 @@ ckb-IR: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ ckb-IR: openid_connect: menu_title: OpenID providers delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/cs.yml b/modules/openid_connect/config/locales/crowdin/cs.yml index 2f6f0bc34f7..41af368eb87 100644 --- a/modules/openid_connect/config/locales/crowdin/cs.yml +++ b/modules/openid_connect/config/locales/crowdin/cs.yml @@ -53,7 +53,7 @@ cs: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Odstranění poskytovatele SSO je nevratná akce. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Odstranit poskytovatele ze seznamu dostupných poskytovatelů. delete_result_user_count: zero: Tohoto poskytovatele v současné době nepoužívají žádní uživatelé. Není třeba podnikat žádné další kroky. @@ -63,6 +63,7 @@ cs: openid_connect: menu_title: Poskytovatelé OpenID delete_title: Odstranit OpenID Connect poskytovatele + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/da.yml b/modules/openid_connect/config/locales/crowdin/da.yml index c807f7d1f81..86468e4af68 100644 --- a/modules/openid_connect/config/locales/crowdin/da.yml +++ b/modules/openid_connect/config/locales/crowdin/da.yml @@ -53,7 +53,7 @@ da: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ da: openid_connect: menu_title: OpenID providers delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/de.yml b/modules/openid_connect/config/locales/crowdin/de.yml index b4678671c76..07545bc3ab9 100644 --- a/modules/openid_connect/config/locales/crowdin/de.yml +++ b/modules/openid_connect/config/locales/crowdin/de.yml @@ -53,7 +53,7 @@ de: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Das Löschen eines SSO-Anbieters ist eine unwiderrufliche Aktion. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Entfernt diese SSO-Anmeldemöglichkeit aus der Liste der verfügbaren Anbieter. delete_result_user_count: zero: Derzeit verwenden keine Benutzer diesen SSO-Anbieter. Es sind keine weiteren Maßnahmen erforderlich. @@ -63,6 +63,7 @@ de: openid_connect: menu_title: OpenID-Anbieter delete_title: OpenID Connect Anbieter löschen + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect Gruppenverknüpfungen groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/el.yml b/modules/openid_connect/config/locales/crowdin/el.yml index 807b522d397..e7de0054304 100644 --- a/modules/openid_connect/config/locales/crowdin/el.yml +++ b/modules/openid_connect/config/locales/crowdin/el.yml @@ -53,7 +53,7 @@ el: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ el: openid_connect: menu_title: Πάροχοι OpenID delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/eo.yml b/modules/openid_connect/config/locales/crowdin/eo.yml index 10c6c2579cc..4f1d8b6be70 100644 --- a/modules/openid_connect/config/locales/crowdin/eo.yml +++ b/modules/openid_connect/config/locales/crowdin/eo.yml @@ -53,7 +53,7 @@ eo: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ eo: openid_connect: menu_title: OpenID providers delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/es.yml b/modules/openid_connect/config/locales/crowdin/es.yml index b25e97de47e..f8bf51d8db5 100644 --- a/modules/openid_connect/config/locales/crowdin/es.yml +++ b/modules/openid_connect/config/locales/crowdin/es.yml @@ -51,9 +51,9 @@ es: non_object_attribute: no define un objeto JSON en %{attribute}. provider: delete_warning: - input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. + input_delete_confirmation_html: Escribe el nombre del proveedor %{name} para confirmar la eliminación. irreversible_notice: La eliminación de un proveedor SSO es una acción irreversible. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: "¿Estás seguro de que quieres eliminar el proveedor de SSO %{name}? Ten en cuenta que esto provocará que:" delete_result_1: Elimine al proveedor de la lista de proveedores disponibles. delete_result_user_count: zero: Ningún usuario utiliza actualmente este proveedor. No se requiere ninguna acción adicional. @@ -63,6 +63,7 @@ es: openid_connect: menu_title: Proveedores de OpenID delete_title: Eliminar el proveedor OpenID Connect + delete_heading: "¿Borrar este proveedor de OpenID Connect?" group_links_heading: Enlaces de grupo de OpenID Connect groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/et.yml b/modules/openid_connect/config/locales/crowdin/et.yml index abb7f3cab60..f53bf9d428d 100644 --- a/modules/openid_connect/config/locales/crowdin/et.yml +++ b/modules/openid_connect/config/locales/crowdin/et.yml @@ -53,7 +53,7 @@ et: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ et: openid_connect: menu_title: OpenID providers delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/eu.yml b/modules/openid_connect/config/locales/crowdin/eu.yml index 657906dd0e0..4343451d4b7 100644 --- a/modules/openid_connect/config/locales/crowdin/eu.yml +++ b/modules/openid_connect/config/locales/crowdin/eu.yml @@ -53,7 +53,7 @@ eu: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ eu: openid_connect: menu_title: OpenID providers delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/fa.yml b/modules/openid_connect/config/locales/crowdin/fa.yml index 0f3b44aad99..7de36c21ece 100644 --- a/modules/openid_connect/config/locales/crowdin/fa.yml +++ b/modules/openid_connect/config/locales/crowdin/fa.yml @@ -53,7 +53,7 @@ fa: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ fa: openid_connect: menu_title: OpenID providers delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/fi.yml b/modules/openid_connect/config/locales/crowdin/fi.yml index 6f8ac48d679..ac58f5c48fb 100644 --- a/modules/openid_connect/config/locales/crowdin/fi.yml +++ b/modules/openid_connect/config/locales/crowdin/fi.yml @@ -53,7 +53,7 @@ fi: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ fi: openid_connect: menu_title: OpenID providers delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/fil.yml b/modules/openid_connect/config/locales/crowdin/fil.yml index d7df614869b..ac4b78059aa 100644 --- a/modules/openid_connect/config/locales/crowdin/fil.yml +++ b/modules/openid_connect/config/locales/crowdin/fil.yml @@ -53,7 +53,7 @@ fil: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ fil: openid_connect: menu_title: OpenID providers delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/fr.yml b/modules/openid_connect/config/locales/crowdin/fr.yml index 62deaf07121..37ee0eef8f2 100644 --- a/modules/openid_connect/config/locales/crowdin/fr.yml +++ b/modules/openid_connect/config/locales/crowdin/fr.yml @@ -53,7 +53,7 @@ fr: delete_warning: input_delete_confirmation_html: Saisissez le nom du fournisseur %{name} pour confirmer la suppression. irreversible_notice: La suppression d'un fournisseur SSO est une action irréversible. - provider_html: 'Voulez-vous vraiment supprimer le fournisseur SSO %{name} ? Pour confirmer cette action, veuillez saisir le nom du fournisseur dans le champ ci-dessous :' + provider_html: 'Êtes-vous sûr de vouloir supprimer le fournisseur SSO %{name} ? Sachez que cela aura pour effet de :' delete_result_1: Supprimez le fournisseur de la liste des fournisseurs disponibles. delete_result_user_count: zero: Aucun utilisateur n'utilise actuellement ce fournisseur. Aucune action supplémentaire n'est requise. @@ -63,6 +63,7 @@ fr: openid_connect: menu_title: Fournisseurs OpenID delete_title: Supprimer le fournisseur OpenID Connect + delete_heading: Supprimer ce fournisseur OpenID Connect ? group_links_heading: Liens du groupe OpenID Connect groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/he.yml b/modules/openid_connect/config/locales/crowdin/he.yml index 6b7dd70b89c..04ffb8cf9ed 100644 --- a/modules/openid_connect/config/locales/crowdin/he.yml +++ b/modules/openid_connect/config/locales/crowdin/he.yml @@ -53,7 +53,7 @@ he: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ he: openid_connect: menu_title: OpenID providers delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/hi.yml b/modules/openid_connect/config/locales/crowdin/hi.yml index 172fbf6b8b3..6fe8ce6b94d 100644 --- a/modules/openid_connect/config/locales/crowdin/hi.yml +++ b/modules/openid_connect/config/locales/crowdin/hi.yml @@ -53,7 +53,7 @@ hi: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ hi: openid_connect: menu_title: OpenID providers delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/hr.yml b/modules/openid_connect/config/locales/crowdin/hr.yml index f622b7d430b..2b136a90031 100644 --- a/modules/openid_connect/config/locales/crowdin/hr.yml +++ b/modules/openid_connect/config/locales/crowdin/hr.yml @@ -53,7 +53,7 @@ hr: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ hr: openid_connect: menu_title: OpenID providers delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/hu.yml b/modules/openid_connect/config/locales/crowdin/hu.yml index e39fc8ec0b7..41649ef1412 100644 --- a/modules/openid_connect/config/locales/crowdin/hu.yml +++ b/modules/openid_connect/config/locales/crowdin/hu.yml @@ -53,7 +53,7 @@ hu: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ hu: openid_connect: menu_title: OpenID szolgáltató delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/id.yml b/modules/openid_connect/config/locales/crowdin/id.yml index 700f58034a7..082c7693f1a 100644 --- a/modules/openid_connect/config/locales/crowdin/id.yml +++ b/modules/openid_connect/config/locales/crowdin/id.yml @@ -53,7 +53,7 @@ id: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Menghapus penyedia SSO adalah tindakan yang tidak dapat dibatalkan. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ id: openid_connect: menu_title: penyedia OpenID delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/it.yml b/modules/openid_connect/config/locales/crowdin/it.yml index 85b00663fb6..0e5d4b9a6e9 100644 --- a/modules/openid_connect/config/locales/crowdin/it.yml +++ b/modules/openid_connect/config/locales/crowdin/it.yml @@ -51,9 +51,9 @@ it: non_object_attribute: non definisce un oggetto JSON in %{attribute}. provider: delete_warning: - input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. + input_delete_confirmation_html: Inserisci il nome del fornitore %{name} per confermare l'eliminazione. irreversible_notice: L'eliminazione di un fornitore SSO è un'operazione irreversibile. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Vuoi davvero eliminare il provider SSO %{name}? Tieni presente che questo comporterà:' delete_result_1: Rimuovi il fornitore dall'elenco dei fornitori disponibili. delete_result_user_count: zero: Nessun utente sta attualmente utilizzando questo fornitore. Non sono necessarie ulteriori azioni. @@ -63,6 +63,7 @@ it: openid_connect: menu_title: OpenID provider delete_title: Elimina fornitore OpenID Connect + delete_heading: Eliminare questo provider OpenID Connect? group_links_heading: Link di gruppo OpenID Connect groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/ja.yml b/modules/openid_connect/config/locales/crowdin/ja.yml index 039e1f31ddf..4665d558966 100644 --- a/modules/openid_connect/config/locales/crowdin/ja.yml +++ b/modules/openid_connect/config/locales/crowdin/ja.yml @@ -53,7 +53,7 @@ ja: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: ワークパッケージの削除は復元できない操作です。 - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: 利用可能なプロバイダのリストからプロバイダを削除します。 delete_result_user_count: zero: 現在、このプロバイダを使用しているユーザーはいません。これ以上の操作は必要ありません。 @@ -63,6 +63,7 @@ ja: openid_connect: menu_title: OpenID プロバイダー delete_title: OpenID Connectプロバイダの削除 + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connectグループリンク groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/ka.yml b/modules/openid_connect/config/locales/crowdin/ka.yml index b09f3c68f7a..19803ef2cfe 100644 --- a/modules/openid_connect/config/locales/crowdin/ka.yml +++ b/modules/openid_connect/config/locales/crowdin/ka.yml @@ -53,7 +53,7 @@ ka: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ ka: openid_connect: menu_title: OpenID providers delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/kk.yml b/modules/openid_connect/config/locales/crowdin/kk.yml index 311e264e046..646c61f097a 100644 --- a/modules/openid_connect/config/locales/crowdin/kk.yml +++ b/modules/openid_connect/config/locales/crowdin/kk.yml @@ -53,7 +53,7 @@ kk: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ kk: openid_connect: menu_title: OpenID providers delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/ko.yml b/modules/openid_connect/config/locales/crowdin/ko.yml index 1ecdfee54f3..f6c761303f8 100644 --- a/modules/openid_connect/config/locales/crowdin/ko.yml +++ b/modules/openid_connect/config/locales/crowdin/ko.yml @@ -53,7 +53,7 @@ ko: delete_warning: input_delete_confirmation_html: 삭제를 확인하려면 공급자 이름 %{name}(을)를 입력하세요. irreversible_notice: SSO 공급자를 삭제하면 되돌릴 수 없습니다. - provider_html: SSO 공급자 %{name}을(를) 삭제하시겠습니까? 이 액션을 확인하려면 아래 필드에 공급자 이름을 입력하세요. 이렇게 하면 다음과 같이 됩니다. + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: 사용 가능한 공급자 목록에서 공급자를 제거합니다. delete_result_user_count: zero: 현재 이 공급자를 사용하는 사용자가 없습니다. 추가 조치가 필요하지 않습니다. @@ -63,6 +63,7 @@ ko: openid_connect: menu_title: OpenID 공급자 delete_title: OpenID Connect 공급자 삭제 + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect 그룹 링크 groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/lt.yml b/modules/openid_connect/config/locales/crowdin/lt.yml index be028c177b2..eb74aaf7195 100644 --- a/modules/openid_connect/config/locales/crowdin/lt.yml +++ b/modules/openid_connect/config/locales/crowdin/lt.yml @@ -53,7 +53,7 @@ lt: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ lt: openid_connect: menu_title: OpenID tiekėjai delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/lv.yml b/modules/openid_connect/config/locales/crowdin/lv.yml index e988cc54605..fa45ef19f72 100644 --- a/modules/openid_connect/config/locales/crowdin/lv.yml +++ b/modules/openid_connect/config/locales/crowdin/lv.yml @@ -53,7 +53,7 @@ lv: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ lv: openid_connect: menu_title: OpenID providers delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/mn.yml b/modules/openid_connect/config/locales/crowdin/mn.yml index 6024daca7bf..075bd093c23 100644 --- a/modules/openid_connect/config/locales/crowdin/mn.yml +++ b/modules/openid_connect/config/locales/crowdin/mn.yml @@ -53,7 +53,7 @@ mn: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ mn: openid_connect: menu_title: OpenID providers delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/ms.yml b/modules/openid_connect/config/locales/crowdin/ms.yml index f0026c2ac27..59b28140a73 100644 --- a/modules/openid_connect/config/locales/crowdin/ms.yml +++ b/modules/openid_connect/config/locales/crowdin/ms.yml @@ -53,7 +53,7 @@ ms: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Memadamkan pembekal SSO ialah tindakan yang tidak boleh diubah. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Alih keluar pembekal daripada senarai pembekal yang tersedia. delete_result_user_count: zero: Tiada pengguna yang menggunakan penyedia ini pada masa ini. Tiada tindakan lanjut diperlukan. @@ -63,6 +63,7 @@ ms: openid_connect: menu_title: Penyedia OpenID delete_title: Padam pembekal OpenID Connect + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/ne.yml b/modules/openid_connect/config/locales/crowdin/ne.yml index 51b271fd306..afafa10984c 100644 --- a/modules/openid_connect/config/locales/crowdin/ne.yml +++ b/modules/openid_connect/config/locales/crowdin/ne.yml @@ -53,7 +53,7 @@ ne: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ ne: openid_connect: menu_title: OpenID providers delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/nl.yml b/modules/openid_connect/config/locales/crowdin/nl.yml index e02c709d3e2..f7581463c98 100644 --- a/modules/openid_connect/config/locales/crowdin/nl.yml +++ b/modules/openid_connect/config/locales/crowdin/nl.yml @@ -53,7 +53,7 @@ nl: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Het verwijderen van een SSO provider is een onomkeerbare actie. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Verwijder de provider uit de lijst met beschikbare providers. delete_result_user_count: zero: Er zijn momenteel geen gebruikers die deze provider gebruiken. Er is geen verdere actie vereist. @@ -63,6 +63,7 @@ nl: openid_connect: menu_title: OpenID aanbieders delete_title: OpenID Connect provider verwijderen + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/no.yml b/modules/openid_connect/config/locales/crowdin/no.yml index 677c1fc00fe..7c2e98cb3ff 100644 --- a/modules/openid_connect/config/locales/crowdin/no.yml +++ b/modules/openid_connect/config/locales/crowdin/no.yml @@ -53,7 +53,7 @@ delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ openid_connect: menu_title: OpenID-leverandører delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/pl.yml b/modules/openid_connect/config/locales/crowdin/pl.yml index 609dcaa7fb3..990fa5454c9 100644 --- a/modules/openid_connect/config/locales/crowdin/pl.yml +++ b/modules/openid_connect/config/locales/crowdin/pl.yml @@ -53,7 +53,7 @@ pl: delete_warning: input_delete_confirmation_html: Wprowadź nazwę dostawcy %{name}, aby potwierdzić usunięcie. irreversible_notice: Usunięcie dostawcy SSO jest działaniem nieodwracalnym. - provider_html: 'Czy na pewno chcesz usunąć dostawcę SSO %{name}? Aby potwierdzić to działanie, wprowadź nazwę dostawcy w polu poniżej, spowoduje to:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Usunięcie dostawcy z listy dostępnych dostawców. delete_result_user_count: zero: Żaden użytkownik nie korzysta obecnie z tego dostawcy. Nie są wymagane żadne dalsze działania. @@ -63,6 +63,7 @@ pl: openid_connect: menu_title: Dostawcy OpenID delete_title: Usuń dostawcę OpenID Connect + delete_heading: Delete this OpenID Connect provider? group_links_heading: Linki do grup OpenID Connect groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/pt-BR.yml b/modules/openid_connect/config/locales/crowdin/pt-BR.yml index f6c1a97bfee..0b7cf14f595 100644 --- a/modules/openid_connect/config/locales/crowdin/pt-BR.yml +++ b/modules/openid_connect/config/locales/crowdin/pt-BR.yml @@ -53,7 +53,7 @@ pt-BR: delete_warning: input_delete_confirmation_html: Digite o nome do provedor %{name} para confirmar a exclusão. irreversible_notice: Excluir um provedor SSO é uma ação irreversível. - provider_html: 'Tem certeza de que deseja excluir o provedor SSO %{name}? Para confirmar esta ação, digite o nome do provedor no campo abaixo; isso irá:' + provider_html: 'Tem certeza de que deseja excluir o provedor de SSO %{name}? Esteja ciente de que isso irá:' delete_result_1: Remover o provedor da lista de provedores disponíveis. delete_result_user_count: zero: Nenhum usuário está utilizando este provedor no momento. Não é necessária nenhuma ação adicional. @@ -63,6 +63,7 @@ pt-BR: openid_connect: menu_title: Provedores OpenID delete_title: Excluir o provedor OpenID Connect + delete_heading: Deseja excluir este provedor do OpenID Connect? group_links_heading: Links de grupos OpenID Connect groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/pt-PT.yml b/modules/openid_connect/config/locales/crowdin/pt-PT.yml index 66b42381a90..89f9dae7ebb 100644 --- a/modules/openid_connect/config/locales/crowdin/pt-PT.yml +++ b/modules/openid_connect/config/locales/crowdin/pt-PT.yml @@ -53,7 +53,7 @@ pt-PT: delete_warning: input_delete_confirmation_html: Insira o nome do fornecedor %{name} para confirmar a eliminação. irreversible_notice: A eliminação de um fornecedor SSO é uma ação irreversível. - provider_html: 'Tem a certeza de que pretende eliminar o fornecedor SSO %{name}? Para confirmar esta ação, introduza o nome do fornecedor no campo abaixo, isto irá:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remova o fornecedor da lista de fornecedores disponíveis. delete_result_user_count: zero: Nenhum utilizador está atualmente a utilizar este fornecedor. Não é necessária mais nenhuma ação. @@ -63,6 +63,7 @@ pt-PT: openid_connect: menu_title: Fornecedores de OpenID delete_title: Eliminar o fornecedor OpenID Connect + delete_heading: Delete this OpenID Connect provider? group_links_heading: Ligações de grupos OpenID Connect groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/ro.yml b/modules/openid_connect/config/locales/crowdin/ro.yml index 50dfeb24087..27b18cbb562 100644 --- a/modules/openid_connect/config/locales/crowdin/ro.yml +++ b/modules/openid_connect/config/locales/crowdin/ro.yml @@ -53,7 +53,7 @@ ro: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ ro: openid_connect: menu_title: Furnizori OpenID delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/ru.yml b/modules/openid_connect/config/locales/crowdin/ru.yml index ada2d530ba8..6eaa823cd12 100644 --- a/modules/openid_connect/config/locales/crowdin/ru.yml +++ b/modules/openid_connect/config/locales/crowdin/ru.yml @@ -53,7 +53,7 @@ ru: delete_warning: input_delete_confirmation_html: Введите имя провайдера %{name} для подтверждения удаления. irreversible_notice: Удаление SSO провайдера является необратимым действием. - provider_html: 'Вы уверены, что хотите удалить провайдера SSO %{name}? Чтобы подтвердить это действие, пожалуйста, введите имя провайдера в поле ниже, это позволит:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Удалить провайдера из списка доступных провайдеров. delete_result_user_count: zero: Нет пользователей в настоящее время с этим провайдером. Никаких дальнейших действий не требуется. @@ -63,6 +63,7 @@ ru: openid_connect: menu_title: Провайдеры OpenID delete_title: Удалить провайдера OpenID Connect + delete_heading: Delete this OpenID Connect provider? group_links_heading: Ссылки на группу OpenID Connect groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/rw.yml b/modules/openid_connect/config/locales/crowdin/rw.yml index 1933ac50064..87b7eac2afa 100644 --- a/modules/openid_connect/config/locales/crowdin/rw.yml +++ b/modules/openid_connect/config/locales/crowdin/rw.yml @@ -53,7 +53,7 @@ rw: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ rw: openid_connect: menu_title: OpenID providers delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/si.yml b/modules/openid_connect/config/locales/crowdin/si.yml index 18fd8f9c3a3..28c577255b7 100644 --- a/modules/openid_connect/config/locales/crowdin/si.yml +++ b/modules/openid_connect/config/locales/crowdin/si.yml @@ -53,7 +53,7 @@ si: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ si: openid_connect: menu_title: OpenID providers delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/sk.yml b/modules/openid_connect/config/locales/crowdin/sk.yml index a5099b150a4..ce7ee59a654 100644 --- a/modules/openid_connect/config/locales/crowdin/sk.yml +++ b/modules/openid_connect/config/locales/crowdin/sk.yml @@ -53,7 +53,7 @@ sk: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ sk: openid_connect: menu_title: OpenID providers delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/sl.yml b/modules/openid_connect/config/locales/crowdin/sl.yml index a1a0f26e44b..010e276a2cf 100644 --- a/modules/openid_connect/config/locales/crowdin/sl.yml +++ b/modules/openid_connect/config/locales/crowdin/sl.yml @@ -53,7 +53,7 @@ sl: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ sl: openid_connect: menu_title: OpenID ponudniki delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/sr.yml b/modules/openid_connect/config/locales/crowdin/sr.yml index 1b9d1707dad..80357cf46bb 100644 --- a/modules/openid_connect/config/locales/crowdin/sr.yml +++ b/modules/openid_connect/config/locales/crowdin/sr.yml @@ -53,7 +53,7 @@ sr: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ sr: openid_connect: menu_title: OpenID providers delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/sv.yml b/modules/openid_connect/config/locales/crowdin/sv.yml index aa3b6ce0808..3ae2c3a84d4 100644 --- a/modules/openid_connect/config/locales/crowdin/sv.yml +++ b/modules/openid_connect/config/locales/crowdin/sv.yml @@ -53,7 +53,7 @@ sv: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ sv: openid_connect: menu_title: OpenID leverantörer delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/th.yml b/modules/openid_connect/config/locales/crowdin/th.yml index 1f228e883d4..bcfb4fdeae4 100644 --- a/modules/openid_connect/config/locales/crowdin/th.yml +++ b/modules/openid_connect/config/locales/crowdin/th.yml @@ -53,7 +53,7 @@ th: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ th: openid_connect: menu_title: OpenID providers delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/tr.yml b/modules/openid_connect/config/locales/crowdin/tr.yml index c49ffa443b8..f977598fa58 100644 --- a/modules/openid_connect/config/locales/crowdin/tr.yml +++ b/modules/openid_connect/config/locales/crowdin/tr.yml @@ -53,7 +53,7 @@ tr: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: SSO sağlayıcısını silme geri alınamaz bir işlemdir. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Sağlayıcının adını mevcut sağlayıcılardan kaldır. delete_result_user_count: zero: Bu sağlayıcıyı hiçbir kullanıcı kullanmıyor. Ek bir işleme gerek yok. @@ -63,6 +63,7 @@ tr: openid_connect: menu_title: OpenID sağlayıcıları delete_title: OpenID Connect sağlayıcısını sil + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect grup bağlantıları groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/uk.yml b/modules/openid_connect/config/locales/crowdin/uk.yml index 8cc73117dcf..d5c9d94e028 100644 --- a/modules/openid_connect/config/locales/crowdin/uk.yml +++ b/modules/openid_connect/config/locales/crowdin/uk.yml @@ -53,7 +53,7 @@ uk: delete_warning: input_delete_confirmation_html: Введіть ім’я постачальника послуг %{name}, щоб підтвердити видалення. irreversible_notice: Видалення постачальника послуг SSO не можна скасувати. - provider_html: 'Справді видалити постачальника послуг SSO %{name}? Щоб підтвердити цю дію, введіть ім’я постачальника в поле нижче. Після цього:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Вилучіть постачальника послуг зі списку доступних постачальників. delete_result_user_count: zero: Зараз у цього постачальника послуг немає користувачів. Нічого робити не потрібно. @@ -63,6 +63,7 @@ uk: openid_connect: menu_title: Постачальники OpenID delete_title: Видалити постачальника послуг OpenID Connect + delete_heading: Delete this OpenID Connect provider? group_links_heading: Посилання на групи OpenID Connect groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/uz.yml b/modules/openid_connect/config/locales/crowdin/uz.yml index f4244e4c6fe..b0959a2f092 100644 --- a/modules/openid_connect/config/locales/crowdin/uz.yml +++ b/modules/openid_connect/config/locales/crowdin/uz.yml @@ -53,7 +53,7 @@ uz: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -63,6 +63,7 @@ uz: openid_connect: menu_title: OpenID providers delete_title: Delete OpenID Connect provider + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect group links groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/vi.yml b/modules/openid_connect/config/locales/crowdin/vi.yml index 04db3722ad9..fd8a2415c05 100644 --- a/modules/openid_connect/config/locales/crowdin/vi.yml +++ b/modules/openid_connect/config/locales/crowdin/vi.yml @@ -53,7 +53,7 @@ vi: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Xóa nhà cung cấp SSO là hành động không thể thay đổi được. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Xóa nhà cung cấp khỏi danh sách các nhà cung cấp có sẵn. delete_result_user_count: zero: Không có người dùng hiện đang sử dụng nhà cung cấp này. Không cần thực hiện thêm hành động nào. @@ -63,6 +63,7 @@ vi: openid_connect: menu_title: Nhà cung cấp OpenID delete_title: Xóa nhà cung cấp OpenID Connect + delete_heading: Delete this OpenID Connect provider? group_links_heading: Liên kết nhóm OpenID Connect groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/zh-CN.yml b/modules/openid_connect/config/locales/crowdin/zh-CN.yml index a0271b10e05..54e8e7e34e8 100644 --- a/modules/openid_connect/config/locales/crowdin/zh-CN.yml +++ b/modules/openid_connect/config/locales/crowdin/zh-CN.yml @@ -51,9 +51,9 @@ zh-CN: non_object_attribute: 未在 %{attribute} 中定义 JSON 对象。 provider: delete_warning: - input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. + input_delete_confirmation_html: 输入提供程序名称 %{name} 以确认删除。 irreversible_notice: 删除项目是一个不可逆转的操作。 - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 确定要删除 SSO 提供程序 %{name} 吗?请注意,此操作将: delete_result_1: 从可用的提供商列表中删除提供商。 delete_result_user_count: zero: 目前没有用户正在使用此提供商。无需采取进一步操作。 @@ -63,6 +63,7 @@ zh-CN: openid_connect: menu_title: OpenID 提供商 delete_title: 删除 OpenID Connect 提供商 + delete_heading: 删除此 OpenID Connect 提供程序? group_links_heading: OpenID Connect 群组链接 groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/crowdin/zh-TW.yml b/modules/openid_connect/config/locales/crowdin/zh-TW.yml index 887872300cb..20296d441d0 100644 --- a/modules/openid_connect/config/locales/crowdin/zh-TW.yml +++ b/modules/openid_connect/config/locales/crowdin/zh-TW.yml @@ -53,7 +53,7 @@ zh-TW: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: 刪除 SSO 提供者是不可逆轉的動作。 - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: 從可用提供者清單中移除提供者。 delete_result_user_count: zero: 目前沒有使用者使用此供應商。不需要採取進一步的行動。 @@ -63,6 +63,7 @@ zh-TW: openid_connect: menu_title: OpenID 提供商 delete_title: 刪除 OpenID Connect 提供者 + delete_heading: Delete this OpenID Connect provider? group_links_heading: OpenID Connect 群組連結 groups: match_preview_component: diff --git a/modules/openid_connect/config/locales/en.yml b/modules/openid_connect/config/locales/en.yml index e8b0d23c425..5eb2a7c4798 100644 --- a/modules/openid_connect/config/locales/en.yml +++ b/modules/openid_connect/config/locales/en.yml @@ -53,7 +53,7 @@ en: delete_warning: input_delete_confirmation_html: Enter the provider name %{name} to confirm deletion. irreversible_notice: Deleting an SSO provider is an irreversible action. - provider_html: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:' + provider_html: 'Are you sure you want to delete the SSO provider %{name}? Be aware, that this will:' delete_result_1: Remove the provider from the list of available providers. delete_result_user_count: zero: No users are currently using this provider. No further action is required. @@ -64,6 +64,7 @@ en: openid_connect: menu_title: OpenID providers delete_title: "Delete OpenID Connect provider" + delete_heading: "Delete this OpenID Connect provider?" group_links_heading: OpenID Connect group links groups: diff --git a/modules/openid_connect/spec/features/administration/oidc_custom_crud_spec.rb b/modules/openid_connect/spec/features/administration/oidc_custom_crud_spec.rb index 27da0ec708c..af0e65994ec 100644 --- a/modules/openid_connect/spec/features/administration/oidc_custom_crud_spec.rb +++ b/modules/openid_connect/spec/features/administration/oidc_custom_crud_spec.rb @@ -34,7 +34,6 @@ require_module_spec_helper RSpec.describe "OIDC administration CRUD", :js do shared_let(:user) { create(:admin) } - let(:danger_zone) { DangerZone.new(page) } before do login_as(user) @@ -130,20 +129,9 @@ RSpec.describe "OIDC administration CRUD", expect(provider.group_regexes).to eq(["Foo", "Bar"]) click_link_or_button "Delete" - # Confirm the deletion - # Without confirmation, the button is disabled - expect(danger_zone).to be_disabled - # With wrong confirmation, the button is disabled - danger_zone.confirm_with("foo") - - expect(danger_zone).to be_disabled - - # With correct confirmation, the button is enabled - # and the project can be deleted - danger_zone.confirm_with(provider.display_name) - expect(danger_zone).not_to be_disabled - danger_zone.danger_button.click + check "I understand that this deletion cannot be reversed" + click_on "Delete permanently" expect(page).to have_text "No OpenID providers configured yet." expect { provider.reload }.to raise_error ActiveRecord::RecordNotFound diff --git a/modules/storages/config/locales/crowdin/es.yml b/modules/storages/config/locales/crowdin/es.yml index b5cc1975e9b..bde2e8e8595 100644 --- a/modules/storages/config/locales/crowdin/es.yml +++ b/modules/storages/config/locales/crowdin/es.yml @@ -285,8 +285,8 @@ es: drive_contents: Contenido de la unidad files_request: Obteniendo archivos de carpetas de equipo header: Carpetas de proyecto gestionadas automáticamente - project_folders_exist: Project folders exist - project_folders_linked: Project folders linked + project_folders_exist: Hay carpetas de proyectos + project_folders_linked: Carpetas de proyectos vinculadas team_folder_app: 'Dependencia: Carpetas de equipo' team_folder_contents: Contenido de la carpeta de equipo team_folder_presence: La carpeta del equipo existe @@ -330,10 +330,10 @@ es: nc_oauth_request_not_found: No se ha encontrado el terminal para obtener el usuario actualmente conectado. Consulte los registros del servidor para obtener más información. nc_oauth_request_unauthorized: El usuario actual no está autorizado a acceder al almacenamiento remoto de archivos. Consulte los registros del servidor para obtener más información. nc_oauth_token_missing: OpenProject no puede probar la comunicación a nivel de usuario con Nextcloud, ya que el usuario aún no ha vinculado su cuenta de Nextcloud. - nc_project_folder_missing: The previously created project folder for project "%{project}" could not be found. + nc_project_folder_missing: No se ha encontrado la carpeta del proyecto «%{project}» creada anteriormente. nc_team_folder_not_found: No se ha podido encontrar la carpeta del equipo. - nc_unexpected_files: 'Unexpected files found in the managed team folder. For example: %{sample}' - nc_unlinked_project_folders: Not all project folders have been created yet (%{actual} / %{expected}). This can indicate errors during the AMPF background synchronization. + nc_unexpected_files: 'Se han encontrado archivos inesperados en la carpeta del equipo gestionado. Por ejemplo: %{sample}' + nc_unlinked_project_folders: Aún no se han creado todas las carpetas de proyecto (%{actual}/%{expected}). Esto puede indicar que se han producido errores durante la sincronización en segundo plano de AMPF. nc_userless_access_denied: La contraseña configurada de la aplicación no es válida. not_configured: No se ha podido validar la conexión. Por favor, termine primero la configuración. od_client_cant_delete_folder: El cliente tiene problemas para eliminar carpetas. Consulte la documentación de configuración de su almacenamiento. diff --git a/modules/storages/config/locales/crowdin/fr.yml b/modules/storages/config/locales/crowdin/fr.yml index 14f819a38d9..49a8ef760a0 100644 --- a/modules/storages/config/locales/crowdin/fr.yml +++ b/modules/storages/config/locales/crowdin/fr.yml @@ -285,8 +285,8 @@ fr: drive_contents: Contenu du lecteur files_request: Récupération des fichiers du dossier de l'équipe header: Dossiers de projets gérés automatiquement - project_folders_exist: Project folders exist - project_folders_linked: Project folders linked + project_folders_exist: Les dossiers de projet existent + project_folders_linked: Dossiers de projets liés team_folder_app: 'Dépendance : dossiers d''équipe' team_folder_contents: Contenu du dossier de l'équipe team_folder_presence: Le dossier de l'équipe existe @@ -401,7 +401,7 @@ fr: host: Veuillez ajouter l'adresse d'hôte de votre stockage, y compris le https://. Il ne doit pas dépasser 255 caractères. managed_project_folders_application_password_caption: 'Activez les dossiers gérés automatiquement en copiant cette valeur depuis : %{provider_type_link}.' name: Donnez à votre espace de stockage un nom pour permettre aux utilisateurs de le différencier des autres espaces de stockage. - new_storage_html: Read our documentation on [setting up a %{provider_name} file storage](docs_url) integration for more information. + new_storage_html: Lisez notre documentation sur l'intégration de [configuration d'un espace de stockage de fichiers %{provider_name}](docs_url) pour en savoir plus. nextcloud: application_link_text: application « Intégration OpenProject» integration: Administration Nextcloud / OpenProject @@ -413,7 +413,7 @@ fr: no_specific_folder: Par défaut, chaque utilisateur démarrera dans son propre dossier d'accueil lorsqu'il téléversera un fichier. no_storage_set_up: Aucun espace de stockage de fichiers n'a été configuré pour le moment. not_logged_into_storage: Pour sélectionner un dossier de projet, veuillez d'abord vous connecter - oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [Nextcloud OpenProject Integration settings](oauth_application_details_link). + oauth_application_details_html: La clé secrète du client ne sera plus accessible après la fermeture de cette fenêtre. Veuillez copier ces valeurs dans les [paramètres d'intégration Nextcloud OpenProject](oauth_application_details_link). one_drive: application_link_text: Portal Azure copy_redirect_uri: Copier l'URI de redirection diff --git a/modules/storages/config/locales/crowdin/it.yml b/modules/storages/config/locales/crowdin/it.yml index 6058495434c..b4b9e6d5c5c 100644 --- a/modules/storages/config/locales/crowdin/it.yml +++ b/modules/storages/config/locales/crowdin/it.yml @@ -207,8 +207,8 @@ it: admin: side_panel: health_notifications_component: - sync_now: Sync now - sync_queued: Synchronization queued. + sync_now: Sincronizza ora + sync_queued: Sincronizzazione in coda. buttons: done_continue: Fatto, continua open_storage: Apri archivio file @@ -229,11 +229,11 @@ it: delete_warning: project_storage_delete_result_1: Tutti i link ai file e alle cartelle corrispondenti saranno rimossi project_storage_delete_result_2: La cartella di progetto gestita automaticamente e tutti i file in essa contenuti verranno eliminati - project_storage_html: Are you sure you want to remove %{file_storage} from this project? + project_storage_html: Vuoi davvero rimuovere %{file_storage} dal progetto? storage_delete_result_1: L'archivio verrà rimosso da tutti i progetti che lo stanno usando storage_delete_result_2: Tutti i link ai file e alle cartelle corrispondenti saranno rimossi storage_delete_result_3: La cartella di progetto gestita automaticamente e tutti i file in essa contenuti verranno eliminati - storage_html: Are you sure you want to delete %{file_storage} as an external file storage? + storage_html: Vuoi davvero eliminare %{file_storage} come archivio file esterno? dependencies: nextcloud: group_folders_app: Cartelle di team @@ -285,8 +285,8 @@ it: drive_contents: Contenuto dell'unità files_request: Recupero dei file delle cartelle di team header: Cartelle di progetto gestite automaticamente - project_folders_exist: Project folders exist - project_folders_linked: Project folders linked + project_folders_exist: Le cartelle del progetto esistono + project_folders_linked: Cartelle di progetto collegate team_folder_app: 'Dipendenza: Cartelle di team' team_folder_contents: Contenuto della cartella di team team_folder_presence: La cartella di team esiste @@ -330,10 +330,10 @@ it: nc_oauth_request_not_found: L'endpoint per recuperare l'utente attualmente connesso non è stato trovato. Per ulteriori informazioni, consulta i log del server. nc_oauth_request_unauthorized: L'utente attuale non è autorizzato ad accedere all'archivio file remoto. Per ulteriori informazioni, consulta i log del server. nc_oauth_token_missing: OpenProject non può testare la comunicazione a livello utente con Nextcloud poiché l'utente non ha ancora collegato il proprio account Nextcloud. - nc_project_folder_missing: The previously created project folder for project "%{project}" could not be found. + nc_project_folder_missing: La cartella di progetto creata in precedenza per il progetto "%{project}" non è stata trovata. nc_team_folder_not_found: Impossibile trovare la cartella di team. - nc_unexpected_files: 'Unexpected files found in the managed team folder. For example: %{sample}' - nc_unlinked_project_folders: Not all project folders have been created yet (%{actual} / %{expected}). This can indicate errors during the AMPF background synchronization. + nc_unexpected_files: 'Sono stati trovati file imprevisti nella cartella del team gestita. Ad esempio: %{sample}' + nc_unlinked_project_folders: Non tutte le cartelle di progetto sono state ancora create (%{actual} / %{expected}). Questo può indicare errori durante la sincronizzazione in background di AMPF. nc_userless_access_denied: La password dell'app configurata non è valida. not_configured: Non è stato possibile verificare la connessione. Prima è necessario completare la configurazione. od_client_cant_delete_folder: Il cliente riscontra problemi con l'eliminazione delle cartelle. Consulta la documentazione di configurazione del tuo archivio. @@ -382,7 +382,7 @@ it: failure: Alcuni controlli non sono riusciti e il sistema non funziona come previsto. success: Tutte le connessioni e i sistemi funzionano come previsto. warning: Alcuni controlli hanno restituito un avviso. Questo può causare comportamenti imprevisti. - synced: 'Last sync: %{datetime}' + synced: 'Ultima sincronizzazione: %{datetime}' title: Report sullo stato di salute health_email_notifications: description_disabled: Gli amministratori non riceveranno aggiornamenti via email quando ci sono aggiornamenti importanti. @@ -401,7 +401,7 @@ it: host: Aggiungi l'indirizzo host del tuo spazio di archiviazione incluso https://. Non dovrebbe essere più lungo di 255 caratteri. managed_project_folders_application_password_caption: 'Abilita le cartelle gestite automaticamente copiando questo valore da: %{provider_type_link}.' name: Dai al tuo archivio un nome in modo che gli utenti lo possano distinguere tra più archivi. - new_storage_html: Read our documentation on [setting up a %{provider_name} file storage](docs_url) integration for more information. + new_storage_html: Consulta la nostra documentazione su come [configurare un'integrazione di archiviazione file %{provider_name}](docs_url) per maggiori informazioni. nextcloud: application_link_text: applicazione "Integrazione OpenProject" integration: Nextcloud Administration / OpenProject @@ -413,7 +413,7 @@ it: no_specific_folder: Di default, ogni utente inizierà alla propria cartella home, al caricamento di un file. no_storage_set_up: Ancora nessuna archiviazione di file configurata. not_logged_into_storage: Per selezionare la cartella di un progetto, sei prim pregato di accedere - oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [Nextcloud OpenProject Integration settings](oauth_application_details_link). + oauth_application_details_html: Il valore del client secret non sarà più accessibile dopo la chiusura di questa finestra. Copia questi valori nelle [impostazioni di integrazione OpenProject di Nextcloud](oauth_application_details_link). one_drive: application_link_text: portale Azure copy_redirect_uri: Copia URI di reindirizzamento @@ -521,7 +521,7 @@ it: members_connection_status: Stato della connessione dei membri new: Aggiungi un archivio file al progetto project_storage_members: - subtitle_html: Check the connection status for the storage %{storage_name_link} of all project members. + subtitle_html: Controlla lo stato della connessione per lo spazio di archiviazione %{storage_name_link} di tutti i membri del progetto. title: Stato della connessione dei membri project_storages: delete: Rimuovere l'archivio file dal progetto? diff --git a/modules/storages/config/locales/crowdin/ko.yml b/modules/storages/config/locales/crowdin/ko.yml index 473f2f2d146..5897fec8b85 100644 --- a/modules/storages/config/locales/crowdin/ko.yml +++ b/modules/storages/config/locales/crowdin/ko.yml @@ -207,8 +207,8 @@ ko: admin: side_panel: health_notifications_component: - sync_now: Sync now - sync_queued: Synchronization queued. + sync_now: 지금 동기화 + sync_queued: 동기화가 대기열에 있습니다. buttons: done_continue: 완료, 계속 open_storage: 파일 저장소 열기 @@ -229,11 +229,11 @@ ko: delete_warning: project_storage_delete_result_1: 해당 파일 및 폴더에 대한 모든 링크가 제거됩니다 project_storage_delete_result_2: 자동으로 관리되는 프로젝트 폴더 및 이 폴더 내 모든 파일이 삭제됩니다 - project_storage_html: Are you sure you want to remove %{file_storage} from this project? + project_storage_html: 이 프로젝트에서 %{file_storage}을(를) 제거하시겠습니까? storage_delete_result_1: 저장소를 현재 사용 중인 모든 프로젝트에서 이 저장소가 제거됩니다 storage_delete_result_2: 해당 파일 및 폴더에 대한 모든 링크가 제거됩니다 storage_delete_result_3: 자동으로 관리되는 프로젝트 폴더 및 이 폴더 내 모든 파일이 삭제됩니다 - storage_html: Are you sure you want to delete %{file_storage} as an external file storage? + storage_html: 외부 파일 저장소로 사용 중인 %{file_storage}을(를) 삭제하시겠습니까? dependencies: nextcloud: group_folders_app: 팀 폴더 @@ -285,8 +285,8 @@ ko: drive_contents: 드라이브 콘텐츠 files_request: 팀 폴더 파일 가져오기 header: 자동으로 관리되는 프로젝트 폴더 - project_folders_exist: Project folders exist - project_folders_linked: Project folders linked + project_folders_exist: 프로젝트 폴더가 존재합니다 + project_folders_linked: 프로젝트 폴더가 링크되었습니다 team_folder_app: '종속성: 팀 폴더' team_folder_contents: 팀 폴더 콘텐츠 team_folder_presence: 팀 폴더가 존재합니다 @@ -328,10 +328,10 @@ ko: nc_oauth_request_not_found: 현재 연결된 사용자를 가져올 엔드포인트를 찾을 수 없습니다. 자세한 내용은 서버 로그를 확인하세요. nc_oauth_request_unauthorized: 현재 사용자는 원격 파일 저장소에 액세스할 수 있는 권한이 없습니다. 자세한 내용은 서버 로그를 확인하세요. nc_oauth_token_missing: 사용자가 아직 Nextcloud 계정을 링크하지 않았기 때문에 OpenProject가 Nextcloud와의 사용자 수준 통신을 테스트할 수 없습니다. - nc_project_folder_missing: The previously created project folder for project "%{project}" could not be found. + nc_project_folder_missing: 프로젝트 "%{project}"의 이전에 생성된 프로젝트 폴더를 찾을 수 없습니다. nc_team_folder_not_found: 팀 폴더를 찾을 수 없습니다. - nc_unexpected_files: 'Unexpected files found in the managed team folder. For example: %{sample}' - nc_unlinked_project_folders: Not all project folders have been created yet (%{actual} / %{expected}). This can indicate errors during the AMPF background synchronization. + nc_unexpected_files: '관리되는 팀 폴더에서 예기치 않은 파일이 발견되었습니다. 예: %{sample}' + nc_unlinked_project_folders: 일부 프로젝트 폴더가 아직 생성되지 않았습니다(%{actual}/%{expected}). 이는 AMPF 백그라운드 동기화 중에 발생한 오류를 나타낼 수 있습니다. nc_userless_access_denied: 구성된 앱 암호가 잘못되었습니다. not_configured: 연결에 대한 유효성 검사를 할 수 없습니다. 먼저 구성을 완료하세요. od_client_cant_delete_folder: 클라이언트에서 폴더를 삭제하는 중에 문제가 발생했습니다. 저장소에 대한 설정 설명서를 확인하세요. @@ -380,7 +380,7 @@ ko: failure: 일부 검사가 실패하여 시스템이 예상대로 작동되지 않습니다. success: 모든 연결과 시스템이 예상대로 작동 중입니다. warning: 일부 검사에서 경고가 반환되었습니다. 이로 인해 예상치 못한 동작이 발생할 수 있습니다. - synced: 'Last sync: %{datetime}' + synced: '마지막 동기화: %{datetime}' title: 상태 보고서 health_email_notifications: description_disabled: 중요 업데이트가 있을 때 관리자에게 이메일로 업데이트가 전송되지 않습니다. @@ -399,7 +399,7 @@ ko: host: https://를 포함하여 저장소의 호스트 주소를 추가하세요. 255자 이하여야 합니다. managed_project_folders_application_password_caption: '다음에서 이 값을 복사하여 자동으로 관리되는 폴더 활성화: %{provider_type_link}.' name: 사용자가 여러 저장소 간에 구별할 수 있도록 저장소에 이름을 지정하세요. - new_storage_html: Read our documentation on [setting up a %{provider_name} file storage](docs_url) integration for more information. + new_storage_html: 자세한 내용은 [%{provider_name} 파일 저장소 설정](docs_url) 통합 관련 문서를 참조하세요. nextcloud: application_link_text: 애플리케이션 “Integration OpenProject” integration: Nextcloud 관리/OpenProject @@ -411,7 +411,7 @@ ko: no_specific_folder: 기본적으로 각 사용자는 파일을 업로드할 때 고유한 홈 폴더에서 시작합니다. no_storage_set_up: 아직 파일 저장소가 설정되지 않았습니다. not_logged_into_storage: 프로젝트 폴더를 선택하려면 먼저 로그인하세요 - oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [Nextcloud OpenProject Integration settings](oauth_application_details_link). + oauth_application_details_html: 이 창을 닫으면 클라이언트 비밀번호 값에 다시 액세스할 수 없습니다. 해당 값을 [Nextcloud OpenProject 통합 설정](oauth_application_details_link)에 복사하세요. one_drive: application_link_text: Azure 포털 copy_redirect_uri: 리디렉션 URI 복사 @@ -517,7 +517,7 @@ ko: members_connection_status: 멤버 연결 상태 new: 이 프로젝트에 파일 저장소 추가 project_storage_members: - subtitle_html: Check the connection status for the storage %{storage_name_link} of all project members. + subtitle_html: 모든 프로젝트 멤버의 저장소 %{storage_name_link}에 대한 연결 상태를 확인하세요. title: 멤버 연결 상태 project_storages: delete: 프로젝트에서 파일 저장소를 제거하시겠습니까? diff --git a/modules/storages/config/locales/crowdin/pt-BR.yml b/modules/storages/config/locales/crowdin/pt-BR.yml index 561896b14be..5b94b510e31 100644 --- a/modules/storages/config/locales/crowdin/pt-BR.yml +++ b/modules/storages/config/locales/crowdin/pt-BR.yml @@ -207,8 +207,8 @@ pt-BR: admin: side_panel: health_notifications_component: - sync_now: Sync now - sync_queued: Synchronization queued. + sync_now: Sincronizar agora + sync_queued: Sincronização em fila. buttons: done_continue: Pronto, continuar open_storage: Abrir o armazenamento de arquivo @@ -229,11 +229,11 @@ pt-BR: delete_warning: project_storage_delete_result_1: Todos os links para os arquivos e pastas correspondentes serão removidos project_storage_delete_result_2: A pasta do projeto gerenciada automaticamente e todos os arquivos contidos nela serão excluídos - project_storage_html: Are you sure you want to remove %{file_storage} from this project? + project_storage_html: Tem certeza de que deseja remover %{file_storage} deste projeto? storage_delete_result_1: O armazenamento será removido de todos os projetos que o utilizam atualmente storage_delete_result_2: Todos os links para os arquivos e pastas correspondentes serão removidos storage_delete_result_3: A pasta do projeto gerenciada automaticamente e todos os arquivos contidos nela serão excluídos - storage_html: Are you sure you want to delete %{file_storage} as an external file storage? + storage_html: Tem certeza de que deseja excluir %{file_storage} como armazenamento de arquivos externo? dependencies: nextcloud: group_folders_app: Pastas da equipe @@ -285,8 +285,8 @@ pt-BR: drive_contents: Conteúdo da unidade files_request: Buscando arquivos da pasta da equipe header: Pastas de projeto gerenciadas automaticamente - project_folders_exist: Project folders exist - project_folders_linked: Project folders linked + project_folders_exist: Existem pastas de projeto + project_folders_linked: Pastas de projeto vinculadas team_folder_app: 'Dependência: Pastas da equipe' team_folder_contents: Conteúdo da pasta da equipe team_folder_presence: A pasta da equipe existe @@ -330,10 +330,10 @@ pt-BR: nc_oauth_request_not_found: O endpoint para recuperar o usuário conectado não foi encontrado. Verifique os logs do servidor para mais detalhes. nc_oauth_request_unauthorized: O usuário atual não está autorizado a acessar o armazenamento remoto de arquivos. Verifique os logs do servidor para mais informações. nc_oauth_token_missing: O OpenProject não pode testar a comunicação do usuário com o Nextcloud, pois a conta do Nextcloud ainda não foi vinculada. - nc_project_folder_missing: The previously created project folder for project "%{project}" could not be found. + nc_project_folder_missing: A pasta de projeto criada anteriormente para o projeto “%{project}” não foi encontrada. nc_team_folder_not_found: A pasta da equipe não pôde ser localizada. - nc_unexpected_files: 'Unexpected files found in the managed team folder. For example: %{sample}' - nc_unlinked_project_folders: Not all project folders have been created yet (%{actual} / %{expected}). This can indicate errors during the AMPF background synchronization. + nc_unexpected_files: 'Arquivos inesperados encontrados na pasta gerenciada da equipe. Por exemplo: %{sample}' + nc_unlinked_project_folders: Nem todas as pastas de projeto foram criadas ainda (%{actual} / %{expected}). Isso pode indicar erros durante a sincronização em segundo plano do AMPF. nc_userless_access_denied: A senha configurada do aplicativo não é válida. not_configured: A conexão não pôde ser validada. Conclua a configuração primeiro. od_client_cant_delete_folder: O cliente está com dificuldades para excluir pastas. Verifique a documentação de configuração do seu armazenamento. @@ -382,7 +382,7 @@ pt-BR: failure: Alguns testes não passaram e o sistema não está funcionando corretamente. success: Todas as conexões e sistemas estão operando normalmente. warning: Alguns testes retornaram um alerta. Isso pode causar comportamentos inesperados. - synced: 'Last sync: %{datetime}' + synced: 'Última sincronização: %{datetime}' title: Relatório de status de integridade health_email_notifications: description_disabled: Os administradores não receberão atualizações por e-mail quando houver atualizações importantes. @@ -401,7 +401,7 @@ pt-BR: host: Adicione o endereço do host de seu armazenamento incluindo o https://. Ele não deve ter mais de 255 caracteres. managed_project_folders_application_password_caption: 'Habilitar as pastas gerenciadas automaticamente copiando este valor de: %{provider_type_link}.' name: Dê um nome a seu armazenamento para que os usuários possam diferenciar vários armazenamentos. - new_storage_html: Read our documentation on [setting up a %{provider_name} file storage](docs_url) integration for more information. + new_storage_html: Leia nossa documentação sobre [configuração de um armazenamento de arquivos %{provider_name}](docs_url) para obter mais informações. nextcloud: application_link_text: aplicativo “Integration OpenProject” integration: Administração de Nextcloud / OpenProject @@ -413,7 +413,7 @@ pt-BR: no_specific_folder: Por padrão, cada usuário começará na sua própria pasta inicial ao carregar arquivos. no_storage_set_up: Ainda não há armazenamento de arquivos configurado. not_logged_into_storage: Para selecionar uma pasta de projeto, primeiro faça login - oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [Nextcloud OpenProject Integration settings](oauth_application_details_link). + oauth_application_details_html: O valor do segredo do cliente não poderá ser acessado novamente depois que você fechar esta janela. Copie esses valores para as [configurações de integração Nextcloud OpenProject](oauth_application_details_link). one_drive: application_link_text: Portal Azure copy_redirect_uri: Copiar URI de redirecionamento @@ -519,7 +519,7 @@ pt-BR: members_connection_status: Status da conexão dos membros new: Adicionar um armazenamento de arquivos a este projeto project_storage_members: - subtitle_html: Check the connection status for the storage %{storage_name_link} of all project members. + subtitle_html: Verificar o status de conexão do armazenamento %{storage_name_link} de todos os membros do projeto. title: Status da conexão dos membros project_storages: delete: Remover o armazenamento de arquivos do projeto? @@ -533,13 +533,13 @@ pt-BR: name_placeholder: 'Ex.: Nextcloud' one_drive: label_oauth_client_id: ID do aplicativo Azure OAuth (cliente) - label_oauth_client_secret: Valor secreto do cliente Azure OAuth + label_oauth_client_secret: Valor do segredo do cliente do OAuth do Azure name: OneDrive name_placeholder: 'por ex.: OneDrive' sharepoint: drive_description: Biblioteca de documentos do OpenProject com acesso gerenciado label_oauth_client_id: ID do aplicativo Azure OAuth (cliente) - label_oauth_client_secret: Valor secreto do cliente Azure OAuth + label_oauth_client_secret: Valor do segredo do cliente do OAuth do Azure name: SharePoint name_placeholder: 'ex.: SharePoint' show_attachments_toggle: diff --git a/modules/storages/config/locales/crowdin/uk.yml b/modules/storages/config/locales/crowdin/uk.yml index 4fbccab5ec8..6a77f11ced4 100644 --- a/modules/storages/config/locales/crowdin/uk.yml +++ b/modules/storages/config/locales/crowdin/uk.yml @@ -207,8 +207,8 @@ uk: admin: side_panel: health_notifications_component: - sync_now: Sync now - sync_queued: Synchronization queued. + sync_now: Синхронізувати + sync_queued: Синхронізацію додано в чергу. buttons: done_continue: Виконано, продовжити open_storage: Відкрити файлове сховище @@ -285,8 +285,8 @@ uk: drive_contents: Вміст диска files_request: Отримання файлів із папок команди header: Папки проєкту з автоматичним керуванням - project_folders_exist: Project folders exist - project_folders_linked: Project folders linked + project_folders_exist: Папки проєкту існують + project_folders_linked: Папки проєкту прив’язано team_folder_app: 'Залежність: папки команди' team_folder_contents: Вміст папки команди team_folder_presence: Папка команди існує @@ -334,10 +334,10 @@ uk: nc_oauth_request_not_found: Кінцеву точку для отримання підключеного зараз користувача не знайдено. Щоб дізнатися більше, перевірте журнали сервера. nc_oauth_request_unauthorized: Поточний користувач не має дозволу на доступ до віддаленого файлового сховища. Щоб дізнатися більше, перевірте журнали сервера. nc_oauth_token_missing: OpenProject не може перевірити з’єднання на рівні користувача з Nextcloud, оскільки користувач досі не зв’язав свій обліковий запис Nextcloud. - nc_project_folder_missing: The previously created project folder for project "%{project}" could not be found. + nc_project_folder_missing: 'Не вдалося знайти створену раніше папку такого проєкту: «%{project}».' nc_team_folder_not_found: Папку команди не знайдено. - nc_unexpected_files: 'Unexpected files found in the managed team folder. For example: %{sample}' - nc_unlinked_project_folders: Not all project folders have been created yet (%{actual} / %{expected}). This can indicate errors during the AMPF background synchronization. + nc_unexpected_files: У керованій папці команди знайдено неочікувані файли. Наприклад, %{sample}. + nc_unlinked_project_folders: Створено ще не всі папки проєкту (%{actual} з %{expected}). Це може свідчити про те, що під час фонової синхронізації AMPF виникали помилки. nc_userless_access_denied: Налаштований пароль застосунку недійсний. not_configured: Не вдалося перевірити підключення. Спочатку налаштуйте конфігурацію. od_client_cant_delete_folder: Клієнту не вдалося видалити папки. Ознайомтеся з документацією щодо конфігурації для свого сховища. @@ -386,7 +386,7 @@ uk: failure: Деякі перевірки не пройдено, і система працює неналежним чином. success: Усі підключення й системи працють належним чином. warning: Деякі перевірки завершилися з попередженням. Це може призвести до неочікуваної поведінки. - synced: 'Last sync: %{datetime}' + synced: 'Остання синхронізація: %{datetime}' title: Звіт про стан справності health_email_notifications: description_disabled: Адміністратори не отримуватимуть електронні листи про важливі оновлення. @@ -405,7 +405,7 @@ uk: host: Додайте адресу хосту для свого сховища, включно з https://. Її довжина не може перевищувати 255 символів. managed_project_folders_application_password_caption: Увімкніть папки з автоматичним керуванням, скопіювавши це значення з %{provider_type_link}. name: Назвіть своє сховище, щоб користувачі могли відрізняти його від інших сховищ. - new_storage_html: Read our documentation on [setting up a %{provider_name} file storage](docs_url) integration for more information. + new_storage_html: Щоб дізнатися більше, ознайомтеся з документацією щодо [налаштування інтеграції файлового сховища %{provider_name}](docs_url). nextcloud: application_link_text: Integration OpenProject integration: Адміністрування Nextcloud / OpenProject @@ -417,7 +417,7 @@ uk: no_specific_folder: За замовчуванням кожен користувач, який передасть файл, починатиме роботу у власній головній папці. no_storage_set_up: Файлові сховища поки не створено. not_logged_into_storage: Шоб вибрати папку проєкту, спочатку ввійдіть - oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [Nextcloud OpenProject Integration settings](oauth_application_details_link). + oauth_application_details_html: Секретний ключ клієнта стане недоступним, коли ви закриєте це вікно. Скопіюйте ці значення в [налаштування інтеграції Nextcloud OpenProject](oauth_application_details_link). one_drive: application_link_text: Портал Azure copy_redirect_uri: Копіювати URI переспрямування diff --git a/modules/storages/config/locales/crowdin/zh-CN.yml b/modules/storages/config/locales/crowdin/zh-CN.yml index eee11c95816..c9f38c97654 100644 --- a/modules/storages/config/locales/crowdin/zh-CN.yml +++ b/modules/storages/config/locales/crowdin/zh-CN.yml @@ -207,8 +207,8 @@ zh-CN: admin: side_panel: health_notifications_component: - sync_now: Sync now - sync_queued: Synchronization queued. + sync_now: 立即同步 + sync_queued: 同步已排队。 buttons: done_continue: 完成, 继续 open_storage: 打开文件存储 @@ -229,11 +229,11 @@ zh-CN: delete_warning: project_storage_delete_result_1: 相应文件和文件夹的所有链接都将被移除 project_storage_delete_result_2: 自动管理的项目文件夹及其中的所有文件都将被删除 - project_storage_html: Are you sure you want to remove %{file_storage} from this project? + project_storage_html: 确定要从此项目中移除 %{file_storage} 吗? storage_delete_result_1: 该存储空间将从所有当前使用该存储空间的项目中移除 storage_delete_result_2: 相应文件和文件夹的所有链接都将被移除 storage_delete_result_3: 自动管理的项目文件夹及其中的所有文件都将被删除 - storage_html: Are you sure you want to delete %{file_storage} as an external file storage? + storage_html: 确定要删除作为外部文件存储空间的 %{file_storage} 吗? dependencies: nextcloud: group_folders_app: 团队文件夹 @@ -285,8 +285,8 @@ zh-CN: drive_contents: 驱动器内容 files_request: 正在获取团队文件夹文件 header: 自动托管的项目文件夹 - project_folders_exist: Project folders exist - project_folders_linked: Project folders linked + project_folders_exist: 项目文件夹已存在 + project_folders_linked: 项目文件夹已关联 team_folder_app: 依赖关系:团队文件夹 team_folder_contents: 团队文件夹内容 team_folder_presence: 团队文件夹已存在 @@ -328,10 +328,10 @@ zh-CN: nc_oauth_request_not_found: 未找到获取当前连接用户的端点。请检查服务器日志以获取更多信息。 nc_oauth_request_unauthorized: 当前用户无权访问远程文件存储。请检查服务器日志以获取更多信息。 nc_oauth_token_missing: OpenProject 无法测试用户与 Nextcloud 之间的通信,因为用户尚未链接他们的 Nextcloud 帐户。 - nc_project_folder_missing: The previously created project folder for project "%{project}" could not be found. + nc_project_folder_missing: 无法找到先前为项目“%{project}”创建的项目文件夹。 nc_team_folder_not_found: 找不到该团队文件夹。 - nc_unexpected_files: 'Unexpected files found in the managed team folder. For example: %{sample}' - nc_unlinked_project_folders: Not all project folders have been created yet (%{actual} / %{expected}). This can indicate errors during the AMPF background synchronization. + nc_unexpected_files: 在受管理的团队文件夹中找到非预期文件。例如:%{sample} + nc_unlinked_project_folders: 部分项目文件夹尚未创建 (%{actual}/%{expected})。这可能表明 AMPF 后台同步过程中出错。 nc_userless_access_denied: 已配置的应用密码无效。 not_configured: 无法验证连接。请先完成配置。 od_client_cant_delete_folder: 客户端在删除文件夹时遇到问题。请检查您的存储的设置文档。 @@ -380,7 +380,7 @@ zh-CN: failure: 有些检查失败,系统无法按预期运行。 success: 所有连接和系统都按预期运行。 warning: 某些检查返回了警告。这可能导致异常行为。 - synced: 'Last sync: %{datetime}' + synced: 上次同步时间:%{datetime} title: 健康状况报告 health_email_notifications: description_disabled: 当有重要更新时,管理员将不会通过电子邮件收到更新提醒。 @@ -399,7 +399,7 @@ zh-CN: host: 请添加存储的主机地址,包括 https://。不应超过 255 个字符。 managed_project_folders_application_password_caption: 通过从 %{provider_type_link} 复制该值来启用自动管理的文件夹。 name: 为您的存储命名,以便用户可以区分多个存储。 - new_storage_html: Read our documentation on [setting up a %{provider_name} file storage](docs_url) integration for more information. + new_storage_html: 请阅读我们关于[设置 %{provider_name} 文件存储](docs_url)的文档,以获取更多信息。 nextcloud: application_link_text: 应用“集成OpenProject” integration: Nextcloud 管理/OpenProject @@ -411,7 +411,7 @@ zh-CN: no_specific_folder: 默认情况下,每个用户上传文件时将从自己的主文件夹开始。 no_storage_set_up: 尚未设置文件存储。 not_logged_into_storage: 要选择一个项目文件夹,请先登录 - oauth_application_details_html: The client secret value will not be accessible again after you close this window. Please copy these values into the [Nextcloud OpenProject Integration settings](oauth_application_details_link). + oauth_application_details_html: 关闭此窗口后,将无法再次访问客户端密钥值。请将这些值复制到 [Nextcloud OpenProject 集成设置](oauth_application_details_link)中。 one_drive: application_link_text: Azure 门户 copy_redirect_uri: 复制重定向 URI @@ -517,7 +517,7 @@ zh-CN: members_connection_status: 成员连接状态 new: 将文件存储添加到此项目 project_storage_members: - subtitle_html: Check the connection status for the storage %{storage_name_link} of all project members. + subtitle_html: 检查所有项目成员的存储区 %{storage_name_link} 的连接状态。 title: 成员连接状态 project_storages: delete: 是否从项目中移除文件存储空间? diff --git a/modules/two_factor_authentication/config/locales/crowdin/es.yml b/modules/two_factor_authentication/config/locales/crowdin/es.yml index ddd14519636..80fe64e2c90 100644 --- a/modules/two_factor_authentication/config/locales/crowdin/es.yml +++ b/modules/two_factor_authentication/config/locales/crowdin/es.yml @@ -67,7 +67,7 @@ es: No se les pedirá que lo vuelvan a ingresar durante ese período. Solo se puede configurar cuando no se aplica por configuración. failed_to_save_settings: 'Error al actualizar la configuración 2FA: %{message}' admin: - self_edit_path_html: To add or modify your own 2FA devices, please go to the [Two-factor authentication on your account page](self_edit_link) + self_edit_path_html: Para añadir o modificar tus propios dispositivos de autenticación de dos factores, ve a la [página de autenticación de dos factores de tu cuenta](self_edit_link) self_edit_forbidden: No puede editar sus propios dispositivos 2FA en esta ruta. Vaya a Mi cuenta > Autenticación de dos factores en su lugar. no_devices_for_user: No se ha registrado ningún dispositivo 2FA para este usuario. all_devices_deleted: Todos los dispositivos 2FA de este usuario han sido eliminados @@ -109,8 +109,8 @@ es: failed_to_delete: Error al eliminar el dispositivo 2FA. is_default_cannot_delete: El dispositivo está marcado como predeterminado y no se puede eliminar debido a una política de seguridad activa. Marque otro dispositivo como predeterminado antes de eliminar. not_existing: No se ha registrado ningún dispositivo 2FA para su cuenta. - 2fa_from_input_html: Please enter the code from your %{device_name} to verify your identity. - 2fa_from_webauthn_html: Please provide the WebAuthn device %{device_name}. If it is USB based make sure to plug it in and touch it. Then click the sign in button. + 2fa_from_input_html: Ingrese el código de su %{device_name} para verificar su identidad. + 2fa_from_webauthn_html: Indique el dispositivo WebAuthn %{device_name}. Si es USB asegúrese de conectarlo y tocarlo. A continuación, haga clic en el botón de inicio de sesión. webauthn: title: WebAuthn description: Registre un dispositivo FIDO2 (como YubiKey) o el enclave seguro de su dispositivo móvil. diff --git a/modules/two_factor_authentication/config/locales/crowdin/it.yml b/modules/two_factor_authentication/config/locales/crowdin/it.yml index 99252c850e8..de21a15e9e3 100644 --- a/modules/two_factor_authentication/config/locales/crowdin/it.yml +++ b/modules/two_factor_authentication/config/locales/crowdin/it.yml @@ -67,7 +67,7 @@ it: Non gli sarà richiesto di autenticarsi nuovamente in quel periodo. L’impostazione può essere modificata solo quando non applicata dalla configurazione. failed_to_save_settings: 'Impossibile aggiornare le impostazioni 2FA: %{message}' admin: - self_edit_path_html: To add or modify your own 2FA devices, please go to the [Two-factor authentication on your account page](self_edit_link) + self_edit_path_html: Per aggiungere o modificare i tuoi dispositivi 2FA, vai alla [pagina Autenticazione a due fattori del tuo account](self_edit_link) self_edit_forbidden: Non puoi modificare i tuoi dispositivi 2FA su questo percorso. Vai al mio Account > Autenticazione a due fattori. no_devices_for_user: Nessun dispositivo 2FA è stato registrato per questo utente. all_devices_deleted: Tutti i dispositivi 2FA di questo utente sono stati eliminati @@ -109,8 +109,8 @@ it: failed_to_delete: Impossibile eliminare il dispositivo 2FA. is_default_cannot_delete: Il dispositivo è contrassegnato come predefinito e non può essere eliminato a causa di una policy di sicurezza attiva. Contrassegna prima un'altro dispositivo come predefinito per poterlo eliminare. not_existing: Nessun dispositivo 2FA è stato registrato per il suo account. - 2fa_from_input_html: Please enter the code from your %{device_name} to verify your identity. - 2fa_from_webauthn_html: Please provide the WebAuthn device %{device_name}. If it is USB based make sure to plug it in and touch it. Then click the sign in button. + 2fa_from_input_html: Inserisci il codice dal tuo %{device_name} per verificare la tua identità. + 2fa_from_webauthn_html: Fornisci il dispositivo WebAuthn %{device_name}. Se è basato su USB, assicurati di collegarlo e toccarlo. Quindi clicca sul pulsante di accesso. webauthn: title: WebAuthn description: Registra un dispositivo FIDO2 (come YubiKey) o la chiave sicura del tuo dispositivo mobile. diff --git a/modules/two_factor_authentication/config/locales/crowdin/ko.yml b/modules/two_factor_authentication/config/locales/crowdin/ko.yml index 2d7e823f106..d8cda8a7a6e 100644 --- a/modules/two_factor_authentication/config/locales/crowdin/ko.yml +++ b/modules/two_factor_authentication/config/locales/crowdin/ko.yml @@ -67,7 +67,7 @@ ko: 사용자가 해당 기간 동안에는 이를 다시 입력하라는 요청을 받지 않게 됩니다. 구성에 의해 강제 적용되지 않는 경우에만 설정할 수 있습니다. failed_to_save_settings: '2FA 설정을 업데이트하지 못함: %{message}' admin: - self_edit_path_html: To add or modify your own 2FA devices, please go to the [Two-factor authentication on your account page](self_edit_link) + self_edit_path_html: 고유한 2FA 장치를 추가하거나 수정하려면 [계정 페이지의 2단계 인증](self_edit_link)으로 이동하세요 self_edit_forbidden: 이 경로에서 사용자의 고유한 2FA 장치를 편집하지 못할 수 있습니다. 대신 내 계정 > 2단계 인증으로 이동하세요. no_devices_for_user: 2FA 장치가 이 사용자에 대해 등록되지 않았습니다. all_devices_deleted: 이 사용자의 모든 2FA 장치가 삭제되었습니다. @@ -109,8 +109,8 @@ ko: failed_to_delete: 2FA 장치를 삭제하지 못했습니다. is_default_cannot_delete: 장치가 기본으로 표시되고 활성 보안 정책으로 인해 삭제할 수 없습니다. 삭제하기 전에 다른 장치를 기본으로 표시하세요. not_existing: 2FA 장치가 해당 계정에 대해 등록되지 않았습니다. - 2fa_from_input_html: Please enter the code from your %{device_name} to verify your identity. - 2fa_from_webauthn_html: Please provide the WebAuthn device %{device_name}. If it is USB based make sure to plug it in and touch it. Then click the sign in button. + 2fa_from_input_html: "%{device_name}의 코드를 입력하여 ID를 인증하세요." + 2fa_from_webauthn_html: WebAuthn 장치 %{device_name} 제공을 해주세요. USB 기반인 경우 이 장치를 연결하고 터치해야 합니다. 그런 다음 로그인 버튼을 클릭하세요. webauthn: title: WebAuthn description: 'FIDO2 장치(예: YubiKey) 또는 모바일 장치의 Secure Enclave를 등록하세요.' diff --git a/modules/two_factor_authentication/config/locales/crowdin/pt-BR.yml b/modules/two_factor_authentication/config/locales/crowdin/pt-BR.yml index f0c630a0e04..28bc3eb6ee2 100644 --- a/modules/two_factor_authentication/config/locales/crowdin/pt-BR.yml +++ b/modules/two_factor_authentication/config/locales/crowdin/pt-BR.yml @@ -67,7 +67,7 @@ pt-BR: Não será solicitado a eles para digitar novamente o 2FA durante este período. Só pode ser definido quando a imposição não estiver configurada. failed_to_save_settings: 'Falha ao atualizar as configurações de 2FA: %{message}' admin: - self_edit_path_html: To add or modify your own 2FA devices, please go to the [Two-factor authentication on your account page](self_edit_link) + self_edit_path_html: Para adicionar ou modificar seus próprios dispositivos de 2FA, acesse a [página de autenticação de dois fatores da sua conta](self_edit_link) self_edit_forbidden: Talvez você não tenha editado o seu dispositivo 2FA para este caminho. Vá para Minha Conta > Segundo Favor de Autenticação. no_devices_for_user: Nenhum dispositivo 2FA foi registrado para este usuário. all_devices_deleted: Todos os dispositivos 2FA deste usuário foram excluídos @@ -109,8 +109,8 @@ pt-BR: failed_to_delete: Falha ao excluir o dispositivo com 2FA. is_default_cannot_delete: O arquivo está marcado como padrão e não pode ser deletado devido a política de segurança estar ativa. Marque outro dispositivo como padrão antes de excluí-lo. not_existing: Nenhum dispositivo com 2FA foi registrado na sua conta. - 2fa_from_input_html: Please enter the code from your %{device_name} to verify your identity. - 2fa_from_webauthn_html: Please provide the WebAuthn device %{device_name}. If it is USB based make sure to plug it in and touch it. Then click the sign in button. + 2fa_from_input_html: Digite o código do seu %{device_name} para verificar sua identidade. + 2fa_from_webauthn_html: Forneça o dispositivo WebAuthn %{device_name}. Se for USB, conecte-o e confirme a ação pressionando o botão ou tocando na chave. Em seguida, clique no botão de login. webauthn: title: WebAuthn description: Registre um dispositivo FIDO2 (como o YubiKey) ou o enclave seguro do seu dispositivo móvel. diff --git a/modules/two_factor_authentication/config/locales/crowdin/uk.yml b/modules/two_factor_authentication/config/locales/crowdin/uk.yml index 56adc2260f0..fa4cf3a61b8 100644 --- a/modules/two_factor_authentication/config/locales/crowdin/uk.yml +++ b/modules/two_factor_authentication/config/locales/crowdin/uk.yml @@ -67,7 +67,7 @@ uk: Протягом цього періоду їм не буде запропоновано повторно ввести його. Можна встановити лише тоді, коли конфігурація не застосовується. failed_to_save_settings: 'Не вдалося оновити налаштування 2FA: %{message}' admin: - self_edit_path_html: To add or modify your own 2FA devices, please go to the [Two-factor authentication on your account page](self_edit_link) + self_edit_path_html: Щоб додати або змінити власні пристрої з 2FA, перейдіть на сторінку [Двофакторна аутентифікація в обліковому записі](self_edit_link) self_edit_forbidden: На цьому шляху не можна редагувати власні пристрої 2FA. Замість цього перейдіть до розділу Мій обліковий запис> Двофакторна автентифікація. no_devices_for_user: Для цього користувача не було зареєстровано жодного пристрою 2FA. all_devices_deleted: Усі пристрої 2FA цього користувача видалено @@ -109,7 +109,7 @@ uk: failed_to_delete: Не вдалося видалити пристрій 2FA. is_default_cannot_delete: Пристрій позначено як типовий і його не можна видалити через активну політику безпеки. Перед видаленням позначте інший пристрій як стандартний. not_existing: Для вашого облікового запису не зареєстровано жодного пристрою 2FA. - 2fa_from_input_html: Please enter the code from your %{device_name} to verify your identity. + 2fa_from_input_html: Введіть код, який надійшов на пристрій %{device_name}, щоб підтвердити свою особу. 2fa_from_webauthn_html: Укажіть пристрій WebAuthn %{device_name}. Якщо це USB-пристрій, переконайтеся, що його підключено, і торкніться його. Потім натисніть кнопку входу. webauthn: title: WebAuthn diff --git a/modules/two_factor_authentication/config/locales/crowdin/zh-CN.yml b/modules/two_factor_authentication/config/locales/crowdin/zh-CN.yml index 862b5347258..2136239372e 100644 --- a/modules/two_factor_authentication/config/locales/crowdin/zh-CN.yml +++ b/modules/two_factor_authentication/config/locales/crowdin/zh-CN.yml @@ -67,7 +67,7 @@ zh-CN: 在此期间,他们将不会被要求重新输入。只有在配置未强制执行时才能进行设置。 failed_to_save_settings: 无法更新双因子认证设置:%{message} admin: - self_edit_path_html: To add or modify your own 2FA devices, please go to the [Two-factor authentication on your account page](self_edit_link) + self_edit_path_html: 要添加或修改您自己的 2FA 设备,请转到[您帐户页面上的双重身份验证](self_edit_link) self_edit_forbidden: 您可能无法在此路径上编辑自己的 2FA 设备。请转到我的帐户 >> 双因子认证。 no_devices_for_user: 没有为此用户注册过 2FA 设备。 all_devices_deleted: 此用户的所有 2FA 设备已被删除 @@ -109,8 +109,8 @@ zh-CN: failed_to_delete: 删除 2FA 设备失败。 is_default_cannot_delete: 该设备被标记为默认设备,并且由于活动安全策略而无法删除。在删除之前,请将另一个设备标记为默认设备。 not_existing: 没有为您的帐户注册过 2FA 设备。 - 2fa_from_input_html: Please enter the code from your %{device_name} to verify your identity. - 2fa_from_webauthn_html: Please provide the WebAuthn device %{device_name}. If it is USB based make sure to plug it in and touch it. Then click the sign in button. + 2fa_from_input_html: 请通过您的 %{device_name} 输入验证码,以验证您的身份。 + 2fa_from_webauthn_html: 请提供 WebAuthn 设备 %{device_name}。如果是 USB 设备,请确保将其插入并使用。然后点击“登录”按钮。 webauthn: title: WebAuthn 认证 description: 注册 FIDO2 设备(如 YubiKey)或您的移动设备的安全隔区。 diff --git a/modules/webhooks/config/locales/crowdin/es.yml b/modules/webhooks/config/locales/crowdin/es.yml index c43e158fda2..f7891dee139 100644 --- a/modules/webhooks/config/locales/crowdin/es.yml +++ b/modules/webhooks/config/locales/crowdin/es.yml @@ -37,7 +37,7 @@ es: updated: Actualizado comment: Comentario internal_comment: Comentario interno - explanation_html: 'Upon the occurrence of an event like the creation of a work package or an update on a project, OpenProject will send a POST request to the configured web endpoints. Oftentimes, the event is sent after the [configured aggregation period](aggregation_path) has passed. + explanation_html: 'Al producirse un evento como la creación de un paquete de trabajo o una actualización en un proyecto, OpenProject enviará una solicitud POST a los puntos finales web configurados. A menudo, el evento se envía una vez transcurrido el [periodo de agregación configurado](aggregation_path). ' status: diff --git a/modules/webhooks/config/locales/crowdin/it.yml b/modules/webhooks/config/locales/crowdin/it.yml index 5f613582786..f5b6ec093ec 100644 --- a/modules/webhooks/config/locales/crowdin/it.yml +++ b/modules/webhooks/config/locales/crowdin/it.yml @@ -37,7 +37,7 @@ it: updated: Aggiornato comment: Commento internal_comment: Commento interno - explanation_html: 'Upon the occurrence of an event like the creation of a work package or an update on a project, OpenProject will send a POST request to the configured web endpoints. Oftentimes, the event is sent after the [configured aggregation period](aggregation_path) has passed. + explanation_html: 'Al verificarsi di un evento, come la creazione di una macro-attività o un aggiornamento su un progetto, OpenProject invierà una richiesta POST agli endpoint web configurati. Spesso, l''evento viene inviato dopo che è trascorso il [periodo di aggregazione configurato](aggregation_path). ' status: diff --git a/modules/webhooks/config/locales/crowdin/pt-BR.yml b/modules/webhooks/config/locales/crowdin/pt-BR.yml index a2922ce8cdf..a83f8baca9f 100644 --- a/modules/webhooks/config/locales/crowdin/pt-BR.yml +++ b/modules/webhooks/config/locales/crowdin/pt-BR.yml @@ -70,6 +70,6 @@ pt-BR: selected_project_ids: title: Projetos selecionados secret: - description: 'Se definido, este valor secreto é usado pelo OpenProject para assinar o payload webhook. + description: 'Se definido, esse valor de segredo é usado pelo OpenProject para assinar o payload do webhook. ' diff --git a/modules/webhooks/config/locales/crowdin/uk.yml b/modules/webhooks/config/locales/crowdin/uk.yml index 38f3b4c46e2..e4f266e326e 100644 --- a/modules/webhooks/config/locales/crowdin/uk.yml +++ b/modules/webhooks/config/locales/crowdin/uk.yml @@ -37,7 +37,7 @@ uk: updated: Оновлено comment: Коментар internal_comment: Внутрішній коментар - explanation_html: 'Upon the occurrence of an event like the creation of a work package or an update on a project, OpenProject will send a POST request to the configured web endpoints. Oftentimes, the event is sent after the [configured aggregation period](aggregation_path) has passed. + explanation_html: 'У разі такої події, як створення пакета робіт або оновлення проєкту, OpenProject надсилає POST-запит налаштованим кінцевим точкам мережі. Здебільшого подія надсилається після того, як мине [налаштований період агрегації](aggregation_path). ' status: diff --git a/modules/webhooks/config/locales/crowdin/zh-CN.yml b/modules/webhooks/config/locales/crowdin/zh-CN.yml index f02643e66a2..08f8694e5d1 100644 --- a/modules/webhooks/config/locales/crowdin/zh-CN.yml +++ b/modules/webhooks/config/locales/crowdin/zh-CN.yml @@ -37,7 +37,7 @@ zh-CN: updated: 已更新 comment: 评论 internal_comment: 内部评论 - explanation_html: 'Upon the occurrence of an event like the creation of a work package or an update on a project, OpenProject will send a POST request to the configured web endpoints. Oftentimes, the event is sent after the [configured aggregation period](aggregation_path) has passed. + explanation_html: '在发生诸如创建工作包或更新项目之类的事件时,OpenProject 将向配置的 Web 端点发送一个 POST 请求。通常,会在[配置的聚合期](aggregation_path)过后发送事件。 ' status: diff --git a/modules/wikis/app/components/wikis/admin/destroy_confirmation_dialog_component.rb b/modules/wikis/app/components/wikis/admin/destroy_confirmation_dialog_component.rb index 05b20dae3bf..8e356dfb5eb 100644 --- a/modules/wikis/app/components/wikis/admin/destroy_confirmation_dialog_component.rb +++ b/modules/wikis/app/components/wikis/admin/destroy_confirmation_dialog_component.rb @@ -23,7 +23,7 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # See COPYRIGHT and LICENSE files for more details. #++ diff --git a/modules/wikis/app/components/wikis/admin/forms/general_info_form_component.rb b/modules/wikis/app/components/wikis/admin/forms/general_info_form_component.rb index d5bd4e35895..70d1f4dbef2 100644 --- a/modules/wikis/app/components/wikis/admin/forms/general_info_form_component.rb +++ b/modules/wikis/app/components/wikis/admin/forms/general_info_form_component.rb @@ -23,7 +23,7 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # See COPYRIGHT and LICENSE files for more details. #++ diff --git a/modules/wikis/app/components/wikis/admin/general_info_component.rb b/modules/wikis/app/components/wikis/admin/general_info_component.rb index 06da4c4ad66..4637c9f227c 100644 --- a/modules/wikis/app/components/wikis/admin/general_info_component.rb +++ b/modules/wikis/app/components/wikis/admin/general_info_component.rb @@ -23,7 +23,7 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # See COPYRIGHT and LICENSE files for more details. #++ diff --git a/modules/wikis/app/components/wikis/admin/wiki_provider_list_component.rb b/modules/wikis/app/components/wikis/admin/wiki_provider_list_component.rb index 154ebb2400c..43279aa18bc 100644 --- a/modules/wikis/app/components/wikis/admin/wiki_provider_list_component.rb +++ b/modules/wikis/app/components/wikis/admin/wiki_provider_list_component.rb @@ -23,7 +23,7 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # See COPYRIGHT and LICENSE files for more details. #++ diff --git a/modules/wikis/app/components/wikis/admin/wiki_provider_view_component.rb b/modules/wikis/app/components/wikis/admin/wiki_provider_view_component.rb index 26029abdf42..4e0249b9402 100644 --- a/modules/wikis/app/components/wikis/admin/wiki_provider_view_component.rb +++ b/modules/wikis/app/components/wikis/admin/wiki_provider_view_component.rb @@ -23,7 +23,7 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # See COPYRIGHT and LICENSE files for more details. #++ diff --git a/modules/wikis/app/contracts/wikis/xwiki_providers/base_contract.rb b/modules/wikis/app/contracts/wikis/xwiki_providers/base_contract.rb new file mode 100644 index 00000000000..8d93947590c --- /dev/null +++ b/modules/wikis/app/contracts/wikis/xwiki_providers/base_contract.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module Wikis + module XWikiProviders + class BaseContract < ::BaseContract + include RequiresAdminGuard + + attribute :name + attribute :url + + validates :name, presence: true, length: { maximum: 255 } + validates :url, presence: true, length: { maximum: 255 } + validates :url, url: true, unless: -> { url.blank? || errors.include?(:url) } + validates :url, secure_context_uri: true, unless: -> { url.blank? || errors.include?(:url) } + end + end +end diff --git a/modules/wikis/app/contracts/wikis/xwiki_providers/create_contract.rb b/modules/wikis/app/contracts/wikis/xwiki_providers/create_contract.rb new file mode 100644 index 00000000000..1ffd6a7facd --- /dev/null +++ b/modules/wikis/app/contracts/wikis/xwiki_providers/create_contract.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module Wikis + module XWikiProviders + class CreateContract < BaseContract + end + end +end diff --git a/modules/wikis/app/contracts/wikis/xwiki_providers/delete_contract.rb b/modules/wikis/app/contracts/wikis/xwiki_providers/delete_contract.rb new file mode 100644 index 00000000000..944be196688 --- /dev/null +++ b/modules/wikis/app/contracts/wikis/xwiki_providers/delete_contract.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module Wikis + module XWikiProviders + class DeleteContract < ::DeleteContract + delete_permission :admin + end + end +end diff --git a/modules/wikis/app/contracts/wikis/xwiki_providers/update_contract.rb b/modules/wikis/app/contracts/wikis/xwiki_providers/update_contract.rb new file mode 100644 index 00000000000..dadb1563505 --- /dev/null +++ b/modules/wikis/app/contracts/wikis/xwiki_providers/update_contract.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module Wikis + module XWikiProviders + class UpdateContract < BaseContract + end + end +end diff --git a/modules/wikis/app/controllers/wikis/admin/wiki_providers_controller.rb b/modules/wikis/app/controllers/wikis/admin/wiki_providers_controller.rb index 95742ced4a2..358e972f8ca 100644 --- a/modules/wikis/app/controllers/wikis/admin/wiki_providers_controller.rb +++ b/modules/wikis/app/controllers/wikis/admin/wiki_providers_controller.rb @@ -23,7 +23,7 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # See COPYRIGHT and LICENSE files for more details. #++ @@ -51,28 +51,50 @@ module Wikis def edit; end def create - @wiki_provider = Wikis::XWikiProvider.new(wiki_provider_params) + service_result = Wikis::XWikiProviders::CreateService + .new(user: current_user) + .call(wiki_provider_params) - if @wiki_provider.save + @wiki_provider = service_result.result + + service_result.on_success do flash[:notice] = I18n.t(:notice_successful_create) redirect_to edit_admin_settings_wiki_provider_path(@wiki_provider) - else + end + + service_result.on_failure do render :new, status: :unprocessable_entity end end def update - if @wiki_provider.update(wiki_provider_params) + service_result = Wikis::XWikiProviders::UpdateService + .new(user: current_user, model: @wiki_provider) + .call(wiki_provider_params) + + service_result.on_success do flash[:notice] = I18n.t(:notice_successful_update) redirect_to edit_admin_settings_wiki_provider_path(@wiki_provider) - else + end + + service_result.on_failure do render :edit, status: :unprocessable_entity end end def destroy - @wiki_provider.destroy! - flash[:notice] = I18n.t(:notice_successful_delete) + service_result = Wikis::XWikiProviders::DeleteService + .new(user: current_user, model: @wiki_provider) + .call + + service_result.on_failure do + flash[:error] = service_result.errors.full_messages + end + + service_result.on_success do + flash[:notice] = I18n.t(:notice_successful_delete) + end + redirect_to admin_settings_wiki_providers_path end diff --git a/modules/wikis/app/forms/wikis/admin/name_input_form.rb b/modules/wikis/app/forms/wikis/admin/name_input_form.rb index 08a1d255013..b54b9408062 100644 --- a/modules/wikis/app/forms/wikis/admin/name_input_form.rb +++ b/modules/wikis/app/forms/wikis/admin/name_input_form.rb @@ -23,7 +23,7 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # See COPYRIGHT and LICENSE files for more details. #++ diff --git a/modules/wikis/app/forms/wikis/admin/submit_or_cancel_form.rb b/modules/wikis/app/forms/wikis/admin/submit_or_cancel_form.rb index 22f466f6305..c3e07e9fffc 100644 --- a/modules/wikis/app/forms/wikis/admin/submit_or_cancel_form.rb +++ b/modules/wikis/app/forms/wikis/admin/submit_or_cancel_form.rb @@ -23,7 +23,7 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # See COPYRIGHT and LICENSE files for more details. #++ diff --git a/modules/wikis/app/forms/wikis/admin/url_input_form.rb b/modules/wikis/app/forms/wikis/admin/url_input_form.rb index 45533a7526d..aab6e39f7dc 100644 --- a/modules/wikis/app/forms/wikis/admin/url_input_form.rb +++ b/modules/wikis/app/forms/wikis/admin/url_input_form.rb @@ -23,7 +23,7 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # See COPYRIGHT and LICENSE files for more details. #++ diff --git a/modules/wikis/app/services/wikis/xwiki_providers/create_service.rb b/modules/wikis/app/services/wikis/xwiki_providers/create_service.rb new file mode 100644 index 00000000000..ae4b52bad2d --- /dev/null +++ b/modules/wikis/app/services/wikis/xwiki_providers/create_service.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module Wikis + module XWikiProviders + class CreateService < ::BaseServices::Create + end + end +end diff --git a/modules/wikis/app/services/wikis/xwiki_providers/delete_service.rb b/modules/wikis/app/services/wikis/xwiki_providers/delete_service.rb new file mode 100644 index 00000000000..a3e6817085b --- /dev/null +++ b/modules/wikis/app/services/wikis/xwiki_providers/delete_service.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module Wikis + module XWikiProviders + class DeleteService < ::BaseServices::Delete + end + end +end diff --git a/modules/wikis/app/services/wikis/xwiki_providers/set_attributes_service.rb b/modules/wikis/app/services/wikis/xwiki_providers/set_attributes_service.rb new file mode 100644 index 00000000000..7d14423fc92 --- /dev/null +++ b/modules/wikis/app/services/wikis/xwiki_providers/set_attributes_service.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module Wikis + module XWikiProviders + class SetAttributesService < ::BaseServices::SetAttributes + end + end +end diff --git a/modules/wikis/app/services/wikis/xwiki_providers/update_service.rb b/modules/wikis/app/services/wikis/xwiki_providers/update_service.rb new file mode 100644 index 00000000000..3232d5a9e5b --- /dev/null +++ b/modules/wikis/app/services/wikis/xwiki_providers/update_service.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module Wikis + module XWikiProviders + class UpdateService < ::BaseServices::Update + end + end +end diff --git a/modules/wikis/app/views/wikis/admin/wiki_providers/edit.html.erb b/modules/wikis/app/views/wikis/admin/wiki_providers/edit.html.erb index 0e14bc59175..79b5293696e 100644 --- a/modules/wikis/app/views/wikis/admin/wiki_providers/edit.html.erb +++ b/modules/wikis/app/views/wikis/admin/wiki_providers/edit.html.erb @@ -21,7 +21,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. See COPYRIGHT and LICENSE files for more details. diff --git a/modules/wikis/app/views/wikis/admin/wiki_providers/new.html.erb b/modules/wikis/app/views/wikis/admin/wiki_providers/new.html.erb index 56aab75efa4..704780291bf 100644 --- a/modules/wikis/app/views/wikis/admin/wiki_providers/new.html.erb +++ b/modules/wikis/app/views/wikis/admin/wiki_providers/new.html.erb @@ -21,7 +21,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. See COPYRIGHT and LICENSE files for more details. diff --git a/modules/wikis/config/locales/crowdin/es.yml b/modules/wikis/config/locales/crowdin/es.yml index 17f1deb0ea3..77cd2baa6ef 100644 --- a/modules/wikis/config/locales/crowdin/es.yml +++ b/modules/wikis/config/locales/crowdin/es.yml @@ -3,7 +3,7 @@ es: activerecord: attributes: wikis/xwiki_provider: - name: Name + name: Nombre url: Instance URL authentication_method: Authentication method authentication_methods: @@ -28,26 +28,26 @@ es: admin: wiki_providers: index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. - label_wiki_platform: Wiki provider - label_add_new: Add new wiki provider - label_new_xwiki_instance: New XWiki provider - no_results_title: You don't have any wiki providers set up yet. - no_results_description: Add a wiki provider to see them here. - label_edit: Edit XWiki provider - name_placeholder: XWiki knowledge base - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. - new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. + label_wiki_platform: Proveedor Wiki + label_add_new: Añadir nuevo proveedor de wiki + label_new_xwiki_instance: Nuevo proveedor XWiki + no_results_title: Aún no tienes ningún proveedor de wiki configurado. + no_results_description: Añade un proveedor wiki para verlos aquí. + label_edit: Editar proveedor XWiki + name_placeholder: Base de conocimientos XWiki + name_caption: Ponle un nombre a tu almacenamiento para que los usuarios puedan distinguir entre las distintas plataformas wiki. + url_caption: Por favor, añade la dirección host de tu plataforma wiki, incluyendo el https://. No debe superar los 255 caracteres. + xwiki_instance: Instancia XWiki + xwiki_instance_description: Asegúrate de tener privilegios de administrador en tu instancia de XWiki antes de realizar la configuración. + new_provider_html: Lee nuestra documentación sobre [configuración de una integración XWiki](docs_url) para obtener más información. sections: - basic_details: Basic details - oauth_applications: OAuth applications + basic_details: Detalles básicos + oauth_applications: Aplicaciones OAuth oauth: openproject_oauth: OpenProject OAuth - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. + openproject_oauth_description: Permitir que XWiki acceda a los datos de OpenProject utilizando un OAuth. xwiki_oauth: XWiki OAuth - xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. + xwiki_oauth_description: Permite que OpenProject acceda a los datos de XWiki mediante OAuth. delete: - title: Delete wiki provider - warning_html: You are about to delete %{wiki_provider}. This action is irreversible. + title: Eliminar proveedor wiki + warning_html: Estás a punto de borrar %{wiki_provider}. Esta acción es irreversible. diff --git a/modules/wikis/config/locales/crowdin/fr.yml b/modules/wikis/config/locales/crowdin/fr.yml index 1e3cf4cc439..b6010565b27 100644 --- a/modules/wikis/config/locales/crowdin/fr.yml +++ b/modules/wikis/config/locales/crowdin/fr.yml @@ -3,51 +3,51 @@ fr: activerecord: attributes: wikis/xwiki_provider: - name: Name + name: Nom url: URL de l'instance authentication_method: Méthode d'authentification authentication_methods: oauth2_sso: Authentification unique via le fournisseur d'identité OpenID Connect two_way_oauth2: Flux d'autorisation OAuth 2.0 bidirectionnel par code d'autorisation - token_exchange_scope: XWiki Scope + token_exchange_scope: Portée XWiki wiki_audience: Audience de XWiki errors: {} models: wikis/inline_page_link: - one: Inline page link - other: Inline page links + one: Lien de page en ligne + other: Liens de page en ligne wikis/internal_provider: Wiki interne wikis/relation_page_link: - one: Relation page link - other: Relation page links + one: Lien de la page de relation + other: Liens de la page de relation wikis/xwiki_provider: Fournisseur XWiki - project_module_wiki_platforms: Wiki providers + project_module_wiki_platforms: Fournisseurs de wiki wikis: buttons: - save_and_continue: Save and continue + save_and_continue: Enregistrer et continuer admin: wiki_providers: - index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. - label_wiki_platform: Wiki provider - label_add_new: Add new wiki provider - label_new_xwiki_instance: New XWiki provider - no_results_title: You don't have any wiki providers set up yet. - no_results_description: Add a wiki provider to see them here. - label_edit: Edit XWiki provider - name_placeholder: XWiki knowledge base - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. - new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. + index_description: Ajoutez un service wiki externe pour lier les lots de travaux à des pages wiki existantes ou en créer de nouvelles directement à partir d'OpenProject. + label_wiki_platform: Fournisseur de wiki + label_add_new: Ajouter un nouveau fournisseur de wiki + label_new_xwiki_instance: Nouveau fournisseur XWiki + no_results_title: Vous n'avez pas encore de fournisseur de wiki. + no_results_description: Ajouter un fournisseur de wiki pour les voir ici. + label_edit: Modifier le fournisseur XWiki + name_placeholder: Base de connaissances XWiki + name_caption: Donnez à votre espace de stockage un nom pour permettre aux utilisateurs de le différencier des autres plateformes de wiki. + url_caption: Veuillez ajouter l'adresse d'hôte de votre plateforme wiki, y compris le https://. Elle ne doit pas dépasser 255 caractères. + xwiki_instance: Instance XWiki + xwiki_instance_description: Veuillez vous assurer que vous disposez des privilèges d'administration dans votre instance XWiki avant de procéder à l'installation. + new_provider_html: Lisez notre documentation sur [la configuration d'une intégration XWiki](docs_url) pour en savoir plus. sections: - basic_details: Basic details - oauth_applications: OAuth applications + basic_details: Informations de base + oauth_applications: Applications OAuth oauth: - openproject_oauth: OpenProject OAuth - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. - xwiki_oauth: XWiki OAuth - xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. + openproject_oauth: OAuth OpenProject + openproject_oauth_description: Autoriser XWiki à accéder aux données d'OpenProject en utilisant un OAuth. + xwiki_oauth: OAuth XWiki + xwiki_oauth_description: Autoriser OpenProject à accéder aux données XWiki en utilisant un OAuth. delete: - title: Delete wiki provider - warning_html: You are about to delete %{wiki_provider}. This action is irreversible. + title: Supprimer le fournisseur de wiki + warning_html: Vous êtes sur le point de supprimer %{wiki_provider}. Cette action est irréversible. diff --git a/modules/wikis/config/locales/crowdin/it.yml b/modules/wikis/config/locales/crowdin/it.yml index 3a92c6f82d9..9eafa9859c6 100644 --- a/modules/wikis/config/locales/crowdin/it.yml +++ b/modules/wikis/config/locales/crowdin/it.yml @@ -3,51 +3,51 @@ it: activerecord: attributes: wikis/xwiki_provider: - name: Name - url: Instance URL - authentication_method: Authentication method + name: Nome + url: URL istanza + authentication_method: Metodo di autenticazione authentication_methods: - oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider - two_way_oauth2: Two-way OAuth 2.0 authorization code flow - token_exchange_scope: XWiki Scope - wiki_audience: XWiki Audience + oauth2_sso: Single-Sign-On tramite OpenID Connect Identity Provider + two_way_oauth2: Flusso del codice di autorizzazione OAuth 2.0 bidirezionale + token_exchange_scope: Ambito XWiki + wiki_audience: Pubblico XWiki errors: {} models: wikis/inline_page_link: - one: Inline page link - other: Inline page links - wikis/internal_provider: Internal wiki + one: Collegamento pagina inline + other: Collegamenti alle pagine inline + wikis/internal_provider: Wiki interno wikis/relation_page_link: - one: Relation page link - other: Relation page links - wikis/xwiki_provider: XWiki provider - project_module_wiki_platforms: Wiki providers + one: Link alla pagina delle relazioni + other: Link alle pagine delle relazioni + wikis/xwiki_provider: Fornitore XWiki + project_module_wiki_platforms: Fornitori Wiki wikis: buttons: - save_and_continue: Save and continue + save_and_continue: Salva e continua admin: wiki_providers: - index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. - label_wiki_platform: Wiki provider - label_add_new: Add new wiki provider - label_new_xwiki_instance: New XWiki provider - no_results_title: You don't have any wiki providers set up yet. - no_results_description: Add a wiki provider to see them here. - label_edit: Edit XWiki provider - name_placeholder: XWiki knowledge base - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. - new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. + index_description: Aggiungi un servizio wiki esterno per collegare le macro-attività a pagine wiki esistenti o crearne di nuove direttamente da OpenProject. + label_wiki_platform: Fornitore Wiki + label_add_new: Aggiungi nuovo fornitore wiki + label_new_xwiki_instance: Nuovo fornitore XWiki + no_results_title: Non ha ancora configurato alcun fornitore di wiki. + no_results_description: Aggiungi fornitori wiki per vederli qui. + label_edit: Modifica fornitore XWiki + name_placeholder: Base di conoscenza XWiki + name_caption: Assegna un nome all'archivio in modo che gli utenti possano distinguere tra più piattaforme wiki. + url_caption: Inserisci l'indirizzo host della tua piattaforma wiki, includendo https://. Non deve superare i 255 caratteri. + xwiki_instance: Istanza XWiki + xwiki_instance_description: Assicurati di avere privilegi di amministrazione nella tua istanza XWiki prima di procedere con la configurazione. + new_provider_html: Consulta la nostra documentazione su come [configurare un'integrazione con XWiki](docs_url) per maggiori informazioni. sections: - basic_details: Basic details - oauth_applications: OAuth applications + basic_details: Informazioni base + oauth_applications: Applicazioni OAuth oauth: openproject_oauth: OpenProject OAuth - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. + openproject_oauth_description: Consenti a XWiki di accedere ai dati di OpenProject utilizzando un OAuth. xwiki_oauth: XWiki OAuth - xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. + xwiki_oauth_description: Consenti a OpenProject di accedere ai dati XWiki utilizzando OAuth. delete: - title: Delete wiki provider - warning_html: You are about to delete %{wiki_provider}. This action is irreversible. + title: Elimina fornitore wiki + warning_html: Stai per eliminare %{wiki_provider}. Questa azione è irreversibile. diff --git a/modules/wikis/config/locales/crowdin/js-it.yml b/modules/wikis/config/locales/crowdin/js-it.yml index 850feb7dd38..5589e49cd89 100644 --- a/modules/wikis/config/locales/crowdin/js-it.yml +++ b/modules/wikis/config/locales/crowdin/js-it.yml @@ -24,4 +24,4 @@ it: js: work_packages: tabs: - wikis: Wikis + wikis: Wiki diff --git a/modules/wikis/config/locales/crowdin/js-ko.yml b/modules/wikis/config/locales/crowdin/js-ko.yml index 44edd574f1b..405f2230c66 100644 --- a/modules/wikis/config/locales/crowdin/js-ko.yml +++ b/modules/wikis/config/locales/crowdin/js-ko.yml @@ -24,4 +24,4 @@ ko: js: work_packages: tabs: - wikis: Wikis + wikis: 위키 diff --git a/modules/wikis/config/locales/crowdin/js-uk.yml b/modules/wikis/config/locales/crowdin/js-uk.yml index a498d58f1dd..ea9f2455957 100644 --- a/modules/wikis/config/locales/crowdin/js-uk.yml +++ b/modules/wikis/config/locales/crowdin/js-uk.yml @@ -24,4 +24,4 @@ uk: js: work_packages: tabs: - wikis: Wikis + wikis: Wiki-сторінки diff --git a/modules/wikis/config/locales/crowdin/js-zh-CN.yml b/modules/wikis/config/locales/crowdin/js-zh-CN.yml index 5ef4d4a345e..49a1189eb75 100644 --- a/modules/wikis/config/locales/crowdin/js-zh-CN.yml +++ b/modules/wikis/config/locales/crowdin/js-zh-CN.yml @@ -24,4 +24,4 @@ zh-CN: js: work_packages: tabs: - wikis: Wikis + wikis: Wiki diff --git a/modules/wikis/config/locales/crowdin/ko.yml b/modules/wikis/config/locales/crowdin/ko.yml index 06954b01fca..ce50746d18c 100644 --- a/modules/wikis/config/locales/crowdin/ko.yml +++ b/modules/wikis/config/locales/crowdin/ko.yml @@ -3,49 +3,49 @@ ko: activerecord: attributes: wikis/xwiki_provider: - name: Name - url: Instance URL - authentication_method: Authentication method + name: 이름 + url: 인스턴스 URL + authentication_method: 인증 방법 authentication_methods: - oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider - two_way_oauth2: Two-way OAuth 2.0 authorization code flow - token_exchange_scope: XWiki Scope - wiki_audience: XWiki Audience + oauth2_sso: OpenID Connect ID 공급자를 통한 Single-Sign-On + two_way_oauth2: 양방향 OAuth 2.0 인증 코드 흐름 + token_exchange_scope: XWiki 범위 + wiki_audience: XWiki 오디언스 errors: {} models: wikis/inline_page_link: - other: Inline page links - wikis/internal_provider: Internal wiki + other: 인라인 페이지 링크 + wikis/internal_provider: 내부 위키 wikis/relation_page_link: - other: Relation page links - wikis/xwiki_provider: XWiki provider - project_module_wiki_platforms: Wiki providers + other: 관련 페이지 링크 + wikis/xwiki_provider: XWiki 공급자 + project_module_wiki_platforms: 위키 공급자 wikis: buttons: - save_and_continue: Save and continue + save_and_continue: 저장 및 계속 admin: wiki_providers: - index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. - label_wiki_platform: Wiki provider - label_add_new: Add new wiki provider - label_new_xwiki_instance: New XWiki provider - no_results_title: You don't have any wiki providers set up yet. - no_results_description: Add a wiki provider to see them here. - label_edit: Edit XWiki provider - name_placeholder: XWiki knowledge base - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. - new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. + index_description: 외부 위키 서비스를 추가하여 작업 패키지를 기존 위키 페이지에 링크하거나 OpenProject에서 직접 새로운 위키 페이지를 만듭니다. + label_wiki_platform: 위키 공급자 + label_add_new: 새로운 위키 공급자 추가 + label_new_xwiki_instance: 새로운 XWiki 공급자 + no_results_title: 아직 설정한 위키 공급자가 없습니다. + no_results_description: 여기에서 보려면 위키 공급자를 추가합니다. + label_edit: XWiki 공급자 편집 + name_placeholder: XWiki 지식 베이스 + name_caption: 사용자가 여러 위키 플랫폼 간에 구분할 수 있도록 저장소에 이름을 지정하세요. + url_caption: https://를 포함하여 위키 플랫폼의 호스트 주소를 추가하세요. 255자 이하여야 합니다. + xwiki_instance: XWiki 인스턴스 + xwiki_instance_description: 설정을 수행하기 전에 XWiki 인스턴스에 관리 권한이 있는지 확인하세요. + new_provider_html: 자세한 내용은 [XWiki 통합 설정] 관련 문서(docs_url)를 참조하세요. sections: - basic_details: Basic details - oauth_applications: OAuth applications + basic_details: 기본 세부 정보 + oauth_applications: OAuth 애플리케이션 oauth: openproject_oauth: OpenProject OAuth - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. + openproject_oauth_description: XWiki가 OAuth를 사용하여 OpenProject 데이터에 액세스하도록 허용합니다. xwiki_oauth: XWiki OAuth - xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. + xwiki_oauth_description: OpenProject가 OAuth를 사용하여 XWiki 데이터에 액세스하도록 허용합니다. delete: - title: Delete wiki provider - warning_html: You are about to delete %{wiki_provider}. This action is irreversible. + title: 위키 공급자 삭제 + warning_html: "%{wiki_provider}을(를) 삭제하려고 합니다. 이 작업은 되돌릴 수 없습니다." diff --git a/modules/wikis/config/locales/crowdin/pt-BR.yml b/modules/wikis/config/locales/crowdin/pt-BR.yml index 5d4c018fd31..d8d1ba9fbff 100644 --- a/modules/wikis/config/locales/crowdin/pt-BR.yml +++ b/modules/wikis/config/locales/crowdin/pt-BR.yml @@ -4,50 +4,50 @@ pt-BR: attributes: wikis/xwiki_provider: name: Nome - url: Instance URL - authentication_method: Authentication method + url: URL da Instância + authentication_method: Método de autenticação authentication_methods: - oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider - two_way_oauth2: Two-way OAuth 2.0 authorization code flow + oauth2_sso: Single-Sign-On por meio de provedor de identidade OpenID Connect + two_way_oauth2: Fluxo de código de autorização OAuth 2.0 bidirecional token_exchange_scope: XWiki Scope - wiki_audience: XWiki Audience + wiki_audience: Audiência XWiki errors: {} models: wikis/inline_page_link: - one: Inline page link - other: Inline page links - wikis/internal_provider: Internal wiki + one: Link de página em linha + other: Links de página em linha + wikis/internal_provider: Wiki interna wikis/relation_page_link: - one: Relation page link - other: Relation page links - wikis/xwiki_provider: XWiki provider - project_module_wiki_platforms: Wiki providers + one: Link de página de relação + other: Links de página de relação + wikis/xwiki_provider: Provedor XWiki + project_module_wiki_platforms: Provedores de wiki wikis: buttons: - save_and_continue: Save and continue + save_and_continue: Salvar e continuar admin: wiki_providers: - index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. - label_wiki_platform: Wiki provider - label_add_new: Add new wiki provider - label_new_xwiki_instance: New XWiki provider - no_results_title: You don't have any wiki providers set up yet. - no_results_description: Add a wiki provider to see them here. - label_edit: Edit XWiki provider - name_placeholder: XWiki knowledge base - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. - new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. + index_description: Adicione um serviço de wiki externo para vincular pacotes de trabalho a páginas de wiki existentes ou criar novas diretamente a partir do OpenProject. + label_wiki_platform: Provedor de wiki + label_add_new: Adicionar novo provedor de wiki + label_new_xwiki_instance: Novo provedor XWiki + no_results_title: Você ainda não tem nenhum provedor de wiki configurado. + no_results_description: Adicione um provedor de wiki para visualizá-los aqui. + label_edit: Editar provedor XWiki + name_placeholder: Base de conhecimento XWiki + name_caption: Dê um nome ao seu armazenamento para que os usuários possam diferenciar entre múltiplas plataformas de wiki. + url_caption: Informe o endereço do host da sua plataforma de wiki, incluindo o https://. O endereço não deve ter mais de 255 caracteres. + xwiki_instance: Instância XWiki + xwiki_instance_description: Certifique-se de que você tem privilégios de administração na sua instância XWiki antes de realizar a configuração. + new_provider_html: Leia nossa documentação sobre [configuração de uma integração com o XWiki](docs_url) para mais informações. sections: - basic_details: Basic details - oauth_applications: OAuth applications + basic_details: Detalhes básicos + oauth_applications: Aplicações OAuth oauth: - openproject_oauth: OpenProject OAuth - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. - xwiki_oauth: XWiki OAuth - xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. + openproject_oauth: OAuth do OpenProject + openproject_oauth_description: Permitir que o XWiki acesse dados do OpenProject usando OAuth. + xwiki_oauth: OAuth do XWiki + xwiki_oauth_description: Permitir que o OpenProject acesse dados do XWiki usando OAuth. delete: - title: Delete wiki provider - warning_html: You are about to delete %{wiki_provider}. This action is irreversible. + title: Excluir provedor wiki + warning_html: Você está prestes a excluir %{wiki_provider}. Esta ação é irreversível. diff --git a/modules/wikis/config/locales/crowdin/uk.yml b/modules/wikis/config/locales/crowdin/uk.yml index b0ca7841d5e..0c23ddb1545 100644 --- a/modules/wikis/config/locales/crowdin/uk.yml +++ b/modules/wikis/config/locales/crowdin/uk.yml @@ -4,54 +4,54 @@ uk: attributes: wikis/xwiki_provider: name: Назва - url: Instance URL + url: URL-адреса екземпляра authentication_method: Метод автентифікації authentication_methods: oauth2_sso: Єдиний вхід через постачальника ідентифікаційних даних OpenID Connect two_way_oauth2: Потік коду двосторонньої авторизації OAuth 2.0 - token_exchange_scope: XWiki Scope - wiki_audience: XWiki Audience + token_exchange_scope: Область XWiki + wiki_audience: Аудиторія XWiki errors: {} models: wikis/inline_page_link: - one: Inline page link - few: Inline page links - many: Inline page links - other: Inline page links - wikis/internal_provider: Internal wiki + one: Вставлене посилання на сторінку + few: Вставлені посилання на сторінку + many: Вставлені посилання на сторінку + other: Вставлені посилання на сторінку + wikis/internal_provider: Внутрішній модуль Wiki wikis/relation_page_link: - one: Relation page link - few: Relation page links - many: Relation page links - other: Relation page links - wikis/xwiki_provider: XWiki provider - project_module_wiki_platforms: Wiki providers + one: Посилання на пов’язану сторінку + few: Посилання на пов’язані сторінки + many: Посилання на пов’язані сторінки + other: Посилання на пов’язані сторінки + wikis/xwiki_provider: Постачальник XWiki + project_module_wiki_platforms: Постачальники Wiki wikis: buttons: save_and_continue: Зберегти та продовжити admin: wiki_providers: - index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. - label_wiki_platform: Wiki provider - label_add_new: Add new wiki provider - label_new_xwiki_instance: New XWiki provider - no_results_title: You don't have any wiki providers set up yet. - no_results_description: Add a wiki provider to see them here. - label_edit: Edit XWiki provider - name_placeholder: XWiki knowledge base - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. - new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. + index_description: Додайте зовнішній сервіс Wiki, щоб зв’язувати пакети робіт із наявними сторінками Wiki або створювати нові безпосередньо в OpenProject. + label_wiki_platform: Постачальник Wiki + label_add_new: Додати нового постачальника Wiki + label_new_xwiki_instance: Новий постачальник XWiki + no_results_title: Ви ще не налаштували жодного постачальника Wiki. + no_results_description: Додайте постачальника Wiki, і він з’явиться тут. + label_edit: Редагувати постачальника XWiki + name_placeholder: База знань XWiki + name_caption: Назвіть своє сховище, щоб користувачі могли відрізняти його від інших платформ Wiki. + url_caption: Додайте адресу хосту вашої платформи Wiki, не випускаючи https://. Її довжина не може перевищувати 255 символів. + xwiki_instance: Екземпляр XWiki + xwiki_instance_description: Переконайтеся, що ви маєте права адміністратора у своєму екземплярі XWiki, перш ніж виконувати налаштування. + new_provider_html: Щоб дізнатися більше, перегляньте документацію про [налаштування інтеграції з XWiki](docs_url). sections: basic_details: Основна інформація oauth_applications: Програми OAuth oauth: openproject_oauth: OpenProject OAuth - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. - xwiki_oauth: XWiki OAuth - xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. + openproject_oauth_description: Надайте XWiki доступ до даних OpenProject за допомогою OAuth. + xwiki_oauth: OAuth для XWiki + xwiki_oauth_description: Надайте OpenProject доступ до даних XWiki за допомогою OAuth. delete: - title: Delete wiki provider - warning_html: You are about to delete %{wiki_provider}. This action is irreversible. + title: Видалити постачальника Wiki + warning_html: Ви збираєтеся видалити %{wiki_provider}. Ця дія є незворотною. diff --git a/modules/wikis/config/locales/crowdin/zh-CN.yml b/modules/wikis/config/locales/crowdin/zh-CN.yml index 6f2dd5abe8f..630ee99ad15 100644 --- a/modules/wikis/config/locales/crowdin/zh-CN.yml +++ b/modules/wikis/config/locales/crowdin/zh-CN.yml @@ -3,49 +3,57 @@ zh-CN: activerecord: attributes: wikis/xwiki_provider: - name: Name - url: Instance URL - authentication_method: Authentication method + name: 名称 + url: 实例 URL + authentication_method: 身份验证方式 authentication_methods: - oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider - two_way_oauth2: Two-way OAuth 2.0 authorization code flow - token_exchange_scope: XWiki Scope - wiki_audience: XWiki Audience + oauth2_sso: 通过 OpenID Connect 身份提供程序进行单点登录 + two_way_oauth2: 双向 OAuth 2.0 授权代码流 + token_exchange_scope: XWiki 范围 + wiki_audience: XWiki 受众 errors: {} models: wikis/inline_page_link: - other: Inline page links - wikis/internal_provider: Internal wiki + other: |- + One + 内联页面链接 + Other + 内联页面链接 + wikis/internal_provider: 内部 wiki wikis/relation_page_link: - other: Relation page links - wikis/xwiki_provider: XWiki provider - project_module_wiki_platforms: Wiki providers + other: |- + One + 关联页面链接 + Other + 关联页面链接 + wikis/xwiki_provider: XWiki 提供程序 + project_module_wiki_platforms: Wiki 提供程序 wikis: buttons: - save_and_continue: Save and continue + save_and_continue: 保存并继续 admin: wiki_providers: - index_description: Add an external wiki service to link work packages to existing wiki pages or create new ones directly from OpenProject. - label_wiki_platform: Wiki provider - label_add_new: Add new wiki provider - label_new_xwiki_instance: New XWiki provider - no_results_title: You don't have any wiki providers set up yet. - no_results_description: Add a wiki provider to see them here. - label_edit: Edit XWiki provider - name_placeholder: XWiki knowledge base - name_caption: Give your storage a name so that users can differentiate between multiple wiki platforms. - url_caption: Please add the host address of your wiki platform including the https://. It should not be longer than 255 characters. - xwiki_instance: XWiki Instance - xwiki_instance_description: Please make sure you have administration privileges in your XWiki instance before doing the setup. - new_provider_html: Read our documentation on [setting up an XWiki integration](docs_url) for more information. + index_description: 添加外部 wiki 服务,以将工作包链接到现有 wiki 页面,或直接从 OpenProject 创建新页面。 + label_wiki_platform: Wiki 提供程序 + label_add_new: 添加新 wiki 提供程序 + label_new_xwiki_instance: 新建 XWiki 提供程序 + no_results_title: 您尚未设置任何 wiki 提供程序。 + no_results_description: 添加 wiki 提供程序,以在此处查看相关内容。 + label_edit: 编辑 XWiki 提供程序 + name_placeholder: XWiki 知识库 + name_caption: 为您的存储命名,以便用户可以区分多个 wiki 平台。 + url_caption: 请添加 wiki 平台的主机地址(包含 https://)。该地址的长度不应超过 255 个字符。 + xwiki_instance: XWiki 实例 + xwiki_instance_description: 在进行设置之前,请确保您在 XWiki 实例中具有管理权限。 + new_provider_html: 请阅读我们关于[设置 XWiki 注册](docs_url)的文档,以获取更多信息。 sections: - basic_details: Basic details - oauth_applications: OAuth applications + basic_details: 基本详细信息 + oauth_applications: OAuth 应用程序 oauth: openproject_oauth: OpenProject OAuth - openproject_oauth_description: Allow XWiki to access OpenProject data using an OAuth. + openproject_oauth_description: 允许 XWiki 使用 OAuth 访问 OpenProject 数据。 xwiki_oauth: XWiki OAuth - xwiki_oauth_description: Allow OpenProject to access XWiki data using an OAuth. + xwiki_oauth_description: 允许 OpenProject 使用 OAuth 访问 XWiki 数据。 delete: - title: Delete wiki provider - warning_html: You are about to delete %{wiki_provider}. This action is irreversible. + title: 删除 wiki 提供程序 + warning_html: 您即将删除 %{wiki_provider}。此操作不可逆。 diff --git a/modules/wikis/config/locales/en.yml b/modules/wikis/config/locales/en.yml index 4334e0244be..4a6c4e3067a 100644 --- a/modules/wikis/config/locales/en.yml +++ b/modules/wikis/config/locales/en.yml @@ -5,6 +5,7 @@ en: wikis/xwiki_provider: name: Name url: Instance URL + universal_identifier: Universal identifier authentication_method: Authentication method authentication_methods: oauth2_sso: Single-Sign-On through OpenID Connect Identity Provider diff --git a/modules/wikis/frontend/module/main.ts b/modules/wikis/frontend/module/main.ts index 7a4f3d22d88..f4f5ebbd8e6 100644 --- a/modules/wikis/frontend/module/main.ts +++ b/modules/wikis/frontend/module/main.ts @@ -25,14 +25,16 @@ // See COPYRIGHT and LICENSE files for more details. import { CUSTOM_ELEMENTS_SCHEMA, Injector, NgModule } from '@angular/core'; + +import { I18nService } from 'core-app/core/i18n/i18n.service'; import { OpSharedModule } from 'core-app/shared/shared.module'; -import { OpenprojectTabsModule } from 'core-app/shared/components/tabs/openproject-tabs.module'; import { ConfigurationService } from 'core-app/core/config/configuration.service'; +import { OpenprojectTabsModule } from 'core-app/shared/components/tabs/openproject-tabs.module'; import { WorkPackageTabsService, } from 'core-app/features/work-packages/components/wp-tabs/services/wp-tabs/wp-tabs.service'; + import { WikisTabComponent } from './wikis-tab/wikis-tab.component'; -import { I18nService } from 'core-app/core/i18n/i18n.service'; export function initializeWikiPlugin(injector:Injector) { const wpTabService = injector.get(WorkPackageTabsService); diff --git a/modules/wikis/frontend/module/wikis-tab/wikis-tab.component.ts b/modules/wikis/frontend/module/wikis-tab/wikis-tab.component.ts index 2912db3e6d8..6a40bfdc7cf 100644 --- a/modules/wikis/frontend/module/wikis-tab/wikis-tab.component.ts +++ b/modules/wikis/frontend/module/wikis-tab/wikis-tab.component.ts @@ -27,6 +27,7 @@ //++ import { ChangeDetectionStrategy, Component, ElementRef, Input, OnInit } from '@angular/core'; + import { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource'; import { TabComponent } from 'core-app/features/work-packages/components/wp-tabs/components/wp-tab-wrapper/tab'; import { I18nService } from 'core-app/core/i18n/i18n.service'; diff --git a/modules/wikis/frontend/tsconfig.json b/modules/wikis/frontend/tsconfig.json new file mode 100644 index 00000000000..1336a3012d1 --- /dev/null +++ b/modules/wikis/frontend/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../../frontend/tsconfig.json", + "compilerOptions": { + "baseUrl": "../../../frontend", + "typeRoots": [ + "../../../frontend/node_modules/@types", + "../../../frontend/node_modules" + ] + }, + "include": [ + "**/*.ts" + ] +} diff --git a/modules/wikis/spec/contracts/wikis/xwiki_providers/base_contract_spec.rb b/modules/wikis/spec/contracts/wikis/xwiki_providers/base_contract_spec.rb new file mode 100644 index 00000000000..61f1395d593 --- /dev/null +++ b/modules/wikis/spec/contracts/wikis/xwiki_providers/base_contract_spec.rb @@ -0,0 +1,79 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +require "spec_helper" +require "contracts/shared/model_contract_shared_context" + +RSpec.describe Wikis::XWikiProviders::BaseContract do + include_context "ModelContract shared context" + + let(:wiki_provider) { build_stubbed(:xwiki_provider) } + let(:contract) { described_class.new(wiki_provider, current_user) } + + it_behaves_like "contract is valid for active admins and invalid for regular users" + + describe "name" do + let(:current_user) { build_stubbed(:admin) } + + context "when blank" do + let(:wiki_provider) { build_stubbed(:xwiki_provider, name: "") } + + include_examples "contract is invalid", name: :blank + end + + context "when too long" do + let(:wiki_provider) { build_stubbed(:xwiki_provider, name: "x" * 256) } + + include_examples "contract is invalid", name: :too_long + end + end + + describe "url" do + let(:current_user) { build_stubbed(:admin) } + + context "when blank" do + let(:wiki_provider) { build_stubbed(:xwiki_provider, url: "") } + + include_examples "contract is invalid", url: :blank + end + + context "when not https" do + let(:wiki_provider) { build_stubbed(:xwiki_provider, url: "http://xwiki.example.com") } + + include_examples "contract is invalid", url: :url_not_secure_context + end + + context "when too long" do + let(:wiki_provider) { build_stubbed(:xwiki_provider, url: "https://#{'x' * 250}.com") } + + include_examples "contract is invalid", url: :too_long + end + end +end diff --git a/modules/wikis/spec/contracts/wikis/xwiki_providers/create_contract_spec.rb b/modules/wikis/spec/contracts/wikis/xwiki_providers/create_contract_spec.rb new file mode 100644 index 00000000000..e9f9ac6f016 --- /dev/null +++ b/modules/wikis/spec/contracts/wikis/xwiki_providers/create_contract_spec.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +require "spec_helper" +require "contracts/shared/model_contract_shared_context" + +RSpec.describe Wikis::XWikiProviders::CreateContract do + include_context "ModelContract shared context" + + let(:wiki_provider) { build_stubbed(:xwiki_provider) } + let(:contract) { described_class.new(wiki_provider, current_user) } + + it_behaves_like "contract is valid for active admins and invalid for regular users" +end diff --git a/modules/wikis/spec/contracts/wikis/xwiki_providers/delete_contract_spec.rb b/modules/wikis/spec/contracts/wikis/xwiki_providers/delete_contract_spec.rb new file mode 100644 index 00000000000..5b1ead70068 --- /dev/null +++ b/modules/wikis/spec/contracts/wikis/xwiki_providers/delete_contract_spec.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +require "spec_helper" +require "contracts/shared/model_contract_shared_context" + +RSpec.describe Wikis::XWikiProviders::DeleteContract do + include_context "ModelContract shared context" + + let(:wiki_provider) { build_stubbed(:xwiki_provider) } + let(:contract) { described_class.new(wiki_provider, current_user) } + + it_behaves_like "contract is valid for active admins and invalid for regular users" +end diff --git a/modules/wikis/spec/contracts/wikis/xwiki_providers/update_contract_spec.rb b/modules/wikis/spec/contracts/wikis/xwiki_providers/update_contract_spec.rb new file mode 100644 index 00000000000..75364dcbaab --- /dev/null +++ b/modules/wikis/spec/contracts/wikis/xwiki_providers/update_contract_spec.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +require "spec_helper" +require "contracts/shared/model_contract_shared_context" + +RSpec.describe Wikis::XWikiProviders::UpdateContract do + include_context "ModelContract shared context" + + let(:wiki_provider) { build_stubbed(:xwiki_provider) } + let(:contract) { described_class.new(wiki_provider, current_user) } + + it_behaves_like "contract is valid for active admins and invalid for regular users" +end diff --git a/modules/wikis/spec/controllers/wikis/admin/wiki_providers_controller_spec.rb b/modules/wikis/spec/controllers/wikis/admin/wiki_providers_controller_spec.rb index 2a2ef47000c..40a8f46a2ea 100644 --- a/modules/wikis/spec/controllers/wikis/admin/wiki_providers_controller_spec.rb +++ b/modules/wikis/spec/controllers/wikis/admin/wiki_providers_controller_spec.rb @@ -23,7 +23,7 @@ # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software -# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # See COPYRIGHT and LICENSE files for more details. #++ diff --git a/modules/wikis/spec/services/wikis/xwiki_providers/create_service_spec.rb b/modules/wikis/spec/services/wikis/xwiki_providers/create_service_spec.rb new file mode 100644 index 00000000000..9c30d9d08c4 --- /dev/null +++ b/modules/wikis/spec/services/wikis/xwiki_providers/create_service_spec.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +require "spec_helper" + +require "services/base_services/behaves_like_create_service" + +RSpec.describe Wikis::XWikiProviders::CreateService, type: :model do + it_behaves_like "BaseServices create service" do + let(:factory) { :xwiki_provider } + let(:call_attributes) { { name: "My XWiki", url: "https://xwiki.example.com" } } + let!(:model_instance) { build_stubbed(factory, name: "My XWiki", url: "https://xwiki.example.com") } + end +end diff --git a/modules/wikis/spec/services/wikis/xwiki_providers/delete_service_spec.rb b/modules/wikis/spec/services/wikis/xwiki_providers/delete_service_spec.rb new file mode 100644 index 00000000000..72cd9511406 --- /dev/null +++ b/modules/wikis/spec/services/wikis/xwiki_providers/delete_service_spec.rb @@ -0,0 +1,39 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +require "spec_helper" + +require "services/base_services/behaves_like_delete_service" + +RSpec.describe Wikis::XWikiProviders::DeleteService, type: :model do + it_behaves_like "BaseServices delete service" do + let(:factory) { :xwiki_provider } + end +end diff --git a/modules/wikis/spec/services/wikis/xwiki_providers/update_service_spec.rb b/modules/wikis/spec/services/wikis/xwiki_providers/update_service_spec.rb new file mode 100644 index 00000000000..f560e84041a --- /dev/null +++ b/modules/wikis/spec/services/wikis/xwiki_providers/update_service_spec.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +require "spec_helper" + +require "services/base_services/behaves_like_update_service" + +RSpec.describe Wikis::XWikiProviders::UpdateService, type: :model do + it_behaves_like "BaseServices update service" do + let(:factory) { :xwiki_provider } + let(:call_attributes) { { name: "Updated XWiki" } } + let!(:model_instance) { build_stubbed(factory, name: "My XWiki", url: "https://xwiki.example.com") } + end +end diff --git a/spec/.rubocop.yml b/spec/.rubocop.yml deleted file mode 100644 index ff1f8b1ad6d..00000000000 --- a/spec/.rubocop.yml +++ /dev/null @@ -1,10 +0,0 @@ -inherit_from: ../.rubocop.yml - -Style/RescueModifier: - Enabled: false - -Rails/FindEach: - Enabled: false - -Rails/SaveBang: - Enabled: false diff --git a/spec/features/work_packages/tabs/relations_children_spec.rb b/spec/features/work_packages/tabs/relations_children_spec.rb index 2c75c4c267b..917d1dec05c 100644 --- a/spec/features/work_packages/tabs/relations_children_spec.rb +++ b/spec/features/work_packages/tabs/relations_children_spec.rb @@ -58,6 +58,8 @@ RSpec.describe "Relations children tab", :js, :with_cuprite do wait_for_network_idle + expect_and_dismiss_flash type: :success, exact_message: "New work package created and added as a child" + page.within("#work-package-relations-tab-content") do expect(page).to have_content("Hello there") expect(page).to have_content("RISK") @@ -83,6 +85,8 @@ RSpec.describe "Relations children tab", :js, :with_cuprite do wait_for_network_idle + expect_and_dismiss_flash type: :success, exact_message: "New work package created and added as a child" + page.within("#work-package-relations-tab-content") do expect(page).to have_content("Hello there") expect(page).to have_content("RISK") @@ -136,6 +140,8 @@ RSpec.describe "Relations children tab", :js, :with_cuprite do wait_for_network_idle + expect_and_dismiss_flash type: :success, exact_message: "New work package created and added as a child" + page.within("#work-package-relations-tab-content") do expect(page).to have_content("Hello there") expect(page).to have_content("TASK") diff --git a/spec/models/import/jira_import_spec.rb b/spec/models/import/jira_import_spec.rb index ebe66e48053..c0453639631 100644 --- a/spec/models/import/jira_import_spec.rb +++ b/spec/models/import/jira_import_spec.rb @@ -32,7 +32,8 @@ require "spec_helper" RSpec.describe Import::JiraImport do let(:jira) { create(:jira) } - let(:author) { create(:user) } + let(:author_password) { OpenProject::Passwords::Generator.random_password } + let(:author) { create(:user, password: author_password, password_confirmation: author_password) } subject(:jira_import) { create(:jira_import, jira:, author:) } @@ -132,4 +133,332 @@ RSpec.describe Import::JiraImport do expect(Import::JiraField.exists?(other_field.id)).to be true end end + + describe "#import_users", with_settings: { + password_active_rules: %w(lowercase uppercase numeric special), + password_min_length: 4, + password_min_adhered_rules: 4 + } do + def jira_user_payload(name:, display_name:, email:, groups: [], key: "JIRAUSER10000", active: true) + { + "key" => key, + "name" => name, + "self" => "https://jira-dc.openproject.org/rest/api/2/user?username=#{name}", + "active" => active, + "expand" => "groups,applicationRoles", + "groups" => { + "size" => groups.size, + "items" => groups.map { |g| { "name" => g, "self" => "https://jira-dc.openproject.org/rest/api/2/group?groupname=#{g}" } } + }, + "locale" => "en_US", + "deleted" => false, + "timeZone" => "Europe/Berlin", + "avatarUrls" => { + "16x16" => "https://www.gravatar.com/avatar/abc?d=mm&s=16", + "24x24" => "https://www.gravatar.com/avatar/abc?d=mm&s=24", + "32x32" => "https://www.gravatar.com/avatar/abc?d=mm&s=32", + "48x48" => "https://www.gravatar.com/avatar/abc?d=mm&s=48" + }, + "displayName" => display_name, + "emailAddress" => email, + "lastLoginTime" => "2026-03-26T08:49:31+0000", + "applicationRoles" => { "size" => 1, "items" => [] } + } + end + + let(:email) { "jdoe@example.com" } + let(:existing_user_password) { OpenProject::Passwords::Generator.random_password } + + # creates system user proactively. so, next coming User.count change cases don't count + # this one as created during #import_users call. + before { User.system } + + context "when importing a new user without groups" do + let!(:jira_user) do + create(:jira_user, + jira:, + jira_import:, + payload: jira_user_payload( + key: "JIRAUSER10100", + name: "jdoe@example.com", + display_name: "John Doe", + email:, + groups: [] + )) + end + + it "creates a new OpenProject user" do + expect { jira_import.import_users }.to change(User, :count).by(1) + end + + it "creates the user with correct attributes" do + jira_import.import_users + + user = User.find_by(login: email) + expect(user).to have_attributes( + firstname: "John", + lastname: "Doe", + mail: email, + status: "locked" + ) + end + + it "creates a reference between Jira user and OpenProject user" do + expect { jira_import.import_users }.to change(Import::JiraOpenProjectReference, :count).by(1) + + reference = Import::JiraOpenProjectReference.last + expect(reference).to have_attributes( + jira_entity_id: jira_user.id.to_s, + jira_entity_class: "Import::JiraUser", + op_entity_class: "User", + uses_existing: false + ) + end + end + + context "when importing a user that already exists by email" do + let!(:existing_user) do + create(:user, + mail: email, + password: existing_user_password, + password_confirmation: existing_user_password, + login: "login") + end + let!(:jira_user) do + create(:jira_user, + jira:, + jira_import:, + payload: jira_user_payload( + key: "JIRAUSER10101", + name: "jdoe@example.com", + display_name: "John Doe", + email:, + groups: [] + )) + end + + it "does not create a new user" do + expect { jira_import.import_users }.not_to change(User, :count) + end + + it "creates a reference to the existing user with uses_existing flag" do + jira_import.import_users + + reference = Import::JiraOpenProjectReference.find_by(jira_entity_id: jira_user.id) + expect(reference).to have_attributes( + jira_entity_id: jira_user.id.to_s, + jira_entity_class: "Import::JiraUser", + op_entity_id: existing_user.id.to_s, + op_entity_class: "User", + uses_existing: true + ) + end + end + + context "when importing a user that already exists by login" do + let(:login) { "login" } + let!(:existing_user) do + create(:user, + mail: "other@example.com", + password_confirmation: existing_user_password, + password: existing_user_password, + login:) + end + let!(:jira_user) do + create(:jira_user, + jira:, + jira_import:, + payload: jira_user_payload( + key: "JIRAUSER10102", + name: login, + display_name: "John Doe", + email:, + groups: [] + )) + end + + it "does not create a new user" do + expect { jira_import.import_users }.not_to change(User, :count) + end + + it "creates a reference to the existing user with uses_existing flag" do + jira_import.import_users + + reference = Import::JiraOpenProjectReference.find_by(jira_entity_id: jira_user.id) + expect(reference).to have_attributes( + jira_entity_id: jira_user.id.to_s, + jira_entity_class: "Import::JiraUser", + op_entity_id: existing_user.id.to_s, + op_entity_class: "User", + uses_existing: true + ) + end + end + + context "when importing a user with groups" do + let!(:jira_user) do + create(:jira_user, + jira:, + jira_import:, + payload: jira_user_payload( + key: "JIRAUSER10103", + name: "j.roth@openproject.com", + display_name: "Judith Roth", + email: "j.roth@openproject.com", + groups: ["jira-administrators", "jira-software-users"] + )) + end + + it "creates the groups" do + expect { jira_import.import_users }.to change(Group, :count).by(2) + + expect(Group.exists?(name: "jira-administrators")).to be true + expect(Group.exists?(name: "jira-software-users")).to be true + end + + it "adds the user to the groups" do + jira_import.import_users + + user = User.find_by(login: "j.roth@openproject.com") + expect(user.groups.pluck(:name)).to contain_exactly("jira-administrators", "jira-software-users") + end + + it "creates references for the groups" do + jira_import.import_users + + group_references = Import::JiraOpenProjectReference.where(op_entity_class: "Group") + expect(group_references.count).to eq(2) + expect(group_references.pluck(:uses_existing)).to all(be false) + end + end + + context "when importing a user with an existing group" do + let!(:existing_group) { create(:group, name: "jira-administrators") } + let!(:jira_user) do + create(:jira_user, + jira:, + jira_import:, + payload: jira_user_payload( + key: "JIRAUSER10104", + name: "j.roth@openproject.com", + display_name: "Judith Roth", + email: "j.roth@openproject.com", + groups: ["jira-administrators"] + )) + end + + it "does not create a duplicate group" do + expect { jira_import.import_users }.not_to change(Group, :count) + end + + it "adds the user to the existing group" do + jira_import.import_users + + user = User.find_by(login: "j.roth@openproject.com") + expect(user.groups).to include(existing_group) + end + + it "creates a reference with uses_existing flag for the group" do + jira_import.import_users + + group_reference = Import::JiraOpenProjectReference.find_by( + op_entity_class: "Group", + op_entity_id: existing_group.id + ) + expect(group_reference.uses_existing).to be true + end + end + + context "when importing multiple users" do + let!(:jira_user1) do + create(:jira_user, + jira:, + jira_import:, + payload: jira_user_payload( + key: "JIRAUSER10105", + name: "jdoe@example.com", + display_name: "John Doe", + email: "jdoe@example.com", + groups: ["jira-software-users"] + )) + end + let!(:jira_user2) do + create(:jira_user, + jira:, + jira_import:, + payload: jira_user_payload( + key: "JIRAUSER10106", + name: "jsmith@example.com", + display_name: "Jane Smith", + email: "jsmith@example.com", + groups: ["jira-software-users"] + )) + end + + it "creates all users" do + expect { jira_import.import_users }.to change(User, :count).by(2) + end + + it "creates the shared group only once" do + expect { jira_import.import_users }.to change(Group, :count).by(1) + end + + it "adds both users to the shared group" do + jira_import.import_users + + group = Group.find_by(name: "jira-software-users") + expect(group.users.pluck(:login)).to contain_exactly("jdoe@example.com", "jsmith@example.com") + end + end + + context "when user has a single-word display name" do + let!(:jira_user) do + create(:jira_user, + jira:, + jira_import:, + payload: jira_user_payload( + key: "JIRAUSER10108", + name: "admin@example.com", + display_name: "Administrator", + email: "admin@example.com", + groups: [] + )) + end + + it "uses the name for both firstname and lastname" do + jira_import.import_users + + user = User.find_by(login: "admin@example.com") + expect(user).to have_attributes( + firstname: "Administrator", + lastname: "Administrator" + ) + end + end + + context "when user has a multi-part display name" do + let!(:jira_user) do + create(:jira_user, + jira:, + jira_import:, + payload: jira_user_payload( + key: "JIRAUSER10109", + name: "jvd@example.com", + display_name: "Jean Van Der Berg", + email: "jvd@example.com", + groups: [] + )) + end + + it "uses all but last word as firstname and last word as lastname" do + jira_import.import_users + + user = User.find_by(login: "jvd@example.com") + expect(user).to have_attributes( + firstname: "Jean Van Der", + lastname: "Berg" + ) + end + end + end end diff --git a/spec/support/components/work_packages/create_dialog.rb b/spec/support/components/work_packages/create_dialog.rb index b6a6be96acf..39d33c5fdec 100644 --- a/spec/support/components/work_packages/create_dialog.rb +++ b/spec/support/components/work_packages/create_dialog.rb @@ -47,6 +47,8 @@ module Components in_dialog do select_combo_box_option value, from: "Type" end + + wait_for_network_idle # form is updated end def set_subject(value) diff --git a/spec/support/components/work_packages/relations.rb b/spec/support/components/work_packages/relations.rb index 4f6431e4840..3f120a49bf8 100644 --- a/spec/support/components/work_packages/relations.rb +++ b/spec/support/components/work_packages/relations.rb @@ -62,13 +62,13 @@ module Components # Search the current window in order to avoid within scope restrictions within_window(page.current_window) do within("wp-relations-tab") do - expect(page).to have_no_css("op-content-loader") + expect(page).to have_no_css("op-content-loader", wait: 10) end end end def expect_add_relation_button - expect(page).to have_test_selector("add-relation-action-menu") + expect(page).to have_test_selector("add-relation-action-menu", wait: 10) end def expect_no_add_relation_button @@ -145,7 +145,7 @@ module Components end def new_relation_button - page.find(id: "add-relation-action-menu-button") + page.find(id: "add-relation-action-menu-button", wait: 10) end def new_relation_sub_menu_button diff --git a/spec/support/flash/expectations.rb b/spec/support/flash/expectations.rb index 5e9e8c154e4..c94e61f9097 100644 --- a/spec/support/flash/expectations.rb +++ b/spec/support/flash/expectations.rb @@ -2,9 +2,9 @@ module Flash module Expectations - def expect_flash(message:, type: :success, wait: 20) + def expect_flash(message: nil, exact_message: nil, type: :success, wait: 20) expected_css = expected_flash_css(type) - expect(page).to have_css(expected_css, text: message, wait:) + expect(page).to have_css(expected_css, wait:, **{ text: message, exact_text: exact_message }.compact) end def find_flash_element(type:) @@ -12,29 +12,29 @@ module Flash page.find(expected_css) end - def expect_and_dismiss_flash(message: nil, type: :success, wait: 20) - expect_flash(type:, message:, wait:) + def expect_and_dismiss_flash(message: nil, exact_message: nil, type: :success, wait: 20) + expect_flash(type:, message:, exact_message:, wait:) dismiss_flash! - expect_no_flash(type:, message:, wait: 0.1) + expect_no_flash(type:, message:, exact_message:, wait: 0.1) end def dismiss_flash! page.find(".Banner-close button").click # rubocop:disable Capybara/SpecificActions end - def expect_no_flash(type: :success, message: nil, wait: 10) + def expect_no_flash(type: :success, message: nil, exact_message: nil, wait: 10) if type.nil? expect(page).not_to have_test_selector("op-primer-flash-message") else expected_css = expected_flash_css(type) - expect(page).to have_no_css(expected_css, text: message, wait:) + expect(page).to have_no_css(expected_css, wait:, **{ text: message, exact_text: exact_message }.compact) end end def expected_flash_css(type) scheme = mapped_flash_type(type) - case scheme - when :default + + if scheme == :default %{[data-test-selector="op-primer-flash-message"].Banner} else %{[data-test-selector="op-primer-flash-message"].Banner--#{scheme}} @@ -43,11 +43,9 @@ module Flash def mapped_flash_type(type) case type - when :error - :error # The class is error, but the scheme is danger - when :warning - :warning - when :success, :notice + when :error, :warning, :success + type + when :notice :success else :default