diff --git a/app/components/work_package_relations_tab/add_work_package_child_form_component.rb b/app/components/work_package_relations_tab/add_work_package_child_form_component.rb index f9f4d6863b11..8ad85664a9c8 100644 --- a/app/components/work_package_relations_tab/add_work_package_child_form_component.rb +++ b/app/components/work_package_relations_tab/add_work_package_child_form_component.rb @@ -47,6 +47,6 @@ def initialize(work_package:, base_errors: nil) def submit_url_options { method: :post, - url: work_package_children_path(@work_package) } + url: work_package_children_relations_path(@work_package) } end end diff --git a/app/components/work_package_relations_tab/index_component.html.erb b/app/components/work_package_relations_tab/index_component.html.erb index e78e21510bbf..c12694bc30e6 100644 --- a/app/components/work_package_relations_tab/index_component.html.erb +++ b/app/components/work_package_relations_tab/index_component.html.erb @@ -37,7 +37,7 @@ if should_render_add_child? menu.with_item( label: t("#{I18N_NAMESPACE}.relations.label_child_singular").capitalize, - href: new_work_package_child_path(@work_package), + href: new_work_package_children_relation_path(@work_package), test_selector: new_button_test_selector(relation_type: :child), content_arguments: { data: { turbo_stream: true } diff --git a/app/components/work_package_relations_tab/index_component.rb b/app/components/work_package_relations_tab/index_component.rb index 083455043601..f886f99da77f 100644 --- a/app/components/work_package_relations_tab/index_component.rb +++ b/app/components/work_package_relations_tab/index_component.rb @@ -27,6 +27,8 @@ def self.wrapper_key private def should_render_add_child? + return false if @work_package.milestone? + helpers.current_user.allowed_in_project?(:manage_subtasks, @work_package.project) end diff --git a/app/components/work_package_relations_tab/relation_component.rb b/app/components/work_package_relations_tab/relation_component.rb index efed86f893f4..c3d210607bc2 100644 --- a/app/components/work_package_relations_tab/relation_component.rb +++ b/app/components/work_package_relations_tab/relation_component.rb @@ -85,7 +85,7 @@ def edit_path def destroy_path if parent_child_relationship? - work_package_child_path(@work_package, @child) + work_package_children_relation_path(@work_package, @child) else work_package_relation_path(@work_package, @relation) end diff --git a/app/controllers/custom_fields_controller.rb b/app/controllers/custom_fields_controller.rb index 2beb4cfd0ff5..c280ec2dfebb 100644 --- a/app/controllers/custom_fields_controller.rb +++ b/app/controllers/custom_fields_controller.rb @@ -30,14 +30,17 @@ class CustomFieldsController < ApplicationController include CustomFields::SharedActions # share logic with ProjectCustomFieldsControlller layout "admin" + # rubocop:disable Rails/LexicallyScopedActionFilter before_action :require_admin before_action :find_custom_field, only: %i(edit update destroy delete_option reorder_alphabetical) before_action :prepare_custom_option_position, only: %i(update create) before_action :find_custom_option, only: :delete_option + before_action :validate_enterprise_token, only: %i(create) + # rubocop:enable Rails/LexicallyScopedActionFilter def index # loading wp cfs exclicity to allow for eager loading - @custom_fields_by_type = CustomField.all + @custom_fields_by_type = CustomField .where.not(type: ["WorkPackageCustomField", "ProjectCustomField"]) .group_by { |f| f.class.name } @@ -64,6 +67,12 @@ def show_local_breadcrumb false end + def validate_enterprise_token + if params.dig(:custom_field, :field_format) == "hierarchy" && !EnterpriseToken.allows_to?(:custom_field_hierarchies) + render_403 + end + end + def find_custom_field @custom_field = CustomField.find(params[:id]) rescue ActiveRecord::RecordNotFound diff --git a/app/controllers/work_package_children_controller.rb b/app/controllers/work_package_children_relations_controller.rb similarity index 65% rename from app/controllers/work_package_children_controller.rb rename to app/controllers/work_package_children_relations_controller.rb index 2c95e3cc8a39..2f1fb1574e5f 100644 --- a/app/controllers/work_package_children_controller.rb +++ b/app/controllers/work_package_children_relations_controller.rb @@ -28,7 +28,7 @@ # See COPYRIGHT and LICENSE files for more details. #++ -class WorkPackageChildrenController < ApplicationController +class WorkPackageChildrenRelationsController < ApplicationController include OpTurbo::ComponentStream include OpTurbo::DialogStreamHelper @@ -36,9 +36,6 @@ class WorkPackageChildrenController < ApplicationController before_action :authorize # Short-circuit early if not authorized - before_action :set_child, except: %i[new create] - before_action :set_relations, except: %i[new create] - def new component = WorkPackageRelationsTab::AddWorkPackageChildDialogComponent .new(work_package: @work_package) @@ -46,38 +43,33 @@ def new end def create - target_work_package_id = params[:work_package][:id] - target_child_work_package = WorkPackage.find(target_work_package_id) + child = WorkPackage.find(params[:work_package][:id]) + service_result = set_relation(child:, parent: @work_package) - target_child_work_package.parent = @work_package + respond_with_relations_tab_update(service_result) + end - if target_child_work_package.save - @children = @work_package.children.visible - @relations = @work_package.relations.visible + def destroy + child = WorkPackage.find(params[:id]) + service_result = set_relation(child:, parent: nil) - component = WorkPackageRelationsTab::IndexComponent.new( - work_package: @work_package, - relations: @relations, - children: @children - ) - replace_via_turbo_stream(component:) - update_flash_message_via_turbo_stream( - message: I18n.t(:notice_successful_update), scheme: :success - ) - respond_with_turbo_streams - end + respond_with_relations_tab_update(service_result) end - def destroy - @child.parent = nil + private - if @child.save + def set_relation(child:, parent:) + WorkPackages::UpdateService.new(user: current_user, model: child) + .call(parent:) + end + + def respond_with_relations_tab_update(service_result) + if service_result.success? @work_package.reload - @children = @work_package.children.visible component = WorkPackageRelationsTab::IndexComponent.new( work_package: @work_package, - relations: @relations, - children: @children + relations: @work_package.relations.visible, + children: @work_package.children.visible ) replace_via_turbo_stream(component:) update_flash_message_via_turbo_stream( @@ -85,21 +77,13 @@ def destroy ) respond_with_turbo_streams + else + respond_with_turbo_streams(status: :unprocessable_entity) end end - private - def set_work_package @work_package = WorkPackage.find(params[:work_package_id]) @project = @work_package.project end - - def set_child - @child = WorkPackage.find(params[:id]) - end - - def set_relations - @relations = @work_package.relations.visible - end end diff --git a/app/controllers/work_package_relations_controller.rb b/app/controllers/work_package_relations_controller.rb index 837e4e10a190..6be607a1669d 100644 --- a/app/controllers/work_package_relations_controller.rb +++ b/app/controllers/work_package_relations_controller.rb @@ -62,8 +62,8 @@ def create if service_result.success? @work_package.reload component = WorkPackageRelationsTab::IndexComponent.new(work_package: @work_package, - relations: @work_package.relations, - children: @work_package.children) + relations: @work_package.relations.visible, + children: @work_package.children.visible) replace_via_turbo_stream(component:) respond_with_turbo_streams else @@ -80,8 +80,8 @@ def update if service_result.success? @work_package.reload component = WorkPackageRelationsTab::IndexComponent.new(work_package: @work_package, - relations: @work_package.relations, - children: @work_package.children) + relations: @work_package.relations.visible, + children: @work_package.children.visible) replace_via_turbo_stream(component:) respond_with_turbo_streams else @@ -93,11 +93,12 @@ def destroy service_result = Relations::DeleteService.new(user: current_user, model: @relation).call if service_result.success? - @children = WorkPackage.where(parent_id: @work_package.id) + @children = WorkPackage.where(parent_id: @work_package.id).visible @relations = @work_package .relations .reload .includes(:to, :from) + .visible component = WorkPackageRelationsTab::IndexComponent.new(work_package: @work_package, relations: @relations, diff --git a/app/controllers/work_package_relations_tab_controller.rb b/app/controllers/work_package_relations_tab_controller.rb index c8d9ab9ad75b..f457a67fd936 100644 --- a/app/controllers/work_package_relations_tab_controller.rb +++ b/app/controllers/work_package_relations_tab_controller.rb @@ -33,9 +33,10 @@ class WorkPackageRelationsTabController < ApplicationController before_action :authorize_global def index - @children = WorkPackage.where(parent_id: @work_package.id) + @children = WorkPackage.where(parent_id: @work_package.id).visible @relations = @work_package .relations + .visible .includes(:to, :from) component = WorkPackageRelationsTab::IndexComponent.new( diff --git a/app/services/principals/replace_references_service.rb b/app/services/principals/replace_references_service.rb index e1c0810a49c1..14d46adac922 100644 --- a/app/services/principals/replace_references_service.rb +++ b/app/services/principals/replace_references_service.rb @@ -43,6 +43,7 @@ def call(from:, to:) def rewrite_active_models(from, to) rewrite_author(from, to) + rewrite_creator(from, to) rewrite_user(from, to) rewrite_assigned_to(from, to) rewrite_responsible(from, to) @@ -92,6 +93,12 @@ def rewrite_author(from, to) end end + def rewrite_creator(from, to) + [AuthProvider].each do |klass| + rewrite(klass, :creator_id, from, to) + end + end + def rewrite_user(from, to) [TimeEntry, CostEntry, @@ -149,7 +156,7 @@ def journal_classes end def foreign_keys - %w[author_id user_id assigned_to_id responsible_id logged_by_id presenter_id] + %w[author_id creator_id user_id assigned_to_id responsible_id logged_by_id presenter_id] end def rewrite(klass, attribute, from, to) diff --git a/app/views/wiki/export_multiple.html.erb b/app/views/wiki/export_multiple.html.erb index 83462dae26a2..f7f3daa7f2f8 100644 --- a/app/views/wiki/export_multiple.html.erb +++ b/app/views/wiki/export_multiple.html.erb @@ -53,7 +53,7 @@ See COPYRIGHT and LICENSE files for more details. <% @pages.each do |page| %>
- <%= format_text page.content ,:text, wiki_links: :anchor %> + <%= format_text page ,:text, wiki_links: :anchor %> <% end %> diff --git a/app/workers/principals/delete_job.rb b/app/workers/principals/delete_job.rb index 4df2dafba025..60a2c5fa2d75 100644 --- a/app/workers/principals/delete_job.rb +++ b/app/workers/principals/delete_job.rb @@ -66,6 +66,7 @@ def delete_associated(principal) delete_notifications(principal) delete_private_queries(principal) delete_tokens(principal) + delete_favorites(principal) end def delete_notifications(principal) @@ -77,6 +78,10 @@ def delete_private_queries(principal) CostQuery.where(user_id: principal.id, is_public: false).delete_all end + def delete_favorites(principal) + Favorite.where(user_id: principal.id).delete_all + end + def delete_tokens(principal) ::Token::Base.where(user_id: principal.id).destroy_all end diff --git a/config/initializers/menus.rb b/config/initializers/menus.rb index 33bdb9cd0d25..b8a026f54822 100644 --- a/config/initializers/menus.rb +++ b/config/initializers/menus.rb @@ -675,7 +675,7 @@ { tab: :relations }, skip_permissions_check: true, badge: ->(work_package:, **) { - work_package.relations.count + work_package.children.count + work_package.relations.visible.count + work_package.children.visible.count }, caption: :"js.work_packages.tabs.relations" menu.push :watchers, diff --git a/config/initializers/permissions.rb b/config/initializers/permissions.rb index 87f571f46a9d..762f8dc862f0 100644 --- a/config/initializers/permissions.rb +++ b/config/initializers/permissions.rb @@ -326,7 +326,7 @@ wpt.permission :manage_subtasks, { - work_package_children: %i[new create destroy] + work_package_children_relations: %i[new create destroy] }, permissible_on: :project, dependencies: :view_work_packages diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml index 9dafcd64e27c..d680e311be28 100644 --- a/config/locales/crowdin/de.yml +++ b/config/locales/crowdin/de.yml @@ -218,7 +218,7 @@ de: heading: Für alle Projekte description: Dieses Projekt-Attribut ist in allen Projekten aktiviert, da die Option "Für alle Projekte" aktiviert ist. Es kann nicht für einzelne Projekte deaktiviert werden. items: - actions: "Element-Aktionen" + actions: "Aktionen" blankslate: root: title: "Ihre Liste der Elemente ist leer" @@ -651,7 +651,7 @@ de: follows_description: "Das verknüpfte Arbeitspaket muss beendet sein bevor dieses Arbeitspaket starten kann" label_child_singular: "Untergeordnetes Arbeitspaket" label_child_plural: "Untergeordnete Arbeitspakete" - child_description: "Makes the related work package a sub-item of the current (parent) work package" + child_description: "Macht das zugehörige Arbeitspaket zu einem Unterelement des aktuellen (übergeordneten) Arbeitspakets" label_blocks_singular: "Blockiert" label_blocks_plural: "Blockiert" blocks_description: "Das verknüpfte Arbeitspaket kann erst geschlossen werden, wenn dieses Arbeitspaket geschlossen ist" @@ -1822,7 +1822,7 @@ de: label: "XLS" columns: input_label_report: "Spalten zur Attributtabelle hinzufügen" - input_caption_report: "Standardmäßig sind alle Attribute, die als Spalten in der Arbeitspaketliste hinzugefügt wurden, ausgewählt. Textfelder sind in der Attribut-Tabelle nicht verfügbar, können aber unterhalb der Tabelle angezeigt werden." + input_caption_report: "Standardmäßig sind alle Attribute, die als Spalten in der Arbeitspaketliste hinzugefügt wurden, ausgewählt. Langtextfelder sind in der Attributtabelle nicht verfügbar, können aber unterhalb der Tabelle angezeigt werden." input_caption_table: "Standardmäßig sind alle Attribute, die als Spalten in der Arbeitspaketliste hinzugefügt wurden, ausgewählt. Textfelder sind in tabellenbasierten Exporten nicht verfügbar." pdf: export_type: diff --git a/config/locales/crowdin/js-fr.yml b/config/locales/crowdin/js-fr.yml index e0e34fe8c835..0b0eac331e1a 100644 --- a/config/locales/crowdin/js-fr.yml +++ b/config/locales/crowdin/js-fr.yml @@ -280,7 +280,7 @@ fr: Voulez-vous continuer ? work_packages_settings: warning_progress_calculation_mode_change_from_status_to_field_html: >- - Passer du mode de calcul de la progression basé sur le statut au mode basé sur le travail transformera % réalisé en champ librement modifiable. Si vous complétez les champs Travail et Travail restant, ils seront également liés à % réalisé. Changer le champ Travail restant peut alors changer le % réalisé. + Passer du mode de calcul de la progression basé sur le statut au mode basé sur le travail transformera % réalisé en champ librement modifiable. Si vous complétez les champs Travail et Travail restant, ils seront également liés à % réalisé. Changer le champ Travail restant peut alors changer le % réalisé. warning_progress_calculation_mode_change_from_field_to_status_html: >- Passer du mode de calcul de la progression basé sur le travail au mode basé sur le statut entraînera la perte de toutes les valeurs de % réalisé existantes et leur remplacement par les valeurs associées à chaque statut. Les valeurs existantes pour Travail restant peuvent également être recalculées pour refléter ce changement. Cette action est irréversible. custom_actions: diff --git a/config/locales/crowdin/js-mn.yml b/config/locales/crowdin/js-mn.yml index 03e95456cf42..52e0c9b9379e 100644 --- a/config/locales/crowdin/js-mn.yml +++ b/config/locales/crowdin/js-mn.yml @@ -102,7 +102,7 @@ mn: button_save: "Save" button_settings: "Settings" button_uncheck_all: "Uncheck all" - button_update: "Update" + button_update: "Шинэчлэх" button_export-pdf: "Download PDF" button_export-atom: "Download Atom" button_generate_pdf: "Generate PDF" diff --git a/config/locales/crowdin/js-ro.yml b/config/locales/crowdin/js-ro.yml index 50a5e8738c74..b9ffab63c936 100644 --- a/config/locales/crowdin/js-ro.yml +++ b/config/locales/crowdin/js-ro.yml @@ -45,14 +45,14 @@ ro: remove: "Elimină ”%{name}”" active: "Activ %{label} %{name}" backup: - attachments_disabled: Atașamentele nu pot fi incluse deoarece depășesc dimensiunea maximă permisă. Puteți schimba acest lucru prin configurare (necesită o repornire a serverului). + attachments_disabled: Atașamentele nu pot fi incluse deoarece depășesc dimensiunea maximă permisă. Poți schimba acest lucru prin configurare (necesită o repornire a serverului). info: > - Poți declanșa un backup de aici. Procesul poate dura ceva timp în funcție mărimea datelor (mai ales atașamentele) pe care le ai. Vei primi un e-mail de îndată ce este gata. + Poți declanșa o copie de rezervă aici. Procesul poate dura ceva timp în funcție de mărimea datelor (mai ales atașamentele) pe care le ai. Vei primi un e-mail de îndată ce este gata. note: > - Un backup nou va înlocui orice backup anterior. Se poate solicita doar un număr limitat de backup-uri pe zi. - last_backup: Ultimul backup - last_backup_from: 'Ultimul backup: ' - title: Backup OpenProject + O nouă copie de rezervă va înlocui orice copie de rezervă anterioară. Se poate solicita doar un număr limitat de copii de rezervă pe zi. + last_backup: Ultima copie de rezervă + last_backup_from: Ultima copie de rezervă + title: Copie de rezervă OpenProject options: Opțiuni include_attachments: Include atașamente download_backup: Descarcă backup @@ -87,7 +87,7 @@ ro: button_advanced_filter: "Filtru avansat" button_list_view: "Vizualizare listă" button_show_view: "Vizualizare pe tot ecranul" - button_log_time: "Consum timp" + button_log_time: "Înregistrare timp" button_more: "Mai mult" button_open_details: "Deschidere vizualizare detaliată" button_close_details: "Închideţi fereastra cu detalii" @@ -167,7 +167,7 @@ ro: button: "Inserați fragmentul de cod" title: "Inserați/Editați fragmentul de cod" language: "Limbaj de formatare" - language_hint: "Introduceți limbajul de formatare care va fi utilizat pentru evidențiere (dacă există suport pentru acesta)." + language_hint: "Introdu limbajul de formatare care va fi utilizat pentru evidențiere (dacă există suport pentru acesta)." dropdown: macros: "Macro" chose_macro: "Alegeți macro" @@ -197,8 +197,8 @@ ro: custom_field: "Câmp personalizat" inactive: "Inactiv" drag_to_activate: "Mutați câmpuri de aici pentru a le activa" - add_group: "Adăugarea de noi grupuri de atribute" - add_table: "Adăugare pachet de lucru asociat" + add_group: "Adaugă grup atribut" + add_table: "Adaugă pachet de lucru asociat" edit_query: "Editare query" new_group: "Grupare nouă" reset_to_defaults: "Resetare AVATAR implicit" @@ -246,7 +246,7 @@ ro: high_security: "Caracteristici de securitate" high_security_text: "Autentificare unică (SAML, OpenID Connect, CAS), grupuri LDAP." installation: "Suport pentru instalare" - installation_text: "Inginerii de software experimentați vă ghidează prin procesul complet de instalare și configurare în propria infrastructură." + installation_text: "Inginerii de software experimentați te ghidează prin procesul complet de instalare și configurare în propria infrastructură." premium_features: "Enterprise add-on-uri" premium_features_text: "Tablouri agile, temă și logo personalizate, grafice, fluxuri de lucru inteligente cu acțiuni personalizate, căutare în text complet pentru atașamentele pachetelor de lucru și câmpuri personalizate cu selectare multiplă." professional_support: "Suport profesional" @@ -326,7 +326,7 @@ ro: filter: noneSelection: "(nimic)" selection_mode: - notification: "Faceți click pe oricare dintre pachetele de lucru pentru a crea o legătură. Apăsați Escape pentru a anula." + notification: "Dă clic pe oricare dintre pachetele de lucru pentru a crea o legătură. Apasă Escape pentru a anula." zoom: in: "Mărire" out: "Micșorare" @@ -370,13 +370,13 @@ ro: token_name_description_text: 'If you subscribe to this calendar from multiple devices, this name will help you distinguish between them in your access tokens list.' copy_url_label: "Copiază URL" ical_generation_error_text: "An error occured while generating the calendar URL." - success_message: 'The URL "%{name}" was successfully copied to your clipboard. Paste it in your calendar client to complete the subscription.' + success_message: 'URL-ul "%{name}" a fost copiat cu succes în clipboard-ul tău. Lipiți-l în clientul calendar pentru a finaliza abonamentul.' label_activate: "Activare" label_assignee: "Executant" label_add_column_after: "Adaugă coloană după" label_add_column_before: "Adaugă coloană înainte" label_add_columns: "Adaugă coloane" - label_add_comment: "Adăugare comentariu" + label_add_comment: "Adaugă comentariu" label_add_comment_title: "Comentează și tastează @ pentru a notifica alte persoane" label_add_row_after: "Adauga un rand dupa" label_add_row_before: "Adauga un rand inainte" @@ -499,8 +499,8 @@ ro: label_selected_filter_list: "Filtre selectate" label_show_attributes: "Afișați toate câmpurile" label_show_in_menu: "Vizualizați configurația în meniu" - label_sort_by: "Sortare după" - label_sorted_by: "sortare după" + label_sort_by: "Sortează după" + label_sorted_by: "sortează după" label_sort_higher: "Mută în sus" label_sort_lower: "Mută în jos" label_sorting: "Sortare" @@ -518,7 +518,7 @@ ro: label_up: "Sus" label_user_plural: "Utilizatori" label_activity_show_only_comments: "Arată doar activitățile cu comentarii" - label_activity_show_all: "Afișează toate activitățile" + label_activity_show_all: "Arată toate activitățile" label_total_progress: "%{percent} % Progres total" label_total_amount: "Total: %{amount}" label_updated_on: "actualizat la data de" @@ -593,7 +593,7 @@ ro: toggler: "Acum să ne uităm la secțiunea Pachet de lucru, care vă oferă o vizualizare mai detaliată a activității dumneavoastră." list: "Acest pachet de lucru oferă o listă a tuturor activităților din proiectul tău, cum ar fi sarcini, jaloane, faze și altele.
Pachetele de lucru pot fi create și editate direct din acest punct de vedere. Pentru a accesa detaliile unui anumit pachet de lucru, faceți dublu clic pe rând." full_view: "Vizualizarea pentru detaliile pachetului de lucru furnizează toate informațiile relevante referitoare la un anumit pachet de lucru, cum ar fi descrierea, starea, prioritatea, activitățile, dependențele si comentariile." - back_button: "Utilizați săgeata de întoarcere din colțul din stânga sus pentru a ieși și pentru a reveni la lista pachetelor de lucru." + back_button: "Utilizează săgeata de întoarcere din colțul din stânga sus pentru a ieși și pentru a reveni la lista pachetelor de lucru." create_button: "Butonul Creează va adăuga un nou pachet de lucru la proiectul tău." gantt_menu: "Create project schedules and timelines effortlessly using the Gantt chart module." timeline: "Aici puteţi edita planul de proiect, crea noi pachete de lucru, cum ar fi sarcini, repere de etapă, faze și multe altele, precum și adaugă dependențe. Toți membrii echipei pot vedea și actualiza cel mai recent plan în orice moment." @@ -712,7 +712,7 @@ ro: default: "-" subject: "Introduceţi subiectul aici" selection: "Te rog selectează" - description: "Descriere: Clic pentru a edita..." + description: "Descriere: Clic pentru editare ..." relation_description: "Clic pentru a adăuga o descriere pentru această relație" project: required_outside_context: > @@ -750,7 +750,7 @@ ro: forum_messages: "Mesaje noi pe forum" wiki_page_added: "Pagină wiki adăugată" wiki_page_updated: "Pagină wiki actualizată" - membership_added: "Adăugarea de membri" + membership_added: "Adaugă membri" membership_updated: "Membrii actualizați" title: "E-mail memento-uri" pause: @@ -777,7 +777,7 @@ ro: settings: "Setări" time_entry: work_package_required: "Necesită să se selecteze mai întâi un pachet de lucru." - title: "Consum timp" + title: "Registru timp" tracking: "Monitorizare efort" stop: "Stop" timer: @@ -792,56 +792,56 @@ ro: label_loading: se încarcă observatorii... label_error_loading: A apărut o eroare în timpul încărcării observatorilor label_search_watchers: Caută observator - label_add: Adăugare observatori + label_add: Adaugă observatori label_discard: Renunțare la selecţie typeahead_placeholder: Căutarea de posibili observatori relation_labels: parent: "Părinte" - children: "Fii" + children: "Copii" relates: "În relație cu" duplicates: "Dublează" duplicated: "Dublat de" blocks: "Blochează" blocked: "Blocat de" precedes: "Precede" - follows: "Urmează după" + follows: "Urmează" includes: "Include" partof: "Parte din" requires: "Necesită" required: "Cerut de" - relation_type: "tipul de relaţie" + relation_type: "tip relație" relations_hierarchy: parent_headline: "Părinte" - hierarchy_headline: "Arată ierarhia" - children_headline: "Fii" + hierarchy_headline: "Ierarhie" + children_headline: "Copii" relation_buttons: set_parent: "Setează părinte" - change_parent: "Modificare părinte" - remove_parent: "Elimina părinte" - hierarchy_indent: "Ierarhia de indentare" - hierarchy_outdent: "Ierarhie ieșită din comun" + change_parent: "Modifică părinte" + remove_parent: "Elimină părinte" + hierarchy_indent: "Indentare ierarhie" + hierarchy_outdent: "Elimină ierarhia" group_by_wp_type: "Grupează după tipul packetului de lucru" group_by_relation_type: "Grupează dupa tipul legăturii" add_parent: "Adaugă părinte existent" - add_new_child: "Crează un nou copil" - create_new: "Creați un nou" - add_existing: "Adăugați Existent" - add_existing_child: "Adaugă un copil existent" + add_new_child: "Creează copil nou" + create_new: "Creează nou" + add_existing: "Adaugă existent" + add_existing_child: "Adaugă copil existent" remove_child: "Elimină copil" add_new_relation: "Crează o nouă relație" - add_existing_relation: "Adăugarea unei relații existente" + add_existing_relation: "Adaugă relație existentă" update_description: "Setează sau actualizează descrierea acestei relații" toggle_description: "Comută descrierea relației" update_relation: "Clic pentru a schimba tipul de legătură" add_follower: "Adaugă urmăritor" show_relations: "Arată relațiile" add_predecessor: "Adăugați predecesorul" - remove: "Eliminare relaţie" + remove: "Eliminare relație" save: "Salvează relația" abort: "Anulează" relations_autocomplete: placeholder: "Tastează pentru a căuta" - parent_placeholder: "Alegeți un nou părinte sau apăsați Escape pentru a anula." + parent_placeholder: "Alege un nou părinte sau apasă Escape pentru a anula." autocompleter: placeholder: "Tastează pentru a căuta" notFoundText: "Niciun articol găsit" @@ -896,16 +896,16 @@ ro: edit: "Editează mai multe elemente" copy: "Copiază mai multe elemente" delete: "Șterge mai multe element" - button_clear: "Inițializare" + button_clear: "Șterge" comment_added: "Comentariul a fost adăugat cu succes." comment_send_failed: "A apărut o eroare. Comentariul nu a putut fi salvat." comment_updated: "Comentariul a fost actualizat cu succes." confirm_edit_cancel: "Sunteți sigur că doriți să renunțați la editarea pachetului de lucru?" datepicker_modal: automatically_scheduled_parent: "Programat automat. Datele sunt derivate din relații." - manually_scheduled: "Programarea manuală activată, toate relațiile ignorate." + manually_scheduled: "Programare manuală activată, toate relațiile ignorate." start_date_limited_by_relations: "Datele de început disponibile și de încheiere sunt limitate de relații." - changing_dates_affects_follow_relations: "Modificarea acestor date va afecta datele pachetelor de lucru aferente." + changing_dates_affects_follow_relations: "Modificarea acestor dăți va afecta dățile pachetelor de lucru aferente." click_on_show_relations_to_open_gantt: 'Faceți clic pe "%{button_name}" pentru o prezentare generală a GANTT.' show_relations: "Arată relațiile" ignore_non_working_days: @@ -918,8 +918,8 @@ ro: key_value: "%{key}: %{value}" label_enable_multi_select: "Activare selecție multiplă" label_disable_multi_select: "Dezactivare selecție multiplă" - label_filter_add: "Adăugare filtru" - label_filter_by_text: "Filtreaza dupa text" + label_filter_add: "Adaugă filtru" + label_filter_by_text: "Filtrează după text" label_options: "Opțiuni" label_column_multiselect: "Câmp desfășurat combinat: selectaţi cu săgețile, confirmați alegerea cu enter, ştergeţi cu backspace" message_error_during_bulk_delete: A apărut o eroare la ștergerea pachetelor de lucru. @@ -1021,7 +1021,7 @@ ro: query: column_names: "Coloane" group_by: "Grupare rezultate" - group: "Grupare după" + group: "Grupează după" group_by_disabled_by_hierarchy: "Gruparea este dezactivată deoarece modul ierarhic este activ." hierarchy_disabled_by_group_by: "Modul ierarhic este dezactivat deoarece rezultatele sunt grupate în %{column}." sort_ascending: "Ordonează ascendent" @@ -1032,7 +1032,7 @@ ro: insert_columns: "Inserează coloane" filters: "Filtre" display_sums: "Afişare totaluri" - confirm_edit_cancel: "Sunteți sigur că doriți să anulați editarea numelui acestei vizualizări? Titlul va fi setat la valoarea anterioară." + confirm_edit_cancel: "Ești sigur că vrei să anulezi editarea numelui acestei vizualizări? Titlul va fi setat la valoarea anterioară." click_to_edit_query_name: "Câmpul %s este gol. Click aici pentru a-l edita." rename_query_placeholder: "Vezi" star_text: "Marcați această vizualizare ca favorită și adăugați-o la bara laterală de vizualizări salvate din stânga." @@ -1074,7 +1074,7 @@ ro: description: "Nicio culoare" none: "Fără evidențiere" inline: "Evidențiați atributul (atributele) inline" - inline_all: "Afișați toate câmpurile" + inline_all: "Toate atributele" entire_row_by: "Întregul rând pe tipuri" status: "Stare" priority: "Prioritate" @@ -1105,8 +1105,8 @@ ro: settings: configure_view: "Configurează vizualizarea" columns: "Coloane" - sort_by: "Sortare după" - group_by: "Grupare după" + sort_by: "Sortează după" + group_by: "Grupează după" display_sums: "Afişare totaluri" display_hierarchy: "Afișați ierarhia" hide_hierarchy: "Ascundeți ierarhia" @@ -1116,7 +1116,7 @@ ro: export: "Exportă" visibility_settings: "Setări vizibilitate" share_calendar: "Subscribe to calendar" - page_settings: "Redenumire" + page_settings: "Redenumește vizualizare" delete: "Șterge" filter: "Filtrează" unselected_title: "Pachet de lucru" @@ -1150,13 +1150,13 @@ ro: notice_bad_request: "Cerere invalidă." relations: empty: Nu există relații - remove: Eliminare relaţie + remove: Elimină relație inplace: button_edit: "%{attribute}: Editare" button_save: "%{attribute}: Salvează" button_cancel: "%{attribute}: Anulare" button_save_all: "Salvează" - button_cancel_all: "Anulare" + button_cancel_all: "Anulează" link_formatting_help: "Ajutor pentru formatarea textului" btn_preview_enable: "Previzualizare" btn_preview_disable: "Dezactivare previzualizare" @@ -1288,7 +1288,7 @@ ro: include_projects: toggle_title: "Include proiecte" title: "Proiecte" - clear_selection: "Anulați selecția" + clear_selection: "Anulează selecția" apply: "Aplică" selected_filter: all: "Toate Proiectele" @@ -1302,11 +1302,11 @@ ro: no_results: "Niciun proiect nu corespunde criteriilor de căutare." baseline: toggle_title: "Referință" - clear: "Golire" + clear: "Șterge" apply: "Aplică" header_description: "Evidențiază modificările făcute la această listă de la orice punct din trecut." enterprise_header_description: "Highlight changes made to this list since any point in the past with Enterprise edition." - show_changes_since: "Arată modificările din" + show_changes_since: "Arată modificările" baseline_comparison: "Comparație referință" help_description: "Zona orară de referință" time_description: "În timpul tău local: %{datetime}" @@ -1315,11 +1315,11 @@ ro: to: "La" drop_down: none: "-" - yesterday: "ieri" - last_working_day: "ultima zi lucrătoare" - last_week: "săptămâna trecută" - last_month: "luna trecută" - a_specific_date: "o anumită dată" + yesterday: "de ieri" + last_working_day: "de la ultima zi lucrătoare" + last_week: "de săptămâna trecută" + last_month: "de luna trecută" + a_specific_date: "de la o anumită dată" between_two_specific_dates: "între două dăți specifice" legends: changes_since: "Modificări de la" diff --git a/config/locales/crowdin/js-ru.yml b/config/locales/crowdin/js-ru.yml index 38dd2624861c..23d85b789c27 100644 --- a/config/locales/crowdin/js-ru.yml +++ b/config/locales/crowdin/js-ru.yml @@ -696,8 +696,8 @@ ru: teaser_text: "С уведомлениями о дате вы будете уведомлены о датах начала или окончания предстоящих дат, чтобы вы никогда не пропустили или не забыли важный срок." overdue: Когда просрочено project_specific: - title: "Настройки уведомлений проекта" - description: "Эти настройки специфического проекта переопределяют параметры по умолчанию выше." + title: "Настройки уведомлений для конкретного проекта" + description: "Эти настройки для конкретного проекта переопределяют параметры по умолчанию." add: "Добавить настройку для проекта" already_selected: "Этот проект уже выбран" remove: "Удалить настройки проекта" @@ -1323,8 +1323,8 @@ ru: last_working_day: "последний рабочий день" last_week: "прошлой недели" last_month: "прошлый месяц" - a_specific_date: "определенная дата" - between_two_specific_dates: "между двумя определенными датами" + a_specific_date: "конкретная дата" + between_two_specific_dates: "между двумя конкретными датами" legends: changes_since: "Изменения с" changes_between: "Изменения между" diff --git a/config/locales/crowdin/js-zh-TW.yml b/config/locales/crowdin/js-zh-TW.yml index 4313803c0d73..2a9ca97c2ba5 100644 --- a/config/locales/crowdin/js-zh-TW.yml +++ b/config/locales/crowdin/js-zh-TW.yml @@ -800,8 +800,8 @@ zh-TW: duplicated: "重複於" blocks: "攔阻" blocked: "被阻擋" - precedes: "後置項目" - follows: "前置項目" + precedes: "優先" + follows: "次の項目に後続" includes: "包括" partof: "一部分" requires: "需要" @@ -975,7 +975,7 @@ zh-TW: percentComplete: "完成度(%)" percentCompleteAlternative: "進度" dueDate: "完成日期" - duration: "天數" + duration: "時長" spentTime: "耗時" category: "類別" percentageDone: "完成百分比" diff --git a/config/locales/crowdin/mn.yml b/config/locales/crowdin/mn.yml index 57378ec73350..2ee5bf5fa625 100644 --- a/config/locales/crowdin/mn.yml +++ b/config/locales/crowdin/mn.yml @@ -335,7 +335,7 @@ mn: favored: "Favorite projects" archived: "Archived projects" shared: "Shared project lists" - my_lists: "My project lists" + my_lists: "Миний төслийн жагсаалт" new: placeholder: "New project list" delete_modal: @@ -362,7 +362,7 @@ mn: actions: label_enable_single: "Active in this project, click to disable" label_disable_single: "Inactive in this project, click to enable" - remove_from_project: "Remove from project" + remove_from_project: "Төслөөс устгах" label_enable_all: "Enable all" label_disable_all: "Disable all" is_required_blank_slate: @@ -901,7 +901,7 @@ mn: begin_insertion: "Begin of the insertion" begin_deletion: "Begin of the deletion" children: "Subelements" - derived_done_ratio: "Total % complete" + derived_done_ratio: "Нийт % дууссан" derived_remaining_hours: "Total remaining work" derived_remaining_time: "Total remaining work" done_ratio: "% Complete" @@ -1311,7 +1311,7 @@ mn: custom_field: "Custom field" "doorkeeper/application": "OAuth application" forum: "Forum" - global_role: "Global role" + global_role: "Глобал үүрэг" group: "Group" member: "Member" news: "News" @@ -1321,8 +1321,8 @@ mn: placeholder_user: "Placeholder user" project: "Project" project_query: - one: "Project list" - other: "Project lists" + one: "Төслийн жагсаалт" + other: "Төслийн жагсаалтууд" query: "Custom query" role: one: "Role" @@ -1403,7 +1403,7 @@ mn: default_columns: "Default columns" description: "Description" derived_due_date: "Derived finish date" - derived_estimated_hours: "Total work" + derived_estimated_hours: "Нийт ажил" derived_start_date: "Derived start date" display_sums: "Display Sums" due_date: "Finish date" @@ -2220,7 +2220,7 @@ mn: label_custom_field_default_type: "Empty type" label_custom_style: "Design" label_custom_style_description: "Choose how OpenProject looks to you with themes, select your default colors to use in the app and how exports look like." - label_dashboard: " Хянах самбар" + label_dashboard: "Хянах самбар" label_database_version: "PostgreSQL version" label_date: "Date" label_date_and_time: "Date and time" @@ -2336,7 +2336,7 @@ mn: label_index_by_title: "Index by title" label_information: "Information" label_information_plural: "Information" - label_installation_guides: "Installation guides" + label_installation_guides: "Суулгах зааварууд" label_integer: "Integer" label_internal: "Internal" label_introduction_video: "Introduction video" @@ -2779,7 +2779,7 @@ mn: more_to_see: one: "There is 1 more work package with notifications." other: "There are %{count} more work packages with notifications." - open_in_browser: "Open in browser" + open_in_browser: "Хөтөч дээр нээх" reason: watched: "Watched" assigned: "Assigned" @@ -3000,7 +3000,7 @@ mn: permission_add_work_package_notes: "Add notes" permission_add_work_packages: "Add work packages" permission_add_messages: "Post messages" - permission_add_project: "Create projects" + permission_add_project: "Төсөл үүсгэх" permission_add_work_package_attachments: "Add attachments" permission_add_work_package_attachments_explanation: "Allows adding attachments without Edit work packages permission" permission_archive_project: "Archive project" @@ -3018,7 +3018,7 @@ mn: permission_commit_access: "Read/write access to repository (commit)" permission_copy_projects: "Copy projects" permission_copy_work_packages: "Copy work packages" - permission_create_backup: "Create backups" + permission_create_backup: "Нөөцлөлт үүсгэх" permission_delete_work_package_watchers: "Delete watchers" permission_delete_work_packages: "Delete work packages" permission_delete_messages: "Delete messages" diff --git a/config/locales/crowdin/nl.yml b/config/locales/crowdin/nl.yml index ba98bc7e61a2..75b55c4db08d 100644 --- a/config/locales/crowdin/nl.yml +++ b/config/locales/crowdin/nl.yml @@ -325,9 +325,9 @@ nl: no_results_content_text: Maak een nieuw project search: label: Project name filter - placeholder: Search by project name + placeholder: Zoeken op projectnaam lists: - active: "Active projects" + active: "Actieve projecten" my: "Mijn projecten" favored: "Favoriete projecten" archived: "Gearchiveerde projecten" @@ -336,8 +336,8 @@ nl: new: placeholder: "Nieuwe projectlijst" delete_modal: - title: "Delete project list" - text: "This action will not delete any project the list contains. Are you sure you want to delete this project list?" + title: "Projectlijst verwijderen" + text: "Deze actie verwijdert geen enkel project dat de lijst bevat. Weet u zeker dat u deze projectlijst wilt verwijderen?" settings: change_identifier: Change identifier activities: diff --git a/config/locales/crowdin/ro.seeders.yml b/config/locales/crowdin/ro.seeders.yml index 202b79f69592..8f8f4f33ab50 100644 --- a/config/locales/crowdin/ro.seeders.yml +++ b/config/locales/crowdin/ro.seeders.yml @@ -107,7 +107,7 @@ ro: name: Imediată projects: demo-project: - name: Demo project + name: Proiect demonstrativ status_explanation: All tasks are on schedule. The people involved know their tasks. The system is completely set up. description: This is a short summary of the goals of this demo project. news: @@ -446,9 +446,9 @@ ro: item_0: name: Nou item_1: - name: Specificații în curs + name: Specificație în curs item_2: - name: Cu specificații + name: Specificat item_3: name: Confirmat item_4: diff --git a/config/locales/crowdin/ro.yml b/config/locales/crowdin/ro.yml index e2941af70d64..1caa50adbbc9 100644 --- a/config/locales/crowdin/ro.yml +++ b/config/locales/crowdin/ro.yml @@ -59,7 +59,7 @@ ro: main-menu-bg-selected-background: "Meniul principal când este selectat" main-menu-bg-hover-background: "Meniul principal la plutire" custom_colors: "Culori personalizate" - customize: "Personalizează-ți instalația OpenProject cu propriul logo și culori." + customize: "Personalizează-ți instalarea OpenProject cu propriul logo și culori." enterprise_notice: "Ca un 'Mulțumesc!' special pentru contribuția lor financiară la dezvoltarea OpenProject, acest mic add-on este disponibil doar pentru abonații la ediția Enterprise." enterprise_more_info: "Notă: logo-ul utilizat va fi accesibil publicului." manage_colors: "Modificați opțiunile de selecție ale culorilor" @@ -90,11 +90,11 @@ ro: upgrade: "Actualizează acum" contact: "Contactați-ne pentru un demo" enterprise_info_html: "is an Enterprise add-on." - upgrade_info: "Vă rugăm să treceți la un plan plătit pentru a-l activa și a începe să îl utilizați în echipa dumneavoastră." + upgrade_info: "Te rog să treci la un plan plătit pentru a-l activa și a începe să îl utilizezi în echipa ta." jemalloc_allocator: Jemalloc memory allocator journal_aggregation: explanation: - text: "Acțiunile individuale ale unui utilizator (de exemplu, actualizarea de două ori a unui pachet de lucru) sunt agregate într-o singură acțiune dacă diferența de vârstă dintre ele este mai mică decât intervalul de timp specificat. Acestea vor fi afișate ca o singură acțiune în cadrul aplicației. De asemenea, acest lucru va întârzia notificările cu aceeași perioadă de timp, reducând numărul de e-mailuri trimise și va afecta, de asemenea, întârzierea %{webhook_link}." + text: "Acțiunile individuale ale unui utilizator (de exemplu, actualizarea de două ori a unui pachet de lucru) sunt agregate într-o singură acțiune dacă diferența de vechime dintre ele este mai mică decât intervalul de timp specificat. Acestea vor fi afișate ca o singură acțiune în cadrul aplicației. De asemenea, acest lucru va întârzia notificările cu aceeași perioadă de timp, reducând numărul de e-mailuri trimise și va afecta, de asemenea, întârzierea %{webhook_link}." link: "webhook" announcements: show_until: Afişare până la @@ -138,12 +138,12 @@ ro: generic_map: Cheia atributului din LDAP care este mapată pe atributul OpenProject `%{attribute}` admin_map_html: "Opțional: Cheia atributului în LDAP care, dacă este prezentă, marchează utilizatorul OpenProject ca fiind administrator. Lăsați gol dacă aveți îndoieli." system_user_dn_html: | - Introduceți DN-ul utilizatorului de sistem utilizat pentru accesul numai pentru citire. + Introdu DN-ul utilizatorului de sistem utilizat pentru accesul numai pentru citire.
Exemplu: uid=openproject,ou=system,dc=example,dc=com - system_user_password: Introduceți parola de legătură a utilizatorului de sistem + system_user_password: Introdu parola de legătură a utilizatorului de sistem base_dn: | - Introduceți DN-ul de bază al subarborelui din LDAP în care doriți ca OpenProject să caute utilizatori și grupuri. + Introdu DN-ul de bază al subarborelui din LDAP în care vrei ca OpenProject să caute utilizatori și grupuri. OpenProject va filtra numai pentru numele de utilizator furnizate în acest subarbore. Exemplu: ou=users,dc=example,dc=com filter_string: | @@ -161,7 +161,7 @@ ro: system_account: "Contul de sistem" system_account_legend: | OpenProject necesită acces doar pentru citire printr-un cont de sistem pentru a căuta utilizatori și grupuri în arborele LDAP. - Vă rugăm să specificați acreditările de conectare pentru acest utilizator de sistem în secțiunea următoare. + Te rog să specifici acreditările de conectare pentru acest utilizator de sistem în secțiunea următoare. ldap_details: "Detalii LDAP" user_settings: "Lista Mapare Atribute" user_settings_legend: | @@ -172,7 +172,7 @@ ro: simple_tls: "LDAPS" start_tls: "STARTTLS" plain_description: "Deschide o conexiune necriptată la serverul LDAP. Nu se recomandă pentru producție." - simple_tls_description: "Utilizați LDAPS. Necesită un port separat pe serverul LDAP. Acest mod este adesea depreciat, recomandăm utilizarea STARTTLS ori de câte ori este posibil." + simple_tls_description: "Utilizează LDAPS. Necesită un port separat pe serverul LDAP. Acest mod este adesea depreciat, recomandăm utilizarea STARTTLS ori de câte ori este posibil." start_tls_description: "Trimite o comandă STARTTLS după conectarea la portul LDAP standard. Recomandată pentru conexiuni criptate." section_more_info_link_html: > Această secțiune se referă la securitatea conexiunii acestei surse de autentificare LDAP. Pentru mai multe informații, consultați documentația Net::LDAP. @@ -180,7 +180,7 @@ ro: verify_peer: "Verificarea certificatului SSL" verify_peer_description_html: > Activează verificarea SSL strictă a lanțului de încredere al certificatului.
Avertisment: Debifarea acestei opțiuni dezactivează verificarea SSL a certificatului serverului LDAP. Acest lucru expune conexiunea ta cu Omul în timpul atacurilor din Mijloc. - tls_certificate_description: "Dacă certificatul serverului LDAP nu se află în sursele de încredere ale acestui sistem, îl puteți adăuga manual aici. Introduceți un șir de certificate PEM X509." + tls_certificate_description: "Dacă certificatul serverului LDAP nu se află în sursele de încredere ale acestui sistem, îl poți adăuga manual aici. Introdu un șir de certificate PEM X509." forums: show: no_results_title_text: În prezent nu există mesaje pentru acest forum. @@ -218,7 +218,7 @@ ro: admin: custom_field_projects: is_for_all_blank_slate: - heading: For all projects + heading: Pentru toate proiectele description: This custom field is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects. items: actions: "Item actions" @@ -247,17 +247,17 @@ ro: enabled_in_project: "Activat/ă în proiect" contained_in_type: "Înclusă în tipul" confirm_destroy_option: "Ștergerea unei opțiuni va șterge toate aparițiile acesteia (de exemplu, în pachetele de lucru). Sunteți sigur că doriți să o ștergeți?" - reorder_alphabetical: "Reordonați valorile în ordine alfabetică" + reorder_alphabetical: "Reordonează valorile alfabetic" reorder_confirmation: "Avertisment: Ordinea curentă a valorilor disponibile se va pierde. Continuați?" instructions: is_required: "Mark the custom field as required. This will make it mandatory to fill in the field when creating new or updating existing resources." - is_required_for_project: "Check to enable this attribute and make it required in all projects. It cannot be deactived for individual projects." + is_required_for_project: "Bifează pentru a activa acest atribut și a-l face obligatoriu în toate proiectele. Nu poate fi dezactivat pentru proiecte individuale." is_for_all: "Mark the custom field as available in all existing and new projects." - multi_select: "Allows the user to assign multiple values to this custom field." + multi_select: "Permite utilizatorului să atribuie valori multiple acestui câmp personalizat." searchable: "Include valorile câmpului atunci când utilizezi funcționalitatea globală de căutare." searchable_for_project: "Bifează pentru a face acest atribut disponibil sub formă de filtru în listele de proiecte." editable: "Allow the field to be editable by users themselves." - admin_only: "Check to make this attribute only visible to administrators. Users without admin rights will not be able to view or edit it." + admin_only: "Bifează pentru a face acest atribut vizibil doar administratorilor. Utilizatorii fără drepturi de administrator nu vor putea vedea sau edita acest atribut" is_filter: > Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views. tab: @@ -302,7 +302,7 @@ ro: no_results_title_text: În acest moment nu există proiecte care să facă parte din acest grup. incoming_mails: ignore_filenames: > - Specificați o listă de nume care trebuie ignorate la procesarea atașamentelor pentru mesajele primite (de exemplu, semnături sau pictograme). Introduceți un nume de fișier pe linie. + Specifică o listă de nume care trebuie ignorate la procesarea atașamentelor pentru mesajele primite (de exemplu, semnături sau pictograme). Introdu un nume de fișier pe linie. projects: copy: #Contains custom strings for options when copying a project that cannot be found elsewhere. @@ -310,7 +310,7 @@ ro: overviews: "Prezentare generală proiect" queries: "Pachete de lucru: vizualizări salvate" wiki_page_attachments: "Pagini wiki: atașamente" - work_package_attachments: "Pachete de lucru: anexe" + work_package_attachments: "Pachete de lucru: atașamente" work_package_categories: "Pachete de lucru: categorii" work_package_file_links: "Pachete de lucru: legături de fișiere" work_package_shares: "Pachete de lucru: partajări" @@ -362,16 +362,16 @@ ro: actions: label_enable_single: "Active in this project, click to disable" label_disable_single: "Inactive in this project, click to enable" - remove_from_project: "Remove from project" - label_enable_all: "Enable all" - label_disable_all: "Disable all" + remove_from_project: "Elimină din proiect" + label_enable_all: "Activează tot" + label_disable_all: "Dezactivează tot" is_required_blank_slate: - heading: Required in all projects - description: This project attribute is activated in all projects since the "Required in all projects" option is checked. It cannot be deactivated for individual projects. + heading: Obligatoriu în toate proiectele + description: Acest atribut de proiect este activat în toate proiectele deoarece opțiunea "Obligatoriu în toate proiectele" este bifată. Acesta nu poate fi dezactivat pentru proiecte individuale. types: no_results_title_text: În acest moment nu există tipuri disponibile. form: - enable_type_in_project: 'Activare tip %{type}' + enable_type_in_project: 'Activează tip %{type}' versions: no_results_title_text: În acest moment nu există versiuni pentru acest proiect. no_results_content_text: Creează versiune nouă @@ -395,7 +395,7 @@ ro: members: index: no_results_title_text: În acest moment nu există niciun participant la acest proiect. - no_results_content_text: Adăugare participant la proiect + no_results_content_text: Adaugă participant la proiect invite_by_mail: "Trimite invitația la %{mail}" send_invite_to: "Send invite to" columns: @@ -484,7 +484,7 @@ ro: news: index: no_results_title_text: În acest moment nu există știri de raportat. - no_results_content_text: Adăugare știre nouă + no_results_content_text: Adaugă știre nouă users: autologins: prompt: "Stay logged in for %{num_days}" @@ -510,13 +510,13 @@ ro: placeholder_users: right_to_manage_members_missing: > Nu aveți permisiunea de a șterge utilizatorul de tip placeholder. Nu aveți dreptul de a gestiona membrii pentru toate proiectele din care face parte utilizatorul de tip placeholder. - delete_tooltip: "Ștergeți utilizatorul de tip placeholder" + delete_tooltip: "Șterge utilizator placeholder" deletion_info: heading: "Ștergeți utilizatorul de tip placeholder %{name}" data_consequences: > Toate prezențele utilizatorului de tip "placeholder" (de exemplu, ca destinatar, responsabil sau alte valori de utilizator) vor fi realocate unui cont numit "Utilizator eliminat". Deoarece datele fiecărui cont șters sunt realocate acestui cont, nu va fi posibilă deosebirea datelor create de utilizator de datele unui alt cont șters. irreversible: "Această acțiune este ireversibilă" - confirmation: "Introduceți numele de utilizator de tip placeholder %{name} pentru a confirma ștergerea." + confirmation: "Introdu numele de utilizator de tip placeholder %{name} pentru a confirma ștergerea." upsale: title: Utilizatori Placeholder description: > @@ -539,7 +539,7 @@ ro: reportings: index: no_results_title_text: În acest moment nu există rapoarte de stare. - no_results_content_text: Adăugare raport de stare + no_results_content_text: Adaugă raport de stare statuses: edit: status_color_text: | @@ -561,7 +561,7 @@ ro: Notă: Valorile moștenite (de exemplu, de la copii sau relații) se vor aplica în continuare. index: no_results_title_text: În acest moment nu există stări pentru pachetele de lucru. - no_results_content_text: Adăugare stare nouă + no_results_content_text: Adaugă stare nouă headers: is_default: "Implicit" is_closed: "Închis" @@ -579,7 +579,7 @@ ro: settings: "Setări" form_configuration: "Configurare formular" more_info_text_html: > - Ediția Enterprise vă permite să personalizați configurația formularului cu aceste suplimente suplimentare:
+ Ediția Enterprise îți permite să personalizezi configurația formularului cu aceste suplimente:
projects: "Proiecte" enabled_projects: "Proiecte activate" edit_query: "Editează tabelul" @@ -597,7 +597,7 @@ ro: no_results_title_text: În acest moment nu există pagini wiki. print_hint: Aceasta va afișa conținutul acestei pagini wiki fără bare de navigare. index: - no_results_content_text: Adăugare pagină wiki nouă + no_results_content_text: Adaugă pagină wiki nouă work_flows: index: no_results_title_text: În acest moment nu există fluxuri de lucru. @@ -613,7 +613,7 @@ ro: none_could_be_saved: "Niciunul dintre pachetele de lucru %{total} nu poate fi actualizat." x_out_of_y_could_be_saved: "%{failing} din %{total} pachete de lucru nu pot fi actualizate în timp ce %{success} poate fi actualizat." selected_because_descendants: "While %{selected} work packages were selected, in total %{total} work packages are affected which includes descendants." - descendant: "descendent de selectat" + descendant: "descendent al selectatului" move: no_common_statuses_exists: "Nu există o stare disponibilă pentru toate pachetele de lucru selectate. Starea acestora nu poate fi modificată." unsupported_for_multiple_projects: "Mutarea/copierea în masă nu este suportată pentru pachete de lucru din proiecte multiple" @@ -644,62 +644,62 @@ ro: no_results_title_text: În acest moment nu există versiuni disponibile. work_package_relations_tab: index: - action_bar_title: "Add relations to other work packages to create a link between them." - no_results_title_text: There are currently no relations available. - blankslate_heading: "No relations" - blankslate_description: "This work package does not have any relations yet." - label_add_x: "Add %{x}" - label_edit_x: "Edit %{x}" + action_bar_title: "Adaugă relații la alte pachete de lucru pentru a crea o legătură între ele." + no_results_title_text: Momentan nu există relaţii disponibile. + blankslate_heading: "Fără relații" + blankslate_description: "Acest pachet de lucru nu are încă o relație." + label_add_x: "Adaugă %{x}" + label_edit_x: "Editează %{x}" label_add_description: "Add description" relations: - label_relates_singular: "related to" - label_relates_plural: "related to" - label_relates_to_singular: "related to" - label_relates_to_plural: "related to" - relates_description: "Creates a visible link between the two work packages with no additional effect" - relates_to_description: "Creates a visible link between the two work packages with no additional effect" - label_precedes_singular: "successor (after)" - label_precedes_plural: "successors (after)" - precedes_description: "The related work package necessarily needs to start after this one finishes" - label_follows_singular: "predecessor (before)" - label_follows_plural: "predecessors (before)" - follows_description: "The related work package necessarily needs to finish before this one can start" - label_child_singular: "child" - label_child_plural: "children" - child_description: "Makes the related work package a sub-item of the current (parent) work package" - label_blocks_singular: "blocks" - label_blocks_plural: "blocks" - blocks_description: "The related work package cannot be closed until this one is closed first" - label_blocked_singular: "blocked by" - label_blocked_plural: "blocked by" - label_blocked_by_singular: "blocked by" - label_blocked__by_plural: "blocked by" - blocked_description: "This work package cannot be closed until the related one is closed first" - blocked_by_description: "This work package cannot be closed until the related one is closed first" - label_duplicates_singular: "duplicates" - label_duplicates_plural: "duplicates" - duplicates_description: "This is a copy of the related work package" - label_duplicated_singular: "duplicated by" - label_duplicated_plural: "duplicated by" - label_duplicated_by_singular: "duplicated by" - label_duplicated_by_plural: "duplicated by" - duplicated_by_description: "The related work package is a copy of this" - duplicated_description: "The related work package is a copy of this" - label_includes_singular: "includes" - label_includes_plural: "includes" - includes_description: "Marks the related work package as including this one with no additional effect" - label_partof_singular: "part of" - label_partof_plural: "part of" - label_part_of_singular: "part of" - label_part_of_plural: "part of" - partof_description: "Marks the related work package as being part of this one with no additional effect" - part_of_description: "Marks the related work package as being part of this one with no additional effect" + label_relates_singular: "asociat cu" + label_relates_plural: "asociat cu" + label_relates_to_singular: "asociat cu" + label_relates_to_plural: "asociat cu" + relates_description: "Creează o legătură vizibilă între cele două pachete de lucru fără niciun efect suplimentar" + relates_to_description: "Creează o legătură vizibilă între cele două pachete de lucru fără niciun efect suplimentar" + label_precedes_singular: "succesor (după)" + label_precedes_plural: "succesor (după)" + precedes_description: "Pachetul de lucru asociat trebuie neapărat să înceapă după finalizarea acestuia" + label_follows_singular: "predecesor (înainte)" + label_follows_plural: "predecesor (înainte)" + follows_description: "Pachetul de lucru asociat trebuie neapărat să înceapă după finalizarea acestuia" + label_child_singular: "copil" + label_child_plural: "copii" + child_description: "Face din pachetul de lucru asociat un subelement al pachetului de lucru actual (părinte)" + label_blocks_singular: "blochează" + label_blocks_plural: "blochează" + blocks_description: "Pachetul de lucru asociat nu poate fi închis până când acesta nu este închis mai întâi" + label_blocked_singular: "blocat de" + label_blocked_plural: "blocat de" + label_blocked_by_singular: "blocat de" + label_blocked__by_plural: "blocat de" + blocked_description: "Pachetul de lucru asociat nu poate fi închis până când acesta nu este închis mai întâi" + blocked_by_description: "Pachetul de lucru asociat nu poate fi închis până când acesta nu este închis mai întâi" + label_duplicates_singular: "dublează" + label_duplicates_plural: "dublează" + duplicates_description: "Aceasta este o copie a pachetului de lucru asociat" + label_duplicated_singular: "dublat de" + label_duplicated_plural: "dublat de" + label_duplicated_by_singular: "dublat de" + label_duplicated_by_plural: "dublat de" + duplicated_by_description: "Pachetul de lucru asociat este o copie a acestuia" + duplicated_description: "Pachetul de lucru asociat este o copie a acestuia" + label_includes_singular: "include" + label_includes_plural: "include" + includes_description: "Marchează pachetul de lucru asociat ca incluzând acesta, fără niciun efect suplimentar" + label_partof_singular: "parte din" + label_partof_plural: "parte din" + label_part_of_singular: "parte din" + label_part_of_plural: "parte din" + partof_description: "Marchează pachetul de lucru asociat ca incluzând acesta, fără niciun efect suplimentar" + part_of_description: "Marchează pachetul de lucru asociat ca făcând parte din acesta fără niciun efect suplimentar" label_requires_singular: "requires" label_requires_plural: "requires" - requires_description: "Marks the related work package as a requirement to this one" + requires_description: "Marchează pachetul de lucru asociat ca o cerință pentru acesta" label_required_singular: "required by" label_required_plural: "required by" - required_description: "Marks this work package as being a requirement to the related one" + required_description: "Marchează acest pachet de lucru ca fiind o cerință pentru cel asociat" label_parent_singular: "parent" label_parent_plural: "parent" label_invitation: Invitație @@ -719,8 +719,8 @@ ro: other: "Contul va fi şters din sistem. Prin urmare, utilizatorul nu va mai putea accesa aplicația cu credențialele curente. El poate să devină din nou utilizator al aplicației prin mijloacele permise de sistem." self: "Contul dumneavoatră va fi şters din sistem. Prin urmare, nu veți mai putea accesa aplicația cu credențialele curente. Puteți deveni din nou utilizator al aplicației prin mijloacele permise de sistem." login_verification: - other: "Introduceți numele de utilizator %{name} pentru a verifica ștergerea. Odată trimisă, vi se va cere să confirmați parola." - self: "Introduceți numele de utilizator %{name} pentru a verifica ștergerea. Odată trimisă, vi se va cere să vă confirmați parola." + other: "Introdu numele de utilizator %{name} pentru a verifica ștergerea. Odată trimisă, ți se va cere să confirmi parola." + self: "Introdu numele de utilizator %{name} pentru a verifica ștergerea. Odată trimisă, ți se va cere să confirmi parola." error_inactive_activation_by_mail: > Contul nu a fost încă activat. Pentru a activa contul dumneavoastră, dați click pe link-ul care v-a fost trimis prin e-mail. error_inactive_manual_activation: > @@ -762,15 +762,15 @@ ro: editable: "Editabil" field_format: "Format" is_filter: "Folosit ca filtru" - is_for_all: "For all projects" + is_for_all: "Pentru toate proiectele" is_required: "Obligatoriu" max_length: "Lungime maximă" min_length: "Lungime minimă" - multi_value: "Permiteți selecția multiplă" + multi_value: "Permite selecție multiplă" possible_values: "Valori posibile" regexp: "Expresie regulată" searchable: "Permite căutare" - admin_only: "Admin-only" + admin_only: "Doar administratorii" custom_value: value: "Valoare" doorkeeper/application: @@ -842,7 +842,7 @@ ro: versions: "Versiuni" work_packages: "Pachete de lucru" project_custom_field: - is_required: "Required for all projects" + is_required: "Obligatoriu în toate proiectele" custom_field_section: Secțiune query: column_names: "Coloane" @@ -1097,7 +1097,7 @@ ro: project_custom_field_project_mapping: attributes: project_ids: - blank: "Selectează un proiect." + blank: "Te rog selectează un proiect." project/life_cycle_step_definition: attributes: type: @@ -1254,7 +1254,7 @@ ro: must be 0h when Work is set and % Complete is 100%. must_be_empty_when_work_is_empty_and_percent_complete_is_100p: >- must be empty when Work is empty and % Complete is 100%. - readonly_status: "Pachetul de lucru este în stare de numai citire, astfel încât atributele sale nu pot fi modificate." + readonly_status: "Pachetul de lucru este într-o stare doar citire, astfel, atributele sale nu pot fi modificate." type: attributes: attribute_groups: @@ -1462,22 +1462,22 @@ ro: work_package: "Pachet de lucru" backup: failed: "Copia de rezervă a eșuat" - label_backup_token: "Token backup" - label_create_token: "Creează token backup" - label_delete_token: "Șterge token backup" - label_reset_token: "Resetează token backup" - label_token_users: "Următorii utilizatori au tokeni de backup activi" + label_backup_token: "Token copie de rezervă" + label_create_token: "Creează token copie de rezervă" + label_delete_token: "Șterge token copie de rezervă" + label_reset_token: "Resetează token copie de rezervă" + label_token_users: "Următorii utilizatori au tokeni pentru copie de rezervă activi" reset_token: action_create: Creează action_reset: Resetează - heading_reset: "Resetează token backup" - heading_create: "Creează token backup" + heading_reset: "Resetează token copie de rezervă" + heading_create: "Creează token copie de rezervă" implications: > - Activarea backup-urilor va permite oricărui utilizator cu permisiunile necesare și acestui token de backup să descarce o copie de rezervă care conține toate datele acestei instalări OpenProject. Acestea includ datele tuturor celorlalți utilizatori. + Activarea copiilor de rezervă va permite oricărui utilizator cu permisiunile necesare și acestui token pentru copii de rezervă să descarce o copie de rezervă care conține toate datele acestei instalări OpenProject. Acestea includ datele tuturor celorlalți utilizatori. info: > - Va trebui să generezi un token de backup pentru a putea crea o copie de rezervă. De fiecare dată când doriţi să solicitaţi o copie de rezervă va trebui să furnizaţi acest token. Puteți șterge token-ul de backup pentru a dezactiva copiile de rezervă ale acestui utilizator. + Va trebui să generezi un token pentru copia de rezervă pentru a putea crea o copie de rezervă. De fiecare dată când vrei să soliciți o copie de rezervă va trebui să furnizezi acest token. Poți șterge token-ul pentru copia de rezervă pentru a dezactiva copiile de rezervă ale acestui utilizator. verification: > - Introdu %{word} pentru a confirma că vrei să %{action} token-ul de backup. + Introdu %{word} pentru a confirma că vrei să %{action} token-ul pentru copia de rezervă. verification_word_reset: resetezi verification_word_create: creezi warning: > @@ -1489,13 +1489,13 @@ ro: backup_pending: Deja există un backup în procesare. limit_reached: Puteţi face doar %{limit} copii de rezervă pe zi. button_actions: "Acțiuni" - button_add: "Adăugare" + button_add: "Adaugă" button_add_comment: "Adăugă comentariu" button_add_item_above: "Add item above" button_add_item_below: "Add item below" button_add_sub_item: "Add sub-item" - button_add_member: Adăugare participant - button_add_watcher: "Adăugare observator" + button_add_member: Adaugă participant + button_add_watcher: "Adaugă observator" button_annotate: "Adnotare" button_apply: "Aplică" button_archive: "Arhivează" @@ -1505,7 +1505,7 @@ ro: button_change_parent_page: "Modificare pagina părinte" button_change_password: "Modificare parolă" button_check_all: "Selectează tot" - button_clear: "Inițializare" + button_clear: "Șterge" button_click_to_reveal: "Clic pentru a dezvălui" button_close: "Închide" button_collapse_all: "Restrângere totală" @@ -1537,7 +1537,7 @@ ro: button_print: "Tipărește" button_quote: "Citare" button_remove: Eliminare - button_rename: "Redenumire" + button_rename: "Redenumește" button_replace: "Înlocuiește" button_revoke: "Revocă" button_reply: "Răspuns" @@ -1562,7 +1562,7 @@ ro: button_view: "Vizualizare" button_watch: "Monitorizare" button_manage_menu_entry: "Configurare meniu" - button_add_menu_entry: "Adăugare meniu" + button_add_menu_entry: "Adaugă meniu" button_configure_menu_entry: "Configurare meniu" button_delete_menu_entry: "Șterge element meniu" button_view_shared_work_packages: "Vezi pachetele de lucru partajate" @@ -1772,8 +1772,8 @@ ro: upsale: form_configuration: description: "Personalizați configurația formularului cu aceste add-on-uri suplimentare:" - add_groups: "Adăugarea de noi grupuri de atribute" - rename_groups: "Redenumirea grupurilor de atribute" + add_groups: "Adaugă noi grupuri de atribut" + rename_groups: "Redenumește atribute grupuri" project_filters: description_html: "Filtrarea și sortarea pe câmpuri personalizate este un supliment al ediției Enterprise." enumeration_activities: "Activități de urmărire timp activate" @@ -2048,11 +2048,11 @@ ro: menus: admin: mail_notification: "Notificări prin e-mail" - mails_and_notifications: "Emails and notifications" + mails_and_notifications: "E-mailuri și notificări" aggregation: "Agregare" api_and_webhooks: "API și webhook-uri" quick_add: - label: "Deschideți meniul de adăugare rapidă" + label: "Deschide meniul adăugare rapidă" breadcrumb: nested_element: "%{section_header}: %{title}" my_account: @@ -2096,7 +2096,7 @@ ro: notifications: reasons: assigned: "Executant" - dateAlert: "Alertă de dată" + dateAlert: "Alertă dată" mentioned: "Menţionat" responsible: "Responsabil" shared: "Partajat" @@ -2105,7 +2105,7 @@ ro: unread: "Necitite" unread_title: "Afișare necitite" all: "Toate" - all_title: "Afișare toate" + all_title: "Afișează toate" menu: by_project: "Necitite după proiect" by_reason: "Motiv" @@ -2125,13 +2125,13 @@ ro: label_activate_user: "Activați utilizatorul" label_active_in_new_projects: "Activ în proiecte noi" label_activity: "Activitate" - label_add_edit_translations: "Adăugare și editare traduceri" - label_add_another_file: "Adăugare alt fișier" + label_add_edit_translations: "Adaugă și editează traduceri" + label_add_another_file: "Adaugă alt fișier" label_add_columns: "Adaugă coloanele selectate" - label_add_note: "Adăugare notă" + label_add_note: "Adaugă notă" label_add_projects: "Adaugă proiecte" - label_add_related_work_packages: "Adăugare pachet de lucru asociat" - label_add_subtask: "Adăugare sub-activitate" + label_add_related_work_packages: "Adaugă pachet de lucru asociat" + label_add_subtask: "Adaugă sub-sarcină" label_added: "adăugat" label_added_by: "Adăugat de %{author}" label_added_time_by: "Adăugat de %{author} acum %{age}" @@ -2160,7 +2160,7 @@ ro: label_ical_access_key_revoke: "Revocă" label_add_column: "Adaugă coloană" label_applied_status: "Stare aplicată" - label_archive_project: "Proiect de arhivă" + label_archive_project: "Arhivează proiect" label_ascending: "Crescător" label_assigned_to_me_work_packages: "Pachete de lucru atribuite mie" label_associated_revisions: "Revizii asociate" @@ -2229,7 +2229,7 @@ ro: label_collapse: "Restrângere" label_collapsed_click_to_show: "S-a restrâns. Clic pentru a afișa" label_configuration: configurație - label_comment_add: "Adăugare comentariu" + label_comment_add: "Adaugă un comentariu" label_comment_added: "Comentariu adăugat" label_comment_delete: "Ştergere comentarii" label_comment_plural: "Comentarii" @@ -2330,7 +2330,7 @@ ro: label_feeds_access_key_type: "RSS" label_file_plural: "Fișiere" label_filter: "Filtre" - label_filter_add: "Adăugare filtru" + label_filter_add: "Adaugă filtru" label_filter_by: "Filtrează după" label_filter_plural: "Filtre" label_filters_toggle: "Arată/ascunde filtre" @@ -2433,7 +2433,7 @@ ro: label_membership_plural: "Memberships" label_membership_added: "Membru adăugat" label_membership_updated: "Membru actualizat" - label_menu: "Menu" + label_menu: "Meniu" label_menu_badge: pre_alpha: "pre-alpha" alpha: "alfa" @@ -2472,7 +2472,7 @@ ro: label_news_added: "Noutăți adăugate" label_news_comment_added: "Comentariu adăugat la noutăți" label_news_latest: "Ultimele noutăți" - label_news_new: "Adăugare noutăți" + label_news_new: "Adaugă noutăți" label_news_edit: "Editare noutăți" label_news_plural: "Noutăți" label_news_view_all: "Afișează toate știrile" @@ -2533,7 +2533,7 @@ ro: label_previous: "Înapoi" label_previous_week: "Săptămâna trecută" label_principal_invite_via_email: " sau invită utilizatori folosind email" - label_principal_search: "Adăugare utilizatori sau grupuri existenți" + label_principal_search: "Adaugă utilizatori sau grupuri existente" label_privacy_policy: "Politica privind confidențialitatea și securitatea datelor" label_product_version: "Versiune produs" label_profile: "Profil" @@ -2542,18 +2542,18 @@ ro: label_project: "Proiect" label_project_activity: "Activitate proiect" label_project_attribute_plural: "Atributele proiectului" - label_project_attribute_manage_link: "Manage project attributes" + label_project_attribute_manage_link: "Gestionează atribute proiect" label_project_count: "Număr total de proiecte" label_project_copy_notifications: "Trimitere notificări e-mail în timpul copierii proiectului" label_project_latest: "Ultimele proiecte" label_project_default_type: "Tip gol permis" label_project_hierarchy: "Ierarhie de proiecte" - label_project_mappings: "Projects" + label_project_mappings: "Proiecte" label_project_new: "Proiect nou" label_project_plural: "Proiecte" label_project_list_plural: "Listă proiecte" - label_project_attributes_plural: "Atributele proiectului" - label_project_custom_field_plural: "Atributele proiectului" + label_project_attributes_plural: "Atribute proiect" + label_project_custom_field_plural: "Atribute proiect" label_project_settings: "Setările proiectului" label_project_attributes_settings: "Project attributes settings" label_project_storage_plural: "File Storages" @@ -2623,7 +2623,7 @@ ro: label_columns: "Coloane" label_sort: "Sortare" label_sort_ascending: "Ordonează ascendent" - label_sort_by: "Sortare după %{value}" + label_sort_by: "Sortează după %{value}" label_sorted_by: "sortate după %{value}" label_sort_descending: "Ordonează descendent" label_sort_higher: "Mută în sus" @@ -2806,7 +2806,7 @@ ro: see_in_center: "Vezi comentariul în centrul de notificări" settings: "Modificare setări e-mail" salutation: "Salut %{user}" - salutation_full_name: "Full name" + salutation_full_name: "Numele complet" work_packages: created_at: "Creat la %{timestamp} de %{user} " login_to_see_all: "Autentifică-te pentru a vedea toate notificările." @@ -2900,8 +2900,8 @@ ro: mail_body_wiki_page_added: "Pagina de wiki '%{id}' a fost adăugată de %{author}." mail_body_wiki_page_updated: "Pagina wiki '%{id}' a fost actualizată de %{author}." mail_subject_account_activation_request: "cererea de activare a contului %{value}" - mail_subject_backup_ready: "Backup-ul tău este gata" - mail_subject_backup_token_reset: "Resetarea token-ului de backup" + mail_subject_backup_ready: "Copia ta de rezervă este gata" + mail_subject_backup_token_reset: "Resetează token-ul pentru copia de rezervă" mail_subject_incoming_email_error: "Un e-mail pe care l-ai trimis la OpenProject nu a putut fi procesat" mail_subject_lost_password: "Parola dumneavoastră pentru %{value}" mail_subject_register: "Activarea contului dumneavoastră %{value}" @@ -3034,28 +3034,28 @@ ro: text_getting_started_description: "Obțineți o imagine de ansamblu rapidă a gestionării proiectelor și a colaborării în echipă cu OpenProject. Puteți reporni acest videoclip din meniul de ajutor." welcome: "Bun venit la %{app_title}" select_language: "Te rog selectează limba" - permission_add_work_package_notes: "Adăugare note" - permission_add_work_packages: "Adăugare pachete de lucru" + permission_add_work_package_notes: "Adaugă note" + permission_add_work_packages: "Adaugă pachete de lucru" permission_add_messages: "Publicare mesaje" - permission_add_project: "Create projects" + permission_add_project: "Creează proiecte" permission_add_work_package_attachments: "Adaugă fișiere" permission_add_work_package_attachments_explanation: "Allows adding attachments without Edit work packages permission" - permission_archive_project: "Proiect arhivat" + permission_archive_project: "Arhivare proiect" permission_create_user: "Create users" permission_manage_user: "Editează utilizatori" permission_manage_placeholder_user: "Creați, editați și ștergeți utilizatori de tip placeholder" permission_add_subprojects: "Creează subproiecte" - permission_add_work_package_watchers: "Adăugare observatori" - permission_assign_versions: "Atribuiți versiuni" + permission_add_work_package_watchers: "Adaugă observatori" + permission_assign_versions: "Atribuie versiuni" permission_browse_repository: "Acces doar citire la repo (vizualizare și descărcare)" permission_change_wiki_parent_page: "Schimbare pagina wiki părinte" - permission_change_work_package_status: "Change work package status" + permission_change_work_package_status: "Schimbare stare pachet de lucru" permission_change_work_package_status_explanation: "Allows changing status without Edit work packages permission" permission_comment_news: "Comentare noutăți" permission_commit_access: "Acces de citire/scriere la repo (încărcare)" permission_copy_projects: "Copiază proiecte" permission_copy_work_packages: "Copierea pachetelor de lucru" - permission_create_backup: "Create backups" + permission_create_backup: "Creează copie de rezervă" permission_delete_work_package_watchers: "Eliminare observatori" permission_delete_work_packages: "Ștergere pachete de lucru" permission_delete_messages: "Ștergere mesaje" @@ -3079,8 +3079,8 @@ ro: permission_export_work_packages: "Export pachete de lucru" permission_export_wiki_pages: "Export pagini wiki" permission_list_attachments: "Listare atașamente" - permission_log_own_time: "Înregistrarea timpului propriu" - permission_log_time: "Timp de înregistrare pentru alți utilizatori" + permission_log_own_time: "Înregistrare timp propriu" + permission_log_time: "Înregistrare timp pentru alți utilizatori" permission_manage_forums: "Gestionare forumuri" permission_manage_categories: "Gestionare categorii pachete de lucru" permission_manage_dashboards: "Manage dashboards" @@ -3088,7 +3088,7 @@ ro: permission_manage_members: "Gestionare participanți" permission_manage_news: "Gestionare știri" permission_manage_project_activities: "Gestionare activități proiect" - permission_manage_public_queries: "Gestionarea opiniilor publice" + permission_manage_public_queries: "Gestionare opinii publice" permission_manage_repository: "Gestionare arhivă" permission_manage_subtasks: "Gestionați ierarhiile pachetelor de lucru" permission_manage_versions: "Gestionare versiuni" @@ -3096,13 +3096,13 @@ ro: permission_manage_wiki_menu: "Gestionare meniu wiki" permission_move_work_packages: "Mutare pachete de lucru" permission_protect_wiki_pages: "Protejare pagini wiki" - permission_rename_wiki_pages: "Redenumire pagini wiki" - permission_save_queries: "Salvați vizualizările" + permission_rename_wiki_pages: "Redenumește pagini wiki" + permission_save_queries: "Salvare vizualizări" permission_search_project: "Caută proiect" permission_select_custom_fields: "Selectează câmpuri personalizate" permission_select_project_custom_fields: "Select project attributes" permission_select_project_modules: "Selectare module proiect" - permission_share_work_packages: "Share work packages" + permission_share_work_packages: "Partajare pachete de lucru" permission_manage_types: "Selectare tipuri" permission_view_project: "Vezi proiecte" permission_view_changesets: "Vizualizare revizii repo în OpenProject" @@ -3114,13 +3114,13 @@ ro: permission_view_news: "Vezi noutăți" permission_view_members: "Vezi membrii" permission_view_reportings: "Vizualizare raportări" - permission_view_shared_work_packages: "View work package shares" + permission_view_shared_work_packages: "Vizualizare partajări pachete de lucru" permission_view_time_entries: "Vizualizare timp consumat" permission_view_timelines: "Vizualizare linii de timp" permission_view_user_email: "View users' mail addresses" permission_view_wiki_edits: "Vizualizare istoric wiki" permission_view_wiki_pages: "Vizualizare wiki" - permission_work_package_assigned: "Deveniți cesionar/responsabil" + permission_work_package_assigned: "Devino executant/responsabil" permission_work_package_assigned_explanation: "Pachetele de lucru pot fi atribuite utilizatorilor și grupurilor care dețin acest rol în proiectul respectiv" permission_view_project_activity: "Vezi activitate proiect" permission_view_project_attributes: "Vezi atribute proiect" @@ -3155,9 +3155,9 @@ ro: are_you_sure: "Sunteţi sigur că doriţi să arhivaţi proiectul '%{name}'?" archived: "Arhivat" count: - zero: "0 Projects" + zero: "0 proiecte" one: "1 Project" - other: "%{count} Projects" + other: "%{count} proiecte" project_module_activity: "Activitate" project_module_forums: "Forumuri" project_module_work_package_tracking: "Pachete de lucru" @@ -3237,7 +3237,7 @@ ro: instructions: managed_url: "Aceasta este adresa URL a repo-ului Git gestionat (local)." path: >- - Specificați calea către depozitul Git local ( de exemplu, %{example_path} ). De asemenea, puteți utiliza depozite la distanță care sunt clonate într-o copie locală utilizând o valoare care începe cu http(s):// sau file://. + Specifică calea către depozitul Git local ( de exemplu, %{example_path} ). De asemenea, poți utiliza depozite la distanță care sunt clonate într-o copie locală utilizând o valoare care începe cu http(s):// sau file://. path_encoding: "Suprascriere codificare text Git (implicit: UTF-8)" local_title: "Legare la repo Git local existent" local_url: "URL local" @@ -3307,10 +3307,10 @@ ro: Dacă pagina de documente este activată, puteți obține o vizualizare interactivă a documentației APIv3 la adresa %{link}. setting_attachment_whitelist: "Lista albă de încărcare a atașamentelor" setting_email_delivery_method: "Metoda de livrare e-mail" - setting_emails_salutation: "Address user in emails with" + setting_emails_salutation: "Adresează utilizator în e-mailuri cu" setting_sendmail_location: "Locația executabilului \"sendmail\"" setting_smtp_enable_starttls_auto: "Utilizează automat STARTTLS dacă este disponibil" - setting_smtp_ssl: "Utilizați conexiunea SSL" + setting_smtp_ssl: "Utilizează conexiunea SSL" setting_smtp_address: "Server SMTP" setting_smtp_port: "Port SMTP" setting_smtp_authentication: "Autentificare SMTP" @@ -3388,7 +3388,7 @@ ro: setting_mail_from: "Adresa de e-mail a expeditorului" setting_mail_handler_api_key: "Cheie API" setting_mail_handler_body_delimiters: "Trunchiere e-mail-uri după una dintre aceste linii" - setting_mail_handler_body_delimiter_regex: "Trunchiaţi email-uri care se potrivesc cu acest regex" + setting_mail_handler_body_delimiter_regex: "Trunchiază email-uri care se potrivesc cu acest regex" setting_mail_handler_ignore_filenames: "Atașamente de e-mail ignorate" setting_new_project_user_role_id: "Rol atribuit unui utilizator non-administrator care crează un proiect" setting_password_active_rules: "Clase de caractere active" @@ -3503,7 +3503,7 @@ ro: other: "Altele" passwords: "Parole" project_attributes: - heading: "Atributele proiectului" + heading: "Atribute proiect" label_new_attribute: "Atribut proiect" label_new_section: "Secțiune" label_edit_section: "Editează titlul" @@ -3512,10 +3512,10 @@ ro: label_project_custom_field_actions: "Project attribute actions" label_no_project_custom_fields: "No project attributes defined in this section" edit: - description: "Changes to this project attribute will be reflected in all projects where it is enabled. Required attributes cannot be disabled on a per-project basis." + description: "Modificările la acest atribut al proiectului se vor reflecta în toate proiectele în care este activată. Atributele necesare nu pot fi dezactivate pentru fiecare proiect." new: heading: "New attribute" - description: "Changes to this project attribute will be reflected in all projects where it is enabled. Required attributes cannot be disabled on a per-project basis." + description: "Modificările la acest atribut al proiectului se vor reflecta în toate proiectele în care este activată. Atributele necesare nu pot fi dezactivate pentru fiecare proiect." projects: missing_dependencies: "Project module %{module} was checked which depends on %{dependencies}. You need to check these dependencies as well." section_new_projects: "Setări pentru proiecte noi" @@ -3559,7 +3559,7 @@ ro: text_comment_wiki_page: "Comentează la pagina wiki: %{page}" text_custom_field_possible_values_info: "O linie pentru fiecare valoare" text_custom_field_hint_activate_per_project: > - Când utilizați câmpuri personalizate: Rețineți că fiecare câmp personalizat trebuie activat individual în cadrul fiecărui proiect. + Când utilizezi câmpuri personalizate: Reține că fiecare câmp personalizat trebuie activat individual în cadrul fiecărui proiect. text_custom_field_hint_activate_per_project_and_type: > Câmpurile personalizate trebuie să fie activate pentru fiecare pachet de lucru și pentru fiecare proiect. text_wp_status_read_only_html: > @@ -4000,7 +4000,7 @@ ro: enabled: "Enable this application, allowing users to perform authorization grants with it." name: "Numele aplicației dumneavoastră. Acesta va fi afișat celorlalți utilizatori în momentul autorizării." redirect_uri_html: > - URL-urile permise către care pot fi redirecționați utilizatorii autorizați. O intrare pe linie.
Dacă înregistrați o aplicație desktop, utilizați următoarea adresă URL. + URL-urile permise către care pot fi redirecționați utilizatorii autorizați. O intrare pe linie.
Dacă înregistrezi o aplicație desktop, utilizează următoarea adresă URL. confidential: "Verificați dacă aplicația va fi utilizată în cazul în care secretul clientului poate fi păstrat confidențial. Aplicațiile mobile native și aplicațiile cu o singură pagină sunt considerate neconfidențiale." scopes: "Bifați domeniile la care doriți ca aplicația să acorde acces. Dacă nu se bifează niciun domeniu de aplicare, se presupune api_v3." client_credential_user_id: "ID-ul de utilizator opțional pe care trebuie să se substituie atunci când clienții utilizează această aplicație. Lăsați gol pentru a permite doar accesul public" diff --git a/config/locales/crowdin/ru.seeders.yml b/config/locales/crowdin/ru.seeders.yml index faa5a996758a..a57c7fbefa62 100644 --- a/config/locales/crowdin/ru.seeders.yml +++ b/config/locales/crowdin/ru.seeders.yml @@ -244,7 +244,7 @@ ru: wiki: title: Спринт 1 content: | - ### Встреча по планированию спринта + ### Совещание по планированию спринта _Пожалуйста, документируйте здесь темы на встречу по планированию спринта_ @@ -288,7 +288,7 @@ ru: * Время (3 ч). * После просмотра спринта, будет модерироваться Scrum Master. - * Команда обсуждает весну: что пошло хорошо, что должно быть улучшено, чтобы быть более продуктивным для следующего спринта или даже весело. + * Команда обсуждает спринт: что пошло хорошо, что должно быть улучшено, чтобы быть более продуктивным для следующего спринта или даже весело. item_3: name: Спринт 2 categories: diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml index 6351a4761cf9..62a4c9597d26 100644 --- a/config/locales/crowdin/ru.yml +++ b/config/locales/crowdin/ru.yml @@ -1067,7 +1067,7 @@ ru: blank: "является обязательным. Пожалуйста, выберите имя." not_unique: "уже используется. Пожалуйста, выберите другое имя." meeting: - error_conflict: "Невозможно сохранить, потому что встреча была обновлена кем-то другим за это время. Пожалуйста, перезагрузите страницу." + error_conflict: "Невозможно сохранить, потому что совещание было обновлено кем-то другим за это время. Пожалуйста, перезагрузите страницу." notifications: at_least_one_channel: "Нужно указать хотя бы один канал для отправки уведомлений." attributes: @@ -3303,7 +3303,7 @@ ru: oauth_application_details_link_text: "Перейти на страницу настроек" setup_documentation_details: "Если вам нужна помощь в настройке нового хранилища файлов, пожалуйста, проверьте документацию: " setup_documentation_details_link_text: "Настройка файловых хранилищ" - show_warning_details: "Для использования этого хранилища файлов не забудьте активировать модуль и определенное хранилище в настройках проекта каждого желаемого проекта." + show_warning_details: "Для использования этого хранилища файлов не забудьте активировать модуль и конкретное хранилище в настройках проекта каждого желаемого проекта." subversion: existing_title: "Существующий репозиторий Subversion" existing_introduction: "Если у вас есть существующий репозиторий Subversion, вы можете связать его с OpenProject для доступа к нему из приложения." @@ -3408,12 +3408,12 @@ ru: setting_work_package_done_ratio: "Режим расчета прогресса" setting_work_package_done_ratio_field: "На основе трудозатрат" setting_work_package_done_ratio_field_caption_html: >- - % Завершения может быть свободно установлен на любое значение. Если Вы опционально введете значение для параметра Работа, то автоматически будет выведено значение Оставшаяся работа. + % Завершено может быть свободно установлен на любое значение. Если Вы опционально введете значение для параметра Предполагаемое время, то автоматически будет выведено значение Оставшиеся часы. setting_work_package_done_ratio_status: "На основе статуса" setting_work_package_done_ratio_status_caption_html: >- С каждым статусом связано значение % Завершения. Изменение статуса приведет к изменению % Завершения. setting_work_package_done_ratio_explanation_html: > - В режиме На основе трудозатрат для параметра % Завершения можно свободно установить любое значение. Если вы дополнительно введете значение «Работа», «Оставшаяся работа» будет получена автоматически. В режиме На основе статуса с каждым статусом связано значение % Завершения. Изменение статуса приведет к изменению % Завершения. + В режиме На основе трудозатрат для параметра % Завершено можно свободно установить любое значение. Если вы дополнительно введете значение «Предполагаемое время», «Оставшиеся часы» будут получены автоматически. В режиме На основе статуса с каждым статусом связано значение % Завершено. Изменение статуса приведет к изменению % Завершено. setting_work_package_properties: "Свойства пакета работ" setting_work_package_startdate_is_adddate: "Использовать текущую дату как дату начала для новых пакетов работ" setting_work_packages_projects_export_limit: "Ограничение экспорта пакетов работ / проектов" @@ -3432,10 +3432,10 @@ ru: setting_password_min_length: "Минимальная длина" setting_password_min_adhered_rules: "Минимальное количество необходимых классов" setting_per_page_options: "Количество объектов на страницу" - setting_percent_complete_on_status_closed: "% Завершения, когда статус закрыт" + setting_percent_complete_on_status_closed: "% Завершено, когда статус закрыт" setting_percent_complete_on_status_closed_no_change: "Без изменений" setting_percent_complete_on_status_closed_no_change_caption_html: >- - Значение % Завершения не изменится, даже если пакет работ будет закрыт. + Значение % Завершено не изменится, даже если пакет работ будет закрыт. setting_percent_complete_on_status_closed_set_100p: "Автоматически устанавливается на 100%" setting_percent_complete_on_status_closed_set_100p_caption: >- Закрытый пакет работ считается завершенным. @@ -3462,13 +3462,13 @@ ru: setting_sys_api_enabled: "Разрешить веб-сервис управления репозиторием" setting_sys_api_description: "Веб-сервис управления репозиторием обеспечивает интеграцию и авторизацию пользователя для доступа к репозиторию." setting_time_format: "Время" - setting_total_percent_complete_mode: "Расчет общего % Завершения полной иерархии" + setting_total_percent_complete_mode: "Расчёт общего % Завершено по всей иерархии" setting_total_percent_complete_mode_work_weighted_average: "Взвешенное по работе" setting_total_percent_complete_mode_work_weighted_average_caption_html: >- - Общий % Завершения будет взвешен по Работе каждого пакета работ в иерархии. Пакеты работ без Работы будут игнорироваться. + Общий % Завершено будет рассчитан как средневзвешенное значение по Предполагаемому времени каждого пакета работ в иерархии. Пакеты работ без Предполагаемого времени будут игнорироваться. setting_total_percent_complete_mode_simple_average: "Среднее арифметическое" setting_total_percent_complete_mode_simple_average_caption_html: >- - Работа игнорируется, и Общий % Завершения будет средним арифметическим значением % Завершения пакетов работ в иерархии. + Предполагаемое время игнорируется, и Общий % Завершено будет средним арифметическим от значений % Завершено пакетов работ в иерархии. setting_accessibility_mode_for_anonymous: "Разрешить режим доступа людей с ограниченными возможностями для анонимных пользователей" setting_user_format: "Формат имени пользователя" setting_user_default_timezone: "Часовой пояс пользователя по умолчанию" diff --git a/config/locales/crowdin/zh-TW.yml b/config/locales/crowdin/zh-TW.yml index 7e22bc3b7016..c5baa3e62b0c 100644 --- a/config/locales/crowdin/zh-TW.yml +++ b/config/locales/crowdin/zh-TW.yml @@ -639,15 +639,15 @@ zh-TW: label_relates_to_plural: "相關於" relates_description: "在兩個工作項目之間建立可見的連結,沒有額外影響" relates_to_description: "在兩個工作項目之間建立可見的連結,沒有額外影響" - label_precedes_singular: "繼承(後)" - label_precedes_plural: "繼承(後)" + label_precedes_singular: "後置任務(FS)" + label_precedes_plural: "後置任務(FS)" precedes_description: "相關的工作項目必須在完成後才開始執行" - label_follows_singular: "繼承(前)" - label_follows_plural: "繼承(前)" + label_follows_singular: "前置任務(SF)" + label_follows_plural: "前置任務(SF)" follows_description: "在這個工作項目開始之前,相關的工作必須先完成" label_child_singular: "子項目" label_child_plural: "子項目" - child_description: "Makes the related work package a sub-item of the current (parent) work package" + child_description: "使相關工作成為目前(父)工作項目的子項目" label_blocks_singular: "區塊" label_blocks_plural: "區塊" blocks_description: "在本工作項目結束之前,關聯工作無法結束" @@ -894,7 +894,7 @@ zh-TW: derived_remaining_hours: "剩餘時數" derived_remaining_time: "剩餘時數" done_ratio: "完成度(%)" - duration: "天數" + duration: "時長" end_insertion: "結束插入" end_deletion: "結束刪除" ignore_non_working_days: "忽略非工作日" diff --git a/config/routes.rb b/config/routes.rb index de4c3eeb1cf2..397a8e3180dd 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -598,7 +598,7 @@ end end - resources :children, only: %i[new create destroy], controller: "work_package_children" + resources :children_relations, only: %i[new create destroy], controller: "work_package_children_relations" resource :progress, only: %i[new edit update], controller: "work_packages/progress" collection do diff --git a/docs/contributions-guide/give-back-to-community/README.md b/docs/contributions-guide/give-back-to-community/README.md index 34ba45efe638..a2fd2768fc89 100644 --- a/docs/contributions-guide/give-back-to-community/README.md +++ b/docs/contributions-guide/give-back-to-community/README.md @@ -15,7 +15,7 @@ OpenProject thrives on the strength and engagement of its Community. Beyond codi > [!IMPORTANT] > By submitting your content, we assume that you grant us permission to publish it on our platforms. If you would like to review the content before it is published, please let us know explicitly, and we will be happy to accommodate your request. -Your unique experience with OpenProject can inspire others and provide valuable feedback to our team. Here are some ideas for sharing your story: +Your unique experience with OpenProject can inspire others and provide valuable feedback to our team. Here are some ideas for sharing your story, preferably in English (or German): - **Written Texts** Create a brief article (0.5–2 pages) that covers the following topics: @@ -31,7 +31,7 @@ Your unique experience with OpenProject can inspire others and provide valuable - **Blog Posts** Write a detailed blog post about your OpenProject journey. You can either: - - Submit your blog post for publication on the OpenProject website. [Contact us](https://www.openproject.org/contact/) for guidelines. + - Submit your blog post for publication on the OpenProject website. - Publish it on your own channels (website, blog, or LinkedIn) and link back to OpenProject. - **Video Contributions** @@ -40,11 +40,14 @@ Your unique experience with OpenProject can inspire others and provide valuable - **Testimonials and Quotes** Share a short testimonial or quote about your experience with OpenProject. If possible, **include a professional photo** of yourself or your team for publication. +[Contact us](https://www.openproject.org/contact/) for guidelines. + ## Support us online Help OpenProject reach more users by engaging with our content and sharing it with your network. -- **Social Media Posts** +- **Social media posts** + - Share your experience with OpenProject on your social channels, including a link to our website. - You can also re-share content from the [OpenProject blog](https://www.openproject.org/blog/) or our official social media accounts. @@ -57,7 +60,7 @@ Help OpenProject reach more users by engaging with our content and sharing it wi [Follow us on Twitter/X](https://twitter.com/openproject) [Follow us on Bluesky](https://bsky.app/profile/openproject.bsky.social) -- **Add a Backlink to Your Website** +- **Add a backlink to your website** Include a link to OpenProject’s website on your blog, portfolio, or company website to help more people discover our tool. - **Write a Review** Share your thoughts about OpenProject on one of our review platforms. [Leave a review ](https://www.openproject.org/reviews/). diff --git a/docs/installation-and-operations/installation/packaged/README.md b/docs/installation-and-operations/installation/packaged/README.md index e7257b7d0531..4666d70404fb 100644 --- a/docs/installation-and-operations/installation/packaged/README.md +++ b/docs/installation-and-operations/installation/packaged/README.md @@ -6,6 +6,11 @@ sidebar_navigation: # Install OpenProject with DEB/RPM packages +> [!IMPORTANT] +> +> We will not build packages for new Linux versions, such as Ubuntu 24.04. We will, however, keep releasing new package versions for the currently supported Linux versions until their EOL (end of life). +> + The packaged installation of OpenProject is the recommended way to install and maintain OpenProject using DEB or RPM packages. The package will: @@ -43,7 +48,8 @@ $ uname -m x86_64 ``` -> **Important note:** Please note that the packaged installation works best when running on a dedicated server or virtual machine, as we cannot ensure that the components installed and configured by the OpenProject installer will work on systems that have been already customized. If you must install OpenProject on a server where other software is running, or with an already configured Apache or NginX server, then you should have a look at the Docker-based installation instead. +> [!IMPORTANT] +> Please note that the packaged installation works best when running on a dedicated server or virtual machine, as we cannot ensure that the components installed and configured by the OpenProject installer will work on systems that have been already customized. If you must install OpenProject on a server where other software is running, or with an already configured Apache or NginX server, then you should have a look at the Docker-based installation instead. ## Ubuntu Installation @@ -207,7 +213,8 @@ sudo yum install openproject Then finish the installation by reading the [*Initial configuration*](#initial-configuration) section. -> **Note:** On this distribution full-text extraction for attachments [*is not supported*](#full-text-extraction-not-supported) by default. +> [!NOTE] +> On this distribution full-text extraction for attachments [*is not supported*](#full-text-extraction-not-supported) by default. > ### CentOS 8 / RHEL 8 @@ -233,7 +240,8 @@ sudo yum install openproject Then finish the installation by reading the [*Initial configuration*](#initial-configuration) section. -> **Note:** On this distribution full-text extraction for attachments [*is not supported*](#full-text-extraction-not-supported) by default. +> [!NOTE] +> On this distribution full-text extraction for attachments [*is not supported*](#full-text-extraction-not-supported) by default. > **Workaround for outdated PostgreSQL library package** @@ -252,7 +260,8 @@ This happens when your local postgresql-libs package is outdated. You'll have to ## SUSE Linux Enterprise Server (SLES) Installation -**Note:** On SLES, full-text extraction for attachments [*is not supported*](#full-text-extraction-not-supported) by default. +> [!NOTE] +> On SLES, full-text extraction for attachments [*is not supported*](#full-text-extraction-not-supported) by default. ### SLES 15 @@ -301,12 +310,10 @@ sudo openproject reconfigure #interactive - manual choices are stored in /etc/op sudo openproject configure #non-interactive - using values stored in /etc/openproject/installer.dat ``` -> **Notes:** -> +> [!NOTE] > * Every time you will run the OpenProject wizard, by using `sudo openproject reconfigure` your choices will be persisted in a configuration file at `/etc/openproject/installer.dat` and subsequent executions of `sudo openproject configure` will re-use these values, only showing you the wizard steps for options you have not yet been asked for. > > * In the interactive way you can skip dialogs you do not want to change simply by confirming them with `ENTER`. -> ## Step 1: Select your OpenProject edition @@ -341,7 +348,8 @@ The dialog allows you to choose from three options: Choose this option if you want OpenProject to set up and configure a local database server manually. This is the best choice if you are unfamiliar with administering databases, or do not have a separate PostgreSQL database server installed that you want to connect to. -> **Note:** If you would like to use the database that was automatically installed by OpenProject at time of installation just choose `install` again +> [!NOTE] +> If you would like to use the database that was automatically installed by OpenProject at time of installation just choose `install` again ### Use an existing PostgreSQL database @@ -373,7 +381,8 @@ The available options are: We recommend that you let OpenProject install and configure the outer web server, in which case we will install an Apache2 web server with a VirtualHost listening to the domain name you specify, optionally providing SSL/TLS termination. -> **Note:** In case you re-run `sudo openproject reconfigure` later it is mandatory to select `install` at the webserver again +> [!NOTE] +> In case you re-run `sudo openproject reconfigure` later it is mandatory to select `install` at the webserver again In case you have selected to install Apache2, multiple dialogs will request the parameters for setting it up: @@ -391,7 +400,8 @@ If you wish to install OpenProject under a server path prefix, such as `yourdoma #### SSL/TLS configuration -> **Note:** With OpenProject version 12.2 **HTTPS configuration** was set to be **default** for every installation. **Now best practice is to proceed by selecting `yes` for using HTTPS (SSL/TLS)** and generating the needed certificates, otherwise you will have to manually deactivate HTTPS on the command line. +> [!NOTE] +> With OpenProject version 12.2 **HTTPS configuration** was set to be **default** for every installation. **Now best practice is to proceed by selecting `yes` for using HTTPS (SSL/TLS)** and generating the needed certificates, otherwise you will have to manually deactivate HTTPS on the command line. OpenProject can configure Apache to support HTTPS (SSL/TLS). If you have SSL certificates and want to use SSL/TLS (recommended), select **Yes**. @@ -407,7 +417,8 @@ Enabling this mode will result in OpenProject only responding to HTTPS requests, #### External SSL/TLS termination -> **Note**: If you terminate SSL externally before the request hits the OpenProject server, you need to follow the following instructions to avoid errors in routing. If you want to use SSL on the server running OpenProject, skip this section. +> [!NOTE] +> If you terminate SSL externally before the request hits the OpenProject server, you need to follow the following instructions to avoid errors in routing. If you want to use SSL on the server running OpenProject, skip this section. If you have a separate server that is terminating SSL and only forwarding/proxying to the OpenProject server, you must select "No" in this dialog. However, there are some parameters you need to put into your outer configuration. @@ -422,7 +433,8 @@ If you have a separate server that is terminating SSL and only forwarding/proxyi Here an example for external SSL/TLS termination with apache (httpd): -> **Note:** There is [another example](../docker/#1-virtual-host-root) for external SSL/TLS termination for **docker-compose** installations +> [!NOTE] +> There is [another example](../docker/#1-virtual-host-root) for external SSL/TLS termination for **docker-compose** installations ```shell @@ -456,7 +468,8 @@ Here an example for external SSL/TLS termination with apache (httpd): ### Skip Apache2 web server install (not recommended) -> **Note:** Skipping step 3 Apache2 web server install will ask later in step 7 for information about the hostname and HTTPS +> [!NOTE] +> Skipping step 3 Apache2 web server install will ask later in step 7 for information about the hostname and HTTPS The installer will not set up an external web server for accessing. You will need to either install and set up a web server such as Apache2 or Nginx to function as the web server forwarding to our internal server listening at `localhost:6000` by proxying. @@ -468,7 +481,8 @@ When installing with an existing Apache2, you can take a look at the source of o [For a minimal nginx config, please see this gist](https://gist.github.com/seLain/375d16ccd4542e3727e97a7478187d3a) as as starting point. -> **Please note:** If you reconfigure the OpenProject application and switch to `skip`, you might run into errors with the Apache configuration file, as that will not be automatically remove. Please double-check you removed references to the `openproject.conf` if you do reconfigure. +> [!IMPORTANT] +> If you reconfigure the OpenProject application and switch to `skip`, you might run into errors with the Apache configuration file, as that will not be automatically remove. Please double-check you removed references to the `openproject.conf` if you do reconfigure. ## Step 4: SVN/Git integration server @@ -492,7 +506,8 @@ OpenProject heavily relies on caching, which is why the wizard suggests you to i ## Step 7: Host name and Protocol (if step 3 was skipped) -> **Note:** This step is only shown if you decided to skip step 3, the Apache2 installation. OpenProject still needs to know what external host name you're running on, as well as if you're using HTTPS or not. +> [!NOTE] +> This step is only shown if you decided to skip step 3, the Apache2 installation. OpenProject still needs to know what external host name you're running on, as well as if you're using HTTPS or not. First, enter the fully qualified domain where your OpenProject installation will be reached at. This will be used to generate full links from OpenProject, such as in emails. @@ -504,7 +519,8 @@ Next, tell OpenProject whether you have SSL termination enabled somewhere in you ## Step 8: Default language -> **Note:** This step is only shown on the very first installation of OpenProject, as it affects only the initial seeding of the basic and demo data. Changing this value after installation will have no effect. +> [!NOTE] +> This step is only shown on the very first installation of OpenProject, as it affects only the initial seeding of the basic and demo data. Changing this value after installation will have no effect. OpenProject can be used with a wide variety of languages. The initial data of the instance (basic data such as status names, types, etc.) as well as data for demonstrational purposes will be created in the language you select in this screen. Move through the list using the arrow keys and select the default language. diff --git a/docs/release-notes/15-1-0/README.md b/docs/release-notes/15-1-0/README.md index 3191dcc2e6df..b09238ecef6f 100644 --- a/docs/release-notes/15-1-0/README.md +++ b/docs/release-notes/15-1-0/README.md @@ -36,6 +36,11 @@ Additionally, you can now add a description to add further information about the ![Screenshot showing the new Relations tab in a work package](openproject-15-1-relations.png) +> [!TIP] +> As a workaround you can [include a table of related work packages to work package forms (Enterprise add-on)](../../system-admin-guide/manage-work-packages/work-package-types/#add-table-of-related-work-packages-to-a-work-package-form-enterprise-add-on). Under this table you can directly create new children work packages or link existing ones. + +![A table of related work packages in OpenProject](open_project_admin_related_wp_table.png) + [Read all about work package relations and hierarchies in our user guide](../../user-guide/work-packages/work-package-relations-hierarchies/). ### Redesign of the Meetings index page diff --git a/docs/release-notes/15-1-0/open_project_admin_related_wp_table.png b/docs/release-notes/15-1-0/open_project_admin_related_wp_table.png new file mode 100644 index 000000000000..ec45fbf9539f Binary files /dev/null and b/docs/release-notes/15-1-0/open_project_admin_related_wp_table.png differ diff --git a/docs/release-notes/15-1-1/README.md b/docs/release-notes/15-1-1/README.md new file mode 100644 index 000000000000..53bb0b2a961c --- /dev/null +++ b/docs/release-notes/15-1-1/README.md @@ -0,0 +1,32 @@ +--- +title: OpenProject 15.1.1 +sidebar_navigation: + title: 15.1.1 +release_version: 15.1.1 +release_date: 2025-01-13 +--- + +# OpenProject 15.1.1 + +Release date: 2025-01-13 + +We released OpenProject [OpenProject 15.1.1](https://community.openproject.org/versions/2162). +The release contains several bug fixes and we recommend updating to the newest version. +In these Release Notes, we will give an overview of important feature changes. +At the end, you will find a complete list of all changes and bug fixes. + + + +## Bug fixes and changes + + + + +- Bugfix: Hierarchy custom fields: Can circumvent enterprise restrictions \[[#59985](https://community.openproject.org/wp/59985)\] +- Bugfix: Cannot delete users who have favourite projects \[[#60171](https://community.openproject.org/wp/60171)\] +- Bugfix: Deletion of users who have created authorization providers (SAML, OIDC) silently fails \[[#60172](https://community.openproject.org/wp/60172)\] +- Bugfix: Relations tab should not show relations to work packages a user has no read access to \[[#60479](https://community.openproject.org/wp/60479)\] +- Bugfix: Child relation for milestones must be prevented in relations tab \[[#60512](https://community.openproject.org/wp/60512)\] + + + diff --git a/docs/release-notes/README.md b/docs/release-notes/README.md index c486e0a64f66..cdca676d40d3 100644 --- a/docs/release-notes/README.md +++ b/docs/release-notes/README.md @@ -13,6 +13,13 @@ Stay up to date and get an overview of the new features included in the releases +## 15.1.1 + +Release date: 2025-01-13 + +[Release Notes](15-1-1/) + + ## 15.1.0 Release date: 2024-12-11 diff --git a/docs/security-and-privacy/statement-on-security/README.md b/docs/security-and-privacy/statement-on-security/README.md index 1ec599e5d2ad..3265d43ef7ff 100644 --- a/docs/security-and-privacy/statement-on-security/README.md +++ b/docs/security-and-privacy/statement-on-security/README.md @@ -14,6 +14,13 @@ Automated tests and manual code reviews ensure that these contributions are safe 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/). +**security.txt** + +OpenProject uses the `security.txt` standard for defining security policies. +You can find our `security.txt` here: https://www.openproject.org/security.txt + +Please see https://securitytxt.org/ for more information. + ## 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. diff --git a/docs/user-guide/projects/README.md b/docs/user-guide/projects/README.md index e29cddeaeeb8..234e0a0cccd1 100644 --- a/docs/user-guide/projects/README.md +++ b/docs/user-guide/projects/README.md @@ -73,7 +73,9 @@ OpenProject, for example, uses the projects to structure the different modules/p ![project hierarchy select project](image-20220728200830893.png) -**Note**: You have to be a [member](../members/#add-members) of a project in order to see the project and to work in a project. +>[!NOTE] +>You have to be a [member](../members/#add-members) of a project in order to see the project and to work in a project. + ## Project Settings @@ -85,7 +87,8 @@ You can specify further advanced settings for your project. Navigate to your pro - You see the default project **Identifier**. The identifier will be shown in the URL. -**Note**: Changing the project identifier while the project is already being worked on can have major effects and is therefore not recommended. For example, repositories may not be loaded correctly and deep links may no longer work (since the project URL changes when the project identifier is changed). +> [!NOTE] +> Changing the project identifier while the project is already being worked on can have major effects and is therefore not recommended. For example, repositories may not be loaded correctly and deep links may no longer work (since the project URL changes when the project identifier is changed). - You can set a project to **Public**. This means it can be accessed without signing in to OpenProject. - Click the green **Save** button to save your changes. @@ -123,7 +126,8 @@ You can copy existing [boards](../agile-boards) (apart from the Subproject board ![project settings information copy project copy options](project-settigns-copy-project.png) -> **!!Attention!!** - **Budgets** cannot be copied, so they must be removed from the work package table beforehand. Alternatively, you can delete them in the Budget module and thus delete them from the work packages as well. +> [!IMPORTANT] +> **Budgets** cannot be copied, so they must be removed from the work package table beforehand. Alternatively, you can delete them in the Budget module and thus delete them from the work packages as well. For further configuration open the **Advanced settings**. Here you can specify (among other things) the project's URL (identifier), its visibility and status. Furthermore you can set values for custom fields. @@ -133,7 +137,8 @@ Under the **Copy options** section you can select what additional project data a ![Copy options when copying a project in OpenProject](project-settings-copy-project-copy-options.png) -**Note**: the File storages options only apply if the template project had [OneDrive/SharePoint](../../system-admin-guide/integrations/one-drive) with automatically managed folders activated. +> [!NOTE] +> The File storages options only apply if the template project had [OneDrive/SharePoint](../../system-admin-guide/integrations/one-drive) with automatically managed folders activated. If you select the **File Storages: Project folders** option, both the storage and the storage folders are copied into the new project if automatically managed project folders were selected for the original file storage. For storages with manually managed project folders setup the copied storage will be referencing the same folder as the original project. @@ -147,7 +152,8 @@ Once you are done, click the green **Save** button. In order to archive a project, navigate to the [project settings](project-settings), and click the **Archive project** button. -> **Note**: This option is always available to instance and project administrators. It can also be activated for specific roles by enabling the _Archive project_ permission for that role via the [Roles and permissions](../../system-admin-guide/users-permissions/roles-permissions/) page in the administrator settings. +> [!NOTE] +> This option is always available to instance and project administrators. It can also be activated for specific roles by enabling the _Archive project_ permission for that role via the [Roles and permissions](../../system-admin-guide/users-permissions/roles-permissions/) page in the administrator settings. ![project settings archive project](project-settings-archive-project.png) @@ -165,4 +171,5 @@ If you want to delete a project, navigate to the [Project settings](project-sett You can also delete a project via the [projects overview list](./project-lists/). -**Note**: Deleting projects is only available for System administrators. +> [!NOTE] +> Deleting projects is only available for System administrators. \ No newline at end of file diff --git a/docs/user-guide/projects/project-lists/README.md b/docs/user-guide/projects/project-lists/README.md index b3a1073c4550..94a27b1d429c 100644 --- a/docs/user-guide/projects/project-lists/README.md +++ b/docs/user-guide/projects/project-lists/README.md @@ -29,6 +29,11 @@ There are several ways to get an overview of all your projects. You can press th ![project lists button](Project-list-button.png) +> [!TIP] +>If you have already selected a project, the **x** icon next to that project will navigate you away from that selected project. + +![Close an already selected project](openproject_user_guide_project_project_list.png) + Alternatively, you can use the [**Global modules menu**](../../home/global-modules/#projects) and select *Projects*. You can access that menu either on the left side of the OpenProject application homepage or by using the grid menu icon in the top right corner. ![Select all projects from the global modules menu in OpenProject](view_all_projects_options.png) @@ -97,7 +102,8 @@ Click **Apply** to see the changes. If the list that you were adjusting is a private list, you will then be able to save the changes to that list by clicking the *Save* link. Alternatively you can click the *More* icon and select the *Save as* option from the dropdown menu that will open and save it under a different name. -**Note:** The *Save as* option in the *More* dropdown menu is always available. The *Save* action will not be visible if you are working with a static list, which can not be modified. +> [!NOTE] +> The *Save as* option in the *More* dropdown menu is always available. The *Save* action will not be visible if you are working with a static list, which can not be modified. ![Save a project list view in OpenProject](save-link-project-list.png) @@ -190,9 +196,6 @@ In order to work on project lists uninterrupted, you can use the Zen mode. To ac ![Select zen mode in OpenProject project lists](openproject_project_list_select_zen_mode.png) - - - ## Favorite project lists You can mark project lists as favorites, both shared and private, but not the static ones. To mark a project list as favorite click the star icon in the top right corner. diff --git a/docs/user-guide/projects/project-lists/openproject_user_guide_project_project_list.png b/docs/user-guide/projects/project-lists/openproject_user_guide_project_project_list.png new file mode 100644 index 000000000000..aa2ebc16df50 Binary files /dev/null and b/docs/user-guide/projects/project-lists/openproject_user_guide_project_project_list.png differ diff --git a/docs/user-guide/work-packages/work-package-relations-hierarchies/README.md b/docs/user-guide/work-packages/work-package-relations-hierarchies/README.md index 48078e350058..38df9343c8a1 100644 --- a/docs/user-guide/work-packages/work-package-relations-hierarchies/README.md +++ b/docs/user-guide/work-packages/work-package-relations-hierarchies/README.md @@ -91,12 +91,20 @@ Work packages can be structured hierarchically, e.g. in order to break down a la ## Add a child work package -There are **three ways to add or create a child work package**: +There are **four ways to add or create a child work package**: + +1. [Adding a child in the *Relations* tab in a work package's details view](#add-a-child-in-the-relations-tab-in-a-work-packages-details-view) -1. Adding or creating a child in the *Relations* tab in a work package's details view 2. Right-clicking on a work package in the work package table and select "Create new child" + 3. Right-clicking on a work package in the work package table and select "Indent hierarchy" to add it as the child of the work package above it. + ![Add a child in a work package table](openproject_user_guide_wp_table_add_child.png) + +4. You can add a child work package directly under the table of related work packages. To do that you first need to [include a table of related work packages to work package forms (Enterprise add-on)](../../../system-admin-guide/manage-work-packages/work-package-types/#add-table-of-related-work-packages-to-a-work-package-form-enterprise-add-on). + + ![A table of related work packages in OpenProject](open_project_admin_related_wp_table.png) + ### Add a child in the *Relations* tab in a work package's details view Open a work package and select the tab *Relations*. Click on *+ Relation* button, scroll down the list of options and select *Child*. diff --git a/docs/user-guide/work-packages/work-package-relations-hierarchies/open_project_admin_related_wp_table.png b/docs/user-guide/work-packages/work-package-relations-hierarchies/open_project_admin_related_wp_table.png new file mode 100644 index 000000000000..ec45fbf9539f Binary files /dev/null and b/docs/user-guide/work-packages/work-package-relations-hierarchies/open_project_admin_related_wp_table.png differ diff --git a/docs/user-guide/work-packages/work-package-relations-hierarchies/openproject_user_guide_wp_table_add_child.png b/docs/user-guide/work-packages/work-package-relations-hierarchies/openproject_user_guide_wp_table_add_child.png new file mode 100644 index 000000000000..da3aad1acb67 Binary files /dev/null and b/docs/user-guide/work-packages/work-package-relations-hierarchies/openproject_user_guide_wp_table_add_child.png differ diff --git a/lib/open_project/version.rb b/lib/open_project/version.rb index 685b7d7d5ee2..e5e6f7a942f5 100644 --- a/lib/open_project/version.rb +++ b/lib/open_project/version.rb @@ -33,7 +33,7 @@ module OpenProject module VERSION # :nodoc: MAJOR = 15 MINOR = 1 - PATCH = 0 + PATCH = 1 class << self # Used by semver to define the special version (if any). diff --git a/modules/auth_saml/config/locales/crowdin/ms.yml b/modules/auth_saml/config/locales/crowdin/ms.yml index 52114feed568..9ea882adba52 100644 --- a/modules/auth_saml/config/locales/crowdin/ms.yml +++ b/modules/auth_saml/config/locales/crowdin/ms.yml @@ -2,10 +2,10 @@ ms: activemodel: attributes: saml/provider: - display_name: Name - identifier: Identifier - secret: Secret - scope: Scope + display_name: Nama + identifier: Pengenalan + secret: Sulit + scope: Skop assertion_consumer_service_url: ACS (Assertion consumer service) URL limit_self_registration: Limit self registration sp_entity_id: Service entity ID diff --git a/modules/auth_saml/config/locales/crowdin/nl.yml b/modules/auth_saml/config/locales/crowdin/nl.yml index e6e0e20fb579..e2f0740ad930 100644 --- a/modules/auth_saml/config/locales/crowdin/nl.yml +++ b/modules/auth_saml/config/locales/crowdin/nl.yml @@ -2,42 +2,42 @@ nl: activemodel: attributes: saml/provider: - display_name: Name - identifier: Identifier - secret: Secret + display_name: Naam + identifier: Identificeerder + secret: Geheim scope: Scope assertion_consumer_service_url: ACS (Assertion consumer service) URL - limit_self_registration: Limit self registration - sp_entity_id: Service entity ID - metadata_url: Identity provider metadata URL - name_identifier_format: Name identifier format - idp_sso_service_url: Identity provider login endpoint - idp_slo_service_url: Identity provider logout endpoint - idp_cert: Public certificate of identity provider - authn_requests_signed: Sign SAML AuthnRequests - want_assertions_signed: Require signed responses - want_assertions_encrypted: Require encrypted responses - certificate: Certificate used by OpenProject for SAML requests - private_key: Corresponding private key for OpenProject SAML requests - signature_method: Signature algorithm - digest_method: Digest algorithm - format: "Format" - icon: "Custom icon" + limit_self_registration: Zelfregistratie beperken + sp_entity_id: Service-entiteit ID + metadata_url: URL metagegevens identiteitsprovider + name_identifier_format: Formaat naamidentificatie + idp_sso_service_url: Identiteit provider login eindpunt + idp_slo_service_url: Identiteit provider loguit eindpunt + idp_cert: Publiek certificaat van identiteitsprovider + authn_requests_signed: SAML AuthnRequests ondertekenen + want_assertions_signed: Vereist ondertekende reacties + want_assertions_encrypted: Vereist versleutelde reacties + certificate: Certificaat gebruikt door OpenProject voor SAML verzoeken + private_key: Overeenkomstige privésleutel voor OpenProject SAML verzoeken + signature_method: Handtekening algoritme + digest_method: Digest algoritme + format: "Formaat" + icon: "Aangepast icoon" activerecord: errors: models: saml/provider: - invalid_certificate: "is not a valid PEM-formatted certificate: %{additional_message}" - invalid_private_key: "is not a valid PEM-formatted private key: %{additional_message}" - certificate_expired: "is expired and can no longer be used." - unmatched_private_key: "does not belong to the given certificate" + invalid_certificate: "is geen geldig PEM-geformatteerd certificaat: %{additional_message}" + invalid_private_key: "is geen geldig PEM-geformatteerd privésleutel: %{additional_message}" + certificate_expired: "is verlopen en kan niet langer gebruikt worden." + unmatched_private_key: "behoort niet tot het gegeven certificaat" saml: - menu_title: SAML providers - delete_title: Delete SAML provider + menu_title: SAML-leveranciers + delete_title: SAML provider verwijderen info: - title: "SAML Protocol Configuration Parameters" + title: "SAML-protocol configuratieparameters" description: > - Use these parameters to configure your identity provider connection to OpenProject. + Gebruik deze parameters om uw identity provider verbinding met OpenProject te configureren. metadata_parser: success: "Successfully updated the configuration using the identity provider metadata." invalid_url: "Provided metadata URL is invalid. Provide a HTTP(s) URL." diff --git a/modules/auth_saml/spec/services/principals/replace_references_service_call_integration_spec.rb b/modules/auth_saml/spec/services/principals/replace_references_service_call_integration_spec.rb new file mode 100644 index 000000000000..6eae46e8fc7e --- /dev/null +++ b/modules/auth_saml/spec/services/principals/replace_references_service_call_integration_spec.rb @@ -0,0 +1,59 @@ +# 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_module_spec_helper +require Rails.root.join("spec/services/principals/replace_references_context") + +RSpec.describe Principals::ReplaceReferencesService, "#call", type: :model do + subject(:service_call) { instance.call(from: principal, to: to_principal) } + + shared_let(:other_user) { create(:user, firstname: "other user") } + shared_let(:principal) { create(:user, firstname: "old principal") } + shared_let(:to_principal) { create(:user, firstname: "new principal") } + + let(:instance) do + described_class.new + end + + context "with Saml::Provider" do + it_behaves_like "rewritten record", + :saml_provider, + :creator_id do + let(:attributes) do + { + type: "'Saml::Provider'", + slug: "'saml-foo'", + display_name: "'foo'" + } + end + end + end +end diff --git a/modules/avatars/config/locales/crowdin/js-mn.yml b/modules/avatars/config/locales/crowdin/js-mn.yml index 14b58722c330..9e4da021677b 100644 --- a/modules/avatars/config/locales/crowdin/js-mn.yml +++ b/modules/avatars/config/locales/crowdin/js-mn.yml @@ -1,15 +1,15 @@ #English strings go here mn: js: - label_preview: 'Preview' - button_update: 'Update' + label_preview: 'Урьдчилан харах' + button_update: 'Шинэчлэх' avatars: - label_choose_avatar: "Choose Avatar from file" - uploading_avatar: "Uploading your avatar." + label_choose_avatar: "Файлаас Аватарыг сонгоно уу" + uploading_avatar: "Таны аватарыг байршуулж байна." text_upload_instructions: | - Upload your own custom avatar of 128 by 128 pixels. Larger files will be resized and cropped to match. - A preview of your avatar will be shown before uploading, once you selected an image. - error_image_too_large: "Image is too large." - wrong_file_format: "Allowed formats are jpg, png, gif" - empty_file_error: "Please upload a valid image (jpg, png, gif)" + 128 х 128 пикселийн хэмжээтэй өөрийн хувийн аватарыг байршуулна уу. Том файлуудын хэмжээг өөрчилж, тааруулахын тулд тайрах болно. + Зургийг сонгосны дараа таны аватарыг байршуулахаас өмнө урьдчилан харуулах болно. + error_image_too_large: "Зураг хэт том байна." + wrong_file_format: "Зөвшөөрөгдсөн формат нь jpg, png, gif" + empty_file_error: "Хүчинтэй зураг (jpg, png, gif) байршуулна уу" diff --git a/modules/avatars/config/locales/crowdin/mn.yml b/modules/avatars/config/locales/crowdin/mn.yml index 5fb37d6d90e8..8073145fe56b 100644 --- a/modules/avatars/config/locales/crowdin/mn.yml +++ b/modules/avatars/config/locales/crowdin/mn.yml @@ -4,37 +4,37 @@ mn: name: "Avatars" description: >- This plugin allows OpenProject users to upload a picture to be used as an avatar or use registered images from Gravatar. - label_avatar: "Avatar" - label_avatar_plural: "Avatars" - label_current_avatar: "Current Avatar" - label_choose_avatar: "Choose Avatar from file" - message_avatar_uploaded: "Avatar changed successfully." - error_image_upload: "Error saving the image." - error_image_size: "The image is too large." - are_you_sure_delete_avatar: "Are you sure you want to delete your avatar?" - avatar_deleted: "Avatar deleted successfully." - unable_to_delete_avatar: "Avatar could not be deleted." - wrong_file_format: "Allowed formats are jpg, png, gif" - empty_file_error: "Please upload a valid image (jpg, png, gif)" + label_avatar: "Аватар" + label_avatar_plural: "Аватар" + label_current_avatar: "Одоогийн Аватар" + label_choose_avatar: "Аватарыг файлаас сонгох" + message_avatar_uploaded: "Аватар амжилттай өөрчлөгдлөө." + error_image_upload: "Зураг хадгалахад алдаа гарлаа." + error_image_size: "Зураг хэтэрхий том байна." + are_you_sure_delete_avatar: "Та аватараа устгахдаа итгэлтэй байна уу?" + avatar_deleted: "Аватар амжилттай устгалаа." + unable_to_delete_avatar: "Аватарыг устгаж чадсангүй." + wrong_file_format: "Зөвшөөрөгдсөн формат нь jpg, png, gif" + empty_file_error: "Хүчинтэй зураг (jpg, png, gif) байршуулна уу" avatars: - label_avatar: "Avatar" - label_gravatar: 'Gravatar' - label_current_avatar: 'Current avatar' - label_local_avatar: 'Custom avatar' + label_avatar: "Аватар" + label_gravatar: 'Граватар' + label_current_avatar: 'Одоогийн Аватар' + label_local_avatar: 'Дурын аватар' text_current_avatar: | - The following image shows the current avatar. + Дараах зураг нь одоогийн аватарыг харуулж байна. text_upload_instructions: | - Upload your own custom avatar of 128 by 128 pixels. Larger files will be resized and cropped to match. - A preview of your avatar will be shown before uploading, once you selected an image. - text_change_gravatar_html: 'To change or add the Gravatar for your mail address, go to %{gravatar_url}.' + 128 х 128 пикселийн хэмжээтэй өөрийн хувийн аватарыг байршуулна уу. Том файлуудын хэмжээг өөрчилж, тааруулахын тулд тайрах болно. + Зургийг сонгосны дараа таны аватарыг байршуулахаас өмнө урьдчилан харуулах болно. + text_change_gravatar_html: 'Өөрийн имэйл хаягийн Gravatar-г өөрчлөх эсвэл нэмэхийн тулд %{gravatar_url} руу очно уу.' text_your_local_avatar: | - OpenProject allows you to upload your own custom avatar. + OpenProject нь танд өөрийн хувийн аватарыг байршуулах боломжийг олгодог. text_local_avatar_over_gravatar: | - If you set one, this custom avatar is used in precedence over the gravatar above. + Хэрэв та нэгийг тохируулсан бол энэ хувийн аватарыг дээрх граватараас давуулан ашиглана. text_your_current_gravatar: | - OpenProject uses your gravatar if you registered one, or a default image or icon if one exists. - The current gravatar is as follows: + OpenProject нь бүртгүүлсэн таны граватар, өгөгдмөл зураг эсвэл дүрс байгаа тохиолдол аль нэгийг автоматаар ашигладаг. + Одоогийн граватар нь дараах байдалтай байна: settings: - enable_gravatars: 'Enable user gravatars' - gravatar_default: "Default Gravatar image" - enable_local_avatars: 'Enable user custom avatars' + enable_gravatars: 'Хэрэглэгчийн граватаруудыг идэвхжүүлнэ' + gravatar_default: "Өгөгдмөл Gravatar зураг" + enable_local_avatars: 'Хэрэглэгчийн хувийн аватаруудыг идэвхжүүлнэ үү' diff --git a/modules/backlogs/config/locales/crowdin/mn.yml b/modules/backlogs/config/locales/crowdin/mn.yml index 2ac1af81dda1..85446e6b9b41 100644 --- a/modules/backlogs/config/locales/crowdin/mn.yml +++ b/modules/backlogs/config/locales/crowdin/mn.yml @@ -26,7 +26,7 @@ mn: activerecord: attributes: work_package: - position: "албан тушаал" + position: "Байрлал" story_points: "Гүйцэтгэлийн оноо" backlogs_work_package_type: "Backlog type" errors: @@ -47,16 +47,16 @@ mn: burndown_graph: "Burndown Graph" card_paper_size: "Paper size for card printing" chart_options: "Chart options" - close: "Close" + close: "Хаах" column_width: "Column width:" - date: "Day" + date: "Өдөр" definition_of_done: "Definition of Done" generating_chart: "Generating Graph..." - hours: "Hours" + hours: "Цаг" impediment: "Impediment" label_versions_default_fold_state: "Show versions folded" work_package_is_closed: "Work package is done, when" - label_is_done_status: "Status %{status_name} means done" + label_is_done_status: "Төлөв %{status_name} дууссан гэсэн үг" no_burndown_data: "No burndown data available. It is necessary to have the sprint start- and end dates set." points: "Оноо" positions_could_not_be_rebuilt: "Positions could not be rebuilt." @@ -70,11 +70,11 @@ mn: story: "Story" story_points: "Гүйцэтгэлийн оноо" story_points_ideal: "Story Points (ideal)" - task: "Task" - task_color: "Task color" + task: "Даалгавар" + task_color: "Даалгаврын өнгө" unassigned: "Unassigned" x_more: "%{count} more..." - backlogs_active: "active" + backlogs_active: "идэвхтэй" backlogs_any: "any" backlogs_inactive: "Project shows no activity" backlogs_points_burn_direction: "Points burn up/down" @@ -102,7 +102,7 @@ mn: error_outro: "Please correct the above errors before submitting again." event_sprint_description: "%{summary}: %{url}\n%{description}" event_sprint_summary: "%{project}: %{summary}" - ideal: "ideal" + ideal: "хамгийн тохиромжтой" inclusion: "is not included in the list" label_back_to_project: "Back to project page" label_backlog: "Backlog" diff --git a/modules/backlogs/config/locales/crowdin/ro.yml b/modules/backlogs/config/locales/crowdin/ro.yml index 974ccf5b79e6..8174a7404220 100644 --- a/modules/backlogs/config/locales/crowdin/ro.yml +++ b/modules/backlogs/config/locales/crowdin/ro.yml @@ -107,7 +107,7 @@ ro: label_back_to_project: "Înapoi la pagina precedentă" label_backlog: "Lista de așteptare" label_backlogs: "Restanțe" - label_backlogs_unconfigured: "Nu ați configurat încă Backlogs. Vă rugăm să mergeți la %{administration} > %{plugins}, apoi faceți clic pe link-ul %{configure} pentru acest plugin. După ce ați configurat câmpurile, reveniți la această pagină pentru a începe să utilizați instrumentul." + label_backlogs_unconfigured: "Nu ai configurat încă Backlogs. Te rog să mergi la %{administration} > %{plugins}, apoi dă clic pe link-ul %{configure} pentru acest plugin. După ce ai configurat câmpurile, revino la această pagină pentru a începe să utilizezi instrumentul." label_blocks_ids: "ID-urile pachetelor de lucru blocate" label_burndown: "Burndown" label_column_in_backlog: "Coloană în backlog" diff --git a/modules/bim/config/locales/crowdin/js-ro.yml b/modules/bim/config/locales/crowdin/js-ro.yml index f1556f90ba8a..8519ddc5dd3b 100644 --- a/modules/bim/config/locales/crowdin/js-ro.yml +++ b/modules/bim/config/locales/crowdin/js-ro.yml @@ -16,7 +16,7 @@ ro: refresh_work_package: 'Reîmprospătare pachet de lucru' ifc_models: empty_warning: "Acest proiect nu are încă niciun model IFC." - use_this_link_to_manage: "Utilizați acest link pentru a încărca și gestiona modelele IFC" + use_this_link_to_manage: "Utilizează acest link pentru a încărca și gestiona modelele IFC" keyboard_input_disabled: "Vizualizatorul nu dispune de comenzi de tastatură. Faceți clic pe vizualizator pentru a da control de tastatură vizualizatorului." models: ifc_models: 'Modele IFC' @@ -25,5 +25,5 @@ ro: split: 'Vizualizator și tabel' split_cards: 'Vizualizator și carduri' revit: - revit_add_in: "Adăugare Revit" + revit_add_in: "Supliment Revit" revit_add_in_settings: "Setări Revit Add-In" diff --git a/modules/bim/config/locales/crowdin/ro.seeders.yml b/modules/bim/config/locales/crowdin/ro.seeders.yml index 22c156ed7e44..96d54647c269 100644 --- a/modules/bim/config/locales/crowdin/ro.seeders.yml +++ b/modules/bim/config/locales/crowdin/ro.seeders.yml @@ -490,16 +490,16 @@ ro: item_1: subject: Creating the BIM execution plan description: |- - # Goal + # Obiectivul - * A BIM execution plan will be defined according to the exchange requirements specifications (ERS) - * All team members and partners have a plan on how to reach each of the project goals + * Un plan de execuție BIM va fi definit în conformitate cu specificațiile privind cerințele de schimb (ERS) + * Toți membrii echipei și partenerii au un plan privind modul de atingere a fiecăruia dintre obiectivele proiectului - # Description + # Descriere - * Depending on the identifies use cases, the individual Information Delivery Manuals will be defined - * To handle the technological interfaces, a software topology will be defined and analyzed and verified - * ... + * În funcție de cazurile de utilizare a identificării, Manualele individuale de livrare a informațiilor vor fi definite + * Pentru a gestiona interfețele tehnologice, un software topologie va fi definit și analizat și verificat + * ... item_2: subject: Completion of the BIM execution plan description: This type is hierarchically a parent of the types "Clash" and "Request", thus represents a general note. diff --git a/modules/boards/config/locales/crowdin/js-mn.yml b/modules/boards/config/locales/crowdin/js-mn.yml index 439c3d0a0d38..f9d9a67c5692 100644 --- a/modules/boards/config/locales/crowdin/js-mn.yml +++ b/modules/boards/config/locales/crowdin/js-mn.yml @@ -2,29 +2,29 @@ mn: js: boards: - create_new: 'Create new board' - label_unnamed_board: 'Unnamed board' - label_unnamed_list: 'Unnamed list' - label_board_type: 'Board type' + create_new: 'Шинэ самбар үүсгэх' + label_unnamed_board: 'Нэрлэгдээгүй самбар' + label_unnamed_list: 'Нэрлэгдээгүй жагсаалт' + label_board_type: 'Самбарын төрөл' upsale: teaser_text: 'Would you like to automate your workflows with Boards? Advanced boards are an Enterprise add-on. Please upgrade to a paid plan.' - upgrade: 'Upgrade now' + upgrade: 'Яг одоо шинэчлэх' lists: - delete: 'Delete list' + delete: 'Устгасан жагсаалт' version: is_locked: 'Version is locked. No items can be added to this version.' is_closed: 'Version is closed. No items can be added to this version.' - close_version: 'Close version' - open_version: 'Open version' - lock_version: 'Lock version' - unlock_version: 'Unlock version' - edit_version: 'Edit version' - show_version: 'Show version' - locked: 'Locked' - closed: 'Closed' - new_board: 'New board' + close_version: 'Хувилбар хаах' + open_version: 'Хувилбар нээх' + lock_version: 'Хувилбар цоожлох' + unlock_version: 'Хувилбарын цоожыг тайлах' + edit_version: 'Хувилбар засах' + show_version: 'Хувилбар харах' + locked: 'Цоожлогдсон' + closed: 'Хаагдсан' + new_board: 'Шинэ самбар' add_list: 'Add list to board' - add_card: 'Add card' + add_card: 'Картлуу нэмэх' error_attribute_not_writable: "Cannot move the work package, %{attribute} is not writable." error_loading_the_list: "Error loading the list: %{error_message}" error_permission_missing: "The permission to create public queries is missing" @@ -32,12 +32,12 @@ mn: text_hidden_list_warning: "Not all lists are displayed because you lack the permission. Contact your admin for more information." click_to_remove_list: "Click to remove this list" board_type: - text: 'Board type' - free: 'basic' + text: 'Самбарын төрөл' + free: 'ердийн' select_board_type: 'Please choose the type of board you need.' free_text: > Start from scratch with a blank board. Manually add cards and columns to this board. - action: 'Action board' + action: 'Үйлдлийн самбар' action_by_attribute: 'Action board (%{attribute})' action_text: > A board with filtered lists on %{attribute} attribute. Moving work packages to other lists will update their attribute. @@ -52,18 +52,18 @@ mn: action_text_version: > Board with automated columns based on the version attribute. Ideal for planning product development. action_type: - assignee: assignee - status: status + assignee: даалгагч + status: төлөв version: version - subproject: subproject + subproject: дэд төсөл subtasks: parent-child board_type_title: - assignee: Assignee - status: Status - version: Version + assignee: Даалгагч + status: Төлөв + version: Хувилбар subproject: Subproject subtasks: Parent-child - basic: Basic + basic: Ердийн select_attribute: "Action attribute" add_list_modal: labels: diff --git a/modules/boards/config/locales/crowdin/mn.yml b/modules/boards/config/locales/crowdin/mn.yml index c6adf037e768..6401d3514b74 100644 --- a/modules/boards/config/locales/crowdin/mn.yml +++ b/modules/boards/config/locales/crowdin/mn.yml @@ -3,24 +3,24 @@ mn: plugin_openproject_boards: name: "OpenProject Boards" description: "Provides board views." - permission_show_board_views: "View boards" - permission_manage_board_views: "Manage boards" - project_module_board_view: "Boards" + permission_show_board_views: "Самбаруудыг үзэх" + permission_manage_board_views: "Самбаруудыг удирдах" + project_module_board_view: "Самбарууд" boards: - label_board: "Board" - label_boards: "Boards" - label_create_new_board: "Create new board" - label_board_type: "Board type" + label_board: "Самбар" + label_boards: "Самбарууд" + label_create_new_board: "Шинэ самбар үүсгэх" + label_board_type: "Самбарын төрөл" board_types: - free: Basic - action: "Action board (%{attribute})" + free: Ердийн + action: "Үйлдлийн самбар (%{attribute})" board_type_attributes: - assignee: Assignee - status: Status - version: Version - subproject: Subproject + assignee: Даалгагч + status: Төлөв + version: Хувилбар + subproject: Дэд төсөл subtasks: Parent-child - basic: Basic + basic: Ердийн board_type_descriptions: basic: > Start from scratch with a blank board. Manually add cards and columns to this board. @@ -35,5 +35,5 @@ mn: subtasks: > Board with automated columns for sub-elements. Dragging work packages to other lists updates the parent accordingly. upsale: - teaser_text: 'Would you like to automate your workflows with Boards? Advanced boards are an Enterprise add-on. Please upgrade to a paid plan.' - upgrade: 'Upgrade now' + teaser_text: 'Та самбарын тусламжтайгаар ажлын урсгалаа автоматжуулахыг хүсч байна уу? Нарийвчилсан самбарууд нь Enterprise нэмэлт юм. Төлбөртэй багц болгон шинэчилнэ үү.' + upgrade: 'Одоо шинэчлэх' diff --git a/modules/budgets/config/locales/crowdin/mn.yml b/modules/budgets/config/locales/crowdin/mn.yml index 3f277f2bfdaa..e802766ffd4a 100644 --- a/modules/budgets/config/locales/crowdin/mn.yml +++ b/modules/budgets/config/locales/crowdin/mn.yml @@ -21,7 +21,7 @@ #++ mn: plugin_budgets_engine: - name: 'Budgets' + name: 'Төсөв' activerecord: attributes: budget: @@ -68,7 +68,7 @@ mn: label_example_placeholder: 'e.g., %{decimal}' label_view_all_budgets: "View all budgets" label_yes: "Yes" - notice_budget_conflict: "Work packages must be of the same project." + notice_budget_conflict: "Ажлын багц нь нэг төсөлтэй байх ёстой." notice_no_budgets_available: "No budgets available." permission_edit_budgets: "Edit budgets" permission_view_budgets: "View budgets" diff --git a/modules/budgets/config/locales/crowdin/ro.yml b/modules/budgets/config/locales/crowdin/ro.yml index 3e14db49036a..8046be1d540e 100644 --- a/modules/budgets/config/locales/crowdin/ro.yml +++ b/modules/budgets/config/locales/crowdin/ro.yml @@ -59,7 +59,7 @@ ro: budget: "Buget editat" help_click_to_edit: "Câmpul %s este gol. Click aici pentru a-l edita." help_currency_format: "Formatul valorilor valutare afișate. %n este înlocuit cu valoarea monedei, %u este înlocuit cu unitatea monetară." - help_override_rate: "Introduceți o valoare aici pentru a înlocui rata implicită." + help_override_rate: "Introdu o valoare aici pentru a înlocui rata implicită." label_budget: "Buget" label_budget_new: "Buget nou" label_budget_plural: "Bugete" diff --git a/modules/calendar/config/locales/crowdin/js-mn.yml b/modules/calendar/config/locales/crowdin/js-mn.yml index 194eaf34bdc6..005c38122ee1 100644 --- a/modules/calendar/config/locales/crowdin/js-mn.yml +++ b/modules/calendar/config/locales/crowdin/js-mn.yml @@ -2,7 +2,7 @@ mn: js: calendar: - create_new: 'Create new calendar' - title: 'Calendar' - too_many: 'There are %{count} work packages in total, but only %{max} can be shown.' - unsaved_title: 'Unnamed calendar' + create_new: 'Шинэ хуанли үүсгэх' + title: 'Хуанли' + too_many: 'Нийт %{count} ажлын багц байгаа ч зөвхөн %{max}-г харуулах боломжтой.' + unsaved_title: 'Нэрлэгдээгүй хуанли' diff --git a/modules/calendar/config/locales/crowdin/mn.yml b/modules/calendar/config/locales/crowdin/mn.yml index b8eb4cd2d168..78f6a9ad08e4 100644 --- a/modules/calendar/config/locales/crowdin/mn.yml +++ b/modules/calendar/config/locales/crowdin/mn.yml @@ -1,12 +1,12 @@ #English strings go here mn: plugin_openproject_calendar: - name: "OpenProject Calendar" - description: "Provides calendar views." + name: "OpenProject Хуанли" + description: "Хуанли харах боломжийг олгодог." label_calendar: "Calendar" - label_calendar_plural: "Calendars" - label_new_calendar: "New calendar" - permission_view_calendar: "View calendars" - permission_manage_calendars: "Manage calendars" + label_calendar_plural: "Хуанли" + label_new_calendar: "Шинэ хуанли" + permission_view_calendar: "Хуанли харах" + permission_manage_calendars: "Хуанли удирдах" permission_share_calendars: "Subscribe to iCalendars" - project_module_calendar_view: "Calendars" + project_module_calendar_view: "Хуанли" diff --git a/modules/costs/config/locales/crowdin/id.yml b/modules/costs/config/locales/crowdin/id.yml index 110d0cd70bc1..53333eaee00a 100644 --- a/modules/costs/config/locales/crowdin/id.yml +++ b/modules/costs/config/locales/crowdin/id.yml @@ -108,7 +108,7 @@ id: label_rate: "Rate" label_rate_plural: "Rate" label_status_finished: "Selesai" - label_show: "Show" + label_show: "Lihat" label_units: "Biaya unit" label_user: "User" label_until: "hingga" @@ -132,10 +132,10 @@ id: permission_view_own_hourly_rate: "Tampilkan rate per-jam diri sendiri" permission_view_own_time_entries: "Tampilan jumlah waktu diri sendiri" project_module_costs: "Waktu dan biaya" - setting_allow_tracking_start_and_end_times: "Allow users to track start and end time on time records" - setting_costs_currency: "Currency" - setting_costs_currency_format: "Format of currency" - setting_enforce_tracking_start_and_end_times: "Force users to set start and end time on time records" + setting_allow_tracking_start_and_end_times: "Membolehkan pengguna melacak waktu awal dan akhir rekaman" + setting_costs_currency: "Mata Uang" + setting_costs_currency_format: "Format mata uang" + setting_enforce_tracking_start_and_end_times: "Memaksa pengguna mengatur waktu awal dan akhir rekaman" text_assign_time_and_cost_entries_to_project: "Masukkan laporan per-jam dan laporan biaya ke proyek" text_destroy_cost_entries_question: "%{cost_entries} digunakan pada work package yang akan dihapus. Keputusan anda?" text_destroy_time_and_cost_entries: "Hapus jumlah jam dan biaya yang terlapor" diff --git a/modules/costs/config/locales/crowdin/js-ro.yml b/modules/costs/config/locales/crowdin/js-ro.yml index cdabfa8fcb6e..f055fd6a4621 100644 --- a/modules/costs/config/locales/crowdin/js-ro.yml +++ b/modules/costs/config/locales/crowdin/js-ro.yml @@ -27,6 +27,6 @@ ro: properties: overallCosts: "Costuri totale" spentUnits: "Unități consumate" - button_log_costs: "Costurile unitare ale buștenilor" + button_log_costs: "Înregistrare costuri unitare" label_hour: "oră" label_hours: "ore" diff --git a/modules/costs/config/locales/crowdin/mn.yml b/modules/costs/config/locales/crowdin/mn.yml index a775a95d3845..27987d1429c0 100644 --- a/modules/costs/config/locales/crowdin/mn.yml +++ b/modules/costs/config/locales/crowdin/mn.yml @@ -21,8 +21,8 @@ #++ mn: plugin_costs: - name: "Time and costs" - description: "This module adds features for planning and tracking costs of projects." + name: "Цаг хугацаа ба зардал" + description: "Энэхүү модуль нь төслийн зардлыг төлөвлөх, хянах боломжуудыг нэмдэг." activerecord: attributes: cost_entry: diff --git a/modules/costs/config/locales/crowdin/ro.yml b/modules/costs/config/locales/crowdin/ro.yml index 010f3a7134f8..d4f6711fe8c5 100644 --- a/modules/costs/config/locales/crowdin/ro.yml +++ b/modules/costs/config/locales/crowdin/ro.yml @@ -64,7 +64,7 @@ ro: units: "Unități" valid_from: "Valabil de la" fixed_date: "Dată fixă" - button_add_rate: "Adăugare preţ" + button_add_rate: "Adaugă preț" button_log_costs: "Costurile unitare ale buștenilor" caption_booked_on_project: "Rezervat pe proiect" caption_default: "Implicit" @@ -103,14 +103,14 @@ ro: label_work_package_filter_add: "Adaugă un filtru pentru pachetul de lucru" label_kind: "Tip" label_less_or_equal: "<=" - label_log_costs: "Costurile unitare ale buștenilor" + label_log_costs: "Înregistrare costuri unitare" label_no: "Nu" label_option_plural: "Opțiuni" label_overall_costs: "Costuri totale" label_rate: "Evaluează" label_rate_plural: "Tarife" label_status_finished: "Finalizat" - label_show: "Show" + label_show: "Arată" label_units: "Unități de cost" label_user: "Utilizator" label_until: "până la" @@ -135,8 +135,8 @@ ro: permission_view_own_time_entries: "Vizualizează propriul timp consumat" project_module_costs: "Timp și costuri" setting_allow_tracking_start_and_end_times: "Allow users to track start and end time on time records" - setting_costs_currency: "Currency" - setting_costs_currency_format: "Format of currency" + setting_costs_currency: "Monedă" + setting_costs_currency_format: "Format monedă" setting_enforce_tracking_start_and_end_times: "Force users to set start and end time on time records" text_assign_time_and_cost_entries_to_project: "Atribuiți orele și costurile raportate la proiect" text_destroy_cost_entries_question: "%{cost_entries} au fost raportate pe pachetele de lucru pe care urmează să le ștergeți. Ce doriți să faceți?" diff --git a/modules/dashboards/config/locales/crowdin/js-mn.yml b/modules/dashboards/config/locales/crowdin/js-mn.yml index fa1138ce7dd5..47e6b5a69741 100644 --- a/modules/dashboards/config/locales/crowdin/js-mn.yml +++ b/modules/dashboards/config/locales/crowdin/js-mn.yml @@ -1,4 +1,4 @@ mn: js: dashboards: - label: ' Хянах самбар' + label: 'Хянах самбар' diff --git a/modules/dashboards/config/locales/crowdin/mn.yml b/modules/dashboards/config/locales/crowdin/mn.yml index 9e2a34e7df15..c87365310203 100644 --- a/modules/dashboards/config/locales/crowdin/mn.yml +++ b/modules/dashboards/config/locales/crowdin/mn.yml @@ -1,4 +1,4 @@ mn: dashboards: - label: 'Хянах самбар' - project_module_dashboards: 'Хянах самбар' + label: 'Хянах самбарууд' + project_module_dashboards: 'Хянах самбарууд' diff --git a/modules/documents/config/locales/crowdin/mn.yml b/modules/documents/config/locales/crowdin/mn.yml index 4430633680a2..0717bdcec09f 100644 --- a/modules/documents/config/locales/crowdin/mn.yml +++ b/modules/documents/config/locales/crowdin/mn.yml @@ -21,23 +21,23 @@ #++ mn: plugin_openproject_documents: - name: "OpenProject Documents" + name: "OpenProject баримт бичиг" description: "An OpenProject plugin to allow creation of documents in projects." activerecord: models: - document: "Document" + document: "Баримт бичиг" activity: filter: - document: "Documents" - default_doc_category_tech: "Technical documentation" - default_doc_category_user: "User documentation" - enumeration_doc_categories: "Document categories" + document: "Баримт бичгүүд" + default_doc_category_tech: "Техникийн баримт бичиг" + default_doc_category_user: "Хэрэглэгчийн баримт бичиг" + enumeration_doc_categories: "Баримт бичгийн ангилал" documents: - label_attachment_author: "Attachment author" - label_document_added: "Document added" + label_attachment_author: "Хавсралтын зохиогч" + label_document_added: "Баримт бичиг нэмэгдсэн" label_document_new: "New document" - label_document_plural: "Documents" - label_documents: "Documents" - permission_manage_documents: "Manage documents" - permission_view_documents: "View documents" - project_module_documents: "Documents" + label_document_plural: "Баримт бичгүүд" + label_documents: "Баримт бичгүүд" + permission_manage_documents: "Баримт бичгүүдийг удирдах" + permission_view_documents: "Баримт бичгүүдийг харах" + project_module_documents: "Баримт бичгүүд" diff --git a/modules/gantt/config/locales/crowdin/js-mn.yml b/modules/gantt/config/locales/crowdin/js-mn.yml index 06c711fbbf89..e126cc447b3f 100644 --- a/modules/gantt/config/locales/crowdin/js-mn.yml +++ b/modules/gantt/config/locales/crowdin/js-mn.yml @@ -2,4 +2,4 @@ mn: js: work_packages: default_queries: - milestones: 'Milestones' + milestones: 'Чухал үеүүд' diff --git a/modules/gantt/config/locales/crowdin/mn.yml b/modules/gantt/config/locales/crowdin/mn.yml index 2c6eb4605bb5..15b5732d2205 100644 --- a/modules/gantt/config/locales/crowdin/mn.yml +++ b/modules/gantt/config/locales/crowdin/mn.yml @@ -1,3 +1,3 @@ #English strings go here mn: - project_module_gantt: "Gantt charts" + project_module_gantt: "Гант диаграм" diff --git a/modules/job_status/config/locales/crowdin/mn.yml b/modules/job_status/config/locales/crowdin/mn.yml index 0be309ed5798..a424e5091b3f 100644 --- a/modules/job_status/config/locales/crowdin/mn.yml +++ b/modules/job_status/config/locales/crowdin/mn.yml @@ -1,21 +1,21 @@ mn: - label_job_status_plural: "Job statuses" + label_job_status_plural: "Ажлын төлвүүд" plugin_openproject_job_status: name: "OpenProject Job status" description: "Listing and status of background jobs." job_status_dialog: - download_starts: 'The download should start automatically.' - link_to_download: 'Or, %{link} to download.' - click_here: 'click here' - title: 'Background job status' - redirect: 'You are being redirected.' - redirect_link: 'Please click here to continue.' - redirect_errors: 'Due to these errors, you will not be redirected automatically.' - errors: 'Something went wrong' + download_starts: 'Татаж авах ажиллагаа автоматаар эхлэх ёстой.' + link_to_download: 'Эсвэл, татаж авах бол %{link}.' + click_here: 'энд дарна уу' + title: 'Суурь ажлын төлөв' + redirect: 'Таныг дахин чиглүүлж байна.' + redirect_link: 'Үргэлжлүүлэхийн тулд энд дарна уу.' + redirect_errors: 'Эдгээр алдааны улмаас таныг автоматаар дахин чиглүүлэхгүй.' + errors: 'Ямар нэг алдаа гарлаа' generic_messages: - not_found: 'This job could not be found.' - in_queue: 'The job has been queued and will be processed shortly.' - in_process: 'The job is currently being processed.' - error: 'The job has failed to complete.' - cancelled: 'The job has been cancelled due to an error.' - success: 'The job completed successfully.' + not_found: 'Энэ ажил олдсонгүй.' + in_queue: 'Ажлыг дараалалд оруулсан бөгөөд удахгүй боловсруулагдах болно.' + in_process: 'Одоогоор уг ажлыг боловсруулж байна.' + error: 'Ажлыг дуусгаж чадсангүй.' + cancelled: 'Алдаа гарсны улмаас ажил цуцлагдлаа.' + success: 'Ажил амжилттай дууссан.' diff --git a/modules/ldap_groups/config/locales/crowdin/ro.yml b/modules/ldap_groups/config/locales/crowdin/ro.yml index 2df085c35361..232da2ff2938 100644 --- a/modules/ldap_groups/config/locales/crowdin/ro.yml +++ b/modules/ldap_groups/config/locales/crowdin/ro.yml @@ -40,19 +40,19 @@ ro: title: 'Elimină filtrul sincronizat %{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: "Introduceți numele filtrului %{name} pentru a verifica ștergerea." + verification: "Introdu numele filtrului %{name} pentru a verifica ștergerea." form: - group_name_attribute_text: 'Introduceți atributul grupului LDAP utilizat pentru a seta numele grupului OpenProject.' - filter_string_text: 'Introduceți filtrul LDAP RFC4515 care returnează grupurile din LDAP pentru a le sincroniza cu OpenProject.' + group_name_attribute_text: 'Introdu atributul grupului LDAP utilizat pentru a seta numele grupului OpenProject.' + filter_string_text: 'Introdu filtrul LDAP RFC4515 care returnează grupurile din LDAP pentru a le sincroniza cu OpenProject.' base_dn_text: > - Introduceți DN-ul de bază de căutare care urmează să fie utilizat pentru acest filtru. Acesta trebuie să fie sub DN de bază al conexiunii LDAP selectate. Lăsați această opțiune goală pentru a reutiliza DN-ul de bază al conexiunii + Introdu DN-ul de bază de căutare care urmează să fie utilizat pentru acest filtru. Acesta trebuie să fie sub DN de bază al conexiunii LDAP selectate. Lasă această opțiune goală pentru a reutiliza DN-ul de bază al conexiunii synchronized_groups: - add_new: 'Adăugarea de noi grupuri de atribute' + add_new: 'Adaugă grup LDAP sincronizat' destroy: title: 'Îndepărtați grupul sincronizat %{name}' confirmation: "Dacă continuați, 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: "Introduceți numele grupului %{name} pentru a verifica ștergerea." + verification: "Introdu numele grupului %{name} pentru a verifica ștergerea." 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. @@ -67,7 +67,7 @@ ro: auth_source_text: 'Selectează ce conexiune LDAP trebuie utilizată.' sync_users_text: > Dacă activați această opțiune, utilizatorii găsiți vor fi, de asemenea, creați automat în OpenProject. Fără această opțiune, doar conturile existente în OpenProject vor fi adăugate la grupuri. - dn_text: 'Introduceți DN-ul complet al grupului în LDAP' + dn_text: 'Introdu DN-ul complet al grupului în LDAP' group_text: 'Selectați un grup OpenProject existent cu care membrii grupului LDAP trebuie să fie sincronizați' upsale: description: 'Profitați de grupurile LDAP sincronizate pentru a gestiona utilizatorii, a le modifica permisiunile și a facilita gestionarea utilizatorilor între grupuri.' diff --git a/modules/meeting/config/locales/crowdin/id.yml b/modules/meeting/config/locales/crowdin/id.yml index 116b82a2cba2..f7b4cf82a681 100644 --- a/modules/meeting/config/locales/crowdin/id.yml +++ b/modules/meeting/config/locales/crowdin/id.yml @@ -88,18 +88,18 @@ id: label_meeting_plural: "Rapat" label_meeting_new: "Rapat Baru" label_meeting_new_dynamic: "New dynamic meeting" - label_meeting_create: "Create meeting" - label_meeting_copy: "Copy meeting" + label_meeting_create: "Buat rapat" + label_meeting_copy: "Salin rapat" label_meeting_edit: "Edit Rapat" label_meeting_agenda: "Agenda" label_meeting_minutes: "Laporan" label_meeting_close: "Tutup" label_meeting_open: "Buka" - label_meeting_index_delete: "Delete" - label_meeting_open_this_meeting: "Open this meeting" + label_meeting_index_delete: "Hapus" + label_meeting_open_this_meeting: "Buka rapat ini" label_meeting_agenda_close: "Tutup agenda untuk memulai Laporan" label_meeting_date_time: "Tanggal/Waktu" - label_meeting_date_and_time: "Date and time" + label_meeting_date_and_time: "Tanggal dan waktu" label_meeting_diff: "Perbedaan" label_upcoming_meetings: "Rapat mendatang" label_past_meetings: "Rapat sebelumnya" diff --git a/modules/meeting/config/locales/crowdin/ro.yml b/modules/meeting/config/locales/crowdin/ro.yml index 364f831caf7d..da438dc964ba 100644 --- a/modules/meeting/config/locales/crowdin/ro.yml +++ b/modules/meeting/config/locales/crowdin/ro.yml @@ -34,9 +34,9 @@ ro: notes: "Mențiuni" participants: "Participanţi" participant: - one: "1 Participant" - few: "%{count} Participants" - other: "%{count} Participants" + one: "1 participant" + few: "%{count} participanți" + other: "%{count} participanți" participants_attended: "Participanți" participants_invited: "Invitaţi" project: "Proiect" @@ -59,7 +59,7 @@ ro: meeting_agenda_item: "Agenda item" meeting_agenda: "Agendă" meeting_minutes: "Minute" - meeting_section: "Section" + meeting_section: "Secțiune" activity: filter: meeting: "Întâlniri" @@ -97,7 +97,7 @@ ro: label_meeting_minutes: "Minute" label_meeting_close: "Închide" label_meeting_open: "Deschis" - label_meeting_index_delete: "Delete" + label_meeting_index_delete: "Șterge" label_meeting_open_this_meeting: "Open this meeting" label_meeting_agenda_close: "Închideți ordinea de zi pentru a începe procesul-verbal" label_meeting_date_time: "Dată/Timp" @@ -183,7 +183,7 @@ ro: text_notificiation_invited: "Acest e-mail conține o intrare ics pentru întâlnirea de mai jos:" text_meeting_empty_heading: "Your meeting is empty" text_meeting_empty_description_1: "Start by adding agenda items below. Each item can be as simple as just a title, but you can also add additional details like duration and notes." - text_meeting_empty_description_2: 'You can also add references to existing work packages. When you do, related notes will automatically be visible in the work package''s "Meetings" tab.' + text_meeting_empty_description_2: 'De asemenea, poți adăuga referințe la pachetele de lucru existente. Când faci acest lucru, notele aferente vor fi vizibile automat în fila "Întâlniri" din pachetul de lucru.' label_meeting_empty_action: "Add agenda item" label_meeting_actions: "Meeting actions" label_meeting_edit_title: "Edit meeting title" diff --git a/modules/meeting/config/locales/crowdin/ru.yml b/modules/meeting/config/locales/crowdin/ru.yml index dc0358a432fa..fc62432c9be8 100644 --- a/modules/meeting/config/locales/crowdin/ru.yml +++ b/modules/meeting/config/locales/crowdin/ru.yml @@ -24,7 +24,7 @@ ru: plugin_openproject_meeting: name: "Встреча OpenProject" description: >- - Этот модуль добавляет функции для поддержки встреч проектов в OpenProject. Для участия в работе совещания могут быть запланированы приглашенные из того же проекта. Повестка дня может быть создана и отправлена приглашенным лицам. После встречи участники могут быть выбраны и минуты могут быть созданы на основе повестки дня. Наконец, минуты могут быть отправлены всем участникам и приглашенным. + Этот модуль добавляет поддержку совещаний в проектах. Совещания могут быть запланированы, выбрав приглашенных из того же проекта. Повестка дня может быть создана и отправлена приглашенным лицам. После совещания можно выбрать участников и создать протокол на основе повестки дня. Протокол может быть отправлен всем участникам и приглашенным. activerecord: attributes: meeting: @@ -90,7 +90,7 @@ ru: label_meeting: "Совещание" label_meeting_plural: "Совещания" label_meeting_new: "Новое совещание" - label_meeting_new_dynamic: "Новая динамичная встреча" + label_meeting_new_dynamic: "Новое активное совещание" label_meeting_create: "Создать совещание" label_meeting_copy: "Копировать совещание" label_meeting_edit: "Измененить совещание" @@ -121,7 +121,7 @@ ru: label_start_date: "Дата начала" meeting: attachments: - text: "Прикрепленные файлы доступны всем участникам встречи. Вы также можете перенести их в примечания к пунктам повестки дня." + text: "Прикрепленные файлы доступны всем участникам совещания. Вы также можете перенести их в примечания к пунктам повестки дня." copy: title: "Копировать встречу %{title}" attachments: "Копировать вложения" diff --git a/modules/meeting/config/locales/crowdin/zh-TW.yml b/modules/meeting/config/locales/crowdin/zh-TW.yml index acf7ccd874ec..f05454b4b57a 100644 --- a/modules/meeting/config/locales/crowdin/zh-TW.yml +++ b/modules/meeting/config/locales/crowdin/zh-TW.yml @@ -30,7 +30,7 @@ zh-TW: meeting: type: "會議類型" location: "地點" - duration: "天數" + duration: "時長" notes: "備註" participants: "參加人員" participant: @@ -173,7 +173,7 @@ zh-TW: permission_send_meeting_agendas_icalendar: "將議題大綱傳至行事曆" project_module_meetings: "會議" text_duration_in_hours: "持續時間 (小時)" - text_in_hours: "在一小時內" + text_in_hours: "小時數" text_meeting_agenda_for_meeting: '%{meeting} 的會議大綱' text_meeting_closing_are_you_sure: "確實要關閉議程嗎?" text_meeting_agenda_open_are_you_sure: "將會覆蓋所有會議紀錄中的變動!您希望繼續嗎?" diff --git a/modules/my_page/config/locales/crowdin/js-mn.yml b/modules/my_page/config/locales/crowdin/js-mn.yml index 41f773efc2cd..1a6749448729 100644 --- a/modules/my_page/config/locales/crowdin/js-mn.yml +++ b/modules/my_page/config/locales/crowdin/js-mn.yml @@ -1,4 +1,4 @@ mn: js: my_page: - label: "My page" + label: "Миний хуудас" diff --git a/modules/openid_connect/config/locales/crowdin/nl.yml b/modules/openid_connect/config/locales/crowdin/nl.yml index 796203bf7f2b..273c6a69faa6 100644 --- a/modules/openid_connect/config/locales/crowdin/nl.yml +++ b/modules/openid_connect/config/locales/crowdin/nl.yml @@ -46,45 +46,45 @@ nl: 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. - one: "One user is currently still using this provider. They will need to be re-invited or logging in with another provider." - other: "%{count} users are currently still using this provider. They will need to be re-invited or logging in with another provider." - delete_result_direct: This provider is marked as a direct login provider. The setting will be removed and users will no longer be redirected to the provider for login. + one: "Eén gebruiker gebruikt momenteel nog deze provider. Zij moeten opnieuw worden uitgenodigd of zich aanmelden bij een andere provider." + other: "%{count} gebruikers maken momenteel nog gebruik van deze provider. Zij moeten opnieuw worden uitgenodigd of inloggen bij een andere provider." + delete_result_direct: Deze provider is gemarkeerd als een directe aanmeldprovider. De instelling wordt verwijderd en gebruikers worden niet langer omgeleid naar deze provider om in te loggen. openid_connect: menu_title: OpenID aanbieders - delete_title: "Delete OpenID Connect provider" + delete_title: "OpenID Connect provider verwijderen" instructions: redirect_url: This is the redirect URL that the OpenID Connect provider should use to redirect back to OpenProject after a successful login. - endpoint_url: The endpoint URL given to you by the OpenID Connect provider - metadata_none: I don't have this information - metadata_url: I have a discovery endpoint URL - client_id: This is the client ID given to you by your OpenID Connect provider - client_secret: This is the client secret given to you by your OpenID Connect provider + endpoint_url: De endpoint URL die u van de OpenID Connect provider heeft gekregen + metadata_none: Ik heb deze informatie niet + metadata_url: Ik heb een URL voor een zoekeindpunt + client_id: Dit is de client-ID die u van uw OpenID Connect provider hebt gekregen + client_secret: Dit is de client-ID die u van uw OpenID Connect provider hebt gekregen limit_self_registration: If enabled, users can only register using this provider if configuration on the provider's end allows it. display_name: The name of the provider. This will be displayed as the login button and in the list of providers. - tenant: 'Please replace the default tenant with your own if applicable. See this.' + tenant: 'Vervang de standaard tenant door uw eigen tenant, indien van toepassing. Bekijk dit.' scope: If you want to request custom scopes, you can add one or multiple scope values separated by spaces here. For more information, see the [OpenID Connect documentation](docs_url). - post_logout_redirect_uri: The URL the OpenID Connect provider should redirect to after a logout request. + post_logout_redirect_uri: De URL waarnaar de OpenID Connect provider moet doorsturen na een uitlogverzoek. claims: > - You can request additional claims for the userinfo and id token endpoints. Please see [our OpenID connect documentation](docs_url) for more information. + U kunt extra claims aanvragen voor de eindpunten userinfo en id token. Zie [onze OpenID connect documentatie](docs_url) voor meer informatie. acr_values: > - Request non-essential claims in an easier format. See [our documentation on acr_values](docs_url) for more information. + Vraag niet-essentiële claims aan in een eenvoudiger formaat. Zie [onze documentatie over acr_values](docs_url) voor meer informatie. mapping_login: > - Provide a custom mapping in the userinfo response to be used for the login attribute. + Zorg voor een aangepaste toewijzing in het userinfo antwoord om te gebruiken voor het aanmeldingskenmerk. mapping_email: > - Provide a custom mapping in the userinfo response to be used for the email attribute. + Zorg voor een aangepaste toewijzing in het userinfo antwoord om te gebruiken voor het aanmeldingskenmerk. mapping_first_name: > - Provide a custom mapping in the userinfo response to be used for the first name. + Zorg voor een aangepaste toewijzing in het userinfo antwoord om te gebruiken voor de voornaam. mapping_last_name: > - Provide a custom mapping in the userinfo response to be used for the last name. + Zorg voor een aangepaste toewijzing in het userinfo antwoord om te gebruiken voor de achternaam. mapping_admin: > - Provide a custom mapping in the userinfo response to be used for the admin status. It expects a boolean attribute to be returned. + Geef een aangepaste toewijzing in het userinfo antwoord om te gebruiken voor de beheerdersstatus. Er wordt een booleaans attribuut verwacht dat wordt geretourneerd. settings: - metadata_none: I don't have this information - metadata_url: I have a discovery endpoint URL - endpoint_url: Endpoint URL + metadata_none: Ik heb deze informatie niet + metadata_url: Ik heb een URL voor een zoekeindpunt + endpoint_url: Eindpunt URL providers: - label_providers: "Providers" - seeded_from_env: "This provider was seeded from the environment configuration. It cannot be edited." + label_providers: "Aanbieders" + seeded_from_env: "Deze provider is geplaatst vanuit de omgevingsconfiguratie. Deze kan niet worden bewerkt." google: name: Google microsoft_entra: diff --git a/modules/openid_connect/config/locales/crowdin/ro.yml b/modules/openid_connect/config/locales/crowdin/ro.yml index ef872c50096d..5d98337b68ce 100644 --- a/modules/openid_connect/config/locales/crowdin/ro.yml +++ b/modules/openid_connect/config/locales/crowdin/ro.yml @@ -93,7 +93,7 @@ ro: name: Custom upsale: description: Connect OpenProject to an OpenID connect identity provider - label_add_new: Adăugare stare nouă + label_add_new: Adaugă stare nouă label_edit: Editați furnizorul OpenID %{name} label_empty_title: No OpenID providers configured yet. label_empty_description: Add a provider to see them here. diff --git a/modules/recaptcha/config/locales/crowdin/id.yml b/modules/recaptcha/config/locales/crowdin/id.yml index 3e54d57f7fac..e7ad4a7387ae 100644 --- a/modules/recaptcha/config/locales/crowdin/id.yml +++ b/modules/recaptcha/config/locales/crowdin/id.yml @@ -9,7 +9,7 @@ id: verify_account: "Verifikasi akun anda" error_captcha: "Akun anda tidak dapat diverifikasi. Silakan hubungi administrator." settings: - website_key: 'Website key (May also be called "Site key")' + website_key: 'Kunci situs web (Bisa juga "Kunci situs")' response_limit: 'Batas respon untuk HCaptcha' response_limit_text: 'Jumlah maksimum karakter untuk memperlakukan respon HCaptcha sebagai valid.' website_key_text: 'Masukkan kunci situs web yang Anda buat di konsol admin reCAPTCHA untuk domain ini.' diff --git a/modules/recaptcha/config/locales/crowdin/ro.yml b/modules/recaptcha/config/locales/crowdin/ro.yml index 4618502b485f..23120a2c82bb 100644 --- a/modules/recaptcha/config/locales/crowdin/ro.yml +++ b/modules/recaptcha/config/locales/crowdin/ro.yml @@ -12,10 +12,10 @@ ro: website_key: 'Website key (May also be called "Site key")' response_limit: 'Response limit for HCaptcha' response_limit_text: 'The maximum number of characters to treat the HCaptcha response as valid.' - website_key_text: 'Introduceți cheia site-ului web pe care ați creat-o în consola de administrare reCAPTCHA pentru acest domeniu.' + website_key_text: 'Introdu cheia site-ului web pe care ai creat-o în consola de administrare reCAPTCHA pentru acest domeniu.' secret_key: 'Cheie secretă' - secret_key_text: 'Introduceți cheia secretă pe care ați creat-o în consola de administrare reCAPTCHA.' - type: 'Utilizați reCAPTCHA' + secret_key_text: 'Introdu cheia secretă pe care ai creat-o în consola de administrare reCAPTCHA.' + type: 'Utilizează reCAPTCHA' type_disabled: 'Dezactivați reCAPTCHA' type_v2: 'reCAPTCHA v2' type_v3: 'reCAPTCHA v3' diff --git a/modules/reporting/config/locales/crowdin/id.yml b/modules/reporting/config/locales/crowdin/id.yml index b9d31e7e6ec4..d7f72048887a 100644 --- a/modules/reporting/config/locales/crowdin/id.yml +++ b/modules/reporting/config/locales/crowdin/id.yml @@ -23,7 +23,7 @@ id: plugin_openproject_reporting: name: "OpenProject Reporting" description: "This plugin allows creating custom cost reports with filtering and grouping created by the OpenProject Time and costs plugin." - button_save_report_as: "Save report as..." + button_save_report_as: "Simpan laporan..." comments: "Komentar" cost_reports_title: "Waktu dan biaya" label_cost_report: "Laporan biaya" diff --git a/modules/reporting/config/locales/crowdin/ro.yml b/modules/reporting/config/locales/crowdin/ro.yml index 7a5933ed9a4c..843909fe1ef6 100644 --- a/modules/reporting/config/locales/crowdin/ro.yml +++ b/modules/reporting/config/locales/crowdin/ro.yml @@ -23,7 +23,7 @@ ro: plugin_openproject_reporting: name: "OpenProject Reporting" description: "This plugin allows creating custom cost reports with filtering and grouping created by the OpenProject Time and costs plugin." - button_save_report_as: "Save report as..." + button_save_report_as: "Salvează raportul ca..." comments: "Comentariu" cost_reports_title: "Timp și costuri" label_cost_report: "Raport de cost" @@ -66,10 +66,10 @@ ro: label_year_reporting: "An (consumat)" label_count: "Număr" label_filter: "Filtrează" - label_filter_add: "Adăugare filtru" + label_filter_add: "Adaugă filtru" label_filter_plural: "Filtre" label_group_by: "Grupează după" - label_group_by_add: "Adaugă atributul Grupare-după" + label_group_by_add: "Adaugă atributul Grupează-după" label_inactive: "Inactiv" label_no: "Nu" label_none: "Sincronizați datele" diff --git a/modules/storages/config/locales/crowdin/js-ro.yml b/modules/storages/config/locales/crowdin/js-ro.yml index ad61339388e9..d75f93896cac 100644 --- a/modules/storages/config/locales/crowdin/js-ro.yml +++ b/modules/storages/config/locales/crowdin/js-ro.yml @@ -25,7 +25,7 @@ ro: Unele date %{storageType} nu au putut fi preluate. Încercați să reîncărcați această pagină sau contactați administratorul %{storageType}. no_file_links: "Pentru a conecta fișierele la acest pachet de lucru, vă rugăm să le faceți prin intermediul %{storageType}." not_logged_in: > - Pentru a adăuga un link, vezi sau încarcă fișiere legate de acest pachet de lucru, te rugăm să te autentifici la %{storageType}. + Pentru a adăuga un link, vezi sau încarcă fișiere asociate cu acest pachet de lucru, te rog să te autentifici la %{storageType}. files: already_existing_header: "Acest fișier există deja" already_existing_body: > @@ -81,7 +81,7 @@ ro: A apărut o eroare la conectarea fișierului încărcat recent '%{fileName}' la pachetul de lucru %{workPackageId}. tooltip: not_logged_in: "Please log in to the storage to access this file." - view_not_allowed: "Nu aveți permisiunea de a vedea acest fișier." + view_not_allowed: "Nu ai permisiune pentru a vedea acest fișier." not_found: "This file cannot be found." already_linked_file: "Acest fișier este deja legat la acest pachet de lucru." already_linked_directory: "Acest director este deja conectat la acest pachet de lucru." diff --git a/modules/storages/config/locales/crowdin/ro.yml b/modules/storages/config/locales/crowdin/ro.yml index 24fb13abff1c..fa0eb8f31825 100644 --- a/modules/storages/config/locales/crowdin/ro.yml +++ b/modules/storages/config/locales/crowdin/ro.yml @@ -77,14 +77,14 @@ ro: attributes: nextcloud_sync_service: add_user_to_group: 'Add User to Group:' - create_folder: 'Managed Project Folder Creation:' + create_folder: 'Creare dosar proiect gestionat:' ensure_root_folder_permissions: 'Set Base Folder Permissions:' hide_inactive_folders: 'Hide Inactive Folders Step:' remote_folders: 'Read contents of the group folder:' remove_user_from_group: 'Remove User from Group:' rename_project_folder: 'Rename managed project Folder:' one_drive_sync_service: - create_folder: 'Managed Project Folder Creation:' + create_folder: 'Creare dosar proiect gestionat:' ensure_root_folder_permissions: 'Set Base Folder Permissions:' hide_inactive_folders: 'Hide Inactive Folders Step:' remote_folders: 'Read contents of the group folder:' diff --git a/modules/storages/config/locales/crowdin/ru.yml b/modules/storages/config/locales/crowdin/ru.yml index 77585f9a9031..f31db1501f5f 100644 --- a/modules/storages/config/locales/crowdin/ru.yml +++ b/modules/storages/config/locales/crowdin/ru.yml @@ -63,7 +63,7 @@ ru: label: Изменить папку проекта project_folder_mode: automatic: Автоматическое управление - inactive: Нет определенной папки + inactive: Нет конкретной папки manual: Существующая папка управляется вручную remove_project: deletion_failure_flash: Не удалось удалить проект из хранилища. %{error} diff --git a/modules/storages/lib/open_project/storages/patches/replace_references_service_patch.rb b/modules/storages/lib/open_project/storages/patches/replace_references_service_patch.rb index 2f8e8238d2e5..4e4889495100 100644 --- a/modules/storages/lib/open_project/storages/patches/replace_references_service_patch.rb +++ b/modules/storages/lib/open_project/storages/patches/replace_references_service_patch.rb @@ -6,12 +6,9 @@ def self.included(base) # :nodoc: module InstanceMethods private - def rewrite_active_models(from, to) + def rewrite_creator(from, to) super - rewrite_creator(from, to) - end - def rewrite_creator(from, to) [::Storages::Storage, ::Storages::ProjectStorage, ::Storages::FileLink].each do |klass| diff --git a/modules/team_planner/config/locales/crowdin/js-mn.yml b/modules/team_planner/config/locales/crowdin/js-mn.yml index d02e26510d88..f6b9040b1466 100644 --- a/modules/team_planner/config/locales/crowdin/js-mn.yml +++ b/modules/team_planner/config/locales/crowdin/js-mn.yml @@ -4,24 +4,24 @@ mn: team_planner: add_existing: 'Add existing' add_existing_title: 'Add existing work packages' - create_label: 'Team planner' + create_label: 'Багийн төлөвлөгч' create_title: 'Create new team planner' unsaved_title: 'Unnamed team planner' no_data: 'Add assignees to set up your team planner.' - add_assignee: 'Assignee' + add_assignee: 'Даалгагч' remove_assignee: 'Remove assignee' - two_weeks: '2-week' - one_week: '1-week' - four_weeks: '4-week' - eight_weeks: '8-week' - work_week: 'Work week' - today: 'Today' + two_weeks: '2 долоо хоног' + one_week: '1 долоо хоног' + four_weeks: '4 долоо хоног' + eight_weeks: '8 долоо хоног' + work_week: 'Ажлын долоо хоног' + today: 'Өнөөдөр' drag_here_to_remove: 'Drag here to remove assignee and start and end dates.' cannot_drag_here: 'Cannot remove the work package due to permissions or editing restrictions.' cannot_drag_to_non_working_day: 'This work package cannot start/finish on a non-working day.' quick_add: empty_state: 'Use the search field to find work packages and drag them to the planner to assign it to someone and define start and end dates.' - search_placeholder: 'Search...' + search_placeholder: 'Хайх...' modify: errors: permission_denied: 'You do not have the necessary permissions to modify this.' diff --git a/modules/team_planner/config/locales/crowdin/js-ro.yml b/modules/team_planner/config/locales/crowdin/js-ro.yml index 2a4b159aaecf..7735a2a24d25 100644 --- a/modules/team_planner/config/locales/crowdin/js-ro.yml +++ b/modules/team_planner/config/locales/crowdin/js-ro.yml @@ -3,17 +3,17 @@ ro: js: team_planner: add_existing: 'Adaugă existent' - add_existing_title: 'Adăugarea pachetelor de lucru existente' + add_existing_title: 'Adaugă pachete de lucru existente' create_label: 'Planificator echipă' create_title: 'Creează planificare echipă nouă' unsaved_title: 'Planificator de echipă nenumit' no_data: 'Adăugați persoane desemnate pentru a vă configura planificatorul echipei.' add_assignee: 'Executant' remove_assignee: 'Înlătură responsabil' - two_weeks: '2-săptămână' - one_week: '1-săptămână' - four_weeks: '4 săptămâni' - eight_weeks: '8 săptămâni' + two_weeks: 'două săptămâni' + one_week: 'o săptămână' + four_weeks: 'patru săptămâni' + eight_weeks: 'opt săptămâni' work_week: 'Săptămână de lucru' today: 'Azi' drag_here_to_remove: 'Trageți aici pentru a elimina responsabilul și a începe și a termina datele.' diff --git a/modules/team_planner/config/locales/crowdin/mn.yml b/modules/team_planner/config/locales/crowdin/mn.yml index 22168e5b1562..5365c7f03c74 100644 --- a/modules/team_planner/config/locales/crowdin/mn.yml +++ b/modules/team_planner/config/locales/crowdin/mn.yml @@ -3,15 +3,15 @@ mn: plugin_openproject_team_planner: name: "OpenProject Team Planner" description: "Provides team planner views." - permission_view_team_planner: "View team planner" - permission_manage_team_planner: "Manage team planner" - project_module_team_planner_view: "Team planners" + permission_view_team_planner: "Багийн төлөвлөгчийг харах" + permission_manage_team_planner: "Багийн төлөвлөгчийг удирдах" + project_module_team_planner_view: "Багийн төлөвлөгчид" team_planner: - label_team_planner: "Team planner" - label_new_team_planner: "New team planner" - label_create_new_team_planner: "Create new team planner" - label_team_planner_plural: "Team planners" - label_assignees: "Assignees" + label_team_planner: "Багийн төлөвлөгч" + label_new_team_planner: "Шинэ багийн төлөвлөгч" + label_create_new_team_planner: "Шинэ баг төлөвлөгч үүсгэх" + label_team_planner_plural: "Багийн төлөвлөгчид" + label_assignees: "Томилогдсон хүмүүс" upsale: - title: "Team planner" - description: "Get a complete overview of your team’s planning with Team Planner. Stretch, shorten and drag-and-drop work packages to modify dates, move them or change assignees." + title: "Багийн төлөвлөгч" + description: "Багийн төлөвлөгч-ийн тусламжтайгаар багийнхаа төлөвлөлтийн талаарх бүрэн танилцуулгатай танилцаарай. Огноог өөрчлөх, зөөх эсвэл томилогдсон хүмүүсийг өөрчлөхийн тулд ажлын багцуудыг сунгаж, богиносгож, чирэх, буулгах боломжтой." diff --git a/modules/two_factor_authentication/config/locales/crowdin/ro.yml b/modules/two_factor_authentication/config/locales/crowdin/ro.yml index e6ca7a61979a..e3ff7efeb927 100644 --- a/modules/two_factor_authentication/config/locales/crowdin/ro.yml +++ b/modules/two_factor_authentication/config/locales/crowdin/ro.yml @@ -30,7 +30,7 @@ ro: error_no_device: "Nu s-a găsit niciun dispozitiv 2FA înregistrat pentru acest utilizator, deși este necesar pentru această instanță." error_no_matching_strategy: "Nu este disponibilă nicio strategie 2FA corespunzătoare pentru acest utilizator. Vă rugăm să vă contactați administratorul." error_is_enforced_not_active: "Eroare de configurare: Autentificarea cu doi factori a fost impusă, dar nu există strategii active." - error_invalid_backup_code: "Cod de backup 2FA invalid" + error_invalid_backup_code: "Cod de rezervă 2FA invalid" channel_unavailable: "Canalul de livrare %{channel} nu este disponibil." no_valid_phone_number: "Nu există un număr de telefon valabil." label_pwd_confirmation: "Parola" @@ -44,13 +44,13 @@ ro: label_2fa_disabled: "Autentificare cu doi factori" text_otp_delivery_message_sms: "Parola unică %{app_title} este %{token}" text_otp_delivery_message_voice: "Parola unică %{app_title} este: %{pause} %{token}. %{pause} Repet: %{pause} %{token}" - text_enter_2fa: "Vă rugăm să introduceți parola unică de pe dispozitiv." - text_2fa_enabled: "La fiecare autentificare, vi se va cere să introduceți un token OTP de pe dispozitivul 2FA implicit." - text_2fa_disabled: "Pentru a activa autentificarea cu doi factori, utilizați butonul de mai sus pentru a înregistra un nou dispozitiv 2FA. Dacă aveți deja un dispozitiv, trebuie să îl faceți implicit." + text_enter_2fa: "Te rog să introduci parola unică de pe dispozitiv." + text_2fa_enabled: "La fiecare autentificare, ți se va cere să introduci un token OTP de pe dispozitivul 2FA implicit." + text_2fa_disabled: "Pentru a activa autentificarea cu doi factori, utilizează butonul de mai sus pentru a înregistra un nou dispozitiv 2FA. Dacă ai deja un dispozitiv, trebuie să îl faci implicit." login: - enter_backup_code_title: Introduceți codul de rezervă - enter_backup_code_text: Vă rugăm să introduceți un cod de rezervă valabil din lista dvs. de coduri în cazul în care nu mai puteți accesa dispozitivele 2FA înregistrate. - other_device: "Utilizați un alt dispozitiv sau un cod de rezervă" + enter_backup_code_title: Introdu codul de rezervă + enter_backup_code_text: Te rog să introduci un cod de rezervă valabil din lista ta de coduri în cazul în care nu mai poți accesa dispozitivele 2FA înregistrate. + other_device: "Utilizează un alt dispozitiv sau un cod de rezervă" settings: title: "Setări 2FA" current_configuration: "Configurația curentă" @@ -87,13 +87,13 @@ ro: plural: Coduri de rezervă your_codes: pentru contul tău %{app_name} %{login} overview_description: | - Dacă nu puteți accesa dispozitivele cu doi factori, puteți utiliza un cod de rezervă pentru a vă recăpăta accesul la cont. - Utilizați următorul buton pentru a genera un nou set de coduri de rezervă. + Dacă nu poți accesa dispozitivele cu doi factori, poți utiliza un cod de rezervă pentru a recăpăta accesul la cont. + Utilizează următorul buton pentru a genera un nou set de coduri de rezervă. generate: title: Generarea codurilor de rezervă - keep_safe_as_password: "Important! Tratați aceste coduri ca pe niște parole." - keep_safe_warning: "Fie le salvați în managerul de parole, fie imprimați această pagină și puneți-o într-un loc sigur." - regenerate_warning: "Avertisment: Dacă ați creat coduri de rezervă înainte, acestea vor fi invalidate și nu vor mai funcționa." + keep_safe_as_password: "Important! Tratează aceste coduri ca pe niște parole." + keep_safe_warning: "Fie le salvezi în managerul de parole, fie imprimi această pagină și pune-o într-un loc sigur." + regenerate_warning: "Avertisment: Dacă ai creat coduri de rezervă înainte, acestea vor fi invalidate și nu vor mai funcționa." devices: add_new: "Adaugă un nou dispozitiv 2FA" register: "Dispozitivul de înregistrare" @@ -133,7 +133,7 @@ ro: question_cannot_scan: | Nu puteți scana codul cu ajutorul aplicației dumneavoastră? text_cannot_scan: | - În cazul în care nu puteți scana codul, puteți să introduceți intrarea manual folosind următoarele detalii: + În cazul în care nu poți scana codul, poți să introduci intrarea manual folosind următoarele detalii: description: | Use a one-time code generated by an authenticator like Authy or Google Authenticator. sms: @@ -155,7 +155,7 @@ ro: mobile_transmit_notification: "O parolă unică a fost trimisă pe telefonul dvs. mobil." label_two_factor_authentication: "Autentificare cu doi factori" forced_registration: - required_to_add_device: "O politică de securitate activă vă solicită să activați autentificarea cu doi factori. Vă rugăm să utilizați următorul formular pentru a înregistra un dispozitiv." + required_to_add_device: "O politică de securitate activă solicită să activezi autentificarea cu doi factori. Te rog să utilizezi următorul formular pentru a înregistra un dispozitiv." remember: active_session_notice: > Contul dvs. are un modul cookie de memorare activ, valabil până la %{expires_on}. Acest modul cookie vă permite să vă conectați fără un al doilea factor la contul dvs. până la acel moment. diff --git a/modules/xls_export/config/locales/crowdin/mn.yml b/modules/xls_export/config/locales/crowdin/mn.yml index f91696262176..6c88d5773fbe 100644 --- a/modules/xls_export/config/locales/crowdin/mn.yml +++ b/modules/xls_export/config/locales/crowdin/mn.yml @@ -2,14 +2,14 @@ mn: plugin_openproject_xls_export: name: "OpenProject XLS Export" description: "Export issue lists as Excel spreadsheets (.xls)." - export_to_excel: "Export XLS" - print_with_description: "Print preview with description" - sentence_separator_or: "or" - different_formats: Different formats + export_to_excel: "XLS экспортлох" + print_with_description: "Тайлбартай урьдчилан үзэх" + sentence_separator_or: "эсвэл" + different_formats: Өөр форматууд export: format: xls: "XLS" - xls_with_descriptions: "XLS with descriptions" + xls_with_descriptions: "Тайлбартай XLS" xls_with_relations: "XLS with relations" xls_export: child_of: child of diff --git a/spec/controllers/work_package_children_controller_spec.rb b/spec/controllers/work_package_children_relations_controller_spec.rb similarity index 57% rename from spec/controllers/work_package_children_controller_spec.rb rename to spec/controllers/work_package_children_relations_controller_spec.rb index 57d87f2995d8..e4e0388beeac 100644 --- a/spec/controllers/work_package_children_controller_spec.rb +++ b/spec/controllers/work_package_children_relations_controller_spec.rb @@ -30,11 +30,13 @@ require "spec_helper" -RSpec.describe WorkPackageChildrenController do +RSpec.describe WorkPackageChildrenRelationsController do shared_let(:user) { create(:admin) } - shared_let(:project) { create(:project) } - shared_let(:work_package) { create(:work_package, project:) } - shared_let(:child_work_package) { create(:work_package, parent: work_package, project:) } + shared_let(:task_type) { create(:type_task) } + shared_let(:milestone_type) { create(:type_milestone) } + shared_let(:project) { create(:project, types: [task_type, milestone_type]) } + shared_let(:work_package) { create(:work_package, project:, type: task_type) } + shared_let(:child_work_package) { create(:work_package, parent: work_package, project:, type: task_type) } current_user { user } @@ -55,25 +57,64 @@ end end - describe "DELETE /work_packages/:work_package_id/children/:id" do - before do - allow(WorkPackageRelationsTab::IndexComponent).to receive(:new).and_call_original - allow(controller).to receive(:replace_via_turbo_stream).and_call_original + describe "POST /work_packages/:work_package_id/children" do + shared_let(:future_child_work_package) { create(:work_package, project:) } + + it "creates a child relationship" do + post("create", params: { work_package_id: work_package.id, + work_package: { id: future_child_work_package.id } }, + as: :turbo_stream) + expect(response).to have_http_status(:ok) + expect(future_child_work_package.reload.parent).to eq(work_package) end - it "deletes the child relationship" do + it "can't create a child relationship for a milestone work package" do + work_package.update(type: milestone_type) + post("create", params: { work_package_id: work_package.id, + work_package: { id: future_child_work_package.id } }, + as: :turbo_stream) + expect(response).to have_http_status(:unprocessable_entity) + expect(future_child_work_package.reload.parent).to be_nil + end + end + + describe "DELETE /work_packages/:work_package_id/children/:id" do + def send_delete_request delete("destroy", params: { work_package_id: work_package.id, id: child_work_package.id }, as: :turbo_stream) + end - expect(response).to be_successful + it "deletes the child relationship" do + send_delete_request + + expect(response).to have_http_status(:ok) + expect(child_work_package.reload.parent).to be_nil + end + + it "renders the relations tab index component" do + allow(WorkPackageRelationsTab::IndexComponent).to receive(:new).and_call_original + allow(controller).to receive(:replace_via_turbo_stream).and_call_original + + send_delete_request expect(WorkPackageRelationsTab::IndexComponent).to have_received(:new) .with(work_package:, relations: [], children: []) expect(controller).to have_received(:replace_via_turbo_stream) .with(component: an_instance_of(WorkPackageRelationsTab::IndexComponent)) - expect(child_work_package.reload.parent).to be_nil + end + + it "updates dependent work packages" do + allow(WorkPackages::UpdateAncestorsService).to receive(:new).and_call_original + allow(WorkPackages::SetScheduleService).to receive(:new).and_call_original + + send_delete_request + + expect(WorkPackages::UpdateAncestorsService).to have_received(:new) + .with(user: user, work_package: child_work_package) + expect(WorkPackages::SetScheduleService).to have_received(:new) + .with(a_hash_including(work_package: [child_work_package])) end end end diff --git a/spec/features/work_packages/details/relations/hierarchy_milestone_spec.rb b/spec/features/work_packages/details/relations/hierarchy_milestone_spec.rb index 4168e34604d0..757f0c950b69 100644 --- a/spec/features/work_packages/details/relations/hierarchy_milestone_spec.rb +++ b/spec/features/work_packages/details/relations/hierarchy_milestone_spec.rb @@ -28,30 +28,34 @@ require "spec_helper" -RSpec.describe "work package hierarchies for milestones", :js, :selenium do +RSpec.describe "work package hierarchies for milestones", :js, :with_cuprite do let(:user) { create(:admin) } - let(:type) { create(:type, is_milestone: true) } - let(:project) { create(:project, types: [type]) } - let(:work_package) { create(:work_package, project:, type:) } - let(:relations) { Components::WorkPackages::Relations.new(work_package) } - let(:tabs) { Components::WorkPackages::Tabs.new(work_package) } - let(:wp_page) { Pages::FullWorkPackage.new(work_package) } - - let(:relations_tab) { find(".op-tab-row--link_selected", text: "RELATIONS") } - let(:visit) { true } + let(:task_type) { create(:type_task) } + let(:milestone_type) { create(:type_milestone) } + let(:project) { create(:project, types: [task_type, milestone_type]) } + let!(:milestone_work_package) { create(:work_package, subject: "milestone_work_package", project:, type: milestone_type) } + let!(:task_work_package) { create(:work_package, subject: "task_work_package", project:, type: task_type) } + let(:relations) { Components::WorkPackages::Relations.new } before do login_as user + end + + def visit_relations_tab_for(work_package) + wp_page = Pages::FullWorkPackage.new(work_package) wp_page.visit_tab!("relations") expect_angular_frontend_initialized wp_page.expect_subject loading_indicator_saveguard end - it "does not provide links to add children or existing children (Regression #28745)" do - expect(page).to have_no_text("Add existing child") - expect(page).to have_no_text("Create new child") - expect(page).to have_no_css("wp-inline-create--add-link") - expect(page).to have_no_text("Children") + it "does not provide links to add children or existing children (Regression #28745 and #60512)" do + # A work package has a menu entry to link a child + visit_relations_tab_for(task_work_package) + relations.expect_new_relation_type("Child") + + # A milestone work package does NOT have a menu entry to link a child + visit_relations_tab_for(milestone_work_package) + relations.expect_no_new_relation_type("Child") end end diff --git a/spec/features/work_packages/details/relations/primerized_relations_spec.rb b/spec/features/work_packages/details/relations/primerized_relations_spec.rb index ea86ee42cb9a..e15ff4192ccb 100644 --- a/spec/features/work_packages/details/relations/primerized_relations_spec.rb +++ b/spec/features/work_packages/details/relations/primerized_relations_spec.rb @@ -32,8 +32,16 @@ :js, :with_cuprite do include Components::Autocompleter::NgSelectAutocompleteHelpers - shared_let(:user) { create(:admin) } shared_let(:project) { create(:project) } + shared_let(:user) do + create(:user, + member_with_permissions: { + project => %i[add_work_packages + manage_subtasks + manage_work_package_relations + view_work_packages] + }) + end before_all do set_factory_default(:user, user) @@ -41,17 +49,17 @@ set_factory_default(:project_with_types, project) end - shared_let(:parent_work_package) { create(:work_package, subject: "parent") } - shared_let(:work_package) { create(:work_package, subject: "main", parent: parent_work_package) } + shared_let(:parent_work_package) { create(:work_package, subject: "parent_work_package") } + shared_let(:work_package) { create(:work_package, subject: "work_package (main)", parent: parent_work_package) } shared_let(:type1) { create(:type) } shared_let(:type2) { create(:type) } shared_let(:wp_predecessor) do - create(:work_package, type: type1, subject: "predecessor of main", + create(:work_package, type: type1, subject: "wp_predecessor", start_date: Date.current, due_date: Date.current + 1.week) end - shared_let(:wp_related) { create(:work_package, type: type2, subject: "related to main") } - shared_let(:wp_blocker) { create(:work_package, type: type1, subject: "blocks main") } + shared_let(:wp_related) { create(:work_package, type: type2, subject: "wp_related") } + shared_let(:wp_blocker) { create(:work_package, type: type1, subject: "wp_blocker") } shared_let(:relation_follows) do create(:relation, @@ -73,16 +81,39 @@ end shared_let(:child_wp) do create(:work_package, + subject: "child_wp", parent: work_package, type: type1, project: project) end - shared_let(:not_yet_child_wp) do + shared_let(:not_child_yet_wp) do create(:work_package, + subject: "not_child_yet_wp", type: type1, project:) end + # The user should not be able to see any relations to work packages from this + # project because the user does not have the permissions to view this project + shared_let(:restricted_project) { create(:project) } + shared_let(:restricted_work_package) do + create(:work_package, + subject: "restricted_work_package", + project: restricted_project) + end + shared_let(:restricted_child_work_package) do + create(:work_package, + subject: "restricted_child_work_package", + parent: work_package, + project: restricted_project) + end + shared_let(:restricted_relation_relates) do + create(:relation, + from: work_package, + to: restricted_work_package, + relation_type: Relation::TYPE_RELATES) + end + let(:full_wp_view) { Pages::FullWorkPackage.new(work_package) } let(:relations_tab) { Components::WorkPackages::Relations.new(work_package) } let(:relations_panel_selector) { ".detail-panel--relations" } @@ -116,6 +147,10 @@ def label_for_relation_type(relation_type) relations_tab.expect_relation(relation_follows) relations_tab.expect_relation(relation_relates) relations_tab.expect_relation(relation_blocked) + + # Relations not visible due to lack of permissions on the project + relations_tab.expect_no_relation(restricted_relation_relates) + relations_tab.expect_no_relation(restricted_child_work_package) end end @@ -130,6 +165,10 @@ def label_for_relation_type(relation_type) expect { relation_follows.reload }.to raise_error(ActiveRecord::RecordNotFound) tabs.expect_counter("relations", 3) + + # Relations not visible due to lack of permissions on the project + relations_tab.expect_no_relation(restricted_relation_relates) + relations_tab.expect_no_relation(restricted_child_work_package) end it "can delete children" do @@ -141,6 +180,10 @@ def label_for_relation_type(relation_type) expect(child_wp.reload.parent).to be_nil tabs.expect_counter("relations", 3) + + # Relations not visible due to lack of permissions on the project + relations_tab.expect_no_relation(restricted_relation_relates) + relations_tab.expect_no_relation(restricted_child_work_package) end end @@ -159,6 +202,8 @@ def label_for_relation_type(relation_type) # Unchanged tabs.expect_counter("relations", 4) + relations_tab.expect_no_relation(restricted_relation_relates) + relations_tab.expect_no_relation(restricted_child_work_package) # Edit again relations_tab.edit_relation_description(relation_follows, "And they can be edited!") @@ -168,6 +213,10 @@ def label_for_relation_type(relation_type) # Unchanged tabs.expect_counter("relations", 4) + + # Relations not visible due to lack of permissions on the project + relations_tab.expect_no_relation(restricted_relation_relates) + relations_tab.expect_no_relation(restricted_child_work_package) end it "does not have an edit action for children" do @@ -231,6 +280,10 @@ def label_for_relation_type(relation_type) tabs.expect_counter("relations", 5) # Relation is created expect(Relation.follows.where(from: wp_successor, to: work_package)).to exist + + # Relations not visible due to lack of permissions on the project + relations_tab.expect_no_relation(restricted_relation_relates) + relations_tab.expect_no_relation(restricted_child_work_package) end it "does not autocomplete unrelatable work packages" do @@ -263,11 +316,18 @@ def label_for_relation_type(relation_type) tabs.expect_counter("relations", 4) - relations_tab.add_existing_child(not_yet_child_wp) - relations_tab.expect_child(not_yet_child_wp) + relations_tab.add_existing_child(not_child_yet_wp) + relations_tab.expect_child(not_child_yet_wp) # Bumped by one tabs.expect_counter("relations", 5) + + # Child relation is created + expect(not_child_yet_wp.reload.parent).to eq work_package + + # Relations not visible due to lack of permissions on the project + relations_tab.expect_no_relation(restricted_relation_relates) + relations_tab.expect_no_relation(restricted_child_work_package) end it "doesn't autocomplete parent, children, and WP itself" do diff --git a/spec/support/components/datepicker/datepicker.rb b/spec/support/components/datepicker/datepicker.rb index 96de5d5d1a95..01ef8d1f311b 100644 --- a/spec/support/components/datepicker/datepicker.rb +++ b/spec/support/components/datepicker/datepicker.rb @@ -57,7 +57,8 @@ def select_year(value) retry_block do flatpickr_container .first(".numInput.cur-year") - .set value + .fill_in(with: value) + .send_keys :enter # to trigger a keyboard event to get the internal state of flatpickr updated end end diff --git a/spec/support/components/work_packages/relations.rb b/spec/support/components/work_packages/relations.rb index 79ee9f1274ac..3c645384d9db 100644 --- a/spec/support/components/work_packages/relations.rb +++ b/spec/support/components/work_packages/relations.rb @@ -39,7 +39,7 @@ class Relations attr_reader :work_package - def initialize(work_package) + def initialize(work_package = nil) @work_package = work_package end @@ -77,17 +77,44 @@ def expect_row(work_package) def expect_no_row(relatable) actual_relatable = find_relatable(relatable) - expect(page).not_to have_test_selector("op-relation-row-#{actual_relatable.id}") + expect(page).not_to have_test_selector("op-relation-row-#{actual_relatable.id}"), + "expected no relation row for work package " \ + "##{actual_relatable.id} #{actual_relatable.subject.inspect}" end def select_relation_type(relation_type) - page.find_test_selector("new-relation-action-menu").click - - within page.find_by_id("new-relation-action-menu-list") do + within_new_relation_action_menu do click_link_or_button relation_type end end + def expect_new_relation_type(relation_type) + within_new_relation_action_menu do + expect(page).to have_link(relation_type, wait: 1) + end + end + + def expect_no_new_relation_type(relation_type) + within_new_relation_action_menu do + expect(page).to have_no_link(relation_type, wait: 1) + end + end + + def open_new_relation_action_menu + return if new_relation_action_menu.visible? + + new_relation_button.click + end + + def new_relation_action_menu + action_menu_id = new_relation_button["aria-controls"] + page.find(id: action_menu_id, visible: :all) + end + + def new_relation_button + page.find_test_selector("new-relation-action-menu").find_button + end + def remove_relation(relatable) actual_relatable = find_relatable(relatable) relatable_row = find_row(actual_relatable) @@ -317,6 +344,13 @@ def remove_child(work_package) expect_no_row(work_package) end + + private + + def within_new_relation_action_menu(&) + open_new_relation_action_menu + within(new_relation_action_menu, &) + end end end end diff --git a/spec/workers/principals/delete_job_integration_spec.rb b/spec/workers/principals/delete_job_integration_spec.rb index 17596286a579..2db3e9a989c0 100644 --- a/spec/workers/principals/delete_job_integration_spec.rb +++ b/spec/workers/principals/delete_job_integration_spec.rb @@ -475,6 +475,17 @@ it_behaves_like "cost_query handling" it_behaves_like "project query handling" it_behaves_like "mention rewriting" + + describe "favorites" do + before do + project.add_favoring_user(principal) + job + end + + it "removes the assigned_to association to the principal" do + expect(project.favoring_users.reload).to be_empty + end + end end context "with a group" do