Merge branch 'dev' into feature/file-links

pull/10133/head
Christophe Bliard 3 years ago
commit 356360ef72
No known key found for this signature in database
GPG Key ID: 2BC07603210C3FA4
  1. 2
      .github/workflows/pullpreview.yml
  2. 2
      .github/workflows/test-core.yml
  3. 3
      .gitignore
  4. 5
      .rubocop.yml
  5. 5
      Gemfile
  6. 36
      Gemfile.lock
  7. 2
      app/cells/enumerations/table_cell.rb
  8. 2
      app/cells/oauth/applications/table_cell.rb
  9. 2
      app/cells/statuses/table_cell.rb
  10. 19
      app/controllers/groups_controller.rb
  11. 1
      app/controllers/repositories_controller.rb
  12. 23
      app/helpers/groups_helper.rb
  13. 34
      app/helpers/members_helper.rb
  14. 2
      app/mailers/member_mailer.rb
  15. 4
      app/models/attribute_help_text.rb
  16. 2
      app/models/enumeration.rb
  17. 9
      app/models/member.rb
  18. 3
      app/models/member_role.rb
  19. 73
      app/models/members/roles_diff.rb
  20. 4
      app/models/permitted_params.rb
  21. 5
      app/models/principal.rb
  22. 2
      app/models/principals/scopes/visible.rb
  23. 9
      app/models/projects/status.rb
  24. 2
      app/models/queries/filters/available_filters.rb
  25. 2
      app/models/queries/members/filters/principal_filter.rb
  26. 2
      app/models/queries/work_packages/filter/project_filter.rb
  27. 23
      app/models/query.rb
  28. 13
      app/models/query/results.rb
  29. 9
      app/models/setting.rb
  30. 5
      app/models/setting/callbacks_helper.rb
  31. 2
      app/models/token/auto_login.rb
  32. 2
      app/models/token/enterprise_trial_key.rb
  33. 2
      app/models/token/hashed_token.rb
  34. 2
      app/models/token/invitation.rb
  35. 2
      app/models/token/recovery.rb
  36. 4
      app/seeders/development_data/custom_fields_seeder.rb
  37. 6
      app/services/groups/add_users_service.rb
  38. 7
      app/services/groups/concerns/membership_manipulation.rb
  39. 2
      app/services/groups/update_roles_service.rb
  40. 26
      app/views/groups/_memberships.html.erb
  41. 2
      app/views/groups/_users.html.erb
  42. 2
      app/views/groups/edit.html.erb
  43. 8
      app/views/individual_principals/_memberships.html.erb
  44. 2
      app/views/principals/_assigned_global_role.html.erb
  45. 0
      app/views/principals/_available_global_role.html.erb
  46. 13
      app/views/principals/_available_global_roles.html.erb
  47. 13
      app/views/principals/_global_roles.html.erb
  48. 0
      app/views/principals/_global_roles_header.html.erb
  49. 3
      app/views/roles/_form.html.erb
  50. 16
      app/workers/mails/member_created_job.rb
  51. 37
      app/workers/mails/member_job.rb
  52. 4
      app/workers/notifications/group_member_altered_job.rb
  53. 2
      config/application.rb
  54. 5
      config/initializers/menus.rb
  55. 3
      config/locales/crowdin/af.yml
  56. 3
      config/locales/crowdin/ar.yml
  57. 3
      config/locales/crowdin/az.yml
  58. 3
      config/locales/crowdin/bg.yml
  59. 3
      config/locales/crowdin/ca.yml
  60. 319
      config/locales/crowdin/cs.yml
  61. 3
      config/locales/crowdin/da.yml
  62. 3
      config/locales/crowdin/de.yml
  63. 3
      config/locales/crowdin/el.yml
  64. 3
      config/locales/crowdin/eo.yml
  65. 3
      config/locales/crowdin/es.yml
  66. 3
      config/locales/crowdin/et.yml
  67. 3
      config/locales/crowdin/fa.yml
  68. 3
      config/locales/crowdin/fi.yml
  69. 3
      config/locales/crowdin/fil.yml
  70. 3
      config/locales/crowdin/fr.yml
  71. 3
      config/locales/crowdin/he.yml
  72. 3
      config/locales/crowdin/hi.yml
  73. 3
      config/locales/crowdin/hr.yml
  74. 3
      config/locales/crowdin/hu.yml
  75. 3
      config/locales/crowdin/id.yml
  76. 9
      config/locales/crowdin/it.yml
  77. 3
      config/locales/crowdin/ja.yml
  78. 1
      config/locales/crowdin/js-af.yml
  79. 1
      config/locales/crowdin/js-ar.yml
  80. 1
      config/locales/crowdin/js-az.yml
  81. 1
      config/locales/crowdin/js-bg.yml
  82. 1
      config/locales/crowdin/js-ca.yml
  83. 323
      config/locales/crowdin/js-cs.yml
  84. 1
      config/locales/crowdin/js-da.yml
  85. 1
      config/locales/crowdin/js-de.yml
  86. 1
      config/locales/crowdin/js-el.yml
  87. 1
      config/locales/crowdin/js-eo.yml
  88. 1
      config/locales/crowdin/js-es.yml
  89. 1
      config/locales/crowdin/js-et.yml
  90. 1
      config/locales/crowdin/js-fa.yml
  91. 1
      config/locales/crowdin/js-fi.yml
  92. 1
      config/locales/crowdin/js-fil.yml
  93. 1
      config/locales/crowdin/js-fr.yml
  94. 1
      config/locales/crowdin/js-he.yml
  95. 1
      config/locales/crowdin/js-hi.yml
  96. 1
      config/locales/crowdin/js-hr.yml
  97. 1
      config/locales/crowdin/js-hu.yml
  98. 1
      config/locales/crowdin/js-id.yml
  99. 1
      config/locales/crowdin/js-it.yml
  100. 1
      config/locales/crowdin/js-ja.yml
  101. Some files were not shown because too many files have changed in this diff Show More

@ -28,7 +28,7 @@ jobs:
cp ./docker/prod/Dockerfile ./Dockerfile cp ./docker/prod/Dockerfile ./Dockerfile
- uses: pullpreview/action@v5 - uses: pullpreview/action@v5
with: with:
admins: crohr,HDinger,machisuji,oliverguenther,ulferts,wielinde,b12f admins: crohr,HDinger,machisuji,oliverguenther,ulferts,wielinde,b12f,cbliard
always_on: dev always_on: dev
compose_files: docker-compose.pullpreview.yml compose_files: docker-compose.pullpreview.yml
instance_type: medium_2_0 instance_type: medium_2_0

@ -80,6 +80,8 @@ jobs:
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- uses: ruby/setup-ruby@v1 - uses: ruby/setup-ruby@v1
with:
bundler-cache: true
- uses: actions/setup-node@v2 - uses: actions/setup-node@v2
with: with:
node-version: '14' node-version: '14'

3
.gitignore vendored

@ -118,3 +118,6 @@ structure.sql
# Local development direnv files # Local development direnv files
/.envrc /.envrc
/.direnv /.direnv
# lefthook.yml user override
lefthook-local.yml

@ -139,6 +139,10 @@ Rails/HttpPositionalArguments:
Exclude: Exclude:
- 'spec/requests/api/v3/**/*.rb' - 'spec/requests/api/v3/**/*.rb'
# require_dependency is an obsolete method for Rails applications running in Zeitwerk mode.
Rails/RequireDependency:
Enabled: true
# For feature specs, we tend to have longer specs that cover a larger part of the functionality. # For feature specs, we tend to have longer specs that cover a larger part of the functionality.
# This is done for multiple reasons: # This is done for multiple reasons:
# * performance, as setting up integration tests is costly # * performance, as setting up integration tests is costly
@ -194,6 +198,7 @@ RSpec/NamedSubject:
RSpec/ContextWording: RSpec/ContextWording:
Prefixes: Prefixes:
- as
- when - when
- with - with
- without - without

@ -121,7 +121,7 @@ gem 'rack-protection', '~> 2.1.0'
# It allows whitelisting, blacklisting, throttling, and tracking based # It allows whitelisting, blacklisting, throttling, and tracking based
# on arbitrary properties of the request. # on arbitrary properties of the request.
# https://github.com/kickstarter/rack-attack # https://github.com/kickstarter/rack-attack
gem 'rack-attack', '~> 6.5.0' gem 'rack-attack', '~> 6.6.0'
# CSP headers # CSP headers
gem 'secure_headers', '~> 6.3.0' gem 'secure_headers', '~> 6.3.0'
@ -279,6 +279,9 @@ group :development, :test do
gem 'pry-rescue', '~> 1.5.2' gem 'pry-rescue', '~> 1.5.2'
gem 'pry-stack_explorer', '~> 0.6.0' gem 'pry-stack_explorer', '~> 0.6.0'
# git hooks manager
gem 'lefthook'
# Brakeman scanner # Brakeman scanner
gem 'brakeman', '~> 5.2.0' gem 'brakeman', '~> 5.2.0'
gem 'danger-brakeman' gem 'danger-brakeman'

@ -283,8 +283,8 @@ GEM
awesome_nested_set (3.4.0) awesome_nested_set (3.4.0)
activerecord (>= 4.0.0, < 7.0) activerecord (>= 4.0.0, < 7.0)
aws-eventstream (1.2.0) aws-eventstream (1.2.0)
aws-partitions (1.550.0) aws-partitions (1.553.0)
aws-sdk-core (3.125.5) aws-sdk-core (3.126.0)
aws-eventstream (~> 1, >= 1.0.2) aws-eventstream (~> 1, >= 1.0.2)
aws-partitions (~> 1, >= 1.525.0) aws-partitions (~> 1, >= 1.525.0)
aws-sigv4 (~> 1.1) aws-sigv4 (~> 1.1)
@ -305,7 +305,7 @@ GEM
bindata (2.4.10) bindata (2.4.10)
binding_of_caller (1.0.0) binding_of_caller (1.0.0)
debug_inspector (>= 0.0.1) debug_inspector (>= 0.0.1)
bootsnap (1.10.2) bootsnap (1.10.3)
msgpack (~> 1.2) msgpack (~> 1.2)
brakeman (5.2.1) brakeman (5.2.1)
browser (5.3.1) browser (5.3.1)
@ -549,7 +549,7 @@ GEM
httpclient (2.8.3) httpclient (2.8.3)
i18n (1.9.1) i18n (1.9.1)
concurrent-ruby (~> 1.0) concurrent-ruby (~> 1.0)
i18n-js (3.9.0) i18n-js (3.9.1)
i18n (>= 0.6.6) i18n (>= 0.6.6)
icalendar (2.7.1) icalendar (2.7.1)
ice_cube (~> 0.16) ice_cube (~> 0.16)
@ -579,6 +579,7 @@ GEM
open4 (~> 1.0) open4 (~> 1.0)
launchy (2.5.0) launchy (2.5.0)
addressable (~> 2.7) addressable (~> 2.7)
lefthook (0.7.7)
letter_opener (1.7.0) letter_opener (1.7.0)
launchy (~> 2.2) launchy (~> 2.2)
listen (3.7.1) listen (3.7.1)
@ -668,7 +669,7 @@ GEM
hashery (~> 2.0) hashery (~> 2.0)
ruby-rc4 ruby-rc4
ttfunk ttfunk
pg (1.3.0) pg (1.3.1)
plaintext (0.3.4) plaintext (0.3.4)
activesupport (> 2.2.1) activesupport (> 2.2.1)
nokogiri (~> 1.10, >= 1.10.4) nokogiri (~> 1.10, >= 1.10.4)
@ -717,7 +718,7 @@ GEM
rack (2.2.3) rack (2.2.3)
rack-accept (0.4.5) rack-accept (0.4.5)
rack (>= 0.4) rack (>= 0.4)
rack-attack (6.5.0) rack-attack (6.6.0)
rack (>= 1.0, < 3) rack (>= 1.0, < 3)
rack-cors (1.1.1) rack-cors (1.1.1)
rack (>= 2.0.0) rack (>= 2.0.0)
@ -808,7 +809,7 @@ GEM
rspec-core (~> 3.10.0) rspec-core (~> 3.10.0)
rspec-expectations (~> 3.10.0) rspec-expectations (~> 3.10.0)
rspec-mocks (~> 3.10.0) rspec-mocks (~> 3.10.0)
rspec-core (3.10.1) rspec-core (3.10.2)
rspec-support (~> 3.10.0) rspec-support (~> 3.10.0)
rspec-expectations (3.10.2) rspec-expectations (3.10.2)
diff-lcs (>= 1.2.0, < 2.0) diff-lcs (>= 1.2.0, < 2.0)
@ -827,7 +828,7 @@ GEM
rspec-retry (0.6.2) rspec-retry (0.6.2)
rspec-core (> 3.3) rspec-core (> 3.3)
rspec-support (3.10.3) rspec-support (3.10.3)
rubocop (1.25.0) rubocop (1.25.1)
parallel (~> 1.10) parallel (~> 1.10)
parser (>= 3.1.0.0) parser (>= 3.1.0.0)
rainbow (>= 2.2.2, < 4.0) rainbow (>= 2.2.2, < 4.0)
@ -880,16 +881,16 @@ GEM
rexml (~> 3.2, >= 3.2.5) rexml (~> 3.2, >= 3.2.5)
rubyzip (>= 1.2.2) rubyzip (>= 1.2.2)
semantic (1.6.1) semantic (1.6.1)
sentry-delayed_job (5.0.1) sentry-delayed_job (5.0.2)
delayed_job (>= 4.0) delayed_job (>= 4.0)
sentry-ruby-core (~> 5.0.1) sentry-ruby-core (~> 5.0.2)
sentry-rails (5.0.1) sentry-rails (5.0.2)
railties (>= 5.0) railties (>= 5.0)
sentry-ruby-core (~> 5.0.1) sentry-ruby-core (~> 5.0.2)
sentry-ruby (5.0.1) sentry-ruby (5.0.2)
concurrent-ruby (~> 1.0, >= 1.0.2) concurrent-ruby (~> 1.0, >= 1.0.2)
sentry-ruby-core (= 5.0.1) sentry-ruby-core (= 5.0.2)
sentry-ruby-core (5.0.1) sentry-ruby-core (5.0.2)
concurrent-ruby concurrent-ruby
shoulda-context (2.0.0) shoulda-context (2.0.0)
shoulda-matchers (5.1.0) shoulda-matchers (5.1.0)
@ -969,7 +970,7 @@ GEM
activerecord (>= 4.2) activerecord (>= 4.2)
xpath (3.2.0) xpath (3.2.0)
nokogiri (~> 1.8) nokogiri (~> 1.8)
zeitwerk (2.5.3) zeitwerk (2.5.4)
PLATFORMS PLATFORMS
ruby ruby
@ -1034,6 +1035,7 @@ DEPENDENCIES
json_spec (~> 1.1.4) json_spec (~> 1.1.4)
ladle ladle
launchy (~> 2.5.0) launchy (~> 2.5.0)
lefthook
letter_opener letter_opener
listen (~> 3.7.0) listen (~> 3.7.0)
livingstyleguide (~> 2.1.0) livingstyleguide (~> 2.1.0)
@ -1086,7 +1088,7 @@ DEPENDENCIES
puffing-billy (~> 2.4.0) puffing-billy (~> 2.4.0)
puma (~> 5.5) puma (~> 5.5)
puma-plugin-statsd (~> 2.0) puma-plugin-statsd (~> 2.0)
rack-attack (~> 6.5.0) rack-attack (~> 6.6.0)
rack-cors (~> 1.1.1) rack-cors (~> 1.1.1)
rack-mini-profiler rack-mini-profiler
rack-protection (~> 2.1.0) rack-protection (~> 2.1.0)

@ -1,5 +1,3 @@
require_dependency 'enumerations/row_cell'
module Enumerations module Enumerations
class TableCell < ::TableCell class TableCell < ::TableCell
def initial_sort def initial_sort

@ -1,5 +1,3 @@
require_dependency 'oauth/applications/row_cell'
module OAuth module OAuth
module Applications module Applications
class TableCell < ::TableCell class TableCell < ::TableCell

@ -1,5 +1,3 @@
require_dependency 'statuses/row_cell'
module Statuses module Statuses
class TableCell < ::TableCell class TableCell < ::TableCell
def initial_sort def initial_sort

@ -75,8 +75,6 @@ class GroupsController < ApplicationController
# GET /groups/1/edit # GET /groups/1/edit
def edit def edit
@group = Group.includes(:members, :users).find(params[:id]) @group = Group.includes(:members, :users).find(params[:id])
set_filters_for_user_autocompleter
end end
# POST /groups # POST /groups
@ -154,7 +152,7 @@ class GroupsController < ApplicationController
end end
def create_memberships def create_memberships
membership_params = permitted_params.group_membership[:new_membership] membership_params = permitted_params.group_membership[:membership]
service_call = Members::CreateService service_call = Members::CreateService
.new(user: current_user) .new(user: current_user)
@ -176,12 +174,13 @@ class GroupsController < ApplicationController
end end
def destroy_membership def destroy_membership
member = Member.find(params[:membership_id])
Members::DeleteService Members::DeleteService
.new(model: Member.find(params[:membership_id]), user: current_user) .new(model: member, user: current_user)
.call .call
flash[:notice] = I18n.t :notice_successful_delete flash[:notice] = I18n.t :notice_successful_delete
redirect_to controller: '/groups', action: 'edit', id: @group, tab: 'memberships' redirect_to controller: '/groups', action: 'edit', id: @group, tab: redirected_to_tab(member)
end end
protected protected
@ -222,7 +221,15 @@ class GroupsController < ApplicationController
flash[:error] = service_call.errors.full_messages.join("\n") flash[:error] = service_call.errors.full_messages.join("\n")
end end
redirect_to controller: '/groups', action: 'edit', id: @group, tab: 'memberships' redirect_to controller: '/groups', action: 'edit', id: @group, tab: redirected_to_tab(service_call.result)
end
def redirected_to_tab(membership)
if membership.project
'memberships'
else
'global_roles'
end
end end
def respond_users_altered(service_call) def respond_users_altered(service_call)

@ -31,7 +31,6 @@
require 'SVG/Graph/Bar' require 'SVG/Graph/Bar'
require 'SVG/Graph/BarHorizontal' require 'SVG/Graph/BarHorizontal'
require 'digest/sha1' require 'digest/sha1'
require_dependency 'open_project/scm/adapters'
class ChangesetNotFound < StandardError class ChangesetNotFound < StandardError
end end

@ -29,32 +29,39 @@
#++ #++
module GroupsHelper module GroupsHelper
def group_settings_tabs def group_settings_tabs(group)
[ [
{ {
name: 'general', name: 'general',
partial: 'groups/general', partial: 'groups/general',
path: edit_group_path(@group), path: edit_group_path(group),
label: :label_general label: :label_general
}, },
{ {
name: 'users', name: 'users',
partial: 'groups/users', partial: 'groups/users',
path: edit_group_path(@group, tab: :users), path: edit_group_path(group, tab: :users),
label: :label_user_plural label: :label_user_plural
}, },
{ {
name: 'memberships', name: 'memberships',
partial: 'groups/memberships', partial: 'groups/memberships',
path: edit_group_path(@group, tab: :memberships), path: edit_group_path(group, tab: :memberships),
label: :label_project_plural label: :label_project_plural
},
{
name: 'global_roles',
partial: 'principals/global_roles',
path: edit_group_path(group, tab: :global_roles),
label: :label_global_roles
} }
] ]
end end
def set_filters_for_user_autocompleter def autocompleter_filters(group)
@autocompleter_filters = [] [
@autocompleter_filters.push({ selector: 'status', operator: '=', values: ['active', 'invited'] }) { selector: 'status', operator: '=', values: ['active', 'invited'] },
@autocompleter_filters.push({ selector: 'group', operator: '!', values: [@group.id] }) { selector: 'group', operator: '!', values: [group.id] }
]
end end
end end

@ -37,12 +37,42 @@ module MembersHelper
def global_member_role_deletion_link(member, role) def global_member_role_deletion_link(member, role)
if member.roles.length == 1 if member.roles.length == 1
link_to('', link_to('',
user_membership_path(user_id: member.user_id, id: member.id), principal_membership_path(member.principal, member),
{ method: :delete, class: 'icon icon-delete', title: t(:button_delete) }) { method: :delete, class: 'icon icon-delete', title: t(:button_delete) })
else else
link_to('', link_to('',
user_membership_path(user_id: member.user_id, id: member.id, 'membership[role_ids]' => member.roles - [role]), principal_membership_path(member.principal, member, 'membership[role_ids]' => member.roles - [role]),
{ method: :patch, class: 'icon icon-delete', title: t(:button_delete) }) { method: :patch, class: 'icon icon-delete', title: t(:button_delete) })
end end
end end
##
# Decorate the form_for helper for membership of a user or a group to a global
# role.
def global_role_membership_form_for(principal, global_member, options = {}, &block)
args =
if global_member
{ url: principal_membership_path(principal, global_member), method: :patch }
else
{ url: principal_memberships_path(principal), method: :post }
end
form_for(:principal_roles, args.merge(options), &block)
end
def principal_membership_path(principal, global_member, options = {})
if principal.is_a?(Group)
membership_of_group_path(principal, global_member, options)
else
user_membership_path(principal, global_member, options)
end
end
def principal_memberships_path(principal, options = {})
if principal.is_a?(Group)
memberships_of_group_path(principal, options)
else
user_memberships_path(principal, options)
end
end
end end

@ -78,8 +78,8 @@ class MemberMailer < ApplicationMailer
end end
def send_mail(current_user, member, subject, message) def send_mail(current_user, member, subject, message)
in_member_locale(member) do
User.execute_as(current_user) do User.execute_as(current_user) do
in_member_locale(member) do
message_id member, current_user message_id member, current_user
@roles = member.roles @roles = member.roles

@ -78,5 +78,5 @@ class AttributeHelpText < ApplicationRecord
end end
end end
require_dependency 'attribute_help_text/work_package' require 'attribute_help_text/work_package'
require_dependency 'attribute_help_text/project' require 'attribute_help_text/project'

@ -182,5 +182,5 @@ end
# Force load the subclasses in development mode # Force load the subclasses in development mode
%w(time_entry_activity issue_priority).each do |enum_subclass| %w(time_entry_activity issue_priority).each do |enum_subclass|
require_dependency enum_subclass require enum_subclass
end end

@ -34,7 +34,7 @@ class Member < ApplicationRecord
extend DeprecatedAlias extend DeprecatedAlias
belongs_to :principal, foreign_key: 'user_id' belongs_to :principal, foreign_key: 'user_id'
has_many :member_roles, dependent: :destroy, autosave: true, validate: false has_many :member_roles, dependent: :destroy, autosave: true, validate: false
has_many :roles, through: :member_roles has_many :roles, -> { distinct }, through: :member_roles
belongs_to :project belongs_to :project
validates_presence_of :principal validates_presence_of :principal
@ -70,6 +70,13 @@ class Member < ApplicationRecord
member_roles.detect(&:inherited_from).nil? member_roles.detect(&:inherited_from).nil?
end end
def deletable_role?(role)
member_roles
.only_inherited
.where(role: role)
.none?
end
def include?(principal) def include?(principal)
if user? if user?
self.principal == principal self.principal == principal

@ -32,6 +32,9 @@ class MemberRole < ApplicationRecord
belongs_to :member, touch: true belongs_to :member, touch: true
belongs_to :role belongs_to :role
# `inherited` is reserved ActiveRecord method
scope :only_inherited, -> { where.not(inherited_from: nil) }
validates_presence_of :role validates_presence_of :role
validate :validate_project_member_role validate :validate_project_member_role

@ -0,0 +1,73 @@
#-- 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 COPYRIGHT and LICENSE files for more details.
#++
class Members::RolesDiff
attr_reader :user_member, :group_member
def initialize(user_member, group_member)
raise ArgumentError unless user_member.project_id == group_member.project_id
@user_member = user_member
@group_member = group_member
end
def roles_created?
result == :roles_created
end
def roles_updated?
result == :roles_updated
end
def roles_changed?
result != :roles_unchanged
end
def result
@result ||=
if user_previous_member_roles_ids.empty?
:roles_created
elsif (group_roles_ids - user_previous_member_roles_ids).any?
:roles_updated
else
:roles_unchanged
end
end
private
def user_previous_member_roles_ids
Set.new(user_member.member_roles
.reject { group_member.member_roles.map(&:id).include?(_1.inherited_from) }
.map(&:role_id).uniq)
end
def group_roles_ids
Set.new(group_member.member_roles.map(&:role_id))
end
end

@ -490,10 +490,6 @@ class PermittedParams
{ membership: [ { membership: [
:project_id, :project_id,
{ role_ids: [] } { role_ids: [] }
],
new_membership: [
:project_id,
{ role_ids: [] }
] } ] }
], ],
member: [ member: [

@ -47,12 +47,15 @@ class Principal < ApplicationRecord
class_name: 'UserPreference', class_name: 'UserPreference',
foreign_key: 'user_id' foreign_key: 'user_id'
has_many :members, foreign_key: 'user_id', dependent: :destroy has_many :members, foreign_key: 'user_id', dependent: :destroy
has_many :memberships, -> { has_many :memberships,
-> {
includes(:project, :roles) includes(:project, :roles)
.where(["projects.active = ? OR project_id IS NULL", true]) .where(["projects.active = ? OR project_id IS NULL", true])
.order(Arel.sql('projects.name ASC')) .order(Arel.sql('projects.name ASC'))
# haven't been able to produce the order using hashes # haven't been able to produce the order using hashes
}, },
inverse_of: :principal,
dependent: :nullify,
class_name: 'Member', class_name: 'Member',
foreign_key: 'user_id' foreign_key: 'user_id'
has_many :projects, through: :memberships has_many :projects, through: :memberships

@ -38,7 +38,7 @@ module Principals::Scopes
class_methods do class_methods do
def visible(user = ::User.current) def visible(user = ::User.current)
if user.allowed_to_globally?(:manage_members) if user.allowed_to_globally?(:manage_members) || user.allowed_to_globally?(:manage_user)
all all
else else
in_visible_project_or_me(user) in_visible_project_or_me(user)

@ -37,5 +37,12 @@ class Projects::Status < ActiveRecord::Base
presence: true, presence: true,
uniqueness: true uniqueness: true
enum code: %i[on_track at_risk off_track] enum code: {
on_track: 0,
at_risk: 1,
off_track: 2,
not_started: 3,
finished: 4,
discontinued: 5
}
end end

@ -28,8 +28,6 @@
# See COPYRIGHT and LICENSE files for more details. # See COPYRIGHT and LICENSE files for more details.
#++ #++
require_dependency 'queries/filters'
module Queries module Queries
module Filters module Filters
module AvailableFilters module AvailableFilters

@ -35,7 +35,7 @@ class Queries::Members::Filters::PrincipalFilter < Queries::Members::Filters::Me
@allowed_values ||= begin @allowed_values ||= begin
values = Principal values = Principal
.not_locked .not_locked
.in_visible_project_or_me .visible
.map { |s| [s.name, s.id.to_s] } .map { |s| [s.name, s.id.to_s] }
.sort .sort

@ -42,7 +42,7 @@ class Queries::WorkPackages::Filter::ProjectFilter < Queries::WorkPackages::Filt
end end
def available? def available?
!project && visible_projects.exists? visible_projects.exists?
end end
def type def type

@ -43,8 +43,9 @@ class Query < ApplicationRecord
serialize :column_names, Array serialize :column_names, Array
serialize :sort_criteria, Array serialize :sort_criteria, Array
validates :name, presence: true validates :name,
validates_length_of :name, maximum: 255 presence: true,
length: { maximum: 255 }
validate :validate_work_package_filters validate :validate_work_package_filters
validate :validate_columns validate :validate_columns
@ -93,7 +94,7 @@ class Query < ApplicationRecord
end end
def add_default_filter def add_default_filter
return unless filters.blank? return if filters.present?
add_filter('status_id', 'o', ['']) add_filter('status_id', 'o', [''])
end end
@ -251,7 +252,7 @@ class Query < ApplicationRecord
def column_names=(names) def column_names=(names)
col_names = Array(names) col_names = Array(names)
.reject(&:blank?) .compact_blank
.map(&:to_sym) .map(&:to_sym)
# Set column_names to blank/nil if it is equal to the default columns # Set column_names to blank/nil if it is equal to the default columns
@ -335,7 +336,7 @@ class Query < ApplicationRecord
statement_filters statement_filters
.map { |filter| "(#{filter.where})" } .map { |filter| "(#{filter.where})" }
.reject(&:empty?) .compact_blank
.join(' AND ') .join(' AND ')
end end
@ -364,7 +365,7 @@ class Query < ApplicationRecord
end end
def project_limiting_filter def project_limiting_filter
return if subproject_filters_involved? return if project_filter_set?
subproject_filter = Queries::WorkPackages::Filter::SubprojectFilter.create! subproject_filter = Queries::WorkPackages::Filter::SubprojectFilter.create!
subproject_filter.context = self subproject_filter.context = self
@ -381,10 +382,14 @@ class Query < ApplicationRecord
## ##
# Determine whether there are explicit filters # Determine whether there are explicit filters
# on whether work packages from subprojects are used # on whether work packages from
def subproject_filters_involved? # * subprojects
# * other projects
# are used.
def project_filter_set?
filters.any? do |filter| filters.any? do |filter|
filter.is_a?(::Queries::WorkPackages::Filter::SubprojectFilter) filter.is_a?(::Queries::WorkPackages::Filter::SubprojectFilter) ||
filter.is_a?(::Queries::WorkPackages::Filter::ProjectFilter)
end end
end end

@ -62,19 +62,8 @@ class ::Query::Results
.order(sort_criteria_array) .order(sort_criteria_array)
end end
def versions
scope = Version
.visible
if query.project && (limiting_filter = query.project_limiting_filter)
scope.where(limiting_filter.where)
end
scope
end
def order_option def order_option
order_option = [group_by_sort].reject(&:blank?).join(', ') order_option = [group_by_sort].compact_blank.join(', ')
if order_option.blank? if order_option.blank?
nil nil

@ -29,6 +29,9 @@
#++ #++
class Setting < ApplicationRecord class Setting < ApplicationRecord
extend CallbacksHelper
extend Aliases
DATE_FORMATS = [ DATE_FORMATS = [
'%Y-%m-%d', '%Y-%m-%d',
'%d/%m/%Y', '%d/%m/%Y',
@ -338,10 +341,4 @@ class Setting < ApplicationRecord
value value
end end
end end
require_dependency 'setting/callbacks'
extend Callbacks
require_dependency 'setting/aliases'
extend Aliases
end end

@ -29,12 +29,15 @@
#++ #++
class Setting class Setting
module Callbacks module CallbacksHelper
# register a callback for a setting named #name # register a callback for a setting named #name
def register_callback(name, &callback) def register_callback(name, &callback)
# register the block with the underlying notifications system # register the block with the underlying notifications system
notifier.subscribe(notification_event_for(name), &callback) notifier.subscribe(notification_event_for(name), &callback)
end end
# register_callback is not used anymore in our code
# it can be removed along with fire_callbacks in next major version
OpenProject::Deprecation.deprecate_method(self, :register_callback)
# instructs the underlying notifications system to publish all setting events for setting #name # instructs the underlying notifications system to publish all setting events for setting #name
# based on the new and old setting objects different events can be triggered # based on the new and old setting objects different events can be triggered

@ -28,8 +28,6 @@
# See COPYRIGHT and LICENSE files for more details. # See COPYRIGHT and LICENSE files for more details.
#++ #++
require_dependency 'token/hashed_token'
module Token module Token
class AutoLogin < HashedToken class AutoLogin < HashedToken
end end

@ -28,8 +28,6 @@
# See COPYRIGHT and LICENSE files for more details. # See COPYRIGHT and LICENSE files for more details.
#++ #++
require_dependency 'token/base'
module Token module Token
class EnterpriseTrialKey < Base class EnterpriseTrialKey < Base
include ExpirableToken include ExpirableToken

@ -16,8 +16,6 @@
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require_dependency 'token/base'
module Token module Token
class HashedToken < Base class HashedToken < Base
# Allow access to the plain value during initial access / creation of the token # Allow access to the plain value during initial access / creation of the token

@ -28,8 +28,6 @@
# See COPYRIGHT and LICENSE files for more details. # See COPYRIGHT and LICENSE files for more details.
#++ #++
require_dependency 'token/base'
module Token module Token
class Invitation < Base class Invitation < Base
include ExpirableToken include ExpirableToken

@ -28,8 +28,6 @@
# See COPYRIGHT and LICENSE files for more details. # See COPYRIGHT and LICENSE files for more details.
#++ #++
require_dependency 'token/base'
module Token module Token
class Recovery < Base class Recovery < Base
include ExpirableToken include ExpirableToken

@ -47,14 +47,14 @@ module DevelopmentData
def create_types!(cfs) def create_types!(cfs)
# Create ALL CFs types # Create ALL CFs types
non_req_cfs = cfs.reject(&:is_required).map { |cf| "custom_field_#{cf.id}" } non_req_cfs = cfs.reject(&:is_required).map { |cf| "custom_field_#{cf.id}" }
type = build :type, name: 'All CFS' type = FactoryBot.build :type, name: 'All CFS'
extend_group(type, ['Custom fields', non_req_cfs]) extend_group(type, ['Custom fields', non_req_cfs])
type.save! type.save!
print_status '.' print_status '.'
# Create type # Create type
req_cfs = cfs.select(&:is_required).map { |cf| "custom_field_#{cf.id}" } req_cfs = cfs.select(&:is_required).map { |cf| "custom_field_#{cf.id}" }
type_req = build :type, name: 'Required CF' type_req = FactoryBot.build :type, name: 'Required CF'
extend_group(type_req, ['Custom fields', req_cfs]) extend_group(type_req, ['Custom fields', req_cfs])
type_req.save! type_req.save!
print_status '.' print_status '.'

@ -85,7 +85,7 @@ module Groups
SELECT members.id, found_users.user_id, members.project_id SELECT members.id, found_users.user_id, members.project_id
FROM members, found_users, group_memberships FROM members, found_users, group_memberships
WHERE members.user_id = found_users.user_id WHERE members.user_id = found_users.user_id
AND members.project_id = group_memberships.project_id AND members.project_id IS NOT DISTINCT FROM group_memberships.project_id
AND members.id IS NOT NULL AND members.id IS NOT NULL
), ),
-- insert the group user into members -- insert the group user into members
@ -93,7 +93,7 @@ module Groups
INSERT INTO #{Member.table_name} (project_id, user_id, updated_at, created_at) INSERT INTO #{Member.table_name} (project_id, user_id, updated_at, created_at)
SELECT group_memberships.project_id, found_users.user_id, (SELECT time from timestamp), (SELECT time from timestamp) SELECT group_memberships.project_id, found_users.user_id, (SELECT time from timestamp), (SELECT time from timestamp)
FROM found_users, group_memberships FROM found_users, group_memberships
WHERE NOT EXISTS (SELECT 1 FROM existing_members WHERE existing_members.user_id = found_users.user_id AND existing_members.project_id = group_memberships.project_id) WHERE NOT EXISTS (SELECT 1 FROM existing_members WHERE existing_members.user_id = found_users.user_id AND existing_members.project_id IS NOT DISTINCT FROM group_memberships.project_id)
ON CONFLICT(project_id, user_id) DO NOTHING ON CONFLICT(project_id, user_id) DO NOTHING
RETURNING id, user_id, project_id RETURNING id, user_id, project_id
), ),
@ -103,7 +103,7 @@ module Groups
SELECT members.id, group_roles.role_id, group_roles.member_role_id SELECT members.id, group_roles.role_id, group_roles.member_role_id
FROM group_roles FROM group_roles
JOIN JOIN
(SELECT * FROM new_members UNION SELECT * from existing_members) members ON group_roles.project_id = members.project_id (SELECT * FROM new_members UNION SELECT * from existing_members) members ON group_roles.project_id IS NOT DISTINCT FROM members.project_id
-- Ignore if the role was already inserted by us -- Ignore if the role was already inserted by us
ON CONFLICT DO NOTHING ON CONFLICT DO NOTHING
RETURNING id, member_id, role_id RETURNING id, member_id, role_id

@ -78,7 +78,12 @@ module Groups::Concerns
end end
def send_notifications(member_ids, message, send_notifications) def send_notifications(member_ids, message, send_notifications)
Notifications::GroupMemberAlteredJob.perform_later(member_ids, message, send_notifications) Notifications::GroupMemberAlteredJob.perform_later(
User.current,
member_ids,
message,
send_notifications
)
end end
end end
end end

@ -68,7 +68,7 @@ module Groups
SELECT id SELECT id
FROM #{Member.table_name} FROM #{Member.table_name}
WHERE user_id IN (SELECT user_id FROM group_users) WHERE user_id IN (SELECT user_id FROM group_users)
AND project_id = :project_id AND project_id IS NOT DISTINCT FROM :project_id
), ),
-- select all member roles the group has for the member -- select all member roles the group has for the member
group_member_roles AS ( group_member_roles AS (

@ -28,6 +28,7 @@ See COPYRIGHT and LICENSE files for more details.
++#%> ++#%>
<% roles = Role.givable %> <% roles = Role.givable %>
<% projects = Project.active.order(Arel.sql('lft')) %> <% projects = Project.active.order(Arel.sql('lft')) %>
<% memberships = @group.memberships %>
<div class="grid-block"> <div class="grid-block">
<div class="grid-content"> <div class="grid-content">
@ -64,15 +65,19 @@ See COPYRIGHT and LICENSE files for more details.
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<% @group.memberships.each do |membership| %> <% memberships.where.not(project: nil).each do |membership| %>
<% next if membership.new_record? %> <% next if membership.new_record? %>
<tr id="member-<%= membership.id %>" class="class"> <tr id="member-<%= membership.id %>" class="member">
<td class="project"><%= link_to membership.project.name, project_members_path(membership.project) %></td> <td class="project">
<%= link_to membership.project.name, project_members_path(membership.project) %>
</td>
<td class="roles"> <td class="roles">
<span id="member-<%= membership.id %>-roles"><%=h membership.roles.sort.collect(&:to_s).join(', ') %></span> <span id="member-<%= membership.id %>-roles">
<%=h membership.roles.sort.collect(&:to_s).join(', ') %>
</span>
<%= labelled_tabular_form_for(:membership, <%= labelled_tabular_form_for(:membership,
url: membership_of_group_path(@group, membership), url: membership_of_group_path(@group, membership),
method: :put, method: :patch,
html: { html: {
id: "member-#{membership.id}-roles-form", id: "member-#{membership.id}-roles-form",
style: 'display:none;' style: 'display:none;'
@ -83,7 +88,8 @@ See COPYRIGHT and LICENSE files for more details.
role.id, role.id,
membership.roles.include?(role), membership.roles.include?(role),
role.name, role.name,
no_label: true no_label: true,
id: nil
%> %>
<%= role %> <%= role %>
</label> </label>
@ -104,8 +110,8 @@ See COPYRIGHT and LICENSE files for more details.
class: 'icon icon-remove' %> class: 'icon icon-remove' %>
</td> </td>
</tr> </tr>
</tbody>
<% end %> <% end %>
</tbody>
</table> </table>
</div> </div>
@ -119,12 +125,12 @@ See COPYRIGHT and LICENSE files for more details.
<%= styled_form_tag(memberships_of_group_path(@group), method: :post) do %> <%= styled_form_tag(memberships_of_group_path(@group), method: :post) do %>
<fieldset class="form--fieldset add-membership-form-fieldset"> <fieldset class="form--fieldset add-membership-form-fieldset">
<legend class="form--fieldset-legend"><%=t(:label_project_new)%></legend> <legend class="form--fieldset-legend"><%=t(:label_project_new)%></legend>
<%= label_tag "new_membership_project_id", t(:description_choose_project), class: "hidden-for-sighted" %> <%= label_tag "membership_project_id", t(:description_choose_project), class: "hidden-for-sighted" %>
<%= styled_select_tag 'new_membership[project_id]', options_for_membership_project_select(@group, projects) %> <%= styled_select_tag 'membership[project_id]', options_for_membership_project_select(@group, projects) %>
<div class="form--field -vertical"> <div class="form--field -vertical">
<%= styled_label_tag nil, "#{t(:label_role_plural)}:" %> <%= styled_label_tag nil, "#{t(:label_role_plural)}:" %>
<div class="form--field-container -vertical"> <div class="form--field-container -vertical">
<%= labeled_check_box_tags 'new_membership[role_ids][]', roles %> <%= labeled_check_box_tags 'membership[role_ids][]', roles %>
</div> </div>
</div> </div>
<div><%= styled_button_tag t(:button_add), class: '-highlight -with-icon icon-checkmark' %></div> <div><%= styled_button_tag t(:button_add), class: '-highlight -with-icon icon-checkmark' %></div>

@ -55,7 +55,7 @@ See COPYRIGHT and LICENSE files for more details.
<div class="form--field -vertical"> <div class="form--field -vertical">
<%= hidden_field_tag :user_ids, nil %> <%= hidden_field_tag :user_ids, nil %>
<user-autocompleter data-update-input="user_ids" <user-autocompleter data-update-input="user_ids"
data-additional-filter="<%= @autocompleter_filters&.to_json %>" data-additional-filter="<%= autocompleter_filters(@group).to_json %>"
class="new-group-members--autocomplete"> class="new-group-members--autocomplete">
</user-autocompleter> </user-autocompleter>
</div> </div>

@ -50,4 +50,4 @@ See COPYRIGHT and LICENSE files for more details.
</li> </li>
<% end %> <% end %>
<% end %> <% end %>
<%= render_tabs group_settings_tabs %> <%= render_tabs group_settings_tabs(@group) %>

@ -83,10 +83,12 @@ See COPYRIGHT and LICENSE files for more details.
</span> </span>
<%= labelled_tabular_form_for(:membership, <%= labelled_tabular_form_for(:membership,
url: polymorphic_path([@individual_principal, :membership], id: membership), url: polymorphic_path([@individual_principal, :membership], id: membership),
html: { id: "member-#{membership.id}-roles-form", method: :patch,
html: {
id: "member-#{membership.id}-roles-form",
class: "member-#{membership.id}--edit-toggle-item", class: "member-#{membership.id}--edit-toggle-item",
style: 'display:none;'}, style: 'display:none;'
method: :patch) do |f| %> }) do |f| %>
<div> <div>
<% roles.each do |role| %> <% roles.each do |role| %>
<label class="form--label-with-check-box"> <label class="form--label-with-check-box">

@ -32,6 +32,6 @@ See COPYRIGHT and LICENSE files for more details.
<%=h role %> <%=h role %>
</td> </td>
<td class="buttons"> <td class="buttons">
<%= global_member_role_deletion_link(member, role) %> <%= global_member_role_deletion_link(member, role) if member.deletable_role?(role) %>
</td> </td>
</tr> </tr>

@ -31,21 +31,14 @@ See COPYRIGHT and LICENSE files for more details.
<div class="grid-content" id="available_principal_roles"> <div class="grid-content" id="available_principal_roles">
<fieldset class="form--fieldset"> <fieldset class="form--fieldset">
<legend class="form--fieldset-legend"><%= Role.model_name.human(:count => 2) %></legend> <legend class="form--fieldset-legend"><%= Role.model_name.human(count: 2) %></legend>
<% if available_roles.empty? %> <% if available_roles.empty? %>
<span id="no_additional_principal_roles"> <span id="no_additional_principal_roles">
<%= no_results_box %> <%= no_results_box %>
</span> </span>
<% else %> <% else %>
<span id="additional_principal_roles"> <span id="additional_principal_roles">
<% args = <%= global_role_membership_form_for(principal, global_member) do %>
if global_member
{ url: user_membership_path(id: global_member.id, user_id: user.id), method: :patch }
else
{ url: user_memberships_path(user_id: user.id), method: :post }
end
%>
<%= form_for(:principal_roles, **args) do %>
<% if global_member %> <% if global_member %>
<%= hidden_field_tag('membership[id]', global_member.id ) %> <%= hidden_field_tag('membership[id]', global_member.id ) %>
@ -55,7 +48,7 @@ See COPYRIGHT and LICENSE files for more details.
<% end %> <% end %>
<% available_roles.each do |role| %> <% available_roles.each do |role| %>
<%= render :partial => 'users/available_global_role', :locals => {:role => role} %> <%= render partial: 'principals/available_global_role', locals: {role: role} %>
<% end %> <% end %>
<p><br/><%= styled_button_tag t(:button_add), class: '-with-icon icon-checkmark' %></p> <p><br/><%= styled_button_tag t(:button_add), class: '-with-icon icon-checkmark' %></p>
<% end %> <% end %>

@ -27,9 +27,12 @@ See COPYRIGHT and LICENSE files for more details.
++#%> ++#%>
<%= render partial: 'global_roles_header' %> <%= render partial: 'principals/global_roles_header' %>
<% global_member = Member.global.where(principal: @user).includes(:roles).first %> <%
principal = @group || @user
global_member = Member.global.where(principal: principal).includes(:roles).first
%>
<div class="grid-block" id="principal_global_roles_content"> <div class="grid-block" id="principal_global_roles_content">
<div id="assigned_principal_roles" class="grid-content"> <div id="assigned_principal_roles" class="grid-content">
@ -59,8 +62,8 @@ See COPYRIGHT and LICENSE files for more details.
</thead> </thead>
<tbody id="table_principal_roles_body"> <tbody id="table_principal_roles_body">
<% global_member.roles.each do |role| %> <% global_member.roles.each do |role| %>
<%= render :partial => 'assigned_global_role', :locals => { :role => role, member: global_member } %> <%= render partial: 'principals/assigned_global_role', locals: { role: role, member: global_member } %>
<%end%> <% end %>
</tbody> </tbody>
</table> </table>
@ -69,5 +72,5 @@ See COPYRIGHT and LICENSE files for more details.
<% end %> <% end %>
</div> </div>
<%= render partial: 'users/available_global_roles', locals: { user: @user, global_member: global_member }%> <%= render partial: 'principals/available_global_roles', locals: { principal: principal, global_member: global_member } %>
</div> </div>

@ -27,7 +27,7 @@ See COPYRIGHT and LICENSE files for more details.
++#%> ++#%>
<%= render :partial => 'users/global_roles_header' %> <%= render partial: 'principals/global_roles_header' %>
<% roles ||= nil %> <% roles ||= nil %>
@ -66,4 +66,3 @@ See COPYRIGHT and LICENSE files for more details.
<%= render partial: "permissions", locals: {permissions: grouped_setable_permissions(role), role: role, showGlobalRole: false }%> <%= render partial: "permissions", locals: {permissions: grouped_setable_permissions(role), role: role, showGlobalRole: false }%>
</div> </div>
<% end %> <% end %>

@ -32,19 +32,11 @@ class Mails::MemberCreatedJob < Mails::MemberJob
alias_method :send_for_project_user, :send_added_project alias_method :send_for_project_user, :send_added_project
def send_for_group_user(current_user, user_member, group_member, message) def send_for_group_user(current_user, user_member, group_member, message)
if new_roles_added?(user_member, group_member) difference = Members::RolesDiff.new(user_member, group_member)
send_updated_project(current_user, user_member, message) if difference.roles_created?
elsif all_roles_added?(user_member, group_member)
send_added_project(current_user, user_member, message) send_added_project(current_user, user_member, message)
elsif difference.roles_updated?
send_updated_project(current_user, user_member, message)
end end
end end
def new_roles_added?(user_member, group_member)
(group_member.member_roles.map(&:id) - user_member.member_roles.map(&:inherited_from)).length <
group_member.member_roles.length && user_member.member_roles.any? { |mr| mr.inherited_from.nil? }
end
def all_roles_added?(user_member, group_member)
(user_member.member_roles.map(&:inherited_from) - group_member.member_roles.map(&:id)).empty?
end
end end

@ -32,18 +32,39 @@ class Mails::MemberJob < ApplicationJob
def perform(current_user:, def perform(current_user:,
member:, member:,
message: nil) message: nil)
if member.project.nil? case member.principal
send_updated_global(current_user, member, message) when Group
elsif member.principal.is_a?(Group) perform_for_group(current_user: current_user, member: member, message: message)
when User
perform_for_user(current_user: current_user, member: member, message: message)
end
end
private
def perform_for_group(current_user:,
member:,
message: nil)
every_group_user_member(member) do |user_member| every_group_user_member(member) do |user_member|
if member.project.nil?
next unless roles_changed?(user_member, member)
send_updated_global(current_user, user_member, message)
else
send_for_group_user(current_user, user_member, member, message) send_for_group_user(current_user, user_member, member, message)
end end
elsif member.principal.is_a?(User)
send_for_project_user(current_user, member, message)
end end
end end
private def perform_for_user(current_user:,
member:,
message: nil)
if member.project.nil?
send_updated_global(current_user, member, message)
else
send_for_project_user(current_user, member, message)
end
end
def send_for_group_user(_current_user, _member, _group, _message) def send_for_group_user(_current_user, _member, _group, _message)
raise NotImplementedError, "subclass responsibility" raise NotImplementedError, "subclass responsibility"
@ -95,4 +116,8 @@ class Mails::MemberJob < ApplicationJob
.where(project_id: nil, user_id: user_id) .where(project_id: nil, user_id: user_id)
.exists?("membership_#{setting}" => false) .exists?("membership_#{setting}" => false)
end end
def roles_changed?(user_member, group_member)
Members::RolesDiff.new(user_member, group_member).roles_changed?
end
end end

@ -31,7 +31,8 @@
class Notifications::GroupMemberAlteredJob < ApplicationJob class Notifications::GroupMemberAlteredJob < ApplicationJob
queue_with_priority :notification queue_with_priority :notification
def perform(members_ids, message, send_notifications) def perform(current_user, members_ids, message, send_notifications)
User.execute_as(current_user) do
each_member(members_ids) do |member| each_member(members_ids) do |member|
OpenProject::Notifications.send(event_type(member), OpenProject::Notifications.send(event_type(member),
member: member, member: member,
@ -39,6 +40,7 @@ class Notifications::GroupMemberAlteredJob < ApplicationJob
send_notifications: send_notifications) send_notifications: send_notifications)
end end
end end
end
private private

@ -160,7 +160,7 @@ module OpenProject
Rails.application.config.active_support.use_authenticated_message_encryption = true Rails.application.config.active_support.use_authenticated_message_encryption = true
# Use SHA-1 instead of MD5 to generate non-sensitive digests, such as the ETag header. # Use SHA-1 instead of MD5 to generate non-sensitive digests, such as the ETag header.
Rails.application.config.active_support.use_sha1_digests = true Rails.application.config.active_support.hash_digest_class = ::Digest::SHA1
# This option is not backwards compatible with earlier Rails versions. # This option is not backwards compatible with earlier Rails versions.
# It's best enabled when your entire app is migrated and stable on 6.0. # It's best enabled when your entire app is migrated and stable on 6.0.

@ -327,11 +327,10 @@ Redmine::MenuManager.map :admin_menu do |menu|
menu.push :ldap_authentication, menu.push :ldap_authentication,
{ controller: '/ldap_auth_sources', action: 'index' }, { controller: '/ldap_auth_sources', action: 'index' },
if: Proc.new { User.current.admin? }, if: Proc.new { User.current.admin? && !OpenProject::Configuration.disable_password_login? },
parent: :authentication, parent: :authentication,
html: { class: 'server_authentication' }, html: { class: 'server_authentication' },
last: true, last: true
if: proc { !OpenProject::Configuration.disable_password_login? }
menu.push :oauth_applications, menu.push :oauth_applications,
{ controller: '/oauth/applications', action: 'index' }, { controller: '/oauth/applications', action: 'index' },

@ -455,9 +455,12 @@ af:
code: 'Status' code: 'Status'
explanation: 'Status description' explanation: 'Status description'
codes: codes:
not_started: 'Not started'
on_track: 'On track' on_track: 'On track'
at_risk: 'At risk' at_risk: 'At risk'
off_track: 'Off track' off_track: 'Off track'
finished: 'Finished'
discontinued: 'Discontinued'
query: query:
column_names: "Kolomme" column_names: "Kolomme"
relations_to_type_column: "Relations to %{type}" relations_to_type_column: "Relations to %{type}"

@ -459,9 +459,12 @@ ar:
code: 'الحالة' code: 'الحالة'
explanation: 'Status description' explanation: 'Status description'
codes: codes:
not_started: 'Not started'
on_track: 'On track' on_track: 'On track'
at_risk: 'At risk' at_risk: 'At risk'
off_track: 'Off track' off_track: 'Off track'
finished: 'Finished'
discontinued: 'Discontinued'
query: query:
column_names: "الأعمدة" column_names: "الأعمدة"
relations_to_type_column: "Relations to %{type}" relations_to_type_column: "Relations to %{type}"

@ -455,9 +455,12 @@ az:
code: 'Status' code: 'Status'
explanation: 'Status description' explanation: 'Status description'
codes: codes:
not_started: 'Not started'
on_track: 'On track' on_track: 'On track'
at_risk: 'At risk' at_risk: 'At risk'
off_track: 'Off track' off_track: 'Off track'
finished: 'Finished'
discontinued: 'Discontinued'
query: query:
column_names: "Columns" column_names: "Columns"
relations_to_type_column: "Relations to %{type}" relations_to_type_column: "Relations to %{type}"

@ -455,9 +455,12 @@ bg:
code: 'Състояние' code: 'Състояние'
explanation: 'Status description' explanation: 'Status description'
codes: codes:
not_started: 'Not started'
on_track: 'On track' on_track: 'On track'
at_risk: 'At risk' at_risk: 'At risk'
off_track: 'Off track' off_track: 'Off track'
finished: 'Finished'
discontinued: 'Discontinued'
query: query:
column_names: "Колони" column_names: "Колони"
relations_to_type_column: "Relations to %{type}" relations_to_type_column: "Relations to %{type}"

@ -452,9 +452,12 @@ ca:
code: 'Estat' code: 'Estat'
explanation: 'Descripció de l''estat' explanation: 'Descripció de l''estat'
codes: codes:
not_started: 'Not started'
on_track: 'Pel bon camí' on_track: 'Pel bon camí'
at_risk: 'En risc' at_risk: 'En risc'
off_track: 'En mal camí' off_track: 'En mal camí'
finished: 'Finished'
discontinued: 'Discontinued'
query: query:
column_names: "Columnes" column_names: "Columnes"
relations_to_type_column: "Relacions a %{type}" relations_to_type_column: "Relacions a %{type}"

@ -63,20 +63,20 @@ cs:
main-menu-bg-color: "Barva pozadí levého menu." main-menu-bg-color: "Barva pozadí levého menu."
theme_warning: Změna motivu přepíše váš vlastní styl. Vzhled pak bude ztracen. Jste si jisti, že chcete pokračovat? theme_warning: Změna motivu přepíše váš vlastní styl. Vzhled pak bude ztracen. Jste si jisti, že chcete pokračovat?
enterprise: enterprise:
upgrade_to_ee: "Upgrade to the Enterprise Edition" upgrade_to_ee: "Upgradovat na Enterprise Edition"
add_token: "Nahrát podpůrný token Enterprise Edition" add_token: "Nahrát podpůrný token Enterprise Edition"
replace_token: "Nahradit aktuální podpůrný token" replace_token: "Nahradit aktuální podpůrný token"
order: "Order Enterprise on-premises Edition" order: "Upgradovat na Enterprise Edition on premises"
paste: "Vložte svůj podpůrný token Enterprise Edition" paste: "Vložte svůj podpůrný token Enterprise Edition"
required_for_feature: "Tato funkce je dostupná pouze s aktivním podpůrným tokenem pro Enterprise Edition." required_for_feature: "Tato funkce je dostupná pouze s aktivním podpůrným tokenem pro Enterprise Edition."
enterprise_link: "Pro více informací klikněte zde." enterprise_link: "Pro více informací klikněte zde."
start_trial: 'Start free trial' start_trial: 'Začít zkušební verzi'
book_now: 'Book now' book_now: 'Rezervujte nyní'
get_quote: 'Get a quote' get_quote: 'Získat cenovou nabídku'
buttons: buttons:
upgrade: "Upgrade now" upgrade: "Upgradovat nyní"
contact: "Contact us for a demo" contact: "Kontaktujte nás pro demo"
enterprise_info_html: "is an Enterprise <strong class='icon-medal'></strong> feature." enterprise_info_html: "je funkcí Enterprise<strong class='icon-medal'></strong>."
upgrade_info: "Please upgrade to a paid plan to activate and start using it in your team." upgrade_info: "Please upgrade to a paid plan to activate and start using it in your team."
announcements: announcements:
show_until: Ukázat až do show_until: Ukázat až do
@ -96,7 +96,7 @@ cs:
background_jobs: background_jobs:
status: status:
error_requeue: "Job experienced an error but is retrying. The error was: %{message}" error_requeue: "Job experienced an error but is retrying. The error was: %{message}"
cancelled_due_to: "Job was cancelled due to error: %{message}" cancelled_due_to: "Úkol byl zrušen z důvodu chyby: %{message}"
ldap_auth_sources: ldap_auth_sources:
technical_warning_html: | technical_warning_html: |
Tento LDAP formulář vyžaduje technické znalosti nastavení LDAP / Active Directory. Tento LDAP formulář vyžaduje technické znalosti nastavení LDAP / Active Directory.
@ -175,7 +175,7 @@ cs:
enabled_in_project: 'Povoleno v projektu' enabled_in_project: 'Povoleno v projektu'
contained_in_type: 'Obsahuje typ' contained_in_type: 'Obsahuje typ'
confirm_destroy_option: "Smazáním možnosti smažete všechny výskyty (např. v pracovních balíčcích). Opravdu ji chcete odstranit?" confirm_destroy_option: "Smazáním možnosti smažete všechny výskyty (např. v pracovních balíčcích). Opravdu ji chcete odstranit?"
reorder_alphabetical: "Reorder values alphabetically" reorder_alphabetical: "Změnit pořadí abecedně"
reorder_confirmation: "Warning: The current order of available values will be lost. Continue?" reorder_confirmation: "Warning: The current order of available values will be lost. Continue?"
tab: tab:
no_results_title_text: V současné době nejsou žádná vlastní pole. no_results_title_text: V současné době nejsou žádná vlastní pole.
@ -208,8 +208,8 @@ cs:
completed: "Smazání projektu %{name} dokončeno" completed: "Smazání projektu %{name} dokončeno"
completed_text: "Požadavek na smazání projektu '%{name}' byl dokončen." completed_text: "Požadavek na smazání projektu '%{name}' byl dokončen."
index: index:
open_as_gantt: 'Open as Gantt view' open_as_gantt: 'Otevřít jako zobrazení Gantt'
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: "Použijte toto tlačítko pro generování Ganttova zobrazení, které filtruje pracovní balíčky pro projekty viditelné na této stránce."
open_as_gantt_title_admin: "You can modify the view settings (such as selected work package types) in the administration under project settings." 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: V současné době nejsou žádné projekty no_results_title_text: V současné době nejsou žádné projekty
no_results_content_text: Vytvořit nový projekt no_results_content_text: Vytvořit nový projekt
@ -236,7 +236,7 @@ cs:
index: index:
no_results_title_text: Momentálně nejsou žádní členové součástí tohoto projektu. no_results_title_text: Momentálně nejsou žádní členové součástí tohoto projektu.
no_results_content_text: Přidání člena do projektu no_results_content_text: Přidání člena do projektu
invite_by_mail: "Send invite to %{mail}" invite_by_mail: "Poslat pozvánku do %{mail}"
my: my:
access_token: access_token:
failed_to_reset_token: "Nepodařilo se obnovit přístupový token: %{error}" failed_to_reset_token: "Nepodařilo se obnovit přístupový token: %{error}"
@ -249,23 +249,23 @@ cs:
no_results_content_text: Přidat příspěvek no_results_content_text: Přidat příspěvek
users: users:
groups: groups:
member_in_these_groups: 'This user is currently a member of the following groups:' member_in_these_groups: 'Tento uživatel je v současné době členem následujících skupin:'
no_results_title_text: This user is currently not a member in any group. no_results_title_text: Tento uživatel není v současné době členem žádné skupiny.
memberships: memberships:
no_results_title_text: Tento uživatel není v současné době členem projektu. no_results_title_text: Tento uživatel není v současné době členem projektu.
placeholder_users: placeholder_users:
right_to_manage_members_missing: > right_to_manage_members_missing: >
You are not allowed to delete the placeholder user. You do not have the right to manage members for all projects that the placeholder user is a member of. You are not allowed to delete the placeholder user. You do not have the right to manage members for all projects that the placeholder user is a member of.
delete_tooltip: "Delete placeholder user" delete_tooltip: "Odstranit placeholder uživatele"
deletion_info: deletion_info:
heading: "Delete placeholder user %{name}" heading: "Odstranit zástupného uživatele %{name}"
data_consequences: > data_consequences: >
All occurrences of the placeholder user (e.g., as assignee, responsible or other user values) will be reassigned to an account called "Deleted user". All occurrences of the placeholder user (e.g., as assignee, responsible or other user values) will be reassigned to an account called "Deleted user".
As the data of every deleted account is reassigned to this account it will not be possible to distinguish the data the user created from the data of another deleted account. As the data of every deleted account is reassigned to this account it will not be possible to distinguish the data the user created from the data of another deleted account.
irreversible: "This action is irreversible" irreversible: "Tato akce je nevratná"
confirmation: "Enter the placeholder user name %{name} to confirm the deletion." confirmation: "Enter the placeholder user name %{name} to confirm the deletion."
upsale: upsale:
title: Placeholder users title: placeholder uživatel
description: > description: >
There are multiple scenarios where you want to assign work to people that are not member of your project. It could simply be that you still need to hire the correct person for the job. Or you just don't want to give that person access to the project's information but still want track tasks assigned to that person. There are multiple scenarios where you want to assign work to people that are not member of your project. It could simply be that you still need to hire the correct person for the job. Or you just don't want to give that person access to the project's information but still want track tasks assigned to that person.
prioritiies: prioritiies:
@ -309,7 +309,7 @@ cs:
overview: overview:
no_results_title_text: Momentálně zde nejsou žádné pracovní balíčky přiřazené k této verzi. no_results_title_text: Momentálně zde nejsou žádné pracovní balíčky přiřazené k této verzi.
wiki: wiki:
page_not_editable_index: The requested page does not (yet) exist. You have been redirected to the index of all wiki pages. page_not_editable_index: Požadovaná stránka ještě neexistuje. Byli jste přesměrováni na index všech wiki stránek.
no_results_title_text: V současné době neexistují žádné Wiki stránky. no_results_title_text: V současné době neexistují žádné Wiki stránky.
index: index:
no_results_content_text: Přidat novou wiki stránku no_results_content_text: Přidat novou wiki stránku
@ -324,10 +324,10 @@ cs:
other: '%{count} potomků pracovního balíčku' other: '%{count} potomků pracovního balíčku'
bulk: bulk:
could_not_be_saved: "Následující pracovní balíčky nelze uložit:" could_not_be_saved: "Následující pracovní balíčky nelze uložit:"
none_could_be_saved: "None of the %{total} work packages could be updated." none_could_be_saved: "Žádný z %{total} pracovních balíčků nemohl být aktualizován."
x_out_of_y_could_be_saved: "%{failing} out of the %{total} work packages could not be updated while %{success} could." x_out_of_y_could_be_saved: "%{failing} z pracovních balíčků %{total} nemohl být aktualizován, zatímco %{success} může."
selected_because_descendants: "While %{selected} work packages where selected, in total %{total} work packages are affected which includes descendants." selected_because_descendants: "While %{selected} work packages where selected, in total %{total} work packages are affected which includes descendants."
descendant: "descendant of selected" descendant: "potomek vybraného"
move: move:
no_common_statuses_exists: "Pro všechny vybrané pracovní balíčky není k dispozici žádný stav. Jejich stav nelze změnit." no_common_statuses_exists: "Pro všechny vybrané pracovní balíčky není k dispozici žádný stav. Jejich stav nelze změnit."
unsupported_for_multiple_projects: 'Hromadný přesun/kopírování není podporováno pro pracovní balíčky z více projektů' unsupported_for_multiple_projects: 'Hromadný přesun/kopírování není podporováno pro pracovní balíčky z více projektů'
@ -399,7 +399,7 @@ cs:
attr_mail: "Email" attr_mail: "Email"
base_dn: "Base DN" base_dn: "Base DN"
host: "Hostitel" host: "Hostitel"
onthefly: "Automatic user creation" onthefly: "Automatické vytváření uživatele"
port: "Port" port: "Port"
changeset: changeset:
repository: "Repozitář" repository: "Repozitář"
@ -452,14 +452,17 @@ cs:
types: "Typy" types: "Typy"
versions: "Verze" versions: "Verze"
work_packages: "Pracovní balíčky" work_packages: "Pracovní balíčky"
templated: 'Template project' templated: 'Projektová šablona'
projects/status: projects/status:
code: 'Stav' code: 'Stav'
explanation: 'Status description' explanation: 'Popis stavu'
codes: codes:
not_started: 'Not started'
on_track: 'On track' on_track: 'On track'
at_risk: 'At risk' at_risk: 'At risk'
off_track: 'Off track' off_track: 'Off track'
finished: 'Finished'
discontinued: 'Discontinued'
query: query:
column_names: "Sloupce" column_names: "Sloupce"
relations_to_type_column: "Vztahy s %{type}" relations_to_type_column: "Vztahy s %{type}"
@ -524,7 +527,7 @@ cs:
parent_work_package: "Rodič" parent_work_package: "Rodič"
priority: "Priorita" priority: "Priorita"
progress: "Průběh (%)" progress: "Průběh (%)"
schedule_manually: "Manual scheduling" schedule_manually: "Manuální plánování"
spent_hours: "Strávený čas" spent_hours: "Strávený čas"
spent_time: "Strávený čas" spent_time: "Strávený čas"
subproject: "Dílčí projekt" subproject: "Dílčí projekt"
@ -551,12 +554,12 @@ cs:
cant_link_a_work_package_with_a_descendant: "Pracovní balíček nemůže být propojen s jedním z jeho podúkolů." cant_link_a_work_package_with_a_descendant: "Pracovní balíček nemůže být propojen s jedním z jeho podúkolů."
circular_dependency: "Tento vztah by vytvořil kruhovou závislost." circular_dependency: "Tento vztah by vytvořil kruhovou závislost."
confirmation: "neshoduje se s %{attribute}." confirmation: "neshoduje se s %{attribute}."
could_not_be_copied: "%{dependency} could not be (fully) copied." could_not_be_copied: "%{dependency} nemůže být (zcela) zkopírován."
does_not_exist: "neexistuje." does_not_exist: "neexistuje."
error_enterprise_only: "is only available in the OpenProject Enterprise Edition" error_enterprise_only: "je k dispozici pouze v OpenProject Enterprise Edition"
error_unauthorized: "may not be accessed." error_unauthorized: "není přístupný."
error_readonly: "was attempted to be written but is not writable." error_readonly: "was attempted to be written but is not writable."
email: "is not a valid email address." email: "není platná e-mailová adresa"
empty: "nemůže být prázdné." empty: "nemůže být prázdné."
even: "musí být sudé." even: "musí být sudé."
exclusion: "vyhrazeno." exclusion: "vyhrazeno."
@ -573,8 +576,8 @@ cs:
invalid_url: 'není platná adresa URL.' invalid_url: 'není platná adresa URL.'
invalid_url_scheme: 'není podporovaný protokol (povoleny: %{allowed_schemes}).' invalid_url_scheme: 'není podporovaný protokol (povoleny: %{allowed_schemes}).'
less_than_or_equal_to: "musí být menší než nebo rovno %{count}." less_than_or_equal_to: "musí být menší než nebo rovno %{count}."
not_available: "is not available due to a system configuration." not_available: "není k dispozici kvůli konfiguraci systému."
not_deletable: "cannot be deleted." not_deletable: "nelze odstranit"
not_current_user: "není aktuální uživatel." not_current_user: "není aktuální uživatel."
not_a_date: "není platné datum." not_a_date: "není platné datum."
not_a_datetime: "není platný čas." not_a_datetime: "není platný čas."
@ -589,7 +592,7 @@ cs:
taken: "je již použito." taken: "je již použito."
too_long: "je příliš dlouhý (maximum je %{count} znaků)." too_long: "je příliš dlouhý (maximum je %{count} znaků)."
too_short: "je příliš krátký (minimum je %{count} znaků)." too_short: "je příliš krátký (minimum je %{count} znaků)."
type_mismatch: "is not of type '%{type}'" type_mismatch: "není typu '%{type}'"
type_mismatch_nested: "is not of type '%{type}' at path '%{path}'" type_mismatch_nested: "is not of type '%{type}' at path '%{path}'"
unchangeable: "nelze změnit." unchangeable: "nelze změnit."
unknown_property: "is not a known property." unknown_property: "is not a known property."
@ -637,7 +640,7 @@ cs:
outside: 'je mimo mřížku.' outside: 'je mimo mřížku.'
end_before_start: 'konečná hodnota musí být větší než počáteční hodnota.' end_before_start: 'konečná hodnota musí být větší než počáteční hodnota.'
notifications: notifications:
at_least_one_channel: 'At least one channel for sending notifications needs to be specified.' at_least_one_channel: 'Alespoň jeden kanál pro odesílání oznámení musí být specifikován.'
attributes: attributes:
read_ian: read_ian:
read_on_creation: 'cannot be set to true on notification creation.' read_on_creation: 'cannot be set to true on notification creation.'
@ -649,7 +652,7 @@ cs:
no_notification_reason: 'cannot be blank as mail digest is chosen as a channel.' no_notification_reason: 'cannot be blank as mail digest is chosen as a channel.'
notification_settings: notification_settings:
only_one_global_setting: 'There must only be one global notification setting.' only_one_global_setting: 'There must only be one global notification setting.'
email_alerts_global: 'The email notification settings can only be set globally.' email_alerts_global: 'Nastavení e-mailových oznámení lze nastavit pouze globálně.'
format: "%{message}" format: "%{message}"
parse_schema_filter_params_service: parse_schema_filter_params_service:
attributes: attributes:
@ -658,7 +661,7 @@ cs:
invalid_values: "Hodnota není platná." invalid_values: "Hodnota není platná."
id_filter_required: "Je vyžadován filtr 'id'." id_filter_required: "Je vyžadován filtr 'id'."
project: project:
archived_ancestor: 'The project has an archived ancestor.' archived_ancestor: 'Projekt má archivovaného předka.'
foreign_wps_reference_version: 'Work packages in non descendant projects reference versions of the project or its descendants.' foreign_wps_reference_version: 'Work packages in non descendant projects reference versions of the project or its descendants.'
attributes: attributes:
types: types:
@ -688,7 +691,7 @@ cs:
queries/filters/base: queries/filters/base:
attributes: attributes:
values: values:
inclusion: "filter has invalid values." inclusion: "filtr má neplatné hodnoty."
format: "%{message}" format: "%{message}"
relation: relation:
typed_dag: typed_dag:
@ -717,13 +720,13 @@ cs:
user_preference: user_preference:
attributes: attributes:
pause_reminders: pause_reminders:
invalid_range: "can only be a valid date range." invalid_range: "může být pouze platný časový rozsah."
daily_reminders: daily_reminders:
full_hour: "can only be configured to be delivered at a full hour." full_hour: "can only be configured to be delivered at a full hour."
wiki_page: wiki_page:
attributes: attributes:
slug: slug:
undeducible: "cannot be deduced from the title '%{title}'." undeducible: "nelze odvodit z názvu '%{title}'."
work_package: work_package:
is_not_a_valid_target_for_time_entries: "Pracovní balíček #%{id} není platný cíl pro přeřazení časových záznamů." is_not_a_valid_target_for_time_entries: "Pracovní balíček #%{id} není platný cíl pro přeřazení časových záznamů."
attributes: attributes:
@ -731,7 +734,7 @@ cs:
not_start_date: "není v počátečním datu, i když je to nutné pro milníky." not_start_date: "není v počátečním datu, i když je to nutné pro milníky."
parent: parent:
cannot_be_milestone: "nemůže být milník." cannot_be_milestone: "nemůže být milník."
cannot_be_self_assigned: "cannot be assigned to itself." cannot_be_self_assigned: "nemůže být přiřazeno k sobě."
cannot_be_in_another_project: "nemůže být v jiném projektu." cannot_be_in_another_project: "nemůže být v jiném projektu."
not_a_valid_parent: "je neplatné." not_a_valid_parent: "je neplatné."
start_date: start_date:
@ -748,7 +751,7 @@ cs:
does_not_exist: "Zadaná kategorie neexistuje." does_not_exist: "Zadaná kategorie neexistuje."
estimated_hours: estimated_hours:
only_values_greater_or_equal_zeroes_allowed: "musí být větší nebo rovno 0." only_values_greater_or_equal_zeroes_allowed: "musí být větší nebo rovno 0."
readonly_status: 'The work package is in a readonly status so its attributes cannot be changed.' readonly_status: 'Pracovní balíček je ve stavu jen pro čtení, takže jeho atributy nelze změnit.'
type: type:
attributes: attributes:
attribute_groups: attribute_groups:
@ -760,9 +763,9 @@ cs:
user: user:
attributes: attributes:
base: base:
user_limit_reached: "User limit reached. No more accounts can be created on the current plan." user_limit_reached: "Byl dosažen limit uživatelů. V aktuálním plánu nelze vytvořit žádné další účty."
password_confirmation: password_confirmation:
confirmation: "Password confirmation does not match password." confirmation: "Hesla se neshodují!"
format: "%{message}" format: "%{message}"
password: password:
weak: "Musí obsahovat znaky z následujících tříd (alespoň %{min_count} z %{all_count}): %{rules}." weak: "Musí obsahovat znaky z následujících tříd (alespoň %{min_count} z %{all_count}): %{rules}."
@ -814,11 +817,11 @@ cs:
member: "Člen" member: "Člen"
news: "Novinky" news: "Novinky"
notification: notification:
one: "Notification" one: "Oznámení"
few: "Notifications" few: "Notifications"
many: "Notifications" many: "Notifications"
other: "Notifications" other: "Notifications"
placeholder_user: "Placeholder user" placeholder_user: "placeholder uživatel"
project: "Projekt" project: "Projekt"
query: "Vlastní dotaz" query: "Vlastní dotaz"
role: role:
@ -860,9 +863,9 @@ cs:
date: "Datum" date: "Datum"
default_columns: "Výchozí sloupce" default_columns: "Výchozí sloupce"
description: "Popis" description: "Popis"
derived_due_date: "Derived finish date" derived_due_date: "Derivované Datum ukončení "
derived_estimated_hours: "Derived estimated time" derived_estimated_hours: "Derivované předpokládaný čas"
derived_start_date: "Derived start date" derived_start_date: "Derivované Datum zahájení "
display_sums: "Zobrazit součty" display_sums: "Zobrazit součty"
due_date: "Datum dokončení" due_date: "Datum dokončení"
estimated_hours: "Odhadovaný čas" estimated_hours: "Odhadovaný čas"
@ -899,16 +902,16 @@ cs:
version: "Verze" version: "Verze"
work_package: "Pracovní balíček" work_package: "Pracovní balíček"
backup: backup:
label_backup_token: "Backup token" label_backup_token: "Záložní token"
label_create_token: "Create backup token" label_create_token: "Vytvořit záložní token"
label_delete_token: "Delete backup token" label_delete_token: "Odstranit záložní token"
label_reset_token: "Reset backup token" label_reset_token: "Resetovat záložní token"
label_token_users: "The following users have active backup tokens" label_token_users: "Následující uživatelé mají aktivní tokeny pro zálohy"
reset_token: reset_token:
action_create: Vytvořit action_create: Vytvořit
action_reset: Obnovit action_reset: Obnovit
heading_reset: "Reset backup token" heading_reset: "Resetovat záložní token"
heading_create: "Create backup token" heading_create: "Vytvořit záložní token"
implications: > 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. 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.
info: > info: >
@ -916,15 +919,15 @@ cs:
verification: > verification: >
Enter %{word} to confirm you want to %{action} the backup token. Enter %{word} to confirm you want to %{action} the backup token.
verification_word_reset: reset verification_word_reset: reset
verification_word_create: create verification_word_create: vytvořit
warning: > warning: >
When you create a new token you will only be allowed to request a backup after 24 hours. This is a safety measure. After that you can request a backup any time using that token. When you create a new token you will only be allowed to request a backup after 24 hours. This is a safety measure. After that you can request a backup any time using that token.
text_token_deleted: Backup token deleted. Backups are now disabled. text_token_deleted: Záložní token odstraněn. Zálohy jsou nyní zakázány.
error: error:
invalid_token: Invalid or missing backup token invalid_token: Neplatný nebo chybí záložní token
token_cooldown: The backup token will be valid in %{hours} hours. token_cooldown: Záložní token bude platný za %{hours} hodin.
backup_pending: There is already a backup pending. backup_pending: There is already a backup pending.
limit_reached: You can only do %{limit} backups per day. limit_reached: Můžete provádět pouze %{limit} záloh denně.
button_add: "Přidat" button_add: "Přidat"
button_add_comment: "Přidat komentář" button_add_comment: "Přidat komentář"
button_add_member: Přidat člena button_add_member: Přidat člena
@ -1004,7 +1007,7 @@ cs:
text_update_consent_time: Zaškrtněte toto políčko k vynucení nového souhlasu uživatele. Povolte v případě, že jste změnili právní aspekt souhlasu uvedeného výše. text_update_consent_time: Zaškrtněte toto políčko k vynucení nového souhlasu uživatele. Povolte v případě, že jste změnili právní aspekt souhlasu uvedeného výše.
update_consent_last_time: "Poslední aktualizace souhlasu: %{update_time}" update_consent_last_time: "Poslední aktualizace souhlasu: %{update_time}"
copy_project: copy_project:
title: 'Copy project "%{source_project_name}"' title: 'Kopírovat projekt "%{source_project_name}"'
started: "Začalo kopírovat projekt \"%{source_project_name}\" do \"%{target_project_name}\". Budete informováni e-mailem, jakmile bude k dispozici \"%{target_project_name}\"." started: "Začalo kopírovat projekt \"%{source_project_name}\" do \"%{target_project_name}\". Budete informováni e-mailem, jakmile bude k dispozici \"%{target_project_name}\"."
failed: "Nebylo možné zkopírovat projekt \"%{source_project_name}\"" failed: "Nebylo možné zkopírovat projekt \"%{source_project_name}\""
failed_internal: "Kopírování se nezdařilo kvůli interní chybě." failed_internal: "Kopírování se nezdařilo kvůli interní chybě."
@ -1012,9 +1015,9 @@ cs:
errors: "Chyba" errors: "Chyba"
project_custom_fields: 'Vlastní pole projektu' project_custom_fields: 'Vlastní pole projektu'
x_objects_of_this_type: x_objects_of_this_type:
zero: 'No objects of this type' zero: 'Žádné objekty tohoto typu'
one: 'One object of this type' one: 'Jeden objekt tohoto typu'
other: '%{count} objects of this type' other: '%{count} objektů tohoto typu'
text: text:
failed: "Nebylo možné zkopírovat projekt \"%{source_project_name}\" do \"%{target_project_name}\"." failed: "Nebylo možné zkopírovat projekt \"%{source_project_name}\" do \"%{target_project_name}\"."
succeeded: "Projekt \"%{source_project_name}\" zkopírován do \"%{target_project_name}\"." succeeded: "Projekt \"%{source_project_name}\" zkopírován do \"%{target_project_name}\"."
@ -1169,7 +1172,7 @@ cs:
default_status_in_progress: "Probíhá" default_status_in_progress: "Probíhá"
default_status_in_specification: "Ve specifikaci" default_status_in_specification: "Ve specifikaci"
default_status_in_testing: "V testování" default_status_in_testing: "V testování"
default_status_new: "Nové" default_status_new: "Nový"
default_status_on_hold: "Pozastaven" default_status_on_hold: "Pozastaven"
default_status_rejected: "Odmítnutý" default_status_rejected: "Odmítnutý"
default_status_scheduled: "Naplánováno" default_status_scheduled: "Naplánováno"
@ -1235,7 +1238,7 @@ cs:
add_groups: "Přidat nové skupiny atributů" add_groups: "Přidat nové skupiny atributů"
rename_groups: "Přejmenovat skupiny atributů" rename_groups: "Přejmenovat skupiny atributů"
project_filters: project_filters:
description_html: "Filtering and sorting on custom fields is an enterprise edition feature." description_html: "Filtrování a třídění vlastních polí je funkcí enterprise edice."
enumeration_activities: "Time tracking activities" enumeration_activities: "Time tracking activities"
enumeration_work_package_priorities: "Priority pracovního balíčku" enumeration_work_package_priorities: "Priority pracovního balíčku"
enumeration_reported_project_statuses: "Nahlášený stav projektu" enumeration_reported_project_statuses: "Nahlášený stav projektu"
@ -1257,7 +1260,7 @@ cs:
error_cookie_missing: 'OpenProject cookie chybí. Ujistěte se, že jsou soubory cookie povoleny, protože aplikace nebude správně fungovat.' error_cookie_missing: 'OpenProject cookie chybí. Ujistěte se, že jsou soubory cookie povoleny, protože aplikace nebude správně fungovat.'
error_custom_option_not_found: "Nastavení neexistuje." error_custom_option_not_found: "Nastavení neexistuje."
error_enterprise_activation_user_limit: "Váš účet nebyl aktivován (dosažen limit počtu uživatelů). Prosím obraťte se na správce pro získání přístupu." error_enterprise_activation_user_limit: "Váš účet nebyl aktivován (dosažen limit počtu uživatelů). Prosím obraťte se na správce pro získání přístupu."
error_enterprise_token_invalid_domain: "The Enterprise Edition is not active. Your Enterprise token's domain (%{actual}) does not match the system's host name (%{expected})." error_enterprise_token_invalid_domain: "Enterprise Edition není aktivní. Doména Tvoje Enterprise tokenu (%{actual}) neodpovídá hostiteli systému (%{expected})."
error_failed_to_delete_entry: 'Nepodařilo se odstranit tento záznam.' error_failed_to_delete_entry: 'Nepodařilo se odstranit tento záznam.'
error_in_dependent: "Chyba při pokusu o změnu závislého objektu: %{dependent_class} #%{related_id} - %{related_subject}: %{error}" error_in_dependent: "Chyba při pokusu o změnu závislého objektu: %{dependent_class} #%{related_id} - %{related_subject}: %{error}"
error_invalid_selected_value: "Neplatná vybraná hodnota." error_invalid_selected_value: "Neplatná vybraná hodnota."
@ -1302,9 +1305,9 @@ cs:
work_package_edit: 'Pracovní balíček upraven' work_package_edit: 'Pracovní balíček upraven'
work_package_note: 'Poznámka k pracovnímu balíčku přidána' work_package_note: 'Poznámka k pracovnímu balíčku přidána'
export: export:
your_work_packages_export: "Your work packages export" your_work_packages_export: "Export pracovních balíčků"
succeeded: "The export has completed successfully." succeeded: "Export úspěšně dokončen."
failed: "The export has failed: %{message}" failed: "Export selhal: %{message}"
format: format:
atom: "Atom" atom: "Atom"
csv: "CSV" csv: "CSV"
@ -1359,19 +1362,19 @@ cs:
image_conversion: image_conversion:
imagemagick: 'Imagemagick' imagemagick: 'Imagemagick'
journals: journals:
changes_retracted: "The changes were retracted." changes_retracted: "Změny byly staženy."
links: links:
configuration_guide: 'Konfigurační manuál' configuration_guide: 'Konfigurační manuál'
get_in_touch: "You have questions? Get in touch with us." get_in_touch: "Máte otázky? Spojte se s námi."
instructions_after_registration: "Můžete se přihlásit hned poté, co bude váš účet aktivovaný kliknutím na %{signin}." instructions_after_registration: "Můžete se přihlásit hned poté, co bude váš účet aktivovaný kliknutím na %{signin}."
instructions_after_logout: "Můžete se znovu přihlásit kliknutím na tlačítko %{signin}." instructions_after_logout: "Můžete se znovu přihlásit kliknutím na tlačítko %{signin}."
instructions_after_error: "Zkuste se znovu přihlásit kliknutím na %{signin}. Pokud chyba přetrvává, požádejte správce o pomoc." instructions_after_error: "Zkuste se znovu přihlásit kliknutím na %{signin}. Pokud chyba přetrvává, požádejte správce o pomoc."
menus: menus:
admin: admin:
mail_notification: "E-mailová upozornění" mail_notification: "E-mailová upozornění"
incoming_outgoing: "Incoming & Outgoing" incoming_outgoing: "Příchozí a odchozí"
quick_add: quick_add:
label: "Open quick add menu" label: "Otevřít nabídku rychlého přidání"
my_account: my_account:
access_tokens: access_tokens:
no_results: no_results:
@ -1383,15 +1386,15 @@ cs:
expiration: "Vyprší" expiration: "Vyprší"
indefinite_expiration: "Nikdy" indefinite_expiration: "Nikdy"
notifications: notifications:
send_notifications: "Send notifications for this action" send_notifications: "Odeslat oznámení pro tuto akci"
work_packages: work_packages:
subject: subject:
created: "The work package was created." created: "Pracovní balíček byl vytvořen."
assigned: "You have been assigned to %{work_package}" assigned: "Byli jste přiřazeni k %{work_package}"
subscribed: "You subscribed to %{work_package}" subscribed: "Přihlásili jste k odběru %{work_package}"
mentioned: "You have been mentioned in %{work_package}" mentioned: "Byli jste zmíněni v %{work_package}"
responsible: "You have become accountable for %{work_package}" responsible: "Stali jste se odpovědnými za %{work_package}"
watched: "You are watching %{work_package}" watched: "Sledujete %{work_package}"
update_info_mail: update_info_mail:
body: > body: >
We are excited to announce the release of OpenProject 12.0. It's a major release that will hopefully significantly improve the way you use OpenProject. We are excited to announce the release of OpenProject 12.0. It's a major release that will hopefully significantly improve the way you use OpenProject.
@ -1406,9 +1409,9 @@ cs:
Sincerely, Sincerely,
The OpenProject team The OpenProject team
body_header: 'Version 12.0 with Notification Center' body_header: 'Verze 12.0 s oznamovacím centrem'
body_subheader: 'Novinky' body_subheader: 'Novinky'
subject: 'Important changes to notifications with the release of 12.0' subject: 'Důležité změny oznámení s vydáním 12.0'
label_accessibility: "Přístupnost" label_accessibility: "Přístupnost"
label_account: "Účet" label_account: "Účet"
label_active: "Aktivní" label_active: "Aktivní"
@ -1458,7 +1461,7 @@ cs:
label_available_project_versions: 'Dostupné verze' label_available_project_versions: 'Dostupné verze'
label_available_project_repositories: 'Dostupné repozitáře' label_available_project_repositories: 'Dostupné repozitáře'
label_api_documentation: "API dokumentace" label_api_documentation: "API dokumentace"
label_backup: "Backup" label_backup: "Záloha"
label_between: "mezi" label_between: "mezi"
label_blocked_by: "zablokoval" label_blocked_by: "zablokoval"
label_blocks: "bloky" label_blocks: "bloky"
@ -1494,7 +1497,7 @@ cs:
label_check_uncheck_all_in_column: "Zaškrtnout/Odznačit vše ve sloupci" label_check_uncheck_all_in_column: "Zaškrtnout/Odznačit vše ve sloupci"
label_check_uncheck_all_in_row: "Zaškrtnout/Odznačit vše v řádku" label_check_uncheck_all_in_row: "Zaškrtnout/Odznačit vše v řádku"
label_child_element: "Podřazený prvek" label_child_element: "Podřazený prvek"
label_chronological_order: "Oldest first" label_chronological_order: "Od nejstarších"
label_close_versions: "Zavřít dokončené verze" label_close_versions: "Zavřít dokončené verze"
label_closed_work_packages: "uzavřeno" label_closed_work_packages: "uzavřeno"
label_collapse: "Sbalit" label_collapse: "Sbalit"
@ -1524,7 +1527,7 @@ cs:
label_custom_field_plural: "Vlastní pole" label_custom_field_plural: "Vlastní pole"
label_custom_field_default_type: "Prázdný typ" label_custom_field_default_type: "Prázdný typ"
label_custom_style: "Design" label_custom_style: "Design"
label_database_version: "PostgreSQL version" label_database_version: "Verze PostgreSQL"
label_date: "Datum" label_date: "Datum"
label_date_and_time: "Datum a čas" label_date_and_time: "Datum a čas"
label_date_from: "Od" label_date_from: "Od"
@ -1661,11 +1664,11 @@ cs:
label_member_new: "Nový člen" label_member_new: "Nový člen"
label_member_all_admin: "(Všechny role z důvodu stavu správce)" label_member_all_admin: "(Všechny role z důvodu stavu správce)"
label_member_plural: "Členové" label_member_plural: "Členové"
lable_membership_added: 'Member added' lable_membership_added: 'Člen přidán'
lable_membership_updated: 'Member updated' lable_membership_updated: 'Člen aktualizován'
label_menu_badge: label_menu_badge:
pre_alpha: 'pre-alpha' pre_alpha: 'pre-alpha'
alpha: 'alpha' alpha: 'Alfa'
beta: 'beta' beta: 'beta'
label_menu_item_name: "Název položky menu" label_menu_item_name: "Název položky menu"
label_message: "Zpráva" label_message: "Zpráva"
@ -1691,7 +1694,7 @@ cs:
label_my_queries: "Moje vlastní dotazy" label_my_queries: "Moje vlastní dotazy"
label_name: "Jméno" label_name: "Jméno"
label_never: "Nikdy" label_never: "Nikdy"
label_new: "Nové" label_new: "Nový"
label_new_features: "Nové funkce" label_new_features: "Nové funkce"
label_new_statuses_allowed: "Nové povolené stavy" label_new_statuses_allowed: "Nové povolené stavy"
label_news_singular: "Novinky" label_news_singular: "Novinky"
@ -1738,9 +1741,9 @@ cs:
label_permissions: "Práva" label_permissions: "Práva"
label_permissions_report: "Přehled oprávnění" label_permissions_report: "Přehled oprávnění"
label_personalize_page: "Přizpůsobit tuto stránku" label_personalize_page: "Přizpůsobit tuto stránku"
label_placeholder_user: "Placeholder user" label_placeholder_user: "placeholder uživatel"
label_placeholder_user_new: "New placeholder user" label_placeholder_user_new: "Nový placeholder uživatel"
label_placeholder_user_plural: "Placeholder users" label_placeholder_user_plural: "placeholder uživatelé"
label_planning: "Plánování" label_planning: "Plánování"
label_please_login: "Přihlaste se prosím" label_please_login: "Přihlaste se prosím"
label_plugins: "Pluginy" label_plugins: "Pluginy"
@ -1800,7 +1803,7 @@ cs:
label_required: 'vyžadováno' label_required: 'vyžadováno'
label_requires: 'vyžaduje' label_requires: 'vyžaduje'
label_result_plural: "Výsledky" label_result_plural: "Výsledky"
label_reverse_chronological_order: "Newest first" label_reverse_chronological_order: "Od nejnovějších"
label_revision: "Revize" label_revision: "Revize"
label_revision_id: "Revize %{value}" label_revision_id: "Revize %{value}"
label_revision_plural: "Revize" label_revision_plural: "Revize"
@ -1932,8 +1935,8 @@ cs:
label_workflow_plural: "Pracovní vrstvy" label_workflow_plural: "Pracovní vrstvy"
label_workflow_summary: "Souhrn" label_workflow_summary: "Souhrn"
label_x_closed_work_packages_abbr: label_x_closed_work_packages_abbr:
one: "1 uzavřena" one: "1 uzavřeno"
other: "%{count} uzavřeny" other: "%{count} uzavřených"
zero: "0 uzavřeno" zero: "0 uzavřeno"
label_x_comments: label_x_comments:
one: "1 komentář" one: "1 komentář"
@ -1980,63 +1983,63 @@ cs:
actions: 'Akce' actions: 'Akce'
digests: digests:
including_mention_singular: 'including a mention' including_mention_singular: 'including a mention'
including_mention_plural: 'including %{number_mentioned} mentions' including_mention_plural: 'včetně %{number_mentioned} zmínění'
unread_notification_singular: '1 unread notification' unread_notification_singular: '1 nepřečtené oznámení'
unread_notification_plural: '%{number_unread} unread notifications' unread_notification_plural: '%{number_unread} nepřečtených oznámení'
you_have: 'You have' you_have: 'Máte'
logo_alt_text: 'Logo' logo_alt_text: 'Logo'
mention: mention:
subject: "%{user_name} mentioned you in #%{id} - %{subject}" subject: "%{user_name} vás zmínil v #%{id} - %{subject}"
notification: notification:
center: 'To notification center' center: 'Centrum oznámení'
see_in_center: 'See comment in notification center' see_in_center: 'Zobrazit komentář v oznamovacím centru'
settings: 'Change email settings' settings: 'Změnit nastavení e-mailu'
salutation: 'Hey %{user}!' salutation: 'Ahoj %{user}!'
work_packages: work_packages:
created_at: 'Created at %{timestamp} by %{user} ' created_at: 'Vytvořeno v %{timestamp} uživatelem %{user} '
login_to_see_all: 'Log in to see all notifications.' login_to_see_all: 'Přihlaste se pro zobrazení všech oznámení.'
mentioned: 'You have been <b>mentioned in a comment</b>' mentioned: 'Byli jste <b>zmíněni v komentáři</b>'
mentioned_by: '%{user} mentioned you in a comment' mentioned_by: '%{user} vás zmínil v komentáři'
more_to_see: more_to_see:
one: 'There is 1 more work package with notifications.' one: 'Existuje ještě 1 pracovní balíček s oznámeními.'
few: 'There are %{count} more work packages with notifications.' few: 'There are %{count} more work packages with notifications.'
many: 'There are %{count} more work packages with notifications.' many: 'There are %{count} more work packages with notifications.'
other: 'There are %{count} more work packages with notifications.' other: 'There are %{count} more work packages with notifications.'
reason: reason:
watched: 'Watched' watched: 'Sledováno'
assigned: 'Assigned' assigned: 'Přiřazen'
responsible: 'Odpovědný' responsible: 'Odpovědný'
mentioned: 'Mentioned' mentioned: 'Zmíněné'
subscribed: 'vše' subscribed: 'vše'
prefix: 'Received because of the notification setting: %{reason}' prefix: 'Received because of the notification setting: %{reason}'
see_all: 'See all' see_all: 'Zobrazit vše'
updated_at: 'Updated at %{timestamp} by %{user}' updated_at: 'Aktualizováno v %{timestamp} uživatelem %{user}'
mail_body_account_activation_request: "Nový uživatel (%{value}) byl zaregistrován. Účet čeká na Vaše schválení:" mail_body_account_activation_request: "Nový uživatel (%{value}) byl zaregistrován. Účet čeká na Vaše schválení:"
mail_body_account_information: "Informace o vašem účtu" mail_body_account_information: "Informace o vašem účtu"
mail_body_account_information_external: "Můžete použít váš %{value} účet pro přihlášení." mail_body_account_information_external: "Můžete použít váš %{value} účet pro přihlášení."
mail_body_backup_ready: "Your requested backup is ready. You can download it here:" mail_body_backup_ready: "Your requested backup is ready. You can download it here:"
mail_body_backup_token_reset_admin_info: The backup token for user '%{user}' has been reset. 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_reset_user_info: Váš záložní token byl resetován.
mail_body_backup_token_info: The previous token is no longer valid. mail_body_backup_token_info: Předchozí token již není platný.
mail_body_backup_waiting_period: The new token will be enabled in %{hours} hours. mail_body_backup_waiting_period: The new token will be enabled in %{hours} hours.
mail_body_backup_token_warning: If this wasn't you, login to OpenProject immediately and reset it again. mail_body_backup_token_warning: If this wasn't you, login to OpenProject immediately and reset it again.
mail_body_lost_password: "Pro změnu vašeho hesla klikněte na následující odkaz:" mail_body_lost_password: "Pro změnu vašeho hesla klikněte na následující odkaz:"
mail_body_register: "Welcome to OpenProject. Please activate your account by clicking on this link:" mail_body_register: "Vítejte v OpenProject. Aktivujte svůj účet kliknutím na tento odkaz:"
mail_body_register_header_title: "Project member invitation email" mail_body_register_header_title: "E-mail pozvánka člena projektu"
mail_body_register_user: "Dear %{name}, " mail_body_register_user: "Vážený %{name},"
mail_body_register_links_html: | mail_body_register_links_html: |
Please feel free to browse our youtube channel (%{youtube_link}) where we provide a webinar (%{webinar_link}) Please feel free to browse our youtube channel (%{youtube_link}) where we provide a webinar (%{webinar_link})
and “Get started” videos (%{get_started_link}) to make your first steps in OpenProject as easy as possible. and “Get started” videos (%{get_started_link}) to make your first steps in OpenProject as easy as possible.
<br /> <br />
If you have any further questions, consult our documentation (%{documentation_link}) or contact your administrator. If you have any further questions, consult our documentation (%{documentation_link}) or contact your administrator.
mail_body_register_closing: "Your OpenProject team" mail_body_register_closing: "Váš OpenProject tým"
mail_body_register_ending: "Stay connected! Kind regards," mail_body_register_ending: "Zůstaňte ve spojení! S pozdravem,"
mail_body_reminder: "%{count} pracovních balíčků, které máte přiřazeny, mají termín během následujících %{days} dnů:" mail_body_reminder: "%{count} pracovních balíčků, které máte přiřazeny, mají termín během následujících %{days} dnů:"
mail_body_group_reminder: "%{count} pracovních balíčků, které jsou přiřazeny ke skupině \"%{group}\", má termín splatnosti během následujících %{days} dnů:" mail_body_group_reminder: "%{count} pracovních balíčků, které jsou přiřazeny ke skupině \"%{group}\", má termín splatnosti během následujících %{days} dnů:"
mail_body_wiki_content_added: "Wiki stránka '%{id}' byla přidána uživatelem %{author}." mail_body_wiki_content_added: "Wiki stránka '%{id}' byla přidána uživatelem %{author}."
mail_body_wiki_content_updated: "Wiki stránka '%{id}' byla aktualizována uživatelem %{author}." mail_body_wiki_content_updated: "Wiki stránka '%{id}' byla aktualizována uživatelem %{author}."
mail_subject_account_activation_request: "Žádost o aktivaci účtu %{value}" mail_subject_account_activation_request: "Žádost o aktivaci účtu %{value}"
mail_subject_backup_ready: "Your backup is ready" mail_subject_backup_ready: "Vaše záloha je připravena"
mail_subject_backup_token_reset: "Backup token reset" mail_subject_backup_token_reset: "Backup token reset"
mail_subject_lost_password: "Vaše heslo %{value}" mail_subject_lost_password: "Vaše heslo %{value}"
mail_subject_register: "Aktivace vašeho účtu %{value}" mail_subject_register: "Aktivace vašeho účtu %{value}"
@ -2045,26 +2048,26 @@ cs:
mail_subject_wiki_content_added: "'%{id}' wiki stránka byla přidána" mail_subject_wiki_content_added: "'%{id}' wiki stránka byla přidána"
mail_subject_wiki_content_updated: "'%{id}' wiki stránka byla aktualizována" mail_subject_wiki_content_updated: "'%{id}' wiki stránka byla aktualizována"
mail_member_added_project: mail_member_added_project:
subject: "%{project} - You have been added as a member" subject: "%{project} - Byli jste přidáni jako člen"
body: body:
added_by: added_by:
without_message: "%{user} added you as a member to the project '%{project}'." without_message: "%{user} tě přidal jako člena do projektu '%{project}'."
with_message: "%{user} added you as a member to the project '%{project}' writing:" with_message: "%{user} added you as a member to the project '%{project}' writing:"
roles: "You have the following roles:" roles: "Máte následující role:"
mail_member_updated_project: mail_member_updated_project:
subject: "%{project} - Your roles have been updated" subject: "%{project} - Vaše role byly aktualizovány"
body: body:
updated_by: updated_by:
without_message: "%{user} updated the roles you have in the project '%{project}'." 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:" with_message: "%{user} updated the roles you have in the project '%{project}' writing:"
roles: "You now have the following roles:" roles: "Nyní máte následující role:"
mail_member_updated_global: mail_member_updated_global:
subject: "Your global permissions have been updated" subject: "Vaše globální oprávnění byla aktualizována"
body: body:
updated_by: updated_by:
without_message: "%{user} updated the roles you have globally." without_message: "%{user} updated the roles you have globally."
with_message: "%{user} updated the roles you have globally writing:" with_message: "%{user} updated the roles you have globally writing:"
roles: "You now have the following roles:" roles: "Nyní máte následující role:"
mail_user_activation_limit_reached: mail_user_activation_limit_reached:
subject: Dosažen limit aktivace uživatelů subject: Dosažen limit aktivace uživatelů
message: | message: |
@ -2171,8 +2174,8 @@ cs:
permission_add_work_packages: "Přidat pracovní balíčky" permission_add_work_packages: "Přidat pracovní balíčky"
permission_add_messages: "Odesílat zprávy" permission_add_messages: "Odesílat zprávy"
permission_add_project: "Vytvořit projekt" permission_add_project: "Vytvořit projekt"
permission_manage_user: "Create and edit users" permission_manage_user: "Vytvořit a upravit uživatele"
permission_manage_placeholder_user: "Create, edit, and delete placeholder users" permission_manage_placeholder_user: "Vytvořit, upravit a odstranit placeholder uživatele"
permission_add_subprojects: "Vytvořit podprojekty" permission_add_subprojects: "Vytvořit podprojekty"
permission_add_work_package_watchers: "Přidat sledující" permission_add_work_package_watchers: "Přidat sledující"
permission_assign_versions: "Přiřadit verze" permission_assign_versions: "Přiřadit verze"
@ -2212,7 +2215,7 @@ cs:
permission_manage_project_activities: "Spravovat projektové aktivity" permission_manage_project_activities: "Spravovat projektové aktivity"
permission_manage_public_queries: "Spravovat veřejné dotazy" permission_manage_public_queries: "Spravovat veřejné dotazy"
permission_manage_repository: "Správa repozitáře" permission_manage_repository: "Správa repozitáře"
permission_manage_subtasks: "Manage work package hierarchies" permission_manage_subtasks: "Spravovat hierarchie pracovních balíčků"
permission_manage_versions: "Správovat verze" permission_manage_versions: "Správovat verze"
permission_manage_wiki: "Spravovat wiki" permission_manage_wiki: "Spravovat wiki"
permission_manage_wiki_menu: "Spravovat wiki menu" permission_manage_wiki_menu: "Spravovat wiki menu"
@ -2220,7 +2223,7 @@ cs:
permission_protect_wiki_pages: "Ochrana stránky wiki" permission_protect_wiki_pages: "Ochrana stránky wiki"
permission_rename_wiki_pages: "Přejmenovat stránky wiki" permission_rename_wiki_pages: "Přejmenovat stránky wiki"
permission_save_queries: "Uložit pohled" permission_save_queries: "Uložit pohled"
permission_select_custom_fields: "Select custom fields" permission_select_custom_fields: "Vybrat vlastní pole"
permission_select_project_modules: "Vyberte moduly projektu" permission_select_project_modules: "Vyberte moduly projektu"
permission_manage_types: "Vyberte typy" permission_manage_types: "Vyberte typy"
permission_view_changesets: "Zobrazit revize repozitáře v OpenProject" permission_view_changesets: "Zobrazit revize repozitáře v OpenProject"
@ -2249,13 +2252,13 @@ cs:
title: Změnit identifikátor projektu title: Změnit identifikátor projektu
template: template:
copying: > copying: >
Your project is being created from the selected template project. You will be notified by mail as soon as the project is available. Váš projekt se vytváří z vybranéhé šablony. Budete upozorněni e-mailem, jakmile bude projekt k dispozici.
use_template: 'Use template' use_template: 'Použít šablonu'
make_template: 'Set as template' make_template: 'Nastavit jako šablonu'
remove_from_templates: 'Remove from templates' remove_from_templates: 'Odstranit ze šablon'
archive: archive:
are_you_sure: "Opravdu chcete archivovat projekt '%{name}'?" are_you_sure: "Opravdu chcete archivovat projekt '%{name}'?"
archived: "Archived" archived: "Archivováno"
project_module_activity: "Aktivita" project_module_activity: "Aktivita"
project_module_forums: "Diskuse" project_module_forums: "Diskuse"
project_module_work_package_tracking: "Sledování pracovních balíčků" project_module_work_package_tracking: "Sledování pracovních balíčků"
@ -2271,8 +2274,8 @@ cs:
assigned_to_role: "Řešitelova role" assigned_to_role: "Řešitelova role"
member_of_group: "Řešitelova skupina" member_of_group: "Řešitelova skupina"
assignee_or_group: "Přiřazený nebo patřící skupině" assignee_or_group: "Přiřazený nebo patřící skupině"
subproject_id: "Including Subproject" subproject_id: "Včetně podprojektu"
only_subproject_id: "Only subproject" only_subproject_id: "Pouze podprojekt"
name_or_identifier: "Jméno nebo identifikátor" name_or_identifier: "Jméno nebo identifikátor"
repositories: repositories:
at_identifier: 'v %{identifier}' at_identifier: 'v %{identifier}'
@ -2373,19 +2376,19 @@ cs:
username: "Uživatelské jméno repositáře" username: "Uživatelské jméno repositáře"
truncated: "Omlouváme se, museli jsme zredukovat tento adresář na %{limit} soubory. %{truncated} položek bylo ze seznamu vynecháno." truncated: "Omlouváme se, museli jsme zredukovat tento adresář na %{limit} soubory. %{truncated} položek bylo ze seznamu vynecháno."
named_repository: "%{vendor_name} repozitář" named_repository: "%{vendor_name} repozitář"
update_settings_successful: "The settings have been successfully saved." update_settings_successful: "Nastavení bylo úspěšně uloženo."
url: "URL do repozitáře" url: "URL do repozitáře"
warnings: warnings:
cannot_annotate: "Tento soubor nelze přiřadit poznámce." cannot_annotate: "Tento soubor nelze přiřadit poznámce."
scheduling: scheduling:
activated: 'activated' activated: 'Aktivováno '
deactivated: 'deactivated' deactivated: 'Deaktivováno'
search_input_placeholder: "Hledat ..." search_input_placeholder: "Hledat ..."
setting_apiv3_cors_enabled: "Enable CORS" setting_apiv3_cors_enabled: "Povolit CORS"
setting_apiv3_cors_origins: "API V3 Cross-Origin Resource Sharing (CORS) allowed origins" setting_apiv3_cors_origins: "API V3 Cross-Origin Resource Sharing (CORS) allowed origins"
setting_apiv3_cors_origins_text_html: > setting_apiv3_cors_origins_text_html: >
If CORS is enabled, these are the origins that are allowed to access OpenProject API. <br/> Please check the <a href="%{origin_link}" target="_blank">Documentation on the Origin header</a> on how to specify the expected values. If CORS is enabled, these are the origins that are allowed to access OpenProject API. <br/> Please check the <a href="%{origin_link}" target="_blank">Documentation on the Origin header</a> on how to specify the expected values.
setting_apiv3_max_page_size: "Maximum API page size" setting_apiv3_max_page_size: "Maximální velikost stránky API"
setting_apiv3_max_page_instructions_html: > setting_apiv3_max_page_instructions_html: >
Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. <br/> <strong>Warning:</strong> Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. <br/> <strong>Warning:</strong> Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views.
setting_apiv3_docs: "Dokumentace" setting_apiv3_docs: "Dokumentace"
@ -2426,7 +2429,7 @@ cs:
setting_consent_required: "Souhlas vyžadován" setting_consent_required: "Souhlas vyžadován"
setting_consent_decline_mail: "Kontaktní e-mailová adresa pro souhlas" setting_consent_decline_mail: "Kontaktní e-mailová adresa pro souhlas"
setting_cross_project_work_package_relations: "Povolit vztahy mezi projekty a pracovními balíčky" setting_cross_project_work_package_relations: "Povolit vztahy mezi projekty a pracovními balíčky"
setting_first_week_of_year: "First week in year contains" setting_first_week_of_year: "První týden v roce obsahuje"
setting_date_format: "Formát data" setting_date_format: "Formát data"
setting_default_language: "Výchozí jazyk" setting_default_language: "Výchozí jazyk"
setting_default_projects_modules: "Výchozí zapnutné moduly pro nový projekt" setting_default_projects_modules: "Výchozí zapnutné moduly pro nový projekt"
@ -2437,7 +2440,7 @@ cs:
setting_emails_header: "Záhlaví emailů" setting_emails_header: "Záhlaví emailů"
setting_email_login: "Použít e-mail jako přihlášení" setting_email_login: "Použít e-mail jako přihlášení"
setting_enabled_scm: "Povolit SCM" setting_enabled_scm: "Povolit SCM"
setting_enabled_projects_columns: "Visible in project list" setting_enabled_projects_columns: "Viditelné v seznamu projektů"
setting_notification_retention_period_days: "Notification retention period" setting_notification_retention_period_days: "Notification retention period"
setting_feeds_enabled: "Povolit kanály" setting_feeds_enabled: "Povolit kanály"
setting_feeds_limit: "Limit obsahu kanálů" setting_feeds_limit: "Limit obsahu kanálů"
@ -2469,7 +2472,7 @@ cs:
setting_per_page_options: "Objektů na stránku" setting_per_page_options: "Objektů na stránku"
setting_plain_text_mail: "Prostý text (ne HTML)" setting_plain_text_mail: "Prostý text (ne HTML)"
setting_protocol: "Protokol" setting_protocol: "Protokol"
setting_project_gantt_query: "Project portfolio Gantt view" setting_project_gantt_query: "Gantt Zobrazení projektového portfolia"
setting_project_gantt_query_text: "You can modify the query that is used to display Gantt chart from the project overview page." setting_project_gantt_query_text: "You can modify the query that is used to display Gantt chart from the project overview page."
setting_security_badge_displayed: "Zobrazit bezpečnostní odznak" setting_security_badge_displayed: "Zobrazit bezpečnostní odznak"
setting_registration_footer: "Zápatí registrace" setting_registration_footer: "Zápatí registrace"
@ -2521,8 +2524,8 @@ cs:
first_week_of_year_text: > 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. 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: projects:
section_new_projects: "Settings for new projects" section_new_projects: "Nastavení pro nové projekty"
section_project_overview: "Settings for project overview list" section_project_overview: "Nastavení přehledu seznamu projektu"
user: user:
default_preferences: "Výchozí předvolby" default_preferences: "Výchozí předvolby"
deletion: "Odstranění" deletion: "Odstranění"
@ -2577,7 +2580,7 @@ cs:
text_destroy_with_associated: "Existují další objekty, které jsou přiřazeny k pracovním balíčkům a které mají být odstraněny. Tyto objekty jsou následující typy:" text_destroy_with_associated: "Existují další objekty, které jsou přiřazeny k pracovním balíčkům a které mají být odstraněny. Tyto objekty jsou následující typy:"
text_destroy_what_to_do: "Co chcete udělat?" text_destroy_what_to_do: "Co chcete udělat?"
text_diff_truncated: "... Toto rozlišení bylo zkráceno, protože přesahuje maximální velikost, kterou lze zobrazit." text_diff_truncated: "... Toto rozlišení bylo zkráceno, protože přesahuje maximální velikost, kterou lze zobrazit."
text_email_delivery_not_configured: "Email delivery is not configured, and notifications are disabled.\nConfigure your SMTP server to enable them." text_email_delivery_not_configured: "Doručení e-mailu není nakonfigurováno a oznámení jsou zakázána.\nNakonfigurujte váš SMTP server pro jejich povolení."
text_enumeration_category_reassign_to: "Přiřadit je k této hodnotě:" text_enumeration_category_reassign_to: "Přiřadit je k této hodnotě:"
text_enumeration_destroy_question: "%{count} objektů je přiřazeno k této hodnotě." text_enumeration_destroy_question: "%{count} objektů je přiřazeno k této hodnotě."
text_file_repository_writable: "Do adresáře příloh lze zapisovat" text_file_repository_writable: "Do adresáře příloh lze zapisovat"
@ -2590,8 +2593,8 @@ cs:
text_work_package_category_destroy_question: "Některé pracovní balíčky (%{count}) jsou přiřazeny k této kategorii. Co chcete udělat?" text_work_package_category_destroy_question: "Některé pracovní balíčky (%{count}) jsou přiřazeny k této kategorii. Co chcete udělat?"
text_work_package_category_reassign_to: "Přiřadit pracovní balíčky k této kategorii" text_work_package_category_reassign_to: "Přiřadit pracovní balíčky k této kategorii"
text_work_package_updated: "Pracovní balíček %{id} byl aktualizován uživatelem %{author}." text_work_package_updated: "Pracovní balíček %{id} byl aktualizován uživatelem %{author}."
text_work_package_watcher_added: "You have been added as a watcher to Work package %{id} by %{watcher_changer}." text_work_package_watcher_added: "Byli jste přidáni jako sledovatel do pracovního balíčku %{id} uživatelem %{watcher_changer}."
text_work_package_watcher_removed: "You have been removed from watchers of Work package %{id} by %{watcher_changer}." text_work_package_watcher_removed: "Byl jste odstraněn z pozorovatelů pracovního balíčku %{id} uživatelem %{watcher_changer}."
text_work_packages_destroy_confirmation: "Jste si jisti, že chcete odstranit vybrané pracovní balíčky?" text_work_packages_destroy_confirmation: "Jste si jisti, že chcete odstranit vybrané pracovní balíčky?"
text_work_packages_ref_in_commit_messages: "Odkazování a opravování pracovních balíčků ve zprávách commitu" 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_added: "%{label} %{value} přidán"
@ -2907,10 +2910,10 @@ cs:
code_403: "Nemáte oprávnění k přístupu k tomuto zdroji." code_403: "Nemáte oprávnění k přístupu k tomuto zdroji."
code_404: "Požadovaný zdroj nebyl nalezen." code_404: "Požadovaný zdroj nebyl nalezen."
code_409: "Zdroj nelze aktualizovat kvůli konfliktním změnám." code_409: "Zdroj nelze aktualizovat kvůli konfliktním změnám."
code_429: "Too many requests. Please try again later." code_429: "Příliš mnoho dotazů, zkuste to znovu později"
code_500: "Došlo k vnitřní chybě." code_500: "Došlo k vnitřní chybě."
not_found: not_found:
work_package: "The work package you are looking for cannot be found or has been deleted." work_package: "Pracovní balíček, který hledáte, nebyl nalezen nebo byl odstraněn."
expected: expected:
date: "RRRR-MM-DD (pouze ISO 8601 datum)" date: "RRRR-MM-DD (pouze ISO 8601 datum)"
duration: "Doba trvání ISO 8601" duration: "Doba trvání ISO 8601"
@ -3033,4 +3036,4 @@ cs:
authorization_error: "Došlo k chybě autorizace." authorization_error: "Došlo k chybě autorizace."
revoke_my_application_confirmation: "Opravdu chcete odstranit tuto aplikaci? Tato akce zruší %{token_count} aktivních aplikací." revoke_my_application_confirmation: "Opravdu chcete odstranit tuto aplikaci? Tato akce zruší %{token_count} aktivních aplikací."
my_registered_applications: "Registrované OAuth aplikace" my_registered_applications: "Registrované OAuth aplikace"
you: you you: vy

@ -453,9 +453,12 @@ da:
code: 'Status' code: 'Status'
explanation: 'Statusbeskrivelse' explanation: 'Statusbeskrivelse'
codes: codes:
not_started: 'Not started'
on_track: 'På sporet' on_track: 'På sporet'
at_risk: 'I fare' at_risk: 'I fare'
off_track: 'Af sporet' off_track: 'Af sporet'
finished: 'Finished'
discontinued: 'Discontinued'
query: query:
column_names: "Kolonner" column_names: "Kolonner"
relations_to_type_column: "Relations to %{type}" relations_to_type_column: "Relations to %{type}"

@ -450,9 +450,12 @@ de:
code: 'Status' code: 'Status'
explanation: 'Statusbeschreibung' explanation: 'Statusbeschreibung'
codes: codes:
not_started: 'Not started'
on_track: 'Planmäßig' on_track: 'Planmäßig'
at_risk: 'Gefährdet' at_risk: 'Gefährdet'
off_track: 'Unplanmäßig' off_track: 'Unplanmäßig'
finished: 'Finished'
discontinued: 'Discontinued'
query: query:
column_names: "Spalten" column_names: "Spalten"
relations_to_type_column: "Beziehungen zu %{type}" relations_to_type_column: "Beziehungen zu %{type}"

@ -451,9 +451,12 @@ el:
code: 'Κατάσταση' code: 'Κατάσταση'
explanation: 'Περιγραφή κατάστασης' explanation: 'Περιγραφή κατάστασης'
codes: codes:
not_started: 'Not started'
on_track: 'Eντός πορείας' on_track: 'Eντός πορείας'
at_risk: 'Σε κίνδυνο' at_risk: 'Σε κίνδυνο'
off_track: 'Eκτός πορείας' off_track: 'Eκτός πορείας'
finished: 'Finished'
discontinued: 'Discontinued'
query: query:
column_names: "Στήλες" column_names: "Στήλες"
relations_to_type_column: "Συσχετίσεις με %{type}" relations_to_type_column: "Συσχετίσεις με %{type}"

@ -455,9 +455,12 @@ eo:
code: 'Stato' code: 'Stato'
explanation: 'Statpriskribo' explanation: 'Statpriskribo'
codes: codes:
not_started: 'Not started'
on_track: 'Laŭ la plano' on_track: 'Laŭ la plano'
at_risk: 'Riske' at_risk: 'Riske'
off_track: 'Off track' off_track: 'Off track'
finished: 'Finished'
discontinued: 'Discontinued'
query: query:
column_names: "Kolumnoj" column_names: "Kolumnoj"
relations_to_type_column: "Rilatoj kun %{type}" relations_to_type_column: "Rilatoj kun %{type}"

@ -452,9 +452,12 @@ es:
code: 'Estado' code: 'Estado'
explanation: 'Descripción del estado' explanation: 'Descripción del estado'
codes: codes:
not_started: 'Not started'
on_track: 'Según lo previsto' on_track: 'Según lo previsto'
at_risk: 'En riesgo' at_risk: 'En riesgo'
off_track: 'Fuera de lo previsto' off_track: 'Fuera de lo previsto'
finished: 'Finished'
discontinued: 'Discontinued'
query: query:
column_names: "Columnas" column_names: "Columnas"
relations_to_type_column: "Relaciones con %{type}" relations_to_type_column: "Relaciones con %{type}"

@ -455,9 +455,12 @@ et:
code: 'Olek' code: 'Olek'
explanation: 'Status description' explanation: 'Status description'
codes: codes:
not_started: 'Not started'
on_track: 'On track' on_track: 'On track'
at_risk: 'At risk' at_risk: 'At risk'
off_track: 'Off track' off_track: 'Off track'
finished: 'Finished'
discontinued: 'Discontinued'
query: query:
column_names: "Väljad" column_names: "Väljad"
relations_to_type_column: "Relations to %{type}" relations_to_type_column: "Relations to %{type}"

@ -455,9 +455,12 @@ fa:
code: 'Status' code: 'Status'
explanation: 'Status description' explanation: 'Status description'
codes: codes:
not_started: 'Not started'
on_track: 'On track' on_track: 'On track'
at_risk: 'At risk' at_risk: 'At risk'
off_track: 'Off track' off_track: 'Off track'
finished: 'Finished'
discontinued: 'Discontinued'
query: query:
column_names: "ستونها" column_names: "ستونها"
relations_to_type_column: "Relations to %{type}" relations_to_type_column: "Relations to %{type}"

@ -455,9 +455,12 @@ fi:
code: 'Tila' code: 'Tila'
explanation: 'Tilan kuvaus' explanation: 'Tilan kuvaus'
codes: codes:
not_started: 'Not started'
on_track: 'Hyvä' on_track: 'Hyvä'
at_risk: 'Rajalla' at_risk: 'Rajalla'
off_track: 'Huono' off_track: 'Huono'
finished: 'Finished'
discontinued: 'Discontinued'
query: query:
column_names: "Sarakkeet" column_names: "Sarakkeet"
relations_to_type_column: "Riippuvuus %{type}" relations_to_type_column: "Riippuvuus %{type}"

@ -455,9 +455,12 @@ fil:
code: 'Estado' code: 'Estado'
explanation: 'Status description' explanation: 'Status description'
codes: codes:
not_started: 'Not started'
on_track: 'On track' on_track: 'On track'
at_risk: 'At risk' at_risk: 'At risk'
off_track: 'Off track' off_track: 'Off track'
finished: 'Finished'
discontinued: 'Discontinued'
query: query:
column_names: "Mga hanay" column_names: "Mga hanay"
relations_to_type_column: "Mga relasyon sa %{type}" relations_to_type_column: "Mga relasyon sa %{type}"

@ -455,9 +455,12 @@ fr:
code: 'Statut' code: 'Statut'
explanation: 'Description du statut' explanation: 'Description du statut'
codes: codes:
not_started: 'Not started'
on_track: 'Sur la bonne voie' on_track: 'Sur la bonne voie'
at_risk: 'À risque' at_risk: 'À risque'
off_track: 'Sur la mauvaise voie' off_track: 'Sur la mauvaise voie'
finished: 'Finished'
discontinued: 'Discontinued'
query: query:
column_names: "Colonnes" column_names: "Colonnes"
relations_to_type_column: "Relations avec %{type}" relations_to_type_column: "Relations avec %{type}"

@ -457,9 +457,12 @@ he:
code: 'מצב' code: 'מצב'
explanation: 'Status description' explanation: 'Status description'
codes: codes:
not_started: 'Not started'
on_track: 'On track' on_track: 'On track'
at_risk: 'At risk' at_risk: 'At risk'
off_track: 'Off track' off_track: 'Off track'
finished: 'Finished'
discontinued: 'Discontinued'
query: query:
column_names: "עמודות" column_names: "עמודות"
relations_to_type_column: "Relations to %{type}" relations_to_type_column: "Relations to %{type}"

@ -453,9 +453,12 @@ hi:
code: 'अवस' code: 'अवस'
explanation: 'Status description' explanation: 'Status description'
codes: codes:
not_started: 'Not started'
on_track: 'On track' on_track: 'On track'
at_risk: 'At risk' at_risk: 'At risk'
off_track: 'Off track' off_track: 'Off track'
finished: 'Finished'
discontinued: 'Discontinued'
query: query:
column_names: "सभ" column_names: "सभ"
relations_to_type_column: "Relations to %{type}" relations_to_type_column: "Relations to %{type}"

@ -456,9 +456,12 @@ hr:
code: 'Status' code: 'Status'
explanation: 'Status description' explanation: 'Status description'
codes: codes:
not_started: 'Not started'
on_track: 'On track' on_track: 'On track'
at_risk: 'At risk' at_risk: 'At risk'
off_track: 'Off track' off_track: 'Off track'
finished: 'Finished'
discontinued: 'Discontinued'
query: query:
column_names: "Stupci" column_names: "Stupci"
relations_to_type_column: "Relations to %{type}" relations_to_type_column: "Relations to %{type}"

@ -456,9 +456,12 @@ hu:
code: 'Állapot' code: 'Állapot'
explanation: 'Állapot leírása' explanation: 'Állapot leírása'
codes: codes:
not_started: 'Not started'
on_track: 'Terv szerint' on_track: 'Terv szerint'
at_risk: 'Veszélyben' at_risk: 'Veszélyben'
off_track: 'Kisiklott' off_track: 'Kisiklott'
finished: 'Finished'
discontinued: 'Discontinued'
query: query:
column_names: "Oszlopok" column_names: "Oszlopok"
relations_to_type_column: "Kapcsolatok %{type}-hoz" relations_to_type_column: "Kapcsolatok %{type}-hoz"

@ -451,9 +451,12 @@ id:
code: 'Status' code: 'Status'
explanation: 'Status description' explanation: 'Status description'
codes: codes:
not_started: 'Not started'
on_track: 'On track' on_track: 'On track'
at_risk: 'At risk' at_risk: 'At risk'
off_track: 'Off track' off_track: 'Off track'
finished: 'Finished'
discontinued: 'Discontinued'
query: query:
column_names: "Kolom" column_names: "Kolom"
relations_to_type_column: "Relasi untuk %{type}" relations_to_type_column: "Relasi untuk %{type}"

@ -319,7 +319,7 @@ it:
other: '%{count} macro-attività discendenti' other: '%{count} macro-attività discendenti'
bulk: bulk:
could_not_be_saved: "Le seguenti macro-attività non possono essere salvate:" could_not_be_saved: "Le seguenti macro-attività non possono essere salvate:"
none_could_be_saved: "None of the %{total} work packages could be updated." none_could_be_saved: "Nessuna delle %{total} macro-attività può essere aggiornata."
x_out_of_y_could_be_saved: "%{failing} out of the %{total} work packages could not be updated while %{success} could." x_out_of_y_could_be_saved: "%{failing} out of the %{total} work packages could not be updated while %{success} could."
selected_because_descendants: "While %{selected} work packages where selected, in total %{total} work packages are affected which includes descendants." selected_because_descendants: "While %{selected} work packages where selected, in total %{total} work packages are affected which includes descendants."
descendant: "descendant of selected" descendant: "descendant of selected"
@ -452,9 +452,12 @@ it:
code: 'Stato' code: 'Stato'
explanation: 'Descrizione stato' explanation: 'Descrizione stato'
codes: codes:
not_started: 'Not started'
on_track: 'Nei limiti' on_track: 'Nei limiti'
at_risk: 'A rischio' at_risk: 'A rischio'
off_track: 'Fuori limite' off_track: 'Fuori limite'
finished: 'Finished'
discontinued: 'Discontinued'
query: query:
column_names: "Colonne" column_names: "Colonne"
relations_to_type_column: "Relazioni con %{type}" relations_to_type_column: "Relazioni con %{type}"
@ -2345,9 +2348,9 @@ it:
setting_apiv3_cors_origins: "Origini di condivisione CORS (Cross-Origin Resource Sharing) API V3 consentite" setting_apiv3_cors_origins: "Origini di condivisione CORS (Cross-Origin Resource Sharing) API V3 consentite"
setting_apiv3_cors_origins_text_html: > setting_apiv3_cors_origins_text_html: >
Se CORS è abilitato, queste sono le origini che possono accedere alle API di OpenProject. <br/> Controlla la <a href="%{origin_link}" target="_blank">Documentazione sull'intestazione dell'origine</a> per sapere come specificare i valori previsti. Se CORS è abilitato, queste sono le origini che possono accedere alle API di OpenProject. <br/> Controlla la <a href="%{origin_link}" target="_blank">Documentazione sull'intestazione dell'origine</a> per sapere come specificare i valori previsti.
setting_apiv3_max_page_size: "Maximum API page size" setting_apiv3_max_page_size: "Dimensione massima della pagina API"
setting_apiv3_max_page_instructions_html: > setting_apiv3_max_page_instructions_html: >
Set the maximum page size the API will respond with. It will not be possible to perform API requests that return more values on a single page. <br/> <strong>Warning:</strong> Please only change this value if you are sure why you need it. Setting to a high value will result in significant performance impacts, while a value lower than the per page options will cause errors in paginated views. Imposta la dimensione massima della pagina con cui l'API risponderà. Non sarà possibile eseguire richieste API che restituiscono più valori su una singola pagina. <br/> <strong>Attenzione:</strong> Si prega di modificare questo valore solo se sei sicuro del motivo per cui ne hai bisogno. La definizione di un valore elevato comporterà un impatto significativo sulle prestazioni, mentre un valore inferiore alle opzioni per pagina causerà errori nelle viste paginate.
setting_apiv3_docs: "Documentazione" setting_apiv3_docs: "Documentazione"
setting_apiv3_docs_enabled: "Abilita pagina di documenti" setting_apiv3_docs_enabled: "Abilita pagina di documenti"
setting_apiv3_docs_enabled_instructions_html: > setting_apiv3_docs_enabled_instructions_html: >

@ -450,9 +450,12 @@ ja:
code: 'ステータス' code: 'ステータス'
explanation: '状況の説明' explanation: '状況の説明'
codes: codes:
not_started: 'Not started'
on_track: '順調' on_track: '順調'
at_risk: 'リスクあり' at_risk: 'リスクあり'
off_track: '脱線' off_track: '脱線'
finished: 'Finished'
discontinued: 'Discontinued'
query: query:
column_names: "列" column_names: "列"
relations_to_type_column: "%{type} との関連" relations_to_type_column: "%{type} との関連"

@ -61,6 +61,7 @@ af:
button_confirm: "Confirm" button_confirm: "Confirm"
button_continue: "Continue" button_continue: "Continue"
button_copy: "Kopieer" button_copy: "Kopieer"
button_copy_to_other_project: "Copy to other project"
button_custom-fields: "Pasgemaakte velde" button_custom-fields: "Pasgemaakte velde"
button_delete: "Skrap" button_delete: "Skrap"
button_delete_watcher: "Delete watcher" button_delete_watcher: "Delete watcher"

@ -61,6 +61,7 @@ ar:
button_confirm: "تأكيد" button_confirm: "تأكيد"
button_continue: "Continue" button_continue: "Continue"
button_copy: "انسخ" button_copy: "انسخ"
button_copy_to_other_project: "Copy to other project"
button_custom-fields: "الحقول المخصصة" button_custom-fields: "الحقول المخصصة"
button_delete: "احذف" button_delete: "احذف"
button_delete_watcher: "احذف المراقب" button_delete_watcher: "احذف المراقب"

@ -61,6 +61,7 @@ az:
button_confirm: "Confirm" button_confirm: "Confirm"
button_continue: "Continue" button_continue: "Continue"
button_copy: "Copy" button_copy: "Copy"
button_copy_to_other_project: "Copy to other project"
button_custom-fields: "Custom fields" button_custom-fields: "Custom fields"
button_delete: "Delete" button_delete: "Delete"
button_delete_watcher: "İzləyicini sil" button_delete_watcher: "İzləyicini sil"

@ -61,6 +61,7 @@ bg:
button_confirm: "Confirm" button_confirm: "Confirm"
button_continue: "Продължаване" button_continue: "Продължаване"
button_copy: "Копиране" button_copy: "Копиране"
button_copy_to_other_project: "Copy to other project"
button_custom-fields: "допълнителни полета" button_custom-fields: "допълнителни полета"
button_delete: "Изтрий" button_delete: "Изтрий"
button_delete_watcher: "Премахни наблюдаващ" button_delete_watcher: "Премахни наблюдаващ"

@ -61,6 +61,7 @@ ca:
button_confirm: "Confirmar" button_confirm: "Confirmar"
button_continue: "Continue" button_continue: "Continue"
button_copy: "Copiar" button_copy: "Copiar"
button_copy_to_other_project: "Copy to other project"
button_custom-fields: "Camps personalitzats" button_custom-fields: "Camps personalitzats"
button_delete: "Esborrar" button_delete: "Esborrar"
button_delete_watcher: "Suprimir l'observador" button_delete_watcher: "Suprimir l'observador"

@ -39,13 +39,13 @@ cs:
You can trigger a backup here. The process can take some time depending on the amount of data (especially attachments) you have. You will receive an email once it's ready. You can trigger a backup here. The process can take some time depending on the amount of data (especially attachments) you have. You will receive an email once it's ready.
note: > note: >
A new backup will override any previous one. Only a limited number of backups per day can be requested. A new backup will override any previous one. Only a limited number of backups per day can be requested.
last_backup: Last backup last_backup: Poslední záloha
last_backup_from: Last backup from last_backup_from: Poslední záloha z
title: Backup OpenProject title: Zálohovat OpenProject
options: Možnosti options: Možnosti
include_attachments: Include attachments include_attachments: Zahrnout přílohy
download_backup: Download backup download_backup: Stáhnout zálohu
request_backup: Request backup request_backup: Žádost o zálohu
close_popup_title: "Zavřít okno" close_popup_title: "Zavřít okno"
close_filter_title: "Zavřít filtr" close_filter_title: "Zavřít filtr"
close_form_title: "Zavřít formulář" close_form_title: "Zavřít formulář"
@ -61,6 +61,7 @@ cs:
button_confirm: "Potvrdit" button_confirm: "Potvrdit"
button_continue: "Pokračovat" button_continue: "Pokračovat"
button_copy: "Kopírovat" button_copy: "Kopírovat"
button_copy_to_other_project: "Copy to other project"
button_custom-fields: "Vlastní pole" button_custom-fields: "Vlastní pole"
button_delete: "Odstranit" button_delete: "Odstranit"
button_delete_watcher: "Smazat sledujícího uživatele" button_delete_watcher: "Smazat sledujícího uživatele"
@ -97,7 +98,7 @@ cs:
caption_rate_history: "Historie kurzů" caption_rate_history: "Historie kurzů"
clipboard: clipboard:
browser_error: "Váš prohlížeč nepodporuje, kopírování do schránky. Ručně zkopírujte vybraný text." browser_error: "Váš prohlížeč nepodporuje, kopírování do schránky. Ručně zkopírujte vybraný text."
copied_successful: "Successfully copied to clipboard!" copied_successful: "Úspěšně zkopírováno do schránky!"
chart: chart:
type: 'Typ grafu' type: 'Typ grafu'
axis_criteria: 'Kritéria osy' axis_criteria: 'Kritéria osy'
@ -124,7 +125,7 @@ cs:
preview: 'Přepnout režim náhledu' preview: 'Přepnout režim náhledu'
source_code: 'Přepnout zdrojový mód Markdown' source_code: 'Přepnout zdrojový mód Markdown'
error_saving_failed: 'Uložení dokumentu se nezdařilo s následující chybou: %{error}' error_saving_failed: 'Uložení dokumentu se nezdařilo s následující chybou: %{error}'
ckeditor_error: 'An error occurred within CKEditor' ckeditor_error: 'Došlo k chybě v CKEditoru'
mode: mode:
manual: 'Přepněte do Markdown zdroje' manual: 'Přepněte do Markdown zdroje'
wysiwyg: 'Přepnout na WYSIWYG Editor' wysiwyg: 'Přepnout na WYSIWYG Editor'
@ -132,8 +133,8 @@ cs:
error: 'Cannot expand macro: %{message}' error: 'Cannot expand macro: %{message}'
attribute_reference: attribute_reference:
macro_help_tooltip: 'This text segment is being dynamically rendered by a macro.' macro_help_tooltip: 'This text segment is being dynamically rendered by a macro.'
not_found: 'Requested resource could not be found' not_found: 'Požadovaný zdroj nebyl nalezen.'
invalid_attribute: "The selected attribute '%{name}' does not exist." invalid_attribute: "Vybraný atribut '%{name}' neexistuje."
child_pages: child_pages:
button: 'Odkazy na podřízené stránky' button: 'Odkazy na podřízené stránky'
include_parent: 'Zahrnout rodiče' include_parent: 'Zahrnout rodiče'
@ -183,59 +184,59 @@ cs:
new_group: 'Nová skupina' new_group: 'Nová skupina'
reset_to_defaults: 'Obnovit výchozí nastavení' reset_to_defaults: 'Obnovit výchozí nastavení'
enterprise: enterprise:
text_reprieve_days_left: "%{days} days until end of grace period" text_reprieve_days_left: "%{days} dní do konce doby odkladu"
text_expired: "expired" text_expired: "vypršela platnost"
trial: trial:
confirmation: "Confirmation of email address" confirmation: "Potvrzení e-mailové adresy"
confirmation_info: > confirmation_info: >
We sent you an email on %{date} to %{email}. Please check your inbox and click the confirmation link provided to start your 14 days trial. Poslali jsme Vám e-mail od %{date} do %{email}. Zkontrolujte prosím svou doručenou poštu a klikněte na odkaz pro potvrzení poskytnutý pro zahájení čtrnáctidenního zkušebního období.
form: form:
general_consent: > general_consent: >
I agree with the <a target="_blank" href="%{link_terms}">terms of service</a> and the <a target="_blank" href="%{link_privacy}">privacy policy</a>. I agree with the <a target="_blank" href="%{link_terms}">terms of service</a> and the <a target="_blank" href="%{link_privacy}">privacy policy</a>.
invalid_email: "Invalid email address" invalid_email: "Neplatná e-mailová adresa"
label_company: "Company" label_company: "Společnost"
label_first_name: "Křestní jméno" label_first_name: "Křestní jméno"
label_last_name: "Příjmení" label_last_name: "Příjmení"
label_domain: "Domain" label_domain: "Doména"
label_subscriber: "Odběratel" label_subscriber: "Odběratel"
label_maximum_users: "Maximální počet aktivních uživatelů" label_maximum_users: "Maximální počet aktivních uživatelů"
label_starts_at: "Starts at" label_starts_at: "Začíná v"
label_expires_at: "Vyprší za" label_expires_at: "Vyprší za"
receive_newsletter: I want to receive the OpenProject <a target="_blank" href="%{link}">newsletter</a>. receive_newsletter: I want to receive the OpenProject <a target="_blank" href="%{link}">newsletter</a>.
taken_domain: There can only be one active trial per domain. taken_domain: There can only be one active trial per domain.
taken_email: Each user can only create one trial. taken_email: Každý uživatel může vytvořit pouze jednu zkušební verzi.
email_not_received: "You did not receive an email? You can resend the email with the link on the right." email_not_received: "Neobdrželi jste e-mail? Můžete znovu odeslat e-mail s odkazem vpravo."
try_another_email: "Or try it with another email address." try_another_email: "Nebo to zkuste s jinou e-mailovou adresou."
next_steps: "Next steps" next_steps: "Další kroky"
resend_link: "Resend" resend_link: "Znovu odeslat"
resend_success: "Email has been resent. Please check your emails and click the confirmation link provided." resend_success: "E-mail byl znovu odeslán. Zkontrolujte své e-maily a klikněte na odkaz pro potvrzení."
resend_warning: "Could not resend email." resend_warning: "E-mail nelze znovu odeslat."
session_timeout: "Your session timed out. Please try to reload the page or resend email." session_timeout: "Vypršel časový limit relace. Zkuste stránku znovu načíst nebo znovu odeslat e-mail."
status_label: "Status:" status_label: "Stav:"
status_confirmed: "confirmed" status_confirmed: "potvrzeno"
status_waiting: "email sent - waiting for confirmation" status_waiting: "e-mail odeslán - čeká na potvrzení"
test_ee: "Test the Enterprise Edition 14 days for free" test_ee: "Vyzkoušejte Enterprise Edition 14 dní zdarma"
quick_overview: "Get a quick overview of project management and team collaboration with OpenProject Enterprise Edition." quick_overview: "Get a quick overview of project management and team collaboration with OpenProject Enterprise Edition."
upsale: upsale:
become_hero: "Staň se hrdinou!" become_hero: "Staň se hrdinou!"
benefits: benefits:
description: "What are the benefits of the Enterprise on-premises Edition?" description: "Jaké jsou výhody Enterprise on-premises Edice?"
high_security: "Security features" high_security: "Bezpečnostní prvky"
high_security_text: "Single sign on (SAML, OpenID Connect, CAS), two-factor authentication and automatic sync of LDAP groups." high_security_text: "Single sign on (SAML, OpenID Connect, CAS), two-factor authentication and automatic sync of LDAP groups."
installation: "Installation support" installation: "Instalační podpora"
installation_text: "Experienced software engineers guide you through the complete installation and setup process in your own infrastructure." installation_text: "Experienced software engineers guide you through the complete installation and setup process in your own infrastructure."
premium_features: "Premium features" premium_features: "Prémiové funkce"
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." premium_features_text: "Agile boards, custom theme and logo, graphs, intelligent workflows with custom actions, full text search for work package attachments and multi-select custom fields."
professional_support: "Profesionální podpora" professional_support: "Profesionální podpora"
professional_support_text: "Get reliable, high-touch support from senior support engineers with expert knowledge about running OpenProject in business-critical environments." professional_support_text: "Get reliable, high-touch support from senior support engineers with expert knowledge about running OpenProject in business-critical environments."
button_start_trial: "Start free trial" button_start_trial: "Zahájit zkušební verzi zdarma"
button_book_now: "Book now" button_book_now: "Rezervujte nyní"
confidence: > confidence: >
We deliver the confidence of a tested and supported enterprise-class project management software - with Open Source and an open mind. We deliver the confidence of a tested and supported enterprise-class project management software - with Open Source and an open mind.
link_quote: "Get a quote" link_quote: "Získat cenovou nabídku"
text: > 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. The OpenProject Enterprise Edition builds on top of the Community Edition. It includes premium features and professional support mainly aimed at organizations with more than 10 users that manage business critical projects with OpenProject.
unlimited: "Unlimited" unlimited: "Bez omezení"
you_contribute: "Developers need to pay their bills, too. With the Enterprise Edition, you substantially contribute to this Open Source community effort." you_contribute: "Developers need to pay their bills, too. With the Enterprise Edition, you substantially contribute to this Open Source community effort."
custom_actions: custom_actions:
date: date:
@ -281,7 +282,7 @@ cs:
blocks: blocks:
new_features: new_features:
text_new_features: "Přečtěte si o nových funkcích a aktualizacích produktů." text_new_features: "Přečtěte si o nových funkcích a aktualizacích produktů."
learn_about: "Learn more about the new features" learn_about: "Další informace o nových funkcích"
#Include the version to invalidate outdated translations in other locales. #Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release. #Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
'12_0': '12_0':
@ -389,7 +390,7 @@ cs:
label_on: "zapnuto" label_on: "zapnuto"
label_open_menu: "Otevřít nabídku" label_open_menu: "Otevřít nabídku"
label_open_context_menu: "Otevřít kontextovou nabídku" label_open_context_menu: "Otevřít kontextovou nabídku"
label_open_work_packages: "otevřít" label_open_work_packages: "open"
label_password: "Heslo" label_password: "Heslo"
label_previous: "Předchozí" label_previous: "Předchozí"
label_per_page: "Na stránku:" label_per_page: "Na stránku:"
@ -397,7 +398,7 @@ cs:
label_project_plural: "Projekty" label_project_plural: "Projekty"
label_visibility_settings: "Nastavení viditelnosti" label_visibility_settings: "Nastavení viditelnosti"
label_quote_comment: "Citovat tento komentář" label_quote_comment: "Citovat tento komentář"
label_recent: "Recent" label_recent: "Nedávné"
label_reset: "Obnovit" label_reset: "Obnovit"
label_remove: "Odstranit" label_remove: "Odstranit"
label_remove_column: "Odstranit sloupec" label_remove_column: "Odstranit sloupec"
@ -416,15 +417,15 @@ cs:
label_sort_lower: "Přesunout níž" label_sort_lower: "Přesunout níž"
label_sorting: "Řazení" label_sorting: "Řazení"
label_spent_time: "Strávený čas" label_spent_time: "Strávený čas"
label_star_query: "Zabráněno" label_star_query: "Oblíbená"
label_press_enter_to_save: "Stiskněte Enter pro uložení." label_press_enter_to_save: "Stiskněte Enter pro uložení."
label_public_query: "Veřejné" label_public_query: "Veřejné"
label_sum: "Sum" label_sum: "Suma"
label_sum_for: "Součet pro" label_sum_for: "Součet pro"
label_total_sum: "Total sum" label_total_sum: "Celková SUMA"
label_subject: "Předmět" label_subject: "Předmět"
label_this_week: "tento týden" label_this_week: "tento týden"
label_today: "Today" label_today: "Dnes"
label_time_entry_plural: "Strávený čas" label_time_entry_plural: "Strávený čas"
label_up: "Nahoru" label_up: "Nahoru"
label_user_plural: "Uživatelé" label_user_plural: "Uživatelé"
@ -437,7 +438,7 @@ cs:
label_children_derived_duration: "Work package's children derived duration" label_children_derived_duration: "Work package's children derived duration"
label_warning: "Varování" label_warning: "Varování"
label_work_package: "Pracovní balíček" label_work_package: "Pracovní balíček"
label_work_package_parent: "Parent work package" label_work_package_parent: "Nadřazený pracovní balíček"
label_work_package_plural: "Pracovní balíčky" label_work_package_plural: "Pracovní balíčky"
label_watch: "Sledovat" label_watch: "Sledovat"
label_watch_work_package: "Sledovat pracovní balíček" label_watch_work_package: "Sledovat pracovní balíček"
@ -483,7 +484,7 @@ cs:
got_it: 'Rozumím' got_it: 'Rozumím'
steps: steps:
help_menu: 'The Help (?) menu provides <b>additional help resources</b>. Here you can find a user guide and helpful how-to videos and more. <br> Enjoy your work with OpenProject!' help_menu: 'The Help (?) menu provides <b>additional help resources</b>. Here you can find a user guide and helpful how-to videos and more. <br> Enjoy your work with OpenProject!'
members: 'Invite new <b>members</b> to join your project.' members: 'Pozvěte nové <b>členy</b> , aby se připojili k vašemu projektu.'
project_selection: 'Please click on one of the demo projects that we have prepared. Demo data is currently only available in English. <br> The general <b>demo project</b> suits best for classical project management, while the <b>Scrum project</b> is better for agile project management.' project_selection: 'Please click on one of the demo projects that we have prepared. Demo data is currently only available in English. <br> The general <b>demo project</b> suits best for classical project management, while the <b>Scrum project</b> is better for agile project management.'
quick_add_button: 'Click on the plus (+) icon in the header navigation to <b>create a new project</b> or to <b>invite coworkers</b>.' quick_add_button: 'Click on the plus (+) icon in the header navigation to <b>create a new project</b> or to <b>invite coworkers</b>.'
sidebar_arrow: "Use the return arrow in the top left corner to return to the project’s <b>main menu</b>." sidebar_arrow: "Use the return arrow in the top left corner to return to the project’s <b>main menu</b>."
@ -505,19 +506,19 @@ cs:
list: 'This <b>work</b> package overview provides a list of all the work in your project, such as tasks, milestones, phases, and more. <br> 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.' list: 'This <b>work</b> package overview provides a list of all the work in your project, such as tasks, milestones, phases, and more. <br> 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 <b>work package details</b> view provides all the relevant information pertaining to a given work package, such as its description, status, priority, activities, dependencies, and comments.' full_view: 'The <b>work package details</b> 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.' back_button: 'Use the return arrow in the top left corner to exit and return to the work package list.'
create_button: 'The <b>+ Create</b> button will add a new work package to your project.' create_button: 'Tlačítko <b>Vytvořit</b> přidá do vašeho projektu nový pracovní balíček.'
timeline_button: 'You can activate the <b>Gantt chart</b> view to create a timeline for your project.' timeline_button: 'Můžete aktivovat <b>Gantt graf</b> pro vytvoření časové osy pro váš projekt.'
timeline: 'Here you can <b>edit your project plan</b>, create new work packages, such as tasks, milestones, phases, and more, as well as <b>add dependencies</b>. All team members can see and update the latest plan at any time.' timeline: 'Here you can <b>edit your project plan</b>, create new work packages, such as tasks, milestones, phases, and more, as well as <b>add dependencies</b>. All team members can see and update the latest plan at any time.'
notifications: notifications:
title: "Notifications" title: "Oznámení"
no_unread: "No unread notifications" no_unread: "Žádná nepřečtená oznámení"
reasons: reasons:
mentioned: 'mentioned' mentioned: 'zmíněn'
watched: 'watched' watched: 'sledován'
assigned: 'assigned' assigned: 'přiřazeno'
responsible: 'accountable' responsible: 'Odpovědný'
facets: facets:
unread: 'Unread' unread: 'Nepřečtené'
all: 'Vše' all: 'Vše'
center: center:
and_more_users: and_more_users:
@ -526,57 +527,57 @@ cs:
many: 'and %{count} others' many: 'and %{count} others'
other: 'and %{count} others' other: 'and %{count} others'
no_results: no_results:
at_all: 'New notifications will appear here when there is activity that concerns you' at_all: 'Nová oznámení se zobrazí zde, když se objeví aktivita, která se vás týká'
with_current_filter: 'There are no notifications in this view at the moment' with_current_filter: 'V současné době nejsou v tomto zobrazení žádná oznámení'
mark_all_read: 'Mark all as read' mark_all_read: 'Označit vše jako přečtené'
mark_as_read: 'Mark as read' mark_as_read: 'Označit jako přečteno'
text_update_date: "%{date} by" text_update_date: "%{date} by"
total_count_warning: "Showing the %{newest_count} most recent notifications. %{more_count} more are not displayed." total_count_warning: "Zobrazení posledních oznámení %{newest_count} . Nezobrazuje se ještě %{more_count}"
empty_state: empty_state:
no_notification: "Looks like you're all caught up." no_notification: "Vypadá to, že jste všichno dohnali..."
no_notification_with_current_filter: "Change of involvement or go back to the Inbox to view notifications" no_notification_with_current_filter: "Change of involvement or go back to the Inbox to view notifications"
no_selection: "Click on a notification to view all activity details." no_selection: "Klikněte na oznámení pro zobrazení všech podrobností o aktivitě."
new_notifications: new_notifications:
message: 'There are new notifications.' message: 'Máte nová oznámení.'
link_text: 'Click here to load them' link_text: 'Klikněte zde pro jejich načtení'
menu: menu:
accountable: 'Odpovědný' accountable: 'Odpovědný'
assigned: 'Assigned' assigned: 'Přiřazeno'
by_project: 'Unread by project' by_project: 'Nepřečteno podle projektu'
by_reason: 'Involvement' by_reason: 'Zapojení'
inbox: 'Inbox' inbox: 'Inbox'
mentioned: '@mentioned' mentioned: 'Zmíněn'
watching: 'Watching' watching: 'Sledování'
settings: settings:
change_notification_settings: 'To view and change your notification settings, <a target="_blank" href="%{url}">click here</a>' change_notification_settings: 'Chcete-li zobrazit a změnit nastavení oznámení, <a target="_blank" href="%{url}">klikněte zde</a>'
title: "Notification settings" title: "Nastavení oznámení"
notify_me: "Notify me" notify_me: "Upozornit mě"
reasons: reasons:
mentioned: mentioned:
title: 'I am @mentioned' title: 'Jsem @zmíněn'
description: 'Receive a notification every time someone mentions me anywhere' description: 'Dostat upozornění, kdykoli mě někdo kdekoli zmíní'
involved: involved:
title: 'Assigned to me or accountable' title: 'Přiřazeno mně nebo odpovědně'
description: 'Receive notifications for all activities on work packages for which I am assignee or accountable' description: 'Přijímat oznámení pro všechny aktivity v pracovních balíčcích, pro které jsem pověřen nebo jsem zodpovědný'
watched: 'Updates on watched items' watched: 'Aktualizace u sledovaných položek'
work_package_commented: 'All new comments' work_package_commented: 'Všechny nové komentáře'
work_package_created: 'New work packages' work_package_created: 'Nový pracovní balíček'
work_package_processed: 'All status changes' work_package_processed: 'Všechny změny stavu'
work_package_prioritized: 'All priority changes' work_package_prioritized: 'All priority changes'
work_package_scheduled: 'All date changes' work_package_scheduled: 'Všechny změny data'
global: global:
immediately: immediately:
title: 'Notify me immediately' title: 'Oznamovat mi okamžitě'
description: 'These settings apply to all projects. You can create project-specific exceptions below.' description: 'Tato nastavení platí pro všechny projekty. Níže můžete vytvořit specifické výjimky.'
delayed: delayed:
title: 'Also notify me for' title: 'Upozornit také pro'
description: 'Receive notifications for these activities on work packages in all projects:' description: 'Přijímat oznámení pro tyto aktivity na pracovních balíčcích ve všech projektech:'
project_specific: project_specific:
title: 'Project-specific notification settings' title: "Nastavení upozornění pro konkrétní projekt\n"
description: 'These project-specific settings override default settings above' description: 'These project-specific settings override default settings above'
add: 'Add setting for project' add: 'Přidat nastavení projektu'
already_selected: 'This project is already selected' already_selected: 'Tento projekt je již vybrán'
remove: 'Remove project settings' remove: 'Odstranit nastavení projektu'
password_confirmation: password_confirmation:
field_description: 'Pro potvrzení této změny je třeba zadat heslo k účtu.' field_description: 'Pro potvrzení této změny je třeba zadat heslo k účtu.'
title: 'Pro pokračování potvrďte vaše heslo' title: 'Pro pokračování potvrďte vaše heslo'
@ -596,46 +597,46 @@ cs:
context: 'Kontext projektu' context: 'Kontext projektu'
work_package_belongs_to: 'Tento pracovní balíček náleží projektu %{projectname}.' work_package_belongs_to: 'Tento pracovní balíček náleží projektu %{projectname}.'
click_to_switch_context: 'Otevřete tento pracovní balíček v tomto projektu.' click_to_switch_context: 'Otevřete tento pracovní balíček v tomto projektu.'
confirm_template_load: 'Switching the template will reload the page and you will lose all input to this form. Continue?' confirm_template_load: 'Přepnutí šablony znovu načte stránku a ztratíte všechny vstupy do tohoto formuláře. Pokračovat?'
use_template: "Use template" use_template: "Použít šablonu"
no_template_selected: "(None)" no_template_selected: "(Žádné)"
copy: copy:
copy_options: "Copy options" copy_options: "Možností kopírování"
autocompleter: autocompleter:
label: 'Automatické doplňování projektu' label: 'Automatické doplňování projektu'
reminders: reminders:
settings: settings:
daily: daily:
add_time: 'Add time' add_time: 'Přidat čas'
enable: 'Enable daily email reminders' enable: 'Povolit denní připomenutí e-mailem'
explanation: 'You will receive these reminders only for unread notifications and only at hours you specify. %{no_time_zone}' explanation: 'Tyto připomínky obdržíte pouze pro nepřečtená oznámení a pouze v hodinách, které zadáte. %{no_time_zone}'
no_time_zone: 'Until you configure a time zone for your account, the times will be interpreted to be in UTC.' no_time_zone: 'Until you configure a time zone for your account, the times will be interpreted to be in UTC.'
time_label: 'Time %{counter}:' time_label: 'Čas %{counter}:'
title: 'Send me daily email reminders for unread notifications' title: 'Poslat mi denní připomenutí e-mailem pro nepřečtená oznámení'
workdays: workdays:
title: 'Receive email reminders on these days' title: 'Dostávat připomenutí e-mailem v těchto dnech'
immediate: immediate:
title: 'Send me an email reminder' title: 'Pošlete mi připomenutí e-mailem'
mentioned: 'Immediately when someone @mentions me' mentioned: 'Okamžitě, když mě někdo @zmiňuje'
alerts: alerts:
title: 'Email alerts for other items (that are not work packages)' title: 'Email alerts for other items (that are not work packages)'
explanation: > explanation: >
Notifications today are limited to work packages. You can choose to continue receiving email alerts for these events until they are included in notifications: Notifications today are limited to work packages. You can choose to continue receiving email alerts for these events until they are included in notifications:
news_added: 'Přidané novinky' news_added: 'Přidané novinky'
news_commented: 'Comment on a news item' news_commented: 'Komentář k novince'
document_added: 'Documents added' document_added: 'Dokumenty přidány'
forum_messages: 'New forum messages' forum_messages: 'Nové zprávy o fóru'
wiki_page_added: 'Přidána stránka wiki' wiki_page_added: 'Přidána stránka wiki'
wiki_page_updated: 'Wiki stránka aktualizována' wiki_page_updated: 'Wiki stránka aktualizována'
membership_added: 'Membership added' membership_added: 'Členství přidáno'
membership_updated: 'Membership updated' membership_updated: 'Členství bylo aktualizováno'
title: 'Email reminders' title: 'Upozornění e-mailem'
pause: pause:
label: 'Temporarily pause daily email reminders' label: 'Dočasně pozastavit denní připomenutí e-mailem'
first_day: 'First day' first_day: 'První den'
last_day: 'Last day' last_day: 'Poslední den'
text_are_you_sure: "Jste si jisti?" text_are_you_sure: "Jste si jisti?"
text_data_lost: "All entered data will be lost." text_data_lost: "Všechna zadaná data budou ztracena."
types: types:
attribute_groups: attribute_groups:
error_duplicate_group_name: "Jméno %{group} je již použito. Jména skupin musí být jedinečná." error_duplicate_group_name: "Jméno %{group} je již použito. Jména skupin musí být jedinečná."
@ -643,18 +644,18 @@ cs:
reset_title: "Vyčistit konfiguraci formuláře" reset_title: "Vyčistit konfiguraci formuláře"
confirm_reset: > confirm_reset: >
Upozornění: Opravdu chcete resetovat konfiguraci formuláře? Tato akce obnoví atributy na jejich výchozí skupinu a zakáže VŠECHNY vlastní pole. Upozornění: Opravdu chcete resetovat konfiguraci formuláře? Tato akce obnoví atributy na jejich výchozí skupinu a zakáže VŠECHNY vlastní pole.
upgrade_to_ee: "Upgrade to Enterprise on-premises Edition" upgrade_to_ee: "Upgradovat na Enterprise Edition"
upgrade_to_ee_text: "Páni! Pokud potřebujete tuto funkci, jste super pro! Nevadili byste nám podpořit OpenSource vývojáře tím, že se stanete klientem Enterprise Edition?" upgrade_to_ee_text: "Páni! Pokud potřebujete tuto funkci, jste super pro! Nevadili byste nám podpořit OpenSource vývojáře tím, že se stanete klientem Enterprise Edition?"
more_information: "Více informací" more_information: "Více informací"
nevermind: "Nevadí" nevermind: "Nevadí"
edit: edit:
form_configuration: "Form Configuration" form_configuration: "Konfigurace formuláře"
projects: "Projekty" projects: "Projekty"
settings: "Nastavení" settings: "Nastavení"
time_entry: time_entry:
project: 'Projekt' project: 'Projekt'
work_package: 'Pracovní balíček' work_package: 'Pracovní balíček'
work_package_required: 'Requires selecting a work package first.' work_package_required: 'Vyžaduje nejprve výběr pracovního balíčku.'
activity: 'Aktivita' activity: 'Aktivita'
comment: 'Komentář' comment: 'Komentář'
duration: 'Doba trvání' duration: 'Doba trvání'
@ -662,7 +663,7 @@ cs:
hours: 'Hodiny' hours: 'Hodiny'
title: 'Čas protokolu' title: 'Čas protokolu'
two_factor_authentication: two_factor_authentication:
label_two_factor_authentication: 'Two-factor authentication' label_two_factor_authentication: 'Dvoufázové ověření'
watchers: watchers:
label_loading: načítám sledující... label_loading: načítám sledující...
label_error_loading: Při načítání pozorovatelů došlo k chybě label_error_loading: Při načítání pozorovatelů došlo k chybě
@ -678,7 +679,7 @@ cs:
duplicated: "Duplikováno" duplicated: "Duplikováno"
blocks: "Bloky" blocks: "Bloky"
blocked: "Zablokován" blocked: "Zablokován"
precedes: "Předchází" precedes: "Je předchúdcem"
follows: "Následuje" follows: "Následuje"
includes: "Zahrnuje" includes: "Zahrnuje"
partof: "Část" partof: "Část"
@ -718,7 +719,7 @@ cs:
parent_placeholder: "Vyberte nového rodiče nebo stiskněte úniku pro zrušení." parent_placeholder: "Vyberte nového rodiče nebo stiskněte úniku pro zrušení."
autocompleter: autocompleter:
placeholder: "Zadejte hledaný text" placeholder: "Zadejte hledaný text"
notFoundText: "No items found" notFoundText: "Nenalezeny žádné položky"
typeToSearchText: "Zadejte hledaný text" typeToSearchText: "Zadejte hledaný text"
repositories: repositories:
select_tag: 'Vybrat štítek' select_tag: 'Vybrat štítek'
@ -726,8 +727,8 @@ cs:
field_value_enter_prompt: "Zadejte hodnotu pro '%{field}'" field_value_enter_prompt: "Zadejte hodnotu pro '%{field}'"
project_menu_details: "Podrobnosti" project_menu_details: "Podrobnosti"
scheduling: scheduling:
manual: 'Manual scheduling' manual: 'Manuální plánování'
automatic: 'Automatic scheduling' automatic: 'Automatické plánování'
sort: sort:
sorted_asc: 'Použito vzestupné řazení, ' sorted_asc: 'Použito vzestupné řazení, '
sorted_dsc: 'Použité sestupně ' sorted_dsc: 'Použité sestupně '
@ -870,7 +871,7 @@ cs:
no_results: no_results:
title: Žádné pracovní balíčky k zobrazení. title: Žádné pracovní balíčky k zobrazení.
description: Buď nebyly vytvořeny nebo jsou všechny pracovní balíčky odfiltrovány. description: Buď nebyly vytvořeny nebo jsou všechny pracovní balíčky odfiltrovány.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering, or switch to automatic sorting. limited_results: Pouze %{count} pracovních balíčků může být zobrazeno v ručním režimu třídění. Snížte výsledky filtrováním, nebo přepněte na automatické třídění.
property_groups: property_groups:
details: "Podrobnosti" details: "Podrobnosti"
people: "Lidé" people: "Lidé"
@ -913,8 +914,8 @@ cs:
label_content: "Klikněte zde pro přeskočení nabídky a přejděte na obsah" label_content: "Klikněte zde pro přeskočení nabídky a přejděte na obsah"
placeholders: placeholders:
default: "-" default: "-"
date: "Select date" date: "Vybrat datum"
formattable: "%{name}: Click to edit..." formattable: "%{name}: Klikněte pro editaci..."
query: query:
column_names: "Sloupce" column_names: "Sloupce"
group_by: "Seskupit výsledky podle" group_by: "Seskupit výsledky podle"
@ -941,8 +942,8 @@ cs:
duplicate_query_title: "Název tohoto zobrazení již existuje. Chcete přesto změnit?" duplicate_query_title: "Název tohoto zobrazení již existuje. Chcete přesto změnit?"
text_no_results: "Nebyly nalezeny žádné odpovídající zobrazení." text_no_results: "Nebyly nalezeny žádné odpovídající zobrazení."
scheduling: scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates." is_parent: "Data tohoto pracovního balíčku jsou automaticky odvozena od jeho dětí. Aktivujte 'Manuální plánování' pro ručné nastavení dat."
is_switched_from_manual_to_automatic: "The dates of this work package may need to be recalculated after switching from manual to automatic scheduling due to relationships with other work packages." is_switched_from_manual_to_automatic: "Data tohoto pracovního balíčku budou možná muset být přepočítána po přepnutí z manuálu na automatické plánování kvůli vztahům s ostatními pracovními balíčky."
table: table:
configure_button: 'Konfigurovat tabulku pracovních balíčků' configure_button: 'Konfigurovat tabulku pracovních balíčků'
summary: "Tabulka s řádky pracovního balíčku a atributy sloupců pracovního balíčku." summary: "Tabulka s řádky pracovního balíčku a atributy sloupců pracovního balíčku."
@ -982,7 +983,7 @@ cs:
relation_columns: 'Potřebujete vidět vztahy v seznamu pracovních balíčků?' relation_columns: 'Potřebujete vidět vztahy v seznamu pracovních balíčků?'
check_out_link: 'Podívejte se na Enterprise Edition.' check_out_link: 'Podívejte se na Enterprise Edition.'
relation_filters: relation_filters:
filter_work_packages_by_relation_type: 'Filter work packages by relation type' filter_work_packages_by_relation_type: 'Filtrovat pracovní balíčky podle typu vztahu'
tabs: tabs:
overview: Přehled overview: Přehled
activity: Aktivita activity: Aktivita
@ -1032,13 +1033,13 @@ cs:
confirm_deletion_children: "Jsem si vědom, že všechny potomky uvedených pracovních balíčků budou rekurzivně odstraněny." confirm_deletion_children: "Jsem si vědom, že všechny potomky uvedených pracovních balíčků budou rekurzivně odstraněny."
deletes_children: "Všechny podřízené pracovní balíčky a jejich potomci budou také rekurzivně odstraněny." deletes_children: "Všechny podřízené pracovní balíčky a jejich potomci budou také rekurzivně odstraněny."
destroy_time_entry: destroy_time_entry:
title: "Confirm deletion of time entry" title: "Potvrdit odstranění záznamu času"
text: "Are you sure you want to delete the following time entry?" text: "Opravdu chcete odstranit následující časovou položku?"
notice_no_results_to_display: "Žádné viditelné výsledky k zobrazení." notice_no_results_to_display: "Žádné viditelné výsledky k zobrazení."
notice_successful_create: "Úspěšné vytvoření." notice_successful_create: "Úspěšné vytvoření."
notice_successful_delete: "Úspěšné odstranění." notice_successful_delete: "Úspěšné odstranění."
notice_successful_update: "Úspěšná aktualizace." notice_successful_update: "Úspěšná aktualizace."
notice_job_started: "job started." notice_job_started: "Úloha byla zahájena"
notice_bad_request: "Chybný požadavek." notice_bad_request: "Chybný požadavek."
relations: relations:
empty: Neexistuje žádný vztah empty: Neexistuje žádný vztah
@ -1098,24 +1099,24 @@ cs:
timeline: 'Ganttův diagram' timeline: 'Ganttův diagram'
invite_user_modal: invite_user_modal:
back: 'Zpět' back: 'Zpět'
invite: 'Invite' invite: 'Pozvat'
title: title:
invite: 'Pozvat uživatele' invite: 'Pozvat uživatele'
invite_to_project: 'Invite %{type} to %{project}' invite_to_project: 'Pozvat %{type} do %{project}'
User: 'user' User: 'uživatel'
Group: 'group' Group: 'Skupina'
PlaceholderUser: 'placeholder user' PlaceholderUser: 'placeholder uživatel'
invite_principal_to_project: 'Invite %{principal} to %{project}' invite_principal_to_project: 'Pozvat %{principal} do %{project}'
project: project:
label: 'Projekt' label: 'Projekt'
required: 'Please select a project' required: 'Vyberte projekt'
lacking_permission: 'Please select a different project since you lack permissions to assign users to the currently selected.' 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.' lacking_permission_info: 'Chybí vám oprávnění k přiřazení uživatelů k projektu, ve kterém se právě nacházíte. Musíte vybrat jiný.'
next_button: 'Další' next_button: 'Další'
no_results: 'No projects were found' no_results: 'Nebyly nalezeny žádné projekty'
no_invite_rights: 'You are not allowed to invite members to this project' no_invite_rights: 'Nejste oprávněni pozvat členy do tohoto projektu'
type: type:
required: 'Please select the type to be invited' required: 'Vyberte prosím typ, který chcete pozvat'
user: user:
title: 'Uživatel' title: 'Uživatel'
description: 'Permissions based on the assigned role in the selected project' description: 'Permissions based on the assigned role in the selected project'
@ -1123,46 +1124,46 @@ cs:
title: 'Skupina' title: 'Skupina'
description: 'Permissions based on the assigned role in the selected project' description: 'Permissions based on the assigned role in the selected project'
placeholder: placeholder:
title: 'Placeholder user' title: 'placeholder uživatel'
title_no_ee: 'Placeholder user (Enterprise Edition only feature)' title_no_ee: 'placeholder uživatel (pouze funkce Enterprise Edition)'
description: 'Has no access to the project and no emails are sent out.' description: 'Has no access to the project and no emails are sent out.'
description_no_ee: 'Has no access to the project and no emails are sent out. <br>Check out the <a href="%{eeHref}" target="_blank">Enterprise Edition</a>' description_no_ee: 'Has no access to the project and no emails are sent out. <br>Check out the <a href="%{eeHref}" target="_blank">Enterprise Edition</a>'
principal: principal:
label: label:
name_or_email: 'Name or email address' name_or_email: 'Jméno nebo e-mailová adresa'
name: 'Jméno' name: 'Jméno'
already_member_message: 'Already a member of %{project}' already_member_message: 'Už jsi členem %{project}'
no_results_user: 'No users were found' no_results_user: 'Nebyli nalezeni žádní uživatelé'
invite_user: 'Invite:' invite_user: 'Pozvat'
no_results_placeholder: 'No placeholders were found' no_results_placeholder: 'Nebyly nalezeny žádné placeholdery'
create_new_placeholder: 'Create new placeholder:' create_new_placeholder: 'Vytvořit nový placeholder'
no_results_group: 'No groups were found' no_results_group: 'Nebyly nalezeny žádné skupiny'
next_button: 'Další' next_button: 'Další'
required: required:
user: 'Please select a user' user: 'Vyberte prosím uživatele'
placeholder: 'Please select a placeholder' placeholder: 'Vyberte prosím placeholder'
group: 'Please select a group' group: 'Zvolte prosím skupinu.'
role: role:
label: 'Role in %{project}' label: 'Role v %{project}'
no_roles_found: 'No roles were found' no_roles_found: 'Nebyly nalezeny žádné role.'
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. <a href="https://docs.openproject.org/system-admin-guide/users-permissions/roles-permissions/#roles-and-permissions" target="_blank"> Learn more about roles and permissions. </a>' 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. <a href="https://docs.openproject.org/system-admin-guide/users-permissions/roles-permissions/#roles-and-permissions" target="_blank"> Learn more about roles and permissions. </a>'
required: 'Please select a role' required: 'Vyberte prosím roli'
next_button: 'Další' next_button: 'Další'
message: message:
label: 'Invitation message' label: 'Pozvánka'
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.' 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: 'Zkontrolovat pozvánku'
summary: summary:
next_button: 'Odeslat pozvánku' next_button: 'Odeslat pozvánku'
success: success:
title: '%{principal} was invited!' title: '%{principal} byl pozván!'
description: description:
user: 'The user can now log in to access %{project}. Meanwhile you can already plan with that user and assign work packages for instance.' user: 'The user can now log in to access %{project}. Meanwhile you can already plan with that user and assign work packages for instance.'
placeholder: 'The placeholder can now be used in %{project}. Meanwhile you can already plan with that user and assign work packages for instance.' placeholder: 'The placeholder can now be used in %{project}. Meanwhile you can already plan with that user and assign work packages for instance.'
group: 'The group is now a part of %{project}. Meanwhile you can already plan with that group and assign work packages for instance.' 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: 'Pokračovat' next_button: 'Pokračovat'
forms: forms:
submit_success_message: 'The form was successfully submitted' submit_success_message: 'Formulář byl úspěšně odeslán'
load_error_message: 'There was an error loading the form' load_error_message: 'Při načítání formuláře došlo k chybě'
validation_error_message: 'Please fix the errors present in the form' validation_error_message: 'Opravte prosím chyby ve formuláři'
advanced_settings: 'Pokročilá nastavení' advanced_settings: 'Pokročilá nastavení'

@ -61,6 +61,7 @@ da:
button_confirm: "Bekræft" button_confirm: "Bekræft"
button_continue: "Fortsæt" button_continue: "Fortsæt"
button_copy: "Kopier" button_copy: "Kopier"
button_copy_to_other_project: "Copy to other project"
button_custom-fields: "Selvvalgte felter" button_custom-fields: "Selvvalgte felter"
button_delete: "Slet" button_delete: "Slet"
button_delete_watcher: "Slet tilsynsførende" button_delete_watcher: "Slet tilsynsførende"

@ -61,6 +61,7 @@ de:
button_confirm: "Bestätigen" button_confirm: "Bestätigen"
button_continue: "Fortfahren" button_continue: "Fortfahren"
button_copy: "Kopieren" button_copy: "Kopieren"
button_copy_to_other_project: "Copy to other project"
button_custom-fields: "Benutzerdefinierte Felder" button_custom-fields: "Benutzerdefinierte Felder"
button_delete: "Lösche" button_delete: "Lösche"
button_delete_watcher: "Beobachter löschen" button_delete_watcher: "Beobachter löschen"

@ -61,6 +61,7 @@ el:
button_confirm: "Επιβεβαίωση" button_confirm: "Επιβεβαίωση"
button_continue: "Συνέχεια" button_continue: "Συνέχεια"
button_copy: "Αντιγραφή" button_copy: "Αντιγραφή"
button_copy_to_other_project: "Copy to other project"
button_custom-fields: "Προσαρμοσμένα πεδία" button_custom-fields: "Προσαρμοσμένα πεδία"
button_delete: "Διαγραφή" button_delete: "Διαγραφή"
button_delete_watcher: "Διαγραφή παρατηρητή" button_delete_watcher: "Διαγραφή παρατηρητή"

@ -61,6 +61,7 @@ eo:
button_confirm: "Konfirmi" button_confirm: "Konfirmi"
button_continue: "Daŭrigi" button_continue: "Daŭrigi"
button_copy: "Kopii" button_copy: "Kopii"
button_copy_to_other_project: "Copy to other project"
button_custom-fields: "Propraj kampoj" button_custom-fields: "Propraj kampoj"
button_delete: "Forigi" button_delete: "Forigi"
button_delete_watcher: "Forigi observantojn" button_delete_watcher: "Forigi observantojn"

@ -61,6 +61,7 @@ es:
button_confirm: "Confirmar" button_confirm: "Confirmar"
button_continue: "Continuar" button_continue: "Continuar"
button_copy: "Copiar" button_copy: "Copiar"
button_copy_to_other_project: "Copy to other project"
button_custom-fields: "Campos Personalizados" button_custom-fields: "Campos Personalizados"
button_delete: "Borrar" button_delete: "Borrar"
button_delete_watcher: "Eliminar los observadores" button_delete_watcher: "Eliminar los observadores"

@ -61,6 +61,7 @@ et:
button_confirm: "Confirm" button_confirm: "Confirm"
button_continue: "Jätka" button_continue: "Jätka"
button_copy: "Kopeeri" button_copy: "Kopeeri"
button_copy_to_other_project: "Copy to other project"
button_custom-fields: "Lisaväljad" button_custom-fields: "Lisaväljad"
button_delete: "Kustuta" button_delete: "Kustuta"
button_delete_watcher: "Kustuta jäligja" button_delete_watcher: "Kustuta jäligja"

@ -61,6 +61,7 @@ fa:
button_confirm: "تایید" button_confirm: "تایید"
button_continue: "Continue" button_continue: "Continue"
button_copy: "کپی" button_copy: "کپی"
button_copy_to_other_project: "Copy to other project"
button_custom-fields: "Custom fields" button_custom-fields: "Custom fields"
button_delete: "حذف" button_delete: "حذف"
button_delete_watcher: "حذف ناظر" button_delete_watcher: "حذف ناظر"

@ -61,6 +61,7 @@ fi:
button_confirm: "Vahvista" button_confirm: "Vahvista"
button_continue: "Jatka" button_continue: "Jatka"
button_copy: "Kopioi" button_copy: "Kopioi"
button_copy_to_other_project: "Copy to other project"
button_custom-fields: "Mukautetut kentät" button_custom-fields: "Mukautetut kentät"
button_delete: "Poista" button_delete: "Poista"
button_delete_watcher: "Poista seuraaja" button_delete_watcher: "Poista seuraaja"

@ -61,6 +61,7 @@ fil:
button_confirm: "Kumpirmahin" button_confirm: "Kumpirmahin"
button_continue: "Magpatuloy" button_continue: "Magpatuloy"
button_copy: "Kopyahin" button_copy: "Kopyahin"
button_copy_to_other_project: "Copy to other project"
button_custom-fields: "Mga pasadyang patlang" button_custom-fields: "Mga pasadyang patlang"
button_delete: "Burahin" button_delete: "Burahin"
button_delete_watcher: "Burahin ang manunuod" button_delete_watcher: "Burahin ang manunuod"

@ -61,6 +61,7 @@ fr:
button_confirm: "Confirmer" button_confirm: "Confirmer"
button_continue: "Continuer" button_continue: "Continuer"
button_copy: "Copier" button_copy: "Copier"
button_copy_to_other_project: "Copy to other project"
button_custom-fields: "Champs personnalisés" button_custom-fields: "Champs personnalisés"
button_delete: "Supprimer" button_delete: "Supprimer"
button_delete_watcher: "Supprimer observateur" button_delete_watcher: "Supprimer observateur"

@ -61,6 +61,7 @@ he:
button_confirm: "אשר" button_confirm: "אשר"
button_continue: "Continue" button_continue: "Continue"
button_copy: "העתק" button_copy: "העתק"
button_copy_to_other_project: "Copy to other project"
button_custom-fields: "שדות מותאמים אישית" button_custom-fields: "שדות מותאמים אישית"
button_delete: "מחק" button_delete: "מחק"
button_delete_watcher: "הסרת צופה" button_delete_watcher: "הסרת צופה"

@ -61,6 +61,7 @@ hi:
button_confirm: "Confirm" button_confirm: "Confirm"
button_continue: "Continue" button_continue: "Continue"
button_copy: "परतििि बन" button_copy: "परतििि बन"
button_copy_to_other_project: "Copy to other project"
button_custom-fields: "Custom fields" button_custom-fields: "Custom fields"
button_delete: "मि" button_delete: "मि"
button_delete_watcher: "दरष हट" button_delete_watcher: "दरष हट"

@ -61,6 +61,7 @@ hr:
button_confirm: "Potvrdi" button_confirm: "Potvrdi"
button_continue: "Nastavi" button_continue: "Nastavi"
button_copy: "Kopiraj" button_copy: "Kopiraj"
button_copy_to_other_project: "Copy to other project"
button_custom-fields: "Prilagođena polja" button_custom-fields: "Prilagođena polja"
button_delete: "Obriši" button_delete: "Obriši"
button_delete_watcher: "Izbrišite nadglednika" button_delete_watcher: "Izbrišite nadglednika"

@ -63,6 +63,7 @@ hu:
button_confirm: "Jóváhagy" button_confirm: "Jóváhagy"
button_continue: "Folytatás" button_continue: "Folytatás"
button_copy: "Másol" button_copy: "Másol"
button_copy_to_other_project: "Copy to other project"
button_custom-fields: "Választható mezők" button_custom-fields: "Választható mezők"
button_delete: "Törlés" button_delete: "Törlés"
button_delete_watcher: "Megfigyelő törlése" button_delete_watcher: "Megfigyelő törlése"

@ -61,6 +61,7 @@ id:
button_confirm: "Konfirmasi" button_confirm: "Konfirmasi"
button_continue: "Lanjut" button_continue: "Lanjut"
button_copy: "Salin" button_copy: "Salin"
button_copy_to_other_project: "Copy to other project"
button_custom-fields: "Isian kustom" button_custom-fields: "Isian kustom"
button_delete: "Hapus" button_delete: "Hapus"
button_delete_watcher: "Hapus pemantau" button_delete_watcher: "Hapus pemantau"

@ -61,6 +61,7 @@ it:
button_confirm: "Conferma" button_confirm: "Conferma"
button_continue: "Continua" button_continue: "Continua"
button_copy: "Copia" button_copy: "Copia"
button_copy_to_other_project: "Copy to other project"
button_custom-fields: "Campo personalizzato" button_custom-fields: "Campo personalizzato"
button_delete: "Cancella" button_delete: "Cancella"
button_delete_watcher: "Elimina osservatore" button_delete_watcher: "Elimina osservatore"

@ -62,6 +62,7 @@ ja:
button_confirm: "確認" button_confirm: "確認"
button_continue: "続行" button_continue: "続行"
button_copy: "コピー" button_copy: "コピー"
button_copy_to_other_project: "Copy to other project"
button_custom-fields: "カスタムフィールド" button_custom-fields: "カスタムフィールド"
button_delete: "削除" button_delete: "削除"
button_delete_watcher: "ウォッチャーを削除" button_delete_watcher: "ウォッチャーを削除"

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save