diff --git a/.pkgr.yml b/.pkgr.yml index 1eb5d5b065..4e93ba164e 100644 --- a/.pkgr.yml +++ b/.pkgr.yml @@ -10,6 +10,7 @@ targets: - unrtf - tesseract-ocr - catdoc + - imagemagick debian-10: <<: *debian9 ubuntu-16.04: @@ -22,12 +23,15 @@ targets: dependencies: - unzip - epel-release + - ImageMagick centos-7: dependencies: - epel-release + - ImageMagick sles-12: build_dependencies: - sqlite3-devel + - ImageMagick before_precompile: "packaging/setup" after_precompile: "packaging/teardown" services: diff --git a/Gemfile b/Gemfile index b771821d5b..36b9bed1a2 100644 --- a/Gemfile +++ b/Gemfile @@ -187,6 +187,8 @@ gem 'rest-client', '~> 2.0' gem 'ruby-progressbar', '~> 1.10.0', require: false +gem 'mini_magick', '~> 4.11.0', require: false + group :test do gem 'launchy', '~> 2.5.0' gem 'rack-test', '~> 1.1.0' diff --git a/Gemfile.lock b/Gemfile.lock index c05c8a8d19..ab8774e80d 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -617,6 +617,7 @@ GEM mime-types-data (~> 3.2015) mime-types-data (3.2020.0512) mimemagic (0.3.5) + mini_magick (4.11.0) mini_mime (1.0.2) mini_portile2 (2.4.0) minisyntax (0.2.5) @@ -1027,6 +1028,7 @@ DEPENDENCIES livingstyleguide (~> 2.1.0) lograge (~> 0.11.0) meta-tags (~> 2.13.0) + mini_magick (~> 4.11.0) multi_json (~> 1.15.0) my_page! net-ldap (~> 0.16.0) diff --git a/app/controllers/admin_controller.rb b/app/controllers/admin_controller.rb index 3170c4f076..4226d1fa18 100644 --- a/app/controllers/admin_controller.rb +++ b/app/controllers/admin_controller.rb @@ -26,6 +26,7 @@ # # See docs/COPYRIGHT.rdoc for more details. #++ +require 'open3' class AdminController < ApplicationController layout 'admin' @@ -84,6 +85,7 @@ class AdminController < ApplicationController @checklist += file_storage_checks @checklist += plaintext_extraction_checks @checklist += admin_information_hook_checks + @checklist += image_conversion_checks @storage_information = OpenProject::Storage.mount_information end @@ -118,6 +120,14 @@ class AdminController < ApplicationController end end + def image_conversion_checks + [[:'image_conversion.imagemagick', image_conversion_libs_available?]] + end + + def image_conversion_libs_available? + Open3.capture2e('convert', '-version').first.include?('ImageMagick') + end + def file_storage_checks # Add local directory test if we're not using fog if OpenProject::Configuration.file_storage? diff --git a/app/models/work_package/pdf_export/attachments.rb b/app/models/work_package/pdf_export/attachments.rb index b23afecd21..ce18a85994 100644 --- a/app/models/work_package/pdf_export/attachments.rb +++ b/app/models/work_package/pdf_export/attachments.rb @@ -50,14 +50,45 @@ module WorkPackage::PDFExport::Attachments # Access the local file. For Carrierwave attachments, this will be blocking. file_path = attachment.file.local_file.path + + # Let's not include the raw images as the sum of all images can hit the memory limit of the worker process. + # As we do not need the full image size when printing small images into the PDF let's reduce it on the fly. + # It uses CPU and time. However, we don't expect that feature to get used often. + resized_file_path = resize_image(file_path) + # Fit the image roughly in the center of each cell - pdf.make_cell(image: file_path, fit: [available_width, 125], position: :center) + pdf.make_cell(image: resized_file_path, fit: [available_width, 125], position: :center) rescue => e Rails.logger.error { "Failed to attach work package image to PDF: #{e} #{e.message}" } nil end + def resize_image(file_path) + resized_file_path = extend_file_name_in_path(file_path, '__x325') + image = MiniMagick::Image.open(file_path) + image.resize("x325") + image.write(resized_file_path) + + @resized_image_paths << resized_file_path + + resized_file_path + end + + def extend_file_name_in_path(file_path, name_suffix) + dir_path = File.dirname(file_path) + file_extension = File.extname(file_path) + file_name = File.basename(file_path, '.*') + + File.join(dir_path, "#{file_name}#{name_suffix}#{file_extension}") + end + def pdf_embeddable?(attachment) %w[image/jpeg image/png].include?(attachment.content_type) end + + def delete_all_resized_images + @resized_image_paths.each do |file_path| + File.delete(file_path) + end + end end diff --git a/app/models/work_package/pdf_export/work_package_list_to_pdf.rb b/app/models/work_package/pdf_export/work_package_list_to_pdf.rb index 890f997c7e..436f263e37 100644 --- a/app/models/work_package/pdf_export/work_package_list_to_pdf.rb +++ b/app/models/work_package/pdf_export/work_package_list_to_pdf.rb @@ -28,6 +28,20 @@ # See docs/COPYRIGHT.rdoc for more details. #++ +# Exporter for work package table. +# +# It can optionally export a work package with +# - description, or with +# - attached images, or with +# - description and attached images. +# +# When exporting with attached images then the memory consumption can quickly +# grow beyond limits. Therefore we create multiple smaller PDFs that we finally +# merge do one file. + +require 'mini_magick' +require 'open3' + class WorkPackage::PDFExport::WorkPackageListToPdf < WorkPackage::Exporter::Base include WorkPackage::PDFExport::Common include WorkPackage::PDFExport::Attachments @@ -35,26 +49,29 @@ class WorkPackage::PDFExport::WorkPackageListToPdf < WorkPackage::Exporter::Base attr_accessor :pdf, :options + WORK_PACKAGES_PER_BATCH = 100 + def initialize(object, options = {}) super @cell_padding = options.delete(:cell_padding) - self.pdf = get_pdf(current_language) - - configure_page_size - configure_markup - end - - def configure_page_size - pdf.options[:page_size] = 'EXECUTIVE' - pdf.options[:page_layout] = :landscape + @total_wp_count = query.results.work_package_count + @batches_count = @total_wp_count.fdiv(WORK_PACKAGES_PER_BATCH).ceil + @batch_files = [] + @page_count = -1 end def render! - write_content! + (1..@batches_count).each do |batch_index| + run_batch!(batch_index) + end - success(pdf.render) + @merged_pdf_file = merge_pdfs + + delete_tmp_files + + success(@merged_pdf_file) rescue Prawn::Errors::CannotFit error(I18n.t(:error_pdf_export_too_many_columns)) rescue StandardError => e @@ -62,12 +79,57 @@ class WorkPackage::PDFExport::WorkPackageListToPdf < WorkPackage::Exporter::Base error(I18n.t(:error_pdf_failed_to_export, error: e.message)) end - def write_content! + private + + def on_first_batch(batch_index) + return unless batch_index == 1 + write_title! write_headers! - write_work_packages! + end + + def delete_tmp_files + @batch_files.each(&:delete) + end + + def configure_page_size + pdf.options[:page_size] = 'EXECUTIVE' + pdf.options[:page_layout] = :landscape + end + + def merge_pdfs + merged_pdf = Tempfile.new + # We use the command line tool "pdfunite" for concatenating the PDFs. + # That tool comes with the system package "poppler-utils" which we + # fortunately already have installed for text extraction purposes. + Open3.capture2e("pdfunite", *@batch_files.map(&:path), merged_pdf.path) + + merged_pdf + end + + def run_batch!(batch_index) + initialize_batch_page + + batch_file = render_batch!(batch_index) + + @page_count += pdf.page_count + batch_file.close + @batch_files << batch_file + end + + def render_batch!(batch_index) + @resized_image_paths = [] + on_first_batch(batch_index) + write_work_packages!(batch_index) write_footers! + + batch_file = Tempfile.new("pdf_batch_#{batch_index}") + pdf.render_file(batch_file.path) + + delete_all_resized_images + + batch_file end def project @@ -96,11 +158,13 @@ class WorkPackage::PDFExport::WorkPackageListToPdf < WorkPackage::Exporter::Base end def write_footers! + @page_count += 1 pdf.number_pages format_date(Date.today), at: [pdf.bounds.left, 0], style: :italic - pdf.number_pages "/", + pdf.number_pages "", + start_count_at: @page_count, at: [pdf.bounds.right - 25, 0], style: :italic end @@ -138,11 +202,11 @@ class WorkPackage::PDFExport::WorkPackageListToPdf < WorkPackage::Exporter::Base end end - def write_work_packages! + def write_work_packages!(batch_index) pdf.font style: :normal, size: 8 previous_group = nil - work_packages.each do |work_package| + work_packages_batch(batch_index).each do |work_package| previous_group = write_group_header!(work_package, previous_group) write_attributes!(work_package) @@ -157,6 +221,14 @@ class WorkPackage::PDFExport::WorkPackageListToPdf < WorkPackage::Exporter::Base end end + def work_packages_batch(batch_index) + query + .results + .work_packages + .page(batch_index) + .per_page(WORK_PACKAGES_PER_BATCH) + end + def write_attributes!(work_package) values = valid_export_columns.map do |column| make_column_value work_package, column @@ -218,4 +290,11 @@ class WorkPackage::PDFExport::WorkPackageListToPdf < WorkPackage::Exporter::Base pdf.make_cell values.map(&:formatted_value).join(', '), padding: cell_padding end + + def initialize_batch_page + self.pdf = get_pdf(current_language) + + configure_page_size + configure_markup + end end diff --git a/app/workers/work_packages/exports/export_job.rb b/app/workers/work_packages/exports/export_job.rb index 56b6858bcf..842b08f998 100644 --- a/app/workers/work_packages/exports/export_job.rb +++ b/app/workers/work_packages/exports/export_job.rb @@ -33,12 +33,22 @@ module WorkPackages raise export_result.message elsif export_result.content.is_a? File store_attachment(export, export_result.content) + elsif export_result.content.is_a? Tempfile + store_from_tempfile(export, export_result) else store_from_string(export, export_result) end end end + def store_from_tempfile(export, export_result) + renamed_file_path = File.join(File.dirname(export_result.content.path), export_result.title) + File.rename(export_result.content.path, renamed_file_path) + file = File.open(renamed_file_path) + store_attachment(export, file) + file.close + end + def schedule_cleanup ::WorkPackages::Exports::CleanupOutdatedJob.perform_after_grace end diff --git a/config/locales/crowdin/ar.yml b/config/locales/crowdin/ar.yml index 337e023686..aa60d3b599 100644 --- a/config/locales/crowdin/ar.yml +++ b/config/locales/crowdin/ar.yml @@ -1262,6 +1262,8 @@ ar: blog: "مدونة أوبِن بروجِكت" forums: "منتدى المجتمع" newsletter: "Security alerts / Newsletter" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "The changes were retracted." links: diff --git a/config/locales/crowdin/bg.yml b/config/locales/crowdin/bg.yml index 5d9f59def4..7f1f5f8bf8 100644 --- a/config/locales/crowdin/bg.yml +++ b/config/locales/crowdin/bg.yml @@ -1198,6 +1198,8 @@ bg: blog: "OpenProject блог" forums: "Форум на Общността" newsletter: "Security alerts / Newsletter" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "The changes were retracted." links: diff --git a/config/locales/crowdin/ca.yml b/config/locales/crowdin/ca.yml index 40cf50f887..b899870836 100644 --- a/config/locales/crowdin/ca.yml +++ b/config/locales/crowdin/ca.yml @@ -1198,6 +1198,8 @@ ca: blog: "Blog OpenProject" forums: "Fòrum de la comunitat" newsletter: "Security alerts / Newsletter" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "The changes were retracted." links: diff --git a/config/locales/crowdin/cs.yml b/config/locales/crowdin/cs.yml index 1262bc9a49..9b54ecf431 100644 --- a/config/locales/crowdin/cs.yml +++ b/config/locales/crowdin/cs.yml @@ -28,10 +28,10 @@ cs: plugins: no_results_title_text: V současné době nejsou k dispozici žádné pluginy. custom_styles: - color_theme: "Color theme" + color_theme: "Barevné téma" color_theme_custom: "Vlastní" colors: - alternative-color: "Alternative" + alternative-color: "Alternativa" content-link-color: "Link font" primary-color: "Primární" primary-color-dark: "Primární (tmavé)" @@ -39,20 +39,20 @@ cs: header-item-bg-hover-color: "Pozadí záhlaví při přejetí myší" header-item-font-color: "Písmo záhlaví" header-item-font-hover-color: "Písmo záhlaví při přejetí myší" - header-border-bottom-color: "Header border" - main-menu-bg-color: "Main menu background" - main-menu-bg-selected-background: "Main menu when selected" - main-menu-bg-hover-background: "Main menu on hover" - main-menu-font-color: "Main menu font" - main-menu-selected-font-color: "Main menu font when selected" - main-menu-hover-font-color: "Main menu font on hover" - main-menu-border-color: "Main menu border" + header-border-bottom-color: "Okraj záhlaví" + main-menu-bg-color: "Pozadí hlavního menu" + main-menu-bg-selected-background: "Hlavní menu při výběru" + main-menu-bg-hover-background: "Hlavní menu při přejetí myší" + main-menu-font-color: "Písmo hlavního menu" + main-menu-selected-font-color: "Písmo hlavního menu při výběru" + main-menu-hover-font-color: "Písmo hlavního menu při přejetí myší" + main-menu-border-color: "Okraj hlavního menu" custom_colors: "Vlastní barvy" customize: "Přizpůsobte si svou OpenProject instalaci vlastním logem. Poznámka: Logo bude veřejně přístupné." enterprise_notice: "Jako zvláštní 'Děkujeme!' za jejich finanční příspěvky na vývoj OpenProjektu, je tato malá funkce dostupná pouze pro podporu Enterprise Edition." manage_colors: "Upravit možnosti výběru barvy" instructions: - alternative-color: "Strong accent color, typically used for the most important button on a screen." + alternative-color: "Silná barva zvýraznění, obvykle používaná pro nejdůležitější tlačítko na obrazovce." content-link-color: "Barva písma většiny odkazů." primary-color: "Hlavní barva." primary-color-dark: "Obvykle tmavší verze hlavní barvy použité pro efekt vznášení." @@ -61,7 +61,7 @@ cs: header-item-font-hover-color: "Barva pozadí klikacích položek záhlaví při najetí myší." header-border-bottom-color: "Tenký řádek pod záhlavím. Ponechte toto pole prázdné, pokud nechcete žádný řádek." main-menu-bg-color: "Barva pozadí levého menu." - theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue? + theme_warning: Změna motivu přepíše váš vlastní styl. Vzhled pak bude ztracen. Jste si jisti, že chcete pokračovat? enterprise: upgrade_to_ee: "Upgrade to the Enterprise Edition" add_token: "Nahrát podpůrný token Enterprise Edition" @@ -94,13 +94,13 @@ cs: cancelled_due_to: "Job was cancelled due to error: %{message}" ldap_auth_sources: technical_warning_html: | - This LDAP form requires technical knowledge of your LDAP / Active Directory setup. + Tento LDAP formulář vyžaduje technické znalosti nastavení LDAP / Active Directory.
- Please visit our documentation for detailed instructions. + Prosím navštivte naši dokumentaci pro podrobné pokyny. attribute_texts: name: Arbitrary name of the LDAP connection - host: LDAP host name or IP address - login_map: The attribute key in LDAP that is used to identify the unique user login. Usually, this will be `uid` or `samAccountName`. + host: LDAP název hostitele nebo IP adresa + login_map: Atribut klíč v LDAP, který se používá k identifikaci jedinečného přihlášení uživatele. Obvykle se jedná o `uid` nebo `samAccountName`. generic_map: The attribute key in LDAP that is mapped to the OpenProject `%{attribute}` attribute admin_map_html: "Optional: The attribute key in LDAP that if present marks the OpenProject user an admin. Leave empty when in doubt." system_user_dn_html: | @@ -126,12 +126,12 @@ cs: If you enable group synchronization for this LDAP connection, users will also be automatically created in OpenProject for synchronized groups. Without it, only existing accounts in OpenProject will be added to groups. connection_encryption: 'Šifrování připojení' - system_account: 'System account' + system_account: 'Systémový účet' system_account_legend: | - OpenProject requires read-only access through a system account to lookup users and groups in your LDAP tree. - Please specify the bind credentials for that system user in the following section. + OpenProject vyžaduje přístup pouze pro čtení prostřednictvím systémového účtu pro vyhledávání uživatelů a skupin ve stromu LDAP. + Zadejte prosím přístupové údaje pro tohoto systémového uživatele v následující sekci. ldap_details: 'Podrobnosti LDAP' - user_settings: 'Attribute mapping' + user_settings: 'Mapování atributů' user_settings_legend: | The following fields are related to how users are created in OpenProject from LDAP entries and what LDAP attributes are used to define the attributes of an OpenProject user (attribute mapping). @@ -539,7 +539,7 @@ cs: invalid_url: 'není platná adresa URL.' invalid_url_scheme: 'není podporovaný protokol (povoleny: %{allowed_schemes}).' less_than_or_equal_to: "musí být menší než nebo rovno %{count}." - not_current_user: "is not the current user." + not_current_user: "není aktuální uživatel." not_a_date: "není platné datum." not_a_datetime: "není platný čas." not_a_number: "není číslo." @@ -1118,7 +1118,7 @@ cs: enumeration_work_package_priorities: "Priority pracovního balíčku" enumeration_reported_project_statuses: "Nahlášený stav projektu" error_auth_source_sso_failed: "Jednotné přihlášení (SSO) pro uživatele '%{value}' selhalo" - error_can_not_archive_project: "This project cannot be archived: %{errors}" + error_can_not_archive_project: "Tento projekt nelze archivovat: %{errors}" error_can_not_delete_entry: "Nelze odstranit položku" error_can_not_delete_custom_field: "Nelze odstranit vlastní pole" error_can_not_delete_type: "Tento typ obsahuje pracovní balíčky a nedá sa odstrániť." @@ -1127,7 +1127,7 @@ cs: error_can_not_remove_role: "Tato role je používána a nelze ji odstranit." error_can_not_reopen_work_package_on_closed_version: "Pracovní balíček v uzavřené verzi nemůže být znovu otevřen" error_can_not_find_all_resources: "Nelze najít všechny související zdroje k tomuto požadavku." - error_can_not_unarchive_project: "This project cannot be unarchived: %{errors}" + error_can_not_unarchive_project: "Tento projekt nemůže být odarchivován: %{errors}" error_check_user_and_role: "Vyberte uživatele a roli." error_code: "Chyba %{code}" error_cookie_missing: 'OpenProject cookie chybí. Ujistěte se, že jsou soubory cookie povoleny, protože aplikace nebude správně fungovat.' @@ -1187,7 +1187,7 @@ cs: pdf_with_descriptions_and_attachments: "PDF s popisky a přílohami" pdf_with_attachments: "PDF s přílohami" image: - omitted: "Image not exported." + omitted: "Obrázek nebyl exportován." extraction: available: pdftotext: "Pdftotext k dispozici (volitelné)" @@ -1230,6 +1230,8 @@ cs: blog: "OpenProject blog" forums: "Komunitní fórum" newsletter: "Bezpečnostní upozornění / newsletter" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "The changes were retracted." links: @@ -1766,25 +1768,25 @@ cs: label_workflow_plural: "Pracovní vrstvy" label_workflow_summary: "Souhrn" label_x_closed_work_packages_abbr: - zero: "0 closed" + zero: "0 uzavřeno" one: "1 uzavřen" few: "%{count} uzavřeny" many: "%{count} uzavřeny" other: "%{count} uzavřeny" label_x_comments: - zero: "no comments" + zero: "žádné komentáře" one: "1 komentář" few: "%{count} komentářů" many: "%{count} komentářů" other: "%{count} komentářů" label_x_open_work_packages_abbr: - zero: "0 open" + zero: "0 otevřených" one: "1 otevřený" few: "%{count} otevřených" many: "%{count} otevřených" other: "%{count} otevřených" label_x_projects: - zero: "no projects" + zero: "Žádné projekty" one: "1 projekt" few: "%{count} projektů" many: "%{count} projektů" @@ -1830,14 +1832,14 @@ cs: mail_body_register_closing: "Your OpenProject team" mail_body_register_ending: "Stay connected! Kind regards," mail_body_reminder: "%{count} pracovních balíčků, které máte přiřazeny, mají termín během následujících %{days} dnů:" - mail_body_group_reminder: "%{count} work package(s) that are assigned to group \"%{group}\" are due in the next %{days} days:" + mail_body_group_reminder: "%{count} pracovních balíčků, které jsou přiřazeny ke skupině \"%{group}\", má termín splatnosti během následujících %{days} dnů:" mail_body_wiki_content_added: "Wiki stránka '%{id}' byla přidána uživatelem %{author}." mail_body_wiki_content_updated: "Wiki stránka '%{id}' byla aktualizována uživatelem %{author}." mail_subject_account_activation_request: "Žádost o aktivaci účtu %{value}" mail_subject_lost_password: "Vaše heslo %{value}" mail_subject_register: "Aktivace vašeho účtu %{value}" mail_subject_reminder: "%{count} pracovních balíčků s termínem do dalších %{days} dnů" - mail_subject_group_reminder: "For group \"%{group}\" %{count} work package(s) due in the next %{days} days" + mail_subject_group_reminder: "Pro skupinu \"%{group}\" %{count} pracovních balíčků splatných během následujících %{days} dnů" mail_subject_wiki_content_added: "'%{id}' wiki stránka byla přidána" mail_subject_wiki_content_updated: "'%{id}' wiki stránka byla aktualizována" mail_user_activation_limit_reached: diff --git a/config/locales/crowdin/da.yml b/config/locales/crowdin/da.yml index 5a3d9ab340..1fb9484015 100644 --- a/config/locales/crowdin/da.yml +++ b/config/locales/crowdin/da.yml @@ -1198,6 +1198,8 @@ da: blog: "OpenProject blog" forums: "Community forum" newsletter: "Security alerts / Newsletter" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "The changes were retracted." links: diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml index f40aebf953..aa135c5059 100644 --- a/config/locales/crowdin/de.yml +++ b/config/locales/crowdin/de.yml @@ -33,13 +33,13 @@ de: colors: alternative-color: "Alternativ" content-link-color: "Link-Schriftfarbe" - primary-color: "Primär" - primary-color-dark: "Primär (dunkel)" + primary-color: "Primärfarbe" + primary-color-dark: "Primärfarbe (dunkel)" header-bg-color: "Hintergrund der Kopfzeile" header-item-bg-hover-color: "Hintergrund der Kopfzeile bei Hover" header-item-font-color: "Textfarbe der Kopfzeile" header-item-font-hover-color: "Textfarbe der Kopfzeile bei Hover" - header-border-bottom-color: "Header border" + header-border-bottom-color: "Rahmenfarbe der Kopfzeile" main-menu-bg-color: "Hintergrundfarbe des Hauptmenüs" main-menu-bg-selected-background: "Hintergrundfarbe des Hauptmenüs bei Auswahl" main-menu-bg-hover-background: "Hintergrundfarbe des Hauptmenüs bei Hover" @@ -52,7 +52,7 @@ de: enterprise_notice: "Als ein besonderes Dankeschön für Ihre finanzielle Unterstützung in der Entwicklung von OpenProject ist diese Funktionalität nur in Verknüpfung mit einem Enterprise-Edition Abonnement verfügbar." manage_colors: "Farbauswahloptionen bearbeiten" instructions: - alternative-color: "Starken Akzentfarbe, wird normalerweise für die wichtigste Schaltfläche auf dem Bildschirm verwendet." + alternative-color: "Starke Akzentfarbe, wird normalerweise für die wichtigste Schaltfläche auf dem Bildschirm verwendet." content-link-color: "Schriftfarbe der meisten Links." primary-color: "Hauptfarbe." primary-color-dark: "In der Regel wird eine dunklere Version der Hauptfarbe für Hover-Effekte verwendet." @@ -96,13 +96,13 @@ de: technical_warning_html: | Dieses LDAP-Formular erfordert technische Kenntnisse ihres LDAP-/Active Directory Setups.
- Bitte besuchen Sie unsere Dokumentation für detaillierte Anweisungen. + Bitte rufen Sie für eine detaillierte Anleitung unsere Dokumentation auf. attribute_texts: name: Beliebiger Name der LDAP-Verbindung - host: LDAP Hostname oder IP-Adresse - login_map: Der Attributschlüssel in LDAP, der benutzt wird, um die eindeutige Benutzeranmeldung zu identifizieren. Normalerweise wird dies `uid` oder `samAccountName` sein. + host: LDAP-Hostname oder IP-Adresse + login_map: Der Attributschlüssel in LDAP, der benutzt wird, um die eindeutige Benutzeranmeldung zu identifizieren. Normalerweise ist das `uid` oder `samAccountName`. generic_map: Der Attributschlüssel in LDAP, der dem OpenProject `%{attribute}` Attribut zugeordnet ist - admin_map_html: "Optional: Der Attributenschlüssel in LDAP der, falls vorhanden, den OpenProject Nutzer als einen Administrator makiert. \nIm Zweifel leer lassen." + admin_map_html: "Optional: Der Attributschlüssel in LDAP der, falls vorhanden, den OpenProject-Nutzer als einen Administrator markiert. \nIm Zweifel leer lassen." system_user_dn_html: | Geben Sie den DN des Systembenutzers ein, der für schreibgeschützten Zugriff verwendet wird.
@@ -126,7 +126,7 @@ de: connection_encryption: 'Verbindungsverschlüsselung' system_account: 'Systemkonto' system_account_legend: | - OpenProject benötigt lesenden Zugriff über ein LDAP Systemkonto, um Benutzer und Gruppen in Ihrem LDAP-Baum zu suchen. + OpenProject benötigt lesenden Zugriff über ein LDAP-Systemkonto, um Benutzer und Gruppen in Ihrem LDAP-Baum zu suchen. Bitte geben Sie die Anmeldedaten für den Systembenutzer im folgenden Abschnitt an. ldap_details: 'LDAP-Details' user_settings: 'Zuordnen von Attributen' @@ -532,7 +532,7 @@ de: invalid_url: 'ist keine gültige URL.' invalid_url_scheme: 'ist kein unterstütztes Protokoll (erlaubt: %{allowed_schemes}).' less_than_or_equal_to: "muss kleiner oder gleich %{count} sein." - not_current_user: "is not the current user." + not_current_user: "ist nicht der aktuelle Benutzer." not_a_date: "ist kein gültiges Datum." not_a_datetime: "ist kein gültiges Datum." not_a_number: "ist keine Zahl." @@ -1193,6 +1193,8 @@ de: blog: "OpenProject Blog" forums: "Community Forum" newsletter: "Sicherheitswarnungen / Newsletter" + image_conversion: + imagemagick: 'ImageMagick' journals: changes_retracted: "Die Änderungen wurden zurückgezogen." links: @@ -1368,7 +1370,7 @@ de: label_enterprise_active_users: "%{current}/%{limit} gebuchte aktive Nutzer" label_enterprise_edition: "Enterprise-Edition" label_environment: "Umgebung" - label_estimates_and_time: "Schätzungen & Zeit" + label_estimates_and_time: "Schätzungen & Zeiten" label_equals: "ist" label_everywhere: "überall" label_example: "Beispiel" diff --git a/config/locales/crowdin/el.yml b/config/locales/crowdin/el.yml index 2e60fc9928..51705800e6 100644 --- a/config/locales/crowdin/el.yml +++ b/config/locales/crowdin/el.yml @@ -1195,6 +1195,8 @@ el: blog: "OpenProject blog" forums: "Φόρουμ κοινότητας" newsletter: "Ειδοποιήσεις ασφάλεια / Ενημερωτικό δελτίο" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "Οι αλλαγές αποσύρθηκαν." links: diff --git a/config/locales/crowdin/es.yml b/config/locales/crowdin/es.yml index 93e3337c6a..1866546e30 100644 --- a/config/locales/crowdin/es.yml +++ b/config/locales/crowdin/es.yml @@ -1195,6 +1195,8 @@ es: blog: "Blog de OpenProject" forums: "Foro de la comunidad" newsletter: "Alertas de seguridad / boletín" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "Se deshicieron los cambios." links: diff --git a/config/locales/crowdin/fi.yml b/config/locales/crowdin/fi.yml index c268d9bc0f..186b5c9bfd 100644 --- a/config/locales/crowdin/fi.yml +++ b/config/locales/crowdin/fi.yml @@ -1198,6 +1198,8 @@ fi: blog: "OpenProject blogi" forums: "Keskustelupalsta" newsletter: "Suojausvaroitukset / uutiskirje" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "The changes were retracted." links: diff --git a/config/locales/crowdin/fil.yml b/config/locales/crowdin/fil.yml index 4db96c75f4..2b1f99ae95 100644 --- a/config/locales/crowdin/fil.yml +++ b/config/locales/crowdin/fil.yml @@ -1198,6 +1198,8 @@ fil: blog: "Blog ng OpenProject" forums: "Komunidad forum" newsletter: "Mga alertong seguridad/ Newsletter" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "The changes were retracted." links: diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml index c865285e49..32ea04d679 100644 --- a/config/locales/crowdin/fr.yml +++ b/config/locales/crowdin/fr.yml @@ -536,7 +536,7 @@ fr: invalid_url: 'n’est pas une URL valide.' invalid_url_scheme: 'n’est pas un protocole pris en charge (autorisés : %{allowed_schemes}).' less_than_or_equal_to: "doit être inférieur ou égal à %{count}." - not_current_user: "is not the current user." + not_current_user: "n'est pas l'utilisateur actuel." not_a_date: "n'est pas une date valide." not_a_datetime: "n'est pas une heure valide." not_a_number: "n'est pas un nombre." @@ -1197,6 +1197,8 @@ fr: blog: "Blog OpenProject" forums: "Forum de la communauté" newsletter: "Alertes de sécurité / Lettre d’information" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "Les modifications ont été retirées." links: diff --git a/config/locales/crowdin/hr.yml b/config/locales/crowdin/hr.yml index 842c5191dd..cb0c0c8688 100644 --- a/config/locales/crowdin/hr.yml +++ b/config/locales/crowdin/hr.yml @@ -1214,6 +1214,8 @@ hr: blog: "OpenProject blog" forums: "Forum Zajednice" newsletter: "Security alerts / Newsletter" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "The changes were retracted." links: diff --git a/config/locales/crowdin/hu.yml b/config/locales/crowdin/hu.yml index b84028911d..3b25d5450e 100644 --- a/config/locales/crowdin/hu.yml +++ b/config/locales/crowdin/hu.yml @@ -1195,6 +1195,8 @@ hu: blog: "OpenProject blog" forums: "Közösségi fórum" newsletter: "Biztonsági figyelmeztetések / hírlevél" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "The changes were retracted." links: diff --git a/config/locales/crowdin/id.yml b/config/locales/crowdin/id.yml index 5c5ebf1f3b..f9abcbaad8 100644 --- a/config/locales/crowdin/id.yml +++ b/config/locales/crowdin/id.yml @@ -1181,6 +1181,8 @@ id: blog: "OpenProject blog" forums: "Community forum" newsletter: "Peringatan keamanan / Jurnal berkala" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "The changes were retracted." links: diff --git a/config/locales/crowdin/it.yml b/config/locales/crowdin/it.yml index fc65b6c44b..b75747231c 100644 --- a/config/locales/crowdin/it.yml +++ b/config/locales/crowdin/it.yml @@ -1194,6 +1194,8 @@ it: blog: "Blog di OpenProject" forums: "Forum della Comunità" newsletter: "Avvisi di sicurezza / Notizie" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "Le modifiche sono state annullate." links: diff --git a/config/locales/crowdin/ja.yml b/config/locales/crowdin/ja.yml index a3145d7c35..703b8a357c 100644 --- a/config/locales/crowdin/ja.yml +++ b/config/locales/crowdin/ja.yml @@ -1177,6 +1177,8 @@ ja: blog: "OpenProject ブログ" forums: "コミュニティ フォーラム" newsletter: "セキュリティアラート / ニュースレター" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "The changes were retracted." links: diff --git a/config/locales/crowdin/js-de.yml b/config/locales/crowdin/js-de.yml index 29ee61c522..e8eae03b3e 100644 --- a/config/locales/crowdin/js-de.yml +++ b/config/locales/crowdin/js-de.yml @@ -271,7 +271,7 @@ de: standard: learn_about_link: https://www.openproject.org/openproject-11-0-release current_new_feature_html: > - Die Version enthält zahlreiche neue Funktionen und Verbesserungen:
  • Top-Down-Planung um alle Projektaufgaben zu definieren. Dabei sind die Anfangs- und Enddaten eines Elternelements unabhängig von den Daten der Unteraufgaben.
  • Vielseitige agile Boards ermöglichen Ihnen die Erstellung eines Projektstrukturplans oder die Verteilung von Aufgaben auf Unterprojekte.
  • Projektvorlagen zur einfachen Erstellung neuer Projekte.
  • Konfiguration der Projektseite ermöglicht ein besseres Projektportfolio-Management.
+ Die Version enthält zahlreiche neue Funktionen und Verbesserungen:
  • Top-Down-Planung um alle Projektaufgaben zu definieren. Dabei sind die Anfangs- und Enddaten eines Elternelements unabhängig von den Daten der Unteraufgaben.
  • Vielseitige agile Boards ermöglichen Ihnen die Erstellung eines Projektstrukturplans oder die Verteilung von Aufgaben auf Unterprojekte.
  • Projektvorlagen zur einfachen Erstellung neuer Projekte.
  • Die Konfiguration der Projektseite ermöglicht ein besseres Projektportfolio-Management.
bim: learn_about_link: "https://www.openproject.org/openproject-bim-10-5\n" current_new_feature_html: > @@ -477,7 +477,7 @@ de: drag: 'Ziehen Sie Ihre Karten in eine Liste, um diese zu sortieren oder weisen Sie diese einer anderen Liste zu. Ein Doppelklick auf eine Karte öffnet die Detailansicht.' wp: toggler: "Hier sind die Arbeitspakete, die Ihnen eine detailliertere Sicht auf die Arbeit in Ihrem Projekt geben." - list: 'Dies ist die Liste der wichtigen Arbeitspakete in Ihrem Projekt, z.B. Aufgaben, Funktionen, Meilensteine, Fehler, und Vieles mehr.
Sie können neue Arbeitspakete direkt in der Liste anlegen und bearbeiten. Ein Doppelklick auf die Zeile öffnet die Detailansicht.' + list: 'Dies ist die Liste der wichtigen Arbeitspakete in Ihrem Projekt, z.B. Aufgaben, Funktionen, Meilensteine, Fehler, und Vieles mehr.
Sie können neue Arbeitspakete direkt in der Liste anlegen und bearbeiten. Ein Doppelklick auf eine Zeile öffnet die Detailansicht.' full_view: 'In der Arbeitspaket-Detailansicht finden Sie alle wichtigen Informationen, wie Beschreibung, Status und Priorität, Aktivitäten, Abhängigkeiten oder Kommentare.' back_button: 'Mit dem Pfeil kommen Sie zurück in die Listenansicht.' create_button: 'Mit Anlegen Können Sie neue Arbeitspakete Ihrem Projekt hinzufügen.' @@ -740,7 +740,7 @@ de: property_groups: details: "Details" people: "Personen" - estimatesAndTime: "Schätzungen & Zeit" + estimatesAndTime: "Schätzungen & Zeiten" other: "Andere" properties: assignee: "Zugewiesen an" diff --git a/config/locales/crowdin/js-sv.yml b/config/locales/crowdin/js-sv.yml index 47bee8abe1..36342de155 100644 --- a/config/locales/crowdin/js-sv.yml +++ b/config/locales/crowdin/js-sv.yml @@ -170,12 +170,12 @@ sv: reset_to_defaults: 'Återställ standardinställningar' enterprise: trial: - confirmation: "Confirmation of email address" + confirmation: "Bekräftelse av e-postadress" confirmation_info: > We sent you an email on %{date} to %{email}. Please check your inbox and click the confirmation link provided to start your 14 days trial. form: general_consent: > - I agree with the terms of service and the privacy policy. + Jag godkänner användarvillkoren och integritetspolicyn. invalid_email: "Invalid email address" label_company: "Company" label_first_name: "Förnamn" @@ -213,11 +213,11 @@ sv: premium_features_text: "Agile boards, custom theme and logo, graphs, intelligent workflows with custom actions, full text search for work package attachments and multi-select custom fields." professional_support: "Professionell hjälp" professional_support_text: "Get reliable, high-touch support from senior support engineers with expert knowledge about running OpenProject in business-critical environments." - button_start_trial: "Start free trial" - button_book_now: "Book now" + button_start_trial: "Starta fri provperiod" + button_book_now: "Boka nu" confidence: > We deliver the confidence of a tested and supported enterprise-class project management software - with Open Source and an open mind. - link_quote: "Get a quote" + link_quote: "Få en offert" text: > The OpenProject Enterprise Edition builds on top of the Community Edition. It includes premium features and professional support mainly aimed at organizations with more than 10 users that manage business critical projects with OpenProject. unlimited: "Unlimited" diff --git a/config/locales/crowdin/ko.yml b/config/locales/crowdin/ko.yml index 64701c37a0..ad70decc85 100644 --- a/config/locales/crowdin/ko.yml +++ b/config/locales/crowdin/ko.yml @@ -535,7 +535,7 @@ ko: invalid_url: '은(는) 올바른 URL이 아닙니다.' invalid_url_scheme: '은(는) 지원되는 프로토콜(허용: %{allowed_schemes})이 아닙니다.' less_than_or_equal_to: "은(는) %{count} 보다 작거나 같아야 합니다" - not_current_user: "is not the current user." + not_current_user: "은(는) 현재 유효한 사용자가 아닙니다." not_a_date: "은(는) 유효한 날짜가 아닙니다." not_a_datetime: "은(는) 유효한 날짜가 아닙니다." not_a_number: "은(는) 숫자가 아닙니다." @@ -615,7 +615,7 @@ ko: queries/filters/base: attributes: values: - inclusion: "filter has invalid values." + inclusion: "필터에 잘못된 값이 있습니다." format: "%{message}" relation: typed_dag: @@ -1181,6 +1181,8 @@ ko: blog: "OpenProject 블로그" forums: "커뮤니티 포럼" newsletter: "보안 알림/뉴스레터" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "변경 사항이 취소되었습니다." links: diff --git a/config/locales/crowdin/lt.yml b/config/locales/crowdin/lt.yml index 583205fbf9..b1729fd635 100644 --- a/config/locales/crowdin/lt.yml +++ b/config/locales/crowdin/lt.yml @@ -534,7 +534,7 @@ lt: invalid_url: 'nėra tinkamas URL.' invalid_url_scheme: 'nėra palaikomos protokolas (leidžiamas: %{allowed_schemes}).' less_than_or_equal_to: "turi būti mažesnis arba lygus %{count}." - not_current_user: "is not the current user." + not_current_user: "nėra dabartinis vartotojas" not_a_date: "nėra tinkama data." not_a_datetime: "nėra tinkama data ir laikas." not_a_number: "nėra skaičius." @@ -1225,6 +1225,8 @@ lt: blog: "OpenProject blogas" forums: "Bendruomenės forumas" newsletter: "Saugos įspėjimai / Naujienos" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "Pakeitimai buvo atšaukti." links: diff --git a/config/locales/crowdin/nl.yml b/config/locales/crowdin/nl.yml index b236e99511..0489b5dbf4 100644 --- a/config/locales/crowdin/nl.yml +++ b/config/locales/crowdin/nl.yml @@ -1198,6 +1198,8 @@ nl: blog: "OpenProject blog" forums: "Gemeenschapsforum" newsletter: "Beveiligingswaarschuwingen / nieuwsbrief" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "The changes were retracted." links: diff --git a/config/locales/crowdin/no.yml b/config/locales/crowdin/no.yml index 534ad4d8cc..5e72a4cef2 100644 --- a/config/locales/crowdin/no.yml +++ b/config/locales/crowdin/no.yml @@ -1198,6 +1198,8 @@ blog: "OpenProject blogg" forums: "Brukerforum" newsletter: "Security alerts / Newsletter" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "The changes were retracted." links: diff --git a/config/locales/crowdin/pl.yml b/config/locales/crowdin/pl.yml index aeae51736b..466109ebd5 100644 --- a/config/locales/crowdin/pl.yml +++ b/config/locales/crowdin/pl.yml @@ -1226,6 +1226,8 @@ pl: blog: "Blog OpenProject" forums: "Forum społeczności" newsletter: "Powiadomienia bezpieczeństwa / Newsletter" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "Zmiany zostały wycofane." links: diff --git a/config/locales/crowdin/pt.yml b/config/locales/crowdin/pt.yml index eabdb18aef..6daa4da34a 100644 --- a/config/locales/crowdin/pt.yml +++ b/config/locales/crowdin/pt.yml @@ -535,7 +535,7 @@ pt: invalid_url: 'não é um URL válido.' invalid_url_scheme: 'não é um protocolo suportado (permitidos: %{allowed_schemes}).' less_than_or_equal_to: "deve ser menor ou igual a %{count}." - not_current_user: "is not the current user." + not_current_user: "não é o usuário atual." not_a_date: "não é uma data válida." not_a_datetime: "não é uma data/hora válida." not_a_number: "não é um número." @@ -1196,6 +1196,8 @@ pt: blog: "Blog do OpenProject" forums: "Fórum da Comunidade" newsletter: "Alertas de segurança / Newsletter" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "As mudanças foram retraídas." links: diff --git a/config/locales/crowdin/ro.yml b/config/locales/crowdin/ro.yml index d6f551dc05..67967a2034 100644 --- a/config/locales/crowdin/ro.yml +++ b/config/locales/crowdin/ro.yml @@ -538,7 +538,7 @@ ro: invalid_url: 'nu este o adresa URL validă.' invalid_url_scheme: 'nu este un protocol permis (allowed: %{allowed_schemes}).' less_than_or_equal_to: "trebuie să fie mai mic sau egal cu %{count}." - not_current_user: "is not the current user." + not_current_user: "nu este utilizatorul curent." not_a_date: "is not a valid date." not_a_datetime: "is not a valid date time." not_a_number: "nu este un număr." @@ -1214,6 +1214,8 @@ ro: blog: "Blog-ul OpenProject" forums: "Forum comunitate" newsletter: "Security alerts / Newsletter" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "The changes were retracted." links: diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml index 885d5ec261..81b143ba79 100644 --- a/config/locales/crowdin/ru.yml +++ b/config/locales/crowdin/ru.yml @@ -1229,6 +1229,8 @@ ru: blog: "Openproject блог" forums: "Форум сообщества" newsletter: "Оповещения системы безопасности / Новости" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "Изменения отменены." links: diff --git a/config/locales/crowdin/sk.yml b/config/locales/crowdin/sk.yml index 13bda17d1a..9195322f95 100644 --- a/config/locales/crowdin/sk.yml +++ b/config/locales/crowdin/sk.yml @@ -1230,6 +1230,8 @@ sk: blog: "OpenProject blog" forums: "Komunitné fórum" newsletter: "Bezpečnostné upozornenia / Newsletter" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "The changes were retracted." links: diff --git a/config/locales/crowdin/sl.yml b/config/locales/crowdin/sl.yml index c737bc616a..01ff051228 100644 --- a/config/locales/crowdin/sl.yml +++ b/config/locales/crowdin/sl.yml @@ -1228,6 +1228,8 @@ sl: blog: "Blog OpenProject" forums: "Forum skupnosti" newsletter: "Varnostna opozorila / Glasilo" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "Spremembe so bile umaknjene." links: diff --git a/config/locales/crowdin/sv.yml b/config/locales/crowdin/sv.yml index a87831f246..bb97533d55 100644 --- a/config/locales/crowdin/sv.yml +++ b/config/locales/crowdin/sv.yml @@ -63,16 +63,16 @@ sv: main-menu-bg-color: "Bakgrundsfärg på den vänstra sidomenyn." theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue? enterprise: - upgrade_to_ee: "Upgrade to the Enterprise Edition" + upgrade_to_ee: "33 / 5000\nUppgradera till Enterprise Edition" add_token: "Ladda upp en Enterprise Edition support-nyckel" replace_token: "Ersätta din nuvarande support-nyckel" order: "Beställ Enterprise Edition" paste: "Klistra in din Enterprise Edition support-nyckel" required_for_feature: "Denna funktion är endast tillgänglig med en aktiv Enterprise Edition support-nyckel." enterprise_link: "För mer information, klicka här." - start_trial: 'Start free trial' - book_now: 'Book now' - get_quote: 'Get a quote' + start_trial: 'Starta fri provperiod' + book_now: 'Boka nu' + get_quote: 'Få en offert' announcements: show_until: Visa fram till is_active: visas för tillfället @@ -1197,11 +1197,13 @@ sv: blog: "OpenProject blogg" forums: "Community forum" newsletter: "Säkerhetsnotifieringar / Nyhetsbrev" + image_conversion: + imagemagick: 'Imagemagick' journals: - changes_retracted: "The changes were retracted." + changes_retracted: "Förändringarna drogs tillbaka." links: configuration_guide: 'Konfigurationsguide' - get_in_touch: "You have questions? Get in touch with us." + get_in_touch: "Har du frågor? Ta kontakt med oss." instructions_after_registration: "Du kan logga in så snart ditt konto har aktiverats genom att klicka på %{signin}." instructions_after_logout: "Du kan logga in igen genom att klicka på %{signin}." instructions_after_error: "Du kan försöka logga in igen genom att klicka på %{signin}. Om felet kvarstår, be din systemadministratör om hjälp." @@ -2563,7 +2565,7 @@ sv: mail_self_notified: "Jag vill bli meddelad om ändringar som jag själv gör" status_user_and_brute_force: "%{user} och %{brute_force}" status_change: "Statusändring" - text_change_disabled_for_provider_login: "The name is set by your login provider and can thus not be changed." + text_change_disabled_for_provider_login: "Namnet är satt av din inloggningsleverantör och kan därför inte ändras." unlock: "Lås upp" unlock_and_reset_failed_logins: "Lås upp och nollställ misslyckade inloggningsförsök" version_status_closed: "stängt" diff --git a/config/locales/crowdin/tr.yml b/config/locales/crowdin/tr.yml index 310b70b283..d4f026865e 100644 --- a/config/locales/crowdin/tr.yml +++ b/config/locales/crowdin/tr.yml @@ -1198,6 +1198,8 @@ tr: blog: "OpenProject blog" forums: "Topluluk forumu" newsletter: "Güvenlik uyarıları / haber bülteni" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "Değişiklikler geri çekildi." links: diff --git a/config/locales/crowdin/uk.yml b/config/locales/crowdin/uk.yml index f790cbe304..9b1ed68512 100644 --- a/config/locales/crowdin/uk.yml +++ b/config/locales/crowdin/uk.yml @@ -1230,6 +1230,8 @@ uk: blog: "Openproject блог" forums: "Форум спільноти" newsletter: "Сигнали безпеки / Інформаційний бюлетень" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "The changes were retracted." links: diff --git a/config/locales/crowdin/vi.yml b/config/locales/crowdin/vi.yml index df51075a87..f3111c512d 100644 --- a/config/locales/crowdin/vi.yml +++ b/config/locales/crowdin/vi.yml @@ -1184,6 +1184,8 @@ vi: blog: "OpenProject blog" forums: "Diễn đàn cộng đồng" newsletter: "Security alerts / Newsletter" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "Những thay đổi đã bị rút lại" links: diff --git a/config/locales/crowdin/zh-CN.yml b/config/locales/crowdin/zh-CN.yml index e862f89876..0563c1044b 100644 --- a/config/locales/crowdin/zh-CN.yml +++ b/config/locales/crowdin/zh-CN.yml @@ -1177,6 +1177,8 @@ zh-CN: blog: "OpenProject 博客" forums: "社区论坛" newsletter: "安全警报/通信" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "更改已撤回。" links: diff --git a/config/locales/crowdin/zh-TW.yml b/config/locales/crowdin/zh-TW.yml index 47333c356a..53e61a3272 100644 --- a/config/locales/crowdin/zh-TW.yml +++ b/config/locales/crowdin/zh-TW.yml @@ -1182,6 +1182,8 @@ zh-TW: blog: "Openproject 部落格" forums: "社群論壇" newsletter: "安全警報 / 消息" + image_conversion: + imagemagick: 'Imagemagick' journals: changes_retracted: "The changes were retracted." links: diff --git a/config/locales/en.yml b/config/locales/en.yml index d097951cb1..143415cd8c 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -1238,6 +1238,9 @@ en: forums: "Community forum" newsletter: "Security alerts / Newsletter" + image_conversion: + imagemagick: 'Imagemagick' + journals: changes_retracted: "The changes were retracted." diff --git a/db/migrate/20201125121949_remove_renamed_cron_job.rb b/db/migrate/20201125121949_remove_renamed_cron_job.rb new file mode 100644 index 0000000000..2dbd65d8dd --- /dev/null +++ b/db/migrate/20201125121949_remove_renamed_cron_job.rb @@ -0,0 +1,40 @@ +#-- encoding: UTF-8 + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) 2012-2020 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-2017 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 docs/COPYRIGHT.rdoc for more details. +#++ + +class RemoveRenamedCronJob < ActiveRecord::Migration[6.0] + def up + # The job has been renamed to JobStatus::Cron::ClearOldJobStatusJob + # the new job will be added on restarting the application but the old will still be in the database + # and will cause 'uninitialized constant' errors. + Delayed::Job + .where('handler LIKE ?', "%job_class: Cron::ClearOldJobStatusJob%") + .delete_all + end +end diff --git a/docker/setup/preinstall-common.sh b/docker/setup/preinstall-common.sh index 56ce61d3fb..19887ea131 100755 --- a/docker/setup/preinstall-common.sh +++ b/docker/setup/preinstall-common.sh @@ -18,7 +18,8 @@ apt-get install -y \ tesseract-ocr \ catdoc \ postgresql-9.6 \ - postgresql-client-9.6 + postgresql-client-9.6 \ + imagemagick rm -rf "$PGDATA_LEGACY" diff --git a/docs/development/create-openproject-plugin/README.md b/docs/development/create-openproject-plugin/README.md index 9651f05c60..94b4c3ba04 100644 --- a/docs/development/create-openproject-plugin/README.md +++ b/docs/development/create-openproject-plugin/README.md @@ -42,7 +42,7 @@ bundle install You may have a look at some existing OpenProject plugins to get inspiration. It is possible to add new routes, views, models, … and/or overwrite existing ones. -Feel free to ask for help in our [Development Forum](https://community.openproject.org/projects/openproject/boards/7). +Feel free to ask for help in our [Development Forum](https://community.openproject.com/projects/openproject/forums/7). ## Steps to release a plugin @@ -62,7 +62,7 @@ A code review should check the whole code and remove glitches like: Usually, this should be GPLv3 and we are the copyright owner. However, some plugins might have additional authors or might originate from code with a different license. These issues have to be resolved first. Also check the years in the copyright. If you need to find all contributors of a repository including their contribution period use the following rake task: ```bash rake copyright:authors:show['../Path/to/repository/'] -``` + ``` 2. Add a copyright notice to all the source files @@ -126,9 +126,9 @@ It is probably best to use READMEs of already released plugins as a template. 1. Make the github repository public. 2. Make the plugin project public. - Do a little cleanup work first by removing modules not needed. Currently, - Activity, Issue Tracking, Time Tracking, Forums, and Backlogs are default. - Also, the My Project Page should only show Project Description and Tickets blocks. + Do a little cleanup work first by removing modules not needed. Currently, + Activity, Issue Tracking, Time Tracking, Forums, and Backlogs are default. + Also, the My Project Page should only show Project Description and Tickets blocks. 3. Create a news article about the newly released plugin and its features. 4. Twitter with a link to the news article. 5. If the plugin is referenced in our feature tour, add a download link to the plugin in the feature tour diff --git a/docs/development/security/README.md b/docs/development/security/README.md index f59b3462a4..348ae8d0fa 100644 --- a/docs/development/security/README.md +++ b/docs/development/security/README.md @@ -34,14 +34,10 @@ Please include a description on how to reproduce the issue if possible. Our secu OpenProject administrators can enforce [authentication mechanisms and password rules]() to ensure users choose secure passwords according to current industry standards. Passwords stored by OpenProject are securely stored using salted bcrypt. Alternatively, external authentication providers and protocols (such as LDAP, SAML) can be enforced to avoid using and exposing passwords within OpenProject. -### Two-step user registration - -In compliance with common requirements in works committees, ensure that new users added by project responsibles are confirmed by a superior before allowing the user to enter the system for the first time. - ### User management and access control. Administrators are provided with [fine-grained role-based access control mechanisms]() to ensure that users are only seeing and accessing the data they are allowed to on an individual project level. ### Two-Factor authentication. (Cloud or Enterprise Edition) -Secure your authentication mechanisms with a second factor by TOTP standard (or SMS, depending on your instance) to be entered by users upon logging in. [More information](). \ No newline at end of file +Secure your authentication mechanisms with a second factor by TOTP standard (or SMS, depending on your instance) to be entered by users upon logging in. [More information](). diff --git a/docs/getting-started/my-account/README.md b/docs/getting-started/my-account/README.md index e898222f98..6abfe4190e 100644 --- a/docs/getting-started/my-account/README.md +++ b/docs/getting-started/my-account/README.md @@ -4,7 +4,7 @@ sidebar_navigation: priority: 400 description: Learn how to configure account settings. robots: index, follow -keywords: my account, account settings +keywords: my account, account settings, change language --- # My Account @@ -16,7 +16,7 @@ Change your personal settings in My Account. Here you can adapt, e.g. the langua | [Open My Account settings](#open-my-account-settings) | How to open your personal settings in OpenProject? | | [Change password](#change-password) | How to change my password? | | [Edit your user information](#edit-your-user-information) | How to change the name or email address in OpenProject? | -| [Profile settings: change your language, time zone or display of comments](#profile-settings:-change-your-language,-time-zone-or-display-of-comments) | How to change the language, time zone or display of comments in OpenProject? | +| [Profile settings: change your language, time zone or display of comments](#profile-settings) | How to change the language, time zone or display of comments in OpenProject? | | [Two-factor authentication](#two-factor-authentication-premium-feature) | How to set up a two-factor authentication? | | [Email notifications](#email-notifications) | How to change email notifications sent by OpenProject? | | [Set an Avatar](#set-an-avatar) | How to set an Avatar in OpenProject and change the profile picture? | diff --git a/docs/getting-started/sign-in-registration/README.md b/docs/getting-started/sign-in-registration/README.md index 8a47d2b2e8..e0cda7f815 100644 --- a/docs/getting-started/sign-in-registration/README.md +++ b/docs/getting-started/sign-in-registration/README.md @@ -1,11 +1,10 @@ ---- sidebar_navigation: title: Sign in and registration priority: 990 description: Sign in and registration in OpenProject. robots: index, follow keywords: sing in, login, registration ---- + # Sign in and registration Here you will get an overview how to sign in and register to an existing OpenProject installation. diff --git a/docs/installation-and-operations/installation/manual/README.md b/docs/installation-and-operations/installation/manual/README.md index 14a1e41b2a..5cd78d8d02 100644 --- a/docs/installation-and-operations/installation/manual/README.md +++ b/docs/installation-and-operations/installation/manual/README.md @@ -49,7 +49,8 @@ sudo passwd openproject #(enter desired password) libncurses5-dev automake \ libtool bison libffi-dev git curl \ poppler-utils unrtf tesseract-ocr catdoc \ - libxml2 libxml2-dev libxslt1-dev # nokogiri + libxml2 libxml2-dev libxslt1-dev # nokogiri \ + imagemagick ``` ## Install the caching server (memcached) diff --git a/docs/installation-and-operations/misc/custom-openid-connect-providers/README.md b/docs/installation-and-operations/misc/custom-openid-connect-providers/README.md index bc5662e411..beac5dd899 100644 --- a/docs/installation-and-operations/misc/custom-openid-connect-providers/README.md +++ b/docs/installation-and-operations/misc/custom-openid-connect-providers/README.md @@ -62,3 +62,5 @@ After you are done you can leave the console by entering `exit`. Once this is done you will see an "Okta" button in the bottom area of the login form. Clicking on it will start the login process. + +_**Note**: This is an Enterprise Edition feature. If you do not see the button you will have to activate the Enterprise Edition first._ diff --git a/docs/installation-and-operations/operation/faq/README.md b/docs/installation-and-operations/operation/faq/README.md index aa6ecd4d00..89737c9cca 100644 --- a/docs/installation-and-operations/operation/faq/README.md +++ b/docs/installation-and-operations/operation/faq/README.md @@ -6,7 +6,7 @@ sidebar_navigation: # Frequently asked questions - FAQ -## I lost access to my admin account, how to I reset my password? +## I lost access to my admin account, how do I reset my password? You can reset your admin account through the Rails console. [Please see this separate page on how to start the console](https://docs.openproject.org/installation-and-operations/operation/control/). diff --git a/docs/release-notes/11-0-4/README.md b/docs/release-notes/11-0-4/README.md new file mode 100644 index 0000000000..58f09ed623 --- /dev/null +++ b/docs/release-notes/11-0-4/README.md @@ -0,0 +1,28 @@ +--- +title: OpenProject 11.0.4 +sidebar_navigation: + title: 11.0.4 +release_version: 11.0.4 +release_date: 2020-12-03 +--- + +# OpenProject 11.0.4 + +We released [OpenProject 11.0.4](https://community.openproject.com/versions/1458). +The release contains several bug fixes and we recommend updating to the newest version. + + +#### Bug fixes and changes + +- Fixed: Budgets Fail to Copy due to Missing Superclass Method \[[#34966](https://community.openproject.com/wp/34966)\] +- Fixed: Selected design / theme lost when switching to "Backlogs" module \[[#34968](https://community.openproject.com/wp/34968)\] +- Fixed: Initially seeded homepage grid cannot be edited \[[#35266](https://community.openproject.com/wp/35266)\] +- Fixed: [Translation][German] Administration>User&Permissions>Roles \[[#35363](https://community.openproject.com/wp/35363)\] +- Fixed: Internal error (500) on meeting history page when clicking on previous version link \[[#35433](https://community.openproject.com/wp/35433)\] + +#### Contributions +A big thanks to community members for reporting bugs and helping us identifying and providing fixes. + +Special thanks for reporting and finding bugs go to + +Boris Lukashev, Benjamin Bädorf, Frank Schmid diff --git a/docs/release-notes/8-0-0/README.md b/docs/release-notes/8-0-0/README.md index cf00b49c2c..3bc7185fb6 100644 --- a/docs/release-notes/8-0-0/README.md +++ b/docs/release-notes/8-0-0/README.md @@ -155,7 +155,3 @@ perform the upgrade. [Please visit our upgrade guides for more information](https://www.openproject.org/operations/upgrading/). - -  - - diff --git a/docs/release-notes/README.md b/docs/release-notes/README.md index c2615d5450..7bb740920a 100644 --- a/docs/release-notes/README.md +++ b/docs/release-notes/README.md @@ -12,6 +12,13 @@ Stay up to date and get an overview of the new features included in the releases +## 11.0.4 + +Release date: 2020-12-03 + +[Release Notes](11-0-4/) + + ## 11.0.3 Release date: 2020-11-16 diff --git a/docs/system-admin-guide/authentication/ldap-authentication/ldap-group-synchronization/README.md b/docs/system-admin-guide/authentication/ldap-authentication/ldap-group-synchronization/README.md index 4e68d42088..7d1945c283 100644 --- a/docs/system-admin-guide/authentication/ldap-authentication/ldap-group-synchronization/README.md +++ b/docs/system-admin-guide/authentication/ldap-authentication/ldap-group-synchronization/README.md @@ -1,7 +1,7 @@ --- sidebar_navigation: title: LDAP group synchronization - priority: + priority: description: Synchronize LDAP groups. robots: index, follow keywords: synchronize ldap groups @@ -35,7 +35,7 @@ LDAP group synchronization augments the memberships defined by administrators i In order to get to the LDAP group sync administration pane, expand the LDAP authentication menu item in your administration. - + ### Define group base and key settings @@ -43,7 +43,7 @@ In order for the LDAP groups plugin to locate your group entries, you first need ![LDAP group synchronization settings](Bildschirmfoto-2018-02-01-um-16.41.26.png)LDAP group synchronization settings - + ### Create a synchronized group @@ -51,4 +51,11 @@ To create a new synchronized group, use the button on the top right of the page The *entry* *identifier* field corresponds to the value of the group key, e.g. **groupA** for our first exemplary group. -Click on *Create* to finish the creation of the synchronized group. The LDAP memberships of each user will be synchronized hourly through a cron job on your packaged installation. Changes and output will be logged to */var/log/openproject/cron-hourly.log*. \ No newline at end of file +Click on *Create* to finish the creation of the synchronized group. The LDAP memberships of each user will be synchronized hourly through a cron job on your packaged installation. Changes and output will be logged to */var/log/openproject/cron-hourly.log*. + +If you want to trigger the synchronization *manually* you can do so by running the respective rake task directly. +In the packaged installation, for instance, this would work like this: + +``` +sudo openproject run bundle exec rake ldap_groups:synchronize +``` diff --git a/docs/system-admin-guide/enumerations/README.md b/docs/system-admin-guide/enumerations/README.md index 5c01968da4..c69e43dca6 100644 --- a/docs/system-admin-guide/enumerations/README.md +++ b/docs/system-admin-guide/enumerations/README.md @@ -4,16 +4,16 @@ sidebar_navigation: priority: 780 description: Manage enumerations in OpenProject. robots: index, follow -keywords: enumerations +keywords: enumerations, time tracking, priority, document categories --- # Manage Enumerations -The **Enumerations** settings allow adapting of Activities (for time tracking), work package priorities and document categories. - - + + To get an overview of existing enumeration values for all of these categories, navigate to the -> *Administration* -> *Enumerations*. You will see the enumerations overview, divided into respective sections. ![enumerations](image-20200122161732016.png) @@ -38,6 +38,10 @@ You will then be able to name the value, activate it and choose if it should be ![Sys-admin-enumerations](Sys-admin-enumerations.png) -**Note**: To activate the [Activities (for time tracking)](../../user-guide/projects/project-settings/activities-time-tracking) in a certain project, navigate to -> *Project settings* -> *Activities (time tracking)*. - +To **change the color of work package priorities** choose the respective priority in the section Work package priorities. + + + \ No newline at end of file diff --git a/docs/system-admin-guide/manage-work-packages/work-package-status/README.md b/docs/system-admin-guide/manage-work-packages/work-package-status/README.md index 7690398faa..2343805cd2 100644 --- a/docs/system-admin-guide/manage-work-packages/work-package-status/README.md +++ b/docs/system-admin-guide/manage-work-packages/work-package-status/README.md @@ -13,7 +13,8 @@ Work packages can have various status depending on their types, e.g. tasks can h The status can be set at the top of the work package details view or in the list view in the corresponding column. -![Sys-admin-work-package-status](Sys-admin-work-package-status.png)The status field can be configured under *Administration ->* *Work packages* -> *Status*. You will see the list of all the existing work package status in the system. You can add new status or change the name and order of existing status. +![Sys-admin-work-package-status](Sys-admin-work-package-status.png)The status field can be configured under *Administration ->* *Work packages* -> *Status*. You will see the list of all the existing work package status in the system. You can add new status or change the name and order of existing status. +To learn about the options for configuring the transition from one status to another navigate to [Manage work package workflows](../work-package-workflows). ## Create a new work package status diff --git a/docs/system-admin-guide/system-settings/display-settings/README.md b/docs/system-admin-guide/system-settings/display-settings/README.md index f4e4263c9e..fa09e43d77 100644 --- a/docs/system-admin-guide/system-settings/display-settings/README.md +++ b/docs/system-admin-guide/system-settings/display-settings/README.md @@ -21,6 +21,9 @@ At the moment there are more than 30 languages available. **Note**: Many languages are translated by the Community. We highly appreciate if you want to [help translating OpenProject to your language](../../../development/translate-openproject). + +You can [choose your language in your user profile](../../../getting-started/my-account/#change-your-language). + ## Time and date formatting Change time and date formats in OpenProject and configure the display of journal aggregation. @@ -32,4 +35,4 @@ Change time and date formats in OpenProject and configure the display of journal 5. **Display journals as aggregated within** will enable you to choose a time to combine journals of this timespan, e.g. for work package notifications. This way if you do several updates at in a short period of time, you will not receive a notification for each update but only a notification for the chosen period. 6. Do not forget to **save** your changes. -![Sys-admin-display-settings](Sys-admin-display-settings.png) \ No newline at end of file +![Sys-admin-display-settings](Sys-admin-display-settings.png) diff --git a/docs/user-guide/budgets/README.md b/docs/user-guide/budgets/README.md index f6ab578594..61d8daec52 100644 --- a/docs/user-guide/budgets/README.md +++ b/docs/user-guide/budgets/README.md @@ -4,7 +4,7 @@ sidebar_navigation: priority: 780 description: Find out how to create and manage budgets for a project in OpenProject. robots: index, follow -keywords: budgets +keywords: budgets, project budget, costs --- # Budgets @@ -15,14 +15,14 @@ You can add planned **unit costs** as well as **labor costs** for the project. Then, you will assign work packages to a budgets. If you log time or costs to this work package the costs will booked to this budget and show the percentage spent for a project budget. -| Feature | Documentation for | +| Topic | Content | | ------------------------------------------------------------ | ------------------------------------------------------------ | | [Create a project budget](#create-a-project-budget) | How to set up a project budget in OpenProject? | | [Add planned unit costs](#add-planned-unit-costs) | How to add planned unit costs to a budget? | | [Add planned labor costs](#add-planned-labor-costs) | How to add planned labor costs to a budget? | -| [Assign a work package to a budget](#assign-work-package-to-a-budget) | How to assign a work package to book time and costs to a project budget? | +| [Assign a work package to a budget](#assign-a-work-package-to-a-budget) | How to assign a work package to book time and costs to a project budget? | | [View details and update budget](#view-details-and-update-budget) | How to display the details, update, copy or delete a project budget? | -| | | +| [Frequently asked questions (FAQ)](Frequently-asked-questions-(FAQ)) | What are frequent questions regarding budgets? | ## Create a project budget diff --git a/docs/user-guide/integrations/README.md b/docs/user-guide/integrations/README.md index 8190df66af..a1a83ced8c 100644 --- a/docs/user-guide/integrations/README.md +++ b/docs/user-guide/integrations/README.md @@ -10,6 +10,10 @@ keywords: projects, integration, Jira If you have previously worked with other tools and want to switch or need an integration to OpenProject, there is a way to do so for some applications. +## GitHub + +OpenProject offers a basic GitHub integration. You will find more information about the GitHub integration in our [GitHub integration guideline](../../system-admin-guide/github-integration/). + ## Gitlab The GitLab integration to OpenProject is currently being developed and you can find all information [here](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/21933#note_309977508). diff --git a/docs/user-guide/meetings/README.md b/docs/user-guide/meetings/README.md index e788758c88..ac8898a0a0 100644 --- a/docs/user-guide/meetings/README.md +++ b/docs/user-guide/meetings/README.md @@ -11,7 +11,8 @@ keywords: meetings Meetings in OpenProject allow you to manage and document your project meetings at one central place, prepare a meeting agenda together with your team and document and share meeting minutes with your meeting attendees at one central place. -
**Meetings** is defined as a module that allows the organization of meetings. The module has to be activated in the project settings in order to be displayed in the side navigation.
+
**Meetings** is defined as a module that allows the organization of meetings. The module has to be activated in the project settings in order to be displayed in the side navigation. +
diff --git a/docs/user-guide/projects/project-settings/activities-time-tracking/README.md b/docs/user-guide/projects/project-settings/activities-time-tracking/README.md index 2ed2357fc9..d7278953c0 100644 --- a/docs/user-guide/projects/project-settings/activities-time-tracking/README.md +++ b/docs/user-guide/projects/project-settings/activities-time-tracking/README.md @@ -2,18 +2,18 @@ sidebar_navigation: title: Time tracking activities priority: 300 -description: Manage activites for time tracking. +description: Manage activities for time tracking. robots: index, follow keywords: activities for time tracking --- -# Manage activites for time tracking +# Manage activities for time tracking -You can configure Activities for time tracking in the System *Administration* -> *Enumerations*. You can activate or deactivate time tracking acitivites per project. +You can configure Activities for time tracking in the System *Administration* -> *Enumerations*. You can activate or deactivate time tracking activities per project.
**Time tracking** is defined as a module which allows users to log time on work packages. Once the time tracking module is activated, time can be logged via the action menu of a work package.
-Navigate to the -> Project settings -> *Activites (time tracking)*. +Navigate to the -> Project settings -> *Activities (time tracking)*. -Select the activites which you want to activate for time tracking in your project. Press the blue Save button to apply your changes. +Select the activities which you want to activate for time tracking in your project. Press the blue Save button to apply your changes. ![time tracking activities](image-20200211134150920.png) diff --git a/docs/user-guide/work-packages/README.md b/docs/user-guide/work-packages/README.md index 3f755f4cba..4785172785 100644 --- a/docs/user-guide/work-packages/README.md +++ b/docs/user-guide/work-packages/README.md @@ -15,10 +15,13 @@ keywords: work packages Work packages have a **type**, an **ID**, a **subject** and may have various additional attributes, such as **status**, **assignee**, **priority**, **due date**. -
**Work package ID** is defined as a unique integer assigned to a newly created work package. Work package IDs cannot be changed and are numbered across all projects of an OpenProject instance (therefore, the numbering within a project may not be sequential).
+
**Work package ID** is defined as a unique integer assigned to a newly created work package. Work package IDs cannot be changed and are numbered across all projects of an OpenProject instance (therefore, the numbering within a project may not be sequential). +
-**Types** are the different items a work package can represent, such as task, feature, bug, phase, milestone. The work package types can be configured in the system administration.
+**Types** are the different items a work package can represent, such as task, feature, bug, phase, milestone. The work package types can be configured in the system administration. + + diff --git a/docs/user-guide/work-packages/edit-work-package/README.md b/docs/user-guide/work-packages/edit-work-package/README.md index 472288ed83..6a1d6a322b 100644 --- a/docs/user-guide/work-packages/edit-work-package/README.md +++ b/docs/user-guide/work-packages/edit-work-package/README.md @@ -96,7 +96,7 @@ Tip: **keep the Ctrl. button pressed** in order to select and edit several work To open the quick context menu, **press the RIGHT mouse button**. -You have then the possibility to: +Then you have the possibility to: * Open details view of all selected work packages. * Open the fullscreen view of all selected work packages. @@ -105,4 +105,11 @@ You have then the possibility to: * Bulk copy all selected work packages, incl. the hierarchy relations (parent-child relations). * Bulk delete all selected work packages. -![bulk edit right mouse click](image-20200331133245192.png) \ No newline at end of file +![bulk edit right mouse click](image-20200331133245192.png) + + + +At the bottom of the page you can decide whether email updates regarding these changes should be sent or not. It makes sense not to tick the box for large updates to prevent users from getting flooded by emails. + +![bulk-edit_email-updates](image-20201119163714831.png) + diff --git a/docs/user-guide/work-packages/edit-work-package/image-20201119163714831.png b/docs/user-guide/work-packages/edit-work-package/image-20201119163714831.png new file mode 100644 index 0000000000..4e7c803e27 Binary files /dev/null and b/docs/user-guide/work-packages/edit-work-package/image-20201119163714831.png differ diff --git a/docs/user-guide/work-packages/work-package-table-configuration/README.md b/docs/user-guide/work-packages/work-package-table-configuration/README.md index 46aa832555..1a062f1fa7 100644 --- a/docs/user-guide/work-packages/work-package-table-configuration/README.md +++ b/docs/user-guide/work-packages/work-package-table-configuration/README.md @@ -62,9 +62,9 @@ To add a filter criteria, click the **+ Add filter:** button in the grey filter ![add-filter](add-filter.png) You can add as many filter criteria as needed. -Also, you can filter by [custom fields](../../../system-admin-guide/) if you set this in the custom field configuration. +Also, you can filter by [custom fields](../../../system-admin-guide/custom-fields) if you set this in the custom field configuration. -If you want to search by subject of a work package, type in the **Filter by text** the expression you want to filter for. +If you want to search for specific text in the subject, description or comments of a work package, type in the **Filter by text** the expression you want to filter for. The results will be displayed accordingly in the work package list. @@ -76,24 +76,23 @@ The results will be displayed accordingly in the work package list. By default, the work package list will be sorted by work package ID.
-The **ID** is unique for a work package within OpenProject. It will be set automatically from the system. With the ID you can reference to one specific work package in OpenProject. - +The **ID** is unique for a work package within OpenProject. It will be set automatically from the system. With the ID you can reference a specific work package in OpenProject.
+ To sort the work package list view, open the [work package table configuration](#work-package-table-configuration) and select the tab **Sort by**. You can sort by up to three attributes, either ascending or descending. ![1566396586476](1566396586476.png) -Click the blue **Apply** button will save your changes and display the results accordingly in the list view. +Clicking the blue **Apply** button will save your changes and display the results accordingly in the list view. ![sort-work-packages](sort-work-packages.png) + Therefore, the results may differ if you sort in a flat list or in a hierarchy mode. The same filter applied in the hierarchy mode. @@ -106,7 +105,8 @@ You can sort the work package list manually, using the icon with the 6 dots on t Moving a work package will change its attributes, depending on the kind of list displayed, e.g. hierarchy changes or priority. -To keep the sorting it is necessary to [save the work package view](#save-work-package-views). Please note: This has no effect on the "All open" view; you have to save your sorting with another name. +To keep the sorting it is necessary to [save the work package view](#save-work-package-views). +Please note: This has no effect on the "All open" view; you have to save your sorting with another name. ## How to switch from flat list to hierarchy mode? @@ -133,18 +133,16 @@ The following attributes can be highlighted in the list: * Status * Finish date -Either ![attribute-highlighting](attribute-highlighting.png) - -Furthermore, you can highlight the entire row by an attribute. +![attribute-highlighting](attribute-highlighting.png) -The following attributes can be highlighted as a complete row: +Furthermore, you can highlight the entire row by an attribute. The following attributes can be highlighted as a complete row: * Priority * Status ![highlight-priority](1566399038768.png) -You can configure the colors for attribute highlighting in the [system administration](../../../system-admin-guide/#status-colors). +You can configure the colors for attribute highlighting in the system administration. Find out how to set it [here](../../../system-admin-guide/enumerations/#edit-or-remove-enumeration-value) for the color of the priority and [here](../../../system-admin-guide/manage-work-packages/work-package-status/#edit-re-order-or-remove-a-work-package-status) for the color of the status. ## Save work package views diff --git a/frontend/src/app/modules/backlogs/backlogs-page/styles/taskboard.sass b/frontend/src/app/modules/backlogs/backlogs-page/styles/taskboard.sass index 32a510160f..1b51f77bcb 100644 --- a/frontend/src/app/modules/backlogs/backlogs-page/styles/taskboard.sass +++ b/frontend/src/app/modules/backlogs/backlogs-page/styles/taskboard.sass @@ -26,9 +26,6 @@ * See docs/COPYRIGHT.rdoc for more details. ++ */ -@import "~global_styles/openproject/variables" -@import "~global_styles/openproject/functions" - @mixin story-header background-color: #FFFFFF font-size: 1rem - rem-calc(5px) diff --git a/lib/open_project/version.rb b/lib/open_project/version.rb index fd0c451e4b..911434fe33 100644 --- a/lib/open_project/version.rb +++ b/lib/open_project/version.rb @@ -34,7 +34,7 @@ module OpenProject module VERSION #:nodoc: MAJOR = 11 MINOR = 0 - PATCH = 3 + PATCH = 4 TINY = PATCH # Redmine compat class << self diff --git a/modules/avatars/config/locales/crowdin/js-ro.yml b/modules/avatars/config/locales/crowdin/js-ro.yml index 2a7911f30d..ef85642de9 100644 --- a/modules/avatars/config/locales/crowdin/js-ro.yml +++ b/modules/avatars/config/locales/crowdin/js-ro.yml @@ -5,11 +5,11 @@ ro: button_update: 'Actualizare' avatars: label_choose_avatar: "Choose Avatar from file" - uploading_avatar: "Uploading your avatar." + uploading_avatar: "Se încarcă avatarul tău." 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." + error_image_too_large: "Imaginea este prea mare." wrong_file_format: "Allowed formats are jpg, png, gif" empty_file_error: "Please upload a valid image (jpg, png, gif)" diff --git a/modules/backlogs/config/locales/crowdin/de.yml b/modules/backlogs/config/locales/crowdin/de.yml index 727f8495df..51d9a809b5 100644 --- a/modules/backlogs/config/locales/crowdin/de.yml +++ b/modules/backlogs/config/locales/crowdin/de.yml @@ -84,7 +84,7 @@ de: backlogs_product_backlog: "Produkt Backlog" backlogs_product_backlog_is_empty: "Produkt Backlog ist leer" backlogs_product_backlog_unsized: "Die Spitze des Produkt Backlogs hat Stories ohne Aufwandsangaben" - backlogs_sizing_inconsistent: "Story Aufwand weicht von den Schätzwerten ab" + backlogs_sizing_inconsistent: "Die Story-Aufwände weichen von den Schätzwerten ab" backlogs_sprint_notes_missing: "Geschlossene Sprints ohne Closed sprints without Retrospective-/Besprechungsnotizen" backlogs_sprint_unestimated: "Geschlossene oder aktive Sprints mit nicht abgeschätzten Stories" backlogs_sprint_unsized: "Das Projekt hat Stories auf aktiven oder vor kurzem geschlossenen Sprints welche keine Aufwandsangaben enthalten" diff --git a/modules/bim/config/locales/crowdin/js-fi.yml b/modules/bim/config/locales/crowdin/js-fi.yml index b00994c797..70d317d19b 100644 --- a/modules/bim/config/locales/crowdin/js-fi.yml +++ b/modules/bim/config/locales/crowdin/js-fi.yml @@ -20,8 +20,8 @@ fi: ifc_models: 'IFC models' views: viewer: 'Selain' - split: 'Viewer and table' + split: 'Näkymä ja tiedot' split_cards: 'Selain ja kortit' revit: - revit_add_in: "Revit Add-In" - revit_add_in_settings: "Revit Add-In settings" + revit_add_in: "Revit Lisäosa" + revit_add_in_settings: "Revit Lisäosa asetukset" diff --git a/modules/bim/spec/support/pages/ifc_models/index.rb b/modules/bim/spec/support/pages/ifc_models/index.rb index edbde4f0a5..cc5e5f379b 100644 --- a/modules/bim/spec/support/pages/ifc_models/index.rb +++ b/modules/bim/spec/support/pages/ifc_models/index.rb @@ -108,7 +108,7 @@ module Pages end def expect_model_active(model, active = true) - expect(page).to have_field(model.id.to_s, checked: active) + expect(page).to have_field(model.id.to_s, checked: active, wait: 30) end def show_defaults(models = []) diff --git a/modules/boards/config/locales/crowdin/js-ko.yml b/modules/boards/config/locales/crowdin/js-ko.yml index cddafd0cee..22690089e3 100644 --- a/modules/boards/config/locales/crowdin/js-ko.yml +++ b/modules/boards/config/locales/crowdin/js-ko.yml @@ -50,7 +50,7 @@ ko: action_text_assignee: > 할당된 사용자에 기반한 자동화된 열이 있는 보드입니다. 작업 패키지 디스패치에 적합합니다. action_text_version: > - Board with automated columns based on the version attribute. Ideal for planning product development. + 버전 속성 컬럼이 있는 보드. 소프트웨어 개발 계획에 적합함. action_type: assignee: 담당자 status: 상태 diff --git a/modules/boards/config/locales/crowdin/tr.yml b/modules/boards/config/locales/crowdin/tr.yml index d413305170..e10ffebf79 100644 --- a/modules/boards/config/locales/crowdin/tr.yml +++ b/modules/boards/config/locales/crowdin/tr.yml @@ -1,6 +1,6 @@ #English strings go here tr: - permission_show_board_views: "Panoları görüntülemek" + permission_show_board_views: "Panoları görüntüle" permission_manage_board_views: "Panoları yönet" project_module_board_view: "Panolar" boards: diff --git a/modules/budgets/app/controllers/budgets_controller.rb b/modules/budgets/app/controllers/budgets_controller.rb index c35c74f69e..e9f7e3d41e 100644 --- a/modules/budgets/app/controllers/budgets_controller.rb +++ b/modules/budgets/app/controllers/budgets_controller.rb @@ -84,11 +84,12 @@ class BudgetsController < ApplicationController def copy source = Budget.find(params[:id].to_i) - @budget = Budget.new - if source - @budget.copy_from(source) - end + @budget = if source + Budget.new_copy(source) + else + Budget.new + end @budget.fixed_date ||= Date.today diff --git a/modules/budgets/app/models/budget.rb b/modules/budgets/app/models/budget.rb index d379083a87..a81994b024 100644 --- a/modules/budgets/app/models/budget.rb +++ b/modules/budgets/app/models/budget.rb @@ -63,10 +63,48 @@ class Budget < ApplicationRecord Budget.replace_author_with_deleted_user user end - def self.visible(user) - includes(:project) - .references(:projects) - .merge(Project.allowed_to(user, :view_budgets)) + class << self + def visible(user) + includes(:project) + .references(:projects) + .merge(Project.allowed_to(user, :view_budgets)) + end + + # TODO: Extract into copy service + def new_copy(source) + copy = new(copy_attributes(source)) + + copy_budget_items(source, copy, items: :labor_budget_items) + copy_budget_items(source, copy, items: :material_budget_items) + + copy + end + + def replace_author_with_deleted_user(user) + substitute = DeletedUser.first + + where(author_id: user.id).update_all(author_id: substitute.id) + end + + protected + + def copy_attributes(source) + source.attributes.slice('project_id', 'subject', 'description', 'fixed_date').merge('author' => User.current) + end + + def copy_budget_items(source, sink, items:) + raise ArgumentError unless %i(labor_budget_items material_budget_items).include? items + + source.send(items).each do |bi| + to_slice = if items == :material_budget_items + %w(units cost_type_id comments amount) + else + %w(hours user_id comments amount) + end + + sink.send(items).build(bi.attributes.slice(*to_slice).merge('budget' => sink)) + end + end end def initialize(attributes = nil) @@ -74,14 +112,6 @@ class Budget < ApplicationRecord self.author = User.current if new_record? end - def copy_from(arg) - budget = (arg.is_a?(Budget) ? arg : self.class.find(arg)) - attrs = budget.attributes.dup - super(attrs) - self.labor_budget_items = budget.labor_budget_items.map(&:dup) - self.material_budget_items = budget.material_budget_items.map(&:dup) - end - def budget material_budget + labor_budget end @@ -105,12 +135,6 @@ class Budget < ApplicationRecord 'budget' end - def self.replace_author_with_deleted_user(user) - substitute = DeletedUser.first - - where(author_id: user.id).update_all(author_id: substitute.id) - end - def to_s subject end diff --git a/modules/budgets/spec/features/budgets/copy_budget_spec.rb b/modules/budgets/spec/features/budgets/copy_budget_spec.rb new file mode 100644 index 0000000000..6b25a20dc2 --- /dev/null +++ b/modules/budgets/spec/features/budgets/copy_budget_spec.rb @@ -0,0 +1,89 @@ +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) 2012-2020 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-2017 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 docs/COPYRIGHT.rdoc for more details. +#++ + +require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper.rb') + +describe 'Copying a budget', type: :feature, js: true do + let(:project) { FactoryBot.create :project, enabled_module_names: %i[budgets costs] } + let(:current_user) do + FactoryBot.create :user, + member_in_project: project, + member_with_permissions: %i(view_budgets edit_budgets view_hourly_rates view_cost_rates) + end + let(:original_author) { FactoryBot.create :user } + let(:budget_subject) { "A budget subject" } + let(:budget_description) { "A budget description" } + let!(:budget) do + FactoryBot.create :budget, + subject: budget_subject, + description: budget_description, + author: original_author, + project: project + end + let!(:cost_type) do + FactoryBot.create :cost_type, name: 'Post-war', unit: 'cap', unit_plural: 'caps' + end + let!(:cost_type_rate) { FactoryBot.create :cost_rate, cost_type: cost_type, rate: 50.0 } + let!(:default_hourly_rate) { FactoryBot.create :default_hourly_rate, user: original_author, rate: 25.0 } + let!(:material_budget_item) do + FactoryBot.create :material_budget_item, + units: 3, + cost_type: cost_type, + budget: budget + end + + let!(:labor_budget_item) do + FactoryBot.create :labor_budget_item, + hours: 5, + user: original_author, + budget: budget + end + let(:budget_page) { Pages::EditBudget.new budget.id } + + before do + login_as(current_user) + end + + it 'copies all the items of the budget under the name of the copying user' do + budget_page.visit! + + budget_page.click_copy + + budget_page.expect_subject(budget_subject) + + budget_page.expect_planned_costs!(type: :labor, row: 1, expected: '125.00 EUR') + budget_page.expect_planned_costs!(type: :material, row: 1, expected: '150.00 EUR') + + click_button 'Create' + + budget_page.expect_notification message: 'Successful creation.' + + expect(page) + .to have_selector('.author', text: current_user.name) + end +end diff --git a/modules/budgets/spec/support/pages/budget_form.rb b/modules/budgets/spec/support/pages/budget_form.rb index e811ec2bef..26da55599e 100644 --- a/modules/budgets/spec/support/pages/budget_form.rb +++ b/modules/budgets/spec/support/pages/budget_form.rb @@ -121,6 +121,11 @@ module Pages end end + def expect_subject(subject) + expect(page) + .to have_field("Subject", with: subject) + end + def unit_costs_at(num_row) unit_costs_container.all('tbody td.currency')[num_row - 1] end @@ -176,5 +181,9 @@ module Pages def labor_rows @labor_rows ||= 0 end + + def notification_type + :rails + end end end diff --git a/modules/budgets/spec/support/pages/edit_budget.rb b/modules/budgets/spec/support/pages/edit_budget.rb index 458dfc2a59..1065c3439c 100644 --- a/modules/budgets/spec/support/pages/edit_budget.rb +++ b/modules/budgets/spec/support/pages/edit_budget.rb @@ -39,6 +39,12 @@ module Pages @budget_id = budget_id end + def click_copy + within '.toolbar-items' do + click_link 'Copy' + end + end + def path "/budgets/#{budget_id}" end diff --git a/modules/costs/config/locales/crowdin/cs.yml b/modules/costs/config/locales/crowdin/cs.yml index 1b3bace2cb..024544d2d0 100644 --- a/modules/costs/config/locales/crowdin/cs.yml +++ b/modules/costs/config/locales/crowdin/cs.yml @@ -82,7 +82,7 @@ cs: label_costlog: "Logované jednotkové náklady" label_cost_plural: "Náklady" label_cost_type_plural: "Typy nákladů" - label_cost_type_specific: "Cost type #%{id}: %{name}" + label_cost_type_specific: "Typ nákladu #%{id}: %{name}" label_costs_per_page: "Náklady na stránku" label_currency: "Měna" label_currency_format: "Formát měny" @@ -132,7 +132,7 @@ cs: permission_view_own_cost_entries: "Zobrazit vlastní rezervované náklady" permission_view_own_hourly_rate: "Zobrazit vlastní hodinovou sazbu" permission_view_own_time_entries: "Zobrazit vlastní strávený čas" - project_module_costs: "Time and costs" + project_module_costs: "Čas a náklady" text_assign_time_and_cost_entries_to_project: "Přiřadit nahlášené hodiny a náklady projektu" text_destroy_cost_entries_question: "%{cost_entries} byl nahlášen k pracovním balíčkům, které se chystáte odstranit. Co chcete udělat?" text_destroy_time_and_cost_entries: "Odstranit nahlášené hodiny a náklady" diff --git a/modules/meeting/app/controllers/meeting_contents_controller.rb b/modules/meeting/app/controllers/meeting_contents_controller.rb index cc0ffb1f89..207d64432b 100644 --- a/modules/meeting/app/controllers/meeting_contents_controller.rb +++ b/modules/meeting/app/controllers/meeting_contents_controller.rb @@ -44,7 +44,7 @@ class MeetingContentsController < ApplicationController before_action :authorize def show - if params[:id].present? && @content.version == params[:id].to_i + if params[:id].present? && @content.last_journal.version == params[:id].to_i # Redirect links to the last version redirect_to controller: '/meetings', action: :show, diff --git a/modules/meeting/config/locales/crowdin/de.yml b/modules/meeting/config/locales/crowdin/de.yml index 0b225d0b3a..2cd13328cf 100644 --- a/modules/meeting/config/locales/crowdin/de.yml +++ b/modules/meeting/config/locales/crowdin/de.yml @@ -59,7 +59,7 @@ de: label_meeting_date_time: "Datum/Uhrzeit" label_meeting_diff: "Differenz" label_notify: "Zur Einsicht verschicken" - label_icalendar: "ICalendar senden" + label_icalendar: "iCalendar senden" label_version: "Version" label_time_zone: "Zeitzone" label_start_date: "Anfangstermin" diff --git a/modules/overviews/config/locales/crowdin/ar.yml b/modules/overviews/config/locales/crowdin/ar.yml index fdf31b87bb..8acd762539 100644 --- a/modules/overviews/config/locales/crowdin/ar.yml +++ b/modules/overviews/config/locales/crowdin/ar.yml @@ -1,3 +1,4 @@ ar: overviews: label: 'نظرة عامة' + permission_manage_overview: 'Manage overview page' diff --git a/modules/overviews/config/locales/crowdin/bg.yml b/modules/overviews/config/locales/crowdin/bg.yml index e35149aeb8..256c53cecd 100644 --- a/modules/overviews/config/locales/crowdin/bg.yml +++ b/modules/overviews/config/locales/crowdin/bg.yml @@ -1,3 +1,4 @@ bg: overviews: label: 'Общ преглед' + permission_manage_overview: 'Manage overview page' diff --git a/modules/overviews/config/locales/crowdin/ca.yml b/modules/overviews/config/locales/crowdin/ca.yml index 6e78622bb2..88e42eec39 100644 --- a/modules/overviews/config/locales/crowdin/ca.yml +++ b/modules/overviews/config/locales/crowdin/ca.yml @@ -1,3 +1,4 @@ ca: overviews: label: 'Visió general' + permission_manage_overview: 'Manage overview page' diff --git a/modules/overviews/config/locales/crowdin/cs.yml b/modules/overviews/config/locales/crowdin/cs.yml index 29394a01b2..6db38b896d 100644 --- a/modules/overviews/config/locales/crowdin/cs.yml +++ b/modules/overviews/config/locales/crowdin/cs.yml @@ -1,3 +1,4 @@ cs: overviews: label: 'Přehled' + permission_manage_overview: 'Manage overview page' diff --git a/modules/overviews/config/locales/crowdin/da.yml b/modules/overviews/config/locales/crowdin/da.yml index c5724b2a2a..b4f7d0b9d6 100644 --- a/modules/overviews/config/locales/crowdin/da.yml +++ b/modules/overviews/config/locales/crowdin/da.yml @@ -1,3 +1,4 @@ da: overviews: label: 'Overblik' + permission_manage_overview: 'Manage overview page' diff --git a/modules/overviews/config/locales/crowdin/de.yml b/modules/overviews/config/locales/crowdin/de.yml index 93a1add22a..e5d73eaf99 100644 --- a/modules/overviews/config/locales/crowdin/de.yml +++ b/modules/overviews/config/locales/crowdin/de.yml @@ -1,3 +1,4 @@ de: overviews: label: 'Übersicht' + permission_manage_overview: 'Übersichtsseite verwalten' diff --git a/modules/overviews/config/locales/crowdin/el.yml b/modules/overviews/config/locales/crowdin/el.yml index 39c2bc438e..3451c0cbfb 100644 --- a/modules/overviews/config/locales/crowdin/el.yml +++ b/modules/overviews/config/locales/crowdin/el.yml @@ -1,3 +1,4 @@ el: overviews: label: 'Επισκόπηση' + permission_manage_overview: 'Manage overview page' diff --git a/modules/overviews/config/locales/crowdin/es.yml b/modules/overviews/config/locales/crowdin/es.yml index b7757faef0..e8f888ff8f 100644 --- a/modules/overviews/config/locales/crowdin/es.yml +++ b/modules/overviews/config/locales/crowdin/es.yml @@ -1,3 +1,4 @@ es: overviews: label: 'Resumen' + permission_manage_overview: 'Manage overview page' diff --git a/modules/overviews/config/locales/crowdin/fi.yml b/modules/overviews/config/locales/crowdin/fi.yml index f7b4e21269..6cc93a877b 100644 --- a/modules/overviews/config/locales/crowdin/fi.yml +++ b/modules/overviews/config/locales/crowdin/fi.yml @@ -1,3 +1,4 @@ fi: overviews: label: 'Yleiskatsaus' + permission_manage_overview: 'Manage overview page' diff --git a/modules/overviews/config/locales/crowdin/fil.yml b/modules/overviews/config/locales/crowdin/fil.yml index fec4b95172..9ddffe632e 100644 --- a/modules/overviews/config/locales/crowdin/fil.yml +++ b/modules/overviews/config/locales/crowdin/fil.yml @@ -1,3 +1,4 @@ fil: overviews: label: 'Buod' + permission_manage_overview: 'Manage overview page' diff --git a/modules/overviews/config/locales/crowdin/fr.yml b/modules/overviews/config/locales/crowdin/fr.yml index 60c4c8afa2..de1c6df441 100644 --- a/modules/overviews/config/locales/crowdin/fr.yml +++ b/modules/overviews/config/locales/crowdin/fr.yml @@ -1,3 +1,4 @@ fr: overviews: label: 'Vue globale' + permission_manage_overview: 'Gérer la page d''aperçu' diff --git a/modules/overviews/config/locales/crowdin/hr.yml b/modules/overviews/config/locales/crowdin/hr.yml index b951b556e2..b815acaaec 100644 --- a/modules/overviews/config/locales/crowdin/hr.yml +++ b/modules/overviews/config/locales/crowdin/hr.yml @@ -1,3 +1,4 @@ hr: overviews: label: 'Pregled' + permission_manage_overview: 'Manage overview page' diff --git a/modules/overviews/config/locales/crowdin/hu.yml b/modules/overviews/config/locales/crowdin/hu.yml index 90060584d8..8c8912daa6 100644 --- a/modules/overviews/config/locales/crowdin/hu.yml +++ b/modules/overviews/config/locales/crowdin/hu.yml @@ -1,3 +1,4 @@ hu: overviews: label: 'Áttekintés' + permission_manage_overview: 'Manage overview page' diff --git a/modules/overviews/config/locales/crowdin/id.yml b/modules/overviews/config/locales/crowdin/id.yml index 36270a615d..9686c08b08 100644 --- a/modules/overviews/config/locales/crowdin/id.yml +++ b/modules/overviews/config/locales/crowdin/id.yml @@ -1,3 +1,4 @@ id: overviews: label: 'Tinjauan' + permission_manage_overview: 'Manage overview page' diff --git a/modules/overviews/config/locales/crowdin/it.yml b/modules/overviews/config/locales/crowdin/it.yml index 88bda2784c..16dc54d309 100644 --- a/modules/overviews/config/locales/crowdin/it.yml +++ b/modules/overviews/config/locales/crowdin/it.yml @@ -1,3 +1,4 @@ it: overviews: label: 'Panoramica' + permission_manage_overview: 'Manage overview page' diff --git a/modules/overviews/config/locales/crowdin/ja.yml b/modules/overviews/config/locales/crowdin/ja.yml index 71dc6e3f00..998abc04b8 100644 --- a/modules/overviews/config/locales/crowdin/ja.yml +++ b/modules/overviews/config/locales/crowdin/ja.yml @@ -1,3 +1,4 @@ ja: overviews: label: '概要' + permission_manage_overview: 'Manage overview page' diff --git a/modules/overviews/config/locales/crowdin/ko.yml b/modules/overviews/config/locales/crowdin/ko.yml index 6267d3dc88..0308d6ef55 100644 --- a/modules/overviews/config/locales/crowdin/ko.yml +++ b/modules/overviews/config/locales/crowdin/ko.yml @@ -1,3 +1,4 @@ ko: overviews: label: '요약' + permission_manage_overview: '개요 페이지 관리' diff --git a/modules/overviews/config/locales/crowdin/lt.yml b/modules/overviews/config/locales/crowdin/lt.yml index e25b6df652..590603a215 100644 --- a/modules/overviews/config/locales/crowdin/lt.yml +++ b/modules/overviews/config/locales/crowdin/lt.yml @@ -1,3 +1,4 @@ lt: overviews: label: 'Peržiūra' + permission_manage_overview: 'Valdyti apžvalgos puslapį' diff --git a/modules/overviews/config/locales/crowdin/nl.yml b/modules/overviews/config/locales/crowdin/nl.yml index 02cf0e6373..2af6c77580 100644 --- a/modules/overviews/config/locales/crowdin/nl.yml +++ b/modules/overviews/config/locales/crowdin/nl.yml @@ -1,3 +1,4 @@ nl: overviews: label: 'Overzicht' + permission_manage_overview: 'Manage overview page' diff --git a/modules/overviews/config/locales/crowdin/no.yml b/modules/overviews/config/locales/crowdin/no.yml index 1f32f93479..52c255605a 100644 --- a/modules/overviews/config/locales/crowdin/no.yml +++ b/modules/overviews/config/locales/crowdin/no.yml @@ -1,3 +1,4 @@ "no": overviews: label: 'Oversikt' + permission_manage_overview: 'Manage overview page' diff --git a/modules/overviews/config/locales/crowdin/pl.yml b/modules/overviews/config/locales/crowdin/pl.yml index 2a2f21d5de..90398b3e16 100644 --- a/modules/overviews/config/locales/crowdin/pl.yml +++ b/modules/overviews/config/locales/crowdin/pl.yml @@ -1,3 +1,4 @@ pl: overviews: label: 'Przegląd' + permission_manage_overview: 'Manage overview page' diff --git a/modules/overviews/config/locales/crowdin/pt.yml b/modules/overviews/config/locales/crowdin/pt.yml index ad5c2273c1..c2e01db8d1 100644 --- a/modules/overviews/config/locales/crowdin/pt.yml +++ b/modules/overviews/config/locales/crowdin/pt.yml @@ -1,3 +1,4 @@ pt: overviews: label: 'Visão geral' + permission_manage_overview: 'Manage overview page' diff --git a/modules/overviews/config/locales/crowdin/ro.yml b/modules/overviews/config/locales/crowdin/ro.yml index 2187d482e5..3bd2e2c876 100644 --- a/modules/overviews/config/locales/crowdin/ro.yml +++ b/modules/overviews/config/locales/crowdin/ro.yml @@ -1,3 +1,4 @@ ro: overviews: label: 'Vedere de ansamblu' + permission_manage_overview: 'Manage overview page' diff --git a/modules/overviews/config/locales/crowdin/ru.yml b/modules/overviews/config/locales/crowdin/ru.yml index 33ce9d94b0..2b5e115449 100644 --- a/modules/overviews/config/locales/crowdin/ru.yml +++ b/modules/overviews/config/locales/crowdin/ru.yml @@ -1,3 +1,4 @@ ru: overviews: label: 'Обзор' + permission_manage_overview: 'Управление страницей обзора' diff --git a/modules/overviews/config/locales/crowdin/sk.yml b/modules/overviews/config/locales/crowdin/sk.yml index 688a94e7bb..92eef575d4 100644 --- a/modules/overviews/config/locales/crowdin/sk.yml +++ b/modules/overviews/config/locales/crowdin/sk.yml @@ -1,3 +1,4 @@ sk: overviews: label: 'Prehľad' + permission_manage_overview: 'Manage overview page' diff --git a/modules/overviews/config/locales/crowdin/sl.yml b/modules/overviews/config/locales/crowdin/sl.yml index 89cec304df..ce9eb1c25a 100644 --- a/modules/overviews/config/locales/crowdin/sl.yml +++ b/modules/overviews/config/locales/crowdin/sl.yml @@ -1,3 +1,4 @@ sl: overviews: label: 'Pregled' + permission_manage_overview: 'Manage overview page' diff --git a/modules/overviews/config/locales/crowdin/sv.yml b/modules/overviews/config/locales/crowdin/sv.yml index 0d7e0b72ca..4238481c02 100644 --- a/modules/overviews/config/locales/crowdin/sv.yml +++ b/modules/overviews/config/locales/crowdin/sv.yml @@ -1,3 +1,4 @@ sv: overviews: label: 'Översikt' + permission_manage_overview: 'Manage overview page' diff --git a/modules/overviews/config/locales/crowdin/tr.yml b/modules/overviews/config/locales/crowdin/tr.yml index f0c88f66a5..c1b022abcc 100644 --- a/modules/overviews/config/locales/crowdin/tr.yml +++ b/modules/overviews/config/locales/crowdin/tr.yml @@ -1,3 +1,4 @@ tr: overviews: label: 'Genel Bakış' + permission_manage_overview: 'Genel bakış sayfasını yönet' diff --git a/modules/overviews/config/locales/crowdin/uk.yml b/modules/overviews/config/locales/crowdin/uk.yml index 7ea0854ee6..870c0f7c2e 100644 --- a/modules/overviews/config/locales/crowdin/uk.yml +++ b/modules/overviews/config/locales/crowdin/uk.yml @@ -1,3 +1,4 @@ uk: overviews: label: 'Огляд' + permission_manage_overview: 'Manage overview page' diff --git a/modules/overviews/config/locales/crowdin/vi.yml b/modules/overviews/config/locales/crowdin/vi.yml index edb83d5565..455c692c81 100644 --- a/modules/overviews/config/locales/crowdin/vi.yml +++ b/modules/overviews/config/locales/crowdin/vi.yml @@ -1,3 +1,4 @@ vi: overviews: label: 'Tổng quan' + permission_manage_overview: 'Manage overview page' diff --git a/modules/overviews/config/locales/crowdin/zh-CN.yml b/modules/overviews/config/locales/crowdin/zh-CN.yml index 16c9f4b10c..4505ac4ed4 100644 --- a/modules/overviews/config/locales/crowdin/zh-CN.yml +++ b/modules/overviews/config/locales/crowdin/zh-CN.yml @@ -1,3 +1,4 @@ zh-CN: overviews: label: '概述' + permission_manage_overview: 'Manage overview page' diff --git a/modules/overviews/config/locales/crowdin/zh-TW.yml b/modules/overviews/config/locales/crowdin/zh-TW.yml index 2f98986f8e..c539824e14 100644 --- a/modules/overviews/config/locales/crowdin/zh-TW.yml +++ b/modules/overviews/config/locales/crowdin/zh-TW.yml @@ -1,3 +1,4 @@ zh-TW: overviews: label: '概要' + permission_manage_overview: 'Manage overview page' diff --git a/modules/overviews/config/locales/en.seeders.bim.yml b/modules/overviews/config/locales/en.seeders.bim.yml index f483cb6024..042b246ae4 100644 --- a/modules/overviews/config/locales/en.seeders.bim.yml +++ b/modules/overviews/config/locales/en.seeders.bim.yml @@ -32,7 +32,7 @@ en: projects: demo-construction-project: project-overview: - row_count: 5 + row_count: 6 column_count: 2 widgets: - identifier: 'custom_text' @@ -106,7 +106,7 @@ en: queryId: '##query.id:"Milestones"' demo-planning-constructing-project: project-overview: - row_count: 5 + row_count: 6 column_count: 2 widgets: - identifier: 'custom_text' @@ -176,7 +176,7 @@ en: queryId: '##query.id:"Milestones"' demo-bim-project: project-overview: - row_count: 5 + row_count: 6 column_count: 2 widgets: - identifier: 'custom_text' @@ -249,7 +249,7 @@ en: queryId: '##query.id:"Milestones"' demo-bcf-management-project: project-overview: - row_count: 4 + row_count: 5 column_count: 2 widgets: - identifier: 'custom_text' diff --git a/modules/overviews/config/locales/en.seeders.standard.yml b/modules/overviews/config/locales/en.seeders.standard.yml index 19842ddf36..9a60cc499d 100644 --- a/modules/overviews/config/locales/en.seeders.standard.yml +++ b/modules/overviews/config/locales/en.seeders.standard.yml @@ -32,7 +32,7 @@ en: projects: demo-project: project-overview: - row_count: 5 + row_count: 6 column_count: 2 widgets: - identifier: 'custom_text' @@ -102,7 +102,7 @@ en: queryId: '##query.id:"Milestones"' scrum-project: project-overview: - row_count: 5 + row_count: 6 column_count: 2 widgets: - identifier: 'custom_text' diff --git a/modules/overviews/config/locales/en.yml b/modules/overviews/config/locales/en.yml index 01fc05df23..a58c459884 100644 --- a/modules/overviews/config/locales/en.yml +++ b/modules/overviews/config/locales/en.yml @@ -1,3 +1,4 @@ en: overviews: label: 'Overview' + permission_manage_overview: 'Manage overview page' diff --git a/modules/reporting/config/locales/crowdin/cs.yml b/modules/reporting/config/locales/crowdin/cs.yml index 5eeed761c5..15cd098b9a 100644 --- a/modules/reporting/config/locales/crowdin/cs.yml +++ b/modules/reporting/config/locales/crowdin/cs.yml @@ -22,7 +22,7 @@ cs: button_save_as: "Uložit report jako..." comments: "Komentář" - cost_reports_title: "Time and costs" + cost_reports_title: "Čas a náklady" label_cost_report: "Výkaz nákladů" label_cost_report_plural: "Výkazy nákladů" description_drill_down: "Zobrazit detaily" diff --git a/modules/xls_export/config/locales/crowdin/ro.yml b/modules/xls_export/config/locales/crowdin/ro.yml index 571bee26b7..7b57d0fbab 100644 --- a/modules/xls_export/config/locales/crowdin/ro.yml +++ b/modules/xls_export/config/locales/crowdin/ro.yml @@ -1,13 +1,13 @@ ro: - export_to_excel: "Export XLS" - print_with_description: "Print preview with description" + export_to_excel: "Exportă XLS" + print_with_description: "Previzualizare printare cu descriere" sentence_separator_or: "sau" - different_formats: Different formats + different_formats: Formate diferite export: format: xls: "XLS" - xls_with_descriptions: "XLS with descriptions" - xls_with_relations: "XLS with relations" + xls_with_descriptions: "XLS cu descrieri" + xls_with_relations: "XLS cu relații" xls_export: - child_of: child of - parent_of: parent of + child_of: copil al + parent_of: părinte al