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. 4
      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. 6
      app/models/permitted_params.rb
  21. 15
      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. 10
      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. 39
      app/workers/mails/member_job.rb
  52. 14
      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
- uses: pullpreview/action@v5
with:
admins: crohr,HDinger,machisuji,oliverguenther,ulferts,wielinde,b12f
admins: crohr,HDinger,machisuji,oliverguenther,ulferts,wielinde,b12f,cbliard
always_on: dev
compose_files: docker-compose.pullpreview.yml
instance_type: medium_2_0

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

3
.gitignore vendored

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

@ -139,6 +139,10 @@ Rails/HttpPositionalArguments:
Exclude:
- '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.
# This is done for multiple reasons:
# * performance, as setting up integration tests is costly
@ -194,6 +198,7 @@ RSpec/NamedSubject:
RSpec/ContextWording:
Prefixes:
- as
- when
- with
- without

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

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

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

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

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

@ -75,8 +75,6 @@ class GroupsController < ApplicationController
# GET /groups/1/edit
def edit
@group = Group.includes(:members, :users).find(params[:id])
set_filters_for_user_autocompleter
end
# POST /groups
@ -154,7 +152,7 @@ class GroupsController < ApplicationController
end
def create_memberships
membership_params = permitted_params.group_membership[:new_membership]
membership_params = permitted_params.group_membership[:membership]
service_call = Members::CreateService
.new(user: current_user)
@ -176,12 +174,13 @@ class GroupsController < ApplicationController
end
def destroy_membership
member = Member.find(params[:membership_id])
Members::DeleteService
.new(model: Member.find(params[:membership_id]), user: current_user)
.new(model: member, user: current_user)
.call
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
protected
@ -222,7 +221,15 @@ class GroupsController < ApplicationController
flash[:error] = service_call.errors.full_messages.join("\n")
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
def respond_users_altered(service_call)

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

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

@ -37,12 +37,42 @@ module MembersHelper
def global_member_role_deletion_link(member, role)
if member.roles.length == 1
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) })
else
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) })
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

@ -78,8 +78,8 @@ class MemberMailer < ApplicationMailer
end
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
@roles = member.roles

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

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

@ -34,7 +34,7 @@ class Member < ApplicationRecord
extend DeprecatedAlias
belongs_to :principal, foreign_key: 'user_id'
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
validates_presence_of :principal
@ -70,6 +70,13 @@ class Member < ApplicationRecord
member_roles.detect(&:inherited_from).nil?
end
def deletable_role?(role)
member_roles
.only_inherited
.where(role: role)
.none?
end
def include?(principal)
if user?
self.principal == principal

@ -32,6 +32,9 @@ class MemberRole < ApplicationRecord
belongs_to :member, touch: true
belongs_to :role
# `inherited` is reserved ActiveRecord method
scope :only_inherited, -> { where.not(inherited_from: nil) }
validates_presence_of :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,11 +490,7 @@ class PermittedParams
{ membership: [
:project_id,
{ role_ids: [] }
],
new_membership: [
:project_id,
{ role_ids: [] }
] }
] }
],
member: [
role_ids: []

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

@ -38,7 +38,7 @@ module Principals::Scopes
class_methods do
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
else
in_visible_project_or_me(user)

@ -37,5 +37,12 @@ class Projects::Status < ActiveRecord::Base
presence: 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

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

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

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

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

@ -62,19 +62,8 @@ class ::Query::Results
.order(sort_criteria_array)
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
order_option = [group_by_sort].reject(&:blank?).join(', ')
order_option = [group_by_sort].compact_blank.join(', ')
if order_option.blank?
nil

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

@ -29,12 +29,15 @@
#++
class Setting
module Callbacks
module CallbacksHelper
# register a callback for a setting named #name
def register_callback(name, &callback)
# register the block with the underlying notifications system
notifier.subscribe(notification_event_for(name), &callback)
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
# 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.
#++
require_dependency 'token/hashed_token'
module Token
class AutoLogin < HashedToken
end

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

@ -16,8 +16,6 @@
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
require_dependency 'token/base'
module Token
class HashedToken < Base
# 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.
#++
require_dependency 'token/base'
module Token
class Invitation < Base
include ExpirableToken

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

@ -47,14 +47,14 @@ module DevelopmentData
def create_types!(cfs)
# Create ALL CFs types
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])
type.save!
print_status '.'
# Create type
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])
type_req.save!
print_status '.'

@ -85,7 +85,7 @@ module Groups
SELECT members.id, found_users.user_id, members.project_id
FROM members, found_users, group_memberships
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
),
-- 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)
SELECT group_memberships.project_id, found_users.user_id, (SELECT time from timestamp), (SELECT time from timestamp)
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
RETURNING id, user_id, project_id
),
@ -103,7 +103,7 @@ module Groups
SELECT members.id, group_roles.role_id, group_roles.member_role_id
FROM group_roles
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
ON CONFLICT DO NOTHING
RETURNING id, member_id, role_id

@ -78,7 +78,12 @@ module Groups::Concerns
end
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

@ -68,7 +68,7 @@ module Groups
SELECT id
FROM #{Member.table_name}
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
group_member_roles AS (

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

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

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

@ -31,21 +31,14 @@ See COPYRIGHT and LICENSE files for more details.
<div class="grid-content" id="available_principal_roles">
<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? %>
<span id="no_additional_principal_roles">
<%= no_results_box %>
</span>
<% else %>
<span id="additional_principal_roles">
<% args =
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 %>
<%= global_role_membership_form_for(principal, global_member) do %>
<% if global_member %>
<%= hidden_field_tag('membership[id]', global_member.id ) %>
@ -55,7 +48,7 @@ See COPYRIGHT and LICENSE files for more details.
<% end %>
<% available_roles.each do |role| %>
<%= render :partial => 'users/available_global_role', :locals => {:role => role} %>
<%= render partial: 'principals/available_global_role', locals: {role: role} %>
<% end %>
<p><br/><%= styled_button_tag t(:button_add), class: '-with-icon icon-checkmark' %></p>
<% 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 id="assigned_principal_roles" class="grid-content">
@ -59,8 +62,8 @@ See COPYRIGHT and LICENSE files for more details.
</thead>
<tbody id="table_principal_roles_body">
<% global_member.roles.each do |role| %>
<%= render :partial => 'assigned_global_role', :locals => { :role => role, member: global_member } %>
<%end%>
<%= render partial: 'principals/assigned_global_role', locals: { role: role, member: global_member } %>
<% end %>
</tbody>
</table>
@ -69,5 +72,5 @@ See COPYRIGHT and LICENSE files for more details.
<% end %>
</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>

@ -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 %>
@ -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 }%>
</div>
<% end %>

@ -32,19 +32,11 @@ class Mails::MemberCreatedJob < Mails::MemberJob
alias_method :send_for_project_user, :send_added_project
def send_for_group_user(current_user, user_member, group_member, message)
if new_roles_added?(user_member, group_member)
send_updated_project(current_user, user_member, message)
elsif all_roles_added?(user_member, group_member)
difference = Members::RolesDiff.new(user_member, group_member)
if difference.roles_created?
send_added_project(current_user, user_member, message)
elsif difference.roles_updated?
send_updated_project(current_user, user_member, message)
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

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

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

@ -160,7 +160,7 @@ module OpenProject
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.
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.
# 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,
{ 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,
html: { class: 'server_authentication' },
last: true,
if: proc { !OpenProject::Configuration.disable_password_login? }
last: true
menu.push :oauth_applications,
{ controller: '/oauth/applications', action: 'index' },

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

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

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

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

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

@ -63,20 +63,20 @@ cs:
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?
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"
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"
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."
start_trial: 'Start free trial'
book_now: 'Book now'
get_quote: 'Get a quote'
start_trial: 'Začít zkušební verzi'
book_now: 'Rezervujte nyní'
get_quote: 'Získat cenovou nabídku'
buttons:
upgrade: "Upgrade now"
contact: "Contact us for a demo"
enterprise_info_html: "is an Enterprise <strong class='icon-medal'></strong> feature."
upgrade: "Upgradovat nyní"
contact: "Kontaktujte nás pro demo"
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."
announcements:
show_until: Ukázat až do
@ -96,7 +96,7 @@ cs:
background_jobs:
status:
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:
technical_warning_html: |
Tento LDAP formulář vyžaduje technické znalosti nastavení LDAP / Active Directory.
@ -175,7 +175,7 @@ cs:
enabled_in_project: 'Povoleno v projektu'
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?"
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?"
tab:
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_text: "Požadavek na smazání projektu '%{name}' byl dokončen."
index:
open_as_gantt: 'Open as Gantt view'
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: 'Otevřít jako zobrazení Gantt'
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."
no_results_title_text: V současné době nejsou žádné projekty
no_results_content_text: Vytvořit nový projekt
@ -236,7 +236,7 @@ cs:
index:
no_results_title_text: Momentálně nejsou žádní členové součástí tohoto 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:
access_token:
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
users:
groups:
member_in_these_groups: 'This user is currently a member of the following groups:'
no_results_title_text: This user is currently not a member in any group.
member_in_these_groups: 'Tento uživatel je v současné době členem následujících skupin:'
no_results_title_text: Tento uživatel není v současné době členem žádné skupiny.
memberships:
no_results_title_text: Tento uživatel není v současné době členem projektu.
placeholder_users:
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.
delete_tooltip: "Delete placeholder user"
delete_tooltip: "Odstranit placeholder uživatele"
deletion_info:
heading: "Delete placeholder user %{name}"
heading: "Odstranit zástupného uživatele %{name}"
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".
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."
upsale:
title: Placeholder users
title: placeholder uživatel
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.
prioritiies:
@ -309,7 +309,7 @@ cs:
overview:
no_results_title_text: Momentálně zde nejsou žádné pracovní balíčky přiřazené k této verzi.
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.
index:
no_results_content_text: Přidat novou wiki stránku
@ -324,10 +324,10 @@ cs:
other: '%{count} potomků pracovního balíčku'
bulk:
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."
x_out_of_y_could_be_saved: "%{failing} out of the %{total} work packages could not be updated while %{success} could."
none_could_be_saved: "Žádný z %{total} pracovních balíčků nemohl být aktualizován."
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."
descendant: "descendant of selected"
descendant: "potomek vybraného"
move:
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ů'
@ -399,7 +399,7 @@ cs:
attr_mail: "Email"
base_dn: "Base DN"
host: "Hostitel"
onthefly: "Automatic user creation"
onthefly: "Automatické vytváření uživatele"
port: "Port"
changeset:
repository: "Repozitář"
@ -452,14 +452,17 @@ cs:
types: "Typy"
versions: "Verze"
work_packages: "Pracovní balíčky"
templated: 'Template project'
templated: 'Projektová šablona'
projects/status:
code: 'Stav'
explanation: 'Status description'
explanation: 'Popis stavu'
codes:
not_started: 'Not started'
on_track: 'On track'
at_risk: 'At risk'
off_track: 'Off track'
finished: 'Finished'
discontinued: 'Discontinued'
query:
column_names: "Sloupce"
relations_to_type_column: "Vztahy s %{type}"
@ -524,7 +527,7 @@ cs:
parent_work_package: "Rodič"
priority: "Priorita"
progress: "Průběh (%)"
schedule_manually: "Manual scheduling"
schedule_manually: "Manuální plánování"
spent_hours: "Strávený čas"
spent_time: "Strávený čas"
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ů."
circular_dependency: "Tento vztah by vytvořil kruhovou závislost."
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."
error_enterprise_only: "is only available in the OpenProject Enterprise Edition"
error_unauthorized: "may not be accessed."
error_enterprise_only: "je k dispozici pouze v OpenProject Enterprise Edition"
error_unauthorized: "není přístupný."
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é."
even: "musí být sudé."
exclusion: "vyhrazeno."
@ -573,8 +576,8 @@ cs:
invalid_url: 'není platná adresa URL.'
invalid_url_scheme: 'není podporovaný protokol (povoleny: %{allowed_schemes}).'
less_than_or_equal_to: "musí být menší než nebo rovno %{count}."
not_available: "is not available due to a system configuration."
not_deletable: "cannot be deleted."
not_available: "není k dispozici kvůli konfiguraci systému."
not_deletable: "nelze odstranit"
not_current_user: "není aktuální uživatel."
not_a_date: "není platné datum."
not_a_datetime: "není platný čas."
@ -589,7 +592,7 @@ cs:
taken: "je již použito."
too_long: "je příliš dlouhý (maximum 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}'"
unchangeable: "nelze změnit."
unknown_property: "is not a known property."
@ -637,7 +640,7 @@ cs:
outside: 'je mimo mřížku.'
end_before_start: 'konečná hodnota musí být větší než počáteční hodnota.'
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:
read_ian:
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.'
notification_settings:
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}"
parse_schema_filter_params_service:
attributes:
@ -658,7 +661,7 @@ cs:
invalid_values: "Hodnota není platná."
id_filter_required: "Je vyžadován filtr 'id'."
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.'
attributes:
types:
@ -688,7 +691,7 @@ cs:
queries/filters/base:
attributes:
values:
inclusion: "filter has invalid values."
inclusion: "filtr má neplatné hodnoty."
format: "%{message}"
relation:
typed_dag:
@ -717,13 +720,13 @@ cs:
user_preference:
attributes:
pause_reminders:
invalid_range: "can only be a valid date range."
invalid_range: "může být pouze platný časový rozsah."
daily_reminders:
full_hour: "can only be configured to be delivered at a full hour."
wiki_page:
attributes:
slug:
undeducible: "cannot be deduced from the title '%{title}'."
undeducible: "nelze odvodit z názvu '%{title}'."
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ů."
attributes:
@ -731,7 +734,7 @@ cs:
not_start_date: "není v počátečním datu, i když je to nutné pro milníky."
parent:
cannot_be_milestone: "nemůže být milník."
cannot_be_self_assigned: "cannot be assigned to itself."
cannot_be_self_assigned: "nemůže být přiřazeno k sobě."
cannot_be_in_another_project: "nemůže být v jiném projektu."
not_a_valid_parent: "je neplatné."
start_date:
@ -748,7 +751,7 @@ cs:
does_not_exist: "Zadaná kategorie neexistuje."
estimated_hours:
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:
attributes:
attribute_groups:
@ -760,9 +763,9 @@ cs:
user:
attributes:
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:
confirmation: "Password confirmation does not match password."
confirmation: "Hesla se neshodují!"
format: "%{message}"
password:
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"
news: "Novinky"
notification:
one: "Notification"
one: "Oznámení"
few: "Notifications"
many: "Notifications"
other: "Notifications"
placeholder_user: "Placeholder user"
placeholder_user: "placeholder uživatel"
project: "Projekt"
query: "Vlastní dotaz"
role:
@ -860,9 +863,9 @@ cs:
date: "Datum"
default_columns: "Výchozí sloupce"
description: "Popis"
derived_due_date: "Derived finish date"
derived_estimated_hours: "Derived estimated time"
derived_start_date: "Derived start date"
derived_due_date: "Derivované Datum ukončení "
derived_estimated_hours: "Derivované předpokládaný čas"
derived_start_date: "Derivované Datum zahájení "
display_sums: "Zobrazit součty"
due_date: "Datum dokončení"
estimated_hours: "Odhadovaný čas"
@ -899,16 +902,16 @@ cs:
version: "Verze"
work_package: "Pracovní balíček"
backup:
label_backup_token: "Backup token"
label_create_token: "Create backup token"
label_delete_token: "Delete backup token"
label_reset_token: "Reset backup token"
label_token_users: "The following users have active backup tokens"
label_backup_token: "Záložní token"
label_create_token: "Vytvořit záložní token"
label_delete_token: "Odstranit záložní token"
label_reset_token: "Resetovat záložní token"
label_token_users: "Následující uživatelé mají aktivní tokeny pro zálohy"
reset_token:
action_create: Vytvořit
action_reset: Obnovit
heading_reset: "Reset backup token"
heading_create: "Create backup token"
heading_reset: "Resetovat záložní token"
heading_create: "Vytvořit záložní token"
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.
info: >
@ -916,15 +919,15 @@ cs:
verification: >
Enter %{word} to confirm you want to %{action} the backup token.
verification_word_reset: reset
verification_word_create: create
verification_word_create: vytvořit
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.
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:
invalid_token: Invalid or missing backup token
token_cooldown: The backup token will be valid in %{hours} hours.
invalid_token: Neplatný nebo chybí záložní token
token_cooldown: Záložní token bude platný za %{hours} hodin.
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_comment: "Přidat komentář"
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.
update_consent_last_time: "Poslední aktualizace souhlasu: %{update_time}"
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}\"."
failed: "Nebylo možné zkopírovat projekt \"%{source_project_name}\""
failed_internal: "Kopírování se nezdařilo kvůli interní chybě."
@ -1012,9 +1015,9 @@ cs:
errors: "Chyba"
project_custom_fields: 'Vlastní pole projektu'
x_objects_of_this_type:
zero: 'No objects of this type'
one: 'One object of this type'
other: '%{count} objects of this type'
zero: 'Žádné objekty tohoto typu'
one: 'Jeden objekt tohoto typu'
other: '%{count} objektů tohoto typu'
text:
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}\"."
@ -1169,7 +1172,7 @@ cs:
default_status_in_progress: "Probíhá"
default_status_in_specification: "Ve specifikaci"
default_status_in_testing: "V testování"
default_status_new: "Nové"
default_status_new: "Nový"
default_status_on_hold: "Pozastaven"
default_status_rejected: "Odmítnutý"
default_status_scheduled: "Naplánováno"
@ -1235,7 +1238,7 @@ cs:
add_groups: "Přidat nové skupiny atributů"
rename_groups: "Přejmenovat skupiny atributů"
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_work_package_priorities: "Priority pracovního balíčku"
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_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_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_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."
@ -1302,9 +1305,9 @@ cs:
work_package_edit: 'Pracovní balíček upraven'
work_package_note: 'Poznámka k pracovnímu balíčku přidána'
export:
your_work_packages_export: "Your work packages export"
succeeded: "The export has completed successfully."
failed: "The export has failed: %{message}"
your_work_packages_export: "Export pracovních balíčků"
succeeded: "Export úspěšně dokončen."
failed: "Export selhal: %{message}"
format:
atom: "Atom"
csv: "CSV"
@ -1359,19 +1362,19 @@ cs:
image_conversion:
imagemagick: 'Imagemagick'
journals:
changes_retracted: "The changes were retracted."
changes_retracted: "Změny byly staženy."
links:
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_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."
menus:
admin:
mail_notification: "E-mailová upozornění"
incoming_outgoing: "Incoming & Outgoing"
incoming_outgoing: "Příchozí a odchozí"
quick_add:
label: "Open quick add menu"
label: "Otevřít nabídku rychlého přidání"
my_account:
access_tokens:
no_results:
@ -1383,15 +1386,15 @@ cs:
expiration: "Vyprší"
indefinite_expiration: "Nikdy"
notifications:
send_notifications: "Send notifications for this action"
send_notifications: "Odeslat oznámení pro tuto akci"
work_packages:
subject:
created: "The work package was created."
assigned: "You have been assigned to %{work_package}"
subscribed: "You subscribed to %{work_package}"
mentioned: "You have been mentioned in %{work_package}"
responsible: "You have become accountable for %{work_package}"
watched: "You are watching %{work_package}"
created: "Pracovní balíček byl vytvořen."
assigned: "Byli jste přiřazeni k %{work_package}"
subscribed: "Přihlásili jste k odběru %{work_package}"
mentioned: "Byli jste zmíněni v %{work_package}"
responsible: "Stali jste se odpovědnými za %{work_package}"
watched: "Sledujete %{work_package}"
update_info_mail:
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.
@ -1406,9 +1409,9 @@ cs:
Sincerely,
The OpenProject team
body_header: 'Version 12.0 with Notification Center'
body_header: 'Verze 12.0 s oznamovacím centrem'
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_account: "Účet"
label_active: "Aktivní"
@ -1458,7 +1461,7 @@ cs:
label_available_project_versions: 'Dostupné verze'
label_available_project_repositories: 'Dostupné repozitáře'
label_api_documentation: "API dokumentace"
label_backup: "Backup"
label_backup: "Záloha"
label_between: "mezi"
label_blocked_by: "zablokoval"
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_row: "Zaškrtnout/Odznačit vše v řádku"
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_closed_work_packages: "uzavřeno"
label_collapse: "Sbalit"
@ -1524,7 +1527,7 @@ cs:
label_custom_field_plural: "Vlastní pole"
label_custom_field_default_type: "Prázdný typ"
label_custom_style: "Design"
label_database_version: "PostgreSQL version"
label_database_version: "Verze PostgreSQL"
label_date: "Datum"
label_date_and_time: "Datum a čas"
label_date_from: "Od"
@ -1661,11 +1664,11 @@ cs:
label_member_new: "Nový člen"
label_member_all_admin: "(Všechny role z důvodu stavu správce)"
label_member_plural: "Členové"
lable_membership_added: 'Member added'
lable_membership_updated: 'Member updated'
lable_membership_added: 'Člen přidán'
lable_membership_updated: 'Člen aktualizován'
label_menu_badge:
pre_alpha: 'pre-alpha'
alpha: 'alpha'
alpha: 'Alfa'
beta: 'beta'
label_menu_item_name: "Název položky menu"
label_message: "Zpráva"
@ -1691,7 +1694,7 @@ cs:
label_my_queries: "Moje vlastní dotazy"
label_name: "Jméno"
label_never: "Nikdy"
label_new: "Nové"
label_new: "Nový"
label_new_features: "Nové funkce"
label_new_statuses_allowed: "Nové povolené stavy"
label_news_singular: "Novinky"
@ -1738,9 +1741,9 @@ cs:
label_permissions: "Práva"
label_permissions_report: "Přehled oprávnění"
label_personalize_page: "Přizpůsobit tuto stránku"
label_placeholder_user: "Placeholder user"
label_placeholder_user_new: "New placeholder user"
label_placeholder_user_plural: "Placeholder users"
label_placeholder_user: "placeholder uživatel"
label_placeholder_user_new: "Nový placeholder uživatel"
label_placeholder_user_plural: "placeholder uživatelé"
label_planning: "Plánování"
label_please_login: "Přihlaste se prosím"
label_plugins: "Pluginy"
@ -1800,7 +1803,7 @@ cs:
label_required: 'vyžadováno'
label_requires: 'vyžaduje'
label_result_plural: "Výsledky"
label_reverse_chronological_order: "Newest first"
label_reverse_chronological_order: "Od nejnovějších"
label_revision: "Revize"
label_revision_id: "Revize %{value}"
label_revision_plural: "Revize"
@ -1932,8 +1935,8 @@ cs:
label_workflow_plural: "Pracovní vrstvy"
label_workflow_summary: "Souhrn"
label_x_closed_work_packages_abbr:
one: "1 uzavřena"
other: "%{count} uzavřeny"
one: "1 uzavřeno"
other: "%{count} uzavřených"
zero: "0 uzavřeno"
label_x_comments:
one: "1 komentář"
@ -1980,63 +1983,63 @@ cs:
actions: 'Akce'
digests:
including_mention_singular: 'including a mention'
including_mention_plural: 'including %{number_mentioned} mentions'
unread_notification_singular: '1 unread notification'
unread_notification_plural: '%{number_unread} unread notifications'
you_have: 'You have'
including_mention_plural: 'včetně %{number_mentioned} zmínění'
unread_notification_singular: '1 nepřečtené oznámení'
unread_notification_plural: '%{number_unread} nepřečtených oznámení'
you_have: 'Máte'
logo_alt_text: 'Logo'
mention:
subject: "%{user_name} mentioned you in #%{id} - %{subject}"
subject: "%{user_name} vás zmínil v #%{id} - %{subject}"
notification:
center: 'To notification center'
see_in_center: 'See comment in notification center'
settings: 'Change email settings'
salutation: 'Hey %{user}!'
center: 'Centrum oznámení'
see_in_center: 'Zobrazit komentář v oznamovacím centru'
settings: 'Změnit nastavení e-mailu'
salutation: 'Ahoj %{user}!'
work_packages:
created_at: 'Created at %{timestamp} by %{user} '
login_to_see_all: 'Log in to see all notifications.'
mentioned: 'You have been <b>mentioned in a comment</b>'
mentioned_by: '%{user} mentioned you in a comment'
created_at: 'Vytvořeno v %{timestamp} uživatelem %{user} '
login_to_see_all: 'Přihlaste se pro zobrazení všech oznámení.'
mentioned: 'Byli jste <b>zmíněni v komentáři</b>'
mentioned_by: '%{user} vás zmínil v komentáři'
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.'
many: 'There are %{count} more work packages with notifications.'
other: 'There are %{count} more work packages with notifications.'
reason:
watched: 'Watched'
assigned: 'Assigned'
watched: 'Sledováno'
assigned: 'Přiřazen'
responsible: 'Odpovědný'
mentioned: 'Mentioned'
mentioned: 'Zmíněné'
subscribed: 'vše'
prefix: 'Received because of the notification setting: %{reason}'
see_all: 'See all'
updated_at: 'Updated at %{timestamp} by %{user}'
see_all: 'Zobrazit vše'
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_information: "Informace o vašem účtu"
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_token_reset_admin_info: The backup token for user '%{user}' has been reset.
mail_body_backup_token_reset_user_info: Your backup token has been reset.
mail_body_backup_token_info: The previous token is no longer valid.
mail_body_backup_token_reset_user_info: Váš záložní token byl resetován.
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_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_register: "Welcome to OpenProject. Please activate your account by clicking on this link:"
mail_body_register_header_title: "Project member invitation email"
mail_body_register_user: "Dear %{name}, "
mail_body_register: "Vítejte v OpenProject. Aktivujte svůj účet kliknutím na tento odkaz:"
mail_body_register_header_title: "E-mail pozvánka člena projektu"
mail_body_register_user: "Vážený %{name},"
mail_body_register_links_html: |
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.
<br />
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_ending: "Stay connected! Kind regards,"
mail_body_register_closing: "Váš OpenProject tým"
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_group_reminder: "%{count} pracovních balíčků, které jsou přiřazeny ke skupině \"%{group}\", má termín splatnosti během následujících %{days} dnů:"
mail_body_wiki_content_added: "Wiki stránka '%{id}' byla přidána uživatelem %{author}."
mail_body_wiki_content_updated: "Wiki stránka '%{id}' byla aktualizována uživatelem %{author}."
mail_subject_account_activation_request: "Žádost o aktivaci účtu %{value}"
mail_subject_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_lost_password: "Vaše heslo %{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_updated: "'%{id}' wiki stránka byla aktualizována"
mail_member_added_project:
subject: "%{project} - You have been added as a member"
subject: "%{project} - Byli jste přidáni jako člen"
body:
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:"
roles: "You have the following roles:"
roles: "Máte následující role:"
mail_member_updated_project:
subject: "%{project} - Your roles have been updated"
subject: "%{project} - Vaše role byly aktualizovány"
body:
updated_by:
without_message: "%{user} updated the roles you have in the project '%{project}'."
with_message: "%{user} updated the roles you have in the project '%{project}' writing:"
roles: "You now have the following roles:"
roles: "Nyní máte následující role:"
mail_member_updated_global:
subject: "Your global permissions have been updated"
subject: "Vaše globální oprávnění byla aktualizována"
body:
updated_by:
without_message: "%{user} updated the roles you have globally."
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:
subject: Dosažen limit aktivace uživatelů
message: |
@ -2171,8 +2174,8 @@ cs:
permission_add_work_packages: "Přidat pracovní balíčky"
permission_add_messages: "Odesílat zprávy"
permission_add_project: "Vytvořit projekt"
permission_manage_user: "Create and edit users"
permission_manage_placeholder_user: "Create, edit, and delete placeholder users"
permission_manage_user: "Vytvořit a upravit uživatele"
permission_manage_placeholder_user: "Vytvořit, upravit a odstranit placeholder uživatele"
permission_add_subprojects: "Vytvořit podprojekty"
permission_add_work_package_watchers: "Přidat sledující"
permission_assign_versions: "Přiřadit verze"
@ -2212,7 +2215,7 @@ cs:
permission_manage_project_activities: "Spravovat projektové aktivity"
permission_manage_public_queries: "Spravovat veřejné dotazy"
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_wiki: "Spravovat wiki"
permission_manage_wiki_menu: "Spravovat wiki menu"
@ -2220,7 +2223,7 @@ cs:
permission_protect_wiki_pages: "Ochrana stránky wiki"
permission_rename_wiki_pages: "Přejmenovat stránky wiki"
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_manage_types: "Vyberte typy"
permission_view_changesets: "Zobrazit revize repozitáře v OpenProject"
@ -2249,13 +2252,13 @@ cs:
title: Změnit identifikátor projektu
template:
copying: >
Your project is being created from the selected template project. You will be notified by mail as soon as the project is available.
use_template: 'Use template'
make_template: 'Set as template'
remove_from_templates: 'Remove from templates'
Váš projekt se vytváří z vybranéhé šablony. Budete upozorněni e-mailem, jakmile bude projekt k dispozici.
use_template: 'Použít šablonu'
make_template: 'Nastavit jako šablonu'
remove_from_templates: 'Odstranit ze šablon'
archive:
are_you_sure: "Opravdu chcete archivovat projekt '%{name}'?"
archived: "Archived"
archived: "Archivováno"
project_module_activity: "Aktivita"
project_module_forums: "Diskuse"
project_module_work_package_tracking: "Sledování pracovních balíčků"
@ -2271,8 +2274,8 @@ cs:
assigned_to_role: "Řešitelova role"
member_of_group: "Řešitelova skupina"
assignee_or_group: "Přiřazený nebo patřící skupině"
subproject_id: "Including Subproject"
only_subproject_id: "Only subproject"
subproject_id: "Včetně podprojektu"
only_subproject_id: "Pouze podprojekt"
name_or_identifier: "Jméno nebo identifikátor"
repositories:
at_identifier: 'v %{identifier}'
@ -2373,19 +2376,19 @@ cs:
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."
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"
warnings:
cannot_annotate: "Tento soubor nelze přiřadit poznámce."
scheduling:
activated: 'activated'
deactivated: 'deactivated'
activated: 'Aktivováno '
deactivated: 'Deaktivováno'
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_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.
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: >
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"
@ -2426,7 +2429,7 @@ cs:
setting_consent_required: "Souhlas vyžadován"
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_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_default_language: "Výchozí jazyk"
setting_default_projects_modules: "Výchozí zapnutné moduly pro nový projekt"
@ -2437,7 +2440,7 @@ cs:
setting_emails_header: "Záhlaví emailů"
setting_email_login: "Použít e-mail jako přihlášení"
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_feeds_enabled: "Povolit kanály"
setting_feeds_limit: "Limit obsahu kanálů"
@ -2469,7 +2472,7 @@ cs:
setting_per_page_options: "Objektů na stránku"
setting_plain_text_mail: "Prostý text (ne HTML)"
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_security_badge_displayed: "Zobrazit bezpečnostní odznak"
setting_registration_footer: "Zápatí registrace"
@ -2521,8 +2524,8 @@ cs:
first_week_of_year_text: >
Select the date of January that is contained in the first week of the year. This value together with first day of the week determines the total number of weeks in a year.
projects:
section_new_projects: "Settings for new projects"
section_project_overview: "Settings for project overview list"
section_new_projects: "Nastavení pro nové projekty"
section_project_overview: "Nastavení přehledu seznamu projektu"
user:
default_preferences: "Výchozí předvolby"
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_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_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_destroy_question: "%{count} objektů je přiřazeno k této hodnotě."
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_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_watcher_added: "You have been added as a watcher to Work package %{id} by %{watcher_changer}."
text_work_package_watcher_removed: "You have been removed from watchers of 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: "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_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"
@ -2907,10 +2910,10 @@ cs:
code_403: "Nemáte oprávnění k přístupu k tomuto zdroji."
code_404: "Požadovaný zdroj nebyl nalezen."
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ě."
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:
date: "RRRR-MM-DD (pouze ISO 8601 datum)"
duration: "Doba trvání ISO 8601"
@ -3033,4 +3036,4 @@ cs:
authorization_error: "Došlo k chybě autorizace."
revoke_my_application_confirmation: "Opravdu chcete odstranit tuto aplikaci? Tato akce zruší %{token_count} aktivních aplikací."
my_registered_applications: "Registrované OAuth aplikace"
you: you
you: vy

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@ -319,7 +319,7 @@ it:
other: '%{count} macro-attività discendenti'
bulk:
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."
selected_because_descendants: "While %{selected} work packages where selected, in total %{total} work packages are affected which includes descendants."
descendant: "descendant of selected"
@ -452,9 +452,12 @@ it:
code: 'Stato'
explanation: 'Descrizione stato'
codes:
not_started: 'Not started'
on_track: 'Nei limiti'
at_risk: 'A rischio'
off_track: 'Fuori limite'
finished: 'Finished'
discontinued: 'Discontinued'
query:
column_names: "Colonne"
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_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.
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: >
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_enabled: "Abilita pagina di documenti"
setting_apiv3_docs_enabled_instructions_html: >

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

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

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

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

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

@ -61,6 +61,7 @@ ca:
button_confirm: "Confirmar"
button_continue: "Continue"
button_copy: "Copiar"
button_copy_to_other_project: "Copy to other project"
button_custom-fields: "Camps personalitzats"
button_delete: "Esborrar"
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.
note: >
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_from: Last backup from
title: Backup OpenProject
last_backup: Poslední záloha
last_backup_from: Poslední záloha z
title: Zálohovat OpenProject
options: Možnosti
include_attachments: Include attachments
download_backup: Download backup
request_backup: Request backup
include_attachments: Zahrnout přílohy
download_backup: Stáhnout zálohu
request_backup: Žádost o zálohu
close_popup_title: "Zavřít okno"
close_filter_title: "Zavřít filtr"
close_form_title: "Zavřít formulář"
@ -61,6 +61,7 @@ cs:
button_confirm: "Potvrdit"
button_continue: "Pokračovat"
button_copy: "Kopírovat"
button_copy_to_other_project: "Copy to other project"
button_custom-fields: "Vlastní pole"
button_delete: "Odstranit"
button_delete_watcher: "Smazat sledujícího uživatele"
@ -97,7 +98,7 @@ cs:
caption_rate_history: "Historie kurzů"
clipboard:
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:
type: 'Typ grafu'
axis_criteria: 'Kritéria osy'
@ -124,7 +125,7 @@ cs:
preview: 'Přepnout režim náhledu'
source_code: 'Přepnout zdrojový mód Markdown'
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:
manual: 'Přepněte do Markdown zdroje'
wysiwyg: 'Přepnout na WYSIWYG Editor'
@ -132,8 +133,8 @@ cs:
error: 'Cannot expand macro: %{message}'
attribute_reference:
macro_help_tooltip: 'This text segment is being dynamically rendered by a macro.'
not_found: 'Requested resource could not be found'
invalid_attribute: "The selected attribute '%{name}' does not exist."
not_found: 'Požadovaný zdroj nebyl nalezen.'
invalid_attribute: "Vybraný atribut '%{name}' neexistuje."
child_pages:
button: 'Odkazy na podřízené stránky'
include_parent: 'Zahrnout rodiče'
@ -183,59 +184,59 @@ cs:
new_group: 'Nová skupina'
reset_to_defaults: 'Obnovit výchozí nastavení'
enterprise:
text_reprieve_days_left: "%{days} days until end of grace period"
text_expired: "expired"
text_reprieve_days_left: "%{days} dní do konce doby odkladu"
text_expired: "vypršela platnost"
trial:
confirmation: "Confirmation of email address"
confirmation: "Potvrzení e-mailové adresy"
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:
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>.
invalid_email: "Invalid email address"
label_company: "Company"
invalid_email: "Neplatná e-mailová adresa"
label_company: "Společnost"
label_first_name: "Křestní jméno"
label_last_name: "Příjmení"
label_domain: "Domain"
label_domain: "Doména"
label_subscriber: "Odběratel"
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"
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_email: Each user can only create one trial.
email_not_received: "You did not receive an email? You can resend the email with the link on the right."
try_another_email: "Or try it with another email address."
next_steps: "Next steps"
resend_link: "Resend"
resend_success: "Email has been resent. Please check your emails and click the confirmation link provided."
resend_warning: "Could not resend email."
session_timeout: "Your session timed out. Please try to reload the page or resend email."
status_label: "Status:"
status_confirmed: "confirmed"
status_waiting: "email sent - waiting for confirmation"
test_ee: "Test the Enterprise Edition 14 days for free"
taken_email: Každý uživatel může vytvořit pouze jednu zkušební verzi.
email_not_received: "Neobdrželi jste e-mail? Můžete znovu odeslat e-mail s odkazem vpravo."
try_another_email: "Nebo to zkuste s jinou e-mailovou adresou."
next_steps: "Další kroky"
resend_link: "Znovu odeslat"
resend_success: "E-mail byl znovu odeslán. Zkontrolujte své e-maily a klikněte na odkaz pro potvrzení."
resend_warning: "E-mail nelze znovu odeslat."
session_timeout: "Vypršel časový limit relace. Zkuste stránku znovu načíst nebo znovu odeslat e-mail."
status_label: "Stav:"
status_confirmed: "potvrzeno"
status_waiting: "e-mail odeslán - čeká na potvrzení"
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."
upsale:
become_hero: "Staň se hrdinou!"
benefits:
description: "What are the benefits of the Enterprise on-premises Edition?"
high_security: "Security features"
description: "Jaké jsou výhody Enterprise on-premises Edice?"
high_security: "Bezpečnostní prvky"
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."
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."
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."
button_start_trial: "Start free trial"
button_book_now: "Book now"
button_start_trial: "Zahájit zkušební verzi zdarma"
button_book_now: "Rezervujte nyní"
confidence: >
We deliver the confidence of a tested and supported enterprise-class project management software - with Open Source and an open mind.
link_quote: "Get a quote"
link_quote: "Získat cenovou nabídku"
text: >
The OpenProject Enterprise Edition builds on top of the Community Edition. It includes premium features and professional support mainly aimed at organizations with more than 10 users that manage business critical projects with OpenProject.
unlimited: "Unlimited"
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."
custom_actions:
date:
@ -281,7 +282,7 @@ cs:
blocks:
new_features:
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.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
'12_0':
@ -389,7 +390,7 @@ cs:
label_on: "zapnuto"
label_open_menu: "Otevřít 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_previous: "Předchozí"
label_per_page: "Na stránku:"
@ -397,7 +398,7 @@ cs:
label_project_plural: "Projekty"
label_visibility_settings: "Nastavení viditelnosti"
label_quote_comment: "Citovat tento komentář"
label_recent: "Recent"
label_recent: "Nedávné"
label_reset: "Obnovit"
label_remove: "Odstranit"
label_remove_column: "Odstranit sloupec"
@ -416,15 +417,15 @@ cs:
label_sort_lower: "Přesunout níž"
label_sorting: "Řazení"
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_public_query: "Veřejné"
label_sum: "Sum"
label_sum: "Suma"
label_sum_for: "Součet pro"
label_total_sum: "Total sum"
label_total_sum: "Celková SUMA"
label_subject: "Předmět"
label_this_week: "tento týden"
label_today: "Today"
label_today: "Dnes"
label_time_entry_plural: "Strávený čas"
label_up: "Nahoru"
label_user_plural: "Uživatelé"
@ -437,7 +438,7 @@ cs:
label_children_derived_duration: "Work package's children derived duration"
label_warning: "Varování"
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_watch: "Sledovat"
label_watch_work_package: "Sledovat pracovní balíček"
@ -483,7 +484,7 @@ cs:
got_it: 'Rozumím'
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!'
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.'
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>."
@ -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.'
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.'
create_button: 'The <b>+ Create</b> button will add a new work package to your project.'
timeline_button: 'You can activate the <b>Gantt chart</b> view to create a timeline for your project.'
create_button: 'Tlačítko <b>Vytvořit</b> přidá do vašeho projektu nový pracovní balíček.'
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.'
notifications:
title: "Notifications"
no_unread: "No unread notifications"
title: "Oznámení"
no_unread: "Žádná nepřečtená oznámení"
reasons:
mentioned: 'mentioned'
watched: 'watched'
assigned: 'assigned'
responsible: 'accountable'
mentioned: 'zmíněn'
watched: 'sledován'
assigned: 'přiřazeno'
responsible: 'Odpovědný'
facets:
unread: 'Unread'
unread: 'Nepřečtené'
all: 'Vše'
center:
and_more_users:
@ -526,57 +527,57 @@ cs:
many: 'and %{count} others'
other: 'and %{count} others'
no_results:
at_all: 'New notifications will appear here when there is activity that concerns you'
with_current_filter: 'There are no notifications in this view at the moment'
mark_all_read: 'Mark all as read'
mark_as_read: 'Mark as read'
at_all: 'Nová oznámení se zobrazí zde, když se objeví aktivita, která se vás týká'
with_current_filter: 'V současné době nejsou v tomto zobrazení žádná oznámení'
mark_all_read: 'Označit vše jako přečtené'
mark_as_read: 'Označit jako přečteno'
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:
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_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:
message: 'There are new notifications.'
link_text: 'Click here to load them'
message: 'Máte nová oznámení.'
link_text: 'Klikněte zde pro jejich načtení'
menu:
accountable: 'Odpovědný'
assigned: 'Assigned'
by_project: 'Unread by project'
by_reason: 'Involvement'
assigned: 'Přiřazeno'
by_project: 'Nepřečteno podle projektu'
by_reason: 'Zapojení'
inbox: 'Inbox'
mentioned: '@mentioned'
watching: 'Watching'
mentioned: 'Zmíněn'
watching: 'Sledování'
settings:
change_notification_settings: 'To view and change your notification settings, <a target="_blank" href="%{url}">click here</a>'
title: "Notification settings"
notify_me: "Notify me"
change_notification_settings: 'Chcete-li zobrazit a změnit nastavení oznámení, <a target="_blank" href="%{url}">klikněte zde</a>'
title: "Nastavení oznámení"
notify_me: "Upozornit mě"
reasons:
mentioned:
title: 'I am @mentioned'
description: 'Receive a notification every time someone mentions me anywhere'
title: 'Jsem @zmíněn'
description: 'Dostat upozornění, kdykoli mě někdo kdekoli zmíní'
involved:
title: 'Assigned to me or accountable'
description: 'Receive notifications for all activities on work packages for which I am assignee or accountable'
watched: 'Updates on watched items'
work_package_commented: 'All new comments'
work_package_created: 'New work packages'
work_package_processed: 'All status changes'
title: 'Přiřazeno mně nebo odpovědně'
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: 'Aktualizace u sledovaných položek'
work_package_commented: 'Všechny nové komentáře'
work_package_created: 'Nový pracovní balíček'
work_package_processed: 'Všechny změny stavu'
work_package_prioritized: 'All priority changes'
work_package_scheduled: 'All date changes'
work_package_scheduled: 'Všechny změny data'
global:
immediately:
title: 'Notify me immediately'
description: 'These settings apply to all projects. You can create project-specific exceptions below.'
title: 'Oznamovat mi okamžitě'
description: 'Tato nastavení platí pro všechny projekty. Níže můžete vytvořit specifické výjimky.'
delayed:
title: 'Also notify me for'
description: 'Receive notifications for these activities on work packages in all projects:'
title: 'Upozornit také pro'
description: 'Přijímat oznámení pro tyto aktivity na pracovních balíčcích ve všech projektech:'
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'
add: 'Add setting for project'
already_selected: 'This project is already selected'
remove: 'Remove project settings'
add: 'Přidat nastavení projektu'
already_selected: 'Tento projekt je již vybrán'
remove: 'Odstranit nastavení projektu'
password_confirmation:
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'
@ -596,46 +597,46 @@ cs:
context: 'Kontext projektu'
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.'
confirm_template_load: 'Switching the template will reload the page and you will lose all input to this form. Continue?'
use_template: "Use template"
no_template_selected: "(None)"
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: "Použít šablonu"
no_template_selected: "(Žádné)"
copy:
copy_options: "Copy options"
copy_options: "Možností kopírování"
autocompleter:
label: 'Automatické doplňování projektu'
reminders:
settings:
daily:
add_time: 'Add time'
enable: 'Enable daily email reminders'
explanation: 'You will receive these reminders only for unread notifications and only at hours you specify. %{no_time_zone}'
add_time: 'Přidat čas'
enable: 'Povolit denní připomenutí e-mailem'
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.'
time_label: 'Time %{counter}:'
title: 'Send me daily email reminders for unread notifications'
time_label: 'Čas %{counter}:'
title: 'Poslat mi denní připomenutí e-mailem pro nepřečtená oznámení'
workdays:
title: 'Receive email reminders on these days'
title: 'Dostávat připomenutí e-mailem v těchto dnech'
immediate:
title: 'Send me an email reminder'
mentioned: 'Immediately when someone @mentions me'
title: 'Pošlete mi připomenutí e-mailem'
mentioned: 'Okamžitě, když mě někdo @zmiňuje'
alerts:
title: 'Email alerts for other items (that are not work packages)'
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:
news_added: 'Přidané novinky'
news_commented: 'Comment on a news item'
document_added: 'Documents added'
forum_messages: 'New forum messages'
news_commented: 'Komentář k novince'
document_added: 'Dokumenty přidány'
forum_messages: 'Nové zprávy o fóru'
wiki_page_added: 'Přidána stránka wiki'
wiki_page_updated: 'Wiki stránka aktualizována'
membership_added: 'Membership added'
membership_updated: 'Membership updated'
title: 'Email reminders'
membership_added: 'Členství přidáno'
membership_updated: 'Členství bylo aktualizováno'
title: 'Upozornění e-mailem'
pause:
label: 'Temporarily pause daily email reminders'
first_day: 'First day'
last_day: 'Last day'
label: 'Dočasně pozastavit denní připomenutí e-mailem'
first_day: 'První den'
last_day: 'Poslední den'
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:
attribute_groups:
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"
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.
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?"
more_information: "Více informací"
nevermind: "Nevadí"
edit:
form_configuration: "Form Configuration"
form_configuration: "Konfigurace formuláře"
projects: "Projekty"
settings: "Nastavení"
time_entry:
project: 'Projekt'
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'
comment: 'Komentář'
duration: 'Doba trvání'
@ -662,7 +663,7 @@ cs:
hours: 'Hodiny'
title: 'Čas protokolu'
two_factor_authentication:
label_two_factor_authentication: 'Two-factor authentication'
label_two_factor_authentication: 'Dvoufázové ověření'
watchers:
label_loading: načítám sledující...
label_error_loading: Při načítání pozorovatelů došlo k chybě
@ -678,7 +679,7 @@ cs:
duplicated: "Duplikováno"
blocks: "Bloky"
blocked: "Zablokován"
precedes: "Předchází"
precedes: "Je předchúdcem"
follows: "Následuje"
includes: "Zahrnuje"
partof: "Část"
@ -718,7 +719,7 @@ cs:
parent_placeholder: "Vyberte nového rodiče nebo stiskněte úniku pro zrušení."
autocompleter:
placeholder: "Zadejte hledaný text"
notFoundText: "No items found"
notFoundText: "Nenalezeny žádné položky"
typeToSearchText: "Zadejte hledaný text"
repositories:
select_tag: 'Vybrat štítek'
@ -726,8 +727,8 @@ cs:
field_value_enter_prompt: "Zadejte hodnotu pro '%{field}'"
project_menu_details: "Podrobnosti"
scheduling:
manual: 'Manual scheduling'
automatic: 'Automatic scheduling'
manual: 'Manuální plánování'
automatic: 'Automatické plánování'
sort:
sorted_asc: 'Použito vzestupné řazení, '
sorted_dsc: 'Použité sestupně '
@ -870,7 +871,7 @@ cs:
no_results:
title: Žádné pracovní balíčky k zobrazení.
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:
details: "Podrobnosti"
people: "Lidé"
@ -913,8 +914,8 @@ cs:
label_content: "Klikněte zde pro přeskočení nabídky a přejděte na obsah"
placeholders:
default: "-"
date: "Select date"
formattable: "%{name}: Click to edit..."
date: "Vybrat datum"
formattable: "%{name}: Klikněte pro editaci..."
query:
column_names: "Sloupce"
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?"
text_no_results: "Nebyly nalezeny žádné odpovídající zobrazení."
scheduling:
is_parent: "The dates of this work package are automatically deduced from its children. Activate 'Manual scheduling' to set the dates."
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_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: "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:
configure_button: 'Konfigurovat tabulku pracovních balíčků'
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ů?'
check_out_link: 'Podívejte se na Enterprise Edition.'
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:
overview: Přehled
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."
deletes_children: "Všechny podřízené pracovní balíčky a jejich potomci budou také rekurzivně odstraněny."
destroy_time_entry:
title: "Confirm deletion of time entry"
text: "Are you sure you want to delete the following time entry?"
title: "Potvrdit odstranění záznamu času"
text: "Opravdu chcete odstranit následující časovou položku?"
notice_no_results_to_display: "Žádné viditelné výsledky k zobrazení."
notice_successful_create: "Úspěšné vytvoření."
notice_successful_delete: "Úspěšné odstranění."
notice_successful_update: "Úspěšná aktualizace."
notice_job_started: "job started."
notice_job_started: "Úloha byla zahájena"
notice_bad_request: "Chybný požadavek."
relations:
empty: Neexistuje žádný vztah
@ -1098,24 +1099,24 @@ cs:
timeline: 'Ganttův diagram'
invite_user_modal:
back: 'Zpět'
invite: 'Invite'
invite: 'Pozvat'
title:
invite: 'Pozvat uživatele'
invite_to_project: 'Invite %{type} to %{project}'
User: 'user'
Group: 'group'
PlaceholderUser: 'placeholder user'
invite_principal_to_project: 'Invite %{principal} to %{project}'
invite_to_project: 'Pozvat %{type} do %{project}'
User: 'uživatel'
Group: 'Skupina'
PlaceholderUser: 'placeholder uživatel'
invite_principal_to_project: 'Pozvat %{principal} do %{project}'
project:
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_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ší'
no_results: 'No projects were found'
no_invite_rights: 'You are not allowed to invite members to this project'
no_results: 'Nebyly nalezeny žádné projekty'
no_invite_rights: 'Nejste oprávněni pozvat členy do tohoto projektu'
type:
required: 'Please select the type to be invited'
required: 'Vyberte prosím typ, který chcete pozvat'
user:
title: 'Uživatel'
description: 'Permissions based on the assigned role in the selected project'
@ -1123,46 +1124,46 @@ cs:
title: 'Skupina'
description: 'Permissions based on the assigned role in the selected project'
placeholder:
title: 'Placeholder user'
title_no_ee: 'Placeholder user (Enterprise Edition only feature)'
title: 'placeholder uživatel'
title_no_ee: 'placeholder uživatel (pouze funkce Enterprise Edition)'
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>'
principal:
label:
name_or_email: 'Name or email address'
name_or_email: 'Jméno nebo e-mailová adresa'
name: 'Jméno'
already_member_message: 'Already a member of %{project}'
no_results_user: 'No users were found'
invite_user: 'Invite:'
no_results_placeholder: 'No placeholders were found'
create_new_placeholder: 'Create new placeholder:'
no_results_group: 'No groups were found'
already_member_message: 'Už jsi členem %{project}'
no_results_user: 'Nebyli nalezeni žádní uživatelé'
invite_user: 'Pozvat'
no_results_placeholder: 'Nebyly nalezeny žádné placeholdery'
create_new_placeholder: 'Vytvořit nový placeholder'
no_results_group: 'Nebyly nalezeny žádné skupiny'
next_button: 'Další'
required:
user: 'Please select a user'
placeholder: 'Please select a placeholder'
group: 'Please select a group'
user: 'Vyberte prosím uživatele'
placeholder: 'Vyberte prosím placeholder'
group: 'Zvolte prosím skupinu.'
role:
label: 'Role in %{project}'
no_roles_found: 'No roles were found'
label: 'Role v %{project}'
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>'
required: 'Please select a role'
required: 'Vyberte prosím roli'
next_button: 'Další'
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.'
next_button: 'Review invitation'
next_button: 'Zkontrolovat pozvánku'
summary:
next_button: 'Odeslat pozvánku'
success:
title: '%{principal} was invited!'
title: '%{principal} byl pozván!'
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.'
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.'
next_button: 'Pokračovat'
forms:
submit_success_message: 'The form was successfully submitted'
load_error_message: 'There was an error loading the form'
validation_error_message: 'Please fix the errors present in the form'
submit_success_message: 'Formulář byl úspěšně odeslán'
load_error_message: 'Při načítání formuláře došlo k chybě'
validation_error_message: 'Opravte prosím chyby ve formuláři'
advanced_settings: 'Pokročilá nastavení'

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Loading…
Cancel
Save