diff --git a/.editorconfig b/.editorconfig index 5dc2447e50..d7da7e3e4c 100644 --- a/.editorconfig +++ b/.editorconfig @@ -280,7 +280,7 @@ ij_javascript_ternary_operation_signs_on_next_line = false ij_javascript_ternary_operation_wrap = off ij_javascript_union_types_wrap = on_every_item ij_javascript_use_chained_calls_group_indents = false -ij_javascript_use_double_quotes = true +ij_javascript_use_double_quotes = false ij_javascript_use_explicit_js_extension = global ij_javascript_use_path_mapping = always ij_javascript_use_public_modifier = false @@ -531,7 +531,7 @@ ij_typescript_ternary_operation_signs_on_next_line = false ij_typescript_ternary_operation_wrap = off ij_typescript_union_types_wrap = on_every_item ij_typescript_use_chained_calls_group_indents = false -ij_typescript_use_double_quotes = true +ij_typescript_use_double_quotes = false ij_typescript_use_explicit_js_extension = global ij_typescript_use_path_mapping = always ij_typescript_use_public_modifier = false diff --git a/.pkgr.yml b/.pkgr.yml index d59d3172b4..1a2b0cfd7e 100644 --- a/.pkgr.yml +++ b/.pkgr.yml @@ -39,7 +39,7 @@ installer: https://github.com/pkgr/installer.git wizards: - https://github.com/pkgr/addon-legacy-installer.git - ./packaging/addons/openproject-edition - - https://github.com/pkgr/addon-postgres + - https://github.com/opf/addon-postgres - https://github.com/pkgr/addon-apache2.git - ./packaging/addons/repositories - https://github.com/pkgr/addon-smtp.git diff --git a/.rubocop.yml b/.rubocop.yml index f746bd2277..c075219109 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -119,6 +119,13 @@ Rails/SkipsModelValidations: Rails/ContentTag: Enabled: false +# Disable I18n.locale = in specs, where it is reset +# by us explicitly +Rails/I18nLocaleAssignment: + Enabled: true + Exclude: + - 'spec/**/*.rb' + # For feature specs, we tend to have longer specs that cover a larger part of the functionality. # This is done for multiple reasons: # * performance, as setting up integration tests is costly diff --git a/Gemfile b/Gemfile index cd831fc472..e959c3688b 100644 --- a/Gemfile +++ b/Gemfile @@ -32,7 +32,7 @@ ruby '~> 2.7.4' gem 'actionpack-xml_parser', '~> 2.0.0' gem 'activemodel-serializers-xml', '~> 1.0.1' -gem 'activerecord-import', '~> 1.1.0' +gem 'activerecord-import', '~> 1.2.0' gem 'activerecord-session_store', '~> 2.0.0' gem 'rails', '~> 6.1.3' gem 'responders', '~> 3.0' @@ -85,7 +85,7 @@ gem 'escape_utils', '~> 1.0' # Syntax highlighting used in html-pipeline with rouge gem 'rouge', '~> 3.26.0' # HTML sanitization used for html-pipeline -gem 'sanitize', '~> 5.2.1' +gem 'sanitize', '~> 6.0.0' # HTML autolinking for mails and urls (replaces autolink) gem 'rinku', '~> 2.0.4' # Version parsing with semver @@ -95,7 +95,8 @@ gem 'semantic', '~> 1.6.1' # used for statistics on svn repositories gem 'svg-graph', '~> 2.2.0' -gem 'date_validator', '~> 0.11.0' +gem 'date_validator', '~> 0.12.0' +gem 'email_validator', '~> 2.2.3' gem 'ruby-duration', '~> 3.2.0' # provide compatible filesystem information for available storage @@ -107,7 +108,7 @@ gem 'posix-spawn', '~> 0.3.13', require: false gem 'bcrypt', '~> 3.1.6' gem 'multi_json', '~> 1.15.0' -gem 'oj', '~> 3.12.0' +gem 'oj', '~> 3.13.0' gem 'daemons' gem 'delayed_cron_job', '~> 0.7.4' @@ -148,7 +149,7 @@ gem 'prawn-markup', '~> 0.3.0' gem 'cells-erb', '~> 0.1.0' gem 'cells-rails', '~> 0.0.9' -gem 'meta-tags', '~> 2.14.0' +gem 'meta-tags', '~> 2.15.0' group :production do # we use dalli as standard memcache client @@ -159,7 +160,7 @@ group :production do gem 'unicorn-worker-killer', require: false end -gem 'i18n-js', '~> 3.8.0' +gem 'i18n-js', '~> 3.9.0' gem 'rails-i18n', '~> 6.0.0' gem 'sprockets', '~> 3.7.0' @@ -167,9 +168,9 @@ gem 'sprockets', '~> 3.7.0' # also, better than thin since we can control worker concurrency. gem 'unicorn' -gem 'puma', '~> 5.3.0' # used for development and optionally for production +gem 'puma', '~> 5.4.0' # used for development and optionally for production -gem 'nokogiri', '~> 1.11.0' +gem 'nokogiri', '~> 1.12.0' gem 'carrierwave', '~> 1.3.1' gem 'carrierwave_direct', '~> 2.1.0' @@ -238,7 +239,7 @@ group :test do gem 'equivalent-xml', '~> 0.6' gem 'json_spec', '~> 1.1.4' - gem 'shoulda-matchers', '~> 4.5', require: nil + gem 'shoulda-matchers', '~> 5.0', require: nil gem 'parallel_tests', '~> 3.1' end @@ -248,7 +249,7 @@ group :ldap do end group :development do - gem 'listen', '~> 3.5.1' # Use for event-based reloaders + gem 'listen', '~> 3.6.0' # Use for event-based reloaders gem 'faker' gem 'letter_opener' @@ -283,7 +284,7 @@ group :development, :test do gem 'pry-stack_explorer', '~> 0.6.0' # Brakeman scanner - gem 'brakeman', '~> 5.0.0' + gem 'brakeman', '~> 5.1.0' gem 'danger-brakeman' end diff --git a/Gemfile.lock b/Gemfile.lock index ac44e16a9a..c7cf3a4bb5 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -164,7 +164,7 @@ PATH remote: modules/two_factor_authentication specs: openproject-two_factor_authentication (1.0.0) - aws-sdk-sns (~> 1.42.0) + aws-sdk-sns (~> 1.44.0) messagebird-rest (~> 1.4.2) rotp (~> 6.1) @@ -236,7 +236,7 @@ GEM activerecord (6.1.4) activemodel (= 6.1.4) activesupport (= 6.1.4) - activerecord-import (1.1.0) + activerecord-import (1.2.0) activerecord (>= 3.2) activerecord-nulldb-adapter (0.7.0) activerecord (>= 5.2.0, < 6.3) @@ -278,21 +278,21 @@ GEM awesome_nested_set (3.4.0) activerecord (>= 4.0.0, < 7.0) aws-eventstream (1.1.1) - aws-partitions (1.478.0) - aws-sdk-core (3.117.0) + aws-partitions (1.484.0) + aws-sdk-core (3.119.0) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.239.0) aws-sigv4 (~> 1.1) jmespath (~> 1.0) - aws-sdk-kms (1.44.0) - aws-sdk-core (~> 3, >= 3.112.0) + aws-sdk-kms (1.46.0) + aws-sdk-core (~> 3, >= 3.119.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.96.1) - aws-sdk-core (~> 3, >= 3.112.0) + aws-sdk-s3 (1.98.0) + aws-sdk-core (~> 3, >= 3.119.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.1) - aws-sdk-sns (1.42.0) - aws-sdk-core (~> 3, >= 3.112.0) + aws-sdk-sns (1.44.0) + aws-sdk-core (~> 3, >= 3.119.0) aws-sigv4 (~> 1.1) aws-sigv4 (1.2.4) aws-eventstream (~> 1, >= 1.0.2) @@ -300,9 +300,9 @@ GEM bindata (2.4.10) binding_of_caller (1.0.0) debug_inspector (>= 0.0.1) - bootsnap (1.7.5) + bootsnap (1.7.7) msgpack (~> 1.0) - brakeman (5.0.4) + brakeman (5.1.1) browser (5.3.1) builder (3.2.4) byebug (11.1.3) @@ -382,7 +382,7 @@ GEM activerecord (>= 5.a) database_cleaner-core (~> 2.0.0) database_cleaner-core (2.0.1) - date_validator (0.11.0) + date_validator (0.12.0) activemodel (>= 3) activesupport (>= 3) debug_inspector (1.1.0) @@ -438,6 +438,8 @@ GEM eventmachine (>= 1.0.0.beta.4) em-synchrony (1.0.6) eventmachine (>= 1.0.0.beta.1) + email_validator (2.2.3) + activemodel equivalent-xml (0.6.0) nokogiri (>= 1.4.3) erbse (0.1.4) @@ -446,7 +448,7 @@ GEM escape_utils (1.2.1) eventmachine (1.2.7) eventmachine_httpserver (0.2.1) - excon (0.84.0) + excon (0.85.0) factory_bot (6.2.0) activesupport (>= 5.0.0) factory_bot_rails (6.2.0) @@ -454,7 +456,7 @@ GEM railties (>= 5.0.0) faker (2.18.0) i18n (>= 1.6, < 2) - faraday (1.5.1) + faraday (1.6.0) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) faraday-excon (~> 1.1) @@ -462,6 +464,7 @@ GEM faraday-net_http (~> 1.0) faraday-net_http_persistent (~> 1.1) faraday-patron (~> 1.0) + faraday-rack (~> 1.0) multipart-post (>= 1.2, < 3) ruby2_keywords (>= 0.0.4) faraday-em_http (1.0.0) @@ -473,10 +476,11 @@ GEM faraday-net_http (1.0.1) faraday-net_http_persistent (1.2.0) faraday-patron (1.0.0) + faraday-rack (1.0.0) fastimage (2.2.4) ffi (1.15.3) flamegraph (0.9.5) - fog-aws (3.10.0) + fog-aws (3.11.0) fog-core (~> 2.1) fog-json (~> 1.1) fog-xml (~> 0.1) @@ -502,8 +506,8 @@ GEM ffi (~> 1.0) git (1.9.1) rchardet (~> 1.8) - globalid (0.4.2) - activesupport (>= 4.2.0) + globalid (0.5.2) + activesupport (>= 5.0) gon (6.4.0) actionpack (>= 3.0.20) i18n (>= 0.7) @@ -531,7 +535,7 @@ GEM httpclient (2.8.3) i18n (1.8.10) concurrent-ruby (~> 1.0) - i18n-js (3.8.3) + i18n-js (3.9.0) i18n (>= 0.6.6) icalendar (2.7.1) ice_cube (~> 0.16) @@ -559,7 +563,7 @@ GEM addressable (~> 2.7) letter_opener (1.7.0) launchy (~> 2.2) - listen (3.5.1) + listen (3.6.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) livingstyleguide (2.1.0) @@ -577,14 +581,14 @@ GEM activesupport (>= 4) railties (>= 4) request_store (~> 1.0) - loofah (2.10.0) + loofah (2.11.0) crass (~> 1.0.2) nokogiri (>= 1.5.9) mail (2.7.1) mini_mime (>= 0.1.1) marcel (1.0.1) messagebird-rest (1.4.2) - meta-tags (2.14.0) + meta-tags (2.15.0) actionpack (>= 3.2.0, < 6.2) method_source (1.0.0) mime-types (3.3.1) @@ -592,7 +596,7 @@ GEM mime-types-data (3.2021.0704) mini_magick (4.11.0) mini_mime (1.1.0) - mini_portile2 (2.5.3) + mini_portile2 (2.6.1) minisyntax (0.2.5) minitest (5.14.4) mixlib-shellout (2.1.0) @@ -606,17 +610,15 @@ GEM nap (1.1.0) net-ldap (0.17.0) netrc (0.11.0) - nio4r (2.5.7) + nio4r (2.5.8) no_proxy_fix (0.1.2) - nokogiri (1.11.7) - mini_portile2 (~> 2.5.0) + nokogiri (1.12.2) + mini_portile2 (~> 2.6.1) racc (~> 1.4) - nokogumbo (2.0.5) - nokogiri (~> 1.8, >= 1.8.4) octokit (4.21.0) faraday (>= 0.9) sawyer (~> 0.8.0, >= 0.5.3) - oj (3.12.1) + oj (3.13.0) okcomputer (1.18.4) omniauth-saml (1.10.3) omniauth (~> 1.3, >= 1.3.2) @@ -686,7 +688,7 @@ GEM eventmachine_httpserver http_parser.rb (~> 0.6.0) multi_json - puma (5.3.2) + puma (5.4.0) nio4r (~> 2.0) racc (1.5.2) rack (2.2.3) @@ -698,7 +700,7 @@ GEM rack (>= 2.0.0) rack-mini-profiler (2.3.2) rack (>= 1.2.0) - rack-oauth2 (1.17.0) + rack-oauth2 (1.18.0) activesupport attr_required httpclient @@ -801,16 +803,16 @@ GEM rspec-retry (0.6.2) rspec-core (> 3.3) rspec-support (3.10.2) - rubocop (1.18.3) + rubocop (1.18.4) parallel (~> 1.10) parser (>= 3.0.0.0) rainbow (>= 2.2.2, < 4.0) regexp_parser (>= 1.8, < 3.0) rexml - rubocop-ast (>= 1.7.0, < 2.0) + rubocop-ast (>= 1.8.0, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 1.4.0, < 3.0) - rubocop-ast (1.7.0) + rubocop-ast (1.9.0) parser (>= 3.0.1.1) rubocop-rails (2.11.3) activesupport (>= 4.2.0) @@ -830,15 +832,14 @@ GEM ruby-saml (1.12.2) nokogiri (>= 1.10.5) rexml - ruby2_keywords (0.0.4) + ruby2_keywords (0.0.5) rubytree (1.0.0) json (~> 2.1) structured_warnings (~> 0.3) rubyzip (2.3.2) - sanitize (5.2.3) + sanitize (6.0.0) crass (~> 1.0.2) - nokogiri (>= 1.8.0) - nokogumbo (~> 2.0) + nokogiri (>= 1.12.0) sassc (2.4.0) ffi (~> 1.9) sassc-rails (2.1.2) @@ -855,21 +856,22 @@ GEM childprocess (>= 0.5, < 4.0) rubyzip (>= 1.2.2) semantic (1.6.1) - sentry-delayed_job (4.6.1) + sentry-delayed_job (4.6.4) + delayed_job (>= 4.0) sentry-ruby-core (~> 4.6.0) - sentry-rails (4.6.1) + sentry-rails (4.6.4) railties (>= 5.0) sentry-ruby-core (~> 4.6.0) - sentry-ruby (4.6.1) + sentry-ruby (4.6.4) concurrent-ruby (~> 1.0, >= 1.0.2) faraday (>= 1.0) - sentry-ruby-core (= 4.6.1) - sentry-ruby-core (4.6.1) + sentry-ruby-core (= 4.6.4) + sentry-ruby-core (4.6.4) concurrent-ruby faraday shoulda-context (2.0.0) - shoulda-matchers (4.5.1) - activesupport (>= 4.2.0) + shoulda-matchers (5.0.0) + activesupport (>= 5.2.0) spreadsheet (1.2.9) ruby-ole spring (2.1.1) @@ -891,7 +893,7 @@ GEM activesupport (>= 3) attr_required (>= 0.0.5) httpclient (>= 2.4) - sys-filesystem (1.4.1) + sys-filesystem (1.4.2) ffi (~> 1.1) table_print (1.5.7) temple (0.8.2) @@ -936,8 +938,8 @@ GEM webfinger (1.1.0) activesupport httpclient (>= 2.4) - webmock (3.13.0) - addressable (>= 2.3.6) + webmock (3.14.0) + addressable (>= 2.8.0) crack (>= 0.3.2) hashdiff (>= 0.4.0, < 2.0.0) websocket-driver (0.7.5) @@ -956,7 +958,7 @@ PLATFORMS DEPENDENCIES actionpack-xml_parser (~> 2.0.0) activemodel-serializers-xml (~> 1.0.1) - activerecord-import (~> 1.1.0) + activerecord-import (~> 1.2.0) activerecord-nulldb-adapter (~> 0.7.0) activerecord-session_store (~> 2.0.0) acts_as_list (~> 1.0.1) @@ -969,7 +971,7 @@ DEPENDENCIES aws-sdk-s3 (~> 1.91) bcrypt (~> 3.1.6) bootsnap (~> 1.7.0) - brakeman (~> 5.0.0) + brakeman (~> 5.1.0) browser (~> 5.3.0) budgets! capybara (~> 3.35.0) @@ -986,12 +988,13 @@ DEPENDENCIES danger-brakeman dashboards! database_cleaner (~> 2.0) - date_validator (~> 0.11.0) + date_validator (~> 0.12.0) deckar01-task_list (~> 2.3.1) delayed_cron_job (~> 0.7.4) delayed_job_active_record (~> 4.1.5) disposable (~> 0.4.7) doorkeeper (~> 5.5.0) + email_validator (~> 2.2.3) equivalent-xml (~> 0.6) escape_utils (~> 1.0) factory_bot (~> 6.2.0) @@ -1006,21 +1009,21 @@ DEPENDENCIES grids! html-pipeline (~> 2.14.0) htmldiff - i18n-js (~> 3.8.0) + i18n-js (~> 3.9.0) json_spec (~> 1.1.4) ladle launchy (~> 2.5.0) letter_opener - listen (~> 3.5.1) + listen (~> 3.6.0) livingstyleguide (~> 2.1.0) lograge (~> 0.11.0) - meta-tags (~> 2.14.0) + meta-tags (~> 2.15.0) mini_magick (~> 4.11.0) multi_json (~> 1.15.0) my_page! net-ldap (~> 0.17.0) - nokogiri (~> 1.11.0) - oj (~> 3.12.0) + nokogiri (~> 1.12.0) + oj (~> 3.13.0) okcomputer (~> 1.18.1) omniauth! omniauth-openid-connect! @@ -1058,7 +1061,7 @@ DEPENDENCIES pry-rescue (~> 1.5.2) pry-stack_explorer (~> 0.6.0) puffing-billy (~> 2.4.0) - puma (~> 5.3.0) + puma (~> 5.4.0) rack-attack (~> 6.5.0) rack-cors (~> 1.1.1) rack-mini-profiler @@ -1086,7 +1089,7 @@ DEPENDENCIES ruby-prof ruby-progressbar (~> 1.11.0) rubytree (~> 1.0.0) - sanitize (~> 5.2.1) + sanitize (~> 6.0.0) sassc-rails secure_headers (~> 6.3.0) selenium-webdriver (~> 3.14) @@ -1095,7 +1098,7 @@ DEPENDENCIES sentry-rails (~> 4.6.0) sentry-ruby (~> 4.6.0) shoulda-context (~> 2.0) - shoulda-matchers (~> 4.5) + shoulda-matchers (~> 5.0) spring spring-commands-rspec sprockets (~> 3.7.0) diff --git a/app/contracts/work_packages/base_contract.rb b/app/contracts/work_packages/base_contract.rb index eb840f8590..b7dde3912c 100644 --- a/app/contracts/work_packages/base_contract.rb +++ b/app/contracts/work_packages/base_contract.rb @@ -117,6 +117,7 @@ module WorkPackages validate :validate_parent_exists validate :validate_parent_in_same_project validate :validate_parent_not_subtask + validate :validate_parent_not_self validate :validate_status_exists validate :validate_status_transition @@ -231,6 +232,13 @@ module WorkPackages end end + def validate_parent_not_self + if model.parent == model + + errors.add :parent, :cannot_be_self_assigned + end + end + def validate_parent_in_same_project if parent_in_different_project? errors.add :parent, :cannot_be_in_another_project diff --git a/app/controllers/wiki_controller.rb b/app/controllers/wiki_controller.rb index 3ddfd16177..df476838ee 100644 --- a/app/controllers/wiki_controller.rb +++ b/app/controllers/wiki_controller.rb @@ -439,10 +439,6 @@ class WikiController < ApplicationController @page&.ancestors&.any? end - def show_local_breadcrumb_defaults - false - end - def redirect_to_show redirect_to action: :show, project_id: @project, id: @page end diff --git a/app/helpers/breadcrumb_helper.rb b/app/helpers/breadcrumb_helper.rb index 3d91459c54..7d7ea5ee6b 100644 --- a/app/helpers/breadcrumb_helper.rb +++ b/app/helpers/breadcrumb_helper.rb @@ -30,13 +30,7 @@ module BreadcrumbHelper def full_breadcrumb - if show_defaults - breadcrumb_list(link_to(icon_wrapper('icon2 icon-home', I18n.t(:label_home)), home_path), - link_to_project_ancestors(@project), - *breadcrumb_paths) - else - breadcrumb_list(*breadcrumb_paths) - end + breadcrumb_list(*breadcrumb_paths) end def breadcrumb(*args) @@ -48,17 +42,13 @@ module BreadcrumbHelper elements = args.flatten breadcrumb_elements = [content_tag(:li, elements.shift.to_s, - class: 'first-breadcrumb-element', - style: 'list-style-image:none;')] + class: 'first-breadcrumb-element')] breadcrumb_elements += elements.map do |element| if element - css_class = if element.try(:include?, 'op-breadcrumb-project-title') - 'op-breadcrumb-project-element ' - end content_tag(:li, h(element.to_s), - class: "#{css_class} icon4 icon-small icon-arrow-right5") + class: "icon4 icon-small icon-arrow-right5") end end @@ -83,28 +73,4 @@ module BreadcrumbHelper false end end - - def show_defaults - if !!(defined? show_local_breadcrumb_defaults) - show_local_breadcrumb_defaults - else - false - end - end - - private - - def link_to_project_ancestors(project) - if project && !project.new_record? - ancestors = (project.root? ? [] : project.ancestors.visible.to_a) - ancestors << project - ancestors.map do |p| - if p == project - link_to_project(p, { only_path: false }, title: p, class: 'op-breadcrumb-project-title nocut').html_safe - else - link_to_project(p, { jump: current_menu_item }, title: p, class: 'op-breadcrumb-project-title').html_safe - end - end - end - end end diff --git a/app/helpers/project_settings_helper.rb b/app/helpers/project_settings_helper.rb index 858b695903..63f308e8f3 100644 --- a/app/helpers/project_settings_helper.rb +++ b/app/helpers/project_settings_helper.rb @@ -40,6 +40,7 @@ module ProjectSettingsHelper { name: 'modules', action: { controller: '/project_settings/modules', action: 'show' }, + if: ->(project) { User.current.allowed_to?(:select_project_modules, project) }, label: :label_module_plural }, { diff --git a/app/models/application_record.rb b/app/models/application_record.rb index a08a72cab0..09cc72c52f 100644 --- a/app/models/application_record.rb +++ b/app/models/application_record.rb @@ -7,6 +7,14 @@ class ApplicationRecord < ::ActiveRecord::Base saved_change_to_attribute?(:id) end + ## + # Returns whether the given attribute is free of errors + def valid_attribute?(attribute) + valid? # Ensure validations have run + + errors[attribute].empty? + end + ## # Get the newest recently changed resource for the given record classes # diff --git a/app/models/notification.rb b/app/models/notification.rb index 3643609186..e4de893c4a 100644 --- a/app/models/notification.rb +++ b/app/models/notification.rb @@ -1,7 +1,19 @@ class Notification < ApplicationRecord - enum reason_ian: { mentioned: 0, involved: 1, watched: 2, subscribed: 3 }, _prefix: :ian - enum reason_mail: { mentioned: 0, involved: 1, watched: 2, subscribed: 3 }, _prefix: :mail - enum reason_mail_digest: { mentioned: 0, involved: 1, watched: 2, subscribed: 3 }, _prefix: :mail_digest + REASONS = { + mentioned: 0, + involved: 1, + watched: 2, + subscribed: 3, + commented: 4, + created: 5, + processed: 6, + prioritized: 7, + scheduled: 8 + }.freeze + + enum reason_ian: REASONS, _prefix: :ian + enum reason_mail: REASONS, _prefix: :mail + enum reason_mail_digest: REASONS, _prefix: :mail_digest belongs_to :recipient, class_name: 'User' belongs_to :actor, class_name: 'User' diff --git a/app/models/queries/notifications.rb b/app/models/queries/notifications.rb index 40143482e5..a7b7acdf97 100644 --- a/app/models/queries/notifications.rb +++ b/app/models/queries/notifications.rb @@ -29,18 +29,18 @@ #++ module Queries::Notifications - Queries::Register.filter Queries::Notifications::NotificationQuery, - Queries::Notifications::Filters::ReadIanFilter + [Queries::Notifications::Filters::ReadIanFilter, + Queries::Notifications::Filters::IdFilter, + Queries::Notifications::Filters::ResourceIdFilter, + Queries::Notifications::Filters::ResourceTypeFilter].each do |filter| + Queries::Register.filter Queries::Notifications::NotificationQuery, + filter + end - Queries::Register.filter Queries::Notifications::NotificationQuery, - Queries::Notifications::Filters::IdFilter - - Queries::Register.order Queries::Notifications::NotificationQuery, - Queries::Notifications::Orders::DefaultOrder - - Queries::Register.order Queries::Notifications::NotificationQuery, - Queries::Notifications::Orders::ReasonOrder - - Queries::Register.order Queries::Notifications::NotificationQuery, - Queries::Notifications::Orders::ReadIanOrder + [Queries::Notifications::Orders::DefaultOrder, + Queries::Notifications::Orders::ReasonOrder, + Queries::Notifications::Orders::ReadIanOrder].each do |order| + Queries::Register.order Queries::Notifications::NotificationQuery, + order + end end diff --git a/app/models/queries/notifications/filters/resource_id_filter.rb b/app/models/queries/notifications/filters/resource_id_filter.rb new file mode 100644 index 0000000000..80f369d733 --- /dev/null +++ b/app/models/queries/notifications/filters/resource_id_filter.rb @@ -0,0 +1,41 @@ +#-- encoding: UTF-8 + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) 2012-2021 the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See docs/COPYRIGHT.rdoc for more details. +#++ + +class Queries::Notifications::Filters::ResourceIdFilter < Queries::Notifications::Filters::NotificationFilter + def allowed_values + WorkPackage + .visible(User.current) + .pluck(:id, :id) + end + + def type + :list + end +end diff --git a/app/models/queries/notifications/filters/resource_type_filter.rb b/app/models/queries/notifications/filters/resource_type_filter.rb new file mode 100644 index 0000000000..f49164354b --- /dev/null +++ b/app/models/queries/notifications/filters/resource_type_filter.rb @@ -0,0 +1,39 @@ +#-- encoding: UTF-8 + +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) 2012-2021 the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See docs/COPYRIGHT.rdoc for more details. +#++ + +class Queries::Notifications::Filters::ResourceTypeFilter < Queries::Notifications::Filters::NotificationFilter + def allowed_values + [[WorkPackage.name, WorkPackage.name]] + end + + def type + :list + end +end diff --git a/app/models/user.rb b/app/models/user.rb index 7c4ab0170a..44482ecf55 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -99,7 +99,7 @@ class User < Principal :firstname, :lastname, :mail, - unless: Proc.new { |user| user.is_a?(AnonymousUser) || user.is_a?(DeletedUser) || user.is_a?(SystemUser) } + unless: Proc.new { |user| user.builtin? } validates_uniqueness_of :login, if: Proc.new { |user| !user.login.blank? }, case_sensitive: false validates_uniqueness_of :mail, allow_blank: true, case_sensitive: false @@ -107,7 +107,7 @@ class User < Principal validates_format_of :login, with: /\A[a-z0-9_\-@.+ ]*\z/i validates_length_of :login, maximum: 256 validates_length_of :firstname, :lastname, maximum: 256 - validates_format_of :mail, with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i, allow_blank: true + validates :mail, email: true, unless: Proc.new { |user| user.mail.blank? } validates_length_of :mail, maximum: 256, allow_nil: true validates_confirmation_of :password, allow_nil: true diff --git a/app/services/notifications/journal_wp_notification_service.rb b/app/services/notifications/journal_wp_notification_service.rb index f6d6acfc0c..895e1414bd 100644 --- a/app/services/notifications/journal_wp_notification_service.rb +++ b/app/services/notifications/journal_wp_notification_service.rb @@ -43,7 +43,7 @@ class Notifications::JournalWpNotificationService def call(journal, send_notifications) return nil if abort_sending?(journal, send_notifications) - notification_receivers(journal.journable, journal).each do |recipient_id, channel_reasons| + notification_receivers(journal).each do |recipient_id, channel_reasons| create_notification(journal, recipient_id, channel_reasons) @@ -77,19 +77,22 @@ class Notifications::JournalWpNotificationService } end - def notification_receivers(work_package, journal) + def notification_receivers(journal) receivers = receivers_hash - add_receiver(receivers, settings_of_mentioned(journal), :mentioned) - add_receiver(receivers, settings_of_involved(journal), :involved) - add_receiver(receivers, settings_of_watched(work_package), :watched) - add_receiver(receivers, settings_of_subscribed(journal), :subscribed) + %i(mentioned involved watched subscribed commented created processed prioritized scheduled).each do |reason| + add_receivers_by_reason(receivers, journal, reason) + end remove_self_recipient(receivers, journal) receivers end + def add_receivers_by_reason(receivers, journal, reason) + add_receiver(receivers, send(:"settings_of_#{reason}", journal), reason) + end + def settings_of_mentioned(journal) applicable_settings(mentioned_ids(journal), journal.data.project, @@ -114,12 +117,56 @@ class Notifications::JournalWpNotificationService :all) end - def settings_of_watched(work_package) + def settings_of_watched(journal) + work_package = journal.journable + applicable_settings(work_package.watcher_users, work_package.project, :watched) end + def settings_of_commented(journal) + return NotificationSetting.none unless journal.notes? + + applicable_settings(User.all, + journal.data.project, + :work_package_commented) + end + + def settings_of_created(journal) + return NotificationSetting.none unless journal.initial? + + applicable_settings(User.all, + journal.data.project, + :work_package_created) + end + + def settings_of_processed(journal) + return NotificationSetting.none unless !journal.initial? && journal.details.has_key?(:status_id) + + applicable_settings(User.all, + journal.data.project, + :work_package_processed) + end + + def settings_of_prioritized(journal) + return NotificationSetting.none unless !journal.initial? && journal.details.has_key?(:priority_id) + + applicable_settings(User.all, + journal.data.project, + :work_package_prioritized) + end + + def settings_of_scheduled(journal) + if journal.initial? || !(journal.details.has_key?(:start_date) || journal.details.has_key?(:due_date)) + return NotificationSetting.none + end + + applicable_settings(User.all, + journal.data.project, + :work_package_scheduled) + end + def applicable_settings(user_scope, project, reason) NotificationSetting .applicable(project) @@ -158,15 +205,7 @@ class Notifications::JournalWpNotificationService end def send_notification?(journal, send_notifications) - send_notifications && ::UserMailer.perform_deliveries && send_notification_setting?(journal) - end - - def send_notification_setting?(journal) - notify_for_wp_added?(journal) || - notify_for_wp_updated?(journal) || - notify_for_notes?(journal) || - notify_for_status?(journal) || - notify_for_priority(journal) + send_notifications && ::UserMailer.perform_deliveries end def mention_matches(journal) @@ -190,32 +229,6 @@ class Notifications::JournalWpNotificationService } end - def notify_for_wp_added?(journal) - notification_enabled?('work_package_added') && journal.initial? - end - - def notify_for_wp_updated?(journal) - notification_enabled?('work_package_updated') && !journal.initial? - end - - def notify_for_notes?(journal) - notification_enabled?('work_package_note_added') && journal.notes.present? - end - - def notify_for_status?(journal) - notification_enabled?('status_updated') && - journal.details.has_key?(:status_id) - end - - def notify_for_priority(journal) - notification_enabled?('work_package_priority_updated') && - journal.details.has_key?(:priority_id) - end - - def notification_enabled?(name) - Setting.notified_events.include?(name) - end - def abort_sending?(journal, send_notifications) !send_notification?(journal, send_notifications) || journal.noop? end diff --git a/app/services/service_result.rb b/app/services/service_result.rb index f604cce82c..2f1e707e68 100644 --- a/app/services/service_result.rb +++ b/app/services/service_result.rb @@ -180,14 +180,13 @@ class ServiceResult private def initialize_errors(errors) - self.errors = - if errors - errors - elsif result.respond_to?(:errors) - result.errors - else - ActiveModel::Errors.new(self) - end + self.errors = errors || new_errors_with_result + end + + def new_errors_with_result + ActiveModel::Errors.new(self).tap do |errors| + errors.merge!(result) if result.try(:errors).present? + end end def get_message_type diff --git a/app/services/user_preferences/update_service.rb b/app/services/user_preferences/update_service.rb index c2f57b0e26..e127776e37 100644 --- a/app/services/user_preferences/update_service.rb +++ b/app/services/user_preferences/update_service.rb @@ -83,7 +83,15 @@ module UserPreferences on_duplicate_key_update: { conflict_target: conflict_target, index_predicate: index_predicate, - columns: %i[watched involved mentioned all] + columns: %i[watched + involved + mentioned + work_package_commented + work_package_created + work_package_processed + work_package_prioritized + work_package_scheduled + all] }, validate: false ).ids diff --git a/app/services/users/set_attributes_service.rb b/app/services/users/set_attributes_service.rb index 84d8f921ae..ce27ce5102 100644 --- a/app/services/users/set_attributes_service.rb +++ b/app/services/users/set_attributes_service.rb @@ -42,7 +42,7 @@ module Users def set_default_attributes(_params) # Assign values other than mail to new_user when invited - if model.invited? && model.mail.present? + if model.invited? && model.valid_attribute?(:mail) ::UserInvitation.assign_user_attributes model end diff --git a/app/views/account/_password_login_form.html.erb b/app/views/account/_password_login_form.html.erb index 9efd68ec1b..e3583c6208 100644 --- a/app/views/account/_password_login_form.html.erb +++ b/app/views/account/_password_login_form.html.erb @@ -78,7 +78,7 @@ See docs/COPYRIGHT.rdoc for more details.
+ data-modal-class-name="registration-modal -highlight"> <% @user ||= User.new %> <%= render partial: '/account/register' %>
diff --git a/app/views/admin/settings/notifications_settings/show.html.erb b/app/views/admin/settings/notifications_settings/show.html.erb index b3259d5213..078066b1ad 100644 --- a/app/views/admin/settings/notifications_settings/show.html.erb +++ b/app/views/admin/settings/notifications_settings/show.html.erb @@ -66,6 +66,9 @@ See docs/COPYRIGHT.rdoc for more details. <%= notification_field notifiable %> <% end %> + + <%= t(:'settings.notifications.events_explanation') %> + diff --git a/app/views/users/_simple_form.html.erb b/app/views/users/_simple_form.html.erb index 48445b18f6..da05493ae6 100644 --- a/app/views/users/_simple_form.html.erb +++ b/app/views/users/_simple_form.html.erb @@ -27,8 +27,6 @@ See docs/COPYRIGHT.rdoc for more details. ++#%> -<%= error_messages_for 'user' %> - <% content_for :header_tags do %> <% end %> diff --git a/bin/setup_dev b/bin/setup_dev index a812f10e00..311d7327d0 100755 --- a/bin/setup_dev +++ b/bin/setup_dev @@ -11,6 +11,9 @@ printf "Bundling rails dependencies ... " try 'bundle install > log/setup_dev.log' echo "done." +echo "Removing public frontend assets" +try 'rm -rf public/assets/frontend >> log/setup_dev.log' + echo "Installing node_modules ... " try '(cd frontend && npm ci) >> log/setup_dev.log' diff --git a/config/locales/crowdin/ar.yml b/config/locales/crowdin/ar.yml index b7acff5c9c..e8c04cb3b0 100644 --- a/config/locales/crowdin/ar.yml +++ b/config/locales/crowdin/ar.yml @@ -545,6 +545,7 @@ ar: error_enterprise_only: "is only available in the OpenProject Enterprise Edition" error_unauthorized: "may not be accessed." error_readonly: "was attempted to be written but is not writable." + email: "is not a valid email address." empty: "لا يمكن أن تكون فارغة." even: "يجب أن يكون زوجي." exclusion: "محجوز." @@ -705,6 +706,7 @@ ar: not_start_date: "ليس في تاريخ البدء، وعلى الرغم من أن هذا المطلوب للمعالم." parent: cannot_be_milestone: "لا يمكن أن يكون معلما." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "لا يمكن أن يكون في مشروع آخر." not_a_valid_parent: "غير صالح." start_date: @@ -1380,6 +1382,7 @@ ar: expiration: "انتهاء الصلاحية" indefinite_expiration: "أبداً" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1516,6 +1519,7 @@ ar: label_deleted: "محذوف" label_deleted_custom_field: "(حذف حقل مخصص)" label_deleted_custom_option: "(deleted option)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "ترتيب تنازلي" label_details: "تفاصيل" label_development_roadmap: "خارطة طريق التطوير" @@ -1689,7 +1693,6 @@ ar: label_none_parentheses: "(بلا)" label_not_contains: "لا يحتوي على" label_not_equals: "ليس" - label_notify_member_plural: "تحديثات البريد الالكتروني" label_on: "في" label_open_menu: "فتح القائمة" label_open_work_packages: "افتح" @@ -1809,7 +1812,6 @@ ar: label_start_to_start: "البداية إلى البداية" label_statistics: "إحصائيات" label_status: "الحالة" - label_status_updated: "تم تحديث حالة مجموعة العمل" label_stay_logged_in: "ابقَ متصل" label_storage_free_space: "المساحة المتبقية من القرص" label_storage_used_space: "استخدام مساحة القرص" @@ -1893,21 +1895,17 @@ ar: label_wiki_show_submenu_item: "إظهار كعنصر قائمة فرعية من " label_wiki_start: "صفحة البداية" label_work_package: "مجموعة العمل" - label_work_package_added: "تم إضافة مجموعة عمل" label_work_package_attachments: "Work package attachments" label_work_package_category_new: "فئة جديدة" label_work_package_category_plural: "فئات مجموعة العمل" label_work_package_hierarchy: "التسلسل الهرمي لمجموعة العمل" label_work_package_new: "مجموعة عمل جديدة" - label_work_package_note_added: "تم إضافة ملاحظة مجموعة العمل" label_work_package_edit: "تعديل مجموعة العمل %{name}" label_work_package_plural: "مجموعات العمل" - label_work_package_priority_updated: "تم تحديث مجموعات العمل حسب الأولوية" label_work_package_status: "حالة مجموعة العمل" label_work_package_status_new: "حالة جديدة" label_work_package_status_plural: "حالات مجموعة العمل" label_work_package_types: "أنواع مجموعة العمل" - label_work_package_updated: "تم تحديث مجموعة العمل" label_work_package_tracking: "تتبع مجموعة العمل" label_work_package_view_all: "عرض جميع مجموعات العمل" label_workflow: "سير العمل" @@ -2477,6 +2475,7 @@ ar: Set the number of days notification events for users (the source for in-app notifications) will be kept in the system. Any events older than this time will be deleted. delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > If either options "%{day_of_week_setting_name}" or "%{first_week_setting_name}" are set, the other has to be set as well to avoid inconsistencies in the frontend. @@ -2558,8 +2557,8 @@ ar: text_work_packages_ref_in_commit_messages: "تحديد المراجع وتثبيت مجموعات العمل في رسائل commit" text_journal_added: "%{value} %{label} أضيف" text_journal_aggregation_time_explanation: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent." - text_journal_changed: "%{label} changed from %{old}
to %{new}" - text_journal_changed_plain: "%{label} changed from %{old} \nto %{new}" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label} تم تحديثه" text_journal_changed_with_diff: "%{label} تغير (%{link})" text_journal_deleted: "%{label} تم حذفه (%{old})" diff --git a/config/locales/crowdin/bg.yml b/config/locales/crowdin/bg.yml index 1f468898bc..427945a44d 100644 --- a/config/locales/crowdin/bg.yml +++ b/config/locales/crowdin/bg.yml @@ -541,6 +541,7 @@ bg: error_enterprise_only: "се предлага само в OpenProject Enterprise Edition" error_unauthorized: "may not be accessed." error_readonly: "was attempted to be written but is not writable." + email: "is not a valid email address." empty: "не може да бъде празно." even: "трябва да бъде четно число." exclusion: "е запазено." @@ -701,6 +702,7 @@ bg: not_start_date: "не е на начална дата, въпреки че това е необходимо за важни събития." parent: cannot_be_milestone: "не може да бъде крайъгълен камък." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "не може да бъде в друг проект." not_a_valid_parent: "е невалиден." start_date: @@ -1312,6 +1314,7 @@ bg: expiration: "Изтича на" indefinite_expiration: "Никога" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1448,6 +1451,7 @@ bg: label_deleted: "изтрит" label_deleted_custom_field: "(изтрито потребителско поле)" label_deleted_custom_option: "(deleted option)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "Низходящо" label_details: "Подробности" label_development_roadmap: "Развитие на пътната карта" @@ -1621,7 +1625,6 @@ bg: label_none_parentheses: "(none)" label_not_contains: "doesn't contain" label_not_equals: "is not" - label_notify_member_plural: "Email updates" label_on: "на" label_open_menu: "Open menu" label_open_work_packages: "open" @@ -1741,7 +1744,6 @@ bg: label_start_to_start: "start to start" label_statistics: "Статистика" label_status: "Състояние" - label_status_updated: "Work package status updated" label_stay_logged_in: "Stay logged in" label_storage_free_space: "Оставащо дисково пространство" label_storage_used_space: "Използвано дисково пространство" @@ -1825,21 +1827,17 @@ bg: label_wiki_show_submenu_item: "Покажи като елемент от подменюто на " label_wiki_start: "Начална страница" label_work_package: "Работен пакет" - label_work_package_added: "Работния пакет е добавен" label_work_package_attachments: "Work package attachments" label_work_package_category_new: "Нова категория" label_work_package_category_plural: "Категории работни пакети" label_work_package_hierarchy: "Work package hierarchy" label_work_package_new: "Нов работен пакет" - label_work_package_note_added: "Бележка за работен пакет добавена" label_work_package_edit: "Редактиране на работен пакет %{name}" label_work_package_plural: "Работни пакети" - label_work_package_priority_updated: "Приоритет на работни пакети актуализиран" label_work_package_status: "Статус на работен пакет" label_work_package_status_new: "Ново състояние" label_work_package_status_plural: "Статуси на работни пакети" label_work_package_types: "Видове работни пакети" - label_work_package_updated: "Актуализиран работен пакет" label_work_package_tracking: "Проследяване на работен пакет" label_work_package_view_all: "Покажи всички работни пакети" label_workflow: "Работен поток" @@ -2407,6 +2405,7 @@ bg: Set the number of days notification events for users (the source for in-app notifications) will be kept in the system. Any events older than this time will be deleted. delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > If either options "%{day_of_week_setting_name}" or "%{first_week_setting_name}" are set, the other has to be set as well to avoid inconsistencies in the frontend. @@ -2488,8 +2487,8 @@ bg: text_work_packages_ref_in_commit_messages: "Referencing and fixing work packages in commit messages" text_journal_added: "%{label} %{value} added" text_journal_aggregation_time_explanation: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent." - text_journal_changed: "%{label} changed from %{old}
to %{new}" - text_journal_changed_plain: "%{label} changed from %{old} \nto %{new}" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label} updated" text_journal_changed_with_diff: "%{label} changed (%{link})" text_journal_deleted: "%{label} deleted (%{old})" diff --git a/config/locales/crowdin/ca.yml b/config/locales/crowdin/ca.yml index 910303628c..fb4d2e2922 100644 --- a/config/locales/crowdin/ca.yml +++ b/config/locales/crowdin/ca.yml @@ -541,6 +541,7 @@ ca: error_enterprise_only: "is only available in the OpenProject Enterprise Edition" error_unauthorized: "may not be accessed." error_readonly: "was attempted to be written but is not writable." + email: "is not a valid email address." empty: "no pot estar buit." even: "ha de ser parell." exclusion: "està reservat." @@ -701,6 +702,7 @@ ca: not_start_date: "no és en la data d'inici, tot i que és necessari per les fites." parent: cannot_be_milestone: "no pot ser una fita." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "no pot estar en un altre projecte." not_a_valid_parent: "no és vàlid." start_date: @@ -1312,6 +1314,7 @@ ca: expiration: "Caduca" indefinite_expiration: "Mai" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1448,6 +1451,7 @@ ca: label_deleted: "suprimit" label_deleted_custom_field: "(camp personalitzat suprimit)" label_deleted_custom_option: "(deleted option)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "Descendent" label_details: "Detalls" label_development_roadmap: "Full de ruta de desenvolupament" @@ -1621,7 +1625,6 @@ ca: label_none_parentheses: "(cap)" label_not_contains: "no conté" label_not_equals: "no és" - label_notify_member_plural: "Actualitzacions per correu electrònic" label_on: "en" label_open_menu: "Obrir menú" label_open_work_packages: "obrir" @@ -1741,7 +1744,6 @@ ca: label_start_to_start: "de principi a principi" label_statistics: "Estadí­stiques" label_status: "Estat" - label_status_updated: "Paquet de treball actualitzat" label_stay_logged_in: "Manté l'entrada" label_storage_free_space: "Espai de disc restant" label_storage_used_space: "Espai de disc utilitzat" @@ -1825,21 +1827,17 @@ ca: label_wiki_show_submenu_item: "Mostrar com element de submenú de " label_wiki_start: "Pàgina d'inici" label_work_package: "Paquet de treball" - label_work_package_added: "Paquet de treball afegit" label_work_package_attachments: "Work package attachments" label_work_package_category_new: "Nova categoria" label_work_package_category_plural: "Categories de paquet de treball" label_work_package_hierarchy: "Work package hierarchy" label_work_package_new: "Paquet de treball nou" - label_work_package_note_added: "Afegida nota al paquet de treball" label_work_package_edit: "Editar paquet de treball %{name}" label_work_package_plural: "Paquets de treball" - label_work_package_priority_updated: "Actualitzada la prioritat del paquet de treball" label_work_package_status: "Estat del paquet de treball" label_work_package_status_new: "Nou estat" label_work_package_status_plural: "Estats de paquet de treball" label_work_package_types: "Tipus de paquets de treball" - label_work_package_updated: "Paquet de treball actualitzat" label_work_package_tracking: "Paquet de treball de seguiment" label_work_package_view_all: "Veure tots els paquets de treball" label_workflow: "Flux de treball" @@ -2405,6 +2403,7 @@ ca: Set the number of days notification events for users (the source for in-app notifications) will be kept in the system. Any events older than this time will be deleted. delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > If either options "%{day_of_week_setting_name}" or "%{first_week_setting_name}" are set, the other has to be set as well to avoid inconsistencies in the frontend. @@ -2486,8 +2485,8 @@ ca: text_work_packages_ref_in_commit_messages: "Referència i arregla els paquets de treball en els missatges dels commits" text_journal_added: "S'ha afegit %{label} %{value}" text_journal_aggregation_time_explanation: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent." - text_journal_changed: "%{label} changed from %{old}
to %{new}" - text_journal_changed_plain: "%{label} changed from %{old} \nto %{new}" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "S'ha actualitzat %{label}" text_journal_changed_with_diff: "%{label} canviat (%{link})" text_journal_deleted: "%{label} s'ha suprimit (%{old})" diff --git a/config/locales/crowdin/cs.yml b/config/locales/crowdin/cs.yml index 88b03478ef..0eea611eac 100644 --- a/config/locales/crowdin/cs.yml +++ b/config/locales/crowdin/cs.yml @@ -543,6 +543,7 @@ cs: error_enterprise_only: "is only available in the OpenProject Enterprise Edition" error_unauthorized: "may not be accessed." error_readonly: "was attempted to be written but is not writable." + email: "is not a valid email address." empty: "nemůže být prázdné." even: "musí být sudé." exclusion: "vyhrazeno." @@ -703,6 +704,7 @@ cs: not_start_date: "není v počátečním datu, i když je to nutné pro milníky." parent: cannot_be_milestone: "nemůže být milník." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "nemůže být v jiném projektu." not_a_valid_parent: "je neplatné." start_date: @@ -1346,6 +1348,7 @@ cs: expiration: "Vyprší" indefinite_expiration: "Nikdy" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1482,6 +1485,7 @@ cs: label_deleted: "Smazáno" label_deleted_custom_field: "(odstraněno vlastní pole)" label_deleted_custom_option: "(deleted option)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "Sestupně" label_details: "Podrobnosti" label_development_roadmap: "Plán vývoje" @@ -1655,7 +1659,6 @@ cs: label_none_parentheses: "(žádný)" label_not_contains: "neobsahuje" label_not_equals: "není" - label_notify_member_plural: "Aktualizace e-mailu" label_on: "zapnuto" label_open_menu: "Otevřít nabídku" label_open_work_packages: "otevřít" @@ -1775,7 +1778,6 @@ cs: label_start_to_start: "od začátku do začátku" label_statistics: "Statistika" label_status: "Stav" - label_status_updated: "Stav Pracovního balíčku byl aktualizovaný" label_stay_logged_in: "Zůstat přihlášený" label_storage_free_space: "Zbývající místo na disku" label_storage_used_space: "Použité místo na disku" @@ -1859,21 +1861,17 @@ cs: label_wiki_show_submenu_item: "Zobrazit jako položku podnabídky " label_wiki_start: "Úvodní stránka" label_work_package: "Pracovní balíček" - label_work_package_added: "Pracovní balíček přidán" label_work_package_attachments: "Přílohy pracovních balíčků" label_work_package_category_new: "Nová kategorie" label_work_package_category_plural: "Kategorie pracovních balíčků" label_work_package_hierarchy: "Hierarchie pracovních balíčků" label_work_package_new: "Nový pracovní balíček" - label_work_package_note_added: "Poznámka k pracovnímu balíčku přidána" label_work_package_edit: "Upravit pracovní balíček %{name}" label_work_package_plural: "Pracovní balíčky" - label_work_package_priority_updated: "Priorita pracovního balíčku aktualizována" label_work_package_status: "Stav pracovního balíčku" label_work_package_status_new: "Nový stav" label_work_package_status_plural: "Stav pracovního balíčku" label_work_package_types: "Typy pracovních balíčků" - label_work_package_updated: "Pracovní balíček aktualizován" label_work_package_tracking: "Sledování pracovních balíčků" label_work_package_view_all: "Zobrazit všechny pracovní balíčky" label_workflow: "Pracovní vrstva" @@ -2442,6 +2440,7 @@ cs: Set the number of days notification events for users (the source for in-app notifications) will be kept in the system. Any events older than this time will be deleted. delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > If either options "%{day_of_week_setting_name}" or "%{first_week_setting_name}" are set, the other has to be set as well to avoid inconsistencies in the frontend. @@ -2523,8 +2522,8 @@ cs: text_work_packages_ref_in_commit_messages: "Odkazování a opravování pracovních balíčků ve zprávách commitu" text_journal_added: "%{label} %{value} přidán" text_journal_aggregation_time_explanation: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent." - text_journal_changed: "%{label} změněn z %{old}
na %{new}" - text_journal_changed_plain: "%{label} změněn z %{old} \nna %{new}" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label} aktualizován" text_journal_changed_with_diff: "%{label} změněn (%{link})" text_journal_deleted: "%{label} smazán (%{old})" diff --git a/config/locales/crowdin/da.yml b/config/locales/crowdin/da.yml index d102a8a755..9e14980456 100644 --- a/config/locales/crowdin/da.yml +++ b/config/locales/crowdin/da.yml @@ -539,6 +539,7 @@ da: error_enterprise_only: "er kun tilgængelig i OpenProject Enterprise Edition" error_unauthorized: "kan muligvis ikke tilgås." error_readonly: "was attempted to be written but is not writable." + email: "is not a valid email address." empty: "må ikke være tomt." even: "skal være lige." exclusion: "er reserveret." @@ -699,6 +700,7 @@ da: not_start_date: "er ikke på startdato, selvom dette er påkrævet for milepæle." parent: cannot_be_milestone: "kan ikke være en milepæl." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "kan ikke være i et andet projekt." not_a_valid_parent: "er ugyldig." start_date: @@ -1310,6 +1312,7 @@ da: expiration: "Udløber" indefinite_expiration: "Aldrig" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1446,6 +1449,7 @@ da: label_deleted: "slettet" label_deleted_custom_field: "(slettet selvvalgt felt)" label_deleted_custom_option: "(deleted option)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "Faldende" label_details: "Detaljer" label_development_roadmap: "Udviklingskøreplan" @@ -1619,7 +1623,6 @@ da: label_none_parentheses: "(ingen)" label_not_contains: "indeholder ikke" label_not_equals: "er ikke" - label_notify_member_plural: "Opdateringer af e-mail" label_on: "på" label_open_menu: "Åbn menuen" label_open_work_packages: "åbn" @@ -1739,7 +1742,6 @@ da: label_start_to_start: "Start til start" label_statistics: "Statistik" label_status: "Status" - label_status_updated: "Status for arbejdspakke er opdateret" label_stay_logged_in: "Forbliv logget ind" label_storage_free_space: "Resterende disklagerplads" label_storage_used_space: "Forbrugt disklagerplads" @@ -1823,21 +1825,17 @@ da: label_wiki_show_submenu_item: "Vis som punkt i undermenu til " label_wiki_start: "Startside" label_work_package: "Arbejdspakke" - label_work_package_added: "Arbejdspakke tilføjet" label_work_package_attachments: "Work package attachments" label_work_package_category_new: "Ny kategori" label_work_package_category_plural: "Kategorier for arbejdspakker" label_work_package_hierarchy: "Work package hierarchy" label_work_package_new: "Ny arbejdspakke" - label_work_package_note_added: "Note tilføjet arbejdspakke" label_work_package_edit: "Rediger arbejdspakke %{name}" label_work_package_plural: "Arbejdspakker" - label_work_package_priority_updated: "Prioritet for arbejdspakke opdateret" label_work_package_status: "Status for arbejdspakke" label_work_package_status_new: "Ny status" label_work_package_status_plural: "Statusser for arbejdspakke" label_work_package_types: "Arbejdspakketyper" - label_work_package_updated: "Arbejdspakke opdateret" label_work_package_tracking: "Sporing af arbejdspakke" label_work_package_view_all: "Vis alle arbejdspakker" label_workflow: "Arbejdsgang" @@ -2403,6 +2401,7 @@ da: Set the number of days notification events for users (the source for in-app notifications) will be kept in the system. Any events older than this time will be deleted. delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > If either options "%{day_of_week_setting_name}" or "%{first_week_setting_name}" are set, the other has to be set as well to avoid inconsistencies in the frontend. @@ -2484,8 +2483,8 @@ da: text_work_packages_ref_in_commit_messages: "Arbejdspakker håndteres i tilknyttede meddelelser" text_journal_added: "%{label} %{value} tilføjet" text_journal_aggregation_time_explanation: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent." - text_journal_changed: "%{label} changed from %{old}
to %{new}" - text_journal_changed_plain: "%{label} changed from %{old} \nto %{new}" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label} opdateret" text_journal_changed_with_diff: "%{label} ændret (%{link})" text_journal_deleted: "%{label} slettet (%{old})" diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml index 02cf9f6e98..c06670a2b7 100644 --- a/config/locales/crowdin/de.yml +++ b/config/locales/crowdin/de.yml @@ -536,6 +536,7 @@ de: error_enterprise_only: "ist nur in OpenProject Enterprise on-premises verfügbar" error_unauthorized: "kann nicht zugegriffen werden." error_readonly: "wurde versucht zu beschreiben, ist aber nicht beschreibbar." + email: "is not a valid email address." empty: "muss ausgefüllt werden." even: "muss gerade sein." exclusion: "ist nicht verfügbar." @@ -696,6 +697,7 @@ de: not_start_date: "ist nicht identisch mit dem Startdatum, obwohl dies bei Meilensteinen Pflicht ist." parent: cannot_be_milestone: "darf kein Meilenstein sein." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "darf nicht in einem anderen Projekt sein." not_a_valid_parent: "ist ungültig." start_date: @@ -1307,6 +1309,7 @@ de: expiration: "Läuft aus" indefinite_expiration: "Nie" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1443,6 +1446,7 @@ de: label_deleted: "gelöscht" label_deleted_custom_field: "(gelöschtes benutzerdefiniertes Feld)" label_deleted_custom_option: "(gelöschte Option)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "Absteigend" label_details: "Details" label_development_roadmap: "Entwicklungs-Roadmap" @@ -1616,7 +1620,6 @@ de: label_none_parentheses: "(keiner)" label_not_contains: "enthält nicht" label_not_equals: "ist nicht" - label_notify_member_plural: "Aktualisierungen per E-Mail verschicken" label_on: "am" label_open_menu: "Menü öffnen" label_open_work_packages: "Offen" @@ -1736,7 +1739,6 @@ de: label_start_to_start: "Anfang bis Anfang" label_statistics: "Statistiken" label_status: "Status" - label_status_updated: "Arbeitspaket-Status aktualisiert" label_stay_logged_in: "Angemeldet bleiben" label_storage_free_space: "Verbleibender Speicherplatz" label_storage_used_space: "Verwendeter Speicherplatz" @@ -1820,21 +1822,17 @@ de: label_wiki_show_submenu_item: "als Untermenüpunkt anzeigen von " label_wiki_start: "Hauptseite" label_work_package: "Arbeitspaket" - label_work_package_added: "Arbeitspaket hinzugefügt" label_work_package_attachments: "Anhänge des Arbeitspakets" label_work_package_category_new: "Neue Kategorie" label_work_package_category_plural: "Arbeitspaket-Kategorien" label_work_package_hierarchy: "Arbeitspakethierarchie" label_work_package_new: "Neues Arbeitspaket" - label_work_package_note_added: "Kommentar zu Arbeitspaket hinzugefügt" label_work_package_edit: "Arbeitspaket %{name} editieren" label_work_package_plural: "Arbeitspakete" - label_work_package_priority_updated: "Arbeitspaketpriorität aktualisiert" label_work_package_status: "Arbeitspaket-Status" label_work_package_status_new: "Neuer Status" label_work_package_status_plural: "Arbeitspaket-Status" label_work_package_types: "Arbeitspaket-Typen" - label_work_package_updated: "Arbeitspaket aktualisiert" label_work_package_tracking: "Arbeitspakete-Verfolgung" label_work_package_view_all: "Alle Arbeitspakete anzeigen" label_workflow: "Workflow" @@ -2403,6 +2401,7 @@ de: Legen Sie die Anzahl der Tage fest, in denen Benachrichtigungen für Benutzer im System gehalten werden. Alle Ereignisse, die älter als diese Zeit sind, werden gelöscht und stehen nicht mehr als In-App-Benachrichtigungen zur Verfügung. delay_minutes_explanation: "Das Senden von E-Mails kann verzögert werden, damit Benutzer Benachrichtigungen innerhalb der Anwendung bestätigen können, bevor eine E-Mail versendet wird. Benutzer, die eine Benachrichtigung innerhalb der Anwendung lesen, erhalten keine E-Mail für die bereits gelesene Benachrichtigung." email_digest_explanation: "Einmal pro Tag kann eine E-Mail-Zusammenfassung mit allen abonnierten Benachrichtigungen verschickt werden. Die eingestellte Zeit wird für jeden Benutzer in dessen eingestellte Zeitzone umgerechnet." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > Wenn beide Optionen "%{day_of_week_setting_name}" oder "%{first_week_setting_name}" gesetzt sind der andere muss ebenfalls gesetzt werden, um Ungereimtheiten im Frontend zu vermeiden. @@ -2484,8 +2483,8 @@ de: text_work_packages_ref_in_commit_messages: "Arbeitspaket-Beziehungen und -Status in Commit-Log-Meldungen" text_journal_added: "%{label} %{value} wurde hinzugefügt" text_journal_aggregation_time_explanation: "Individuelle Aktionen eines Benutzers (z. ein Arbeitspaket zweimal aktualisieren) werden zu einer einzigen Aktion zusammengefasst, wenn ihr Altersunterschied kleiner ist als der angegebene Zeitraum. Sie werden als eine einzige Aktion innerhalb der Anwendung angezeigt. Dadurch werden auch Benachrichtigungen um die gleiche Zeit verzögert, wodurch die Anzahl der gesendeten E-Mails verringert wird." - text_journal_changed: "%{label} geändert von %{old}
zu %{new}" - text_journal_changed_plain: "%{label} geändert von %{old} \nzu %{new}" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label} aktualisiert" text_journal_changed_with_diff: "%{label} geändert (%{link})" text_journal_deleted: "%{label} %{old} wurde gelöscht" diff --git a/config/locales/crowdin/el.yml b/config/locales/crowdin/el.yml index f1009d75cf..e93177c21c 100644 --- a/config/locales/crowdin/el.yml +++ b/config/locales/crowdin/el.yml @@ -536,6 +536,7 @@ el: error_enterprise_only: "είναι διαθέσιμο μόνο στην Έκδοση για Επιχειρήσεις του OpenProject" error_unauthorized: "δεν είναι δυνατή η πρόσβαση." error_readonly: "επιχειρήθηκε να εγγραφεί αλλά δεν ήταν εγγράψιμο." + email: "is not a valid email address." empty: "δεν μπορεί να είναι κενό." even: "πρέπει να είναι άρτιος." exclusion: "είναι δεσμευμένο." @@ -696,6 +697,7 @@ el: not_start_date: "δεν είναι στην ημερομηνία έναρξης, παρόλο που απαιτείται από τα ορόσημα." parent: cannot_be_milestone: "δεν μπορεί να είναι ορόσημο." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "δεν μπορεί να είναι σε άλλο έργο." not_a_valid_parent: "δεν είναι έγκυρο." start_date: @@ -1307,6 +1309,7 @@ el: expiration: "Λήγει" indefinite_expiration: "Ποτέ" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1443,6 +1446,7 @@ el: label_deleted: "διαγραμμένο" label_deleted_custom_field: "(διαγραμμένο προσαρμοσμένο πεδίο)" label_deleted_custom_option: "(διαγραμμένη επιλογή)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "Φθίνουσα" label_details: "Λεπτομέρειες" label_development_roadmap: "Χάρτης πορείας ανάπτυξης" @@ -1616,7 +1620,6 @@ el: label_none_parentheses: "(κανένα)" label_not_contains: "δεν περιέχει" label_not_equals: "δεν είναι" - label_notify_member_plural: "Ενημερώσεις email" label_on: "σε" label_open_menu: "Άνοιγμα μενού" label_open_work_packages: "ανοιχτό" @@ -1736,7 +1739,6 @@ el: label_start_to_start: "από την αρχή μέχρι την αρχή" label_statistics: "Στατιστικά" label_status: "Κατάσταση" - label_status_updated: "Η κατάσταση του πακέτου εργασίας ενημερώθηκε" label_stay_logged_in: "Παραμείνετε συνδεδεμένοι" label_storage_free_space: "Υπολειπόμενος χώρος στο δίσκο" label_storage_used_space: "Χώρος στο δίσκο που χρησιμοποιείται" @@ -1820,21 +1822,17 @@ el: label_wiki_show_submenu_item: "Εμφάνιση ως αντικείμενο υπομενού του " label_wiki_start: "Σελίδα έναρξης" label_work_package: "Εργασία" - label_work_package_added: "Το πακέτο εργασίας προστέθηκε" label_work_package_attachments: "Συνημμένα πακέτου εργασίας" label_work_package_category_new: "Νέα κατηγορία" label_work_package_category_plural: "Κατηγορίες πακέτου εργασίας" label_work_package_hierarchy: "Ιεραρχία πακέτου εργασίας" label_work_package_new: "Νέο πακέτο εργασίας" - label_work_package_note_added: "Προστέθηκε η σημείωση πακέτου εργασίας" label_work_package_edit: "Επεξεργασία του πακέτου εργασίας %{name}" label_work_package_plural: "Πακέτα εργασίας" - label_work_package_priority_updated: "Η προτεραιότητα του πακέτου εργασίας ενημερώθηκε" label_work_package_status: "Κατάσταση εργασίας" label_work_package_status_new: "Νέα κατάσταση" label_work_package_status_plural: "Καταστάσεις πακέτων εργασίας" label_work_package_types: "Τύποι πακέτου εργασίας" - label_work_package_updated: "Το πακέτο εργασίας ενημερώθηκε" label_work_package_tracking: "Παρακολούθηση πακέτου εργασίας" label_work_package_view_all: "Εμφάνιση όλων των πακέτων εργασίας" label_workflow: "Ροή εργασιών" @@ -2401,6 +2399,7 @@ el: Set the number of days notification events for users (the source for in-app notifications) will be kept in the system. Any events older than this time will be deleted. delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > If either options "%{day_of_week_setting_name}" or "%{first_week_setting_name}" are set, the other has to be set as well to avoid inconsistencies in the frontend. @@ -2483,8 +2482,8 @@ el: text_work_packages_ref_in_commit_messages: "Αναφορά και επιδιόρθωση πακέτων εργασίας σε μηνύματα δέσμευσης" text_journal_added: "%{label} %{value} προστέθηκε" text_journal_aggregation_time_explanation: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent." - text_journal_changed: "Το %{label} άλλαξε από %{old}
σε %{new}" - text_journal_changed_plain: "Το %{label} άλλαξε από %{old} \nσε %{new}" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "Το %{label} ενημερώθηκε" text_journal_changed_with_diff: "Το %{label} άλλαξε (%{link})" text_journal_deleted: "Το %{label} διαγράφηκε (%{old})" diff --git a/config/locales/crowdin/es.yml b/config/locales/crowdin/es.yml index 2d4187b588..18bae1a9f7 100644 --- a/config/locales/crowdin/es.yml +++ b/config/locales/crowdin/es.yml @@ -538,6 +538,7 @@ es: error_enterprise_only: "solo está disponible en OpenProject Enterprise Edition" error_unauthorized: "no se puede acceder." error_readonly: "se intentó escribir pero no se puede escribir." + email: "is not a valid email address." empty: "No puede estar vacío." even: "debe ser incluido." exclusion: "está reservado." @@ -698,6 +699,7 @@ es: not_start_date: "no es en fecha de inicio, aunque esto es necesario para hitos." parent: cannot_be_milestone: "no puede ser un hito." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "No puede estar en otro proyecto." not_a_valid_parent: "no es válido." start_date: @@ -1309,6 +1311,7 @@ es: expiration: "Expira" indefinite_expiration: "Nunca" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1445,6 +1448,7 @@ es: label_deleted: "borrado" label_deleted_custom_field: "(campo personalizado borrado)" label_deleted_custom_option: "(opción eliminada)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "Descendente" label_details: "Detalles" label_development_roadmap: "Itinerario de desarrollo" @@ -1618,7 +1622,6 @@ es: label_none_parentheses: "(ninguno)" label_not_contains: "no contiene" label_not_equals: "no es" - label_notify_member_plural: "Actualizaciones por correo electrónico" label_on: "en" label_open_menu: "Abrir menú" label_open_work_packages: "abierto" @@ -1738,7 +1741,6 @@ es: label_start_to_start: "iniciar para iniciar" label_statistics: "Estadísticas" label_status: "Estado" - label_status_updated: "Estado del paquete de trabajo actualizado" label_stay_logged_in: "Mantener sesión activa" label_storage_free_space: "Espacio de disco restante" label_storage_used_space: "Espacio de disco utilizado" @@ -1822,21 +1824,17 @@ es: label_wiki_show_submenu_item: "Mostrar como elemento de submenú de " label_wiki_start: "Página de inicio" label_work_package: "Paquete de trabajo" - label_work_package_added: "Paquete de trabajo añadido" label_work_package_attachments: "Datos adjuntos de paquete de trabajo" label_work_package_category_new: "Nueva categoría" label_work_package_category_plural: "Categorías de paquete de trabajo" label_work_package_hierarchy: "Jerarquía del paquete de trabajo" label_work_package_new: "Nuevo paquete de trabajo" - label_work_package_note_added: "Nota de paquete de trabajo añadido" label_work_package_edit: "Editar paquete de trabajo %{name}" label_work_package_plural: "Paquetes de trabajo" - label_work_package_priority_updated: "Prioridad de trabajo paquete actualizado" label_work_package_status: "Estado del paquete de trabajo" label_work_package_status_new: "Nuevo estatus" label_work_package_status_plural: "Estatus del paquete de trabajo" label_work_package_types: "Tipos de paquetes de trabajo" - label_work_package_updated: "Paquete de trabajo actualizado" label_work_package_tracking: "Seguimiento de paquetes de trabajo" label_work_package_view_all: "Ver todos los paquetes de trabajo" label_workflow: "Flujo de trabajo" @@ -2404,6 +2402,7 @@ es: Establecer el número de días que los eventos de notificación para los usuarios (la fuente de las notificaciones dentro de la aplicación) se mantendrá en el sistema. Cualquier evento anterior a este tiempo será eliminado. delay_minutes_explanation: "El envío de correo electrónico puede retrasarse para permitir a los usuarios con notificaciones en la app configurada confirmar la notificación dentro de la aplicación antes de que se envíe un correo. Los usuarios que lean una notificación dentro de la aplicación no recibirán un correo electrónico para la notificación ya leída." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > Si se establece una de las opciones «%{day_of_week_setting_name}» o «%{first_week_setting_name}», también debe establecerse la otra para evitar incoherencias en el front-end. @@ -2485,8 +2484,8 @@ es: text_work_packages_ref_in_commit_messages: "Referenciando y reparando paquetes de trabajo en mensajes de commit" text_journal_added: "%{label} %{value} añadido" text_journal_aggregation_time_explanation: "Acciones individuales de un usuario (p. ej. actualizar un paquete de trabajo dos veces) se agregan en una sola acción si su diferencia de edad es menor que el intervalo de tiempo especificado. Se mostrarán como una sola acción dentro de la aplicación. Esto también retrasará las notificaciones en la misma cantidad de tiempo reduciendo el número de correos electrónicos que se envían." - text_journal_changed: "%{label} se cambió de %{old}
a %{new}" - text_journal_changed_plain: "%{label} se cambió de %{old} \na %{new}" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label} actualizado" text_journal_changed_with_diff: "%{label} modificado (%{link})" text_journal_deleted: "%{label} eliminado (%{old})" diff --git a/config/locales/crowdin/fi.yml b/config/locales/crowdin/fi.yml index 841942666c..22322542f8 100644 --- a/config/locales/crowdin/fi.yml +++ b/config/locales/crowdin/fi.yml @@ -541,6 +541,7 @@ fi: error_enterprise_only: "is only available in the OpenProject Enterprise Edition" error_unauthorized: "may not be accessed." error_readonly: "was attempted to be written but is not writable." + email: "is not a valid email address." empty: "ei voi olla tyhjä." even: "täytyy olla parillinen." exclusion: "on jo varattu." @@ -701,6 +702,7 @@ fi: not_start_date: "ei ole aloituspäivänä, vaikka välitavoite vaatii sen olevan." parent: cannot_be_milestone: "ei voi olla välitavoite." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "ei voi olla toisessa projektissa." not_a_valid_parent: "ei kelpaa." start_date: @@ -1312,6 +1314,7 @@ fi: expiration: "Vanhentuu" indefinite_expiration: "Ei koskaan" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1448,6 +1451,7 @@ fi: label_deleted: "poistettu" label_deleted_custom_field: "(poistettu mukautettu kenttä)" label_deleted_custom_option: "(deleted option)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "Laskeva" label_details: "Yksityiskohdat" label_development_roadmap: "Kehittämisen toteutussuunnitelma" @@ -1621,7 +1625,6 @@ fi: label_none_parentheses: "(none)" label_not_contains: "ei sisällä" label_not_equals: "ei ole" - label_notify_member_plural: "Lähetä päivitykset sähköpostilla" label_on: "päälle" label_open_menu: "Avaa valikko" label_open_work_packages: "avoin" @@ -1741,7 +1744,6 @@ fi: label_start_to_start: "start to start" label_statistics: "Tilastot" label_status: "Tila" - label_status_updated: "Work package status updated" label_stay_logged_in: "Pysy kirjautuneena" label_storage_free_space: "Vapaa levytila" label_storage_used_space: "Käytetty levytila" @@ -1825,21 +1827,17 @@ fi: label_wiki_show_submenu_item: "Show as submenu item of " label_wiki_start: "Aloitussivu" label_work_package: "Tehtävä" - label_work_package_added: "Tehtävä lisätty" label_work_package_attachments: "Work package attachments" label_work_package_category_new: "Uusi luokka" label_work_package_category_plural: "Kategoriat" label_work_package_hierarchy: "Tehtävähierarkia" label_work_package_new: "Uusi tehtävä" - label_work_package_note_added: "Kommentti lisätty tehtävään" label_work_package_edit: "Muokkaa tehtävää %{name}" label_work_package_plural: "Tehtävät" - label_work_package_priority_updated: "Tehtävän prioriteetti muutettu" label_work_package_status: "Tehtävän tila" label_work_package_status_new: "Uusi tila" label_work_package_status_plural: "Tehtävien tilat" label_work_package_types: "Tehtävätyypit" - label_work_package_updated: "Tehtävä päivitetty" label_work_package_tracking: "Tehtävien seuranta" label_work_package_view_all: "Näytä kaikki tehtävät" label_workflow: "Työnkulku" @@ -2407,6 +2405,7 @@ fi: Set the number of days notification events for users (the source for in-app notifications) will be kept in the system. Any events older than this time will be deleted. delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > If either options "%{day_of_week_setting_name}" or "%{first_week_setting_name}" are set, the other has to be set as well to avoid inconsistencies in the frontend. @@ -2488,8 +2487,8 @@ fi: text_work_packages_ref_in_commit_messages: "Vertailemalla ja korjaus toimia paketit sitoutua viestejä" text_journal_added: "%{label} %{value} lisätty" text_journal_aggregation_time_explanation: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent." - text_journal_changed: "%{label} päivitetty arvosta %{old}
arvoon %{new}" - text_journal_changed_plain: "%{label} päivitetty arvosta %{old} \narvoon %{new}" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label} päivitetty" text_journal_changed_with_diff: "%{label} muutettu (%{link})" text_journal_deleted: "%{label} poistettu (%{old})" diff --git a/config/locales/crowdin/fil.yml b/config/locales/crowdin/fil.yml index 8c2cfd5007..869a274c55 100644 --- a/config/locales/crowdin/fil.yml +++ b/config/locales/crowdin/fil.yml @@ -541,6 +541,7 @@ fil: error_enterprise_only: "is only available in the OpenProject Enterprise Edition" error_unauthorized: "may not be accessed." error_readonly: "was attempted to be written but is not writable." + email: "is not a valid email address." empty: "hindi pwedeng blanko." even: "dapat ay kapareho." exclusion: "ay nakareserba." @@ -701,6 +702,7 @@ fil: not_start_date: "hindi sa petsa ng pagsisimula, kahit naa ito ay kinakailangan para sa mga milestone." parent: cannot_be_milestone: "hindi maaring maging isang milestone." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "hindi maaring sa iba pang proyekto." not_a_valid_parent: "ay hindi balido." start_date: @@ -1312,6 +1314,7 @@ fil: expiration: "Natapos" indefinite_expiration: "Hindi kailanman" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1448,6 +1451,7 @@ fil: label_deleted: "binura" label_deleted_custom_field: "(binurang custom field)" label_deleted_custom_option: "(deleted option)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "Pababa" label_details: "Mga detalye" label_development_roadmap: "Kaunlaran ng roadmao" @@ -1621,7 +1625,6 @@ fil: label_none_parentheses: "(wala)" label_not_contains: "hindi naglalaman" label_not_equals: "ay hindi" - label_notify_member_plural: "I-update ang mga email" label_on: "sa" label_open_menu: "Buksan ang pagpipilian" label_open_work_packages: "buksan" @@ -1741,7 +1744,6 @@ fil: label_start_to_start: "simula hanggang simula" label_statistics: "Istatistika" label_status: "Estado" - label_status_updated: "Naka-update na work package" label_stay_logged_in: "Manatiling naka-log in" label_storage_free_space: "Natitirang espasyo ng disk" label_storage_used_space: "Nagamit na espasyo ng disk" @@ -1825,21 +1827,17 @@ fil: label_wiki_show_submenu_item: "Ipakita bilang submenu. aytem ng " label_wiki_start: "Simulan ang pahina" label_work_package: "Work package" - label_work_package_added: "Idinagdag ng work package" label_work_package_attachments: "Nakakalakip na pahinag trabaho" label_work_package_category_new: "Bagong kategorya" label_work_package_category_plural: "Ang mga katergorya ng work package" label_work_package_hierarchy: "Hierarchy ng work package" label_work_package_new: "Bagong work package" - label_work_package_note_added: "Idinagdag ang talaan ng work package" label_work_package_edit: "I-edit ang work package %{name}" label_work_package_plural: "Ang mga work package" - label_work_package_priority_updated: "Ang work package ay prioridad naka-update" label_work_package_status: "Estado ng pakete ng gumagawa" label_work_package_status_new: "Bagong estado" label_work_package_status_plural: "Ang mga estado ng work package" label_work_package_types: "Ang mga uri ng work package" - label_work_package_updated: "Naka-update na work package" label_work_package_tracking: "Ang pagtra-track ng work package" label_work_package_view_all: "Tanawin lahat ang mga package" label_workflow: "Daloy ng trabaho" @@ -2405,6 +2403,7 @@ fil: Set the number of days notification events for users (the source for in-app notifications) will be kept in the system. Any events older than this time will be deleted. delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > If either options "%{day_of_week_setting_name}" or "%{first_week_setting_name}" are set, the other has to be set as well to avoid inconsistencies in the frontend. @@ -2486,8 +2485,8 @@ fil: text_work_packages_ref_in_commit_messages: "Pagsangguni at pagsaayos ng work package sa mga isinagawang mensahe" text_journal_added: "%{label}%{value} idinagdag" text_journal_aggregation_time_explanation: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent." - text_journal_changed: "%{label} changed from %{old}
to %{new}" - text_journal_changed_plain: "%{label} changed from %{old} \nto %{new}" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label} ay naka-update" text_journal_changed_with_diff: "%{label} binagko (%{link})" text_journal_deleted: "%{label} binura (%{old})" diff --git a/config/locales/crowdin/fr.yml b/config/locales/crowdin/fr.yml index a0b5051aaa..9e1c373c1a 100644 --- a/config/locales/crowdin/fr.yml +++ b/config/locales/crowdin/fr.yml @@ -540,6 +540,7 @@ fr: error_enterprise_only: "n'est disponible que dans OpenProject Enterprise Edition" error_unauthorized: "est interdit d'accès." error_readonly: "a tenté d'être écrit mais n'est pas accessible en écriture." + email: "is not a valid email address." empty: "ne peut pas être vide." even: "doit être pair." exclusion: "est réservé." @@ -700,6 +701,7 @@ fr: not_start_date: "n'est pas identique à la date de début, bien que cela soit requis pour les jalons." parent: cannot_be_milestone: "ne peut pas être un jalon." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "ne peut pas être dans un autre projet." not_a_valid_parent: "est invalide." start_date: @@ -1311,6 +1313,7 @@ fr: expiration: "Expiration" indefinite_expiration: "Jamais" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1447,6 +1450,7 @@ fr: label_deleted: "supprimé" label_deleted_custom_field: "(champs personnalisés supprimés)" label_deleted_custom_option: "(option supprimée)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "Décroissant" label_details: "Détails" label_development_roadmap: "Feuille de route de développement" @@ -1620,7 +1624,6 @@ fr: label_none_parentheses: "(none)" label_not_contains: "ne contient pas" label_not_equals: "n'est pas" - label_notify_member_plural: "Notifications courriel" label_on: "le" label_open_menu: "Ouvrir le menu" label_open_work_packages: "ouverts" @@ -1740,7 +1743,6 @@ fr: label_start_to_start: "de début à début" label_statistics: "Statistiques" label_status: "Statut" - label_status_updated: "Statut de Lot de Travaux mis à jour" label_stay_logged_in: "Rester connecté" label_storage_free_space: "Espace disque restant" label_storage_used_space: "Espace disque utilisé" @@ -1824,21 +1826,17 @@ fr: label_wiki_show_submenu_item: "Montrer comme sous-menu de " label_wiki_start: "Page d'accueil" label_work_package: "Lot de travaux" - label_work_package_added: "Lot de Travaux ajouté" label_work_package_attachments: "Pièces jointes du lot de travaux" label_work_package_category_new: "Nouvelle catégorie" label_work_package_category_plural: "Catégories de Lots de Travaux" label_work_package_hierarchy: "Hiérarchie du lot de travaux" label_work_package_new: "Nouveau Lot de Travaux" - label_work_package_note_added: "Note de Lot de Travaux ajoutée" label_work_package_edit: "Éditer le lot de travaux %{name}" label_work_package_plural: "Lots de Travaux" - label_work_package_priority_updated: "Priorité du lot de travaux mise à jour" label_work_package_status: "Statut du lot de travaux" label_work_package_status_new: "Nouveau statut" label_work_package_status_plural: "Statuts du lot de travaux" label_work_package_types: "Types de lots de travaux" - label_work_package_updated: "Lot de Travaux mis à jour" label_work_package_tracking: "Suivi des lots de travaux" label_work_package_view_all: "Afficher tous les lots de travaux" label_workflow: "Flux de travail" @@ -2406,6 +2404,7 @@ fr: Set the number of days notification events for users (the source for in-app notifications) will be kept in the system. Any events older than this time will be deleted. delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > Si une des options « %{day_of_week_setting_name} » ou « %{first_week_setting_name} » sont définies, l'autre doit être réglé aussi bien pour éviter les incohérences dans le frontend. @@ -2487,8 +2486,8 @@ fr: text_work_packages_ref_in_commit_messages: "Referencer et réparer les Lot(s) de Travaux dans les messages « commit »" text_journal_added: "%{label} %{value} ajouté" text_journal_aggregation_time_explanation: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent." - text_journal_changed: "%{label} a changé de %{old}
à %{new}" - text_journal_changed_plain: "%{label} changé de %{old} à %{new}" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label} mis à jour" text_journal_changed_with_diff: "%{label} changé (%{link})" text_journal_deleted: "%{label} supprimé (%{old})" diff --git a/config/locales/crowdin/hr.yml b/config/locales/crowdin/hr.yml index 3df57da17b..0c97d67d8d 100644 --- a/config/locales/crowdin/hr.yml +++ b/config/locales/crowdin/hr.yml @@ -542,6 +542,7 @@ hr: error_enterprise_only: "is only available in the OpenProject Enterprise Edition" error_unauthorized: "may not be accessed." error_readonly: "was attempted to be written but is not writable." + email: "is not a valid email address." empty: "ne može biti prazan unos." even: "mora biti izjednačeno." exclusion: "je rezerviran." @@ -702,6 +703,7 @@ hr: not_start_date: "nije na datum početka, međutim potrebno je za ključne točke." parent: cannot_be_milestone: "ne može biti ključna točka." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "ne može biti u još jednom projektu." not_a_valid_parent: "je nevažeće." start_date: @@ -1329,6 +1331,7 @@ hr: expiration: "Vrijedi do" indefinite_expiration: "Nikad" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1465,6 +1468,7 @@ hr: label_deleted: "izbrisano" label_deleted_custom_field: "(izbrisano prilagođeno polje)" label_deleted_custom_option: "(deleted option)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "Silazno" label_details: "Pojedinosti" label_development_roadmap: "Razvojni plan" @@ -1638,7 +1642,6 @@ hr: label_none_parentheses: "(nijedan)" label_not_contains: "ne sadrži" label_not_equals: "nije" - label_notify_member_plural: "Email ažuriranja" label_on: "na" label_open_menu: "Otvori izbornik" label_open_work_packages: "otvori" @@ -1758,7 +1761,6 @@ hr: label_start_to_start: "s početka na početak" label_statistics: "Statistika" label_status: "Status" - label_status_updated: "Status radnog paketa je ažuriran" label_stay_logged_in: "Ostani prijavljen" label_storage_free_space: "Dostupna veličina prostora na disku" label_storage_used_space: "Iskorišteni prostor na disku" @@ -1842,21 +1844,17 @@ hr: label_wiki_show_submenu_item: "Prikaži kao stavku podizbornika iz " label_wiki_start: "Početna stranica" label_work_package: "Radni paket" - label_work_package_added: "Radni paket dodan" label_work_package_attachments: "Work package attachments" label_work_package_category_new: "Nova kategorija" label_work_package_category_plural: "Kategorije radnih paketa" label_work_package_hierarchy: "Hijerarhija radnih paketa" label_work_package_new: "Novi radni paket" - label_work_package_note_added: "Bilješka za Radni paket je dodana" label_work_package_edit: "Uredi radni paket %{name}" label_work_package_plural: "Radni paketi" - label_work_package_priority_updated: "Prioritet Radnog paketa je ažuriran" label_work_package_status: "Status Radnog paketa" label_work_package_status_new: "Novi status" label_work_package_status_plural: "Statusi radnog paketa" label_work_package_types: "Tip ranog paketa" - label_work_package_updated: "Radni paket je ažuriran" label_work_package_tracking: "Praćenje radnog paketa" label_work_package_view_all: "Pogledaj sve radne pakete" label_workflow: "Tijek rada" @@ -2296,7 +2294,7 @@ hr: setting_apiv3_cors_origins: "API V3 Cross-Origin Resource Sharing (CORS) allowed origins" setting_apiv3_cors_origins_text_html: > If CORS is enabled, these are the origins that are allowed to access OpenProject API.
Please check the Documentation on the Origin header on how to specify the expected values. - setting_apiv3_docs: "Documentation" + setting_apiv3_docs: "Dokumentacija" setting_apiv3_docs_enabled: "Enable docs page" setting_apiv3_docs_enabled_instructions_html: > If the docs page is enabled you can get an interactive view of the APIv3 documentation under %{link}. @@ -2425,6 +2423,7 @@ hr: Set the number of days notification events for users (the source for in-app notifications) will be kept in the system. Any events older than this time will be deleted. delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > If either options "%{day_of_week_setting_name}" or "%{first_week_setting_name}" are set, the other has to be set as well to avoid inconsistencies in the frontend. @@ -2506,8 +2505,8 @@ hr: text_work_packages_ref_in_commit_messages: "Referencing and fixing work packages in commit messages" text_journal_added: "%{label}%{value} dodana" text_journal_aggregation_time_explanation: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent." - text_journal_changed: "%{label} changed from %{old}
to %{new}" - text_journal_changed_plain: "%{label} changed from %{old} \nto %{new}" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label} updated" text_journal_changed_with_diff: "%{label} promijenjen (%{link})" text_journal_deleted: "%{label} izbrisan (%{old})" diff --git a/config/locales/crowdin/hu.yml b/config/locales/crowdin/hu.yml index e67f949eda..9e67f822f3 100644 --- a/config/locales/crowdin/hu.yml +++ b/config/locales/crowdin/hu.yml @@ -66,7 +66,7 @@ hu: upgrade_to_ee: "Frissítés a Vállalati Verzióra" add_token: "Töltse fel a Vállalati Verzió támogatási tokenjét" replace_token: "A jelenlegi támogatási token lecserélése" - order: "Order Enterprise on-premises Edition" + order: "Vállalati verzió megrendelése" paste: "Illessze be a Vállalati Verzió támogatási tokentjét" required_for_feature: "Ez a funkció csak aktív Vállalati Verzió támogatási tokennel érhető el." enterprise_link: "További információért kattintson ide." @@ -175,7 +175,7 @@ hu: concatenation: single: 'vagy' documentation: - see_more_link: For more information, please see our documentation on this topic. + see_more_link: További információért ebben a témakörben kérem látogasson el a dokumentációnkba global_search: overwritten_tabs: wiki_pages: "Wiki" @@ -201,12 +201,12 @@ hu: completed_text: "The request to delete project '%{name}' has been completed." index: open_as_gantt: 'Gantt nézet megnyitása' - open_as_gantt_title: "Use this button to generate a Gantt view that filters work packages for the projects visible on this page." + open_as_gantt_title: "Használja ezt a gombot hogy egy szűrt Gantt nézetet generáljon a projekthez" open_as_gantt_title_admin: "You can modify the view settings (such as selected work package types) in the administration under project settings." no_results_title_text: Jelenleg nincsenek projektek no_results_content_text: Új projekt létrehozása settings: - change_identifier: Change identifier + change_identifier: Azonosító megváltoztatása activities: no_results_title_text: Jelenleg nincs elérhető esemény. forums: @@ -241,8 +241,8 @@ hu: no_results_content_text: Hír hozzáadása users: groups: - member_in_these_groups: 'This user is currently a member of the following groups:' - no_results_title_text: This user is currently not a member in any group. + member_in_these_groups: 'A felhasználó a következő csoportoknak a tagja:' + no_results_title_text: A falhasználó egyik csoportnak se a tagja memberships: no_results_title_text: Ez a felhasználó jelenleg nem tagja egy projektnek sem. placeholder_users: @@ -311,7 +311,7 @@ hu: one: 'Egy leszármazott feladatcsoport' other: '%{count} munkacsomag leszármazottai' bulk: - could_not_be_saved: "The following work packages could not be saved:" + could_not_be_saved: "Az alábbi munkacsomagot nem lehet elmenteni:" move: no_common_statuses_exists: "Az összes kiválasztott feladatcsoporthoz nincs elérhető állapot. Státuszuk nem változtatható meg." unsupported_for_multiple_projects: 'Tömeges mozgatás/másolás nem támogatott a különböző projektekből származó feladatcsoportokhoz' @@ -383,7 +383,7 @@ hu: attr_mail: "Email attribútum" base_dn: "Base DN" host: "Host" - onthefly: "Automatic user creation" + onthefly: "Automatikus felhasználó készítés" port: "Port szám" changeset: repository: "Csomagtároló" @@ -436,7 +436,7 @@ hu: types: "Típus" versions: "Verzió" work_packages: "Feladatcsoportok" - templated: 'Template project' + templated: 'Példa projekt' projects/status: code: 'Állapot' explanation: 'Állapot leírása' @@ -535,9 +535,10 @@ hu: confirmation: "%{attribute} nem egyezik." could_not_be_copied: "%{dependency} could not be (fully) copied." does_not_exist: "nem létezik." - error_enterprise_only: "is only available in the OpenProject Enterprise Edition" + error_enterprise_only: "Csak az Enterprise Verzióban érhető el" error_unauthorized: "lehet, hogy nem érhető el." error_readonly: "írása megkísérelve, de nem írható." + email: "nem valós e-mail cím" empty: "nem lehet üres." even: "kell még." exclusion: "foglalt." @@ -553,7 +554,7 @@ hu: less_than_or_equal_to: "kisebbnek vagy egyenlőnek kell lennie mint, %{count}." not_available: "is not available due to a system configuration." not_deletable: "nem törölhető" - not_current_user: "is not the current user." + not_current_user: "nem az aktuális felhasználó" not_a_date: "nem érvényes dátum." not_a_datetime: "ez nem érvényes dátum." not_a_number: "ez nem egy szám." @@ -591,7 +592,7 @@ hu: not_an_integer: "(%{name}) nem egész szám." smaller_than_or_equal_to: "(%{name}) kisebb vagy egyenlő, mint %{count}." greater_than_or_equal_to: "(%{name}) nagyobbnak vagy egyenlőnek kell lennie %{count} értékkel." - format: "%{message}" + format: "%{message}\n" doorkeeper/application: attributes: redirect_uri: @@ -606,8 +607,8 @@ hu: unreadable: "nem olvasható. Biztos vagy benne, hogy ez támogatási token?" grids/grid: overlaps: 'átfedés' - outside: 'is outside of the grid.' - end_before_start: 'end value needs to be larger than the start value.' + outside: 'hatókörön kívül van.' + end_before_start: 'a befejező értéknek nagyobbnak kell lennie mint a kezdőnek' notifications: at_least_one_channel: 'At least one channel for sending notifications needs to be specified.' attributes: @@ -637,7 +638,7 @@ hu: in_use_by_work_packages: "munkacsomagok használatban vannak: %{types}" enabled_modules: dependency_missing: "The module '%{dependency}' needs to be enabled as well since the module '%{module}' depends on it." - format: "%{message}" + format: "%{message}\n" query: attributes: project: @@ -646,13 +647,13 @@ hu: error_unauthorized: "- A felhasználó nem jogosult nyilvános nézeteket létrehozni." group_by: invalid: "Nem csoportosítható e szerint: %{value}" - format: "%{message}" + format: "%{message}\n" column_names: invalid: "Érvénytelen lekérdezési oszlop: %{value}" - format: "%{message}" + format: "%{message}\n" sort_criteria: invalid: "Nem lehet rendezni ezen oszlop szerint: %{value}" - format: "%{message}" + format: "%{message}\n" group_by_hierarchies_exclusive: "kölcsönösen kizárja a csoportot a '%{group_by}' csoporttal. Nem aktiválhatja mindkettőt." filters: custom_fields: @@ -661,8 +662,8 @@ hu: queries/filters/base: attributes: values: - inclusion: "filter has invalid values." - format: "%{message}" + inclusion: "A szűrő érvénytelen értékeket tartalmaz" + format: "%{message}\n" relation: typed_dag: circular_dependency: "A kapcsolat körkörös függőséget hoz létre." @@ -698,6 +699,7 @@ hu: not_start_date: "nincs kezdő dátum, ez szükséges a fordulóponthoz." parent: cannot_be_milestone: "nem lehet egy mérföldkő." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "nem lehet egy másik projektben." not_a_valid_parent: "érvénytelen." start_date: @@ -718,7 +720,7 @@ hu: attributes: attribute_groups: attribute_unknown: "Érvénytelen feladatcsoport attribútumot használt." - attribute_unknown_name: "Invalid work package attribute used: %{attribute}" + attribute_unknown_name: "Érvénytelen munkacsomag értek %{attribute}" duplicate_group: "A %{group} név már használatban van. A csoport névnek egyedinek kell lennie." query_invalid: "A beágyazott lekérdezés '%{group}' érvénytelen: %{details}" group_without_name: "Névtelen csoport nem engedélyezett." @@ -742,14 +744,14 @@ hu: error_not_found: "nem található" member: principal_blank: "Kérem, válasszon legalább egy felhasználót vagy csoportot." - role_blank: "need to be assigned." + role_blank: "Hozzá kell rendelve lennie" attributes: roles: ungrantable: "has an unassignable role." principal: - unassignable: "cannot be assigned to a project." + unassignable: "nem lehet hozzárendelni a projekthez" version: - undeletable_work_packages_attached: "The version cannot be deleted as it has work packages attached to it." + undeletable_work_packages_attached: "Nem lehet a verziót törölni amíg hozzá van rendelve munkacsomagokhoz." status: readonly_default_exlusive: "can not be activated for statuses that are marked default." template: @@ -855,12 +857,12 @@ hu: label_backup_token: "Visszaállítási kulcs" label_create_token: "Visszaállítási kulcs létrehozása" label_delete_token: "Visszaállítási kulcs törlése" - label_reset_token: "Reset backup token" + label_reset_token: "Visszaállítási kulcs törlése" label_token_users: "The following users have active backup tokens" reset_token: action_create: Létrehoz action_reset: Visszaállít, reset - heading_reset: "Reset backup token" + heading_reset: "Visszaállítási kulcs törlése" heading_create: "Visszaállítási kulcs létrehozása" implications: > Enabling backups will allow any user with the required permissions and this backup token to download a backup containing all data of this OpenProject installation. This includes the data of all other users. @@ -957,17 +959,17 @@ hu: text_update_consent_time: Jelölje be ezt a négyzetet, ha újra kérni szeretné a felhasználók beleegyezését. Engedélyezem, ha megváltoztatta a fenti jóváhagyási jogi információt. update_consent_last_time: "Utolsó hozzájárulás frissítése: %{update_time}" copy_project: - title: 'Copy project "%{source_project_name}"' + title: 'Projekt másolása %{source_project_name}' started: "Projekt másolása elindult a \"%{source_project_name}\" nevű projektből a \"%{target_project_name}\" projektbe. E-mailben értesítjük, amint \"%{target_project_name}\" elérhető." failed: "Nem lehet másolni a %{source_project_name} projektet " - failed_internal: "Copying failed due to an internal error." + failed_internal: "Sikertelen másolás egy belső hiba miatt." succeeded: "A %{target_project_name} projekt létrehozva " errors: "Hiba" project_custom_fields: 'Projekt egyéni mezői' x_objects_of_this_type: - zero: 'No objects of this type' - one: 'One object of this type' - other: '%{count} objects of this type' + zero: 'Nincs ilyen fajta objektum' + one: 'Egy ilyen fajta objektum' + other: '%{count} ilyen fajta objektum' text: failed: "Nem lehet másolni a \"%{source_project_name}\" projektet a \"%{target_project_name}\" projektbe." succeeded: "A \"%{source_project_name}\" projekt átmásolva a \"%{target_project_name}\" projektbe." @@ -1113,7 +1115,7 @@ hu: default_role_anonymous: "Anonymous" default_role_developer: "Fejlesztő" default_role_project_admin: "Projekt admin" - default_role_project_creator_and_staff_manager: "Staff and projects manager" + default_role_project_creator_and_staff_manager: "A vezetőség és a projekt menedzser" default_role_non_member: "Nem tag" default_role_reader: "Olvasó" default_role_member: "Tag" @@ -1214,7 +1216,7 @@ hu: error_menu_item_not_saved: Menüelem nem menthető error_wiki_root_menu_item_conflict: > Nem lehet átnevezni "%{old_name}", mert "%{new_name}" menü egy már létező menüvel "%{existing_caption}" (%{existing_identifier}) ütközik. - error_external_authentication_failed: "An error occurred during external authentication. Please try again." + error_external_authentication_failed: "Hiba történt a külső hitelesítés során. Kérjük, próbálja meg újra." error_attribute_not_highlightable: "Tulajdonság(ok) nem kiemelhetők: %{attributes}" events: project: 'Projekt szerkesztve' @@ -1228,8 +1230,8 @@ hu: work_package_edit: 'A feladatcsoport szerkesztve' work_package_note: 'A feladatcsoport jegyzet hozzáadva' export: - your_work_packages_export: "Your work packages export" - succeeded: "The export has completed successfully." + your_work_packages_export: "Munkacsomagok exportálása" + succeeded: "Az exportálás sikeresen végetért." failed: "The export has failed: %{message}" format: atom: "Atom" @@ -1309,12 +1311,13 @@ hu: expiration: "Lejár" indefinite_expiration: "Soha" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: - created: "The work package was created." - assigned: "You have been assigned to %{work_package}" + created: "A munkacsomag létrehozása sikeres" + assigned: "Hozzárendeletek a %{work_package}" subscribed: "You subscribed to %{work_package}" - mentioned: "You have been mentioned in %{work_package}" + mentioned: "Megemlítettek a %{work_package}-ban" involved: "You either are assigned to or are responsible for %{work_package}" watched: "You are watching %{work_package}" label_accessibility: "Kisegítő lehetőségek" @@ -1445,6 +1448,7 @@ hu: label_deleted: "Törölve" label_deleted_custom_field: "(egyéni mező törölve)" label_deleted_custom_option: "(opció törlése)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "Csökkenő" label_details: "Részletek" label_development_roadmap: "Fejlesztési ütemterv" @@ -1569,8 +1573,8 @@ hu: label_member_new: "Új tag" label_member_all_admin: "(Összes jogosultság az admin állapot végett)" label_member_plural: "Tagok" - lable_membership_added: 'Member added' - lable_membership_updated: 'Member updated' + lable_membership_added: 'Felhasználó hozzáadva' + lable_membership_updated: 'Felhasználó frissítve' label_menu_item_name: "A menüpont neve" label_message: "Üzenet" label_message_last: "Utolsó üzenet" @@ -1618,7 +1622,6 @@ hu: label_none_parentheses: "(nincs)" label_not_contains: "nem tartalmaz" label_not_equals: "nem" - label_notify_member_plural: "E-mail frissítések" label_on: "be" label_open_menu: "Menü megnyitása" label_open_work_packages: "nyitott" @@ -1657,7 +1660,7 @@ hu: label_previous_week: "Előző héten" label_principal_invite_via_email: " vagy új felhasználót hívhat meg e-mailben" label_principal_search: "Meglévő felhasználók vagy csoportok hozzáadása" - label_privacy_policy: "Data privacy and security policy" + label_privacy_policy: "Adatvédelmi és biztonsági szabályzat" label_product_version: "Termékverzió" label_professional_support: "Szakmai támogatás" label_profile: "Profil" @@ -1738,7 +1741,6 @@ hu: label_start_to_start: "elejétől az elejéig" label_statistics: "Statisztika" label_status: "Állapot" - label_status_updated: "Munkacsomag állapotának frissítése" label_stay_logged_in: "Bejelentkezve maradok" label_storage_free_space: "Fennmaradó lemezterület" label_storage_used_space: "Felhasznált lemezterület" @@ -1822,21 +1824,17 @@ hu: label_wiki_show_submenu_item: "Megjelenítés mint: almenüpont " label_wiki_start: "Kezdő oldal" label_work_package: "Feladatcsoport" - label_work_package_added: "Munka-csomag hozzáadva" label_work_package_attachments: "Munkacsomag mellékletek" label_work_package_category_new: "Új kategória" label_work_package_category_plural: "Munkacsomag kategóriák" label_work_package_hierarchy: "Feladatcsoport hierarchia" label_work_package_new: "Új munkacsomag" - label_work_package_note_added: "A feladatcsoport jegyzet hozzáadva" label_work_package_edit: "Munkacsomag %{name} szerkesztése" label_work_package_plural: "Munkacsomagok" - label_work_package_priority_updated: "A munkacsomag fontossága frissítve" label_work_package_status: "Feladatcsoport állapot" label_work_package_status_new: "Új állapot" label_work_package_status_plural: "A munkacsomag állapotai" label_work_package_types: "Munkacsomag típusok" - label_work_package_updated: "Frissült a munkacsomag" label_work_package_tracking: "A munkacsomag nyomon követése" label_work_package_view_all: "Minden munkacsomag megtekintése" label_workflow: "Munkafolyamat" @@ -1892,7 +1890,7 @@ hu: digests: time_frame: 'Summary of all events you subscribed to in the period between %{start} and %{end}' work_packages: - created_at: '%{user} created at %{timestamp}' + created_at: '%{user} létrehozva %{timestamp}' reason: watched: 'Megfigyelt' involved: 'assignee or responsible' @@ -1900,15 +1898,15 @@ hu: subscribed: 'mind' prefix: 'Received because of the notification setting: %{reason}' subject: 'Daily project summary for %{date} - %{number} updates' - updated_at: '%{user} updated at %{timestamp}' + updated_at: '%{user} frissítve %{timestamp} ' mail_body_account_activation_request: "Új felhasználó (%{value}) regisztrálva van. A hozzáférés az Ön jóváhagyására vár:" mail_body_account_information: "A fiókod adatai" mail_body_account_information_external: "A %{value} fiók használatával jelentkezzen be." - mail_body_backup_ready: "Your requested backup is ready. You can download it here:" + mail_body_backup_ready: "A kért visszaállítás kész. Innen tudja letölteni:" mail_body_backup_token_reset_admin_info: The backup token for user '%{user}' has been reset. - mail_body_backup_token_reset_user_info: Your backup token has been reset. - mail_body_backup_token_info: The previous token is no longer valid. - mail_body_backup_waiting_period: The new token will be enabled in %{hours} hours. + mail_body_backup_token_reset_user_info: A visszaállítási kulcs törölve. + mail_body_backup_token_info: Az előző kulcs elavult. + mail_body_backup_waiting_period: A visszaállítási kulcs még %{hours} óráig érvényes. mail_body_backup_token_warning: If this wasn't you, login to OpenProject immediately and reset it again. mail_body_lost_password: "A jelszó módosításához kattintson az alábbi linkre:" mail_body_register: "Welcome to OpenProject. Please activate your account by clicking on this link:" @@ -1935,26 +1933,26 @@ hu: mail_subject_wiki_content_added: "'%{id}' wiki oldal hozzáadva" mail_subject_wiki_content_updated: "'%{id}' wiki oldal frissítve" mail_member_added_project: - subject: "%{project} - You have been added as a member" + subject: "%{project} Tagként hozzá lettél adva" body: added_by: - without_message: "%{user} added you as a member to the project '%{project}'." + without_message: "%{user} hozzáadott tagként a projekthez %{project}" with_message: "%{user} added you as a member to the project '%{project}' writing:" roles: "You have the following roles:" mail_member_updated_project: - subject: "%{project} - Your roles have been updated" + subject: "%{project} A szerepköreid frissítve lettek" body: updated_by: without_message: "%{user} updated the roles you have in the project '%{project}'." with_message: "%{user} updated the roles you have in the project '%{project}' writing:" - roles: "You now have the following roles:" + roles: "A következő jogosultságaid vannak :" mail_member_updated_global: - subject: "Your global permissions have been updated" + subject: "A globális jogosultságaid frissítve" body: updated_by: - without_message: "%{user} updated the roles you have globally." + without_message: "%{user} frissítette a globális jogosultságaidat" with_message: "%{user} updated the roles you have globally writing:" - roles: "You now have the following roles:" + roles: "A következő jogosultságaid vannak :" mail_user_activation_limit_reached: subject: A felhasználó aktiválási korlátját elérte message: | @@ -2063,7 +2061,7 @@ hu: permission_manage_placeholder_user: "Create, edit, and delete placeholder users" permission_add_subprojects: "Alprojektek létrehozása" permission_add_work_package_watchers: "Megfigyelő hozzáadása" - permission_assign_versions: "Assign versions" + permission_assign_versions: "Hozzárendelt verziók." permission_browse_repository: "Csak olvasható hozzáférés a tárolóhoz (böngészés és kijelentkezés)" permission_change_wiki_parent_page: "A szülő wiki oldal megváltoztatása" permission_comment_news: "Megjegyzések írása a hírekehez" @@ -2161,7 +2159,7 @@ hu: member_of_group: "Hozzárendelt csoport" assignee_or_group: "Megbízott, vagy a hozzá tartozó csoport" subproject_id: "Including Subproject" - only_subproject_id: "Only subproject" + only_subproject_id: "Csak alprojekt" name_or_identifier: "Név vagy azonosító" repositories: at_identifier: '%{identifier} -n' @@ -2262,7 +2260,7 @@ hu: username: "Tároló felhasználónév" truncated: "Elnézést, le kellett szűkítenünk ezt a könyvtárat %{limit} fájlra. %{truncated} bejegyzés került kihagyásra." named_repository: "%{vendor_name} tároló" - update_settings_successful: "The settings have been successfully saved." + update_settings_successful: "A beállításokat mentése sikerült." url: "Tároló URL-címe" warnings: cannot_annotate: "Ez a fájl nem annotálható." @@ -2325,7 +2323,7 @@ hu: setting_enabled_scm: "SCM engedélyezve" setting_enabled_projects_columns: "Visible in project list" setting_notification_retention_period_days: "Notification retention period" - setting_notification_email_delay_minutes: "Email sending delay" + setting_notification_email_delay_minutes: "Email küldési késleltetés" setting_notification_email_digest_time: "Email digest time" setting_feeds_enabled: "Hírcsatornák engedélyezése" setting_feeds_limit: "Tartalom szintjének a korlátja" @@ -2347,7 +2345,7 @@ hu: setting_mail_handler_api_key: "API-kulcs" setting_mail_handler_body_delimiters: "E-mailek csonkolása e sorok után" setting_mail_handler_body_delimiter_regex: "E-mailek csonkítása a megegyező kifejezéssel" - setting_mail_handler_ignore_filenames: "Ignored mail attachments" + setting_mail_handler_ignore_filenames: "Összes melléklet figyelmen kívül hagyva" setting_new_project_user_role_id: "Szerepkör a nem admin felhasználónak, aki létrehoz egy projektet," setting_password_active_rules: "Választható karakter típusok" setting_password_count_former_banned: "A legutóbb használt jelszavak száma, ezeket tilos újra felhasználni" @@ -2403,13 +2401,14 @@ hu: Set the number of days notification events for users (the source for in-app notifications) will be kept in the system. Any events older than this time will be deleted. delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > If either options "%{day_of_week_setting_name}" or "%{first_week_setting_name}" are set, the other has to be set as well to avoid inconsistencies in the frontend. first_week_of_year_text: > Select the date of January that is contained in the first week of the year. This value together with first day of the week determines the total number of weeks in a year. projects: - section_new_projects: "Settings for new projects" + section_new_projects: "Új projekt beállításai" section_project_overview: "Settings for project overview list" user: default_preferences: "Alapértelmezett preferenciák" @@ -2484,8 +2483,8 @@ hu: text_work_packages_ref_in_commit_messages: "Viszonyítandó és elintézendő feladatcsoportok a véglegesítési üzenetekben" text_journal_added: "%{label} %{value} hozzáadva" text_journal_aggregation_time_explanation: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent." - text_journal_changed: "%{label} megváltoztatva %{old}
%{new}" - text_journal_changed_plain: "%{label} megváltozott %{old} -tól %{new} -ig" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} megváltozott %{old} %{linebreak}-tól %{new} -ig" text_journal_changed_no_detail: "%{label} frissítve" text_journal_changed_with_diff: "%{label} megváltozott (%{link})" text_journal_deleted: "%{label} törölve (%{old})" @@ -2513,7 +2512,7 @@ hu: text_regexp_info: "pl. ^[A-Z0-9]+$" text_regexp_multiline: 'A reguláris kifejezés többsoros módban legyen alkalmazva. pld. ^---\s+' text_repository_usernames_mapping: "Jelölje be, vagy frissítse az alkalmazás felhasználóit, minden felhasználónév eltárolva, megtalálhatóak a csomagtároló naplóban. A felhasználók ugyanazzal az alkalmazási és csomagtárolói felhasználó névvel vagy email címmel automatikusan tárolódnak." - text_select_notifications: "Select actions for which notifications should be sent." + text_select_notifications: "Válassza ki a tevékenységeket, amelyekről e-mail értesítést kell küldeni." text_status_changed_by_changeset: "A %{value} commit-ban hozzáadva." text_table_difference_description: "Ebben a táblázatban látható az egyszeri %{entries}. Megtekintheti a két bejegyzés közötti különbséget azáltal, hogy először kiválasztja a megfelelő jelölőnégyzeteket a táblázatban. A táblázat alatti gombra kattintva a különbségek jelennek meg." text_time_logged_by_changeset: "A %{value} commit-ban hozzáadva." @@ -2788,13 +2787,13 @@ hu: attributes: lock_version: "Lezárt változat" errors: - code_400: "Bad request: %{message}" + code_400: "Hibás hívás %{message}" code_401: "Az erőforrás eléréséhez azonosítás szükséges." code_401_wrong_credentials: "Nem megfelelő hitelesítési adatok kerültek megadásra." code_403: "Ön nem jogosult az erőforrás eléréséhez." code_404: "A kért erőforrás nem található." code_409: "Nem sikerült frissíteni az erőforrást az ütköző módosítások miatt." - code_429: "Too many requests. Please try again later." + code_429: "Túl sok próbálkozás, próbáld meg később" code_500: "Belső hiba történt." expected: date: "ÉÉÉÉ-HH-NN (ISO 8601 dátum kötelező)" diff --git a/config/locales/crowdin/id.yml b/config/locales/crowdin/id.yml index 9991afff3c..9198cda446 100644 --- a/config/locales/crowdin/id.yml +++ b/config/locales/crowdin/id.yml @@ -539,6 +539,7 @@ id: error_enterprise_only: "is only available in the OpenProject Enterprise Edition" error_unauthorized: "may not be accessed." error_readonly: "was attempted to be written but is not writable." + email: "is not a valid email address." empty: "harus di isi." even: "harus imbang." exclusion: "telah dipesan." @@ -699,6 +700,7 @@ id: not_start_date: "tanggal mulai dan berakhir pada milestone harus sama." parent: cannot_be_milestone: "parent dari work package tidak bisa berupa milestone." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "tidak boleh dari proyek lain." not_a_valid_parent: "tidak valid." start_date: @@ -1294,6 +1296,7 @@ id: expiration: "Expires" indefinite_expiration: "Never" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1430,6 +1433,7 @@ id: label_deleted: "dihapus" label_deleted_custom_field: "(isian kustom dihapus)" label_deleted_custom_option: "(deleted option)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "Deskending" label_details: "Detil" label_development_roadmap: "Development roadmap" @@ -1603,7 +1607,6 @@ id: label_none_parentheses: "(kosong)" label_not_contains: "tidak berisi" label_not_equals: "tidak" - label_notify_member_plural: "Email update" label_on: "pada" label_open_menu: "Buka menu" label_open_work_packages: "buka" @@ -1723,7 +1726,6 @@ id: label_start_to_start: "start untuk memulai" label_statistics: "Statistik" label_status: "Status" - label_status_updated: "Status Paket-Penugasan telah diupdate" label_stay_logged_in: "Tetap login" label_storage_free_space: "Sisa space di disk" label_storage_used_space: "Space disk terpakai" @@ -1807,21 +1809,17 @@ id: label_wiki_show_submenu_item: "Tampilkan sebagai submenu item " label_wiki_start: "Homepage" label_work_package: "Paket-Penugasan" - label_work_package_added: "Paket-Penugasan telah ditambah" label_work_package_attachments: "Lampiran paket kerja" label_work_package_category_new: "Kategori Baru" label_work_package_category_plural: "Kategori Paket-Penugasan" label_work_package_hierarchy: "Work package hierarchy" label_work_package_new: "Paket-Penugasan baru" - label_work_package_note_added: "Catatan Paket-Penugasan telah ditambah" label_work_package_edit: "Edit Paket-Penugasan %{name}" label_work_package_plural: "Paket-Penugasan" - label_work_package_priority_updated: "Paket-Penugasan prioritas telah diupdate" label_work_package_status: "Status Work Package" label_work_package_status_new: "Status baru" label_work_package_status_plural: "Status Paket-Penugasan" label_work_package_types: "Work package types" - label_work_package_updated: "Paket-Penugasan telah diupdate" label_work_package_tracking: "Tracking Paket-Penugasan" label_work_package_view_all: "Lihat semua Paket-Penugasan" label_workflow: "Workflow" @@ -2386,6 +2384,7 @@ id: Set the number of days notification events for users (the source for in-app notifications) will be kept in the system. Any events older than this time will be deleted. delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > If either options "%{day_of_week_setting_name}" or "%{first_week_setting_name}" are set, the other has to be set as well to avoid inconsistencies in the frontend. @@ -2467,8 +2466,8 @@ id: text_work_packages_ref_in_commit_messages: "Referencing & fixing Paket-Penugasan di pesan terkirim" text_journal_added: "%{label} %{value} ditambahkan" text_journal_aggregation_time_explanation: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent." - text_journal_changed: "%{label} changed from %{old}
to %{new}" - text_journal_changed_plain: "%{label} changed from %{old} \nto %{new}" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label} telah diupdate" text_journal_changed_with_diff: "%{label} dirubah menjadi (%{link})" text_journal_deleted: "%{label} telah dihapus (%{old})" diff --git a/config/locales/crowdin/it.yml b/config/locales/crowdin/it.yml index a9910fe848..35bf0c4663 100644 --- a/config/locales/crowdin/it.yml +++ b/config/locales/crowdin/it.yml @@ -537,6 +537,7 @@ it: error_enterprise_only: "è disponibile solo in OpenProject Enterprise Edition" error_unauthorized: "potrebbe non essere accessibile." error_readonly: "è in sola lettura, pertanto non è stato possibile modificarlo." + email: "is not a valid email address." empty: "non può essere vuoto." even: "deve essere pari." exclusion: "è riservato." @@ -697,6 +698,7 @@ it: not_start_date: "non è sulla data di inizio, nonostante sia obbligatorio per i traguardi." parent: cannot_be_milestone: "non può essere un traguardo." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "non può essere in un altro progetto." not_a_valid_parent: "non è valido." start_date: @@ -1308,6 +1310,7 @@ it: expiration: "Scade" indefinite_expiration: "Mai" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1444,6 +1447,7 @@ it: label_deleted: "cancellato" label_deleted_custom_field: "(campo personalizzato eliminato)" label_deleted_custom_option: "(opzione eliminata)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "Decrescente" label_details: "Dettagli" label_development_roadmap: "Tabella di marcia di sviluppo" @@ -1617,7 +1621,6 @@ it: label_none_parentheses: "(nessuno)" label_not_contains: "non contiene" label_not_equals: "non è" - label_notify_member_plural: "Aggiornamenti email" label_on: "il" label_open_menu: "Apri menu" label_open_work_packages: "aperte" @@ -1737,7 +1740,6 @@ it: label_start_to_start: "dall'inizio all'inizio" label_statistics: "Statistiche" label_status: "Stato" - label_status_updated: "Stato della macro-attiività aggiornato" label_stay_logged_in: "Resta connesso" label_storage_free_space: "Spazio di archiviazione su disco rimanente" label_storage_used_space: "Spazio di archiviazione su disco utilizzato" @@ -1821,21 +1823,17 @@ it: label_wiki_show_submenu_item: "Mostra come voce di sottomenù di " label_wiki_start: "Pagina iniziale" label_work_package: "Macro-attività" - label_work_package_added: "Macro-attività aggiunta" label_work_package_attachments: "Allegati macro-attività" label_work_package_category_new: "Nuova categoria" label_work_package_category_plural: "Categorie della macro-attività" label_work_package_hierarchy: "Gerarchia Macro-attività" label_work_package_new: "Nuova macro-attività" - label_work_package_note_added: "Aggiunta nota alla macro-attività" label_work_package_edit: "Modifica la macro-attività %{name}" label_work_package_plural: "Macro-attività" - label_work_package_priority_updated: "Priorità della macro-attività aggiornata" label_work_package_status: "Stato della macro-attività" label_work_package_status_new: "Nuovo stato" label_work_package_status_plural: "Stati della macro-attività" label_work_package_types: "Tipi di macro-attività" - label_work_package_updated: "Macro-attività aggiornata" label_work_package_tracking: "Monitoraggio macro-attività" label_work_package_view_all: "Vedi tutte le macro-attività" label_workflow: "Flusso di lavoro" @@ -2403,6 +2401,7 @@ it: Impostare il numero di giorni di notifica per gli utenti (la fonte per le notifiche in-app) sarà mantenuto nel sistema. Eventuali eventi più vecchi verranno eliminati. delay_minutes_explanation: "L'invio di e-mail può essere ritardato per consentire agli utenti con la notifica in-app configurata di confermare la notifica all'interno dell'applicazione prima che la mail venga inviata. Gli utenti che leggono una notifica all'interno dell'applicazione non riceveranno un'email per la notifica già letta." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > Se le opzioni "%{day_of_week_setting_name}" o "%{first_week_setting_name}" sono impostate, dev'esser impostata anche l'altra per evitare incoerenze in vetrina. @@ -2484,8 +2483,8 @@ it: text_work_packages_ref_in_commit_messages: "Macro-attivita che sono correlate e/o modificate nei messaggi di conferma" text_journal_added: "%{label} %{value} aggiunto" text_journal_aggregation_time_explanation: "Le azioni individuali di un utente (ad es. l'aggiornamento di un pacchetto di lavoro due volte) sono aggregati in un'unica azione se la loro differenza di età è inferiore al periodo di tempo specificato. Verranno visualizzate come un'unica azione all'interno dell'applicazione. Questo ritarderà anche le notifiche della stessa quantità di tempo, riducendo il numero di e-mail inviate." - text_journal_changed: "modificato da %{old}
a %{new} %{label}" - text_journal_changed_plain: "%{label} cambiato da %{old} \na %{new}" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label} aggiornata" text_journal_changed_with_diff: "%{label} cambiato (%{link})" text_journal_deleted: "%{label} cancellato (%{old})" diff --git a/config/locales/crowdin/ja.yml b/config/locales/crowdin/ja.yml index 853b4b0bca..77d74efc59 100644 --- a/config/locales/crowdin/ja.yml +++ b/config/locales/crowdin/ja.yml @@ -536,6 +536,7 @@ ja: error_enterprise_only: "はOpenProjectエンタープライズ版でのみ利用可能です" error_unauthorized: "アクセスできません。" error_readonly: "書けませんでした。" + email: "is not a valid email address." empty: "は空にすることができません。" even: "は偶数にしてください。" exclusion: "は予約されています。" @@ -696,6 +697,7 @@ ja: not_start_date: "は開始日になっていません。これはマイルストーンの場倍、必要である。" parent: cannot_be_milestone: "はマイルストーンにすることはできません。" + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "は別のプロジェクトに属することはできません。" not_a_valid_parent: "は不正な値です。" start_date: @@ -1291,6 +1293,7 @@ ja: expiration: "有効期限" indefinite_expiration: "なし" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1427,6 +1430,7 @@ ja: label_deleted: "削除された" label_deleted_custom_field: "(削除されたカスタムフィールド)" label_deleted_custom_option: "(削除されたオプション)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "降順" label_details: "詳細" label_development_roadmap: "開発ロードマップ" @@ -1600,7 +1604,6 @@ ja: label_none_parentheses: "(なし)" label_not_contains: "含まない" label_not_equals: "等しくない" - label_notify_member_plural: "電子メールで更新の通知" label_on: "オン" label_open_menu: "メニューを開く" label_open_work_packages: "未完了" @@ -1720,7 +1723,6 @@ ja: label_start_to_start: "最初~最初" label_statistics: "統計情報" label_status: "ステータス" - label_status_updated: "ステータスの更新" label_stay_logged_in: "ログインを維持" label_storage_free_space: "残りのディスク容量" label_storage_used_space: "使用ディスク容量" @@ -1804,21 +1806,17 @@ ja: label_wiki_show_submenu_item: "上位のメニュー項目" label_wiki_start: "開始ページ" label_work_package: "ワーク パッケージ" - label_work_package_added: "ワークパッケージが追加されました" label_work_package_attachments: "ワークパッケージの添付ファイル" label_work_package_category_new: "新規カテゴリ" label_work_package_category_plural: "ワークパッケージのカテゴリ" label_work_package_hierarchy: "ワークパッケージの階層" label_work_package_new: "新しいワークパッケージ" - label_work_package_note_added: "仕事項目の注記が追加されました。" label_work_package_edit: "ワークパッケージ %{name} を編集" label_work_package_plural: "ワークパッケージ" - label_work_package_priority_updated: "ワークパッケージの優先度が更新されました" label_work_package_status: "ステータス名" label_work_package_status_new: "新規ステータス" label_work_package_status_plural: "ステータスの種類" label_work_package_types: "ワークパッケージの種類" - label_work_package_updated: "ワークパッケージが更新されました" label_work_package_tracking: "ワークパッケージの追跡" label_work_package_view_all: "全てのワークパッケージを表示" label_workflow: "ワークフロー" @@ -2385,6 +2383,7 @@ ja: Set the number of days notification events for users (the source for in-app notifications) will be kept in the system. Any events older than this time will be deleted. delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > オプション "%{day_of_week_setting_name}" または "%{first_week_setting_name}" が設定されている場合、フロントエンドでの不整合を避けるために、もう一方も設定する必要があります。 @@ -2466,8 +2465,8 @@ ja: text_work_packages_ref_in_commit_messages: "コミットメッセージ内でのワークパッケージの参照 / 修正" text_journal_added: "%{label}で%{value}を追加" text_journal_aggregation_time_explanation: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent." - text_journal_changed: "%{label} は %{old}
から %{new} に変更されました" - text_journal_changed_plain: "%{label} は %{old} \nから %{new} に変更されました" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label}を更新" text_journal_changed_with_diff: "%{label}を変更(%{link})" text_journal_deleted: "%{label}を削除(%{old})" diff --git a/config/locales/crowdin/js-ar.yml b/config/locales/crowdin/js-ar.yml index 69ba42ec66..4e7d1ef9a1 100644 --- a/config/locales/crowdin/js-ar.yml +++ b/config/locales/crowdin/js-ar.yml @@ -488,7 +488,7 @@ ar: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -528,6 +528,11 @@ ar: involved: 'I am involved' mentioned: 'I was mentioned' watched: 'I am watching' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'All events' add: 'Add setting for project' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/js-bg.yml b/config/locales/crowdin/js-bg.yml index 6e43aad1c5..fcb4917ea1 100644 --- a/config/locales/crowdin/js-bg.yml +++ b/config/locales/crowdin/js-bg.yml @@ -488,7 +488,7 @@ bg: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -528,6 +528,11 @@ bg: involved: 'I am involved' mentioned: 'I was mentioned' watched: 'I am watching' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'All events' add: 'Add setting for project' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/js-ca.yml b/config/locales/crowdin/js-ca.yml index 682a6c0a9c..63f0df2717 100644 --- a/config/locales/crowdin/js-ca.yml +++ b/config/locales/crowdin/js-ca.yml @@ -488,7 +488,7 @@ ca: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -528,6 +528,11 @@ ca: involved: 'I am involved' mentioned: 'I was mentioned' watched: 'I am watching' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'All events' add: 'Add setting for project' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/js-cs.yml b/config/locales/crowdin/js-cs.yml index acd7ae924f..6c6117bf39 100644 --- a/config/locales/crowdin/js-cs.yml +++ b/config/locales/crowdin/js-cs.yml @@ -488,7 +488,7 @@ cs: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -528,6 +528,11 @@ cs: involved: 'I am involved' mentioned: 'I was mentioned' watched: 'I am watching' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'All events' add: 'Add setting for project' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/js-da.yml b/config/locales/crowdin/js-da.yml index 9228ee83be..7fd2b7039e 100644 --- a/config/locales/crowdin/js-da.yml +++ b/config/locales/crowdin/js-da.yml @@ -487,7 +487,7 @@ da: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -527,6 +527,11 @@ da: involved: 'I am involved' mentioned: 'I was mentioned' watched: 'I am watching' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'All events' add: 'Add setting for project' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/js-de.yml b/config/locales/crowdin/js-de.yml index fb3b068e0c..6d2642489e 100644 --- a/config/locales/crowdin/js-de.yml +++ b/config/locales/crowdin/js-de.yml @@ -487,7 +487,7 @@ de: wiki: 'Im Wiki können Sie gemeinsam mit dem Team Informationen dokumentieren und eine Wissensdatenbank aufbauen.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'Um das Taskboard zu sehen, öffnen Sie das Sprint Drop-down Menü...' task_board_select: '… und wählen Sie den Menüpunkt Taskboard.' task_board: "Das Aufgabenfeld visualisiert den Fortschritt für diesen Sprint. Klicken Sie auf das Plus (+) Symbol neben einer User Story, um neue Aufgaben oder Hindernisse hinzuzufügen.
Der Status kann per Drag & Drop aktualisiert werden." @@ -527,6 +527,11 @@ de: involved: 'Ich bin beteiligt' mentioned: 'Ich wurde erwähnt' watched: 'Ich beobachte' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'Alle Ereignisse' add: 'Einstellung für Projekt hinzufügen' already_selected: 'Dieses Projekt ist bereits ausgewählt' diff --git a/config/locales/crowdin/js-el.yml b/config/locales/crowdin/js-el.yml index 6ea31f7b58..649ba5a68c 100644 --- a/config/locales/crowdin/js-el.yml +++ b/config/locales/crowdin/js-el.yml @@ -487,7 +487,7 @@ el: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -527,6 +527,11 @@ el: involved: 'I am involved' mentioned: 'I was mentioned' watched: 'I am watching' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'All events' add: 'Add setting for project' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/js-es.yml b/config/locales/crowdin/js-es.yml index fac8eff2b8..f4d2294baa 100644 --- a/config/locales/crowdin/js-es.yml +++ b/config/locales/crowdin/js-es.yml @@ -488,7 +488,7 @@ es: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -528,6 +528,11 @@ es: involved: 'Estoy involucrado' mentioned: 'He sido mencionado' watched: 'Estoy viendo' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'Todos los eventos' add: 'Añadir configuración para el proyecto' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/js-fi.yml b/config/locales/crowdin/js-fi.yml index f9c32fbdfb..aea4a920dd 100644 --- a/config/locales/crowdin/js-fi.yml +++ b/config/locales/crowdin/js-fi.yml @@ -488,7 +488,7 @@ fi: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -528,6 +528,11 @@ fi: involved: 'I am involved' mentioned: 'I was mentioned' watched: 'I am watching' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'All events' add: 'Add setting for project' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/js-fil.yml b/config/locales/crowdin/js-fil.yml index 5c32ca16dd..64f27860cb 100644 --- a/config/locales/crowdin/js-fil.yml +++ b/config/locales/crowdin/js-fil.yml @@ -488,7 +488,7 @@ fil: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -528,6 +528,11 @@ fil: involved: 'I am involved' mentioned: 'I was mentioned' watched: 'I am watching' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'All events' add: 'Add setting for project' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/js-fr.yml b/config/locales/crowdin/js-fr.yml index 3c51c3db88..83fd35d7bf 100644 --- a/config/locales/crowdin/js-fr.yml +++ b/config/locales/crowdin/js-fr.yml @@ -488,7 +488,7 @@ fr: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -528,6 +528,11 @@ fr: involved: 'I am involved' mentioned: 'I was mentioned' watched: 'I am watching' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'All events' add: 'Add setting for project' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/js-hr.yml b/config/locales/crowdin/js-hr.yml index 7357af9625..34157746f6 100644 --- a/config/locales/crowdin/js-hr.yml +++ b/config/locales/crowdin/js-hr.yml @@ -488,7 +488,7 @@ hr: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -528,6 +528,11 @@ hr: involved: 'I am involved' mentioned: 'I was mentioned' watched: 'I am watching' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'All events' add: 'Add setting for project' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/js-hu.yml b/config/locales/crowdin/js-hu.yml index 6cbf650fef..bde1494fde 100644 --- a/config/locales/crowdin/js-hu.yml +++ b/config/locales/crowdin/js-hu.yml @@ -135,7 +135,7 @@ hu: error: 'Cannot expand macro: %{message}' attribute_reference: macro_help_tooltip: 'This text segment is being dynamically rendered by a macro.' - not_found: 'Requested resource could not be found' + not_found: 'A kért erőforrás nem található.' invalid_attribute: "The selected attribute '%{name}' does not exist." child_pages: button: 'Gyermek kapcsolatok' @@ -203,26 +203,26 @@ hu: label_expires_at: "Lejárat ekkor" receive_newsletter: I want to receive the OpenProject newsletter. taken_domain: There can only be one active trial per domain. - taken_email: Each user can only create one trial. + taken_email: Felhasználónkként csak egy próba verzió engedélyezett email_not_received: "You did not receive an email? You can resend the email with the link on the right." - try_another_email: "Or try it with another email address." + try_another_email: "Vagy próbálja meg egy másik e-mail címellel." next_steps: "Következő lépések" resend_link: "Újraküldés" resend_success: "Email has been resent. Please check your emails and click the confirmation link provided." - resend_warning: "Could not resend email." - session_timeout: "Your session timed out. Please try to reload the page or resend email." + resend_warning: "Az email újra küldése sikertelen" + session_timeout: "A munkamenet lejárt. Kérem töltse újra az oldalt vagy küldje újra az emailt" status_label: "Állapot:" status_confirmed: "megerősítve" - status_waiting: "email sent - waiting for confirmation" - test_ee: "Test the Enterprise Edition 14 days for free" - quick_overview: "Get a quick overview of project management and team collaboration with OpenProject Enterprise Edition." + status_waiting: "email kiküldve - megerősítésre vár" + test_ee: "Tesztelje az Enterprise Verziót 14 napig ingyen" + quick_overview: "Gyors áttekintés a projekt menedzsmentről és csapatmunkáról az OpenProjecttel." upsale: become_hero: "Legyél egy hős!" benefits: description: "What are the benefits of the Enterprise on-premises Edition?" - high_security: "Security features" + high_security: "Biztonsági szolgáltatások" high_security_text: "Single sign on (SAML, OpenID Connect, CAS), two-factor authentication and automatic sync of LDAP groups." - installation: "Installation support" + installation: "Telepítési támogatás" installation_text: "Experienced software engineers guide you through the complete installation and setup process in your own infrastructure." premium_features: "Prémium funkciók" 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." @@ -236,7 +236,7 @@ hu: 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: "Korlátlan" - you_contribute: "Developers need to pay their bills, too. With the Enterprise Edition, you substantially contribute to this Open Source community effort." + you_contribute: "A fejlesztőknek is fizetni kell a számláikat. A vállalati verzióval jelentősen hozzájárulsz a nyílt forráskódú közösség erőfeszítéseihez." custom_actions: date: specific: 'be' @@ -280,7 +280,7 @@ hu: homescreen: blocks: new_features: - text_new_features: "Read about new features and product updates." + text_new_features: "Itt találhatóak az új funkciók és a frissítések" learn_about: "Tudjon meg többet az új funkciókról" standard: learn_about_link: https://www.openproject.org/openproject-11-3-release @@ -434,7 +434,7 @@ hu: label_children_derived_duration: "Work package's children derived duration" label_warning: "Figyelem" label_work_package: "Feladatcsoport" - label_work_package_parent: "Parent work package" + label_work_package_parent: "Szülő munkacsomag" label_work_package_plural: "Munkacsomagok" label_watch: "Megfigyelés" label_watch_work_package: "Megfigyelő munkacsomag" @@ -461,7 +461,7 @@ hu: label_add_description: "Adjon meg leírást a %{file} fájlhoz" label_upload_notification: "Fájl feltöltése folyamatban" label_work_package_upload_notification: "Fájlok feltöltése a #%{id}: %{subject} feladatcsoporthoz" - label_wp_id_added_by: "#%{id} added by %{author}" + label_wp_id_added_by: "%{id} hozzáadva %{author} által" label_files_to_upload: "Ezek a fájlok kerülnek feltöltésre:" label_rejected_files: "Ezeket a fájlokat nem lehet felölteni:" label_rejected_files_reason: "Ezeket a fájlokat nem lehet feltölteni, mert a méretük nagyobb, mint %{maximumFilesize}" @@ -479,17 +479,17 @@ hu: got_it: 'Rendben' steps: help_menu: 'The Help (?) menu provides additional help resources. Here you can find a user guide and helpful how-to videos and more.
Enjoy your work with OpenProject!' - members: 'Invite new members to join your project.' - project_selection: 'Please click on one of the demo projects that we have prepared. Demo data is currently only available in English.
The general demo project suits best for classical project management, while the Scrum project is better for agile project management.' - quick_add_button: 'Click on the plus (+) icon in the header navigation to create a new project or to invite coworkers.' - sidebar_arrow: "Use the return arrow in the top left corner to return to the project’s main menu." + members: 'Új tagok meghívása, hogy a projekthez csatlakozzanak.' + project_selection: 'Kérjük, válasszon egyet a projektek közül, amelyek használható példa adatokat tartalmaznak az induláshoz.
A Demo projekt a legjobban megfelel a klasszikus projektmenedzsmentnek, míg a Scrum projekt jobb az agilis projektmenedzsment számára.' + quick_add_button: 'Kattintson a fejlécben található (+) ikonra hogy create a new project vagy invite coworkers.' + sidebar_arrow: "Használja a vissza nyilat bal felül hogy visszatérjen a projektekhez main menu.." welcome: 'Áldozzon három percet erre a bemutatóra, hogy megismerje a legfontosabb szolgáltatásokat
Javasoljuk, hogy végezze el a lépéseket egészen a végéig. A túra bármikor újraindítható.' - wiki: 'Within the wiki you can document and share knowledge together with your team.' + wiki: 'A Wiki modulban tudását dokumentálhatja és megoszthatja a csapatával.' backlogs: - overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." - task_board_arrow: 'To see your task board, open the sprint drop-down...' - task_board_select: '...and select the task board entry.' + overview: "Munka kezelése a backlogs nézetben" + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." + task_board_arrow: 'A Feladatlap megjelenítéséhez nyissa meg a Sprint legördülő listát...' + task_board_select: '... és válassza ki a Feladatlap bejegyzést.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." boards: overview: 'Select boards to shift the view and manage your project using the agile boards view.' @@ -497,17 +497,17 @@ hu: add: 'Click on the plus (+) icon to create a new card or add an existing card to the list on the board.' drag: 'Drag and drop your cards within a given list to reorder them, or to move them to another list.
You can click the info (i) icon in the upper right-hand corner or double-click a card to open its details.' wp: - toggler: "Now let's have a look at the work package section, which gives you a more detailed view of your work." + toggler: "Most vessünk egy pillantást a Feladatcsoport kiválasztására, amely részletesebb képet ad a munkáról." list: 'This work package overview provides a list of all the work in your project, such as tasks, milestones, phases, and more.
Work packages can be created and edited directly from this view. To access the details of a particular work package, simply double-click its row.' full_view: 'The work package details view provides all the relevant information pertaining to a given work package, such as its description, status, priority, activities, dependencies, and comments.' back_button: 'Use the return arrow in the top left corner to exit and return to the work package list.' - create_button: 'The + Create button will add a new work package to your project.' - timeline_button: 'You can activate the Gantt chart view to create a timeline for your project.' + create_button: 'A Létrehoz gombbal tudsz új feladatot hozzáadni a projekthez.' + timeline_button: 'Aktiválhatja a Gantt-diagramot, hogy létrehozzon egy idővonalat a projekthez.' timeline: 'Here you can edit your project plan, create new work packages, such as tasks, milestones, phases, and more, as well as add dependencies. All team members can see and update the latest plan at any time.' notifications: title: "Értesítések" channel: "Csatorna" - no_unread: "No unread notifications" + no_unread: "Nincs olvasatlan értesítés" channels: in_app: "Alkalmazásban" mail: "Email" @@ -523,14 +523,19 @@ hu: mark_all_read: 'Mindegyik megjelölése olvasottként' total_count_warning: "Showing the %{newest_count} most recent notifications. %{more_count} more are not displayed." settings: - default_all_projects: 'Default for all projects' - involved: 'I am involved' - mentioned: 'I was mentioned' + default_all_projects: 'Alapértelmezett az összes projektnél' + involved: 'Részt veszek' + mentioned: 'Megemlítettek' watched: 'I am watching' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'Minden esemény' - add: 'Add setting for project' + add: 'Beállítás hozzáadása a projekthez' already_selected: 'A projekt már ki lett választva' - remove_projects: 'Remove notifications for projects' + remove_projects: 'Értesítések kikapcsolása a projektekhez' title: "Értesítési beállítások" self_notify: "Értesítés küldése a saját magam által által végrehajtott módosításokról" password_confirmation: @@ -560,15 +565,15 @@ hu: autocompleter: label: 'Projektnevek automatikus kiegészítése' text_are_you_sure: "Biztos vagy benne?" - text_data_lost: "All entered data will be lost." + text_data_lost: "Az összes adat elveszhet" types: attribute_groups: error_duplicate_group_name: "A %{group} név már használatban van. A csoport névnek egyedinek kell lennie." - error_no_table_configured: "Please configure a table for %{group}." + error_no_table_configured: "Kérem konfigurálja a táblát a %{group}" reset_title: "Űrlap konfiguráció visszaállítása" confirm_reset: > Figyelmeztetés: Biztosan visszaállítja az alap űrlap beállítást? Az attribútumok az alapértelmezett csoportba kerülnek, a láthatósági beállítások elvesznek és MINDEN egyéni mező deaktiválódik. - upgrade_to_ee: "Upgrade to Enterprise on-premises Edition" + upgrade_to_ee: "Frissítés a Vállalati Verzióra" upgrade_to_ee_text: "Hűha! Ha erre a funkcióra szükséged van, profi vagy! Támogatna minket, \"nyiltforrású\" fejlesztőket azzal, hogy Enterprise Edition ügyfelünk legyen?" more_information: "További információ" nevermind: "Mindegy" @@ -587,7 +592,7 @@ hu: hours: 'órák' title: 'Eltöltött idő rögzítése' two_factor_authentication: - label_two_factor_authentication: 'Two-factor authentication' + label_two_factor_authentication: 'Kétlépcsős hitelesítés' watchers: label_loading: megfigyelők betöltése... label_error_loading: Hiba történt a megfigyelők betöltése közben @@ -1032,8 +1037,8 @@ hu: lacking_permission: 'Please select a different project since you lack permissions to assign users to the currently selected.' lacking_permission_info: 'You lack the permission to assign users to the project you are currently in. You need to select a different one.' next_button: ' Következő' - no_results: 'No projects were found' - no_invite_rights: 'You are not allowed to invite members to this project' + no_results: 'Egyetlen projekt sem található' + no_invite_rights: 'Nincs jogosultságod meghívni felhasználókat ehhez a projekthez' type: required: 'Please select the type to be invited' user: @@ -1063,15 +1068,15 @@ hu: placeholder: 'Please select a placeholder' group: 'Válaszd ki a csoportot' role: - label: 'Role in %{project}' + label: 'Szerepek a %{project}' no_roles_found: 'Nem található szerepkör.' description: 'This is the role that %{principal} will receive when they join your project. The role defines which actions they are allowed to take and which information they are allowed to see. Learn more about roles and permissions. ' - required: 'Please select a role' + required: 'Kérjük, válasszon szerepet' next_button: ' Következő' message: - label: 'Invitation message' + label: 'Meghívó üzenet' description: 'We will send an email to %{principal}, to which you can add a personal message here. An explanation for the invitation could be useful, or perhaps a bit of information regarding the project to help them get started.' - next_button: 'Review invitation' + next_button: 'Meghívó ellenőrzése' summary: next_button: 'Meghívó küldése' success: @@ -1082,7 +1087,7 @@ hu: group: 'The group is now a part of %{project}. Meanwhile you can already plan with that group and assign work packages for instance.' next_button: 'Folytatás' forms: - submit_success_message: 'The form was successfully submitted' + submit_success_message: 'Jelentés sikeresen elküldve' load_error_message: 'There was an error loading the form' validation_error_message: 'Please fix the errors present in the form' advanced_settings: 'Speciális beállítások' diff --git a/config/locales/crowdin/js-id.yml b/config/locales/crowdin/js-id.yml index c96d0462eb..74790eb5e7 100644 --- a/config/locales/crowdin/js-id.yml +++ b/config/locales/crowdin/js-id.yml @@ -488,7 +488,7 @@ id: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -528,6 +528,11 @@ id: involved: 'I am involved' mentioned: 'I was mentioned' watched: 'I am watching' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'All events' add: 'Add setting for project' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/js-it.yml b/config/locales/crowdin/js-it.yml index 60338aabc7..3b0b150ab2 100644 --- a/config/locales/crowdin/js-it.yml +++ b/config/locales/crowdin/js-it.yml @@ -488,7 +488,7 @@ it: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -528,6 +528,11 @@ it: involved: 'Sono coinvolto' mentioned: 'Sono stato menzionato' watched: 'Sto guardando' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'Tutti gli eventi' add: 'Aggiungi impostazione per il progetto' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/js-ja.yml b/config/locales/crowdin/js-ja.yml index 573e45f68e..8261ab1d1f 100644 --- a/config/locales/crowdin/js-ja.yml +++ b/config/locales/crowdin/js-ja.yml @@ -489,7 +489,7 @@ ja: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -529,6 +529,11 @@ ja: involved: 'I am involved' mentioned: 'I was mentioned' watched: 'I am watching' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'All events' add: 'Add setting for project' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/js-ko.yml b/config/locales/crowdin/js-ko.yml index 47d2771bf2..7579393d41 100644 --- a/config/locales/crowdin/js-ko.yml +++ b/config/locales/crowdin/js-ko.yml @@ -488,7 +488,7 @@ ko: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -528,6 +528,11 @@ ko: involved: '내가 참여된' mentioned: '내가 멘션 된' watched: '내가 지켜보는 중' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: '모든 이벤트' add: '프로젝트에 셋팅 추가' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/js-lt.yml b/config/locales/crowdin/js-lt.yml index 896f346ff8..aeed89b7c9 100644 --- a/config/locales/crowdin/js-lt.yml +++ b/config/locales/crowdin/js-lt.yml @@ -488,7 +488,7 @@ lt: wiki: 'Wiki''yje galite dokumentuoti ir dalintis žiniomis su savo komandos nariais.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "Kairėje jūs matote produkto darbų sąrašą ir klaidų darbų sąrašą, dešinėje -- atitinkamus sprintus. Čia jūs galite kurti epics, user stories ir bugs, prioretizuoti vilkdami į reikiamą vietą ir priskirti sprintui." task_board_arrow: 'Norėdami matyti jūsų užduočių lentą, atverkite sprinto iškrentantį meniu...' task_board_select: '... ir pasirinkite task board elementą.' task_board: "Užduočių lenta vizualizuoja sprinto progresą. Nuspauskite pliuso (+) ženklą prie user story norėdami pridėti naujas užduotis arba trukdžius.
Būsena gali būti pakeista nuvelkant į reikiamą vietą." @@ -508,7 +508,7 @@ lt: notifications: title: "Pranešimai" channel: "Kanalas" - no_unread: "No unread notifications" + no_unread: "Nėra neperskaitytų pranešimų" channels: in_app: "Programoje" mail: "El. paštas" @@ -528,9 +528,14 @@ lt: involved: 'Aš įtrauktas' mentioned: 'Aš buvau paminėtas' watched: 'Aš stebiu' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'Visi įvykiai' add: 'Pridėkite projekto nustatymus' - already_selected: 'This project is already selected' + already_selected: 'Šis projektas jau pasirinktas' remove_projects: 'Pašalinti pranešimus projektams' title: "Pranešimų nustatymai" self_notify: "Noriu būti informuotas apie pakeitimus, kuriuos pats atlieku" diff --git a/config/locales/crowdin/js-nl.yml b/config/locales/crowdin/js-nl.yml index 06b7f6c35b..bcd22bae63 100644 --- a/config/locales/crowdin/js-nl.yml +++ b/config/locales/crowdin/js-nl.yml @@ -488,7 +488,7 @@ nl: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -528,6 +528,11 @@ nl: involved: 'I am involved' mentioned: 'I was mentioned' watched: 'I am watching' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'All events' add: 'Add setting for project' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/js-no.yml b/config/locales/crowdin/js-no.yml index 95683cd69c..ffb5da2605 100644 --- a/config/locales/crowdin/js-no.yml +++ b/config/locales/crowdin/js-no.yml @@ -488,7 +488,7 @@ wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -528,6 +528,11 @@ involved: 'I am involved' mentioned: 'I was mentioned' watched: 'I am watching' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'All events' add: 'Add setting for project' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/js-pl.yml b/config/locales/crowdin/js-pl.yml index be3f423581..1b8672e6f3 100644 --- a/config/locales/crowdin/js-pl.yml +++ b/config/locales/crowdin/js-pl.yml @@ -488,7 +488,7 @@ pl: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -528,6 +528,11 @@ pl: involved: 'I am involved' mentioned: 'I was mentioned' watched: 'I am watching' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'All events' add: 'Add setting for project' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/js-pt.yml b/config/locales/crowdin/js-pt.yml index 98e016317e..f1b81b75f1 100644 --- a/config/locales/crowdin/js-pt.yml +++ b/config/locales/crowdin/js-pt.yml @@ -486,8 +486,8 @@ pt: welcome: 'Acompanhe um tour de apresentação de 3 minutos para descobrir mais recursos importantes.
Recomendamos que você conclua as etapas até o final. Você pode reiniciar o tour a qualquer momento.' wiki: 'No wiki, você pode documentar e compartilhar conhecimento junto com sua equipe. ' backlogs: - overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + overview: "Gerencie seu trabalho na exibição de backlogs." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'Para ver o seu quadro de tarefas, abra o menu suspenso de sprint ... ' task_board_select: '... e selecione a entrada quadro de tarefas. ' task_board: "O painel de tarefas visualiza o progresso de para este sprint. Clique no ícone mais (+) ao lado de uma história de usuário para adicionar novas tarefas ou impedimentos.
O status pode ser atualizado arrastando e soltando." @@ -507,7 +507,7 @@ pt: notifications: title: "Notificações" channel: "Canal" - no_unread: "No unread notifications" + no_unread: "Nenhuma notificação não lida" channels: in_app: "No aplicativo" mail: "E-mail" @@ -527,6 +527,11 @@ pt: involved: 'Estou envolvido' mentioned: 'Eu fui mencionado' watched: 'Estou assistindo' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'Todos os eventos' add: 'Adicionar configuração para o projeto' already_selected: 'Este projeto já está selecionado' diff --git a/config/locales/crowdin/js-ro.yml b/config/locales/crowdin/js-ro.yml index d7e99fceba..73aed8bc82 100644 --- a/config/locales/crowdin/js-ro.yml +++ b/config/locales/crowdin/js-ro.yml @@ -487,7 +487,7 @@ ro: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -527,6 +527,11 @@ ro: involved: 'I am involved' mentioned: 'I was mentioned' watched: 'I am watching' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'All events' add: 'Add setting for project' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/js-ru.yml b/config/locales/crowdin/js-ru.yml index ed806765b2..a6c786b763 100644 --- a/config/locales/crowdin/js-ru.yml +++ b/config/locales/crowdin/js-ru.yml @@ -486,8 +486,8 @@ ru: welcome: 'Совершите вводный трехминутный тур для знакомства с наиболее важными особенностями.
Рекомендуем пройти все шаги до конца. Пройти вводный тур повторно можно в любое время.' wiki: 'В пределах вики возможно документирование и обмен знаниями в вашей команде.' backlogs: - overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + overview: "Управляйте своей работой в представлении backlogs." + sprints: "Справа у вас есть бэклог продукта и бэклог ошибок, слева — соответствующие спринты. Здесь вы можете создать , пользовательские истории и ошибки, управлять приоритетом перетаскиванием и добавить их в спринт." task_board_arrow: 'Чтобы увидеть вашу панель задач, откройте выпадающий спринт...' task_board_select: '... и выберите строку Панель задач.' task_board: "Панель задач визуализирует прогресс для этого спринта. Нажмите на значок плюс (+) рядом с пользовательской историей, чтобы добавить новые задачи или препятствия.
Статус можно обновить перетаскиванием." @@ -507,7 +507,7 @@ ru: notifications: title: "Уведомления" channel: "Канал" - no_unread: "No unread notifications" + no_unread: "Нет непрочитанных уведомлений" channels: in_app: "Встроенное" mail: "Электронная почта" @@ -527,6 +527,11 @@ ru: involved: 'Я участвую' mentioned: 'Я был упомянут' watched: 'Я смотрю' + work_package_commented: 'Пакет работ прокомментирован' + work_package_created: 'Пакет работ создан' + work_package_processed: 'Статус пакета работ изменен' + work_package_prioritized: 'Приоритет пакета работ изменен' + work_package_scheduled: 'Пакет работ запланирован' all: 'Все события' add: 'Добавить настройку для проекта' already_selected: 'Этот проект уже выбран' diff --git a/config/locales/crowdin/js-sk.yml b/config/locales/crowdin/js-sk.yml index 6b69682737..c8e51d809c 100644 --- a/config/locales/crowdin/js-sk.yml +++ b/config/locales/crowdin/js-sk.yml @@ -488,7 +488,7 @@ sk: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -528,6 +528,11 @@ sk: involved: 'I am involved' mentioned: 'I was mentioned' watched: 'I am watching' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'All events' add: 'Add setting for project' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/js-sl.yml b/config/locales/crowdin/js-sl.yml index 4dcb147aba..4868728e0e 100644 --- a/config/locales/crowdin/js-sl.yml +++ b/config/locales/crowdin/js-sl.yml @@ -487,7 +487,7 @@ sl: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -527,6 +527,11 @@ sl: involved: 'I am involved' mentioned: 'I was mentioned' watched: 'I am watching' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'All events' add: 'Add setting for project' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/js-sv.yml b/config/locales/crowdin/js-sv.yml index 0e4c2e544b..9e851c6b99 100644 --- a/config/locales/crowdin/js-sv.yml +++ b/config/locales/crowdin/js-sv.yml @@ -487,7 +487,7 @@ sv: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -527,6 +527,11 @@ sv: involved: 'I am involved' mentioned: 'I was mentioned' watched: 'I am watching' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'All events' add: 'Add setting for project' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/js-tr.yml b/config/locales/crowdin/js-tr.yml index 35e11a5dc3..9558daa00f 100644 --- a/config/locales/crowdin/js-tr.yml +++ b/config/locales/crowdin/js-tr.yml @@ -488,7 +488,7 @@ tr: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -528,6 +528,11 @@ tr: involved: 'I am involved' mentioned: 'I was mentioned' watched: 'I am watching' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'All events' add: 'Add setting for project' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/js-uk.yml b/config/locales/crowdin/js-uk.yml index 861e69c388..ed645ba4d9 100644 --- a/config/locales/crowdin/js-uk.yml +++ b/config/locales/crowdin/js-uk.yml @@ -488,7 +488,7 @@ uk: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -528,6 +528,11 @@ uk: involved: 'I am involved' mentioned: 'I was mentioned' watched: 'I am watching' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'All events' add: 'Add setting for project' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/js-vi.yml b/config/locales/crowdin/js-vi.yml index c4ef380b1b..361cba38b7 100644 --- a/config/locales/crowdin/js-vi.yml +++ b/config/locales/crowdin/js-vi.yml @@ -487,7 +487,7 @@ vi: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -527,6 +527,11 @@ vi: involved: 'I am involved' mentioned: 'I was mentioned' watched: 'I am watching' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'All events' add: 'Add setting for project' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/js-zh-CN.yml b/config/locales/crowdin/js-zh-CN.yml index 791e66300e..2723a23319 100644 --- a/config/locales/crowdin/js-zh-CN.yml +++ b/config/locales/crowdin/js-zh-CN.yml @@ -488,7 +488,7 @@ zh-CN: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -528,6 +528,11 @@ zh-CN: involved: 'I am involved' mentioned: 'I was mentioned' watched: 'I am watching' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'All events' add: 'Add setting for project' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/js-zh-TW.yml b/config/locales/crowdin/js-zh-TW.yml index a37fcad301..2cd9b1b012 100644 --- a/config/locales/crowdin/js-zh-TW.yml +++ b/config/locales/crowdin/js-zh-TW.yml @@ -487,7 +487,7 @@ zh-TW: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -527,6 +527,11 @@ zh-TW: involved: 'I am involved' mentioned: 'I was mentioned' watched: 'I am watching' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'All events' add: 'Add setting for project' already_selected: 'This project is already selected' diff --git a/config/locales/crowdin/ko.yml b/config/locales/crowdin/ko.yml index d130a5a5ce..075ac23b91 100644 --- a/config/locales/crowdin/ko.yml +++ b/config/locales/crowdin/ko.yml @@ -539,6 +539,7 @@ ko: error_enterprise_only: "- OpenProject Enterprise Edition에서만 사용할 수 있습니다" error_unauthorized: "액세스하지 못할 수 있습니다." error_readonly: "- 쓰려고 했지만 쓸 수 없습니다." + email: "is not a valid email address." empty: "비워둘 수 없습니다." even: "에 짝수를 입력해 주세요" exclusion: "예약됨" @@ -699,6 +700,7 @@ ko: not_start_date: "마일스톤에서 요구하지만, 시작 날짜가 없음" parent: cannot_be_milestone: "마일스톤에 포함될 수 없음" + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "다른 프로젝트에 포함될 수 없음" not_a_valid_parent: "은(는) 올바르지 않은 값입니다" start_date: @@ -1294,6 +1296,7 @@ ko: expiration: "만료" indefinite_expiration: "사용 안 함" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1430,6 +1433,7 @@ ko: label_deleted: "삭제됨" label_deleted_custom_field: "(삭제된 사용자 지정 필드)" label_deleted_custom_option: "(삭제된 옵션)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "내림차순" label_details: "세부 정보" label_development_roadmap: "개발 로드맵" @@ -1603,7 +1607,6 @@ ko: label_none_parentheses: "(없음)" label_not_contains: "포함하지 않음" label_not_equals: "일치하지 않음" - label_notify_member_plural: "이메일 업데이트" label_on: "에" label_open_menu: "메뉴 열기" label_open_work_packages: "열기" @@ -1723,7 +1726,6 @@ ko: label_start_to_start: "시작 - 시작" label_statistics: "통계" label_status: "상태" - label_status_updated: "작업 패키지 상태 업데이트됨" label_stay_logged_in: "로그인 상태 유지" label_storage_free_space: "남은 디스크 공간" label_storage_used_space: "사용 중 디스크 공간" @@ -1807,21 +1809,17 @@ ko: label_wiki_show_submenu_item: "다음의 하위 메뉴 항목으로 표시: " label_wiki_start: "시작 페이지" label_work_package: "작업 패키지" - label_work_package_added: "작업 패키지 추가됨" label_work_package_attachments: "작업 패키지 첨부 파일" label_work_package_category_new: "새 카테고리" label_work_package_category_plural: "작업 패키지 카테고리" label_work_package_hierarchy: "작업 패키지 계층 구조" label_work_package_new: "새 작업 패키지" - label_work_package_note_added: "작업 패키지 메모 추가됨" label_work_package_edit: "작업 패키지 %{name} 편집" label_work_package_plural: "작업 패키지" - label_work_package_priority_updated: "작업 패키지 우선 순위 업데이트됨" label_work_package_status: "작업 패키지 상태" label_work_package_status_new: "새 상태" label_work_package_status_plural: "작업 패키지 상태" label_work_package_types: "작업 패키지 유형" - label_work_package_updated: "작업 패키지 업데이트됨" label_work_package_tracking: "작업 패키지 추적" label_work_package_view_all: "모든 작업 패키지 보기" label_workflow: "워크플로" @@ -2386,6 +2384,7 @@ ko: 사용자에 대한 알림 이벤트(앱 내 알림에 대해서)가 시스템에 보관되는 일 수를 설정합니다. 이 시간보다 오래된 모든 이벤트는 삭제됩니다. delay_minutes_explanation: "앱 내 알림이 구성된 사용자가 메일이 발송되기 전에 애플리케이션 내에서 알림을 확인할 수 있도록 이메일 전송이 지연될 수 있습니다. 애플리케이션 내에서 알림을 읽은 사용자는 이미 읽은 알림에 대한 이메일을 받지 않습니다." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > "%{day_of_week_setting_name}"이나 "%{first_week_setting_name}" 중 하나가 설정되었다면, 프론트엔드 충돌을 방지하기 위해 나머지 하나도 설정되어야 합니다. @@ -2467,8 +2466,8 @@ ko: text_work_packages_ref_in_commit_messages: "커밋 메시지의 작업 패키지 참조 또는 수정" text_journal_added: "%{label} %{value} 추가됨" text_journal_aggregation_time_explanation: "사용자의 개별 작업(예: 작업 패키지를 두 번 업데이트)은 연령 차이가 지정된 기간 미만인 경우 단일 작업으로 집계됩니다. 애플리케이션 내에서 단일 작업으로 표시됩니다. 이것은 또한 전송되는 이메일의 수를 줄이는 동일한 시간만큼 알림을 지연시킵니다." - text_journal_changed: "%{label}이(가) %{old}에서
%{new}(으)로 변경되었습니다." - text_journal_changed_plain: "%{label}이(가) %{old}에서 \n%{new}(으)로 변경되었습니다." + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label} 업데이트됨" text_journal_changed_with_diff: "%{label} 변경됨(%{link})" text_journal_deleted: "%{label} 삭제됨(%{old})" diff --git a/config/locales/crowdin/lt.yml b/config/locales/crowdin/lt.yml index 61f59e447c..89261976b0 100644 --- a/config/locales/crowdin/lt.yml +++ b/config/locales/crowdin/lt.yml @@ -539,6 +539,7 @@ lt: error_enterprise_only: "yra galimas tik OpenProject Enterprise Edition" error_unauthorized: "negali būti pasiektas." error_readonly: "bandytas įrašyti, bet įrašyti nebuvo galima." + email: "nėra tinkamas el. pašto adresas." empty: "negali būti tuščia." even: "turi būti lyginis." exclusion: "yra rezervuotas." @@ -699,6 +700,7 @@ lt: not_start_date: "nėra pradžios data, nors tai reikalinga svarbiems etapams." parent: cannot_be_milestone: "negali būti svarbus etapas." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "negali būti kitame projekte." not_a_valid_parent: " neteisingas." start_date: @@ -1342,9 +1344,10 @@ lt: expiration: "Baigiasi" indefinite_expiration: "Niekada" notifications: + send_notifications: "Siųsti pranešimus apie šį veiksmą" work_packages: subject: - created: "The work package was created." + created: "Darbų paketas buvo sukurtas." assigned: "Jūs buvote priskirtas prie %{work_package}" subscribed: "Jūs užsiprenumeravote %{work_package}" mentioned: "Jūs buvote paminėtas %{work_package}" @@ -1478,6 +1481,7 @@ lt: label_deleted: "panaikintas" label_deleted_custom_field: "(panaikintas vartotojo laukas)" label_deleted_custom_option: "(panaikintas nustatymas)" + label_missing_or_hidden_custom_option: "(trūksta reikšmės arba prieigos teisių)" label_descending: "Mažėjančiai" label_details: "Detali informacija" label_development_roadmap: "Plėtros veiklos grafikas" @@ -1651,7 +1655,6 @@ lt: label_none_parentheses: "(nėra)" label_not_contains: "neturi" label_not_equals: "nėra" - label_notify_member_plural: "El. pašto atnaujinimai" label_on: "įjungta" label_open_menu: "Atidaryti meniu" label_open_work_packages: "atidarytas" @@ -1771,7 +1774,6 @@ lt: label_start_to_start: "nuo pradžios iki pradžios" label_statistics: "Statistika" label_status: "Būsena" - label_status_updated: "Darbų paketo būsena atnaujinta" label_stay_logged_in: "Likti prisijungus" label_storage_free_space: "Likusi vieta diske" label_storage_used_space: "Naudojamos vieta diske" @@ -1855,21 +1857,17 @@ lt: label_wiki_show_submenu_item: "Rodyti kaip submeniu punktą " label_wiki_start: "Pradžios puslapis" label_work_package: "Darbų paketas" - label_work_package_added: "Darbų paketas pridėtas" label_work_package_attachments: "Darbų paketo prisegti failai" label_work_package_category_new: "Nauja kategorija" label_work_package_category_plural: "Darbų paketo kategorijos" label_work_package_hierarchy: "Darbų paketo hierarchija" label_work_package_new: "Naujas darbų paketas" - label_work_package_note_added: "Darbų paketo pastaba pridėta" label_work_package_edit: "Redaguoti darbų paketą %{name}" label_work_package_plural: "Darbų paketai" - label_work_package_priority_updated: "Darbų paketo prioritetai atnaujinti" label_work_package_status: "Darbų paketo būsena" label_work_package_status_new: "Nauja būsena" label_work_package_status_plural: "Darbų paketo būsenos" label_work_package_types: "Darbų paketo tipai" - label_work_package_updated: "Darbų paketas atnaujintas" label_work_package_tracking: "Darbų paketo sekimas" label_work_package_view_all: "Peržiūrėti visus darbų paketus" label_workflow: "Darbų eiga" @@ -2437,6 +2435,7 @@ lt: Nustatykite kiek dienų saugoti pranešimų įvykius sistemoje (tuos, kurie bus rodomi kaip programos pranešimai). Visi įvykiai, senesni nei šis laikas bus pašalinti. delay_minutes_explanation: "El.laiškų siuntimas gali būti užlaikytas vartotojams, kurie yra susikonfigūravę gauti pranešimus tiesiai programoje ir gali patvirtinti pranešimą prieš tai, kai jis bus išsiųstas el. paštu. Vartotojai, kurie perskaito pranešimus programoje negaus tų laiškų, kuriuos pranešimus perskaitys." email_digest_explanation: "El.pašto santrauka su visais vartotojo prenumeruojamais pranešimais gali būti išsiųsta vieną kartą per dieną. Šis nustatymas atsižvelgia į vartotojo laiko zoną, t.y. 8:00 reikš, kad išsiųsta bus 7:00 UTC vartotojams iš UTC+1 zonos, ir 9:00 UTC tiems, kurie nustatę UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > Jei vienas iš „%{day_of_week_setting_name}“ ir „%{first_week_setting_name}“ yra nustatytas, tai kitas taip pat turi būti nustatytas vengiant netikslumų vartotojo sąsajoje. @@ -2518,8 +2517,8 @@ lt: text_work_packages_ref_in_commit_messages: "Darbų paketų susiejimas ir taisymas pavedimų žinutėse" text_journal_added: "%{label} %{value} pridėtas" text_journal_aggregation_time_explanation: "Visi atskiri vartotojo veiksmai (t.y. darbų paketo atnaujinimas du kartus) yra sugrupuojami į vieną veiksmą, jei laiko tarpas tarp jų yra mažesnis už šį nustatymą. Programoje jie bus rodomi kaip vienas veiksmas. Tiek pat bus pavėlinti ir pranešimai. Dėl to sumažės siunčiamų el.laiškų skaičius." - text_journal_changed: "%{label} pakeista iš %{old}
į %{new}" - text_journal_changed_plain: "%{label} pakeista iš %{old} \nį %{new}" + text_journal_changed_html: "%{label} pakeista iš %{old} %{linebreak}į %{new}" + text_journal_changed_plain: "%{label} pakeista iš %{old} %{linebreak}į %{new}" text_journal_changed_no_detail: "%{label} atnaujintas" text_journal_changed_with_diff: "%{label} pasikeitė (%{link})" text_journal_deleted: "%{label} ištrintas (%{old})" diff --git a/config/locales/crowdin/nl.yml b/config/locales/crowdin/nl.yml index 968f615f5e..0b72dda92c 100644 --- a/config/locales/crowdin/nl.yml +++ b/config/locales/crowdin/nl.yml @@ -541,6 +541,7 @@ nl: error_enterprise_only: "is only available in the OpenProject Enterprise Edition" error_unauthorized: "may not be accessed." error_readonly: "was attempted to be written but is not writable." + email: "is not a valid email address." empty: "mag niet leeg zijn." even: "moet gelijk zijn." exclusion: "is gereserveerd." @@ -701,6 +702,7 @@ nl: not_start_date: "is niet op begindatum, hoewel dit voor mijlpalen vereist is." parent: cannot_be_milestone: "kan geen mijlpaal zijn." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "kan niet in een ander project zijn." not_a_valid_parent: "is ongeldig." start_date: @@ -1312,6 +1314,7 @@ nl: expiration: "Verloopt" indefinite_expiration: "Nooit" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1448,6 +1451,7 @@ nl: label_deleted: "verwijderd" label_deleted_custom_field: "(verwijderde aangepast veld)" label_deleted_custom_option: "(deleted option)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "Aflopend" label_details: "Details" label_development_roadmap: "Ontwikkeling roadmap" @@ -1621,7 +1625,6 @@ nl: label_none_parentheses: "(geen)" label_not_contains: "bevat geen" label_not_equals: "is niet" - label_notify_member_plural: "E-mail updates" label_on: "op" label_open_menu: "Menu openen" label_open_work_packages: "Open" @@ -1741,7 +1744,6 @@ nl: label_start_to_start: "begin tot begin" label_statistics: "Statistieken" label_status: "Status" - label_status_updated: "Werkpakket status bijgewerkt" label_stay_logged_in: "Blijf ingelogd" label_storage_free_space: "Resterende schijfruimte" label_storage_used_space: "Gebruikte schijfruimte" @@ -1825,21 +1827,17 @@ nl: label_wiki_show_submenu_item: "Toon als submenu-item van " label_wiki_start: "Startpagina" label_work_package: "Werkpakket" - label_work_package_added: "Werkpakket toegevoegd" label_work_package_attachments: "Werkpakket bijlagen" label_work_package_category_new: "Nieuwe categorie" label_work_package_category_plural: "Werkpakket categorieën" label_work_package_hierarchy: "Werkpakket hiërarchie" label_work_package_new: "Nieuw werkpakket" - label_work_package_note_added: "Werkpakket notitie toegevoegd" label_work_package_edit: "Bewerk werkpakket %{name}" label_work_package_plural: "Werkpakketten" - label_work_package_priority_updated: "Werkpakket prioriteit bijgewerkt" label_work_package_status: "Status werkpakket" label_work_package_status_new: "Nieuwe status" label_work_package_status_plural: "Werkpakket statussen" label_work_package_types: "Werkpakket types" - label_work_package_updated: "Werkpakket bijgewerkt" label_work_package_tracking: "Werkpakket bijhouden" label_work_package_view_all: "Bekijk alle werkpakketten" label_workflow: "Werkstroom" @@ -2406,6 +2404,7 @@ nl: Set the number of days notification events for users (the source for in-app notifications) will be kept in the system. Any events older than this time will be deleted. delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > If either options "%{day_of_week_setting_name}" or "%{first_week_setting_name}" are set, the other has to be set as well to avoid inconsistencies in the frontend. @@ -2487,8 +2486,8 @@ nl: text_work_packages_ref_in_commit_messages: "Verwijzen naar en herstellen van de werkpakketten in commit berichten" text_journal_added: "%{label} %{value} toegevoegd" text_journal_aggregation_time_explanation: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent." - text_journal_changed: "%{label} gewijzigd van %{old}
naar %{new}" - text_journal_changed_plain: "%{label} gewijzigd van %{old} naar %{new}" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label} bijgewerkt" text_journal_changed_with_diff: "%{label} gewijzigd (%{link})" text_journal_deleted: "%{label} verwijderd (%{old})" diff --git a/config/locales/crowdin/no.yml b/config/locales/crowdin/no.yml index 45d11d2c28..7a25943c97 100644 --- a/config/locales/crowdin/no.yml +++ b/config/locales/crowdin/no.yml @@ -541,6 +541,7 @@ error_enterprise_only: "is only available in the OpenProject Enterprise Edition" error_unauthorized: "kan ikke nås" error_readonly: "ble forsøkt skrevet til, men er skrivebeskyttet" + email: "is not a valid email address." empty: "kan ikke være tomt." even: "må være partall" exclusion: "er reservert." @@ -701,6 +702,7 @@ not_start_date: "is not on start date, although this is required for milestones." parent: cannot_be_milestone: "kan ikke være en milepæl." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "kan ikke være i et annet prosjekt." not_a_valid_parent: "er ugyldig." start_date: @@ -1312,6 +1314,7 @@ expiration: "Utløper" indefinite_expiration: "Aldri" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1448,6 +1451,7 @@ label_deleted: "slettet" label_deleted_custom_field: "(slettet egendefinert felt)" label_deleted_custom_option: "(deleted option)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "Synkende" label_details: "Detaljer" label_development_roadmap: "Development roadmap" @@ -1621,7 +1625,6 @@ label_none_parentheses: "(ingen)" label_not_contains: "inneholder ikke" label_not_equals: "er ikke" - label_notify_member_plural: "E-postoppdateringer" label_on: "på" label_open_menu: "Åpne meny" label_open_work_packages: "åpne" @@ -1741,7 +1744,6 @@ label_start_to_start: "start til start" label_statistics: "Statistikk" label_status: "Status" - label_status_updated: "Status for arbeidspakke er oppdatert" label_stay_logged_in: "Forbli innlogget" label_storage_free_space: "Remaining disk space" label_storage_used_space: "Used disk space" @@ -1825,21 +1827,17 @@ label_wiki_show_submenu_item: "Vis som undermenyelement for " label_wiki_start: "Startside" label_work_package: "Arbeidspakke" - label_work_package_added: "Lagt til arbeidspakke" label_work_package_attachments: "Work package attachments" label_work_package_category_new: "Ny kategori" label_work_package_category_plural: "Kategorier for arbeidspakker" label_work_package_hierarchy: "Work package hierarchy" label_work_package_new: "Ny arbeidspakke" - label_work_package_note_added: "Lagt til arbeidspakkenotat" label_work_package_edit: "Rediger arbeidspakke %{name}" label_work_package_plural: "Arbeidspakker" - label_work_package_priority_updated: "Oppdatert prioritet for arbeidspakke" label_work_package_status: "Status for arbeidspakke" label_work_package_status_new: "Ny status" label_work_package_status_plural: "Statuser for arbeidspakke" label_work_package_types: "Work package types" - label_work_package_updated: "Arbeidspakke oppdatert" label_work_package_tracking: "Sporing av arbeidspakke" label_work_package_view_all: "Vis alle arbeidspakker" label_workflow: "Arbeidsflyt" @@ -2407,6 +2405,7 @@ Set the number of days notification events for users (the source for in-app notifications) will be kept in the system. Any events older than this time will be deleted. delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > If either options "%{day_of_week_setting_name}" or "%{first_week_setting_name}" are set, the other has to be set as well to avoid inconsistencies in the frontend. @@ -2488,8 +2487,8 @@ text_work_packages_ref_in_commit_messages: "Referèring og retting av arbeidspakker i innsendingsmeldinger" text_journal_added: "%{label} %{value} lagt til" text_journal_aggregation_time_explanation: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent." - text_journal_changed: "%{label} changed from %{old}
to %{new}" - text_journal_changed_plain: "%{label} changed from %{old} \nto %{new}" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label} oppdatert" text_journal_changed_with_diff: "%{label} endret (%{link})" text_journal_deleted: "%{label} slettet (%{old})" diff --git a/config/locales/crowdin/pl.yml b/config/locales/crowdin/pl.yml index 870d5b6281..5f544e7b65 100644 --- a/config/locales/crowdin/pl.yml +++ b/config/locales/crowdin/pl.yml @@ -540,6 +540,7 @@ pl: error_enterprise_only: "jest funkcją dostępną tylko w OpenProject Enterprise Edition" error_unauthorized: "— nie można uzyskac dostępu." error_readonly: "— podjęto próbę zapisu, ale nie jest zapisywalny." + email: "is not a valid email address." empty: "nie może być puste." even: "musi być takie samo." exclusion: "jest już zajęte." @@ -700,6 +701,7 @@ pl: not_start_date: "nie jest w dniu rozpoczęcia, chociaż jest to wymagane dla Kamieni Milowych." parent: cannot_be_milestone: "nie może być kamieniem milowym." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "nie może być w innym projekcie." not_a_valid_parent: "jest nieprawidłowe." start_date: @@ -1343,6 +1345,7 @@ pl: expiration: "Wygasa" indefinite_expiration: "Nigdy" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1479,6 +1482,7 @@ pl: label_deleted: "Usunięty" label_deleted_custom_field: "(usunięte pole niestandardowe)" label_deleted_custom_option: "(opcja usunięta)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "Malejąco" label_details: "Szczegóły" label_development_roadmap: "Droga rozwoju" @@ -1652,7 +1656,6 @@ pl: label_none_parentheses: "(brak)" label_not_contains: "nie zawierają" label_not_equals: "nie jest" - label_notify_member_plural: "Email updates" label_on: "wł" label_open_menu: "Otwórz menu" label_open_work_packages: "Otwarte" @@ -1772,7 +1775,6 @@ pl: label_start_to_start: "rozpoczęcie-rozpoczęcie" label_statistics: "Statystyki" label_status: "Status" - label_status_updated: "Status pakietu roboczego zaktualizowany" label_stay_logged_in: "Pozostań zalogowany" label_storage_free_space: "Pozostałe miejsca na dysku" label_storage_used_space: "Używana przestrzeń dyskowa" @@ -1856,21 +1858,17 @@ pl: label_wiki_show_submenu_item: "Pokaż jako pozycję podmenu " label_wiki_start: "Strona startowa" label_work_package: "Zadanie" - label_work_package_added: "Dodano zadanie" label_work_package_attachments: "Załączniki pakietu roboczego" label_work_package_category_new: "Nowa kategoria" label_work_package_category_plural: "Kategorie pakietów roboczych" label_work_package_hierarchy: "Hierarchia zadań" label_work_package_new: "Nowy pakiet roboczy" - label_work_package_note_added: "Notatka pakietu roboczego dodana" label_work_package_edit: "Edytuj pakiet roboczy %{name}" label_work_package_plural: "Pakiety robocze" - label_work_package_priority_updated: "Zaktualizowano priorytety pakietów roboczych" label_work_package_status: "Status pakietu roboczego" label_work_package_status_new: "Nowy status" label_work_package_status_plural: "Statusy pakietów roboczych" label_work_package_types: "Typy pakietów roboczych" - label_work_package_updated: "Pakiet roboczy zaktualizowany" label_work_package_tracking: "Śledzenie pakietów roboczych" label_work_package_view_all: "Pokaż wszystkie pakiety robocze" label_workflow: "Przepływ pracy" @@ -2437,6 +2435,7 @@ pl: Set the number of days notification events for users (the source for in-app notifications) will be kept in the system. Any events older than this time will be deleted. delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > Jeśli ustawiona jest opcja „%{day_of_week_setting_name}” albo „%{first_week_setting_name}”, druga musi zostać ustawiona w taki sposób, aby uniknąć niespójności we frontendzie. @@ -2518,8 +2517,8 @@ pl: text_work_packages_ref_in_commit_messages: "Odwołania i poprawki do pakietów roboczych w wiadomościach o zmianach" text_journal_added: "%{label} %{value} added" text_journal_aggregation_time_explanation: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent." - text_journal_changed: "%{label} zmieniono z %{old}
na %{new}" - text_journal_changed_plain: "%{label} zmieniono z %{old} \nna %{new}" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label} updated" text_journal_changed_with_diff: "%{label} changed (%{link})" text_journal_deleted: "%{label} deleted (%{old})" diff --git a/config/locales/crowdin/pt.yml b/config/locales/crowdin/pt.yml index b0d1b730a5..56184ff45e 100644 --- a/config/locales/crowdin/pt.yml +++ b/config/locales/crowdin/pt.yml @@ -539,6 +539,7 @@ pt: error_enterprise_only: "só está disponível no OpenProject Enterprise Edition" error_unauthorized: "não pode ser acessado." error_readonly: "tentou escrever, mas não é gravável." + email: "não é um endereço de e-mail válido." empty: "não pode ser vazio." even: "deve ser par." exclusion: "está reservado." @@ -699,6 +700,7 @@ pt: not_start_date: "não é na data de início, embora isso seja necessário para os marcos." parent: cannot_be_milestone: "não pode ser um marco." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "não pode ser em outro projeto." not_a_valid_parent: "é inválido." start_date: @@ -1310,9 +1312,10 @@ pt: expiration: "Expira" indefinite_expiration: "Nunca" notifications: + send_notifications: "Enviando notificações para está ação " work_packages: subject: - created: "The work package was created." + created: "O pacote de trabalho foi criado." assigned: "Você foi designado para %{work_package}" subscribed: "Você se inscreveu em %{work_package}" mentioned: "Você foi mencionado em %{work_package}" @@ -1446,6 +1449,7 @@ pt: label_deleted: "excluído" label_deleted_custom_field: "(campo personalizado excluído)" label_deleted_custom_option: "(opção excluída)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "Decrescente" label_details: "Detalhes" label_development_roadmap: "Planejamento do desenvolvimento" @@ -1619,7 +1623,6 @@ pt: label_none_parentheses: "(nenhum)" label_not_contains: "não contém" label_not_equals: "não é" - label_notify_member_plural: "Emails atualizados" label_on: "ligado" label_open_menu: "Abrir menu" label_open_work_packages: "aberto" @@ -1739,7 +1742,6 @@ pt: label_start_to_start: "início à início" label_statistics: "Estatísticas" label_status: "Status" - label_status_updated: "Situação de pacote de trabalho atualizada" label_stay_logged_in: "Permanecer conectado" label_storage_free_space: "Espaço em disco restante" label_storage_used_space: "Espaço em disco utilizado" @@ -1823,21 +1825,17 @@ pt: label_wiki_show_submenu_item: "Mostrar como item do submenu de " label_wiki_start: "Página inicial" label_work_package: "Pacote de trabalho" - label_work_package_added: "Pacote de trabalho adicionado" label_work_package_attachments: "Anexos de pacote de trabalho" label_work_package_category_new: "Nova categoria" label_work_package_category_plural: "Categorias de pacote de trabalho" label_work_package_hierarchy: "Hierarquia de pacotes de trabalho" label_work_package_new: "Novo pacote de trabalho" - label_work_package_note_added: "Anotação acrescentada ao pacote de trabalho" label_work_package_edit: "Editar pacote de trabalho %{name}" label_work_package_plural: "Pacotes de trabalho" - label_work_package_priority_updated: "Prioridade do pacote de trabalho atualizada" label_work_package_status: "Situação do pacote de trabalho" label_work_package_status_new: "Nova situação" label_work_package_status_plural: "Situações do Pacote de Trabalho" label_work_package_types: "Tipos de pacote de trabalho" - label_work_package_updated: "Pacote de trabalho atualizado" label_work_package_tracking: "Controle de pacote de trabalho" label_work_package_view_all: "Exibir todos os pacotes de trabalho" label_workflow: "Fluxo de Trabalho" @@ -2404,6 +2402,7 @@ pt: Defina o número de dias em que os eventos de notificação para usuários (a fonte para notificações no aplicativo) serão mantidos no sistema. Todos os eventos anteriores a esse horário serão excluídos. delay_minutes_explanation: "O envio de e-mail pode ser atrasado para permitir que os usuários com notificação configurada no aplicativo confirmem a notificação no aplicativo antes que um e-mail seja enviado. Os usuários que lerem uma notificação no aplicativo não receberão um e-mail com a notificação já lida. " email_digest_explanation: "Uma vez por dia, um e-mail resumo pode ser enviado contendo uma coleção de todas as notificações que os usuários assinaram. A configuração é relativa ao fuso horário de cada usuário configurado, por exemplo, 8:00 será executado às 7:00 UTC para usuários em UTC + 1 e 9:00 UTC para aqueles em UTC-1. " + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > Se as opções "%{day_of_week_setting_name}" ou "%{first_week_setting_name}" forem definidas, a outra também deve ser definida, para evitar inconsistências no front-end. @@ -2485,8 +2484,8 @@ pt: text_work_packages_ref_in_commit_messages: "Referenciando e corrigindo pacotes de trabalho nas mensagens de commit" text_journal_added: "%{label} %{value} adicionado" text_journal_aggregation_time_explanation: "As ações individuais de um usuário (por exemplo, atualizar um pacote de trabalho duas vezes) são agregadas em uma única ação se a diferença de idade for menor que o intervalo de tempo especificado. Eles serão exibidos como uma única ação no aplicativo. Isso também atrasará as notificações na mesma quantidade de tempo, reduzindo o número de e-mails enviados. " - text_journal_changed: "%{label} alterado de %{old}
para %{new}" - text_journal_changed_plain: "%{label} alterado de %{old} \npara %{new}" + text_journal_changed_html: "%{label} modificado de %{old} %{linebreak}para %{new}" + text_journal_changed_plain: "%{label} alterado de %{old} %{linebreak}para %{new}" text_journal_changed_no_detail: "%{label} atualizado" text_journal_changed_with_diff: "%{label} alterado %{link}" text_journal_deleted: "%{label} excluído %{old} " diff --git a/config/locales/crowdin/ro.yml b/config/locales/crowdin/ro.yml index b9d55db4c8..2e7cd45a7c 100644 --- a/config/locales/crowdin/ro.yml +++ b/config/locales/crowdin/ro.yml @@ -542,6 +542,7 @@ ro: error_enterprise_only: "este disponibil doar în OpenProject Enterprise Edition" error_unauthorized: "nu pot fi accesate." error_readonly: "a fost încercat să fie scris, dar nu este inscriptibil." + email: "is not a valid email address." empty: "nu poate fi gol." even: "trebuie să fie par." exclusion: "este rezervat." @@ -702,6 +703,7 @@ ro: not_start_date: "nu este în data de început, deși acest lucru este necesar pentru repere de etapă." parent: cannot_be_milestone: "nu poate fi un reper de etapă." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "nu poate fi într-un alt proiect." not_a_valid_parent: "este invalid." start_date: @@ -1329,6 +1331,7 @@ ro: expiration: "Expirare" indefinite_expiration: "Niciodată" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1465,6 +1468,7 @@ ro: label_deleted: "șters" label_deleted_custom_field: "(câmp personalizat șters)" label_deleted_custom_option: "(opțiune eliminată)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "Descrescător" label_details: "Detalii" label_development_roadmap: "Plan de lucru pentru dezvoltare" @@ -1638,7 +1642,6 @@ ro: label_none_parentheses: "(nimic)" label_not_contains: "nu conține" label_not_equals: "nu este" - label_notify_member_plural: "Actualizări prin e-mail" label_on: "pe" label_open_menu: "Deschidere meniu" label_open_work_packages: "deschise" @@ -1758,7 +1761,6 @@ ro: label_start_to_start: "început la început" label_statistics: "Statistici" label_status: "Stare" - label_status_updated: "Stare pachet de lucru actualizată" label_stay_logged_in: "Rămâneți conectat" label_storage_free_space: "Spațiu pe disc rămas" label_storage_used_space: "Spațiu pe disc folosit" @@ -1842,21 +1844,17 @@ ro: label_wiki_show_submenu_item: "Afișare ca submeniu pentru " label_wiki_start: "Pagină de start" label_work_package: "Pachet de lucru" - label_work_package_added: "Pachet de lucru adăugat" label_work_package_attachments: "Anexe la pachetul de lucru" label_work_package_category_new: "Categorie nouă" label_work_package_category_plural: "Categorii de pachete de lucru" label_work_package_hierarchy: "Ierarhia pachetelor de lucru" label_work_package_new: "Pachet de lucru nou" - label_work_package_note_added: "Notă adăugată la pachetul de lucru" label_work_package_edit: "Editare pachet de lucru %{name}" label_work_package_plural: "Pachete de lucru" - label_work_package_priority_updated: "Prioritate pachet de lucru actualizată" label_work_package_status: "Stare pachet de lucru" label_work_package_status_new: "Stare nouă" label_work_package_status_plural: "Stări pachete de lucru" label_work_package_types: "Tipuri de pachete de lucru" - label_work_package_updated: "Pachet de lucru actualizat" label_work_package_tracking: "Urmărire pachete de lucru" label_work_package_view_all: "Toate pachetele de lucru" label_workflow: "Flux de lucru" @@ -2424,6 +2422,7 @@ ro: Set the number of days notification events for users (the source for in-app notifications) will be kept in the system. Any events older than this time will be deleted. delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > If either options "%{day_of_week_setting_name}" or "%{first_week_setting_name}" are set, the other has to be set as well to avoid inconsistencies in the frontend. @@ -2505,8 +2504,8 @@ ro: text_work_packages_ref_in_commit_messages: "Referențiere și rezolvare a pachetelor de lucru în mesajele de încărcare" text_journal_added: "%{label} %{value} adăugat" text_journal_aggregation_time_explanation: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent." - text_journal_changed: "%{label} a fost schimbat din %{old}
în %{new}" - text_journal_changed_plain: "%{label} schimbat de la %{old}\nla %{new}" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label} actualizat" text_journal_changed_with_diff: "%{label} modificat (%{link})" text_journal_deleted: "%{label} șters (%{old})" diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml index 4634b7eda0..e237f87fed 100644 --- a/config/locales/crowdin/ru.yml +++ b/config/locales/crowdin/ru.yml @@ -542,6 +542,7 @@ ru: error_enterprise_only: "доступен только в корпоративной версии OpenProject" error_unauthorized: "не доступен." error_readonly: "запись не разрешена." + email: "неверный адрес электронной почты." empty: "не может быть пустым." even: "должно быть чётным." exclusion: "зарезервировано." @@ -702,6 +703,7 @@ ru: not_start_date: "не дата начала, но нужна для вех." parent: cannot_be_milestone: "не может служить вехой." + cannot_be_self_assigned: "не может быть присвоено самому себе." cannot_be_in_another_project: "не может быть в другом проекте." not_a_valid_parent: "неверно." start_date: @@ -1345,9 +1347,10 @@ ru: expiration: "Срок действия" indefinite_expiration: "Никогда" notifications: + send_notifications: "Отправить уведомления для этого действия" work_packages: subject: - created: "The work package was created." + created: "Пакет работ создан." assigned: "Вы были назначены %{work_package}" subscribed: "Вы подписались на %{work_package}" mentioned: "Вы были назначены %{work_package}" @@ -1481,6 +1484,7 @@ ru: label_deleted: "Удалено" label_deleted_custom_field: "(удалено настраиваемое поле)" label_deleted_custom_option: "(удалённая опция)" + label_missing_or_hidden_custom_option: "(отсутствует значение или недостаточно прав для доступа)" label_descending: "По убыванию" label_details: "Детали" label_development_roadmap: "Дорожная карта разработки" @@ -1654,7 +1658,6 @@ ru: label_none_parentheses: "(нет)" label_not_contains: "не содержит" label_not_equals: "не" - label_notify_member_plural: "Уведомление электронной почтой" label_on: "на" label_open_menu: "Открыть меню" label_open_work_packages: "открыто" @@ -1774,7 +1777,6 @@ ru: label_start_to_start: "Пуск, чтобы начать" label_statistics: "Статистика" label_status: "Состояние" - label_status_updated: "Состояние пакета работ обновлено" label_stay_logged_in: "Запомнить" label_storage_free_space: "Свободное дисковое пространство" label_storage_used_space: "Используемое дисковое пространство" @@ -1858,21 +1860,17 @@ ru: label_wiki_show_submenu_item: "Показать как пункт подменю " label_wiki_start: "Начальная страница" label_work_package: "Пакет работ" - label_work_package_added: "Пакет работ добавлен" label_work_package_attachments: "Вложения пакета работ" label_work_package_category_new: "Новая категория" label_work_package_category_plural: "Категории пакета работ" label_work_package_hierarchy: "Иерархия пакета работ" label_work_package_new: "Новый пакет работ" - label_work_package_note_added: "Добавлено примечание к комплексу работ" label_work_package_edit: "Редактирование пакета работ %{name}" label_work_package_plural: "Комплекс работ" - label_work_package_priority_updated: "Приоритет пакета работ обновлен" label_work_package_status: "Состояние группы работ" label_work_package_status_new: "Новый статус" label_work_package_status_plural: "Статусы пакета работ" label_work_package_types: "Типы рабочих пакетов" - label_work_package_updated: "Пакет работ обновлен" label_work_package_tracking: "Отслеживание пакета работ" label_work_package_view_all: "Посмотреть все пакеты работ" label_workflow: "Рабочий поток" @@ -2439,6 +2437,7 @@ ru: Количество дней в системе уведомлений для пользователей (источник уведомлений в приложении). Все события, старше этого времени будут удалены. delay_minutes_explanation: "Отправка электронной почты может быть отложена, чтобы разрешить пользователям с настроенными в уведомлениях приложения, чтобы подтвердить уведомление внутри приложения до отправки почты. Пользователи, которые прочитали уведомление в приложении, не будут получать по электронной почте уже прочитанное уведомление." email_digest_explanation: "Раз в сутки может быть отправлен дайджест с подборкой всех подписчиков на уведомления. Параметр относителен к каждому пользователю, настроенному часовой пояс, так что напр. 8:00 будет выполнено в 7:00 UTC для пользователей в UTC+1 и 9:00 UTC для пользователей в UTC-1." + events_explanation: 'Регулирует, по каким событиям отправляется письмо. Пакеты работ исключаются из этого списка, поскольку уведомления для них могут быть настроены специально для каждого пользователя.' display: first_date_of_week_and_year_set: > Если параметры "%{day_of_week_setting_name}" или "%{first_week_setting_name}" заданы, должны быть заданы и другие тоже во избежание несоответствий в интерфейсе. @@ -2520,8 +2519,8 @@ ru: text_work_packages_ref_in_commit_messages: "Привязка и фиксация пакетов работ в сообщениях коммитов" text_journal_added: "%{label} %{value} добавлено" text_journal_aggregation_time_explanation: "Личные действия пользователя (напр. обновление пакета работ дважды) агрегируются в одно действие, если их разница в возрасте меньше указанного промежутка времени. Они будут отображаться как одно действие внутри приложения. Это также задерживает уведомления на то же количество времени, уменьшая количество отправляемых сообщений." - text_journal_changed: "%{label} изменено с %{old}
на %{new}" - text_journal_changed_plain: "%{label} изменено с %{old} на %{new}" + text_journal_changed_html: "%{label} изменено с %{old} %{linebreak}на %{new}" + text_journal_changed_plain: "%{label} изменено с %{old} %{linebreak}на %{new}" text_journal_changed_no_detail: "%{label} обновлено" text_journal_changed_with_diff: "%{label} изменена (%{link})" text_journal_deleted: "%{label} удалена (%{old})" diff --git a/config/locales/crowdin/sk.yml b/config/locales/crowdin/sk.yml index ca1863aaca..4f1e67a3af 100644 --- a/config/locales/crowdin/sk.yml +++ b/config/locales/crowdin/sk.yml @@ -543,6 +543,7 @@ sk: error_enterprise_only: "is only available in the OpenProject Enterprise Edition" error_unauthorized: "may not be accessed." error_readonly: "was attempted to be written but is not writable." + email: "is not a valid email address." empty: "nemôže byť prázdny." even: "musí byť párne." exclusion: "patrí medzi vyhradené výrazy." @@ -703,6 +704,7 @@ sk: not_start_date: "nemá rovnakú hodnotu ako dátum začiatku, aj keď je to požadované pre pracovné balíčky typu \"míľnik\"." parent: cannot_be_milestone: "nemôže byť previazaný na pracovný balíček typu \"míľnik\"." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "nemôže byť previazaný na pracovný balíček nachádzajúci sa v inom projekte (musí byť povolené správcom systému)." not_a_valid_parent: "je neplatný." start_date: @@ -1346,6 +1348,7 @@ sk: expiration: "Expiruje" indefinite_expiration: "Nikdy" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1482,6 +1485,7 @@ sk: label_deleted: "odstránené" label_deleted_custom_field: "(odstrániť vlastné pole)" label_deleted_custom_option: "(deleted option)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "Zostupne" label_details: "Podrobnosti" label_development_roadmap: "Plán vývoja" @@ -1655,7 +1659,6 @@ sk: label_none_parentheses: "(žiadny)" label_not_contains: "neobsahuje" label_not_equals: "nie je" - label_notify_member_plural: "Aktualizácie e-mailom" label_on: "dňa" label_open_menu: "Otvorte menu" label_open_work_packages: "otvorené" @@ -1775,7 +1778,6 @@ sk: label_start_to_start: "od začiatku do začiatku" label_statistics: "Štatistiky" label_status: "Stav" - label_status_updated: "Stav Pracovného balíka bol aktualizovaný" label_stay_logged_in: "Zostať prihlásený" label_storage_free_space: "Zostávajúce miesto na disku" label_storage_used_space: "Použité miesto na disku" @@ -1859,21 +1861,17 @@ sk: label_wiki_show_submenu_item: "Zobraziť ako položku submenu " label_wiki_start: "Úvodná stránka" label_work_package: "Pracovný balíček" - label_work_package_added: "Pracovný balíček pridáný" label_work_package_attachments: "Prílohy pracovného balíčka" label_work_package_category_new: "Nová kategória" label_work_package_category_plural: "kategórie pracovných balíčkov" label_work_package_hierarchy: "Hierarchia Pracovného balíčka" label_work_package_new: "Nový pracovný balíček" - label_work_package_note_added: "Poznámka pracovného balíčka pridaná" label_work_package_edit: "Úprava pracovného balíčka %{name}" label_work_package_plural: "Pracovné balíčky" - label_work_package_priority_updated: "Priorita pracovného balíčka aktualizovaná" label_work_package_status: "Stav pracovného balíčka" label_work_package_status_new: "Nový stav" label_work_package_status_plural: "Stavy pracovného balíčka" label_work_package_types: "Typy pracovného balíčka" - label_work_package_updated: "Pracovný balík bol aktualizovaný" label_work_package_tracking: "Sledovanie Pracovného balíka" label_work_package_view_all: "Zobraziť všetky pracovné balíčky" label_workflow: "Pracovný postup" @@ -2442,6 +2440,7 @@ sk: Set the number of days notification events for users (the source for in-app notifications) will be kept in the system. Any events older than this time will be deleted. delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > If either options "%{day_of_week_setting_name}" or "%{first_week_setting_name}" are set, the other has to be set as well to avoid inconsistencies in the frontend. @@ -2523,8 +2522,8 @@ sk: text_work_packages_ref_in_commit_messages: "Odkazovanie a oprava pracovných balíčkov v podrobnejšom vysvetľujúcom texte" text_journal_added: "%{label} %{value} pridaných" text_journal_aggregation_time_explanation: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent." - text_journal_changed: "%{label} zmenený z %{old}
na %{new}" - text_journal_changed_plain: "%{label} zmenený z %{old} \nna %{new}" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label} aktualizované" text_journal_changed_with_diff: "%{label} zmenený (%{link})" text_journal_deleted: "%{label} odstránený (%{old})" diff --git a/config/locales/crowdin/sl.yml b/config/locales/crowdin/sl.yml index 0c5c88effc..366b0ad579 100644 --- a/config/locales/crowdin/sl.yml +++ b/config/locales/crowdin/sl.yml @@ -541,6 +541,7 @@ sl: error_enterprise_only: "je na voljo samo v OpenProject Enterprise Edition" error_unauthorized: "morda ni mogoče dostopati." error_readonly: "poskušano je bilo napisati, vendar ni mogoče pisati." + email: "is not a valid email address." empty: "ne sme biti prazno. " even: "mora biti enakomerno." exclusion: "je rezervirano." @@ -701,6 +702,7 @@ sl: not_start_date: "ni začeten datum, čeprav je to pomembno za mejnike." parent: cannot_be_milestone: "ne more biti mejnik." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "ne more biti v drugem projektu.\n" not_a_valid_parent: "ni pravo." start_date: @@ -1344,6 +1346,7 @@ sl: expiration: "Poteče" indefinite_expiration: "Nikoli" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1480,6 +1483,7 @@ sl: label_deleted: "Izbrisano" label_deleted_custom_field: "(izbrisano polje po meri)" label_deleted_custom_option: "(izbrisana možnost)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "Padajoče" label_details: "Podrobnosti" label_development_roadmap: "Načrt razvoja" @@ -1653,7 +1657,6 @@ sl: label_none_parentheses: "(brez)" label_not_contains: "ne vsebuje" label_not_equals: "ni" - label_notify_member_plural: "Posodobitve po e-pošti" label_on: "vključeno" label_open_menu: "Odpri meni" label_open_work_packages: "odpri" @@ -1773,7 +1776,6 @@ sl: label_start_to_start: "od začetka do začetka" label_statistics: "Statistika" label_status: "Stanje" - label_status_updated: "Stanje delovnega paketa posodobljeno" label_stay_logged_in: "Ostani prijavljen" label_storage_free_space: "Preostali prostor na disku" label_storage_used_space: "Zaseden prostor na disku" @@ -1857,21 +1859,17 @@ sl: label_wiki_show_submenu_item: "Prikaži kot element podmenija v" label_wiki_start: "Začetna stran" label_work_package: "Zahtevek" - label_work_package_added: "Delovni paket je dodan" label_work_package_attachments: "Priloge delovnega paketa" label_work_package_category_new: "Nova kategorija" label_work_package_category_plural: "Kategorije delovnih paketov" label_work_package_hierarchy: "Hierarhija delovnega paketa" label_work_package_new: "Nov delovni paket" - label_work_package_note_added: "Dodana je opomba o delovnem paketu" label_work_package_edit: "Urejanje delovnega paketa% {name}" label_work_package_plural: "Delovni paketi" - label_work_package_priority_updated: "Prioritete delovnega paketa so se posodobile" label_work_package_status: "Stanje delovnega paketa" label_work_package_status_new: "Novo stanje" label_work_package_status_plural: "Status delovnega paketa" label_work_package_types: "Vrsta delovnega paketa" - label_work_package_updated: "Delovni paket je posodobljen" label_work_package_tracking: "Sledenje delovnega paketa" label_work_package_view_all: "Oglejte si vse delovne pakete" label_workflow: "Potek dela" @@ -2440,6 +2438,7 @@ sl: Set the number of days notification events for users (the source for in-app notifications) will be kept in the system. Any events older than this time will be deleted. delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > If either options "%{day_of_week_setting_name}" or "%{first_week_setting_name}" are set, the other has to be set as well to avoid inconsistencies in the frontend. @@ -2521,8 +2520,8 @@ sl: text_work_packages_ref_in_commit_messages: "Sklicevanje in popravljanje delovnih paketov v sporočilih" text_journal_added: "%{label} %{value} dodan" text_journal_aggregation_time_explanation: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent." - text_journal_changed: "%{label} se je spremenila iz %{old}
v%{new}" - text_journal_changed_plain: "%{label} se je spremenil iz %{old}\nv %{new}" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label} posodobljen" text_journal_changed_with_diff: "%{label} spremenjen (%{link})" text_journal_deleted: "%{label} izbrisan (%{old})" diff --git a/config/locales/crowdin/sv.yml b/config/locales/crowdin/sv.yml index f332c9fdea..0166885568 100644 --- a/config/locales/crowdin/sv.yml +++ b/config/locales/crowdin/sv.yml @@ -540,6 +540,7 @@ sv: error_enterprise_only: "is only available in the OpenProject Enterprise Edition" error_unauthorized: "åtkomst nekas." error_readonly: "försökte skrivas men är inte skrivbart." + email: "is not a valid email address." empty: "kan inte vara tomt." even: "måste vara jämn." exclusion: "är reserverat." @@ -700,6 +701,7 @@ sv: not_start_date: "är inte på startdatum, även om detta behövs för milstolpar." parent: cannot_be_milestone: "kan inte vara en milstolpe." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "kan inte vara i ett annat projekt." not_a_valid_parent: "är ogiltig." start_date: @@ -1311,6 +1313,7 @@ sv: expiration: "Upphör" indefinite_expiration: "Aldrig" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1447,6 +1450,7 @@ sv: label_deleted: "raderad" label_deleted_custom_field: "(raderat anpassat fält)" label_deleted_custom_option: "(deleted option)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "Fallande" label_details: "Detaljer" label_development_roadmap: "Utvecklingsplan" @@ -1620,7 +1624,6 @@ sv: label_none_parentheses: "(ingen)" label_not_contains: "innehåller inte" label_not_equals: "är inte" - label_notify_member_plural: "Uppdateringar via E-post" label_on: "på" label_open_menu: "Öppna meny" label_open_work_packages: "öppna" @@ -1740,7 +1743,6 @@ sv: label_start_to_start: "början till början" label_statistics: "Statistik" label_status: "Status" - label_status_updated: "Status för arbetspaket uppdaterad" label_stay_logged_in: "Fortsätt vara inloggad" label_storage_free_space: "Återstående diskutrymme" label_storage_used_space: "Använt diskutrymme" @@ -1824,21 +1826,17 @@ sv: label_wiki_show_submenu_item: "Visa som undermenyalternativ för " label_wiki_start: "Startsida" label_work_package: "Arbetspaket" - label_work_package_added: "Arbetspaket lades till" label_work_package_attachments: "Bilagor till arbetspaket" label_work_package_category_new: "Ny kategori" label_work_package_category_plural: "Arbetspaketkategorier" label_work_package_hierarchy: "Arbetspaketshierarki" label_work_package_new: "Nytt arbetspaket" - label_work_package_note_added: "Anteckning lades till arbetspaket" label_work_package_edit: "Redigera arbetspaket %{name}" label_work_package_plural: "Arbetspaketen" - label_work_package_priority_updated: "Arbetspaketets prioritet uppdaterad" label_work_package_status: "Arbetspaketstatus" label_work_package_status_new: "Ny status" label_work_package_status_plural: "Arbetspaketstatus" label_work_package_types: "Arbetspaketstyper" - label_work_package_updated: "Arbetspaketet uppdaterat" label_work_package_tracking: "Arbetspaketsspårning" label_work_package_view_all: "Visa alla arbetspaket" label_workflow: "Arbetsflöde" @@ -2404,6 +2402,7 @@ sv: Set the number of days notification events for users (the source for in-app notifications) will be kept in the system. Any events older than this time will be deleted. delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > If either options "%{day_of_week_setting_name}" or "%{first_week_setting_name}" are set, the other has to be set as well to avoid inconsistencies in the frontend. @@ -2485,8 +2484,8 @@ sv: text_work_packages_ref_in_commit_messages: "Referenser och fixande av arbetspaket i incheckningsmeddelanden" text_journal_added: "%{label} %{value} lades till" text_journal_aggregation_time_explanation: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent." - text_journal_changed: "%{label} ändrade från %{old}
till %{new}" - text_journal_changed_plain: "%{label} ändrade från %{old} \ntill %{new}" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label} uppdaterades" text_journal_changed_with_diff: "%{label} ändrades (%{link})" text_journal_deleted: "%{label} raderad (%{old})" diff --git a/config/locales/crowdin/tr.yml b/config/locales/crowdin/tr.yml index 5df93838ad..3b29589077 100644 --- a/config/locales/crowdin/tr.yml +++ b/config/locales/crowdin/tr.yml @@ -541,6 +541,7 @@ tr: error_enterprise_only: "sadece OpenProject'in ticari sürümlerinde mevcuttur" error_unauthorized: "erişilemez." error_readonly: "yazılmaya çalışıldı fakat yazılabilir değil." + email: "is not a valid email address." empty: "boş olamaz." even: "çift olmalı." exclusion: "ayrılmıştır." @@ -701,6 +702,7 @@ tr: not_start_date: "kilometre taşları için gerekli olmasına rağmen başlangıç tarihi değil." parent: cannot_be_milestone: "kilometre taşı olamaz." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "başka bir projede olamaz." not_a_valid_parent: "geçersizdir." start_date: @@ -1312,6 +1314,7 @@ tr: expiration: "Bitiş tarihi" indefinite_expiration: "Hiçbir zaman" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1448,6 +1451,7 @@ tr: label_deleted: "silindi" label_deleted_custom_field: "(özel alan silindi)" label_deleted_custom_option: "(silinen seçenek)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "Azalan" label_details: "Detaylar" label_development_roadmap: "Geliştirme yol haritası" @@ -1621,7 +1625,6 @@ tr: label_none_parentheses: "(yok)" label_not_contains: "içermiyor" label_not_equals: "değildir" - label_notify_member_plural: "Eposta güncellemeleri" label_on: "açık" label_open_menu: "Menüyü Aç" label_open_work_packages: "açık" @@ -1741,7 +1744,6 @@ tr: label_start_to_start: "baştan başa" label_statistics: "İstatistikler" label_status: "Durum" - label_status_updated: "İş paketi durumu güncellendi" label_stay_logged_in: "Oturum açık kalsın" label_storage_free_space: "Kalan disk alanı" label_storage_used_space: "Kullanışmış disk alanı" @@ -1825,21 +1827,17 @@ tr: label_wiki_show_submenu_item: "Alt menü öğesi olarak göster " label_wiki_start: "Başlangıç sayfası" label_work_package: "İş paketi" - label_work_package_added: "İş paketi eklendi" label_work_package_attachments: "İş paketi ekleri" label_work_package_category_new: "Yeni kategori" label_work_package_category_plural: "İş paketi kategorileri" label_work_package_hierarchy: "İş paketi hiyerarşisi" label_work_package_new: "Yeni iş paketi" - label_work_package_note_added: "İk Paketi notu eklendi" label_work_package_edit: "%{name} iş paketini düzenle" label_work_package_plural: "İş paketleri" - label_work_package_priority_updated: "İş paketi önceliği güncellendi" label_work_package_status: "İş paketi durumu" label_work_package_status_new: "Yeni durum" label_work_package_status_plural: "İş paketi durumları" label_work_package_types: "İş paketi türleri" - label_work_package_updated: "İş paketi güncellendi" label_work_package_tracking: "İş paketi takibi" label_work_package_view_all: "Tüm iş paketleri görüntüle" label_workflow: "İş akışı" @@ -2407,6 +2405,7 @@ tr: Set the number of days notification events for users (the source for in-app notifications) will be kept in the system. Any events older than this time will be deleted. delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > Eğer %{day_of_week_setting_name} veya %{first_week_setting_name} seçeneklerinden biri ayarlanmışsa, ön uçta tutarsızlık yaşanmaması için diğer seçeneğin de ayarlanması gerekir. @@ -2488,8 +2487,8 @@ tr: text_work_packages_ref_in_commit_messages: "İş paketlerini taahhüt mesajlarında referans ve sabitleme" text_journal_added: "%{value} %{label} eklendi" text_journal_aggregation_time_explanation: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent." - text_journal_changed: "%{label} %{old} -> %{new} olarak güncellendi" - text_journal_changed_plain: "%{label} %{old} den değiştirildi\n%{new} 'e" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label} güncellendi" text_journal_changed_with_diff: "%{label} değişti ( %{link})" text_journal_deleted: "%{label}, ( %{old}) silindi" diff --git a/config/locales/crowdin/uk.yml b/config/locales/crowdin/uk.yml index 3c18176491..0745beb537 100644 --- a/config/locales/crowdin/uk.yml +++ b/config/locales/crowdin/uk.yml @@ -543,6 +543,7 @@ uk: error_enterprise_only: "is only available in the OpenProject Enterprise Edition" error_unauthorized: "may not be accessed." error_readonly: "was attempted to be written but is not writable." + email: "is not a valid email address." empty: "не може бути порожнім." even: "має бути рівним." exclusion: "зарезервовано." @@ -703,6 +704,7 @@ uk: not_start_date: "не на дату початку, хоча це потрібно для етапів." parent: cannot_be_milestone: "не може бути важливою подією." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "не може бути в іншому проекті." not_a_valid_parent: "зазначено невірно" start_date: @@ -1346,6 +1348,7 @@ uk: expiration: "Закінчується" indefinite_expiration: "Ніколи" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1482,6 +1485,7 @@ uk: label_deleted: "вилучено " label_deleted_custom_field: "(видалено спеціальне поле)" label_deleted_custom_option: "(deleted option)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "За спаданням" label_details: "Детальніше" label_development_roadmap: "Розробка дорожньої карти" @@ -1655,7 +1659,6 @@ uk: label_none_parentheses: "(нічого)" label_not_contains: "не містить" label_not_equals: "немає" - label_notify_member_plural: "Оновлення електронної пошти" label_on: "на" label_open_menu: "Відкрити меню" label_open_work_packages: "відкрити" @@ -1775,7 +1778,6 @@ uk: label_start_to_start: "початок" label_statistics: "Статистика" label_status: "Статус" - label_status_updated: "Статус робочого пакету оновлено" label_stay_logged_in: "Запам'ятати мене" label_storage_free_space: "Залишок на диску" label_storage_used_space: "Використовується дисковий простір" @@ -1859,21 +1861,17 @@ uk: label_wiki_show_submenu_item: "Показати як пункт підменю " label_wiki_start: "Початкова сторінка" label_work_package: "Пакет робіт" - label_work_package_added: "Робочий пакет доданий" label_work_package_attachments: "Додатки до робочого пакету" label_work_package_category_new: "Нова категорія" label_work_package_category_plural: "Категорії робочих пакетів" label_work_package_hierarchy: "Ієрархія робочих пакетів" label_work_package_new: "Новий пакет робіт" - label_work_package_note_added: "Робочий пакет не доданий" label_work_package_edit: "Редагувати робочий пакет %{name}" label_work_package_plural: "Пакет робіт" - label_work_package_priority_updated: "Оновлено пріоритет робочого пакета" label_work_package_status: "Стан робочого пакета" label_work_package_status_new: "Новий статус" label_work_package_status_plural: "Статуси робочих пакетів" label_work_package_types: "Типи робочих пакетів" - label_work_package_updated: "Робочий пакет оновлений" label_work_package_tracking: "Відстеження робочого пакету" label_work_package_view_all: "Переглянути всі робочі пакети" label_workflow: "Робочий процес" @@ -2443,6 +2441,7 @@ uk: Set the number of days notification events for users (the source for in-app notifications) will be kept in the system. Any events older than this time will be deleted. delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > If either options "%{day_of_week_setting_name}" or "%{first_week_setting_name}" are set, the other has to be set as well to avoid inconsistencies in the frontend. @@ -2524,8 +2523,8 @@ uk: text_work_packages_ref_in_commit_messages: "Посилання та фіксація робочих пакетів у повідомленнях комітів" text_journal_added: "%{label} %{value} доданий" text_journal_aggregation_time_explanation: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent." - text_journal_changed: "%{label} змінено з %{old}
to %{new}" - text_journal_changed_plain: "%{label} змінено з %{old} в %{new}" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label} оновлено" text_journal_changed_with_diff: "%{label} змінено (%{link})" text_journal_deleted: "%{label} видалено (%{old})" diff --git a/config/locales/crowdin/vi.yml b/config/locales/crowdin/vi.yml index 999da88687..f803905320 100644 --- a/config/locales/crowdin/vi.yml +++ b/config/locales/crowdin/vi.yml @@ -542,6 +542,7 @@ vi: error_enterprise_only: "is only available in the OpenProject Enterprise Edition" error_unauthorized: "Có thể không được truy cập." error_readonly: "was attempted to be written but is not writable." + email: "is not a valid email address." empty: "không thể để trống" even: "must be even." exclusion: "được bảo lưu." @@ -702,6 +703,7 @@ vi: not_start_date: "không phải ngày bắt đầu, mặc dù điều này là cần thiết cho các mốc quan trọng." parent: cannot_be_milestone: "không thể là một cột mốc." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "không thể có trong một dự án khác." not_a_valid_parent: "không hợp lệ" start_date: @@ -1297,6 +1299,7 @@ vi: expiration: "Hết hạn" indefinite_expiration: "Không bao giờ" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1433,6 +1436,7 @@ vi: label_deleted: "đã xóa" label_deleted_custom_field: "(đã xóa các mục tùy chỉnh)" label_deleted_custom_option: "(tùy chọn đã xóa)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "Giảm dần" label_details: "Chi tiết" label_development_roadmap: "Lộ trình phát triển" @@ -1606,7 +1610,6 @@ vi: label_none_parentheses: "(trống)" label_not_contains: "không chứa" label_not_equals: "không là" - label_notify_member_plural: "Cập nhật thư" label_on: "lúc" label_open_menu: "Mở trình đơn" label_open_work_packages: "mở" @@ -1726,7 +1729,6 @@ vi: label_start_to_start: "bắt đầu đến bắt đầu" label_statistics: "Số liệu thống kê" label_status: "Trạng thái" - label_status_updated: "Tình trạng Work package đã cập nhật" label_stay_logged_in: "Duy trì đăng nhập" label_storage_free_space: "Dung lượng đĩa còn lại" label_storage_used_space: "Dung lượng đĩa đã sử dụng" @@ -1810,21 +1812,17 @@ vi: label_wiki_show_submenu_item: "Hiển thị dưới dạng mục menu con của" label_wiki_start: "Trang bắt đầu" label_work_package: "Work Package" - label_work_package_added: "Đã thêm work package" label_work_package_attachments: "Phần đính kèm công việc" label_work_package_category_new: "Danh mục mới" label_work_package_category_plural: "Các thể loại work package" label_work_package_hierarchy: "Phân cấp công việc" label_work_package_new: "Work package mới" - label_work_package_note_added: "Đã thêm ghi chú của work package" label_work_package_edit: "Chỉnh sửa work package %{name}" label_work_package_plural: "Work Packages" - label_work_package_priority_updated: "Đã cập nhật độ ưu tiên của work package" label_work_package_status: "Tình trạng work package" label_work_package_status_new: "Trạng thái mới" label_work_package_status_plural: "Tình trạng work package" label_work_package_types: "Kiểu công việc" - label_work_package_updated: "đã cập nhật work package" label_work_package_tracking: "Theo dõi work package" label_work_package_view_all: "Xem tất cả các work package" label_workflow: "Quy trình làm việc" @@ -2391,6 +2389,7 @@ vi: Set the number of days notification events for users (the source for in-app notifications) will be kept in the system. Any events older than this time will be deleted. delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > If either options "%{day_of_week_setting_name}" or "%{first_week_setting_name}" are set, the other has to be set as well to avoid inconsistencies in the frontend. @@ -2472,8 +2471,8 @@ vi: text_work_packages_ref_in_commit_messages: "Referencing and fixing work packages in commit messages" text_journal_added: "%{label} %{value} added" text_journal_aggregation_time_explanation: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent." - text_journal_changed: "%{label} được sửa từ %{old}
thành %{new}" - text_journal_changed_plain: "%{label} thay đổi %{old} thành %{new}" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label} updated" text_journal_changed_with_diff: "%{label} changed (%{link})" text_journal_deleted: "%{label} deleted (%{old})" diff --git a/config/locales/crowdin/zh-CN.yml b/config/locales/crowdin/zh-CN.yml index 8fb4dd12ee..b62227043c 100644 --- a/config/locales/crowdin/zh-CN.yml +++ b/config/locales/crowdin/zh-CN.yml @@ -536,6 +536,7 @@ zh-CN: error_enterprise_only: "仅在 OpenProject 企业版中可用" error_unauthorized: "无法访问。" error_readonly: "曾尝试被写入,但不可写。" + email: "is not a valid email address." empty: "不能为空。" even: "必须是偶数。" exclusion: "是保留关键字。" @@ -696,6 +697,7 @@ zh-CN: not_start_date: "不是在开始日期开始,尽管这是必需的里程碑。" parent: cannot_be_milestone: "不能是一个里程碑。" + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "不能在另一个项目中。" not_a_valid_parent: "是无效的。" start_date: @@ -1291,6 +1293,7 @@ zh-CN: expiration: "过期" indefinite_expiration: "永不" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1427,6 +1430,7 @@ zh-CN: label_deleted: "已删除" label_deleted_custom_field: "(删除自定义字段)" label_deleted_custom_option: "(删除的选项)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "降序" label_details: "详细信息" label_development_roadmap: "发展蓝图" @@ -1600,7 +1604,6 @@ zh-CN: label_none_parentheses: "(无)" label_not_contains: "不包含" label_not_equals: "不是" - label_notify_member_plural: "电子邮件更新" label_on: "于" label_open_menu: "打开菜单" label_open_work_packages: "打开" @@ -1720,7 +1723,6 @@ zh-CN: label_start_to_start: "开始开始" label_statistics: "统计数据" label_status: "状态" - label_status_updated: "工作包状态更新" label_stay_logged_in: "保持登录状态" label_storage_free_space: "剩余磁盘空间" label_storage_used_space: "已使用磁盘空间" @@ -1804,21 +1806,17 @@ zh-CN: label_wiki_show_submenu_item: "显示为子菜单项" label_wiki_start: "起始页" label_work_package: "工作包" - label_work_package_added: "添加工作包" label_work_package_attachments: "工作包附件" label_work_package_category_new: "新的类别" label_work_package_category_plural: "工作包类别" label_work_package_hierarchy: "工作包的层次结构" label_work_package_new: "新工作包" - label_work_package_note_added: "添加工作包注释" label_work_package_edit: "编辑工作包 %{name}" label_work_package_plural: "工作包" - label_work_package_priority_updated: "更新工作包优先级" label_work_package_status: "工作包状态" label_work_package_status_new: "新状态" label_work_package_status_plural: "工作包状态" label_work_package_types: "工作包类型" - label_work_package_updated: "工作包更新" label_work_package_tracking: "工作包跟踪" label_work_package_view_all: "查看所有工作包" label_workflow: "工作流" @@ -2381,6 +2379,7 @@ zh-CN: Set the number of days notification events for users (the source for in-app notifications) will be kept in the system. Any events older than this time will be deleted. delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > 如果设置了选项“%{day_of_week_setting_name}”或“%{first_week_setting_name}”,也必须设置另一选项以避免前端不一致。 @@ -2462,8 +2461,8 @@ zh-CN: text_work_packages_ref_in_commit_messages: "引用和修复工作包中提交消息" text_journal_added: "%{label} %{value} 已添加" text_journal_aggregation_time_explanation: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent." - text_journal_changed: "%{label} 已从 %{old}
更改为 %{new}" - text_journal_changed_plain: "%{label} 已从 %{old} 更改为 %{new}" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label} 已更新" text_journal_changed_with_diff: "%{label} 已变更 (%{link})" text_journal_deleted: "%{label} 已删除 (%{old})" diff --git a/config/locales/crowdin/zh-TW.yml b/config/locales/crowdin/zh-TW.yml index 1271faa816..fa4cfb8343 100644 --- a/config/locales/crowdin/zh-TW.yml +++ b/config/locales/crowdin/zh-TW.yml @@ -540,6 +540,7 @@ zh-TW: error_enterprise_only: "is only available in the OpenProject Enterprise Edition" error_unauthorized: "無法被存取。" error_readonly: "被嘗試寫入但是無法寫入。" + email: "is not a valid email address." empty: "不可為空" even: "必須是偶數" exclusion: "已保留" @@ -700,6 +701,7 @@ zh-TW: not_start_date: "不在開始的日期,儘管它是里程碑所必需的。" parent: cannot_be_milestone: "不可以成為一個里程碑" + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "不可以存在於另外一個專案中" not_a_valid_parent: "不正確。" start_date: @@ -1295,6 +1297,7 @@ zh-TW: expiration: "過期" indefinite_expiration: "永不" notifications: + send_notifications: "Send notifications for this action" work_packages: subject: created: "The work package was created." @@ -1431,6 +1434,7 @@ zh-TW: label_deleted: "刪除線" label_deleted_custom_field: "(已刪除的自訂欄位)" label_deleted_custom_option: "(deleted option)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "降冪" label_details: "詳細資料" label_development_roadmap: "發展路徑圖" @@ -1604,7 +1608,6 @@ zh-TW: label_none_parentheses: "(無)" label_not_contains: "不包含" label_not_equals: "不是" - label_notify_member_plural: "電子郵件通知" label_on: "開啟" label_open_menu: "開啟選單" label_open_work_packages: "打開" @@ -1724,7 +1727,6 @@ zh-TW: label_start_to_start: "開始到開始" label_statistics: "統計" label_status: "狀態" - label_status_updated: "工作項目狀態已更新" label_stay_logged_in: "保持登入" label_storage_free_space: "剩餘磁碟空間" label_storage_used_space: "已用磁碟空間" @@ -1808,21 +1810,17 @@ zh-TW: label_wiki_show_submenu_item: "呈現於子功能表的 " label_wiki_start: "開始頁面" label_work_package: "工作項目" - label_work_package_added: "工作項目已新增" label_work_package_attachments: "工作項目附件" label_work_package_category_new: "新增類別" label_work_package_category_plural: "工作項目類別" label_work_package_hierarchy: "工作包層次結構" label_work_package_new: "新增工作項目" - label_work_package_note_added: "工作項目註記已新增" label_work_package_edit: "編輯工作項目 %{name}" label_work_package_plural: "工作項目" - label_work_package_priority_updated: "工作項目優先等級已更新" label_work_package_status: "工作項目狀態" label_work_package_status_new: "新狀態" label_work_package_status_plural: "工作項目狀態" label_work_package_types: "工作項目類型" - label_work_package_updated: "工作項目已更新" label_work_package_tracking: "工作項目追蹤" label_work_package_view_all: "檢視所有工作項目" label_workflow: "工作流程" @@ -2388,6 +2386,7 @@ zh-TW: Set the number of days notification events for users (the source for in-app notifications) will be kept in the system. Any events older than this time will be deleted. delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > If either options "%{day_of_week_setting_name}" or "%{first_week_setting_name}" are set, the other has to be set as well to avoid inconsistencies in the frontend. @@ -2469,8 +2468,8 @@ zh-TW: text_work_packages_ref_in_commit_messages: "在提交訊息中引用和修復工作項目" text_journal_added: "%{label} %{value} 已增加" text_journal_aggregation_time_explanation: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent." - text_journal_changed: "%{label} 從 %{old}
變成 %{new}" - text_journal_changed_plain: "%{label} 從 %{old} 改為 %{new}" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label} 已更新" text_journal_changed_with_diff: "%{label} 已改變 (%{link})" text_journal_deleted: "%{label}已刪除 (%{old})" diff --git a/config/locales/en.seeders.standard.yml b/config/locales/en.seeders.standard.yml index a92f4197d2..f9a2964eb9 100644 --- a/config/locales/en.seeders.standard.yml +++ b/config/locales/en.seeders.standard.yml @@ -41,7 +41,7 @@ en: Never stop collaborating. With open source and open mind. - You can change this welcome text [here](%{base_url}/settings). + You can change this welcome text [here](%{base_url}/admin/settings/general). projects: demo-project: name: Demo project diff --git a/config/locales/en.yml b/config/locales/en.yml index 3b19f75deb..9e2a93bfb8 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -600,6 +600,7 @@ en: error_enterprise_only: "is only available in the OpenProject Enterprise Edition" error_unauthorized: "may not be accessed." error_readonly: "was attempted to be written but is not writable." + email: "is not a valid email address." empty: "can't be empty." even: "must be even." exclusion: "is reserved." @@ -760,6 +761,7 @@ en: not_start_date: "is not on start date, although this is required for milestones." parent: cannot_be_milestone: "cannot be a milestone." + cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_in_another_project: "cannot be in another project." not_a_valid_parent: "is invalid." start_date: @@ -1513,6 +1515,7 @@ en: label_deleted: "deleted" label_deleted_custom_field: "(deleted custom field)" label_deleted_custom_option: "(deleted option)" + label_missing_or_hidden_custom_option: "(missing value or lacking permissions to access)" label_descending: "Descending" label_details: "Details" label_development_roadmap: "Development roadmap" @@ -1805,7 +1808,6 @@ en: label_start_to_start: "start to start" label_statistics: "Statistics" label_status: "Status" - label_status_updated: "Work package status updated" label_stay_logged_in: "Stay logged in" label_storage_free_space: "Remaining disk space" label_storage_used_space: "Used disk space" @@ -1889,21 +1891,17 @@ en: label_wiki_show_submenu_item: "Show as submenu item of " label_wiki_start: "Start page" label_work_package: "Work package" - label_work_package_added: "Work package added" label_work_package_attachments: "Work package attachments" label_work_package_category_new: "New category" label_work_package_category_plural: "Work package categories" label_work_package_hierarchy: "Work package hierarchy" label_work_package_new: "New work package" - label_work_package_note_added: "Work package note added" label_work_package_edit: "Edit work package %{name}" label_work_package_plural: "Work packages" - label_work_package_priority_updated: "Work package priority updated" label_work_package_status: "Work package status" label_work_package_status_new: "New status" label_work_package_status_plural: "Work package statuses" label_work_package_types: "Work package types" - label_work_package_updated: "Work package updated" label_work_package_tracking: "Work package tracking" label_work_package_view_all: "View all work packages" label_workflow: "Workflow" @@ -2510,6 +2508,7 @@ en: will be kept in the system. Any events older than this time will be deleted. delay_minutes_explanation: "Email sending can be delayed to allow users with configured in app notification to confirm the notification within the application before a mail is sent out. Users who read a notification within the application will not receive an email for the already read notification." email_digest_explanation: "Once a day, an email digest can be sent out containing a collection of all the notification users subscribed to. The setting is relative to each users configured time zone, so e.g. 8:00 will be executed at 7:00 UTC for users in UTC+1 and 9:00 UTC for those in UTC-1." + events_explanation: 'Governs for which event an email is sent out. Work packages are excluded from this list as the notifications for them can be configured specifically for every user.' display: first_date_of_week_and_year_set: > If either options "%{day_of_week_setting_name}" or "%{first_week_setting_name}" are set, @@ -2608,8 +2607,8 @@ en: text_work_packages_ref_in_commit_messages: "Referencing and fixing work packages in commit messages" text_journal_added: "%{label} %{value} added" text_journal_aggregation_time_explanation: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent." - text_journal_changed: "%{label} changed from %{old}
to %{new}" - text_journal_changed_plain: "%{label} changed from %{old} \nto %{new}" + text_journal_changed_html: "%{label} changed from %{old} %{linebreak}to %{new}" + text_journal_changed_plain: "%{label} changed from %{old} %{linebreak}to %{new}" text_journal_changed_no_detail: "%{label} updated" text_journal_changed_with_diff: "%{label} changed (%{link})" text_journal_deleted: "%{label} deleted (%{old})" diff --git a/config/locales/js-en.yml b/config/locales/js-en.yml index 20931fbcf2..14526b0ff1 100644 --- a/config/locales/js-en.yml +++ b/config/locales/js-en.yml @@ -541,7 +541,7 @@ en: wiki: 'Within the wiki you can document and share knowledge together with your team.' backlogs: overview: "Manage your work in the backlogs view." - sprints: "On the right you have the product backlog or a bug backlog, on the left you will have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag and drop and add them to a sprint." + sprints: "On the right you have the product backlog and the bug backlog, on the left you have the respective sprints. Here you can create epics, user stories, and bugs, prioritize via drag drop and add them to a sprint." task_board_arrow: 'To see your task board, open the sprint drop-down...' task_board_select: '...and select the task board entry.' task_board: "The task board visualizes the progress for this sprint. Click on the plus (+) icon next to a user story to add new tasks or impediments.
The status can be updated by drag and drop." @@ -582,6 +582,11 @@ en: involved: 'I am involved' mentioned: 'I was mentioned' watched: 'I am watching' + work_package_commented: 'Work package commented' + work_package_created: 'Work package created' + work_package_processed: 'Work package status changed' + work_package_prioritized: 'Work package priority changed' + work_package_scheduled: 'Work package scheduled' all: 'All events' add: 'Add setting for project' already_selected: 'This project is already selected' diff --git a/config/routes.rb b/config/routes.rb index a85a235c31..932b06c875 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -575,6 +575,10 @@ OpenProject::Application.routes.draw do root to: 'account#login' + scope :notifications do + get '(/*state)', to: 'angular#empty_layout', as: :notifications_center + end + # Development route for styleguide if Rails.env.development? get '/styleguide' => redirect('/assets/styleguide.html') diff --git a/config/settings.yml b/config/settings.yml index 81c72f01d8..647f98ea15 100644 --- a/config/settings.yml +++ b/config/settings.yml @@ -236,11 +236,6 @@ cross_project_work_package_relations: notified_events: serialized: true default: - - work_package_added - - work_package_updated - - work_package_note_added - - status_updated - - work_package_priority_updated - news_added - news_comment_added - file_added diff --git a/db/migrate/20210802114054_add_notification_setting_options.rb b/db/migrate/20210802114054_add_notification_setting_options.rb new file mode 100644 index 0000000000..128c8640d1 --- /dev/null +++ b/db/migrate/20210802114054_add_notification_setting_options.rb @@ -0,0 +1,38 @@ +class AddNotificationSettingOptions < ActiveRecord::Migration[6.1] + def change + add_notification_settings_options + update_notified_events + end + + def add_notification_settings_options + change_table :notification_settings, bulk: true do |t| + # Adding indices here is probably useful as most of those are expected to be false + # and we are searching for those that are true. + # The columns watched, involved and mentioned will probably be true most of the time + # so having an index there should not improve speed. + t.boolean :work_package_commented, default: false, index: true + t.boolean :work_package_created, default: false, index: true + t.boolean :work_package_processed, default: false, index: true + t.boolean :work_package_prioritized, default: false, index: true + t.boolean :work_package_scheduled, default: false, index: true + t.index :all + end + end + + def update_notified_events + event_types = %w(work_package_added work_package_updated work_package_note_added status_updated work_package_priority_updated) + + # rubocop:disable Rails/WhereExists + # The Setting.exists? method is overwritten + reversible do |dir| + dir.up do + Setting.notified_events = Setting.notified_events - event_types if Setting.where(name: 'notified_events').exists? + end + + dir.down do + Setting.notified_events = Setting.notified_events + event_types if Setting.where(name: 'notified_events').exists? + end + end + # rubocop:enable Rails/WhereExists + end +end diff --git a/docker-compose.yml b/docker-compose.yml index 983c6c83a9..030a771abb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -32,34 +32,44 @@ x-op-frontend-build: &frontend-build args: DEV_UID: $DEV_UID DEV_GID: $DEV_GID +x-op-backend: &backend + build: + <<: *build + target: develop + <<: *image + <<: *restart_policy + environment: + LOCAL_DEV_CHECK: "${LOCAL_DEV_CHECK:?The docker-compose file for OpenProject has moved to https://github.com/opf/openproject-deploy}" + RAILS_ENV: development + RAILS_CACHE_STORE: file_store + OPENPROJECT_CACHE__MEMCACHE__SERVER: cache:11211 + OPENPROJECT_RAILS__RELATIVE__URL__ROOT: "${OPENPROJECT_RAILS__RELATIVE__URL__ROOT:-}" + DATABASE_URL: postgresql://${DB_USERNAME:-postgres}:${DB_PASSWORD:-postgres}@${DB_HOST:-db}:${DB_PORT:-5432}/${DB_DATABASE:-openproject} + volumes: + - ".:/home/dev/openproject" + - "opdata:/var/openproject/assets" + - "bundle:/usr/local/bundle" + - "tmp:/home/dev/openproject/tmp" + networks: + - network services: backend: - build: - <<: *build - target: develop - <<: *image - <<: *restart_policy + <<: *backend command: run-app ports: - "3000:3000" - environment: - LOCAL_DEV_CHECK: "${LOCAL_DEV_CHECK:?The docker-compose file for OpenProject has moved to https://github.com/opf/openproject-deploy}" - RAILS_ENV: development - RAILS_CACHE_STORE: file_store - OPENPROJECT_CACHE__MEMCACHE__SERVER: cache:11211 - OPENPROJECT_RAILS__RELATIVE__URL__ROOT: "${OPENPROJECT_RAILS__RELATIVE__URL__ROOT:-}" - DATABASE_URL: postgresql://${DB_USERNAME:-postgres}:${DB_PASSWORD:-postgres}@${DB_HOST:-db}:${DB_PORT:-5432}/${DB_DATABASE:-openproject} - volumes: - - ".:/home/dev/openproject" - - "opdata:/var/openproject/assets" - - "bundle:/usr/local/bundle" - - "tmp:/home/dev/openproject/tmp" depends_on: - db - cache - networks: - - network + - worker + + worker: + <<: *backend + command: bundle exec rake jobs:work + depends_on: + - db + - cache frontend: build: diff --git a/docs/api/apiv3/components/schemas/user_preference_model.yml b/docs/api/apiv3/components/schemas/user_preference_model.yml index 6f56256396..babb938b2b 100644 --- a/docs/api/apiv3/components/schemas/user_preference_model.yml +++ b/docs/api/apiv3/components/schemas/user_preference_model.yml @@ -2,9 +2,18 @@ --- type: object properties: + autoHidePopups: + type: boolean + description: Whether to hide popups (e.g. success messages) after 5 seconds hideMail: type: boolean description: Hide mail address from other users + notifications: + type: NotificationSetting + description: The settings for the notifications to be received by the user + selfNotified: + type: boolean + description: Whether the user wants to be notfified of changes done by the user her/himself timeZone: type: string description: Current selected time zone @@ -14,9 +23,6 @@ properties: warnOnLeavingUnsaved: type: boolean description: Issue warning when leaving a page with unsaved text - accessibilityMode: - type: boolean - description: Enable accessibility mode _links: type: object required: diff --git a/docs/api/apiv3/components/schemas/user_preferences_model.yml b/docs/api/apiv3/components/schemas/user_preferences_model.yml index cfe00b76f9..5278143304 100644 --- a/docs/api/apiv3/components/schemas/user_preferences_model.yml +++ b/docs/api/apiv3/components/schemas/user_preferences_model.yml @@ -2,15 +2,45 @@ --- type: object example: - _type: UserPreferences _links: self: href: "/api/v3/my_preferences" user: href: "/api/v3/users/1" title: John Sheppard - hideMail: false - timeZone: Europe/Berlin + updateImmediately: + href: "/api/v3/users/3/preferences" + method: "patch" + _type: UserPreferences commentSortDescending: true + hideMail: false + timeZone: "Europe/Berlin" warnOnLeavingUnsaved: true - accessibilityMode: false + notifications: + - channel: "mail" + watched: false + involved: true + mentioned: false + all: false + workPackageCommented: false + _links: + project: + href: null + - channel: "in_app" + watched: true + involved: true + mentioned: true + all: false + workPackageCommented: false + _links: + project: + href: null + - channel: "mail_digest" + watched: true + involved: true + mentioned: true + all: true, + workPackageCommented: true + _links: + project: + href: null diff --git a/docs/api/apiv3/paths/my_preferences.yml b/docs/api/apiv3/paths/my_preferences.yml index 605ca35bcc..98ac0dccd7 100644 --- a/docs/api/apiv3/paths/my_preferences.yml +++ b/docs/api/apiv3/paths/my_preferences.yml @@ -13,13 +13,43 @@ get: href: "/api/v3/my_preferences" user: href: "/api/v3/users/1" - title: John Sheppard - _type: UserPreferences - accessibilityMode: false + title: "John Sheppard" + updateImmediately: + href: "/api/v3/users/3/preferences" + method: "patch" + _type: "UserPreferences" commentSortDescending: true hideMail: false - timeZone: Europe/Berlin + timeZone: "Europe/Berlin" warnOnLeavingUnsaved: true + notifications: + - channel: "mail" + watched: false + involved: true + mentioned: false + all: false + workPackageCommented: false + _links: + project: + href: null + - channel: "in_app" + watched: true + involved: true + mentioned: true + all: false + workPackageCommented: false + _links: + project: + href: null + - channel: "mail_digest" + watched: true + involved: true + mentioned: true + all: true, + workPackageCommented: true + _links: + project: + href: null schema: "$ref": "../components/schemas/user_preferences_model.yml" description: OK @@ -54,12 +84,42 @@ patch: user: href: "/api/v3/users/1" title: John Sheppard + updateImmediately: + href: "/api/v3/users/3/preferences" + method: "patch" _type: UserPreferences - accessibilityMode: false commentSortDescending: true hideMail: false timeZone: Europe/Berlin warnOnLeavingUnsaved: true + notifications: + - channel: "mail" + watched: false + involved: true + mentioned: false + all: false + workPackageCommented: false + _links: + project: + href: null + - channel: "in_app" + watched: true + involved: true + mentioned: true + all: false + workPackageCommented: false + _links: + project: + href: null + - channel: "mail_digest" + watched: true + involved: true + mentioned: true + all: true, + workPackageCommented: true + _links: + project: + href: null schema: "$ref": "../components/schemas/user_preferences_model.yml" description: OK @@ -114,12 +174,12 @@ patch: application/json: schema: example: - accessibilityMode: true + autoHidePopups: true timeZone: Europe/Paris properties: - accessibilityMode: + autoHidePopups: type: boolean timeZone: type: string type: object - summary: Update UserPreferences + summary: Update my preferences diff --git a/docs/api/apiv3/tags/userpreferences.yml b/docs/api/apiv3/tags/userpreferences.yml index 3a07d315f3..776217d5b8 100644 --- a/docs/api/apiv3/tags/userpreferences.yml +++ b/docs/api/apiv3/tags/userpreferences.yml @@ -9,11 +9,13 @@ description: |- ## Local Properties - | Property | Description | Type | Constraints | Supported operations | - |:----------------------:| -----------------------------------------------------------| ---------- | ----------- | -------------------- | - | hideMail | Hide mail address from other users | Boolean | | READ / WRITE | - | timeZone | Current selected time zone | String | | READ / WRITE | - | commentSortDescending | Sort comments in descending order | Boolean | | READ / WRITE | - | warnOnLeavingUnsaved | Issue warning when leaving a page with unsaved text | Boolean | | READ / WRITE | - | accessibilityMode | Enable accessibility mode | Boolean | | READ / WRITE | + | Property | Description | Type | Constraints | Supported operations | + |:----------------------:| ----------------------------------------------------------- | ---------- | ----------- | -------------------- | + | autoHidePopups | Whether to hide popups (e.g. success messages) after 5 seconds | Boolean | | READ / WRITE | + | hideMail | Hide mail address from other users | Boolean | | READ / WRITE | + | notifications | The settings for the notifications to be received by the user | NotificationSetting | | READ / WRITE | + | selfNotified | Whether the user wants to be notfified of changes done by the user her/himself | Boolean | | READ / WRITE | + | timeZone | Current selected time zone | String | | READ / WRITE | + | commentSortDescending | Sort comments in descending order | Boolean | | READ / WRITE | + | warnOnLeavingUnsaved | Issue warning when leaving a page with unsaved text | Boolean | | READ / WRITE | name: UserPreferences diff --git a/docs/development/contribution-documentation/README.md b/docs/development/contribution-documentation/README.md new file mode 100644 index 0000000000..1ce1902793 --- /dev/null +++ b/docs/development/contribution-documentation/README.md @@ -0,0 +1,66 @@ +--- +sidebar_navigation: + title: Contribute to documentation + priority: 999 +description: Overview of the OpenProject documentation +robots: index, follow +keywords: contribution, documentation, documentation process +--- + +# Contribute to the OpenProject documentation + + + +## What does the OpenProject documentation entail? + +The OpenProject documentation makes available user guides, system admin, installation and operation, API as well as development guides and release notes. + +Current and future users of the application find instructions for the set up and configuration of OpenProject in the documentation. Furthermore, it contains use cases and usage instructions for all OpenProject features and the use of OpenProject with other applications. + +This documentation evolves continuously with new features and improvements to achieve clarity, accuracy, and completeness. + + + +## Where to find the OpenProject documentation? + +The documentation for OpenProject is published on https://www.openproject.org/docs/. You can also access the documentation from your OpenProject application under user guides and API documentation below the question mark at the top right in the header menu. + + + +## Who can contribute to the documentation? + +Being proudly open source, we invite anyone in our community to contribute to our software as well as the documentation to improve it even further. + + + +## What can you contribute to the documentation? + +Documentation improvements and changes apply to the documentation described in the section above. Documentation changes are **not** changes or additions to the code of the OpenProject application. For contributions to the code, see our [product development guide](../product-development-handbook/#openproject-product-development-handbook). + +We are looking forward to receiving the following contributions from you: + +- Eliminating errors and working on other improvements in the existing documentation. This could be missing content, e.g. descriptions or step-by-step guides for features. + +- Adding use cases. + +- Adding visuals, e.g. screenshots, to complement descriptions. + +- Fixing of spelling, grammar, punctuation mistakes. + +- Fixing of internal and external links that are not working or are incorrect. + +- Translations into your mother tongue (coming soon). + + + +## Overview + +| Topic | Content | +| ------------------------------------------------------ | :----------------------------------------------------------- | +| [Documentation process](documentation-process) | A step-by-step guide on how to contribute to the documentation. | +| [Documentation style guide](documentation-style-guide) | What are the styles and other requirements to follow when contributing to the documentation? | +| [Contribution support](contribution-support) | What to do if you need help regarding your contribution to the documentation? | + + + +With this guide for contributing to the OpenProject documentation we followed and took inspiration from the [Contribute to GitLab guide](https://about.gitlab.com/community/contribute/). diff --git a/docs/development/contribution-documentation/contribution-support/README.md b/docs/development/contribution-documentation/contribution-support/README.md new file mode 100644 index 0000000000..2ae6cb08e8 --- /dev/null +++ b/docs/development/contribution-documentation/contribution-support/README.md @@ -0,0 +1,24 @@ +--- +sidebar_navigation: + title: Support for contribution + priority: 997 +description: What to do if you need help or support for your contribution +robots: index, follow +keywords: help, support, documentation process, documentation +--- + +# Get support for your contribution + +If you have any questions on the contribution process or encounter problems with your contribution to the OpenProject documentation, please open a ticket. We will then get in touch with you via the ticket. + +1. Login to or register at the [OpenProject community platform](https://community.openproject.org/login). It’s fast and free. + +2. Open a new [documentation work package]( https://community.openproject.org/projects/openproject/work_packages/new?type=69). + +3. Add a precise subject. + +4. Add a detailed description about your issue and how we could help. + +5. Attach a screen-shot or log-file (optional). + +6. Press **Save**. \ No newline at end of file diff --git a/docs/development/contribution-documentation/documentation-process/README.md b/docs/development/contribution-documentation/documentation-process/README.md new file mode 100644 index 0000000000..202fc0b7e1 --- /dev/null +++ b/docs/development/contribution-documentation/documentation-process/README.md @@ -0,0 +1,69 @@ +--- +sidebar_navigation: + title: Documentation process + priority: 999 +description: The process of how to contribute to the OpenProject documentation +robots: index, follow +keywords: contribution, documentation, documentation process +--- + +# Documentation process + +Proudly open source software, we created our processes in a way that invites anyone to contribute to the OpenProject documentation. + +## The documentation process step-by-step + +You will find the description for the basic development process in the [GitHub guideline](../../git-workflow/#development-at-github). In the following, you find the detailed information about the process for the documentation. + +Please note that you find the [OpenProject repository on GitHub](https://github.com/opf/openproject). + +If you would like to contribute changes to the OpenProject documentation, please follow these steps: + +1. [Fork the OpenProject repository](https://www.openproject.org/docs/development/git-workflow/#fork-openproject) and create a local development branch. Include documentation in your branch name. + +2. Create your changes in the documentation. It can be found in the folder [docs](https://github.com/opf/openproject/tree/dev/docs). You can work directly in the GitHub markdown files or use e.g. GitHub desktop and a markdown editor like Typora. + + If you are not only changing something in an existing documentation page but are adding a new page, please make sure to add metadata. To provide additional directives and useful information, we add metadata to the beginning of each documentation page. This will give you guidance on what information to provide in the metadata: + +- Sidebar navigation: You do not have to add anything here. Leave it blank. + +- Title: Site title that will appear in the menu. + +- Priority: You assign a number to your page to indicate in what order it will appear. The higher up you want the section to appear in the menu, the higher the number you assign (any number between 1 and 999). I.e. the section that is appearing first gets the highest number (e.g. 999). + +- Description: description of the content of the page that you are creating. Best is to also include the title name. + +- Robots: always add “index, follow” here. + +- Keywords: use key words to describe the content of the page, minimum 2. + + + +3. [Create a pull request](https://www.openproject.org/docs/development/git-workflow/#create-a-pull-request) on our repository. Make sure you name it accordingly and also include documentation in the name. + +4. We will evaluate your pull request and changes before we merge it. + +If the author or reviewer has any questions, they can use the comments in the pull request. + + + +## Move or rename a page + +Moving or renaming a document is the same as changing its location. We want to make sure after renaming or moving a page, the users will still find it. That is why we will need to redirect browsers to the new page. + +Redirects are managed in a repository that is not accessible by the OpenProject community. In case you would like to move or rename a document, please create a ticket so that we can take care of it. Follow these steps to create your ticket: + +1. Login to or register at the [OpenProject community platform](https://community.openproject.org/login). It’s fast and free. + +2. Check if there is already an existing ticket by using the search bar in the header navigation at the top. If there is one, please leave a comment or add additional information. Otherwise: + +3. Open a new [documentation work package]( https://community.openproject.org/projects/openproject/work_packages/new?type=69) + +4. Add a precise subject. + +5. Add a detailed description which page you want to rename to what or which page you want to move where. + +6. Attach a screen-shot (optional). + +7. Press **Save**. + diff --git a/docs/development/contribution-documentation/documentation-style-guide/OpenProject_documentation_menu.png b/docs/development/contribution-documentation/documentation-style-guide/OpenProject_documentation_menu.png new file mode 100644 index 0000000000..97611291c3 Binary files /dev/null and b/docs/development/contribution-documentation/documentation-style-guide/OpenProject_documentation_menu.png differ diff --git a/docs/development/contribution-documentation/documentation-style-guide/README.md b/docs/development/contribution-documentation/documentation-style-guide/README.md new file mode 100644 index 0000000000..92b1ef82cd --- /dev/null +++ b/docs/development/contribution-documentation/documentation-style-guide/README.md @@ -0,0 +1,429 @@ +--- +sidebar_navigation: + title: Documentation style guide + priority: 998 +description: What styles and formats to follow when contributing to the OpenProject documentation +robots: index, follow +keywords: documentation style guide, style guide, format, style +--- + +# Documentation style guide + +This document defines the standards for the OpenProject documentation, including grammar, formatting, wording and more. + + + +## Markup language + +All OpenProject documentation is written in Markdown. Feel free to either work directly in the Markdown files or to use [GitHub desktop](https://desktop.github.com) with a markdown editor like [Typora](https://typora.io) or others. + + + +## Documentation structure + +The OpenProject documentation is divided into the top level folders: + +- Guides: getting started guide, user guide, system admin guide, Enterprise edition guide, installation and operation guide. Thereby each guide is available at top level on its own. +- FAQs +- Release notes +- Development +- API + +Within each folder there is a sub-hierarchy of topics. E.g. in the Getting started guide you find amongst others the Introduction to OpenProject and Sign in and registration as sub-topics. Sub-topics are individual documentation pages in GitHub. You will notice the sub-topics in the documentation menu on the left when unfolding each folder's menu. + +![OpenProject_documentation_menu_left_side_unfolded_sub_topics](OpenProject_documentation_menu.png) + + + +### Folder content + +We aim to have a clear hierarchical structure with meaningful URLs like https://www.openproject.org/docs/getting-started/sign-in-registration/. With this structure you can identify straight away that this part of the documentation is about the sign in and registration process. At the same time, the website path matches our repository, making it easy to update the documentation. + +Find an overview of content per folder here: + +| **Directory** | **Contents** | +| ------------------------------------------------------------ | ------------------------------------------------------------ | +| [Getting started guide](https://www.openproject.org/docs/getting-started/) | Here you will learn about the first steps with OpenProject. It is a short introduction on registration, sign up, inviting members, starting to set up a project and the most important features work packages, Gantt charts and agile boards. | +| [User guide](https://www.openproject.org/docs/user-guide/) | This guide covers the details of all features and functionalities found in OpenProject. | +| [System admin guide](https://www.openproject.org/docs/system-admin-guide/) | Documentation on how to make changes to settings affecting your entire OpenProject environment. This is relevant for users with administrator rights for the configuration of all modules but also overall, e.g. regarding system settings, authentication or user permissions. | +| [Enterprise guide](https://www.openproject.org/docs/enterprise-guide/) | Here you will find all about the management and administration of your Enterprise cloud and Enterprise on-premises subscription. | +| [FAQs](https://www.openproject.org/docs/faq/) | This is the central overview of frequently asked questions for OpenProject. | +| [Installation and operations guide](https://www.openproject.org/docs/installation-and-operations/) | This guide summarizes the options for getting OpenProject, either hosted or on-premises and what to do if you want to include BIM features in your application. For the on-premises versions you will find all operation and installation instructions. | +| [Release notes](https://www.openproject.org/docs/release-notes/) | OpenProject is regularly upgraded with new features, security updates and more. The release notes inform you about the news in each release. | +| [Development](https://www.openproject.org/docs/development/) | This guide details how to contribute to the code of the OpenProject application. | +| [API](https://www.openproject.org/docs/api/) | This part of the documentation deals with the API specification, what endpoints and functionality are available. | + + + +## Directory and file names + +Please respect the following when working with directories and files: + +1. When you create a new topic, i.e. a new documentation page, always create a new folder and a new README.md file in that folder. +2. Do not use special characters and spaces, or capital letters in file names, directory names, branch names and anything that generates a path. + +3. When creating a file or directory and it has more than one word in its name, use underscores (`_`) instead of spaces or dashes. For example use open_details-view_work_packages.png. This applies to both image files and Markdown files. + +4. For image files, do not exceed 200KB. + +If you are unsure where to place a document or a content addition, this should not stop you from authoring and contributing. Use your best judgment, and then add a comment to your pull request. + + + +## No duplication of information + +Do not include the same information in multiple places. Instead, link through to the information in the documentation where it is already mentioned so that there is only a single source of truth that needs to be maintained. + + + +## References across the documentation + +- When mentioning other OpenProject modules or features, link to their respective documentation, at least on first mention. +- Please see in [links](../#links) how to use links within the documentation. + +- When making reference to third-party products or technologies, link out to their external sites, documentation and resources. + + + +## Structure in documents + +- Structure content in tables or lists etc. in alphabetical order unless there is a reason to use any other order of importance. + + + +## Documentation language + +The OpenProject documentation should be as clear and easy to understand as possible. Avoid unnecessary words. + +- Be clear and concise with as little words as possible. + +- Write in US English with US grammar. + + + +## Capitalization + +### Headings + +Use sentences that describe the content and capitalize the first letter in the sentence. For example: + +`# Create an OpenProject trial installation` + +`## Start a new trial installation` + + + +### UI text + +When referring to specific user interface text, like a button label or menu item, use the name as in the application and start the word with a capital letter. Moreover, please make it bold. Example: **Start free trial** button. + + + +### Feature names + +Feature names are typically capitalized (the first word) and in bold. For example: + +- **Gantt chart** +- **Roadmap** +- **Project overview** +- **News** +- **Wiki** + + + + +#### Other terms + +Capitalize names of: + +- OpenProject products: OpenProject Community edition, OpenProject Enterprise on-premises edition, OpenProject Enterprise cloud edition +- Third-party organizations, software, and products. For example Nextcloud, The Linux Foundation etc. + +Follow the capitalization style by the third party which may use non-standard case styles. For example: OpenProject, GitHub. + + + +## Placeholders + +### User information + +You may need to include user information in entries. Do not use real user information or email addresses in the OpenProject documentation. For email addresses and names, do use: + +- Email address: Use an email address ending in @example.com. + +- Names: Use strings like example_username. Alternatively, use diverse or non-gendered names with common surnames, such as Avery Smith. + +- Screenshots: When inserting screenshots in the documentation, make sure you are not giving away your identity by using your actual avatar. Rather create a fake user name and avatar. + + + +### URLs + +When including sample URLs in the documentation, use example.com when the domain name is generic. + + + +### Tokens + +There may be times where a token is needed to demonstrate an API call. It is strongly advised not to use real tokens in documentation even if the probability of a token being exploited is low. + +You can use this fake token as example: 12345678910ABCDE + + + +### Commands + +You might want to provide a command or configuration that uses specific values. + +In these cases, use `<` customize `>` to call out where a reader must replace text with their own value. + +For example: + +``` +cp +``` + + + +## Contractions + +Please do not use any contractions like don’t or isn’t. + + + +## Copy + +### Punctuation + +Follow these guidelines for punctuation: + +- Avoid semicolons. Use two sentences instead. + +- Always add a space before and after dashes when using it in a sentence (for replacing a comma, for example). + +- Do not use double spaces. + +- When a colon is part of a sentence, always use lowercase after the colon. + + + +### Spaces between words + +Use only standard spaces between words so that the search engine can find individual search terms. + + + +## Lists + +Always start list items with a capital letter. + + + +### Ordered and unordered lists + +Only use ordered lists when their items describe a sequence of steps to follow. + +Example for an ordered list: + +Follow these steps: + +1. Do this + +2. Then do that + +3. And then finish off with something else. + + + +Example for an unordered list: + +- Feature 1 + +- Feature 2 + +- Feature 3 + + + +### Markup + +- Use dashes (`-`) for unordered lists. + + + +### Punctuation + +- Do not add commas (`,`) or semicolons (`;`) to the ends of list items. +- Separate list items from explanatory text with a colon (`:`). For example: + - Feature 1: very attractive new feature + - Feature 2: description of an additional feature + + + +## Tables + +Tables should be used to describe complex information. Note that in many cases, an unordered list is sufficient to describe a list of items with a single, simple description per item. But, if you have data that is best described by a matrix, tables are the best choice. + + + +### Creation guidelines + +To keep tables accessible and scannable, tables should not have any empty cells. If you still remain with a cell without content, please enter N/A (for ‘not applicable’) or none. + +To help tables be easier to maintain, consider adding additional spaces to the column widths to make them consistent. For example: + +| Feature | Description | + +| --------------------- | :----------------------------------------------------------------------------------- | + +| Great feature | Enhances collaboration between marketing and sales | + +| Best feature | Use it to synchronize your example table with OpenProject | + + + +## Headings + +- Add only one H1 in each documentation page, by adding # at the beginning of ithe headline (when using Markdown). + +- Start with an H2 (##) and respect the order H2 > H3. Never skip the hierarchy level, such as H3 > H2. Do not go lower in the hierarchy than H3 (###). + +- Do not use symbols and special characters in headings. + +- When possible, avoid including words that might change in the future. Changing a heading changes its anchor URL, which affects other pages that link to this headline. + +- Leave exactly one blank line before and after a heading. + +- Do not use links in headings. + +- Make your subheading titles clear, descriptive, and complete to help users find the right example. + +- See [Capitalization](../#capitalization) for guidelines on capitalizing headings. + + + +### Heading titles + +Keep heading titles clear and direct. Make every word count. Where possible, use the imperative. Example: Sign in with an existing account (**not** Signing in with an existing account). + + + +### Anchor links + +Headings generate anchor links when rendered. ##This is an example generates the anchor #this-is-an-example. + +Keep in mind that there are various links to OpenProject documentation pages and anchor links on the internet to take the users to the right spot. Thus, please avoid changing headings. + + + +## Links + +Links are important in the documentation. Use links instead of duplicating content to help preserve a single source of truth in the OpenProject documentation. + + + +### Basic link criteria + +- Use inline link Markdown markup `[Description](https://example.com)`. It is easier to read, review, and maintain. + +- Use meaningful anchor text descriptions. For example, instead of writing something like `Read more about Gantt charts [here](LINK)`, write `Read more about [Gantt charts](LINK)`. + + + +### Links to internal documentation + +Internal links are links within the OpenProject website which includes the OpenProject documentation. In these cases, use relative links. I.e. do not use the full URL of the linked page but instead show the current URL's relation to the linked page's URL. + +To link to internal documentation: + +- Use relative links to Markdown files in the same repository. +- Use ../ to navigate to higher-level directories. + + + +### Links to external documentation + +When linking to external information, you have to use absolute URLs. Make sure that you are only linking to an authoritative source, i.e. official and credible sources written by the people who created the item or product. These sources are the most likely to be accurate and remain up to date. + + + +## Navigation + +When documenting navigation through the OpenProject application, use these terms. + + + +### Menus + +Use these terms when referring to OpenProject’s main application elements: + +- **Header menu**: This is the blue bar at the top that spans the width of the application. It includes the OpenProject logo, the search field, the link to all projects, the global modules, the help icon and the user’s avatar. + +- **Project menu**: This is the menu on the left in the OpenProject application that displays the modules after the selection of a project. + + + +### How to document the menus + +To be consistent, use this format when you write about UI navigation. + +1. In the header menu, click on your **Avatar > Administration** to find system settings. + +2. In the project menu, select **Work packages** to open your work package list. + + + +## Images + +Images, including screenshots, can help a reader better understand a guide. However, they can be hard to maintain with software updates being released, and should be used sparingly. + +Before including an image in the documentation, ensure it provides value to the reader. + + + +### Capture images + +Use images to help the reader understand where they are in a process, or how they need to interact with the application. + +When you take screenshots: + +- Capture the most relevant area: Do not include unnecessary blank space or areas of the page that do not help illustrate the point. The project menu on the left of the OpenProject application can change, so don’t include it unless it is necessary. + +- Be consistent: Coordinate screenshots with the other screenshots already on a documentation page. For example, if other screenshots include the left sidebar, include the sidebar in all screenshots. + + + +### Save images + +- Save the image with a file name that describes the image. Use lower cases. + +- Make sure to not exceed the maximum image size of 200KB. + +- Place your images in the same directory where the README.md document that you are working on is located. + +- Compress GIFs, maximum size 250KB. + + + +### Add the image link to content + +The Markdown code for including an image in a document is: `![Image description which will be the alt tag](img/document_image_title_vX_Y.png)` + +The image description is the alt text for the rendered image on the documentation page. For accessibility and SEO, use descriptions that are short and precise. + + + +## Videos + +At the moment it is not possible for external contributors to upload videos to the documentation. Please open a ticket in case you want to add a video. + + + +## Alert boxes + +Use alert boxes to call attention to information. The alert boxes in the OpenProject documentation have a specific format. Please use the following to be consistent: + +`` + diff --git a/docs/development/first-look/README.md b/docs/development/first-look/README.md new file mode 100644 index 0000000000..8afb3e3220 --- /dev/null +++ b/docs/development/first-look/README.md @@ -0,0 +1,30 @@ +--- +sidebar_navigation: + title: OpenProject First Look + priority: 1 +description: Beta testing OpenProject +robots: index, follow +keywords: first look, beta testing +--- +# OpenProject First Look + +## Join OpenProject beta testing + +Your feedback is what makes our product stand out. We are happy if you feel like helping to optimize OpenProject. + +![OpenProject first look beta testing](openproject-first-look-beta-testing.jpg) + +We invite you to give product feedback, join usability tests, user interviews, surveys, access to and more. + +We always appreciate early feedback from the Community: + +* Invitations to research studies or surveys. +* Early access to new features. +* Help us to improve the user experience. +* Influence which features OpenProject builds next. + +No matter if you have been using OpenProject for years or just logged in this week, we want to hear from you. Everyone can contribute. + +Please get in touch via: community@openproject.org and let us know how you would like to contribute. + +Thank you. diff --git a/docs/development/first-look/openproject-first-look-beta-testing.jpg b/docs/development/first-look/openproject-first-look-beta-testing.jpg new file mode 100644 index 0000000000..92ad8309c8 Binary files /dev/null and b/docs/development/first-look/openproject-first-look-beta-testing.jpg differ diff --git a/docs/development/submit-feature-idea/README.md b/docs/development/submit-feature-idea/README.md index 1ad033aa27..f5632c2f9b 100644 --- a/docs/development/submit-feature-idea/README.md +++ b/docs/development/submit-feature-idea/README.md @@ -8,7 +8,7 @@ keywords: feature requests, ideas, open feature request --- # Submit a feature idea -## How to submit a feature idea? +## How to submit a feature idea or request? 1. Login to or register at the [OpenProject community platform](https://community.openproject.org/login). It's fast and free. 2. Use the search bar in the header navigation on top to look for similar feature requests. If there's one, please leave a comment or add additional information. Otherwise: diff --git a/docs/getting-started/my-page/README.md b/docs/getting-started/my-page/README.md index 9335f0cbe9..7f23accf78 100644 --- a/docs/getting-started/my-page/README.md +++ b/docs/getting-started/my-page/README.md @@ -93,4 +93,4 @@ You can directly create new time entries by clicking on the day, change the date Watch the short video to see how to activate the spent time widget, add spent time, edit spent time (e.g. change the date or work packages or change the time booked) and delete spent time. -![my-spent-time-widget](my-spent-time-widget.gif) +![my-page-time-log](my-page-time-log.gif) diff --git a/docs/getting-started/my-page/my-page-time-log.gif b/docs/getting-started/my-page/my-page-time-log.gif new file mode 100644 index 0000000000..671befe53b Binary files /dev/null and b/docs/getting-started/my-page/my-page-time-log.gif differ diff --git a/docs/getting-started/my-page/time-log-my-page.gif b/docs/getting-started/my-page/time-log-my-page.gif new file mode 100644 index 0000000000..fa02256f15 Binary files /dev/null and b/docs/getting-started/my-page/time-log-my-page.gif differ diff --git a/docs/getting-started/projects/README.md b/docs/getting-started/projects/README.md index 146af94b79..f4c45dba77 100644 --- a/docs/getting-started/projects/README.md +++ b/docs/getting-started/projects/README.md @@ -33,7 +33,7 @@ In order to open an existing project, click the **Select a project** button in t You can also start typing in a project name to filter by the project's title. -![open project](1572877683380.png) +![filter_for_project_in_header_menu](filter_project_header_menu.png) @@ -42,8 +42,7 @@ Projects and subprojects are displayed according to their hierarchy in the drop-
**Subproject** is defined as a child project of another project. Subprojects can be used to display a hierarchy of projects. Several filter options (e.g. in work package list and timeline) can be applied only to the current project and its subprojects.
- -![project hierarchy](1572877762016.png) +![project_hierarchy](project_hierarchy-8178054.png) Also, you will see your newest projects on the application landing page in the **Projects** section. Here you can simply click on one of the newest visible projects to open it. @@ -53,11 +52,7 @@ Also, you will see your newest projects on the application landing page in the * ## Create a new project -To create a new project, click the **Select a project** button in the top left corner of the header and select **+ Project**. - -![Getting-started-create-project](Getting-started-create-project.png) - -Also, you can click the green button **+ Project** directly on the system's home screen in the **Project** section. +To create a new project, click the green button **+ Project** directly on the system's home screen in the **Project** section. ![Create-project-home-screen](Create-project-home-screen.png) @@ -79,7 +74,7 @@ To configure further project information, see the documentation for [project set To view all your projects in which you are a member, click on the **View all projects** link in the **Select a project** drop-down menu. -![view all projects](1569490429831.png) +![view_all_projects](view_all_projects.png) You will see a list with all your projects and their details. diff --git a/docs/getting-started/projects/filter_project_header_menu.png b/docs/getting-started/projects/filter_project_header_menu.png new file mode 100644 index 0000000000..916d0eedea Binary files /dev/null and b/docs/getting-started/projects/filter_project_header_menu.png differ diff --git a/docs/getting-started/projects/filter_project_project_menu.png b/docs/getting-started/projects/filter_project_project_menu.png new file mode 100644 index 0000000000..8dbc65dab8 Binary files /dev/null and b/docs/getting-started/projects/filter_project_project_menu.png differ diff --git a/docs/getting-started/projects/project_hierarchy-8178054.png b/docs/getting-started/projects/project_hierarchy-8178054.png new file mode 100644 index 0000000000..6f43786dad Binary files /dev/null and b/docs/getting-started/projects/project_hierarchy-8178054.png differ diff --git a/docs/getting-started/projects/project_hierarchy.png b/docs/getting-started/projects/project_hierarchy.png new file mode 100644 index 0000000000..6f43786dad Binary files /dev/null and b/docs/getting-started/projects/project_hierarchy.png differ diff --git a/docs/getting-started/projects/view_all_projects.png b/docs/getting-started/projects/view_all_projects.png new file mode 100644 index 0000000000..128286a0be Binary files /dev/null and b/docs/getting-started/projects/view_all_projects.png differ diff --git a/docs/release-notes/11-3-4/README.md b/docs/release-notes/11-3-4/README.md new file mode 100644 index 0000000000..8b304c404c --- /dev/null +++ b/docs/release-notes/11-3-4/README.md @@ -0,0 +1,18 @@ +--- +title: OpenProject 11.3.4 +sidebar_navigation: + title: 11.3.4 +release_version: 11.3.4 +release_date: 2021-07-29 +--- + +# OpenProject 11.3.4 + +Release date: 2021-07-29 + +We released [OpenProject 11.3.4](https://community.openproject.com/versions/1488). +The release contains several bug fixes and we recommend updating to the newest version. + + +#### Bug fixes and changes + diff --git a/docs/release-notes/README.md b/docs/release-notes/README.md index eb5fb2573e..9f7c7427ee 100644 --- a/docs/release-notes/README.md +++ b/docs/release-notes/README.md @@ -16,6 +16,13 @@ Stay up to date and get an overview of the new features included in the releases +## 11.3.4 + +Release date: 2021-07-29 + +[Release Notes](11-3-4/) + + ## 11.3.3 Release date: 2021-07-20 diff --git a/docs/user-guide/gantt-chart/OpenProject-overarching-project-planning.PNG b/docs/user-guide/gantt-chart/OpenProject-overarching-project-planning.PNG new file mode 100644 index 0000000000..c5a7b961c3 Binary files /dev/null and b/docs/user-guide/gantt-chart/OpenProject-overarching-project-planning.PNG differ diff --git a/docs/user-guide/gantt-chart/README.md b/docs/user-guide/gantt-chart/README.md index 5b0605add4..b346109ae0 100644 --- a/docs/user-guide/gantt-chart/README.md +++ b/docs/user-guide/gantt-chart/README.md @@ -21,6 +21,7 @@ The **Gantt chart** in OpenProject displays the work packages in a timeline. You | [Understanding the colors and lines in the Gantt chart](#understanding-the-colors-and-lines-in-the-gantt-chart) | What do the clamps, lines and symbols in the Gantt chart mean? | | [Gantt chart configuration](#gantt-chart-configuration) | How to configure the view of your Gantt chart, e.g. add labels? | | [Gantt chart views](#gantt-chart-views) | How to zoom in and out and activate the Zen mode? | +| [Multi project views](#multi-project-views) | Create project overarching timelines. | | [Aggregation by project](#aggregation-by-project) | How to display an aggregated view of all milestones of multiple projects? | @@ -153,6 +154,21 @@ The zen mode gives you more space to focus on the tasks at hand. It's almost lik +<<<<<<< HEAD +## Multi project views + +With the Gantt charts in OpenProject you can create project overarching timelines. + +Create multi project timelines and display all activities, phases and milestones within your project and sub-projects. Also, you can create project overarching timelines by filtering and including respective projects in one joint plan. + +To include sub-projects: within the parent project, click on the Filter button and select the subproject(s) you want to have included in your project plan. You can also choose an [aggregation by project](aggregation-by-project). + +Use the filter and grouping options as for the [work packages table configuration](../work-packages/work-package-table-configuration/) to customize your timeline. Do not forget to [save your timeline](../work-packages/work-package-table-configuration/#save-work-package-views). + +![OpenProject-overarching-project-planning](OpenProject-overarching-project-planning.PNG) + +If you want to adjust your work package table and filter, sort or order your work packages to have a better overview in your Gantt chart, please refer to the section [work package table configuration](/../work-packages/work-package-table-configuration/). + ## Aggregation by project You can get a **quick overview of multiple projects** in the Gantt chart. To accomplish this navigate to the Work packages module of a project or the [project overarching work packages list](../projects/#project-overarching-reports). diff --git a/docs/user-guide/projects/README.md b/docs/user-guide/projects/README.md index a4b7e348b8..431c6cbe8e 100644 --- a/docs/user-guide/projects/README.md +++ b/docs/user-guide/projects/README.md @@ -26,7 +26,7 @@ Your projects can be available publicly or internally. OpenProject does not limi | [Copy a project](#copy-a-project) | Copy an existing project. | | [Archive a project](#archive-a-project) | Find out how to archive completed projects. | | [Delete a project](#delete-a-project) | How to delete a project? | -| [Global projects overview](#Global-projects-overview---view-all-projects) | Get an overview of all your projects in the projects overview list ("View all projects"). | +| [Global projects overview](#global-projects-overview---view-all-projects) | Get an overview of all your projects in the projects overview list ("View all projects"). | | [Project overarching reports](#project-overarching-reports) | How to create project overarching reports across multiple projects? | 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 7053c7df09..2194c2b9c5 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 @@ -84,6 +84,24 @@ If you only selected work packages without children, no work packages will be sh ![filter-for-parent-work-package](image-20210301182354564.png) +### Filter for work packages of a subproject + +When you are in a parent project and would like to view the work packages of its subprojects, you can use a filter in the work package list. + +The filter **Only subproject** will display all work packages of the subprojects you select. Thereby, the work packages of the parent project will not be displayed. + +![work_package_filter_only_subprojects](work_package_filter_only_subprojects.png) + + + +In order to view the work packages of the parent project as well as the subprojects that you select, you need to use the filter **Including subproject**. + +![work_package_filter_incl_subprojects](work_package_filter_incl_subprojects.png) + + + +To view all work packages across all projects, please refer to the [global work package list](../projects/#global-work-packages-list). + ### Filtering by ID or work package name If you want to [create a work package view](#save-work-package-views) with only specific work packages you can use the filter "ID". By entering the ID or subject of work packages you can select them. diff --git a/docs/user-guide/work-packages/work-package-table-configuration/work-package-filter-incl-subprojects.png b/docs/user-guide/work-packages/work-package-table-configuration/work-package-filter-incl-subprojects.png new file mode 100644 index 0000000000..b52a2c4daf Binary files /dev/null and b/docs/user-guide/work-packages/work-package-table-configuration/work-package-filter-incl-subprojects.png differ diff --git a/docs/user-guide/work-packages/work-package-table-configuration/work-package-filter-only-subprojects.png b/docs/user-guide/work-packages/work-package-table-configuration/work-package-filter-only-subprojects.png new file mode 100644 index 0000000000..a91fb8c929 Binary files /dev/null and b/docs/user-guide/work-packages/work-package-table-configuration/work-package-filter-only-subprojects.png differ diff --git a/docs/user-guide/work-packages/work-package-table-configuration/work_package_filter_incl_subprojects.png b/docs/user-guide/work-packages/work-package-table-configuration/work_package_filter_incl_subprojects.png new file mode 100644 index 0000000000..b52a2c4daf Binary files /dev/null and b/docs/user-guide/work-packages/work-package-table-configuration/work_package_filter_incl_subprojects.png differ diff --git a/docs/user-guide/work-packages/work-package-table-configuration/work_package_filter_only_subprojects.png b/docs/user-guide/work-packages/work-package-table-configuration/work_package_filter_only_subprojects.png new file mode 100644 index 0000000000..a91fb8c929 Binary files /dev/null and b/docs/user-guide/work-packages/work-package-table-configuration/work_package_filter_only_subprojects.png differ diff --git a/frontend/.eslintrc.js b/frontend/.eslintrc.js index 6ba4e683b6..5da06d9f04 100644 --- a/frontend/.eslintrc.js +++ b/frontend/.eslintrc.js @@ -71,6 +71,8 @@ module.exports = { // Disable webpack loader definitions "import/no-webpack-loader-syntax": "off", + // Disable order style as it's not compatible with intellij import organization + "import/order": "off", // It'd be good if we could error this for switch cases but allow it for for loops "no-continue": "off", diff --git a/frontend/src/app/core/errors/sentry/sentry-reporter.ts b/frontend/src/app/core/errors/sentry/sentry-reporter.ts index 67be8989c5..cd84b84714 100644 --- a/frontend/src/app/core/errors/sentry/sentry-reporter.ts +++ b/frontend/src/app/core/errors/sentry/sentry-reporter.ts @@ -110,6 +110,9 @@ export class SentryReporter implements ErrorReporter { 'The transition has been superseded by a different transition', // Uncaught promise rejections 'Uncaught (in promise)', + // Non-errors caught for hal resources + 'Non-Error exception captured with keys: $embedded, $halType, $links, $loaded', + ], beforeSend: (event) => this.filterEvent(event), }); diff --git a/frontend/src/app/core/global_search/input/global-search.component.sass b/frontend/src/app/core/global_search/input/global-search.component.sass index 9adcfe43f7..d6a3abd79c 100644 --- a/frontend/src/app/core/global_search/input/global-search.component.sass +++ b/frontend/src/app/core/global_search/input/global-search.component.sass @@ -1,3 +1,5 @@ +@import "src/assets/sass/helpers" + .global-search flex-grow: 1 @@ -18,6 +20,7 @@ display: flex flex-direction: column flex-grow: 1 + overflow: hidden &--search-term flex-grow: 1 @@ -46,6 +49,7 @@ &--wp-project grid-area: project + @include text-shortener &--wp-id grid-area: idlink @@ -63,7 +67,6 @@ &--wp-subject font-weight: bold display: inline-block - width: 85% overflow: hidden white-space: nowrap text-overflow: ellipsis diff --git a/frontend/src/app/core/path-helper/apiv3-paths.ts b/frontend/src/app/core/path-helper/apiv3-paths.ts new file mode 100644 index 0000000000..24eda1a02c --- /dev/null +++ b/frontend/src/app/core/path-helper/apiv3-paths.ts @@ -0,0 +1,58 @@ +import { ApiV3FilterBuilder } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder'; + +export class Apiv3Paths { + readonly apiV3Base:string; + + constructor(basePath:string) { + this.apiV3Base = `${basePath}/api/v3`; + } + + public get openApiSpecPath():string { + return `${this.apiV3Base}/spec.json`; + } + + /** + * Preview markup path + * + * Primarily used from ckeditor-augmented-textarea + * https://github.com/opf/commonmark-ckeditor-build/ + * + * @param context + */ + public previewMarkup(context:string) { + const base = `${this.apiV3Base}/render/markdown`; + + if (context) { + return `${base}?context=${context}`; + } + return base; + } + + /** + * Principals autocompleter path + * + * Primarily used from ckeditor-augmented-textarea + * https://github.com/opf/commonmark-ckeditor-build/ + * + */ + public principals(projectId:string|number, term:string|null) { + const filters:ApiV3FilterBuilder = new ApiV3FilterBuilder(); + // Only real and activated users: + filters.add('status', '!', ['3']); + // that are members of that project: + filters.add('member', '=', [projectId.toString()]); + // That are users: + filters.add('type', '=', ['User', 'Group']); + // That are not the current user: + filters.add('id', '!', ['me']); + + if (term && term.length > 0) { + // Containing the that substring: + filters.add('name', '~', [term]); + } + + return `${this.apiV3Base + }/principals?${ + filters.toParams({ sortBy: '[["name","asc"]]', offset: '1', pageSize: '10' })}`; + } +} diff --git a/frontend/src/app/core/path-helper/path-helper.service.ts b/frontend/src/app/core/path-helper/path-helper.service.ts index 4cae55e4ec..6fd992e0db 100644 --- a/frontend/src/app/core/path-helper/path-helper.service.ts +++ b/frontend/src/app/core/path-helper/path-helper.service.ts @@ -27,64 +27,7 @@ //++ import { Injectable } from '@angular/core'; -import { ApiV3FilterBuilder } from 'core-app/shared/helpers/api-v3/api-v3-filter-builder'; - -class Apiv3Paths { - readonly apiV3Base:string; - - constructor(basePath:string) { - this.apiV3Base = `${basePath}/api/v3`; - } - - public get openApiSpecPath():string { - return `${this.apiV3Base}/spec.json`; - } - - /** - * Preview markup path - * - * Primarily used from ckeditor-augmented-textarea - * https://github.com/opf/commonmark-ckeditor-build/ - * - * @param context - */ - public previewMarkup(context:string) { - const base = `${this.apiV3Base}/render/markdown`; - - if (context) { - return `${base}?context=${context}`; - } - return base; - } - - /** - * Principals autocompleter path - * - * Primarily used from ckeditor-augmented-textarea - * https://github.com/opf/commonmark-ckeditor-build/ - * - */ - public principals(projectId:string|number, term:string|null) { - const filters:ApiV3FilterBuilder = new ApiV3FilterBuilder(); - // Only real and activated users: - filters.add('status', '!', ['3']); - // that are members of that project: - filters.add('member', '=', [projectId.toString()]); - // That are users: - filters.add('type', '=', ['User', 'Group']); - // That are not the current user: - filters.add('id', '!', ['me']); - - if (term && term.length > 0) { - // Containing the that substring: - filters.add('name', '~', [term]); - } - - return `${this.apiV3Base - }/principals?${ - filters.toParams({ sortBy: '[["name","asc"]]', offset: '1', pageSize: '10' })}`; - } -} +import { Apiv3Paths } from './apiv3-paths'; @Injectable({ providedIn: 'root' }) export class PathHelperService { @@ -157,6 +100,10 @@ export class PathHelperService { return `${this.staticBase}/my/page`; } + public myNotificationsSettingsPath() { + return `${this.staticBase}/my/notifications`; + } + public newsPath(newsId:string) { return `${this.staticBase}/news/${newsId}`; } diff --git a/frontend/src/app/core/routing/openproject.routes.ts b/frontend/src/app/core/routing/openproject.routes.ts index d94d3b88a7..685197f7a9 100644 --- a/frontend/src/app/core/routing/openproject.routes.ts +++ b/frontend/src/app/core/routing/openproject.routes.ts @@ -37,6 +37,8 @@ import { Ng2StateDeclaration, StatesModule } from '@uirouter/angular'; import { appBaseSelector, ApplicationBaseComponent } from 'core-app/core/routing/base/application-base.component'; import { BackRoutingService } from 'core-app/features/work-packages/components/back-routing/back-routing.service'; import { MY_ACCOUNT_LAZY_ROUTES } from 'core-app/features/user-preferences/user-preferences.lazy-routes'; +import { IAN_LAZY_ROUTES } from 'core-app/features/in-app-notifications/in-app-notifications.lazy-routes'; +import { StateObject } from '@uirouter/core/lib/state/stateObject'; export const OPENPROJECT_ROUTES:Ng2StateDeclaration[] = [ { @@ -114,6 +116,7 @@ export const OPENPROJECT_ROUTES:Ng2StateDeclaration[] = [ loadChildren: () => import('../../features/projects/openproject-projects.module').then((m) => m.OpenprojectProjectsModule), }, ...MY_ACCOUNT_LAZY_ROUTES, + ...IAN_LAZY_ROUTES, ]; /** @@ -219,7 +222,6 @@ export function initializeUiRouterListeners(injector:Injector) { $transitions.onStart({}, (transition:Transition) => { const $state = transition.router.stateService; const toParams = transition.params('to'); - const fromState = transition.from(); const toState = transition.to(); // Remove start_onboarding_tour param if set @@ -233,11 +235,13 @@ export function initializeUiRouterListeners(injector:Injector) { backRoutingService.sync(transition); // Reset profiler, if we're actually profiling - const profiler:any = (window as any).MiniProfiler; - profiler && profiler.pageTransition(); + const profiler:{ pageTransition:() => void }|undefined = window.MiniProfiler; + profiler?.pageTransition(); - const projectIdentifier = toParams.projectPath || currentProject.identifier; - if (!toParams.projects && projectIdentifier) { + const toStateObject:StateObject|undefined = toState.$$state && toState.$$state(); + const hasProjectRoutes = toStateObject?.includes?.root; + const projectIdentifier = toParams.projectPath as string || currentProject.identifier; + if (hasProjectRoutes && !toParams.projects && projectIdentifier) { const newParams = _.clone(toParams); _.assign(newParams, { projectPath: projectIdentifier, projects: 'projects' }); return $state.target(toState, newParams, { location: 'replace' }); diff --git a/frontend/src/app/core/setup/globals/global-listeners/top-menu-scroll.ts b/frontend/src/app/core/setup/globals/global-listeners/top-menu-scroll.ts index 9934b3d01b..d29204d9be 100644 --- a/frontend/src/app/core/setup/globals/global-listeners/top-menu-scroll.ts +++ b/frontend/src/app/core/setup/globals/global-listeners/top-menu-scroll.ts @@ -36,16 +36,16 @@ export function scrollHeaderOnMobile() { const currentScrollPos = window.scrollY < 0 ? 0 : window.scrollY; // Only if sidebar is not opened or search bar is opened if (!(jQuery('#main').hasClass('hidden-navigation')) - || jQuery('#top-menu').hasClass('-global-search-expanded') + || jQuery('.op-app-header').hasClass('op-app-header_search-open') || Math.abs(currentScrollPos - prevScrollPos) <= headerHeight) { // to avoid flickering at the end of the page return; } if (prevScrollPos !== undefined && currentScrollPos !== undefined && (prevScrollPos > currentScrollPos)) { // Slide top menu in or out of viewport and change viewport height - jQuery('#wrapper').removeClass('-header-scrolled'); + jQuery('#wrapper').removeClass('_header-scrolled'); } else { - jQuery('#wrapper').addClass('-header-scrolled'); + jQuery('#wrapper').addClass('_header-scrolled'); } prevScrollPos = currentScrollPos; }); diff --git a/frontend/src/app/core/setup/globals/onboarding/onboarding_tour_trigger.ts b/frontend/src/app/core/setup/globals/onboarding/onboarding_tour_trigger.ts index 9c8bbb89e5..f9f8fd33a4 100644 --- a/frontend/src/app/core/setup/globals/onboarding/onboarding_tour_trigger.ts +++ b/frontend/src/app/core/setup/globals/onboarding/onboarding_tour_trigger.ts @@ -4,6 +4,7 @@ import { demoProjectsLinks, OnboardingTourNames, onboardingTourStorageKey, + waitForElement, } from 'core-app/core/setup/globals/onboarding/helpers'; import { debugLog } from 'core-app/shared/helpers/debug_output'; @@ -31,10 +32,12 @@ export function detectOnboardingTour():void { currentTourPart = ''; sessionStorage.setItem(onboardingTourStorageKey, 'readyToStart'); - // Start automatically when the language selection is closed - jQuery('.op-modal--close-button').click(() => { - tourCancelled = true; - void triggerTour('homescreen'); + waitForElement('.onboarding-modal .op-modal--close-button', 'body', () => { + // Start automatically when the language selection is closed + jQuery('.op-modal--close-button').click(() => { + tourCancelled = true; + void triggerTour('homescreen'); + }); }); // Start automatically when the escape button is pressed diff --git a/frontend/src/app/features/admin/types/type-form-configuration.html b/frontend/src/app/features/admin/types/type-form-configuration.html index ddf51da8e9..846f8cfdbf 100644 --- a/frontend/src/app/features/admin/types/type-form-configuration.html +++ b/frontend/src/app/features/admin/types/type-form-configuration.html @@ -1,5 +1,5 @@
-
+
  • \ No newline at end of file + \ No newline at end of file diff --git a/frontend/src/app/features/in-app-notifications/bell/in-app-notification-bell.component.sass b/frontend/src/app/features/in-app-notifications/bell/in-app-notification-bell.component.sass index e167bb244f..41bcbd7d54 100644 --- a/frontend/src/app/features/in-app-notifications/bell/in-app-notification-bell.component.sass +++ b/frontend/src/app/features/in-app-notifications/bell/in-app-notification-bell.component.sass @@ -4,15 +4,8 @@ position: relative &--indicator + @include indicator-bubble position: absolute top: 10px right: 5px - display: flex - justify-content: center - align-items: center - height: 16px - width: 16px - border-radius: 0.5rem - font-size: 0.7rem background: darkred - font-weight: bold \ No newline at end of file diff --git a/frontend/src/app/features/in-app-notifications/bell/in-app-notification-bell.component.ts b/frontend/src/app/features/in-app-notifications/bell/in-app-notification-bell.component.ts index fd5789d2f0..69c27c92ca 100644 --- a/frontend/src/app/features/in-app-notifications/bell/in-app-notification-bell.component.ts +++ b/frontend/src/app/features/in-app-notifications/bell/in-app-notification-bell.component.ts @@ -2,7 +2,6 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; import { InAppNotificationsQuery } from 'core-app/features/in-app-notifications/store/in-app-notifications.query'; import { InAppNotificationsService } from 'core-app/features/in-app-notifications/store/in-app-notifications.service'; import { OpModalService } from 'core-app/shared/components/modal/modal.service'; -import { InAppNotificationCenterComponent } from 'core-app/features/in-app-notifications/center/in-app-notification-center.component'; import { merge, timer } from 'rxjs'; import { filter, switchMap } from 'rxjs/operators'; import { ActiveWindowService } from 'core-app/core/active-window/active-window.service'; @@ -33,9 +32,4 @@ export class InAppNotificationBellComponent { readonly activeWindow:ActiveWindowService, readonly modalService:OpModalService) { } - - openCenter(event:MouseEvent) { - this.modalService.show(InAppNotificationCenterComponent, 'global'); - event.preventDefault(); - } } diff --git a/frontend/src/app/features/in-app-notifications/center/in-app-notification-center-page.component.ts b/frontend/src/app/features/in-app-notifications/center/in-app-notification-center-page.component.ts new file mode 100644 index 0000000000..ed5ab42f2b --- /dev/null +++ b/frontend/src/app/features/in-app-notifications/center/in-app-notification-center-page.component.ts @@ -0,0 +1,134 @@ +import { + ChangeDetectionStrategy, + ChangeDetectorRef, + Component, + Injector, + OnInit, +} from '@angular/core'; +import { + ToolbarButtonComponentDefinition, + ViewPartitionState, +} from 'core-app/features/work-packages/routing/partitioned-query-space-page/partitioned-query-space-page.component'; +import { + StateService, + TransitionService, +} from '@uirouter/core'; +import { NotificationsService } from 'core-app/shared/components/notifications/notifications.service'; +import { I18nService } from 'core-app/core/i18n/i18n.service'; +import { APIV3Service } from 'core-app/core/apiv3/api-v3.service'; +import { NotificationSettingsButtonComponent } from 'core-app/features/in-app-notifications/center/toolbar/settings/notification-settings-button.component'; +import { ActivateFacetButtonComponent } from 'core-app/features/in-app-notifications/center/toolbar/facet/activate-facet-button.component'; +import { MarkAllAsReadButtonComponent } from 'core-app/features/in-app-notifications/center/toolbar/mark-all-as-read/mark-all-as-read-button.component'; +import { UntilDestroyedMixin } from 'core-app/shared/helpers/angular/until-destroyed.mixin'; +import { + BackRouteOptions, + BackRoutingService, +} from 'core-app/features/work-packages/components/back-routing/back-routing.service'; + +@Component({ + templateUrl: '../../work-packages/routing/partitioned-query-space-page/partitioned-query-space-page.component.html', + styleUrls: [ + '../../work-packages/routing/partitioned-query-space-page/partitioned-query-space-page.component.sass', + ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class InAppNotificationCenterPageComponent extends UntilDestroyedMixin implements OnInit { + text = { + title: this.I18n.t('js.notifications.title'), + }; + + /** Go back using back-button */ + backButtonCallback:() => void = this.backButtonFn.bind(this); + + /** Current query title to render */ + selectedTitle = this.text.title; + + /** Disable filter container for now */ + filterContainerDefinition = null; + + /** We need to pass the correct partition state to the view to manage the grid */ + currentPartition:ViewPartitionState = '-split'; + + /** Show a toolbar */ + showToolbar = true; + + /** Toolbar is not editable */ + titleEditingEnabled = false; + + /** Not savable */ + showToolbarSaveButton = false; + + /** Toolbar is always enabled */ + toolbarDisabled = false; + + /** Define the buttons shown in the toolbar */ + toolbarButtonComponents:ToolbarButtonComponentDefinition[] = [ + { + component: ActivateFacetButtonComponent, + containerClasses: 'form--field-inline-buttons-container', + }, + { + component: MarkAllAsReadButtonComponent, + }, + { + component: NotificationSettingsButtonComponent, + containerClasses: 'hidden-for-mobile', + }, + ]; + + /** Global referrer set when coming from a hard reload */ + private documentReferer:string; + + /** Local referrer set when coming from an angular route */ + private backRoute:BackRouteOptions; + + constructor( + readonly I18n:I18nService, + readonly cdRef:ChangeDetectorRef, + readonly $transitions:TransitionService, + readonly state:StateService, + readonly notifications:NotificationsService, + readonly injector:Injector, + readonly apiV3Service:APIV3Service, + readonly backRoutingService:BackRoutingService, + ) { + super(); + } + + ngOnInit():void { + this.backRoute = this.backRoutingService.backRoute; + this.documentReferer = document.referrer; + } + + /** + * We need to set the current partition to the grid to ensure + * either side gets expanded to full width if we're not in '-split' mode. + * + * @param state The current or entering state + */ + setPartition(state:{ data:{ partition?:ViewPartitionState } }):void { + this.currentPartition = state.data?.partition || '-split'; + } + + // For shared template compliance + // eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-unused-vars + updateTitleName(val:string):void {} + + // For shared template compliance + // eslint-disable-next-line class-methods-use-this, @typescript-eslint/no-unused-vars + changeChangesFromTitle(val:string):void {} + + private backButtonFn():void { + if (this.backRoute) { + void this.backRoutingService.goToOtherState(this.backRoute.name, this.backRoute.params); + return; + } + + if (this.documentReferer.length > 0) { + window.location.href = this.documentReferer; + } else { + // Default fallback + window.history.back(); + } + } +} diff --git a/frontend/src/app/features/in-app-notifications/center/in-app-notification-center.component.html b/frontend/src/app/features/in-app-notifications/center/in-app-notification-center.component.html index 6b8cbab0a6..512b125757 100644 --- a/frontend/src/app/features/in-app-notifications/center/in-app-notification-center.component.html +++ b/frontend/src/app/features/in-app-notifications/center/in-app-notification-center.component.html @@ -1,65 +1,18 @@ -
    - {{text.title}} - -
    -
    -
    -
    -
    - -
      - -
    • - - - -
    • -
    • - -
    • -
    -
    -
    - +
    +
    -
    - +
    +
    diff --git a/frontend/src/app/features/in-app-notifications/center/in-app-notification-center.component.sass b/frontend/src/app/features/in-app-notifications/center/in-app-notification-center.component.sass index 88b5f77825..e6275bf577 100644 --- a/frontend/src/app/features/in-app-notifications/center/in-app-notification-center.component.sass +++ b/frontend/src/app/features/in-app-notifications/center/in-app-notification-center.component.sass @@ -1,21 +1,21 @@ .op-ian-center - //grid-template-columns: 1fr 3fr - //grid-template-areas: "filters entries" + display: grid + grid-template-rows: 1fr auto + height: 100% - &--filters - grid-area: filters + &--content + height: 100% &--viewport - grid-area: entries - flex: 1 - - &--entries - list-style: none - - &--entry - display: list-item + height: 100% &--max-warning margin-bottom: 0 text-align: center font-style: italic + + :host + .-browser-safari & + // Because of Safari's viewport bug, the address bar overlaps content with height: 100vh + // Check #38082 before changing it + height: 100% diff --git a/frontend/src/app/features/in-app-notifications/center/in-app-notification-center.component.ts b/frontend/src/app/features/in-app-notifications/center/in-app-notification-center.component.ts index 4115b2c56c..db1cb1f8f1 100644 --- a/frontend/src/app/features/in-app-notifications/center/in-app-notification-center.component.ts +++ b/frontend/src/app/features/in-app-notifications/center/in-app-notification-center.component.ts @@ -3,17 +3,16 @@ import { ChangeDetectorRef, Component, ElementRef, - Inject, OnInit, } from '@angular/core'; -import { OpModalComponent } from 'core-app/shared/components/modal/modal.component'; -import { OpModalLocalsToken } from 'core-app/shared/components/modal/modal.service'; -import { OpModalLocalsMap } from 'core-app/shared/components/modal/modal.types'; import { I18nService } from 'core-app/core/i18n/i18n.service'; import { InAppNotificationsQuery } from 'core-app/features/in-app-notifications/store/in-app-notifications.query'; import { InAppNotificationsService } from 'core-app/features/in-app-notifications/store/in-app-notifications.service'; import { NOTIFICATIONS_MAX_SIZE } from 'core-app/features/in-app-notifications/store/in-app-notification.model'; import { map } from 'rxjs/operators'; +import { StateService } from '@uirouter/angular'; +import { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource'; +import { UIRouterGlobals } from '@uirouter/core'; @Component({ selector: 'op-in-app-notification-center', @@ -21,10 +20,15 @@ import { map } from 'rxjs/operators'; styleUrls: ['./in-app-notification-center.component.sass'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class InAppNotificationCenterComponent extends OpModalComponent implements OnInit { +export class InAppNotificationCenterComponent implements OnInit { activeFacet$ = this.ianQuery.activeFacet$; - notifications$ = this.ianQuery.selectAll(); + notifications$ = this + .ianQuery + .aggregatedNotifications$ + .pipe( + map((items) => Object.values(items)), + ); notificationsCount$ = this.ianQuery.selectCount(); @@ -42,45 +46,32 @@ export class InAppNotificationCenterComponent extends OpModalComponent implement facets:string[] = ['unread', 'all']; + originalOrder = ():number => 0; + text = { title: this.I18n.t('js.notifications.title'), - mark_all_read: this.I18n.t('js.notifications.center.mark_all_read'), button_close: this.I18n.t('js.button_close'), no_results: { unread: this.I18n.t('js.notifications.no_unread'), all: this.I18n.t('js.notice_no_results_to_display'), }, - facets: { - unread: this.I18n.t('js.notifications.facets.unread'), - all: this.I18n.t('js.notifications.facets.all'), - }, }; constructor( - @Inject(OpModalLocalsToken) public locals:OpModalLocalsMap, readonly cdRef:ChangeDetectorRef, readonly elementRef:ElementRef, readonly I18n:I18nService, readonly ianService:InAppNotificationsService, readonly ianQuery:InAppNotificationsQuery, + readonly uiRouterGlobals:UIRouterGlobals, + readonly state:StateService, ) { - super(locals, cdRef, elementRef); } ngOnInit():void { this.ianService.get(); } - markAllRead():void { - this.ianService.markAllRead(); - this.closeMe(); - } - - activateFacet(facet:string):void { - this.ianService.setActiveFacet(facet); - this.ianService.get(); - } - totalCountWarning():string { const state = this.ianQuery.getValue(); @@ -89,4 +80,10 @@ export class InAppNotificationCenterComponent extends OpModalComponent implement { newest_count: NOTIFICATIONS_MAX_SIZE, more_count: state.notShowing }, ); } + + openSplitView($event:WorkPackageResource):void { + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + const baseRoute = this.uiRouterGlobals.current.data.baseRoute as string; + void this.state.go(`${baseRoute}.details`, { workPackageId: $event.id }); + } } diff --git a/frontend/src/app/features/in-app-notifications/center/toolbar/facet/activate-facet-button.component.html b/frontend/src/app/features/in-app-notifications/center/toolbar/facet/activate-facet-button.component.html new file mode 100644 index 0000000000..cd2cbc4a18 --- /dev/null +++ b/frontend/src/app/features/in-app-notifications/center/toolbar/facet/activate-facet-button.component.html @@ -0,0 +1,14 @@ + + + \ No newline at end of file diff --git a/frontend/src/app/features/in-app-notifications/center/toolbar/facet/activate-facet-button.component.ts b/frontend/src/app/features/in-app-notifications/center/toolbar/facet/activate-facet-button.component.ts new file mode 100644 index 0000000000..14c4e38181 --- /dev/null +++ b/frontend/src/app/features/in-app-notifications/center/toolbar/facet/activate-facet-button.component.ts @@ -0,0 +1,35 @@ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { IAN_FACETS } from 'core-app/features/in-app-notifications/store/in-app-notification.model'; +import { I18nService } from 'core-app/core/i18n/i18n.service'; +import { InAppNotificationsQuery } from 'core-app/features/in-app-notifications/store/in-app-notifications.query'; +import { InAppNotificationsService } from 'core-app/features/in-app-notifications/store/in-app-notifications.service'; + +@Component({ + selector: 'op-activate-facet', + templateUrl: './activate-facet-button.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class ActivateFacetButtonComponent { + activeFacet$ = this.ianQuery.activeFacet$; + + text = { + facets: { + unread: this.I18n.t('js.notifications.facets.unread'), + all: this.I18n.t('js.notifications.facets.all'), + }, + }; + + availableFacets = IAN_FACETS; + + constructor( + private I18n:I18nService, + private ianQuery:InAppNotificationsQuery, + private ianService:InAppNotificationsService, + ) { + } + + activateFacet(facet:string):void { + this.ianService.setActiveFacet(facet); + this.ianService.get(); + } +} diff --git a/frontend/src/app/features/in-app-notifications/center/toolbar/mark-all-as-read/mark-all-as-read-button.component.html b/frontend/src/app/features/in-app-notifications/center/toolbar/mark-all-as-read/mark-all-as-read-button.component.html new file mode 100644 index 0000000000..1cf77dd44b --- /dev/null +++ b/frontend/src/app/features/in-app-notifications/center/toolbar/mark-all-as-read/mark-all-as-read-button.component.html @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/frontend/src/app/features/in-app-notifications/center/toolbar/mark-all-as-read/mark-all-as-read-button.component.ts b/frontend/src/app/features/in-app-notifications/center/toolbar/mark-all-as-read/mark-all-as-read-button.component.ts new file mode 100644 index 0000000000..e7a1792f70 --- /dev/null +++ b/frontend/src/app/features/in-app-notifications/center/toolbar/mark-all-as-read/mark-all-as-read-button.component.ts @@ -0,0 +1,25 @@ +import { Component, ChangeDetectionStrategy } from '@angular/core'; +import { I18nService } from 'core-app/core/i18n/i18n.service'; +import { InAppNotificationsService } from 'core-app/features/in-app-notifications/store/in-app-notifications.service'; + +@Component({ + selector: 'op-mark-all-as-read-button', + templateUrl: './mark-all-as-read-button.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class MarkAllAsReadButtonComponent { + text = { + mark_all_read: this.I18n.t('js.notifications.center.mark_all_read'), + + }; + + constructor( + private I18n:I18nService, + private ianService:InAppNotificationsService, + ) { + } + + markAllRead():void { + this.ianService.markAllRead(); + } +} diff --git a/frontend/src/app/features/in-app-notifications/center/toolbar/settings/notification-settings-button.component.html b/frontend/src/app/features/in-app-notifications/center/toolbar/settings/notification-settings-button.component.html new file mode 100644 index 0000000000..15b3ac1747 --- /dev/null +++ b/frontend/src/app/features/in-app-notifications/center/toolbar/settings/notification-settings-button.component.html @@ -0,0 +1,13 @@ + + + + + + \ No newline at end of file diff --git a/frontend/src/app/features/in-app-notifications/center/toolbar/settings/notification-settings-button.component.ts b/frontend/src/app/features/in-app-notifications/center/toolbar/settings/notification-settings-button.component.ts new file mode 100644 index 0000000000..97fa037304 --- /dev/null +++ b/frontend/src/app/features/in-app-notifications/center/toolbar/settings/notification-settings-button.component.ts @@ -0,0 +1,22 @@ +import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { PathHelperService } from 'core-app/core/path-helper/path-helper.service'; +import { I18nService } from 'core-app/core/i18n/i18n.service'; + +@Component({ + selector: 'op-notification-settings-button', + templateUrl: './notification-settings-button.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class NotificationSettingsButtonComponent { + myNotificationSettingsLink = this.pathHelper.myNotificationsSettingsPath(); + + text = { + mySettings: this.I18n.t('js.notifications.settings.title'), + }; + + constructor( + private I18n:I18nService, + private pathHelper:PathHelperService, + ) { + } +} diff --git a/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.html b/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.html index 56ed23676e..396e01d1a3 100644 --- a/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.html +++ b/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.html @@ -1,116 +1,108 @@
    + + + + + + + + +
    + +
    + +
    + + + {{ item.key }}, + +
    + +
    + +
    + +
    + - + > - - - -
    - -
    -
    -
    -
    - -
    - -
    -
    -
    -
    -
    -
      - -
    • - -
    • -
      -
    - -
    diff --git a/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.sass b/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.sass index 557ade8211..5538acd73d 100644 --- a/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.sass +++ b/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.sass @@ -2,6 +2,7 @@ $ian-bg-color: #F9F9F9 $ian-bg-hover-color: #F1F8FF +$subject-font-size: 14px .op-ian-item background: $ian-bg-color @@ -12,7 +13,7 @@ $ian-bg-hover-color: #F1F8FF border-radius: 2px // This needs to be set in the itemSize of // the virtual scroller - height: 50px + height: 80px &_expanded height: auto @@ -27,16 +28,15 @@ $ian-bg-hover-color: #F1F8FF @include unset-button-styles width: 100% display: grid - grid-template-columns: 1fr 20% 15% 15% - grid-template-rows: 1fr 1fr - grid-template-areas: "project actor reason date" "title actor reason date" + grid-template-columns: 50px 1fr 200px 15% 15% + grid-template-rows: auto $subject-font-size 1fr + grid-template-areas: "project project project project project" "title title status status date" "actors reason reason reason reason" grid-gap: 0.5rem align-items: center @media screen and (max-width: 679px) - grid-template-columns: 1fr 35px 30% - grid-template-rows: auto 1fr - grid-template-areas: "project actor reason" "title actor date" + grid-template-columns: 50px 1fr 15% 15% + grid-template-areas: "project project date date" "title title title title" "actors reason reason reason" &_unexpandable cursor: default @@ -71,27 +71,62 @@ $ian-bg-hover-color: #F1F8FF &--reason, &--date - color: var(--gray-dark) + color: #7f7f7f + + &--reason-count + background: #7f7f7f + color: white + @include indicator-bubble &--title grid-area: title + font-size: $subject-font-size @include text-shortener &--reason grid-area: reason @include text-shortener max-width: 100% - @media screen and (max-width: 679px) - justify-self: end &--date grid-area: date - justify-self: end - text-align: end @include text-shortener(false) white-space: nowrap max-width: 100% + text-align: right + + @media screen and (max-width: 679px) + justify-self: end + + &:not(#{&}_read):hover &--date, + &--buttons:focus-within + &--date + opacity: 0 + + @media screen and (max-width: 679px) + opacity: 1 - &--actor - grid-area: actor + &--actors + grid-area: actors @include text-shortener + + &--status + grid-area: status + + &--buttons + grid-area: date + text-align: right + align-items: end + + @media screen and (max-width: 679px) + grid-area: buttons + + &--button + margin: 0 + opacity: 0 + + @media screen and (max-width: 679px) + display: none + + &:not(#{&}_read):hover &--button, + &--button:focus + opacity: 1 diff --git a/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.ts b/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.ts index f72ebac6d9..189d88cc50 100644 --- a/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.ts +++ b/frontend/src/app/features/in-app-notifications/entry/in-app-notification-entry.component.ts @@ -1,20 +1,36 @@ import { - EventEmitter, ChangeDetectionStrategy, Component, Input, OnInit, Output, + EventEmitter, + ChangeDetectionStrategy, + Component, + Input, + OnInit, + Output, } from '@angular/core'; import { InAppNotification, InAppNotificationDetail, } from 'core-app/features/in-app-notifications/store/in-app-notification.model'; import { WorkPackageResource } from 'core-app/features/hal/resources/work-package-resource'; -import { Observable, timer } from 'rxjs'; +import { + Observable, + timer, +} from 'rxjs'; import { APIV3Service } from 'core-app/core/apiv3/api-v3.service'; -import { HalResource } from 'core-app/features/hal/resources/hal-resource'; +import idFromLink from 'core-app/features/hal/helpers/id-from-link'; import { I18nService } from 'core-app/core/i18n/i18n.service'; import { InAppNotificationsService } from 'core-app/features/in-app-notifications/store/in-app-notifications.service'; import { TimezoneService } from 'core-app/core/datetime/timezone.service'; -import { distinctUntilChanged, map } from 'rxjs/operators'; +import { + distinctUntilChanged, + map, +} from 'rxjs/operators'; import { PrincipalLike } from 'core-app/shared/components/principal/principal-types'; import { PathHelperService } from 'core-app/core/path-helper/path-helper.service'; +import { take } from 'rxjs/internal/operators/take'; +import { StateService } from '@uirouter/angular'; +import { InAppNotificationsQuery } from 'core-app/features/in-app-notifications/store/in-app-notifications.query'; +import { HalResource } from 'core-app/features/hal/resources/hal-resource'; +import { BackRouteOptions } from 'core-app/features/work-packages/components/back-routing/back-routing.service'; @Component({ selector: 'op-in-app-notification-entry', @@ -25,10 +41,14 @@ import { PathHelperService } from 'core-app/core/path-helper/path-helper.service export class InAppNotificationEntryComponent implements OnInit { @Input() notification:InAppNotification; + @Input() aggregatedNotifications:InAppNotification[]; + @Output() resourceLinkClicked = new EventEmitter(); workPackage$:Observable|null = null; + loading$ = this.ianQuery.selectLoading(); + // Formattable body, if any body:InAppNotificationDetail[]; @@ -39,10 +59,10 @@ export class InAppNotificationEntryComponent implements OnInit { unexpandable = false; // The actor, if any - actor?:PrincipalLike; + actors:PrincipalLike[] = []; // The translated reason, if available - translatedReason?:string; + translatedReasons:{ [reason:string]:number }; // Format relative elapsed time (n seconds/minutes/hours ago) // at an interval for auto updating @@ -60,15 +80,17 @@ export class InAppNotificationEntryComponent implements OnInit { constructor( readonly apiV3Service:APIV3Service, readonly I18n:I18nService, - readonly inAppNotificationsService:InAppNotificationsService, + readonly ianService:InAppNotificationsService, + readonly ianQuery:InAppNotificationsQuery, readonly timezoneService:TimezoneService, readonly pathHelper:PathHelperService, + readonly state:StateService, ) { } ngOnInit():void { this.buildTranslatedReason(); - this.buildActor(); + this.buildActors(); this.buildDetails(); this.buildTime(); this.buildProject(); @@ -104,41 +126,76 @@ export class InAppNotificationEntryComponent implements OnInit { ); } - toggleDetails():void { - if (this.unexpandable) { + showDetails():void { + if (this.unexpandable || !this.workPackage$) { return; } if (!this.notification.readIAN) { - this.inAppNotificationsService.markReadKeepAndExpanded(this.notification); - } - if (this.notification.expanded) { - this.inAppNotificationsService.collapse(this.notification); - } else { - this.inAppNotificationsService.expand(this.notification); + this.ianService.markAsRead(this.aggregatedNotifications, true); } + + this + .workPackage$ + .pipe( + take(1), + ) + .subscribe((wp) => { + void this.state.go( + `${(this.state.current.data as BackRouteOptions).baseRoute}.details.tabs`, + { workPackageId: wp.id, tabIdentifier: 'activity' }, + ); + }); } - private buildActor() { - const { actor } = this.notification._links; + projectClicked(event:MouseEvent):void { // eslint-disable-line class-methods-use-this + event.stopPropagation(); + } - if (actor) { - this.actor = { - href: actor.href, - name: actor.title, - }; - } + markAsRead(event:MouseEvent, notifications:InAppNotification[]):void { + event.stopPropagation(); + + this + .ianService + .markAsRead(notifications); } - private buildTranslatedReason() { - this.translatedReason = this.I18n.t( - `js.notifications.reasons.${this.notification.reason}`, - { defaultValue: this.notification.reason || this.text.placeholder }, - ); + private buildActors() { + const actors = this + .aggregatedNotifications + .map((notification) => { + const { actor } = notification._links; + + if (!actor) { + return null; + } + + return { + href: actor.href, + name: actor.title, + }; + }) + .filter((actor) => actor !== null) as PrincipalLike[]; + + this.actors = _.uniqBy(actors, (item) => item.href); } - projectClicked(event:MouseEvent) { - event.stopPropagation(); + private buildTranslatedReason() { + const reasons:{ [reason:string]:number } = {}; + + this + .aggregatedNotifications + .forEach((notification) => { + const translatedReason = this.I18n.t( + `js.notifications.reasons.${notification.reason}`, + { defaultValue: notification.reason || this.text.placeholder }, + ); + + reasons[translatedReason] = reasons[translatedReason] || 0; + reasons[translatedReason] += 1; + }); + + this.translatedReasons = reasons; } private buildProject() { @@ -147,7 +204,7 @@ export class InAppNotificationEntryComponent implements OnInit { if (project) { this.project = { ...project, - showUrl: this.pathHelper.projectPath(HalResource.idFromLink(project.href)), + showUrl: this.pathHelper.projectPath(idFromLink(project.href)), }; } } diff --git a/frontend/src/app/features/in-app-notifications/entry/status/in-app-notification-status.component.html b/frontend/src/app/features/in-app-notifications/entry/status/in-app-notification-status.component.html new file mode 100644 index 0000000000..05e0e39cdc --- /dev/null +++ b/frontend/src/app/features/in-app-notifications/entry/status/in-app-notification-status.component.html @@ -0,0 +1,9 @@ + + + diff --git a/frontend/src/app/features/in-app-notifications/entry/status/in-app-notification-status.component.sass b/frontend/src/app/features/in-app-notifications/entry/status/in-app-notification-status.component.sass new file mode 100644 index 0000000000..f7b965a128 --- /dev/null +++ b/frontend/src/app/features/in-app-notifications/entry/status/in-app-notification-status.component.sass @@ -0,0 +1,13 @@ +@import "helpers" + +.op-ian-wp-status + @include text-shortener(false) + padding: 5px + margin-bottom: 0 + border: none + border-radius: 2px + color: white + max-width: 100% + + &--text + margin: 0 5px diff --git a/frontend/src/app/features/in-app-notifications/entry/status/in-app-notification-status.component.ts b/frontend/src/app/features/in-app-notifications/entry/status/in-app-notification-status.component.ts new file mode 100644 index 0000000000..296ef8721d --- /dev/null +++ b/frontend/src/app/features/in-app-notifications/entry/status/in-app-notification-status.component.ts @@ -0,0 +1,28 @@ +import { + ChangeDetectionStrategy, + Component, + Input, + OnChanges, + SimpleChanges, +} from '@angular/core'; +import { Highlighting } from 'core-app/features/work-packages/components/wp-fast-table/builders/highlighting/highlighting.functions'; +import { StatusResource } from 'core-app/features/hal/resources/status-resource'; + +@Component({ + selector: 'op-in-app-notification-status', + styleUrls: ['./in-app-notification-status.component.sass'], + templateUrl: './in-app-notification-status.component.html', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class InAppNotificationStatusComponent implements OnChanges { + @Input() status:StatusResource; + + highlightClass:string; + + ngOnChanges(changes:SimpleChanges):void { + if (changes.status) { + const status = changes.status as { currentValue:StatusResource }; + this.highlightClass = Highlighting.backgroundClass('status', status.currentValue.id || ''); + } + } +} diff --git a/frontend/src/app/features/in-app-notifications/in-app-notifications.lazy-routes.ts b/frontend/src/app/features/in-app-notifications/in-app-notifications.lazy-routes.ts new file mode 100644 index 0000000000..b112e1d1ae --- /dev/null +++ b/frontend/src/app/features/in-app-notifications/in-app-notifications.lazy-routes.ts @@ -0,0 +1,37 @@ +// -- copyright +// OpenProject is an open source project management software. +// Copyright (C) 2012-2021 the OpenProject GmbH +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License version 3. +// +// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +// Copyright (C) 2006-2013 Jean-Philippe Lang +// Copyright (C) 2010-2013 the ChiliProject Team +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +// See docs/COPYRIGHT.rdoc for more details. +//++ + +import { Ng2StateDeclaration } from '@uirouter/angular'; + +export const IAN_LAZY_ROUTES:Ng2StateDeclaration[] = [ + { + name: 'notifications.**', + url: '/notifications', + loadChildren: () => import('./in-app-notifications.module').then((m) => m.OpenProjectInAppNotificationsModule), + }, +]; diff --git a/frontend/src/app/features/in-app-notifications/in-app-notifications.module.ts b/frontend/src/app/features/in-app-notifications/in-app-notifications.module.ts index f4ff9ee607..f69f628ec3 100644 --- a/frontend/src/app/features/in-app-notifications/in-app-notifications.module.ts +++ b/frontend/src/app/features/in-app-notifications/in-app-notifications.module.ts @@ -1,27 +1,46 @@ import { NgModule } from '@angular/core'; +import { OPSharedModule } from 'core-app/shared/shared.module'; import { CommonModule } from '@angular/common'; import { IconModule } from 'core-app/shared/components/icon/icon.module'; import { InAppNotificationBellComponent } from 'core-app/features/in-app-notifications/bell/in-app-notification-bell.component'; -import { OpenprojectModalModule } from 'core-app/shared/components/modal/modal.module'; import { InAppNotificationEntryComponent } from 'core-app/features/in-app-notifications/entry/in-app-notification-entry.component'; import { OpenprojectPrincipalRenderingModule } from 'core-app/shared/components/principal/principal-rendering.module'; import { UIRouterModule } from '@uirouter/angular'; import { ScrollingModule } from '@angular/cdk/scrolling'; -import { InAppNotificationCenterComponent } from './center/in-app-notification-center.component'; +import { IAN_ROUTES } from 'core-app/features/in-app-notifications/in-app-notifications.routes'; +import { InAppNotificationCenterComponent } from 'core-app/features/in-app-notifications/center/in-app-notification-center.component'; +import { InAppNotificationCenterPageComponent } from 'core-app/features/in-app-notifications/center/in-app-notification-center-page.component'; +import { OpenprojectWorkPackagesModule } from 'core-app/features/work-packages/openproject-work-packages.module'; +import { DynamicModule } from 'ng-dynamic-component'; +import { InAppNotificationStatusComponent } from './entry/status/in-app-notification-status.component'; +import { NotificationSettingsButtonComponent } from './center/toolbar/settings/notification-settings-button.component'; +import { ActivateFacetButtonComponent } from './center/toolbar/facet/activate-facet-button.component'; +import { MarkAllAsReadButtonComponent } from './center/toolbar/mark-all-as-read/mark-all-as-read-button.component'; @NgModule({ declarations: [ InAppNotificationBellComponent, InAppNotificationCenterComponent, InAppNotificationEntryComponent, + InAppNotificationCenterPageComponent, + InAppNotificationStatusComponent, + NotificationSettingsButtonComponent, + ActivateFacetButtonComponent, + MarkAllAsReadButtonComponent, ], imports: [ - UIRouterModule, + OPSharedModule, + // Routes for /backlogs + UIRouterModule.forChild({ + states: IAN_ROUTES, + }), + DynamicModule, CommonModule, IconModule, - OpenprojectModalModule, OpenprojectPrincipalRenderingModule, + OpenprojectWorkPackagesModule, ScrollingModule, ], }) -export class OpenProjectInAppNotificationsModule { } +export class OpenProjectInAppNotificationsModule { +} diff --git a/frontend/src/app/features/in-app-notifications/in-app-notifications.routes.ts b/frontend/src/app/features/in-app-notifications/in-app-notifications.routes.ts new file mode 100644 index 0000000000..b1a3347dd7 --- /dev/null +++ b/frontend/src/app/features/in-app-notifications/in-app-notifications.routes.ts @@ -0,0 +1,65 @@ +// -- copyright +// OpenProject is an open source project management software. +// Copyright (C) 2012-2021 the OpenProject GmbH +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License version 3. +// +// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +// Copyright (C) 2006-2013 Jean-Philippe Lang +// Copyright (C) 2010-2013 the ChiliProject Team +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +// See docs/COPYRIGHT.rdoc for more details. +//++ + +import { Ng2StateDeclaration } from '@uirouter/angular'; +import { makeSplitViewRoutes } from 'core-app/features/work-packages/routing/split-view-routes.template'; +import { WorkPackageSplitViewComponent } from 'core-app/features/work-packages/routing/wp-split-view/wp-split-view.component'; +import { InAppNotificationCenterComponent } from 'core-app/features/in-app-notifications/center/in-app-notification-center.component'; +import { InAppNotificationCenterPageComponent } from 'core-app/features/in-app-notifications/center/in-app-notification-center-page.component'; +import { WorkPackagesBaseComponent } from 'core-app/features/work-packages/routing/wp-base/wp--base.component'; + +export const IAN_ROUTES:Ng2StateDeclaration[] = [ + { + name: 'notifications', + url: '/notifications', + data: { + bodyClasses: 'router--work-packages-base', + }, + component: WorkPackagesBaseComponent, + redirectTo: 'notifications.center.show', + }, + { + name: 'notifications.center', + component: InAppNotificationCenterPageComponent, + redirectTo: 'notifications.center.show', + }, + { + name: 'notifications.center.show', + data: { + baseRoute: 'notifications.center.show', + }, + views: { + 'content-left': { component: InAppNotificationCenterComponent }, + }, + }, + ...makeSplitViewRoutes( + 'notifications.center.show', + undefined, + WorkPackageSplitViewComponent, + ), +]; diff --git a/frontend/src/app/features/in-app-notifications/store/in-app-notification.model.ts b/frontend/src/app/features/in-app-notifications/store/in-app-notification.model.ts index 2a6d379ce9..b98afe8806 100644 --- a/frontend/src/app/features/in-app-notifications/store/in-app-notification.model.ts +++ b/frontend/src/app/features/in-app-notifications/store/in-app-notification.model.ts @@ -8,6 +8,8 @@ export type InAppNotificationFormat = 'markdown'|'custom'; export const NOTIFICATIONS_MAX_SIZE = 100; +export const IAN_FACETS = ['unread', 'all']; + export interface InAppNotificationDetail { format:InAppNotificationFormat; raw:string|null; diff --git a/frontend/src/app/features/in-app-notifications/store/in-app-notifications.query.ts b/frontend/src/app/features/in-app-notifications/store/in-app-notifications.query.ts index 909828e8e1..1d94ac55d1 100644 --- a/frontend/src/app/features/in-app-notifications/store/in-app-notifications.query.ts +++ b/frontend/src/app/features/in-app-notifications/store/in-app-notifications.query.ts @@ -1,10 +1,42 @@ import { Injectable } from '@angular/core'; import { QueryEntity } from '@datorama/akita'; -import { map } from 'rxjs/operators'; -import { InAppNotificationsStore, InAppNotificationsState } from './in-app-notifications.store'; +import { map, switchMap } from 'rxjs/operators'; +import { Observable, throwError } from 'rxjs'; +import { + InAppNotificationsState, + InAppNotificationsStore, +} from './in-app-notifications.store'; +import { InAppNotification } from 'core-app/features/in-app-notifications/store/in-app-notification.model'; @Injectable({ providedIn: 'root' }) export class InAppNotificationsQuery extends QueryEntity { + /** Select the active filter facet */ + activeFacet$ = this.select('activeFacet'); + + /** Get the faceted items */ + faceted$ = this.activeFacet$ + .pipe( + switchMap((facet) => { + switch (facet) { + case 'unread': + return this.unreadOrKept$; + case 'all': + return this.selectAll(); + default: + return throwError(new Error(`Invalid facet ${facet}`)); + } + }), + ); + + /** Notifications grouped by resource */ + aggregatedNotifications$:Observable<{ [key:string]:InAppNotification[] }> = this + .faceted$ + .pipe( + map((notifications) => ( + _.groupBy(notifications, (notification) => notification._links.resource?.href || 'none') + )), + ); + /** Get the number of unread items */ unreadCount$ = this.select('unreadCount'); @@ -17,15 +49,13 @@ export class InAppNotificationsQuery extends QueryEntity !!keep, + unreadOrKept$ = this.selectAll({ + filterBy: ({ readIAN, keep }) => !readIAN || !!keep, }); /** Do we have any notification that shall be visible the notification center? */ hasNotifications$ = this.selectCount().pipe(map((count) => count > 0)); - activeFacet$ = this.select('activeFacet'); - /** Determine whether the pageSize is not sufficient to load all notifcations */ hasMoreThanPageSize$ = this .select() diff --git a/frontend/src/app/features/in-app-notifications/store/in-app-notifications.service.ts b/frontend/src/app/features/in-app-notifications/store/in-app-notifications.service.ts index d77e0fd764..c50d263e14 100644 --- a/frontend/src/app/features/in-app-notifications/store/in-app-notifications.service.ts +++ b/frontend/src/app/features/in-app-notifications/store/in-app-notifications.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { applyTransaction, ID } from '@datorama/akita'; +import { applyTransaction, ID, setLoading } from '@datorama/akita'; import { Observable } from 'rxjs'; import { APIV3Service } from 'core-app/core/apiv3/api-v3.service'; import { map, switchMap, tap } from 'rxjs/operators'; @@ -75,6 +75,7 @@ export class InAppNotificationsService { .pipe( take(1), switchMap((events) => this.apiV3Service.notifications.markRead(events.map((event) => event.id))), + setLoading(this.store), ) .subscribe(() => { applyTransaction(() => { @@ -84,6 +85,26 @@ export class InAppNotificationsService { }); } + markAsRead(notifications:InAppNotification[], keep = false):void { + const ids = notifications.map((n) => n.id); + + this + .apiV3Service + .notifications + .markRead(ids) + .pipe( + setLoading(this.store), + ) + .subscribe(() => { + applyTransaction(() => { + this.store.update(ids, { readIAN: true, keep }); + this.store.update( + ({ unreadCount }) => ({ unreadCount: unreadCount - ids.length }), + ); + }); + }); + } + private sideLoadInvolvedWorkPackages(elements:InAppNotification[]) { const wpIds = elements.map((element) => { const href = element._links.resource?.href; @@ -113,26 +134,4 @@ export class InAppNotificationsService { }, ); } - - markReadKeepAndExpanded(notification:InAppNotification):void { - this - .apiV3Service - .notifications - .id(notification.id) - .markRead() - .subscribe(() => { - applyTransaction(() => { - this.store.update( - notification.id, - { - readIAN: true, - keep: true, - }, - ); - this.store.update( - ({ unreadCount }) => ({ unreadCount: unreadCount - 1 }), - ); - }); - }); - } } diff --git a/frontend/src/app/features/invite-user-modal/project-selection/project-allowed.validator.ts b/frontend/src/app/features/invite-user-modal/project-selection/project-allowed.validator.ts index be70ec0aa7..0084138fe7 100644 --- a/frontend/src/app/features/invite-user-modal/project-selection/project-allowed.validator.ts +++ b/frontend/src/app/features/invite-user-modal/project-selection/project-allowed.validator.ts @@ -2,9 +2,15 @@ import { AbstractControl } from '@angular/forms'; import { of } from 'rxjs'; import { catchError, map, take } from 'rxjs/operators'; import { CurrentUserService } from 'core-app/core/current-user/current-user.service'; +import idFromLink from 'core-app/features/hal/helpers/id-from-link'; -export const ProjectAllowedValidator = (currentUserService:CurrentUserService) => (control:AbstractControl) => currentUserService.hasCapabilities$('memberships/create', control.value.idFromLink).pipe( - take(1), - map((isAllowed) => (isAllowed ? null : { lackingPermission: true })), - catchError(() => of(null)), -); +export const ProjectAllowedValidator = (currentUserService:CurrentUserService) => + (control:AbstractControl) => + currentUserService.hasCapabilities$( + 'memberships/create', + idFromLink(control.value.href) + ).pipe( + take(1), + map((isAllowed) => (isAllowed ? null : { lackingPermission: true })), + catchError(() => of(null)), + ); diff --git a/frontend/src/app/features/plugins/plugin-context.ts b/frontend/src/app/features/plugins/plugin-context.ts index f02aab4f7e..8637dcedaa 100644 --- a/frontend/src/app/features/plugins/plugin-context.ts +++ b/frontend/src/app/features/plugins/plugin-context.ts @@ -5,6 +5,7 @@ import { ExternalQueryConfigurationService } from 'core-app/features/work-packag import { OpModalService } from 'core-app/shared/components/modal/modal.service'; import { DisplayField } from 'core-app/shared/components/fields/display/display-field.module'; import { HalResource } from 'core-app/features/hal/resources/hal-resource'; +import idFromLink from 'core-app/features/hal/helpers/id-from-link'; import { DisplayFieldService } from 'core-app/shared/components/fields/display/display-field.service'; import { EditFieldService } from 'core-app/shared/components/fields/edit/edit-field.service'; import { DynamicBootstrapper } from 'core-app/core/setup/globals/dynamic-bootstrapper'; @@ -57,6 +58,10 @@ export class OpenProjectPluginContext { configurationService: this.injector.get(ConfigurationService), }; + public readonly helpers = { + idFromLink, + }; + // Random collection of classes needed outside of angular public readonly classes = { modals: { diff --git a/frontend/src/app/features/user-preferences/notifications-settings/row/notification-setting-row.component.html b/frontend/src/app/features/user-preferences/notifications-settings/row/notification-setting-row.component.html index f9e7e2bdcc..f67e0de493 100644 --- a/frontend/src/app/features/user-preferences/notifications-settings/row/notification-setting-row.component.html +++ b/frontend/src/app/features/user-preferences/notifications-settings/row/notification-setting-row.component.html @@ -1,6 +1,6 @@ + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+
@@ -62,6 +102,7 @@ op-notification-setting-row [attr.data-qa-notification-project]="item.key" [attr.data-qa-notification-channel]="setting.channel" + [count]="item.value.length" [first]="first" [setting]="setting" > diff --git a/frontend/src/app/features/user-preferences/notifications-settings/table/notification-settings-table.component.ts b/frontend/src/app/features/user-preferences/notifications-settings/table/notification-settings-table.component.ts index cc6e58c7b2..be0c27bcda 100644 --- a/frontend/src/app/features/user-preferences/notifications-settings/table/notification-settings-table.component.ts +++ b/frontend/src/app/features/user-preferences/notifications-settings/table/notification-settings-table.component.ts @@ -34,6 +34,11 @@ export class NotificationSettingsTableComponent { channel_header: this.I18n.t('js.notifications.channel'), mentioned_header: this.I18n.t('js.notifications.settings.mentioned'), watched_header: this.I18n.t('js.notifications.settings.watched'), + work_package_commented_header: this.I18n.t('js.notifications.settings.work_package_commented'), + work_package_created_header: this.I18n.t('js.notifications.settings.work_package_created'), + work_package_processed_header: this.I18n.t('js.notifications.settings.work_package_processed'), + work_package_prioritized_header: this.I18n.t('js.notifications.settings.work_package_prioritized'), + work_package_scheduled_header: this.I18n.t('js.notifications.settings.work_package_scheduled'), any_event_header: this.I18n.t('js.notifications.settings.all'), default_all_projects: this.I18n.t('js.notifications.settings.default_all_projects'), }; diff --git a/frontend/src/app/features/user-preferences/state/notification-setting.model.ts b/frontend/src/app/features/user-preferences/state/notification-setting.model.ts index eef5ee2d8e..6d5b6cb498 100644 --- a/frontend/src/app/features/user-preferences/state/notification-setting.model.ts +++ b/frontend/src/app/features/user-preferences/state/notification-setting.model.ts @@ -8,6 +8,11 @@ export interface NotificationSetting { watched:boolean; involved:boolean; mentioned:boolean; + workPackageCommented:boolean; + workPackageCreated:boolean; + workPackageProcessed:boolean; + workPackagePrioritized:boolean; + workPackageScheduled:boolean; all:boolean; } @@ -22,6 +27,11 @@ export function buildNotificationSetting(project:null|HalSourceLink, params:Part involved: true, mentioned: true, watched: true, + workPackageCommented: true, + workPackageCreated: true, + workPackageProcessed: true, + workPackagePrioritized: true, + workPackageScheduled: true, all: false, channel: 'in_app', ...params, diff --git a/frontend/src/app/features/user-preferences/user-preferences.lazy-routes.ts b/frontend/src/app/features/user-preferences/user-preferences.lazy-routes.ts index a6c29f3808..c5c4163382 100644 --- a/frontend/src/app/features/user-preferences/user-preferences.lazy-routes.ts +++ b/frontend/src/app/features/user-preferences/user-preferences.lazy-routes.ts @@ -31,13 +31,11 @@ import { Ng2StateDeclaration } from '@uirouter/angular'; export const MY_ACCOUNT_LAZY_ROUTES:Ng2StateDeclaration[] = [ { name: 'my_notifications.**', - parent: 'root', url: '/my/notifications', loadChildren: () => import('./user-preferences.module').then((m) => m.OpenProjectMyAccountModule), }, { name: 'user_notifications.**', - parent: 'root', url: '/users/:userId/edit/notifications', loadChildren: () => import('./user-preferences.module').then((m) => m.OpenProjectMyAccountModule), }, diff --git a/frontend/src/app/features/user-preferences/user-preferences.routes.ts b/frontend/src/app/features/user-preferences/user-preferences.routes.ts index eea5608257..19cd25e577 100644 --- a/frontend/src/app/features/user-preferences/user-preferences.routes.ts +++ b/frontend/src/app/features/user-preferences/user-preferences.routes.ts @@ -32,13 +32,11 @@ import { NotificationsSettingsPageComponent } from 'core-app/features/user-prefe export const MY_ACCOUNT_ROUTES:Ng2StateDeclaration[] = [ { name: 'my_notifications', - parent: 'root', url: '/my/notifications', component: NotificationsSettingsPageComponent, }, { name: 'user_notifications', - parent: 'root', url: '/users/:userId/edit/notifications', component: NotificationsSettingsPageComponent, }, diff --git a/frontend/src/app/features/work-packages/components/back-routing/back-button.component.html b/frontend/src/app/features/work-packages/components/back-routing/back-button.component.html index 4973c83ec8..d418c128b0 100644 --- a/frontend/src/app/features/work-packages/components/back-routing/back-button.component.html +++ b/frontend/src/app/features/work-packages/components/back-routing/back-button.component.html @@ -1,5 +1,6 @@ -