Merge remote-tracking branch 'origin/dev' into bim/feature/create_bcf

pull/8071/head
Oliver Günther 5 years ago
commit 95285b9fd4
No known key found for this signature in database
GPG Key ID: A3A8BDAD7C0C552C
  1. 2
      Gemfile
  2. 4
      Gemfile.lock
  3. 4
      app/assets/stylesheets/layout/work_packages/_details_view.sass
  4. 4
      app/assets/stylesheets/layout/work_packages/_mobile.sass
  5. 7
      app/assets/stylesheets/layout/work_packages/_print.sass
  6. 21
      app/assets/stylesheets/layout/work_packages/_table.sass
  7. 3
      app/assets/stylesheets/layout/work_packages/_table_embedded.sass
  8. 6
      app/models/attachment.rb
  9. 2
      app/models/journal/attachable_journal.rb
  10. 2
      app/models/journal/attachment_journal.rb
  11. 2
      app/models/journal/changeset_journal.rb
  12. 3
      app/models/journal/customizable_journal.rb
  13. 2
      app/models/journal/message_journal.rb
  14. 2
      app/models/journal/news_journal.rb
  15. 2
      app/models/journal/time_entry_journal.rb
  16. 2
      app/models/journal/wiki_content_journal.rb
  17. 2
      app/models/journal/work_package_journal.rb
  18. 2
      app/models/project.rb
  19. 8
      app/models/project/activity.rb
  20. 22
      app/models/time_entry_activity.rb
  21. 30
      app/models/time_entry_activity/scopes/active_in_project.rb
  22. 2
      app/services/api/v3/parse_query_params_service.rb
  23. 1
      app/services/api/v3/work_package_collection_from_query_service.rb
  24. 3
      app/views/custom_styles/show.html.erb
  25. 26
      config/initializers/10-load_patches.rb
  26. 20
      config/initializers/activity.rb
  27. 1
      config/initializers/assets.rb
  28. 1
      config/initializers/health_checks.rb
  29. 3
      config/initializers/menus.rb
  30. 2
      config/initializers/zeitwerk.rb
  31. 1
      config/locales/crowdin/ar.yml
  32. 1
      config/locales/crowdin/bg.yml
  33. 1
      config/locales/crowdin/ca.yml
  34. 1
      config/locales/crowdin/cs.yml
  35. 1
      config/locales/crowdin/da.yml
  36. 1
      config/locales/crowdin/de.yml
  37. 1
      config/locales/crowdin/el.yml
  38. 1
      config/locales/crowdin/es.yml
  39. 1
      config/locales/crowdin/fi.yml
  40. 1
      config/locales/crowdin/fil.yml
  41. 1
      config/locales/crowdin/fr.yml
  42. 1
      config/locales/crowdin/hr.yml
  43. 67
      config/locales/crowdin/hu.yml
  44. 1
      config/locales/crowdin/id.yml
  45. 1
      config/locales/crowdin/it.yml
  46. 1
      config/locales/crowdin/ja.yml
  47. 90
      config/locales/crowdin/js-ca.yml
  48. 94
      config/locales/crowdin/js-hu.yml
  49. 890
      config/locales/crowdin/js-vi.yml
  50. 1
      config/locales/crowdin/ko.yml
  51. 1
      config/locales/crowdin/lt.yml
  52. 1
      config/locales/crowdin/nl.yml
  53. 1
      config/locales/crowdin/no.yml
  54. 1
      config/locales/crowdin/pl.yml
  55. 1
      config/locales/crowdin/pt-BR.yml
  56. 1
      config/locales/crowdin/pt.yml
  57. 1
      config/locales/crowdin/ro.yml
  58. 1
      config/locales/crowdin/ru.yml
  59. 1
      config/locales/crowdin/sk.yml
  60. 1
      config/locales/crowdin/sv.yml
  61. 1
      config/locales/crowdin/tr.yml
  62. 1
      config/locales/crowdin/uk.yml
  63. 2668
      config/locales/crowdin/vi.yml
  64. 1
      config/locales/crowdin/zh-CN.yml
  65. 1
      config/locales/crowdin/zh-TW.yml
  66. 1
      config/locales/en.yml
  67. 40
      docs/cloud-edition-guide/README.md
  68. 5
      docs/development/README.md
  69. 10
      docs/development/code-review-guidelines/README.md
  70. 20
      docs/enterprise-edition-guide/README.md
  71. 56
      docs/getting-started/README.md
  72. 27
      docs/installation-and-operations/configuration/ssl/README.md
  73. 24
      docs/installation-and-operations/installation/packaged/README.md
  74. 82
      docs/system-admin-guide/authentication/saml/README.md
  75. BIN
      docs/system-admin-guide/authentication/saml/my-sso.png
  76. 98
      docs/user-guide/README.md
  77. 2
      docs/user-guide/wiki/README.md
  78. 5
      frontend/src/app/components/api/api-v3/api-v3-filter-builder.ts
  79. 4
      frontend/src/app/components/filters/filter-container/filter-container.directive.ts
  80. 2
      frontend/src/app/components/modals/wp-destroy-modal/wp-destroy.modal.ts
  81. 6
      frontend/src/app/components/op-context-menu/wp-context-menu/wp-view-context-menu.directive.ts
  82. 34
      frontend/src/app/components/resizer/wp-resizer.component.ts
  83. 2
      frontend/src/app/components/work-packages/work-package-authorization.service.ts
  84. 2
      frontend/src/app/components/work-packages/work-package.service.ts
  85. 39
      frontend/src/app/components/wp-buttons/wp-create-button/wp-create-button.component.ts
  86. 4
      frontend/src/app/components/wp-buttons/wp-details-view-button/wp-details-view-button.component.ts
  87. 7
      frontend/src/app/components/wp-buttons/wp-settings-button/wp-settings-button.component.html
  88. 43
      frontend/src/app/components/wp-buttons/wp-settings-button/wp-settings-button.component.ts
  89. 34
      frontend/src/app/components/wp-card-view/event-handler/click-handler.ts
  90. 7
      frontend/src/app/components/wp-card-view/event-handler/double-click-handler.ts
  91. 16
      frontend/src/app/components/wp-card-view/wp-card-view.component.ts
  92. 2
      frontend/src/app/components/wp-card-view/wp-single-card/wp-single-card.component.ts
  93. 2
      frontend/src/app/components/wp-copy/wp-copy-split-view.component.ts
  94. 2
      frontend/src/app/components/wp-new/wp-new-split-view.component.ts
  95. 5
      frontend/src/app/components/wp-new/wp-new-split-view.html
  96. 4
      frontend/src/app/components/wp-query-select/wp-query-select-dropdown.component.ts
  97. 74
      frontend/src/app/components/wp-query/query-param-listener.service.ts
  98. 2
      frontend/src/app/components/wp-relations/wp-relations-hierarchy/wp-relations-hierarchy.service.ts
  99. 22
      frontend/src/app/components/wp-single-view-tabs/keep-tab/keep-tab.service.spec.ts
  100. 6
      frontend/src/app/components/wp-single-view-tabs/keep-tab/keep-tab.service.ts
  101. Some files were not shown because too many files have changed in this diff Show More

@ -165,7 +165,7 @@ gem 'unicorn'
gem 'puma', '~> 4.3.1' # used for development and optionally for production
gem 'nokogiri', '~> 1.10.5'
gem 'nokogiri', '~> 1.10.8'
gem 'carrierwave', '~> 1.3.1'
gem 'fog-aws'

@ -630,7 +630,7 @@ GEM
newrelic_rpm (6.6.0.358)
nio4r (2.5.2)
no_proxy_fix (0.1.2)
nokogiri (1.10.7)
nokogiri (1.10.8)
mini_portile2 (~> 2.4.0)
nokogumbo (2.0.1)
nokogiri (~> 1.8, >= 1.8.4)
@ -1016,7 +1016,7 @@ DEPENDENCIES
my_page!
net-ldap (~> 0.16.0)
newrelic_rpm
nokogiri (~> 1.10.5)
nokogiri (~> 1.10.8)
oj (~> 3.9.1)
okcomputer (~> 1.18.1)
omniauth!

@ -28,10 +28,10 @@
// Right part of the split view
// Visible only in the details ui-view
body.router--work-packages-split-view,
body.router--work-packages-partitioned-split-view,
body.router--work-packages-split-view-new
.work-packages-split-view--details-side
.work-packages-partitioned-page--content-right
overflow-x: hidden
overflow-y: auto
position: relative

@ -136,9 +136,9 @@
.work-packages-full-view--split-container
border-top: none
.router--work-packages-split-view,
.router--work-packages-partitioned-split-view,
.router--work-packages-split-view-new
.work-packages-split-view--details-side
.work-packages-partitioned-page--content-right
overflow-x: auto
.router--work-packages-list-view

@ -25,10 +25,8 @@
overflow: visible !important
position: relative
.work-packages-list-view--container
.work-packages-partitioned-query-space--container
padding-left: 0
.work-packages-split-view
overflow: visible
.work-packages-split-view--tabletimeline-side
.work-packages-split-view--tabletimeline-content
@ -55,6 +53,7 @@
.work-packages-tabletimeline--timeline-side
contain: initial // For printing in Chrome
border-left: none
flex-basis: 100% !important
.work-package-table--container,
.generic-table--results-container
@ -70,7 +69,7 @@
#content-wrapper,
#content
.work-packages-list-view--container
.work-packages-partitioned-query-space--container
display: block
.toolbar-container
display: none

@ -50,31 +50,13 @@
.work-packages-page--ui-view
height: 100%
.work-packages-list-view--container
// Flexbox for the toolbar, filters and work package split view
display: flex
flex-direction: column
height: 100%
.work-packages-partitioned-query-space--container
> .toolbar-container
margin-top: 5px
input[type="text"].toolbar--editable-toolbar
font-size: 24px
.work-packages--filters-optional-container
// not flex-item
height: auto
overflow: auto
flex-shrink: 0
// Outer Flex container for (table+timeline)|details
.work-packages-split-view
flex: 1 1 auto
display: flex
// Required for correctly scrolling the inner containers
overflow: hidden
// Match both rows and timeline specifically
tr.row-hovered,
div.row-hovered
@ -86,6 +68,7 @@
// Left part of the split view
// == flex container for (table|timeline)
.work-packages-split-view--tabletimeline-side
height: 100%
flex: 2
display: flex
flex-direction: column

@ -67,6 +67,9 @@ $table-timeline--compact-row-height: 28px
overflow: auto
@include styled-scroll-bar
.work-packages-partitioned-page--content-right &
margin-right: -14px
.wp-cards-container.-horizontal
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr))

@ -236,7 +236,11 @@ class Attachment < ActiveRecord::Base
.pluck(:container_type)
.compact
.select do |container_class|
container_class.constantize.attachment_tsv_extracted?
klass = container_class.constantize
klass.respond_to?(:attachment_tsv_extracted?) && klass.attachment_tsv_extracted?
rescue NameError
false
end
end

@ -32,5 +32,3 @@ class Journal::AttachableJournal < Journal::BaseJournal
belongs_to :attachment
end
::AttachableJournal = Journal::AttachableJournal

@ -30,5 +30,3 @@
class Journal::AttachmentJournal < Journal::BaseJournal
self.table_name = 'attachment_journals'
end
::AttachmentJournal = Journal::AttachmentJournal

@ -30,5 +30,3 @@
class Journal::ChangesetJournal < Journal::BaseJournal
self.table_name = 'changeset_journals'
end
::ChangesetJournal = Journal::ChangesetJournal

@ -1,4 +1,5 @@
#-- encoding: UTF-8
#-- copyright
# OpenProject is an open source project management software.
# Copyright (C) 2012-2020 the OpenProject GmbH
@ -32,5 +33,3 @@ class Journal::CustomizableJournal < Journal::BaseJournal
belongs_to :custom_field, foreign_key: :custom_field_id
end
::CustomizableJournal = Journal::CustomizableJournal

@ -30,5 +30,3 @@
class Journal::MessageJournal < Journal::BaseJournal
self.table_name = 'message_journals'
end
::MessageJournal = Journal::MessageJournal

@ -30,5 +30,3 @@
class Journal::NewsJournal < Journal::BaseJournal
self.table_name = 'news_journals'
end
::NewsJournal = Journal::NewsJournal

@ -30,5 +30,3 @@
class Journal::TimeEntryJournal < Journal::BaseJournal
self.table_name = 'time_entry_journals'
end
::TimeEntryJournal = Journal::TimeEntryJournal

@ -30,5 +30,3 @@
class Journal::WikiContentJournal < Journal::BaseJournal
self.table_name = 'wiki_content_journals'
end
::WikiContentJournal = Journal::WikiContentJournal

@ -30,5 +30,3 @@
class Journal::WorkPackageJournal < Journal::BaseJournal
self.table_name = 'work_package_journals'
end
::WorkPackageJournal = Journal::WorkPackageJournal

@ -306,7 +306,7 @@ class Project < ActiveRecord::Base
# reduce the number of db queries when performing operations including the
# project's versions.
def assignable_versions
@all_shared_versions ||= shared_versions.with_status_open.to_a
@all_shared_versions ||= shared_versions.with_status_open.order_by_newest_date.to_a
end
# Returns a hash of project users grouped by role

@ -43,11 +43,11 @@ module Project::Activity
def latest_project_activity
@latest_project_activity ||=
Constants::ProjectActivity.registered.map { |params|
build_latest_project_activity_for(on: params[:on],
chain: params[:chain],
Constants::ProjectActivity.registered.map do |params|
build_latest_project_activity_for(on: params[:on].constantize,
chain: Array(params[:chain]).map(&:constantize),
attribute: params[:attribute])
}
end
end
def with_latest_activity

@ -50,18 +50,28 @@ class TimeEntryActivity < Enumeration
def active_in_project?(project)
teap = if time_entry_activities_projects.loaded?
time_entry_activities_projects.detect { |t| t.project_id == project.id }&.active?
detect_project_time_entry_activity_active_state(project)
else
time_entry_activities_projects
.where(project_id: project.id)
.pluck(:active)
.first
pluck_project_time_entry_activity_active_state(project)
end
teap.present? && teap
!teap.nil? && teap || teap.nil? && active?
end
def activated_projects
Project::Scopes::ActivatedTimeActivity.fetch(self)
end
private
def detect_project_time_entry_activity_active_state(project)
time_entry_activities_projects.detect { |t| t.project_id == project.id }&.active?
end
def pluck_project_time_entry_activity_active_state(project)
time_entry_activities_projects
.where(project_id: project.id)
.pluck(:active)
.first
end
end

@ -30,13 +30,31 @@
module TimeEntryActivity::Scopes
class ActiveInProject
def self.fetch(project)
scope = TimeEntryActivity.includes(time_entry_activities_projects: :activity)
class << self
def fetch(project)
being_active_in_project(project)
.or(being_not_inactive_in_project(project))
end
private
# All activities, that have a specific setting for the project to be active.
# The global active state has no effect in that case.
def being_active_in_project(project)
TimeEntryActivity
.where(id: of_project(project).where(active: true))
end
scope
.where(time_entry_activities_projects: { project_id: project.id, active: true })
.or(scope.where.not(time_entry_activities_projects: { project_id: project.id }).where(enumerations: { active: true }))
.or(scope.where(time_entry_activities_projects: { project_id: nil }, enumerations: { active: true }))
# All activities that are active and do not have a project specific setting stating
# the activity to be inactive. So there could either be no project specific setting (for that project) or
# a project specific setting that is active.
def being_not_inactive_in_project(project)
TimeEntryActivity.where(active: true).where.not(id: of_project(project).where(active: false))
end
def of_project(project)
TimeEntryActivitiesProject.where(project_id: project.id).select(:activity_id)
end
end
end
end

@ -126,7 +126,7 @@ module API
def filter_from_params(filter)
attribute = filter.keys.first # there should only be one attribute per filter
operator = filter[attribute]['operator']
values = Array(filter[attribute]['values']).map { |v| CGI.unescape(v.to_s) }
values = Array(filter[attribute]['values'])
ar_attribute = convert_filter_attribute attribute, append_id: true
{ field: ar_attribute,

@ -79,6 +79,7 @@ module API
def calculate_resulting_params(provided_params)
calculate_default_params.merge(provided_params.slice('offset', 'pageSize').symbolize_keys).tap do |params|
if query.manually_sorted?
params[:query_id] = query.id
params[:offset] = 1
params[:pageSize] = Setting.forced_single_page_size
else

@ -45,7 +45,8 @@ See docs/COPYRIGHT.rdoc for more details.
</div>
</div>
<button type="submit" class="button"><%= I18n.t(:button_save) %></button>
<%= styled_button_tag t(:button_save),
data:({ confirm: t('admin.custom_styles.theme_warning') } if @current_theme.empty?) %>
</fieldset>
</section>
<% end %>

@ -28,27 +28,9 @@
# See docs/COPYRIGHT.rdoc for more details.
#++
require "reform/form/active_model/validations"
# Do not place any patches within this file. Add a file to lib/open_project/patches
Reform::Form.class_eval do
include Reform::Form::ActiveModel::Validations
end
Reform::Contract.class_eval do
include Reform::Form::ActiveModel::Validations
end
Reform::Form::ActiveModel::Validations::Validator.class_eval do
##
# use activerecord as the base scope instead of 'activemodel' to be compatible
# to the messages we have already stored
def self.i18n_scope
:activerecord
end
end
require 'reform/contract'
class Reform::Form::ActiveModel::Errors
prepend OpenProject::Patches::Reform
# Whatever ruby file is placed in lib/open_project/patches is required
Dir.glob(File.expand_path("../../../lib/open_project/patches/*.rb", __FILE__)).each do |path|
require path
end

@ -40,25 +40,23 @@ Redmine::Activity.map do |activity|
default: false
end
# TODO: replace by string based references to avoid stale
# objects when reloading in dev mode.
Project.register_latest_project_activity on: WorkPackage,
Project.register_latest_project_activity on: 'WorkPackage',
attribute: :updated_at
Project.register_latest_project_activity on: News,
Project.register_latest_project_activity on: 'News',
attribute: :updated_at
Project.register_latest_project_activity on: Changeset,
chain: Repository,
Project.register_latest_project_activity on: 'Changeset',
chain: 'Repository',
attribute: :committed_on
Project.register_latest_project_activity on: WikiContent,
chain: [Wiki, WikiPage],
Project.register_latest_project_activity on: 'WikiContent',
chain: %w(Wiki WikiPage),
attribute: :updated_on
Project.register_latest_project_activity on: Message,
chain: Forum,
Project.register_latest_project_activity on: 'Message',
chain: 'Forum',
attribute: :updated_on
Project.register_latest_project_activity on: TimeEntry,
Project.register_latest_project_activity on: 'TimeEntry',
attribute: :updated_on

@ -24,6 +24,5 @@ OpenProject::Application.configure do
work_packages.js
vendor/ckeditor/ckeditor.*js
vendor/enjoyhint.js
bundles/openproject-legacy-app.js
)
end

@ -46,7 +46,6 @@ OkComputer::CheckCollection.new('full').tap do |collection|
OkComputer::Registry.default_collection.register 'full', collection
end
# Check if authentication required
authentication_password = OpenProject::Configuration.health_checks_authentication_password
if authentication_password.present?

@ -57,7 +57,8 @@ Redmine::MenuManager.map :top_menu do |menu|
(User.current.logged? || !Setting.login_required?) &&
User.current.allowed_to?(:view_time_entries, nil, global: true)
}
menu.push :help, OpenProject::Static::Links.help_link,
menu.push :help,
OpenProject::Static::Links.help_link,
last: true,
caption: '',
icon: 'icon5 icon-help',

@ -54,6 +54,8 @@ end
# Instruct zeitwerk to ignore all the engine gems' lib initialization files
Rails.autoloaders.main.ignore(Rails.root.join('modules/*/lib/openproject-*.rb'))
Rails.autoloaders.main.ignore(Rails.root.join('vendor/plugins/*/lib/openproject-*.rb'))
Rails.autoloaders.main.ignore(Rails.root.join('lib/plugins'))
Rails.autoloaders.main.ignore(Rails.root.join('lib/open_project/patches'))
Rails.autoloaders.main.ignore(Rails.root.join('lib/generators'))
Rails.autoloaders.main.ignore(Bundler.bundle_path.join('**/*.rb'))

@ -61,6 +61,7 @@ ar:
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
header-border-bottom-color: "Thin line under the header. Leave this field empty if you don't want any line."
main-menu-bg-color: "Left side menu's background color."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Upgrade to Enterprise Edition"
add_token: "Upload an Enterprise Edition support token"

@ -61,6 +61,7 @@ bg:
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
header-border-bottom-color: "Thin line under the header. Leave this field empty if you don't want any line."
main-menu-bg-color: "Left side menu's background color."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Upgrade to Enterprise Edition"
add_token: "Upload an Enterprise Edition support token"

@ -61,6 +61,7 @@ ca:
header-item-font-hover-color: "Color de lletra dels elements clicables de la capçalera quan el ratolí hi passa per damunt."
header-border-bottom-color: "Thin line under the header. Leave this field empty if you don't want any line."
main-menu-bg-color: "Left side menu's background color."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Actualitza a l'Enterprise Edition"
add_token: "Puja un token de suport de l'Enterprise Edition"

@ -61,6 +61,7 @@ cs:
header-item-font-hover-color: "Barva pozadí klikacích položek záhlaví při najetí myší."
header-border-bottom-color: "Tenký řádek pod záhlavím. Ponechte toto pole prázdné, pokud nechcete žádný řádek."
main-menu-bg-color: "Barva pozadí levého menu."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Upgradovat na Enterprise Edition"
add_token: "Nahrát podpůrný token Enterprise Edition"

@ -61,6 +61,7 @@ da:
header-item-font-hover-color: "Tekst-farve på knapper i headeren, når musen føres over."
header-border-bottom-color: "Tynd linje under headeren. Efterlad dette felt tomt hvis du ikke ønsker en linje."
main-menu-bg-color: "Baggrundsfarve på venstre sidemenu."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Opgradér til Enterprise Edition"
add_token: "Upload en Enterprise Edition support-token"

@ -61,6 +61,7 @@ de:
header-item-font-hover-color: "Schriftfarbe von anklickbaren Header-Elementen während Mouse-hover."
header-border-bottom-color: "Rahmenlinie unterhalb des Headers. Freilassen, um keine Linie darzustellen."
main-menu-bg-color: "Hintergrundfarbe des Menüs in der linken Seitenleiste."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Auf Enterprise-Edition upgraden"
add_token: "Enterprise-Edition Support Token hochladen"

@ -61,6 +61,7 @@ el:
header-item-font-hover-color: "Χρώμα γραμματοσειράς στοιχείων κεφαλίδας με δυνατότητα κλικ, όταν ο δείκτης βρίσκεται πάνω."
header-border-bottom-color: "Λεπτή γραμμή κάτω από την κεφαλίδα. Αφήστε αυτό το πεδίο κενό αν δεν θέλετε καμία γραμμή."
main-menu-bg-color: "Χρώμα φόντου του μενού της αριστερής πλευράς."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Αναβαθμίστε σε Έκδοση για Επιχειρήσεις"
add_token: "Ανεβάστε ενα token υποστήριξης έκδοσης για επιχειρήσεις"

@ -61,6 +61,7 @@ es:
header-item-font-hover-color: "Color de fuente de los elementos interactivos del encabezado cuando se mantiene el ratón sobre estos."
header-border-bottom-color: "Línea fina debajo del encabezado. Deje este campo vacío si no quiere que se muestre ninguna línea."
main-menu-bg-color: "Color de fondo del menú izquierdo."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Actualizar hasta versión corporativa"
add_token: "Cargue el token de soporte de versión corporativa"

@ -61,6 +61,7 @@ fi:
header-item-font-hover-color: "Fontin väri klikattava otsikko eriä kun leijui hiirellä."
header-border-bottom-color: "Thin line under the header. Leave this field empty if you don't want any line."
main-menu-bg-color: "Left side menu's background color."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Päivitä yritysversioon"
add_token: "Upload an Enterprise Edition support token"

@ -61,6 +61,7 @@ fil:
header-item-font-hover-color: "Ang kulay ng font ng madaling pinduting mga aytem kung naka-hover gamit ang mouse."
header-border-bottom-color: "Manipis na kinya sa ibaba ng header. Iwanan itong patlang walang laman kung ayaw mo sa kahit anong linya."
main-menu-bg-color: "Kabilang kaliwa ang kulay ng pagpipiliang nakapalibot na kulay."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "I-upgrade sa Enterprise Edition"
add_token: "I-upload ang isang Enterprise Edition support token"

@ -61,6 +61,7 @@ fr:
header-item-font-hover-color: "Couleur de la police des éléments de l’en-tête survolées par la souris."
header-border-bottom-color: "Ligne mince sous l’en-tête. Laissez ce champ vide si vous ne voulez pas de ligne."
main-menu-bg-color: "Couleur d’arrière-plan du menu de gauche."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Passer à la version Entreprise"
add_token: "Charger une licence de la version Entreprise"

@ -61,6 +61,7 @@ hr:
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
header-border-bottom-color: "Thin line under the header. Leave this field empty if you don't want any line."
main-menu-bg-color: "Left side menu's background color."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Nadogradnja na izdanje Enterprise"
add_token: "Upload an Enterprise Edition support token"

@ -61,6 +61,7 @@ hu:
header-item-font-hover-color: "Kattintható fejléc betűszíne egér hatására."
header-border-bottom-color: "Vékony vonal a fejléc alatt. Hagyja üresen, ha semmilyen vonalat nem szeretne."
main-menu-bg-color: "Baloldali menü háttérszíne."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Frissítés a Vállalati Verzióra"
add_token: "Töltse fel a Vállalati Verzió támogatási tokenjét"
@ -89,29 +90,29 @@ hu:
<br/>
<a href="https://www.openproject.org/help/administration/manage-ldap-authentication/">Részletes útmutatásért kérjük olvassa el a dokumentációt</a>.
attribute_texts:
name: Arbitrary name of the LDAP connection
name: Az LDAP kapcsolat tetszőleges neve
host: LDAP Kiszolgáló neve vagy IP címe
login_map: The attribute key in LDAP that is used to identify the unique user login. Usually, this will be `uid` or `samAccountName`.
generic_map: The attribute key in LDAP that is mapped to the OpenProject `%{attribute}` attribute
admin_map_html: "Optional: The attribute key in LDAP that <strong>if present</strong> marks the OpenProject user an admin. Leave empty when in doubt."
login_map: Az LDAP attribútumkulcsa, amelyet az egyedi felhasználói bejelentkezés azonosítására használnak. Ez általában `uid` vagy` samAccountName`.
generic_map: Az LDAP attribútumkulcsa, amely az OpenProject %{attribute} attribútumhoz van leképezve
admin_map_html: "Opcionális: Az LDAP attribútumkulcsa, amely a <strong> ha van </strong> jelöli az OpenProject felhasználó adminisztrátorát. Hagyja üresen ha kétséges."
system_user_dn_html: |
Enter the DN of the system user used for read-only access.
Írja be az írásvédett hozzáféréshez használt rendszerfelhasználó DN-jét.
<br/>
Example: uid=openproject,ou=system,dc=example,dc=com
system_user_password: Enter the bind password of the system user
Példa: uid = openproject, ou = rendszer, dc = példa, dc = com
system_user_password: Adja meg a rendszergazda bind jelszavát
base_dn: |
Enter the Base DN of the subtree in LDAP you want OpenProject to look for users and groups.
OpenProject will filter for provided usernames in this subtree only.
Example: ou=users,dc=example,dc=com
Írja be annak az alrésznek az alap DN-jét az LDAP-ban, amelyben az OpenProject felhasználókat és csoportokat szeretne keresni.
Az OpenProject csak ebben a részfában biztosítja a megadott felhasználóneveket.
Példa: ou = felhasználók, dc = példa, dc = com
onthefly_register: |
If you check this box, OpenProject will automatically create new users from their LDAP entries
when they first authenticate with OpenProject.
Leave this unchecked to only allow existing accounts in OpenProject to authenticate through LDAP!
Ha bejelöli ezt a négyzetet, az OpenProject automatikusan új felhasználókat hoz létre az LDAP bejegyzéseikből
amikor először hitelesítenek az OpenProject segítségével.
Ha ezt nem jelöli, akkor az OpenProject már létező fiókjai csak az LDAP segítségével hitelesíthetők!
connection_encryption: 'Kapcsolat titkosítása'
system_account: 'Rendszer fiók'
system_account_legend: |
OpenProject requires read-only access through a system account to lookup users and groups in your LDAP tree.
Please specify the bind credentials for that system user in the following section.
Az OpenProject csak olvasható hozzáférést igényel egy rendszerfiókon keresztül az LDAP-fában lévő felhasználók és csoportok kereséséhez.
A következő szakaszban adja meg a rendszerfelhasználó bind hitelesítő adatait.
ldap_details: 'LDAP részletek'
user_settings: 'Attribútum-leképezés'
user_settings_legend: |
@ -160,7 +161,7 @@ hu:
concatenation:
single: 'vagy'
deprecations:
time_entries: "This time entries view is superseded by the 'Cost reports' module. This view now only supports exporting time entry information to csv. For interactive filtering, please activate the 'Cost reports' module in the project settings."
time_entries: "Az idei bejegyzések nézetét felváltja a 'Költségjelentések' modul. Ez a nézet csak az időbeviteli információk exportálását támogatja a csv-be. Az interaktív szűréshez kérjük, aktiválja a 'Költségjelentések' modult a projektbeállításokban."
global_search:
overwritten_tabs:
wiki_pages: "Wiki"
@ -559,7 +560,7 @@ hu:
id_filter_required: "Egy \"id\" szűrő szükséges."
project:
archived_ancestor: 'A projektnek archívált őse van.'
foreign_wps_reference_version: 'Work packages in non descendant projects reference versions of the project or its descendants.'
foreign_wps_reference_version: 'Munkacsomagok nem leszármazottak a projektekben, a projekt vagy annak leszármazottainak referenciaverziói.'
attributes:
types:
in_use_by_work_packages: "munkacsomagok használatban vannak: %{types}"
@ -596,7 +597,7 @@ hu:
time_entry:
attributes:
hours:
day_limit: "is too high as a maximum of 24 hours can be logged per date."
day_limit: "túl magas, mivel dátumonként legfeljebb 24 óra naplózható."
work_package:
is_not_a_valid_target_for_time_entries: "A #%{id} feladatcsoport nem érvényes cél az idő bejegyzések ismételt hozzárendeléséhez."
attributes:
@ -1031,7 +1032,7 @@ hu:
add_groups: "Attribútum-csoport hozzáadása"
rename_groups: "Attribútum-csoportok átnevezése"
project_filters:
description_html: "Filtering and sorting on custom fields is an enterprise edition feature."
description_html: "Az egyedi mezők szűrése és rendezése vállalati kiadás funkció."
enumeration_activities: "Időnyilvántartási tevékenységek"
enumeration_work_package_priorities: "Feladatcsoport fontosság"
enumeration_reported_project_statuses: "Projekt állapot beszámoló"
@ -1123,7 +1124,7 @@ hu:
general_text_yes: "igen"
general_text_No: "Nem"
general_text_Yes: "Igen"
general_text_true: "true"
general_text_true: "Igaz"
general_text_false: "hamis"
gui_validation_error: "1 hiba"
gui_validation_error_plural: "%{count} hiba"
@ -1618,7 +1619,7 @@ hu:
label_used_by_types: "Használt típusok szerint"
label_used_in_projects: "Használt projektek szerint"
label_user: "Felhasználó"
label_user_and_permission: "Users & Permissions"
label_user_and_permission: "Felhasználók és jogok"
label_user_named: "Felhasználó: %{name}"
label_user_activity: "%{value} tevékenység"
label_user_anonymous: "Anonymous"
@ -1631,7 +1632,7 @@ hu:
label_user_new: "Új felhasználó"
label_user_plural: "Felhasználók"
label_user_search: "Felhasználó keresése"
label_user_settings: "User settings"
label_user_settings: "Felhasználói beállítások"
label_version_new: "Új verzió"
label_version_plural: "Verzió"
label_version_sharing_descendants: "Az alprojektekkel rendelkező"
@ -1649,7 +1650,7 @@ hu:
label_wiki_content_added: "Wiki oldal hozzáadva"
label_wiki_content_updated: "Wiki oldal frissítve"
label_wiki_toc: "Tartalomjegyzék"
label_wiki_toc_empty: "Table of Contents is empty as no headings are present."
label_wiki_toc_empty: "A tartalomjegyzék üres, mivel nincs címsor."
label_wiki_dont_show_menu_item: "Nem mutasd meg ezt a wikioldalt a projekt navigáció közben"
label_wiki_edit: "Wiki szerkesztés"
label_wiki_edit_plural: "Wiki szerkesztések"
@ -1740,7 +1741,7 @@ hu:
legacy_warning:
timeline: 'Ez az örökölt idővonal makró eltávolításra került, és már nem áll rendelkezésre. A funkcionalitást beágyazott táblázat makróval helyettesítheti.'
include_wiki_page:
removed: 'The macro does no longer exist.'
removed: 'A makro nem érvényes a továbbiakban'
wiki_child_pages:
errors:
page_not_found: "Nem található a wiki oldal \"%{name}\"."
@ -2115,13 +2116,13 @@ hu:
setting_display_subprojects_work_packages: "Megjelenítendő alprojektek, feladatcsoportok a fő projekt alapértelmezett beállítása szerint"
setting_emails_footer: "E-mailek lábléce"
setting_emails_header: "E-mailek fejléce"
setting_email_login: "Use email as login"
setting_email_login: "Használd az e-mail címet a bejellentkezéshez"
setting_enabled_scm: "SCM engedélyezve"
setting_feeds_enabled: "Hírcsatornák engedélyezése"
setting_feeds_limit: "Tartalom szintjének a korlátja"
setting_file_max_size_displayed: "A szöveg fájl sorainak maximum mérete megjelenítéskor"
setting_host_name: "Gazdagép neve"
setting_invitation_expiration_days: "Activation email expires after"
setting_invitation_expiration_days: "Az aktivációs email lejár ekkor"
setting_work_package_done_ratio: "A feladatcsoport elkészült arányainak kiszámítása"
setting_work_package_done_ratio_field: "A feladatcsoport mező használata"
setting_work_package_done_ratio_status: "Használja a feladatcsoport állapotát"
@ -2478,7 +2479,7 @@ hu:
Új meghívó e-mail küldése egy új tokennel. Ez abban az esetben hasznos, ha a felhasználó nem érvényesítette meghívóját időben (lejárt a tokenje) vagy nem kapta meg az meghívó e-mailt. Aktív felhasználóknak is küldhetsz újra meghívót, ha meg akarják változtatni a bejelentkezési módjukat. Ebben az esetben a meghívó kiküldése után a felhasználók állapota 'Meghívva' lesz.
tooltip:
setting_email_login: >
If enabled a user will be unable to chose a login during registration. Instead their given email address will serve as the login. An administrator may still change the login separately.
Ha engedélyezve van, a felhasználó nem tudja kiválasztani a bejelentkezést a regisztráció során. Ehelyett a megadott e-mail címet fogja bejelentkezésre használni. Az adminisztrátor továbbra is külön módosíthatja a bejelentkezést.
queries:
apply_filter: Előre beállított szűrő alkalmazása
top_menu:
@ -2541,11 +2542,11 @@ hu:
protocol_mismatch:
title: 'Protokol beállítási eltérés'
text_html: >
Your application is running with its protocol setting set to <code>%{set_protocol}</code>, but the request is an <code>%{actual_protocol}</code> request. This will result in errors! Go to <a href="%{setting_path}">System settings</a> and change the "Protocol" setting to correct this.
Az alkalmazás fut, amelynek protokollbeállítása <code>%{set_protocol} </code>, de a kérelem <code>%{actual_protocol} </code> kérés. Ez hibákat eredményez! Lépjen a <a href="%{setting_path}"> Rendszerbeállítások </a> pontra, és javítsa ki a "Protokoll" beállítást.
hostname_mismatch:
title: 'Állomásnév beállítási eltérés'
title: 'Hosztnév beállítási eltérés'
text_html: >
Your application is running with its host name setting set to <code>%{set_hostname}</code>, but the request is a <code>%{actual_hostname}</code> hostname. This will result in errors! Go to <a href="%{setting_path}">System settings</a> and change the "Host name" setting to correct this.
Az alkalmazás fut a gazdagépnév beállításával <code>%{set_hostname} </code> -ra állítva, de a kérelem <code>%{actual_hostname} </code> gazdagépnév. Ez hibákat eredményez! Lépjen a <a href="%{setting_path}"> Rendszerbeállítások </a> pontra, és javítsa ki a "Gazdagép neve" beállítást.
menu_item: "Menüpont"
menu_item_setting: "Látható"
wiki_menu_item_for: "Wikipage \"%{title}\" menüeleme"
@ -2648,7 +2649,7 @@ hu:
redirect_uri_html: >
The allowed URLs authorized users can be redirected to. One entry per line. <br/> If you're registering a desktop application, use the following URL.
confidential: "Check if the application will be used where the client secret can be kept confidential. Native mobile apps and Single Page Apps are assumed non-confidential."
scopes: "Check the scopes you want the application to grant access to. If no scope is checked, api_v3 is assumed."
scopes: "Ellenőrizze azokat a hatóköröket, amelyekhez az alkalmazás hozzáférést biztosít. Ha nem ellenőrzi a hatókört, akkor az api_v3 feltételezzük."
client_credential_user_id: "Optional user ID to impersonate when clients use this application. Leave empty to allow public access only"
register_intro: "If you are developing an OAuth API client application for OpenProject, you can register it using this form for all users to use."
default_scopes: ""
@ -2663,8 +2664,8 @@ hu:
wants_to_access_html: >
This application requests access to your OpenProject account. <br/> <strong>It has requested the following permissions:</strong>
scopes:
api_v3: "Teljes API v2 hozzáférés"
api_v3_text: "Application will receive full read & write access to the OpenProject API v3 to perform actions on your behalf."
api_v3: "Teljes API v3 hozzáférés"
api_v3_text: "Az alkalmazás teljes olvasási és írási hozzáférést kap az OpenProject API v3 verzióhoz az Ön nevében végzett műveletek elvégzéséhez."
grants:
created_date: "Approved on"
scopes: "Jogosultságok"

@ -61,6 +61,7 @@ id:
header-item-font-hover-color: "Warna font \"item header\" yang bisa di klik ketika ditunjuk dengan mouse."
header-border-bottom-color: "Garis tipis di bawah header. Biarkan filed ini kosong jika Anda tidak ingin garis apapun."
main-menu-bg-color: "Warna latar belakang menu sisi kiri."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Tingkatkan ke edisi enterprise"
add_token: "Unggah sebuah token bantuan edisi enterprise"

@ -61,6 +61,7 @@ it:
header-item-font-hover-color: "Colore del carattere degli elementi cliccabili nelle intestazioni al passaggio del mouse."
header-border-bottom-color: "Sottile linea sotto l'intestazione. Lascia vuoto questo campo se non vuoi nessuna linea."
main-menu-bg-color: "Colore di sfondo del menu a sinistra."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Aggiorna ad Enterprise Edition"
add_token: "Carica un token di assistenza per Enterprise Edition"

@ -61,6 +61,7 @@ ja:
header-item-font-hover-color: "クリック可能なヘッダー項目にマウスを置いたときのフォント色。"
header-border-bottom-color: "ヘッダーの下の細い線。線を引きたくない場合は、このフィールドを空にしてください。"
main-menu-bg-color: "左サイドメニューの背景色。"
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "エンタープライズ版にアップグレード"
add_token: "エンタープライズ版サポートのトークンをアップロード"

@ -173,7 +173,7 @@ ca:
query_saving: "No s'ha pogut desar la vista."
embedded_table_loading: "La vista incrustada no s'ha pogut carregar: %{message}"
enumeration_activities: "Activitats (seguidor de temps)"
enumeration_doc_categories: "Document categories"
enumeration_doc_categories: "Categories de documents"
enumeration_work_package_priorities: "Prioritats dels paquets de treball"
filter:
description:
@ -396,33 +396,33 @@ ca:
next: 'Següent'
got_it: 'D''acord'
steps:
help_menu: 'In the <b>Help</b> menu you will find a user guide and additional help resources. <br> Enjoy your work with OpenProject!'
help_menu: 'Al menú d''<b>Ajuda</b> vostè trobarà una guia d''usuari i material adicional de suport. <br>Gaudeixi de la seva feina amb OpenProject!'
members: 'Convidi nous <b>Membres</b> per afegir-se al seu projecte.'
project_selection: 'Please click on one of the projects with useful demo data to get started. <br> The <b>Demo project</b> suits best for classical project management, while the <b>Scrum project</b> is better for Agile project management.'
sidebar_arrow: "Amb la fletxa vostè pot navegar enrrere cap al <b>Menu principal</b> del projecte."
welcome: 'Realitzi un tour de tres minuts per aprendre els <b> aspectes més importants</b>. <br>Recomanem completar les passes fins el final. Podrà recomençar el tour en qualsevol moment.'
wiki: 'Dintre del <b>Wiki</b> pot documentar i compartir el coneixement amb el seu equip.'
backlogs:
overview: "Manage your work in the <b>Backlogs</b> view. <br> On the right you have the Product Backlog or a Bug Backlog, on the left you will have the respective sprints. Here you can create <b>epics, user stories, and bugs</b>, prioritize via drag'n'drop and add them to a sprint."
task_board_arrow: 'To see your <b>Task board</b>, open the Sprint drop-down...'
task_board_select: '... and select the <b>Task board</b> entry.'
task_board: "The <b>Task board</b> visualizes the progress for this sprint. Add new tasks or impediments with the + icon next to a user story. Via drag'n'drop you can update the status."
overview: "Gestioni el seu treball a la vista <b>Backlogs</b>. <br> A la dreta té el \"Product Backlog\" o \"Bug Backlog\", a l'esquerra tindrà els respectius esprints. Aquí pot crear <b>èpiques, histories d'usuàries, i bugs</b>, prioritzar arrossegant i afegir-los a un esprint."
task_board_arrow: 'Per veure el seu <b>Tauler de tasques</b>, obri el desplegable Esprint...'
task_board_select: '... i seleccioni l''entrada <b>Tauler de tasca</b>.'
task_board: "Al <b>Tauler de tasca</b> visualitza el progrés d'aquest esprint. Afegeixi noves tasques o problemes amb la icona + al costat de la història d'usuari. Arrossegant podrà actualitzar l'estatus."
boards:
overview: 'Manage your work within an intuitive <b>Boards</b> view.'
lists: 'You can create multiple lists (columns) within one Board view, e.g. to create a KANBAN board.'
add: 'Click the + will <b>add a new card</b> to the list within a Board.'
drag: 'Drag & Drop your cards within a list to re-order, or to another list. A double click will open the details view.'
wp:
toggler: "Now let's have a look at the <b>Work package</b> section, which gives you a more detailed view of your work."
list: 'This is the <b>Work package</b> list with the important work within your project, such as tasks, features, milestones, bugs, and more. <br> You can create or edit a work package directly within this list. To see its details you can double click on a row.'
full_view: 'Within the <b>Work package details</b> you find all relevant information, such as description, status and priority, activities, dependencies or comments.'
back_button: 'With the arrow you can navigate back 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> to create a timeline for your project.'
timeline: 'Here you can edit your project plan. Create new phases, milestones, and add dependencies. All team members can see and update the latest plan at any time.'
toggler: "Ara fem un cop d'ull a la secció <b>Paquets de treball</b>, la qual ens dona una vista més detallada de la seva feina."
list: 'Aquesta es la llista <b>Paquet de treball</b> amb el treball important dintre del seu projecte, com tasques, característiques, fites, errors i mes. <br> Pot crear o editar un paquet de treball directament dintre d''aquesta llista. Per a veure els seus detalls pot fer doble clic en una fila.'
full_view: 'Dintre de <b>Detalls de paquet de treball</b> trobarà tota la informació rellevant, com la descripció, estat i prioritats, activitats, dependències o comentaris.'
back_button: 'Amb la fletxa pot navegar enrrere cap a la llista de paquets de treball.'
create_button: 'El botó <b>Crear</b> afegirà un nou paquet de treball al seu projecte.'
timeline_button: 'Pot activar el <b>Gràfic Gantt</b> per a crear una línia de temps al seu projecte.'
timeline: 'Aquí pot editar el seu pla de projecte. Crear noves fases, fites i afegir dependències. Tots els membres poden veure i actualitzar l''últim pla en qualsevol moment.'
password_confirmation:
field_description: 'You need to enter your account password to confirm this change.'
title: 'Confirm your password to continue'
field_description: 'Necessita introduir la contrasenya del seu compte per a confirmar aquest canvi.'
title: 'Confirmi la seva contrasenya per continuar'
pagination:
no_other_page: "Es troba en el l'únic full."
pages:
@ -430,29 +430,29 @@ ca:
previous: "Tornar a la pàgina anterior"
placeholders:
default: '-'
subject: 'Enter subject here'
subject: 'Introdueixi el títol aquí'
selection: 'Si us plau, selecciona'
relation_description: 'Click to add description for this relation'
relation_description: 'Cliqui per afegir una descripció per aquesta relació'
project:
required_outside_context: >
Please choose a project to create the work package in to see all attributes. You can only select projects which have the type above activated.
context: 'Context de projecte'
work_package_belongs_to: 'Aquest paquet de treball pertany al projecte %{projectname}.'
click_to_switch_context: 'Open this work package in that project.'
click_to_switch_context: 'Obrir aquest paquet de treball d''aquell projecte.'
autocompleter:
label: 'Project autocompletion'
label: 'Autoemplenament del projecte'
text_are_you_sure: "N'esteu segur?"
types:
attribute_groups:
error_duplicate_group_name: "The name %{group} is used more than once. Group names must be unique."
error_no_table_configured: "Please configure a table for %{group}."
reset_title: "Reset form configuration"
error_duplicate_group_name: "El nom %{group} ja està en ús. Els noms de Grup han de ser únics."
error_no_table_configured: "Si us plau, configuri una taula per a %{group}."
reset_title: "Reiniciar la configuració del formulari"
confirm_reset: >
Warning: Are you sure you want to reset the form configuration? This will reset the attributes to their default group and disable ALL custom fields.
Compte: Esta segur que vol reiniciar la configuració del formulari? Això retornarà als atributs als grups per defecte i des-habilitarà TOTS els camps personalitzats.
upgrade_to_ee: "Actualitza a l'Enterprise Edition"
upgrade_to_ee_text: "Wow! If you need this feature you are a super pro! Would you mind supporting us OpenSource developers by becoming an Enterprise Edition client?"
upgrade_to_ee_text: "Ostres! Si necessita aquesta característica es un súper pro! L'importaria donar suport als desenvolupadors d'OpenSource convertint-se en un client de la versió Enterprise?"
more_information: "More information"
nevermind: "Nevermind"
nevermind: "No importa"
edit:
form_configuration: "Form Configuration"
projects: "Projectes"
@ -475,7 +475,7 @@ ca:
label_search_watchers: Cercar vigilants
label_add: Afegir observadors
label_discard: Descartar la selecció
typeahead_placeholder: Search for possible watchers
typeahead_placeholder: Cercar possibles vigilants
relation_labels:
parent: "Pare"
children: "Fills"
@ -486,31 +486,31 @@ ca:
blocked: "Bloquejat per"
precedes: "Precedeix"
follows: "Segueix"
includes: "Includes"
partof: "Part of"
requires: "Requires"
required: "Required by"
relation_type: "relation type"
includes: "Inclou"
partof: "Part de"
requires: "Requereix"
required: "Requerit per"
relation_type: "tipus de relació"
relations_hierarchy:
parent_headline: "Pare"
hierarchy_headline: "Hierarchy"
hierarchy_headline: "Jerarquia"
children_headline: "Fills"
relation_buttons:
set_parent: "Set parent"
set_parent: "Establir pare"
change_parent: "Canviar pare"
remove_parent: "Remove parent"
remove_parent: "Eliminar pare"
hierarchy_indent: "Indent hierarchy"
hierarchy_outdent: "Outdent hierarchy"
group_by_wp_type: "Group by work package type"
group_by_relation_type: "Group by relation type"
add_parent: "Add existing parent"
add_new_child: "Create new child"
create_new: "Create new"
add_existing: "Add existing"
add_existing_child: "Add existing child"
remove_child: "Remove child"
add_new_relation: "Create new relation"
add_existing_relation: "Add existing relation"
group_by_wp_type: "Agrupar per tipus de paquet de treball"
group_by_relation_type: "Agrupar per tipus de relació"
add_parent: "Afegir pare existent"
add_new_child: "Crear nou fill"
create_new: "Crear nou"
add_existing: "Afegir existent"
add_existing_child: "Afegir fill existent"
remove_child: "Eliminar fill"
add_new_relation: "Crea una nova relació"
add_existing_relation: "Afegir relació existent"
update_description: "Set or update description of this relation"
toggle_description: "Toggle relation description"
update_relation: "Click to change the relation type"
@ -763,7 +763,7 @@ ca:
default: "per defecte"
display_settings: 'Display settings'
default_mode: "Flat list"
hierarchy_mode: "Hierarchy"
hierarchy_mode: "Jerarquia"
hierarchy_hint: "All filtered table results will be augmented with their ancestors. Hierarchies can be expanded and collapsed."
display_sums_hint: "Display sums of all summable attributes in a row below the table results."
show_timeline_hint: "Show an interactive gantt chart on the right side of the table. You can change its width by dragging the divider between table and gantt chart."

@ -41,7 +41,7 @@ hu:
button_back_to_list_view: "Vissza a lista nézethez"
button_cancel: "Mégsem"
button_close: "Bezár"
button_change_project: "Change project"
button_change_project: "Cseréld a projektet"
button_check_all: "Az összes kijelölése"
button_configure-form: "Űrlap beállítás"
button_confirm: "Jóváhagy"
@ -62,8 +62,8 @@ hu:
button_open_details: "Részletes nézet megnyitása"
button_close_details: "Részletes nézet bezárása"
button_open_fullscreen: "Teljes képernyős nézet"
button_show_cards: "Show card view"
button_show_list: "Show list view"
button_show_cards: "Mutatsd a card nézetet"
button_show_list: "Mutatsd a lista nézetet"
button_quote: "Idéz"
button_save: "Mentés"
button_settings: "Beállítások"
@ -73,7 +73,7 @@ hu:
button_export-atom: "Atom letöltés"
calendar:
title: 'Naptár'
too_many: 'There are %{count} work packages in total, but only %{max} can be shown.'
too_many: 'Összesen %{count} munkacsomag van, de csak %{max} jeleníthető meg.'
card:
add_new: 'Add new card'
highlighting:
@ -85,22 +85,22 @@ hu:
browser_error: "A böngésző nem támogatja a vágólapra másolást. Kérjük, másolja a kijelölt szöveget manuálisan."
copied_successful: "A vágólapra másolás sikeres!"
chart:
type: 'Chart type'
axis_criteria: 'Axis criteria'
modal_title: 'Work package graph configuration'
type: 'Diagram típus'
axis_criteria: 'Tengely kritérium'
modal_title: 'Munkacsomag grafikon beállítás'
types:
line: 'Line'
horizontal_bar: 'Horizontal bar'
bar: 'Bar'
pie: 'Pie'
doughnut: 'Doughnut'
line: 'vonal'
horizontal_bar: 'Vízszintes oszlop'
bar: "oszlop\n"
pie: 'pie'
doughnut: 'Fánk'
radar: 'Radar'
polar_area: 'Polar area'
polar_area: 'Poláris terület'
tabs:
graph_settings: 'Általános'
dataset: 'Dataset %{number}'
dataset: 'Adatbeállítás %{number}'
errors:
could_not_load: 'The data to display the graph could not be loaded. The necessary permissions may be lacking.'
could_not_load: 'A grafikon megjelenítéséhez szükséges adatokat nem lehetett betölteni. Hiányozhatnak a szükséges engedélyek.'
description_available_columns: "Elérhető oszlopok"
description_current_position: "You are here: "
description_select_work_package: "Munkacsomag kiválasztás #%{id}"
@ -159,7 +159,7 @@ hu:
drag_to_activate: "Innen húzza a mezőket, hogy aktiválja"
add_group: "Tulajdonságcsoport"
add_table: "Táblázat hozzáadása a kapcsolódó munkacsomagokhoz"
edit_query: 'Edit query'
edit_query: 'Lekérdezés módosítása'
new_group: 'Új csoport'
reset_to_defaults: 'Alapbeállítások visszaállítása'
custom_actions:
@ -198,8 +198,8 @@ hu:
global_roles: Globális szerepek
hal:
error:
update_conflict_refresh: "Click here to refresh the resource and update to the newest version."
edit_prohibited: "Editing %{attribute} is blocked for this resource. Either this attribute is derived from relations (e.g, children) or otherwise not configurable."
update_conflict_refresh: "Kattintson ide, hogy a Feladatcsoportot legújabb verzióra történő frissítéséhez."
edit_prohibited: "A (z) %{attribute} attribútum nem szerkeszthető. Vagy azért mert ez valamelyik kapcsolatból származik (gyerekektől), vagy más okból nem módosítható."
format:
date: "A(z) %{attribute} nem felel meg az -ÉÉÉÉ-HH-NN- dátumformátumnak."
general: "Hiba történt."
@ -207,15 +207,15 @@ hu:
blocks:
new_features:
text_new_features: "Read about new features and product updates."
learn_about: "Learn more about the new features"
learn_about: "Tudjon meg többet az új funkciókról"
standard:
learn_about_link: https://www.openproject.org/openproject-10-4
current_new_feature_html: >
The release contains various new features and improvements: <br><br> <ul> <li>Default <b>design templates</b> to select a light or dark theme (premium feature).</li> <li>New <b>time tracking widget</b> for <i>My page</i> to show spent time in a bar chart.</li> <li><b>XLS-exports for cost reports</b> and formatted text in PDF export of work packages.</li> <li><b>Improved design and usability</b>, i.e. tabs and more in project settings and administration.</li> </ul>
A kiadás különféle új funkciókat és fejlesztéseket tartalmaz: <br> <br> <ul> <li> Alapértelmezett <b> tervezősablonok </b> világos vagy sötét téma kiválasztásához (prémium szolgáltatás). </li> <li> Új <b> időkövetési widget </b> a <i> Saját oldal </i> számára, hogy az eltöltött időt sávdiagramban jelenítsék meg. </li> <li> <b> <SQLSX-export költségjelentésekhez </b> és formázott szöveg PDF formátumban a munkacsomagok exportálásakor. </li> <li> <b> Javítva a tervezés és a használhatóság </b> azaz a fülek és így tovább a projektbeállításokban és az adminisztrációban. </li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-bim-10-4
current_new_feature_html: >
OpenProject contains a <b>new IFC module to integrate 3D models</b> into your project management application and to work collaboratively with these files with your team without installation of separate costly software or licenses. <br><br> <ul> <li><b>Import IFC files</b> of building models into your OpenProject application.</li> <li><b>Open 3D models and visualize building models</b> in your browser.</li> <li> Easily <b>work on multiple IFC files</b> with your team directly in OpenProject without installation of separate costly software. </li> </ul>
Az OpenProject tartalmaz egy <b> új IFC modult a 3D modellek integrálásához </b> a projektkezelő alkalmazásba, és ezekkel a fájlokkal együtt dolgozhat a csapatával, külön költséges szoftver vagy licencek telepítése nélkül. <br> <br> <ul> <li> <b> Építési modellek IFC fájljainak importálása </b> az OpenProject alkalmazásba. </li> <li> <b> Nyissa meg a 3D modelleket és megjelenítse az építési modelleket </b> > a böngészőjében. </li> <li> Könnyen <b> több IFC fájlt tud dolgozni </b> a csapattal közvetlenül az OpenProject programban, külön költséges szoftver telepítése nélkül. </li> </ul>
label_activate: "Aktivál"
label_add_column_after: "Oszlop hozzáadása utána"
label_add_column_before: "Oszlop hozzáadása előtte"
@ -233,7 +233,7 @@ hu:
label_and: "és"
label_ascending: "Növekvő"
label_author: "Szerző: %{user}"
label_avatar: "Avatar"
label_avatar: "Profilkép"
label_between: "között"
label_board: "Board"
label_board_locked: "Zárolt"
@ -315,7 +315,7 @@ hu:
label_project_plural: "Projektek"
label_visibility_settings: "Láthatósági beállítások"
label_quote_comment: "Hozzászólás idézése"
label_recent: "Recent"
label_recent: "Friss"
label_reset: "Visszaállít, reset"
label_remove_column: "Oszlop eltávolítása"
label_remove_columns: "Eltávolítja a kijelölt oszlopokat"
@ -349,7 +349,7 @@ hu:
label_total_progress: "%{percent}% a teljes folyamatban"
label_total_amount: "Teljes: %{amount}"
label_updated_on: "frissítve"
label_value_derived_from_children: "(value derived from children)"
label_value_derived_from_children: "(érték származik a gyermekektől)"
label_warning: "Figyelem"
label_work_package: "Feladatcsoport"
label_work_package_plural: "Munkacsomagok"
@ -386,7 +386,7 @@ hu:
label_upload_counter: "%{done}/%{count} fájl feltöltve"
label_validation_error: "A feladatcsoport a következő hibák miatt nem menthető:"
label_version_plural: "Verzió"
label_view_has_changed: "This view has unsaved changes. Click to save them."
label_view_has_changed: "Ez a nézet nem mentett változtatásokat tartalmaz. Kattintson a mentéshez."
help_texts:
show_modal: 'Attribútum-súgószöveg mutatása'
onboarding:
@ -453,19 +453,19 @@ hu:
more_information: "További információ"
nevermind: "Mindegy"
edit:
form_configuration: "Form Configuration"
form_configuration: "Ürlap beállítása"
projects: "Projektek"
settings: "Beállítások"
time_entry:
project: 'Projekt'
work_package: 'Feladatcsoport'
work_package_required: 'Requires selecting a work package first.'
work_package_required: 'Először ki kell választania egy munkacsomagot.'
activity: 'Tevékenység'
comment: 'Vélemény'
duration: 'Időtartam'
spent_on: 'dátum'
hours: 'órák'
label: 'Time entry'
label: 'Belépési idő'
two_factor_authentication:
label_two_factor_authentication: 'Two-factor authentication'
watchers:
@ -498,8 +498,8 @@ hu:
set_parent: "Set parent"
change_parent: "Szülő módosítása"
remove_parent: "Szülő eltávolítása"
hierarchy_indent: "Indent hierarchy"
hierarchy_outdent: "Outdent hierarchy"
hierarchy_indent: "Behúzási hierarchia"
hierarchy_outdent: "Kihúzási hierarchia"
group_by_wp_type: "Rendezés feladatcsoport típusai szerint"
group_by_relation_type: "Rendezés kapcsolati típusok szerint"
add_parent: "Meglévő szülő kapcsolat hozzáadása"
@ -527,14 +527,14 @@ hu:
field_value_enter_prompt: "Adja meg az értéket a %{field} mezőhöz"
select2:
input_too_short:
zero: "Please enter more characters"
zero: "Kérjük, írjon be további karaktereket"
one: "Kérjük, adjon meg egy további karaktert"
other: "Kérjük, adjon meg {{count}} karaktert"
load_more: "További eredmények betöltése..."
no_matches: "Nincs találat"
searching: "Keresés ..."
selection_too_big:
zero: "You cannot select any items"
zero: "Nem jelölt ki egy elemet sem!"
one: "Csak egy elem választható"
other: "Csak {{limit}} elem választható"
project_menu_details: "Részletek"
@ -629,7 +629,7 @@ hu:
image: "Kép"
work_packages:
bulk_actions:
move: 'Bulk change of project'
move: 'A projekt tömeges megváltoztatása'
edit: 'Tömeges szerkesztés'
copy: 'Tömeges másolás'
delete: 'Tömeges törlés'
@ -655,7 +655,7 @@ hu:
message_successful_show_in_fullscreen: "Ide kattintva a munkacsomag részletei teljes képernyős nézeten jeleníthetőek meg."
message_view_spent_time: "Feladatcsoporttal töltött idő megjelenítése"
message_work_package_read_only: "Ez Feladatcsomag ebben a státuszban zárolt. Nem lehet más attribútum segítségével megváltoztatni."
message_work_package_status_blocked: "Work package status is not writable due to closed status and closed version being assigned."
message_work_package_status_blocked: "A munkacsomag állapota nem írható, mivel a zárt állapotot és a zárt verziót hozzárendelték."
placeholder_filter_by_text: "Subject, description, comments, ..."
inline_create:
title: 'Ide kattintva adhatsz új munkacsomagot a listához'
@ -680,7 +680,7 @@ hu:
no_results:
title: Nincs megjelenítendő munkacsomag.
description: Vagy nincs még ilyen munkacsomag, vagy a szűrők miatt nem jeleníthető meg.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering.
limited_results: Csak %{count} munkacsomag jeleníthető meg kézi rendezés módban. Kérjük, szűréssel csökkentse az eredményeket.
property_groups:
details: "Részletek"
people: "Személyek"
@ -722,7 +722,7 @@ hu:
label_content: "Kattintson ide a menü átugrásához és a tartalom megtekintéséhez"
placeholders:
default: "-"
formattable: "%{name}: Click to edit..."
formattable: "%{name}: kattints a módosításhoz!"
query:
column_names: "Oszlopok"
group_by: "Csoport szintű eredmények"
@ -740,9 +740,9 @@ hu:
confirm_edit_cancel: "Biztosan meg kívánod szakítani a nézet nevének szerkesztését? Cím vissza lesz állítva a korábbi értékre."
click_to_edit_query_name: "Kattints a nézet címének szerkesztéséhez"
rename_query_placeholder: "A nézet neve"
star_text: "Mark this view as favorite and add to the saved views sidebar on the left."
star_text: "Jelölje meg ezt a nézetet kedvencként, és adja hozzá a bal oldalon a mentett nézetek oldalsávjához."
public_text: >
Publish this view, allowing other users to access your view. Users with the 'Manage public views' permission can modify or remove public query. This does not affect the visibility of work package results in that view and depending on their permissions, users may see different results.
Tegye közzé ezt a nézetet, lehetővé téve más felhasználók számára, hogy hozzáférjenek a nézethez. A „Nyilvános nézetek kezelése” engedéllyel rendelkező felhasználók módosíthatják vagy eltávolíthatják a nyilvános lekérdezéseket. Ez nem befolyásolja a munkacsomag-eredmények láthatóságát abban a nézetben, és engedélyüktől függően a felhasználók eltérő eredményeket láthatnak.
errors:
unretrievable_query: "Unable to retrieve view from URL"
not_found: "Nincs ilyen nézet"
@ -777,17 +777,17 @@ hu:
priority: 'Fontosság'
type: 'Típus'
sorting_mode:
description: 'Chose the mode to sort your Work packages:'
automatic: 'Automatic'
manually: 'Manually'
warning: 'You will lose your previous sorting when activating the automatic sorting mode.'
description: 'Válassza ki a munkacsomagok rendezésének módját:'
automatic: 'Automatikus'
manually: 'Kézi'
warning: 'Az automatikus válogatás üzemmód aktiválásakor elveszíti korábbi rendezését.'
columns_help_text: "Use the input above to add or remove columns to your table view. You can drag and drop the columns to reorder them."
upsale:
attribute_highlighting: 'Need certain work packages to stand out from the mass?'
relation_columns: 'Szeretné látni a munkacsomag kapcsolatait?'
check_out_link: 'Tekintse meg az Enterprise Edition-t!'
relation_filters:
filter_work_packages_by_relation_type: 'Filter work packages by relation type'
filter_work_packages_by_relation_type: 'A munkacsomagok szűrése relációs típus szerint'
tabs:
overview: Áttekintés
activity: Tevékenység
@ -873,8 +873,8 @@ hu:
one: "egy gyermek munkacsomag"
other: "%{count} gyermek feladatcsoport"
hour:
zero: "0 h"
one: "1 h"
zero: "0 óra"
one: "1 óra"
other: "%{count} ó"
zen_mode:
button_activate: 'Zen mód aktiválása'
@ -890,6 +890,6 @@ hu:
project_and_subprojects: "and all subprojects"
search_for: "Search for"
views:
card: 'Cards'
list: 'Table'
card: 'Kártyák'
list: 'Tábla'
timeline: 'Gantt'

@ -0,0 +1,890 @@
#-- copyright
#OpenProject is an open source project management software.
#Copyright (C) 2012-2020 the OpenProject GmbH
#This program is free software; you can redistribute it and/or
#modify it under the terms of the GNU General Public License version 3.
#OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
#Copyright (C) 2006-2017 Jean-Philippe Lang
#Copyright (C) 2010-2013 the ChiliProject Team
#This program is free software; you can redistribute it and/or
#modify it under the terms of the GNU General Public License
#as published by the Free Software Foundation; either version 2
#of the License, or (at your option) any later version.
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
#GNU General Public License for more details.
#You should have received a copy of the GNU General Public License
#along with this program; if not, write to the Free Software
#Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#See docs/COPYRIGHT.rdoc for more details.
#++
vi:
js:
ajax:
hide: "Ẩn"
loading: "Đang tải..."
attachments:
draggable_hint: |
Kéo trên trường được soạn thảo để chèn ảnh hoặc file đính kèm. Trường soạn thảo đang được đóng sẽ được mở lại khi bạn kéo thả.
autocomplete_select:
placeholder:
multi: "Thêm \"%{name}\""
single: "Chọn \"%{name}\""
remove: "Xoá %{name}"
active: "Kích hoạt %{label} %{name}"
close_popup_title: "Đóng"
close_filter_title: "Đóng bộ lọc"
close_form_title: "Close form"
button_add_watcher: "Thêm người theo dõi"
button_back: "Quay lại"
button_back_to_list_view: "Quay lại danh sách"
button_cancel: "Hủy"
button_close: "Đóng"
button_change_project: "Change project"
button_check_all: "Đánh dấu tất cả"
button_configure-form: "Configure form"
button_confirm: "Xác nhận"
button_continue: "Continue"
button_copy: "Sao chép"
button_custom-fields: "Tùy chỉnh mục"
button_delete: "Xoá"
button_delete_watcher: "Xóa người xem"
button_details_view: "Thông tin chi tiết xem"
button_duplicate: "Nhân đôi"
button_edit: "Chỉnh sửa"
button_filter: "Bộ lọc"
button_advanced_filter: "Bộ lọc nâng cao"
button_list_view: "Xem kiểu danh sách"
button_show_view: "Xem toàn màn hình"
button_log_time: "Thời gian truy cập"
button_more: "Xem thêm"
button_open_details: "Mở thông tin chi tiết xem"
button_close_details: "Đóng xem chi tiết"
button_open_fullscreen: "Mở chế độ toàn màn hình"
button_show_cards: "Show card view"
button_show_list: "Show list view"
button_quote: "Trích dẫn"
button_save: "Lưu"
button_settings: "Settings"
button_uncheck_all: "Bỏ chọn tất cả"
button_update: "Cập Nhật"
button_export-pdf: "Tải PDF"
button_export-atom: "Tải về Atom"
calendar:
title: 'Lịch'
too_many: 'There are %{count} work packages in total, but only %{max} can be shown.'
card:
add_new: 'Add new card'
highlighting:
inline: 'Highlight inline:'
entire_card_by: 'Entire card by'
remove_from_list: 'Remove card from list'
caption_rate_history: "Rate history"
clipboard:
browser_error: "Trình duyệt không hỗ trợ copy vào clipboard. Vui lòng copy văn bản đã chọn theo cách thủ công."
copied_successful: "Sao chép thành công vào clipboard!"
chart:
type: 'Chart type'
axis_criteria: 'Axis criteria'
modal_title: 'Work package graph configuration'
types:
line: 'Line'
horizontal_bar: 'Horizontal bar'
bar: 'Bar'
pie: 'Pie'
doughnut: 'Doughnut'
radar: 'Radar'
polar_area: 'Polar area'
tabs:
graph_settings: 'Tổng quan'
dataset: 'Dataset %{number}'
errors:
could_not_load: 'The data to display the graph could not be loaded. The necessary permissions may be lacking.'
description_available_columns: "Cột có sẵn"
description_current_position: "You are here: "
description_select_work_package: "Chọn work package #%{id}"
description_selected_columns: "Các cột được lựa chọn"
description_subwork_package: "Con của work package #%{id}"
editor:
preview: 'Bật tắt chế độ xem trước'
source_code: 'Toggle Markdown source mode'
error_saving_failed: 'Saving the document failed with the following error: %{error}'
error_initialization_failed: 'Failed to initialize CKEditor!'
mode:
manual: 'Switch to Markdown source'
wysiwyg: 'Switch to WYSIWYG editor'
macro:
child_pages:
button: 'Liên kết đến trang con'
include_parent: 'Bao gồm trang trước'
text: '[Placeholder] Liên kết tới trang con của'
page: 'Trang wiki'
this_page: 'trang này'
hint: |
Để trường này rỗng đẻ liệt kêtất cả các trang con của trang hiện tại. Nếu bạn muốn tham chiếu đến một trang khác, hãy cung cấp tiêu đề hoặc lời bình của trang.
code_block:
button: 'Chèn đoạn mã'
title: 'Insert / sửa đoạn mã'
language: 'Định dạng ngôn ngữ'
language_hint: 'Nhập ngôn ngữ định dạng sẽ được sử dụng để làm nổi bật (nếu được hỗ trợ).'
dropdown:
macros: 'Macro'
chose_macro: 'Chọn macro'
toc: 'Mục lục'
toolbar_help: 'Bấm vào để chọn tiện ích và hiển thị thanh công cụ. Bấm đúp để chỉnh sửa tiện ích'
wiki_page_include:
button: 'Bao gồm các nội dung của một trang wiki khác'
text: '[Placeholder] bao gồm trang wiki của'
page: 'Trang wiki'
not_set: '(Trang chưa được thiết lập)'
hint: |
Bao gồm các nội dung của các trang wiki khác bằng cách xác định các tiêu đề hoặc bình luận. Bạn có thể bao gồm các trang wiki của dự án khác bằng cách tách chúng với một dấu phẩy như ví dụ sau.
work_package_button:
button: 'Chèn nút tạo gói'
type: 'Kiểu của gói công việc'
button_style: 'Sử dụng kiểu nút'
button_style_hint: 'Tùy chọn: Kiểm tra xem macro xuất hiện như là một nút, chứ không phải là một liên kết.'
without_type: 'Work package liên quan'
with_type: 'Tạo gói công việc (loại: %{typename})'
embedded_table:
button: 'Nhúng danh sách gói công việc dưới dạng bảng'
text: '[Placeholder] gói công việc nhúng'
embedded_calendar:
text: '[Placeholder] Embedded calendar'
admin:
type_form:
custom_field: 'Tùy chỉnh mục'
inactive: 'Inactive'
drag_to_activate: "Drag fields from here to activate them"
add_group: "Thêm 1 nhóm thuộc tính"
add_table: "Add table of related work packages"
edit_query: 'Edit query'
new_group: 'Nhóm mới'
reset_to_defaults: 'Reset to defaults'
custom_actions:
date:
specific: 'lúc'
current_date: 'Current date'
error:
internal: "Lỗi nội bộ đã xảy ra."
cannot_save_changes_with_message: "Không thể lưu thay đổi của bạn do lỗi sau: %{error}"
query_saving: "Các tiêu chí không thể được lưu."
embedded_table_loading: "Không thể nạp được vùng nhìn nhúng: %{message}"
enumeration_activities: "Hoạt động (theo dõi thời gian)"
enumeration_doc_categories: "Document categories"
enumeration_work_package_priorities: "Độ ưu tiên của work package"
filter:
description:
text_open_filter: "Mở bộ lọc này với 'ALT' và phím mũi tên."
text_close_filter: "Để nhập thôi ô đang kích hoạt nội dung Vd ấn enter. Nếu không muốn lọc lựa chọn mục rỗng đầu tiên."
noneElement: "(none)"
time_zone_converted:
two_values: "%{from} - %{to} in your local time."
only_start: "From %{from} in your local time."
only_end: "Till %{to} in your local time."
value_spacer: "-"
sorting:
criteria:
one: "Tiêu chí phân loại đầu tiên"
two: "Tiêu chí phân loại thứ hai"
three: "Tiêu chí phân loại thứ ba"
upsale_for_more: "Để xem thêm các lọc nâng cao, hãy kiểm tra các"
upsale_link: 'Phiên bản doanh nghiệp.'
general_text_no: "không"
general_text_yes: "có"
general_text_No: "Không"
general_text_Yes: "Có"
global_roles: Global Roles
hal:
error:
update_conflict_refresh: "Nhấn vào đây để làm mới tài nguyên và cập nhật lên phiên bản mới nhất."
edit_prohibited: "Chỉnh sửa%{attribute} bị chặn đối với tài nguyên này. Thuộc tính này có nguồn gốc từ các mối quan hệ (ví dụ: trẻ em) hoặc mặt khác không thể định cấu hình."
format:
date: "%{attribute} không phải là ngày hợp lệ - phải là YYYY-MM-DD."
general: "Lỗi đã xảy ra."
homescreen:
blocks:
new_features:
text_new_features: "Read about new features and product updates."
learn_about: "Tìm hiểu thêm về các tính năng mới"
standard:
learn_about_link: https://www.openproject.org/openproject-10-4
current_new_feature_html: >
Bản phát hành chứa nhiều tính năng và cải tiến mới: <br> <br> <ul> <li> Mặc định <b> mẫu thiết kế </b> để chọn chủ đề sáng hoặc tối (tính năng cao cấp). </li> <li> <b> tiện ích theo dõi thời gian mới </b> cho <i> Trang của tôi </i> để hiển thị thời gian đã sử dụng trong biểu đồ thanh. </li> <li> <b> Xuất khẩu XLS cho báo cáo chi phí </b> và định dạng văn bản trong xuất PDF của các gói công việc. </li> <li> <b> Cải thiện thiết kế và khả năng sử dụng </b>, tức là các tab và hơn thế nữa trong cài đặt và quản trị dự án. </li> </ul>
bim:
learn_about_link: https://www.openproject.org/openproject-bim-10-4
current_new_feature_html: >
OpenProject chứa <b> mô-đun IFC mới để tích hợp các mô hình 3D </b> vào ứng dụng quản lý dự án của bạn và để làm việc cộng tác với các tệp này với nhóm của bạn mà không cần cài đặt phần mềm hoặc giấy phép tốn kém riêng biệt. <br> <br> <ul> <li> <b> Nhập tệp IFC </b> của các mô hình tòa nhà vào ứng dụng OpenProject của bạn. </li> <li> <b> Mở mô hình 3D và trực quan hóa mô hình tòa nhà </b > trong trình duyệt của bạn. </li> <li> Dễ dàng <b> hoạt động trên nhiều tệp IFC </b> với nhóm của bạn trực tiếp trong OpenProject mà không cần cài đặt phần mềm tốn kém riêng biệt. </li> </ul>
label_activate: "Activate"
label_add_column_after: "Thêm cột phía sau"
label_add_column_before: "Thêm cột phía trước"
label_add_columns: "Add columns"
label_add_comment: "Thêm bình luận"
label_add_comment_title: "Comment and type @ to notify other people"
label_add_row_after: "Thêm dòng bên dưới"
label_add_row_before: "Thêm dòng bên trên"
label_add_selected_columns: "Thêm cột đang chọn"
label_added_by: "được gửi bởi"
label_added_time_by: "Thêm bởi %{author} %{age}"
label_ago: "vài ngày trước"
label_all: "tất cả"
label_all_work_packages: "Tất cả công việc"
label_and: "and"
label_ascending: "Tăng dần"
label_author: "Tác giả: %{user}"
label_avatar: "Avatar"
label_between: "between"
label_board: "Board"
label_board_locked: "Đã khóa"
label_board_plural: "Boards"
label_board_sticky: "Chú ý"
label_create: "Tạo mới"
label_create_work_package: "Create new work package"
label_created_by: "Được tạo bởi"
label_date: "Ngày"
label_date_with_format: "Nhập vào %{date_attribute} bằng cách sử dụng định dạng sau: %{format}"
label_deactivate: "Tắt"
label_descending: "Giảm dần"
label_description: "Mô tả"
label_details: "Chi tiết"
label_display: "Hiển thị"
label_cancel_comment: "Hủy bình luận"
label_closed_work_packages: "đã đóng"
label_collapse: "Thu gọn"
label_collapsed: "đóng"
label_collapse_all: "Thu gọn tất cả"
label_comment: "Nhận xét"
label_committed_at: "%{committed_revision_link} lúc %{date}"
label_committed_link: "phiên bản commit %{revision_identifier}"
label_contains: "bao gồm"
label_created_on: "tạo ngày"
label_edit_comment: "Chỉnh sửa chú thích này"
label_edit_status: "Trạng thái chỉnh sửa của nhóm công việc"
label_equals: "is"
label_expand: "Mở rộng"
label_expanded: "đã mở rộng"
label_expand_all: "Mở rộng tất cả"
label_expand_project_menu: "Mở rộng menu dự án"
label_export: "Xuất"
label_filename: "Tệp"
label_filesize: "Kích cỡ"
label_general: "Tổng quan"
label_greater_or_equal: ">="
label_group: 'Nhóm'
label_group_by: "Nhóm theo"
label_group_plural: "Các Nhóm"
label_hide_attributes: "Hiện ít hơn"
label_hide_column: "Ẩn cột"
label_hide_project_menu: "Thu gọn menu dự án"
label_in: "trong"
label_in_less_than: "ít hơn"
label_in_more_than: "nhiều hơn"
label_incoming_emails: "Các thư đến"
label_information_plural: "Thông tin"
label_import: "Import"
label_latest_activity: "Hoạt động mới nhất"
label_last_updated_on: "Cập nhật lần cuối lúc"
label_less_or_equal: "<="
label_less_than_ago: "less than days ago"
label_loading: "Loading..."
label_mail_notification: "Thông báo qua email"
label_me: "me"
label_meeting_agenda: "Agenda"
label_meeting_minutes: "Minutes"
label_menu_collapse: "thu lại"
label_menu_expand: "mở rộng"
label_more_than_ago: "nhiều hơn mấy ngày trước"
label_next: "Tiếp"
label_no_color: "No color"
label_no_data: "Không có dữ liệu để hiển thị"
label_no_due_date: "không có ngày kết thúc"
label_no_start_date: "không có ngày bắt đầu"
label_no_value: "No value"
label_none: "không"
label_not_contains: "không chứa"
label_not_equals: "không là"
label_on: "lúc"
label_open_menu: "Mở trình đơn"
label_open_context_menu: "Mở menu ngữ cảnh"
label_open_work_packages: "mở"
label_password: "Mật khẩu"
label_previous: "Trước đó"
label_per_page: "Mỗi trang:"
label_please_wait: "Vui lòng chờ"
label_project_plural: "Các dự án"
label_visibility_settings: "Cài đặt hiển thị"
label_quote_comment: "Trích bình luận này"
label_recent: "Gần đây"
label_reset: "Reset"
label_remove_column: "Xóa cột"
label_remove_columns: "Loại bỏ cột được chọn"
label_remove_row: "Xóa hàng"
label_report: "Báo cáo"
label_repository_plural: "Repositories"
label_save_as: "Lưu thành"
label_select_watcher: "Chọn một người theo dõi..."
label_selected_filter_list: "Các bộ lọc đã chọn: %s"
label_show_attributes: "Hiển thị tất cả các thuộc tính"
label_show_in_menu: "Hiển thị chế độ xem trong menu"
label_sort_by: "Sort by"
label_sorted_by: "sắp xếp theo"
label_sort_higher: "Move up"
label_sort_lower: "Dịch xuống"
label_sorting: "Sắp xếp"
label_spent_time: "Thời gian"
label_star_query: "Ưa thích"
label_press_enter_to_save: "Nhấn enter để lưu."
label_public_query: "Công cộng"
label_sum: "Sum"
label_sum_for: "Tổng cho"
label_subject: "Chủ đề"
label_this_week: "tuần này"
label_today: "hôm nay"
label_time_entry_plural: "Thời gian"
label_up: "Lên"
label_user_plural: "Người dùng"
label_activity_show_only_comments: "Hiển thị các hoạt động với các bình luận"
label_activity_show_all: "Hiển thị các hoạt động"
label_total_progress: "%{percent}% Tổng tiến độ"
label_total_amount: "Tổng số tiền%{amount}"
label_updated_on: "cập Nhật ngày"
label_value_derived_from_children: "(value derived from children)"
label_warning: "Warning"
label_work_package: "Work Package"
label_work_package_plural: "Work Packages"
label_watch: "Theo dõi"
label_watch_work_package: "Xem gói công việc"
label_watcher_added_successfully: "Đã thêm nhận xét thành công."
label_watcher_deleted_successfully: "Watcher successfully deleted!"
label_work_package_details_you_are_here: "You're on the %{tab} tab for %{type} %{subject}."
label_unwatch: "Ngừng theo dõi"
label_unwatch_work_package: "Unwatch work package"
label_uploaded_by: "Uploaded by"
label_default_queries: "Giao diện Mặc định"
label_starred_queries: "Mục xem ưa thích"
label_global_queries: "Mục xem công khai"
label_custom_queries: "Mục xem riêng"
label_columns: "Cột"
label_attachments: Tập tin
label_drop_files: Thả các tập tin ở đây
label_drop_files_hint: hoặc nhấn vào đây để thêm tập tin
label_drop_folders_hint: You cannot upload folders as an attachment. Please select single files.
label_add_attachments: "Tệp đính kèm"
label_formattable_attachment_hint: "Đính kèm và liên kết tập tin bằng cách thả vào đây, hoặc copy và dán."
label_remove_file: "Xóa %{fileName}"
label_remove_watcher: "Loại bỏ người theo dõi %{name}"
label_remove_all_files: Xóa tất cả các tập tin
label_add_description: "Thêm mô tả cho %{file}"
label_upload_notification: "Tải lên tệp tin..."
label_work_package_upload_notification: "Tải file cho một công việc #%{id}: %{subject}"
label_wp_id_added_by: "#%{id} added by %{author}"
label_files_to_upload: "Những tập tin này sẽ được tải lên:"
label_rejected_files: "Các tệp này không thể được tải lên:"
label_rejected_files_reason: "Các tệp này không thể được tải lên như kích thước của họ là lớn hơn %{maximumFilesize}"
label_wait: "Xin vui lòng chờ cho cấu hình..."
label_upload_counter: "%{done} %{count} tập tin hoàn thành"
label_validation_error: "Không thể lưu các công việc do các lỗi sau đây:"
label_version_plural: "Các phiên bản"
label_view_has_changed: "This view has unsaved changes. Click to save them."
help_texts:
show_modal: 'Hiển thị văn bản trợ giúp'
onboarding:
buttons:
skip: 'Bỏ qua'
next: 'Tiếp'
got_it: 'Đã hiểu'
steps:
help_menu: 'In the <b>Help</b> menu you will find a user guide and additional help resources. <br> Enjoy your work with OpenProject!'
members: 'Invite new <b>Members</b> to join your project.'
project_selection: 'Please click on one of the projects with useful demo data to get started. <br> The <b>Demo project</b> suits best for classical project management, while the <b>Scrum project</b> is better for Agile project management.'
sidebar_arrow: "With the arrow you can navigate back to the project's <b>Main menu</b>."
welcome: 'Take a three minutes introduction tour to learn the most <b>important features</b>. <br> We recommend completing the steps until the end. You can restart the tour any time.'
wiki: 'Within the <b>Wiki</b> you can document and share knowledge together with your team.'
backlogs:
overview: "Manage your work in the <b>Backlogs</b> view. <br> On the right you have the Product Backlog or a Bug Backlog, on the left you will have the respective sprints. Here you can create <b>epics, user stories, and bugs</b>, prioritize via drag'n'drop and add them to a sprint."
task_board_arrow: 'To see your <b>Task board</b>, open the Sprint drop-down...'
task_board_select: '... and select the <b>Task board</b> entry.'
task_board: "The <b>Task board</b> visualizes the progress for this sprint. Add new tasks or impediments with the + icon next to a user story. Via drag'n'drop you can update the status."
boards:
overview: 'Manage your work within an intuitive <b>Boards</b> view.'
lists: 'You can create multiple lists (columns) within one Board view, e.g. to create a KANBAN board.'
add: 'Click the + will <b>add a new card</b> to the list within a Board.'
drag: 'Drag & Drop your cards within a list to re-order, or to another list. A double click will open the details view.'
wp:
toggler: "Now let's have a look at the <b>Work package</b> section, which gives you a more detailed view of your work."
list: 'This is the <b>Work package</b> list with the important work within your project, such as tasks, features, milestones, bugs, and more. <br> You can create or edit a work package directly within this list. To see its details you can double click on a row.'
full_view: 'Within the <b>Work package details</b> you find all relevant information, such as description, status and priority, activities, dependencies or comments.'
back_button: 'With the arrow you can navigate back 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> to create a timeline for your project.'
timeline: 'Here you can edit your project plan. Create new phases, milestones, and add dependencies. All team members can see and update the latest plan at any time.'
password_confirmation:
field_description: 'You need to enter your account password to confirm this change.'
title: 'Confirm your password to continue'
pagination:
no_other_page: "Bạn đang trên trang duy nhất."
pages:
next: "Chuyển đến trang tiếp theo"
previous: "Trở lại trang trước"
placeholders:
default: '-'
subject: 'Nhập tiêu đề ở đây'
selection: 'Vui lòng chọn'
relation_description: 'Click to add description for this relation'
project:
required_outside_context: >
Please choose a project to create the work package in to see all attributes. You can only select projects which have the type above activated.
context: 'Project context'
work_package_belongs_to: 'This work package belongs to project %{projectname}.'
click_to_switch_context: 'Open this work package in that project.'
autocompleter:
label: 'Project autocompletion'
text_are_you_sure: "Are you sure?"
types:
attribute_groups:
error_duplicate_group_name: "The name %{group} is used more than once. Group names must be unique."
error_no_table_configured: "Please configure a table for %{group}."
reset_title: "Reset form configuration"
confirm_reset: >
Chú ý: Bạn có chắc bạn muốn đặt lại cấu hình dạng? Điều này sẽ thiết lập lại các thuộc tính của nhóm mặc định và vô hiệu hóa tất cả các trường tùy chỉnh.
upgrade_to_ee: "Upgrade to Enterprise Edition"
upgrade_to_ee_text: "Wow! If you need this feature you are a super pro! Would you mind supporting us OpenSource developers by becoming an Enterprise Edition client?"
more_information: "More information"
nevermind: "Nevermind"
edit:
form_configuration: "Cấu hình biểu mẫu"
projects: "Các dự án"
settings: "Settings"
time_entry:
project: 'Dự án'
work_package: 'Work Package'
work_package_required: 'Yều cầu chọn một gói công việc đầu tiên.'
activity: 'Hoạt động'
comment: 'Nhận xét'
duration: 'Duration'
spent_on: 'Ngày'
hours: 'Giờ'
label: 'Thời gian nhập'
two_factor_authentication:
label_two_factor_authentication: 'Two-factor authentication'
watchers:
label_loading: lấy danh sách người theo dõi...
label_error_loading: Lỗi khi tải về danh sách người theo dõi
label_search_watchers: Tìm kiếm người theo dõi
label_add: Thêm người theo dõi
label_discard: Loại bỏ lựa chọn
typeahead_placeholder: Search for possible watchers
relation_labels:
parent: "Cha"
children: "Children"
relates: "Related To"
duplicates: "Duplicates"
duplicated: "Duplicated by"
blocks: "Blocks"
blocked: "Blocked by"
precedes: "Precedes"
follows: "Follows"
includes: "Includes"
partof: "Part of"
requires: "Requires"
required: "Required by"
relation_type: "relation type"
relations_hierarchy:
parent_headline: "Cha"
hierarchy_headline: "Hệ thống phân cấp"
children_headline: "Children"
relation_buttons:
set_parent: "Set parent"
change_parent: "Change parent"
remove_parent: "Remove parent"
hierarchy_indent: "Indent hierarchy"
hierarchy_outdent: "Outdent hierarchy"
group_by_wp_type: "Group by work package type"
group_by_relation_type: "Group by relation type"
add_parent: "Add existing parent"
add_new_child: "Create new child"
create_new: "Create new"
add_existing: "Add existing"
add_existing_child: "Add existing child"
remove_child: "Remove child"
add_new_relation: "Create new relation"
add_existing_relation: "Add existing relation"
update_description: "Set or update description of this relation"
toggle_description: "Toggle relation description"
update_relation: "Click to change the relation type"
add_follower: "Add follower"
add_predecessor: "Add predecessor"
remove: "Loại bỏ các mối quan hệ"
save: "Save relation"
abort: "Abort"
relations_autocomplete:
placeholder: "Type to search"
parent_placeholder: "Choose new parent or press escape to cancel."
repositories:
select_tag: 'Chọn từ khóa'
select_branch: 'Chọn nhánh'
field_value_enter_prompt: "Enter a value for '%{field}'"
select2:
input_too_short:
zero: "Vui lòng nhập thêm ký tự"
other: "Vui lòng nhập {{count}} thêm nhân vật"
load_more: "Loading more results ..."
no_matches: "Không tìm thấy"
searching: "Đang tìm ..."
selection_too_big:
zero: "Bạn không thể chọn bất cứ mục nào tại đây"
other: "Bạn có thể chỉ chọn {{limit}} mục"
project_menu_details: "Chi tiết"
sort:
sorted_asc: 'Ascending sort applied, '
sorted_dsc: 'Descending sort applied, '
sorted_no: 'No sort applied, '
sorting_disabled: 'sorting is disabled'
activate_asc: 'activate to apply an ascending sort'
activate_dsc: 'activate to apply a descending sort'
activate_no: 'activate to remove the sort'
text_work_packages_destroy_confirmation: "Are you sure you want to delete the selected work package(s)?"
text_query_destroy_confirmation: "Bạn muốn xóa các mục đã chọn?"
text_attachment_destroy_confirmation: "Bạn có chắc bạn muốn xóa tập tin đính kèm?"
timelines:
quarter_label: 'Q%{quarter_number}'
gantt_chart: 'Gantt chart'
labels:
title: 'Cấu hình nhãn'
bar: 'Bar labels'
left: 'Left'
right: 'Right'
farRight: 'Far right'
showNone: '-- No label --'
description: >
Select the attributes you want to be shown in the respective positions of the Gantt chart at all times. Note that when hovering an element, its date labels will be shown instead of these attributes.
button_activate: 'Xem biểu đồ sự kiện'
button_deactivate: 'Ân biểu đồ sự kiện'
cancel: Hủy
change: "Change in planning"
due_date: "Finish date"
empty: "(empty)"
error: "Lỗi đã xảy ra."
errors:
not_implemented: "The timeline could not be rendered because it uses a feature that is not yet implemented."
report_comparison: "The timeline could not render the configured comparisons. Please check the appropriate section in the configuration, resetting it can help solve this problem."
report_epicfail: "The timeline could not be loaded due to an unexpected error."
report_timeout: "The timeline could not be loaded in a reasonable amount of time."
filter:
grouping_other: "Khác"
noneSelection: "(none)"
name: "Tên"
outline: "Reset Outline"
outlines:
aggregation: "Show aggregations only"
level1: "Expand level 1"
level2: "Expand level 2"
level3: "Expand level 3"
level4: "Expand level 4"
level5: "Expand level 5"
all: "Show all"
project_status: "Tình trạng dự án"
really_close_dialog: "Do you really want to close the dialog and lose the entered data?"
responsible: "Chịu trách nhiệm"
save: Lưu
start_date: "Ngày bắt đầu"
tooManyProjects: "More than %{count} Projects. Please use a better filter!"
selection_mode:
notification: 'Click on any highlighted work package to create the relation. Press escape to cancel.'
zoom:
in: "Zoom in"
out: "Zoom out"
auto: "Auto zoom"
days: "Days"
weeks: "Weeks"
months: "Months"
quarters: "Quarters"
years: "Years"
slider: "Zoom slider"
description: >
Chọn mức phóng to ban đầu sẽ được hiển thị khi phóng tự động không có sẵn.
tl_toolbar:
zooms: "Zoom level"
outlines: "Hierarchy level"
upsale:
ee_only: 'Enterprise Edition only feature'
wiki_formatting:
strong: "Strong"
italic: "Italic"
underline: "Underline"
deleted: "Deleted"
code: "Inline Code"
heading1: "Heading 1"
heading2: "Heading 2"
heading3: "Heading 3"
unordered_list: "Unordered List"
ordered_list: "Ordered List"
quote: "Trích dẫn"
unquote: "Unquote"
preformatted_text: "Preformatted Text"
wiki_link: "Link to a Wiki page"
image: "Image"
work_packages:
bulk_actions:
move: 'Bulk change of project'
edit: 'Chỉnh sửa hàng loạt'
copy: 'Sao chép hàng loạt'
delete: 'Xoá hàng loạt'
button_clear: "Xóa"
comment_added: "Bình luận được thêm thành công."
comment_send_failed: "Lỗi đã xảy ra. Không thể gửi bình luận."
comment_updated: "Các bình luận đã được cập nhật thành công."
confirm_edit_cancel: "Bạn có chắc bạn muốn hủy bỏ chỉnh sửa work package?"
description_filter: "Bộ lọc"
description_enter_text: "Nhập văn bản"
description_options_hide: "Hide options"
description_options_show: "Show options"
edit_attribute: "%{attribute} - chỉnh sửa"
key_value: "%{key}: %{value}"
label_enable_multi_select: "Enable multiselect"
label_disable_multi_select: "Disable multiselect"
label_filter_add: "Thêm bộ lọc"
label_filter_by_text: "Lọc bởi %text"
label_options: "Tuỳ chọn"
label_column_multiselect: "Combined dropdown field: Select with arrow keys, confirm selection with enter, delete with backspace"
message_error_during_bulk_delete: An error occurred while trying to delete work packages.
message_successful_bulk_delete: Successfully deleted work packages.
message_successful_show_in_fullscreen: "Click vào đây để mở work package này trong chế độ xem toàn màn hình."
message_view_spent_time: "Show spent time for this work package"
message_work_package_read_only: "Work package is locked in this status. No attribute other than status can be altered."
message_work_package_status_blocked: "Work package status is not writable due to closed status and closed version being assigned."
placeholder_filter_by_text: "Chủ đề, mô tả, bình luận, ..."
inline_create:
title: 'Click vào đây để thêm một work package mới vào danh sách này'
create:
title: 'Work package mới'
header: 'New %{type}'
header_no_type: 'New work package (Type not yet set)'
header_with_parent: 'New %{type} (Child of %{parent_type} #%{id})'
button: 'Tạo mới'
copy:
title: 'Sao chép gói công việc'
hierarchy:
show: "Show hierarchy mode"
hide: "Hide hierarchy mode"
toggle_button: 'Click to toggle hierarchy mode.'
leaf: 'Work package leaf at level %{level}.'
children_collapsed: 'Hierarchy level %{level}, collapsed. Click to show the filtered children'
children_expanded: 'Hierarchy level %{level}, expanded. Click to collapse the filtered children'
faulty_query:
title: Work packages could not be loaded.
description: Trình bày của bạn là sai và không thể được xử lý.
no_results:
title: Không có gói công việc để hiển thị.
description: Không có gì được tạo ra hoặc tất cả các gói công việc đã được lọc.
limited_results: Only %{count} work packages can be shown in manual sorting mode. Please reduce the results by filtering.
property_groups:
details: "Chi tiết"
people: "Người"
estimatesAndTime: "Ước tính thời gian &"
other: "Khác"
properties:
assignee: "Người được giao"
author: "Tác giả"
createdAt: "Tạo ngày"
description: "Mô tả"
date: "Ngày"
dueDate: "Finish date"
estimatedTime: "Thời gian dự kiến"
spentTime: "Thời gian"
category: "Thể loại"
percentageDone: "Percentage done"
priority: "Độ ưu tiên"
projectName: "Dự án"
responsible: "Chịu trách nhiệm"
startDate: "Ngày bắt đầu"
status: "Trạng thái"
subject: "Chủ đề"
title: "Tiêu đề"
type: "Kiểu"
updatedAt: "Được cập nhật vào lúc"
versionName: "Phiên bản"
version: "Phiên bản"
default_queries:
latest_activity: "Hoạt động mới nhất"
created_by_me: "Do tôi tạo ra"
assigned_to_me: "Được phân công cho tôi"
recently_created: "Đã được tạo gần đây"
all_open: "Mở tất cả"
summary: "Tóm tắt"
jump_marks:
pagination: "Viet nam"
label_pagination: "Viet Nam"
content: "Jump to content"
label_content: "Click here to skip over the menu and go to the content"
placeholders:
default: "-"
formattable: "%{name}: Bấm vào để chỉnh sửa..."
query:
column_names: "Cột"
group_by: "Nhóm kết quả bởi"
group: "Nhóm theo"
group_by_disabled_by_hierarchy: "Group by is disabled due to the hierarchy mode being active."
hierarchy_disabled_by_group_by: "Hierarchy mode is disabled due to results being grouped by %{column}."
sort_ascending: "Sort ascending"
sort_descending: "Sort descending"
move_column_left: "Move column left"
move_column_right: "Move column right"
hide_column: "Ẩn cột"
insert_columns: "Insert columns ..."
filters: "Bộ lọc"
display_sums: "Hiển thị tổng"
confirm_edit_cancel: "Bạn có chắc bạn muốn hủy bỏ chỉnh sửa tên của trình bày này? Tiêu đề sẽ được đặt trở về giá trị trước đó."
click_to_edit_query_name: "Nhấp vào chỉnh sửa tiêu đề của trình bày này."
rename_query_placeholder: "Tên của trình bày"
star_text: "Mark this view as favorite and add to the saved views sidebar on the left."
public_text: >
Publish this view, allowing other users to access your view. Users with the 'Manage public views' permission can modify or remove public query. This does not affect the visibility of work package results in that view and depending on their permissions, users may see different results.
errors:
unretrievable_query: "Không thể đọc trình bày từ URL"
not_found: "Không có trình bày nào đã được tạo ra"
duplicate_query_title: "Tên trình bày đã có, Bạn có muốn thay đổi không?"
text_no_results: "Không chuyên mục nào được tìm thấy."
table:
configure_button: 'Cấu hình bảng gói công việc'
summary: "Bảng với hàng work package và cột của các thuộc tính work package."
text_inline_edit: "Hầu hết các ô của bảng này là các nút kích hoạt chức năng chỉnh sửa nội tuyến của thuộc tính đó."
text_sort_hint: "Với các liên kết trong các tiêu đề bảng bạn có thể sắp xếp, nhóm, sắp xếp lại, loại bỏ và thêm bảng cột."
text_select_hint: "Select boxes should be opened with 'ALT' and arrow keys."
table_configuration:
button: 'Cấu hình bảng gói công việc này'
choose_display_mode: 'Display work packages as'
modal_title: 'Bảng cấu hình gói công việc'
embedded_tab_disabled: "Trang cấu hình này không tồn tại đối với chế độ xem mà bạn đang soạn thảo."
default: "default"
display_settings: 'Cài đặt hiển thị'
default_mode: "Flat list"
hierarchy_mode: "Hệ thống phân cấp"
hierarchy_hint: "Tất cả các bảng được lọc sẽ được gắn với tiền bối của nó. Cây công việc có thể đươc mở ra hoặc thu lại."
display_sums_hint: "Hiển thị tổng của các cột số trong một hàng phía dưới bảng kết quả."
show_timeline_hint: "Hiển thị biểu đồ grantt ở bên phải của bảng. Bạn có thể thay đổi độ rộng của nó bằng cách kéo thanh chia giữa bảng và biểu đồ grantt."
highlighting: 'Tô sáng'
highlighting_mode:
description: "Highlight with color"
none: "No highlighting"
inline: 'Highlighted attribute(s)'
inline_all: 'All attributes'
entire_row_by: 'Entire row by'
status: 'Trạng thái'
priority: 'Độ ưu tiên'
type: 'Kiểu'
sorting_mode:
description: 'Chose the mode to sort your Work packages:'
automatic: 'Automatic'
manually: 'Manually'
warning: 'You will lose your previous sorting when activating the automatic sorting mode.'
columns_help_text: "Sử dụng ô nhập liệu trên đây để thêm hoặc bớt cột vào bảng của bạn. Bạn có thể kéo thả cột để thay đổi trật tự của nó."
upsale:
attribute_highlighting: 'Need certain work packages to stand out from the mass?'
relation_columns: 'Need to see relations in the work package list?'
check_out_link: 'Check out the Enterprise Edition.'
relation_filters:
filter_work_packages_by_relation_type: 'Lọc các gói công việc theo loại quan hệ'
tabs:
overview: ̉ng quan
activity: Hoạt động
relations: Relations
watchers: Watchers
attachments: Đính kèm
time_relative:
days: "ngày"
weeks: "weeks"
months: "months"
toolbar:
settings:
configure_view: "Định cấu hình chế độ xem..."
columns: "Columns ..."
sort_by: "Sort by ..."
group_by: "Group by ..."
display_sums: "Display sums"
display_hierarchy: "Display hierarchy"
hide_hierarchy: "Hide hierarchy"
hide_sums: "Hide sums"
save: "Lưu"
save_as: "Save as ..."
export: "Export ..."
visibility_settings: "Cài đặt hiển thị..."
page_settings: "Đổi tên chế độ hiển thị..."
delete: "Xoá"
filter: "Bộ lọc"
unselected_title: "Work Package"
search_query_label: "Tìm trang đã lưu"
search_query_title: "Nhấn vào đây để tìm kiếm trang đã lưu"
placeholder_query_title: "Thiết lập một tiêu đề cho trang này"
modals:
label_settings: "Đổi tên trang"
label_name: "Tên"
label_delete_page: "Delete current page"
button_apply: "Áp dụng"
button_save: "Lưu"
button_submit: "Gửi"
button_cancel: "Hủy"
form_submit:
title: 'Confirm to continue'
text: 'Are you sure you want to perform this action?'
destroy_work_package:
title: "Confirm deletion of %{label}"
text: "Are you sure you want to delete the following %{label} ?"
has_children: "The work package has %{childUnits}:"
confirm_deletion_children: "I acknowledge that ALL descendants of the listed work packages will be recursively removed."
deletes_children: "Các gói công việc con cũng sẽ bị xóa theo."
notice_no_results_to_display: "No visible results to display."
notice_successful_create: "Successful creation."
notice_successful_delete: "Successful deletion."
notice_successful_update: "Successful update."
notice_bad_request: "Bad Request."
relations:
empty: No relation exists
remove: Loại bỏ các mối quan hệ
inplace:
button_edit: "%{attribute}: Edit"
button_save: "%{attribute}: Save"
button_cancel: "%{attribute}: Cancel"
button_save_all: "Lưu"
button_cancel_all: "Hủy"
link_formatting_help: "Định dạng văn bản trợ giúp"
btn_preview_enable: "Xem trước"
btn_preview_disable: "Disable preview"
null_value_label: "No value"
clear_value_label: "-"
errors:
required: '%{field} cannot be empty'
number: '%{field} is not a valid number'
maxlength: '%{field} không thể chứa hơn %{maxLength} digit(s)'
minlength: '%{field} không thể chứa ít hơn %{minLength} digit(s)'
messages_on_field: 'Mục này không hợp lệ: %{messages}'
error_could_not_resolve_version_name: "Couldn't resolve version name"
error_could_not_resolve_user_name: "Couldn't resolve user name"
error_attachment_upload: "Tập tin tải lên thất bại.%{error}"
error_attachment_upload_permission: "Bạn không có quyền tải lên tập tin vào tài nguyên này."
units:
workPackage:
other: "work packages"
child_work_packages:
other: "%{count} tác phẩm gói phần mềm trẻ em"
hour:
zero: "0 h"
other: "%{count} h"
zen_mode:
button_activate: 'Activate zen mode'
button_deactivate: 'Deactivate zen mode'
global_search:
all_projects: "Cho tất cả các dự án"
search: "Search"
close_search: "Đóng tìm kiếm"
current_project: "Trong dự án này"
current_project_and_all_descendants: "Trong dự án này + các dự án con"
title:
all_projects: "mọi dự án"
project_and_subprojects: "và tất cả các dự án con"
search_for: "Tìm kiếm"
views:
card: 'Cards'
list: 'Table'
timeline: 'Biểu đồ sự kiện'

@ -61,6 +61,7 @@ ko:
header-item-font-hover-color: "마우스로 가리킬 때 클릭 가능한 헤더 항목의 글꼴색입니다."
header-border-bottom-color: "헤더 아래 가는 줄입니다. 줄을 원하지 않으면 이 필드를 비워 둡니다."
main-menu-bg-color: "왼쪽 메뉴의 배경색입니다."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Enterprise Edition으로 업그레이드 하세요."
add_token: "Enterprise Edition 지원 토큰을 업로드하세요."

@ -61,6 +61,7 @@ lt:
header-item-font-hover-color: "Šrifto spalva galimiems paspausti antraštės įrašams, kai užvedama pelė."
header-border-bottom-color: "Linija po antrašte. Palikite laukelį tuščią, jei nenorite jokios linijos."
main-menu-bg-color: "Kairiojo šoninio meniu fono spalva."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Patobulinti į „Enterprise Edition“ versiją"
add_token: "Įkelti „Enterprise Edition“ paramos raktą"

@ -61,6 +61,7 @@ nl:
header-item-font-hover-color: "De achtergrondkleur van klikbare header items wanneer deze aangewezen worden door de muis."
header-border-bottom-color: "Dunne lijn onder de kop. Laat dit veld leeg als u geen lijn wilt."
main-menu-bg-color: "De kleur van de achtergrond van de linkerzijde menu's."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Upgrade naar Enterprise Edition"
add_token: "Uploadeneen Enterprise Edition ondersteuningstoken"

@ -61,6 +61,7 @@
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
header-border-bottom-color: "Thin line under the header. Leave this field empty if you don't want any line."
main-menu-bg-color: "Left side menu's background color."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Oppgrader til bedriftsversjonen"
add_token: "Upload an Enterprise Edition support token"

@ -61,6 +61,7 @@ pl:
header-item-font-hover-color: "Kolor czcionki elementów nagłówkowych po najechaniu myszą."
header-border-bottom-color: "Linia pod nagłówkiem. Zostaw puste, jeśli nie chcesz wyświetlać linii."
main-menu-bg-color: "Kolor tła lewego menu."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Aktualizuj do wersji Enterprise"
add_token: "Wyślij swój token wsparcia edycji Enterprise"

@ -61,6 +61,7 @@ pt-BR:
header-item-font-hover-color: "Cor da fonte dos itens clicáveis do cabeçalho ao passar o mouse sobre eles."
header-border-bottom-color: "Linha fina sob o cabeçalho. Deixe este campo vazio se não quiser nenhuma linha."
main-menu-bg-color: "Cor de fundo do menu esquerdo."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Atualizar para a versão Enterprise Edition"
add_token: "Fazer upload de um token de suporte Enterprise Edition"

@ -61,6 +61,7 @@ pt:
header-item-font-hover-color: "Cor da fonte de itens do cabeçalho clicáveis quando se passa com o rato por cima."
header-border-bottom-color: "Linha fina sob o cabeçalho. Deixe este campo vazio se não deseja qualquer linha."
main-menu-bg-color: "Cor de fundo do menu do lado esquerdo."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Atualizar para a versão Enterprise"
add_token: "Carregar um token de suporte da versão Enterprise"

@ -61,6 +61,7 @@ ro:
header-item-font-hover-color: "Culoarea fontului pentru elementele selectabile din antet când cursorul se află deasupra lor."
header-border-bottom-color: "Linia de sub antet. Lăsați acest câmp gol dacă nu doriți această linie."
main-menu-bg-color: "Culoarea de fundal pentru meniul din partea stângă."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Achiziționați versiunea Enterprise"
add_token: "Upload an Enterprise Edition support token"

@ -61,6 +61,7 @@ ru:
header-item-font-hover-color: "Цвет шрифта в заголовках интерактивных элементов под курсором мыши."
header-border-bottom-color: "Тонкая линия под заголовком. Оставьте это поле пустым, если вы не хотите любой линии."
main-menu-bg-color: "Цвет фона меню слева."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Обновите до корпоративной версии"
add_token: "Загрузите маркер поддержки корпоративной версии"

@ -61,6 +61,7 @@ sk:
header-item-font-hover-color: "Farba písma kliknuteľnej hlavičky pri umiestnení kurzora nad hlavičku."
header-border-bottom-color: "Hrúbka čiary pod hlavičkou. Nechajte toto pole prázdne ak nechcete žiadnu čiaru."
main-menu-bg-color: "Farba pozadia ľavého menu."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Upgrade na Enterprise Edition"
add_token: "Nahrajte token podpory Enterprise Edition"

@ -61,6 +61,7 @@ sv:
header-item-font-hover-color: "Teckenfärg på klickbara objekt i sidhuvudet när man hovrar med muspekaren."
header-border-bottom-color: "Tunn linje under sidhuvudet. Lämna fältet tomt om du inte vill ha någon linje."
main-menu-bg-color: "Bakgrundsfärg på den vänstra sidomenyn."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Uppgradera till Enterprise Edition"
add_token: "Ladda upp en Enterprise Edition support-nyckel"

@ -61,6 +61,7 @@ tr:
header-item-font-hover-color: "Tıklanabilir başlık bileşenleri nin üzerine gelindiğinde kullanılacak yazı rengi."
header-border-bottom-color: "Başlığının altında ince bir çizgi. Bu alanda herhangi bir hat istemiyorsanız boş bırakın."
main-menu-bg-color: "Sol taraftaki menünün arka plan rengi."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Enterprise Edition sürümüne yükseltme"
add_token: "Enterprise Editon versiyonu destek anahtarını yükleyin"

@ -61,6 +61,7 @@ uk:
header-item-font-hover-color: "Колір шрифту в заголовках інтерактивних елементів під курсором миші."
header-border-bottom-color: "Тонка лінія під заголовком. Залиште це поле порожнім, якщо ви не хочете будь-якої лінії."
main-menu-bg-color: "Колір фону меню зліва."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Оновлення до Enterprise Edition"
add_token: "Завантажте маркер підтримки для Enterprise Edition"

File diff suppressed because it is too large Load Diff

@ -61,6 +61,7 @@ zh-CN:
header-item-font-hover-color: "鼠标悬停时可点击标题的特定颜色。"
header-border-bottom-color: "页眉下方法细线。如果你不想看到,将其留白。"
main-menu-bg-color: "左菜单的背景色。"
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "升级到企业版"
add_token: "上传企业版支持令牌"

@ -61,6 +61,7 @@ zh-TW:
header-item-font-hover-color: "當滑鼠移動到可點選的標題項目的文字顏色"
header-border-bottom-color: "標題下方的細線。如果你不想要任何線段,請保持此欄位空白。"
main-menu-bg-color: "左側選單的背景顏色"
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "升級到企業版"
add_token: "上傳企業版support token"

@ -70,6 +70,7 @@ en:
header-item-font-hover-color: "Font color of clickable header items when hovered with the mouse."
header-border-bottom-color: "Thin line under the header. Leave this field empty if you don't want any line."
main-menu-bg-color: "Left side menu's background color."
theme_warning: Changing the theme will overwrite you custom style. The design will then be lost. Are you sure you want to continue?
enterprise:
upgrade_to_ee: "Upgrade to Enterprise Edition"
add_token: "Upload an Enterprise Edition support token"

@ -31,3 +31,43 @@ The OpenProject Cloud Edition contains all OpenProject Community features plus t
For the Cloud Edition the OpenProject experts will take care of the installation as well as maintenance of your OpenProject installation, so you will be able to concentrate on your core business. We will perform regular backups of your Cloud Edition. You will have the latest OpenProject release installed. Hence, you do not have to take care of updates or installation of security patches yourself.
You will get a detailed feature comparison [here](https://www.openproject.org/pricing/#features).
## Frequently asked questions - FAQ
### **Can I import my** **OpenProject** **community instance into my cloud environment?**
Yes, we provide an upload possibility of your data to move from a Community installation to the Cloud Edition.To import your community instance into our cloud environment, please send us the following files:1. the database SQL dump of your local installation2. the attachments of your local installation For a package-based installation, you can create both as root user on your environment as follows openproject run backupThis creates the attachment and postgresql-dump or mysql-dump under /var/db/openproject/backup.If you are still running OpenProject under MySQL, your dump will be converted to PostgreSQL before importing, we will do this for you. More information about the backup tool can be found under this link: https://www.openproject.org/operations/backup/backup-guide-packaged-installation/Before uploading the attachments securely to us using the following form, please contact us via support@openproject.com:https://openproject.org/saas-importThe form generates a direct upload to our secure S3 environment from which the import takes place.
### Is there an advantage of the annual over the monthly** **OpenProject** **plan?**
We offer two months of the cloud edition for free if you choose an annual plan.
### Where geographically is the** **OpenProject** **cloud data stored?**
OpenProject cloud environment are hosted on a logically isolated virtual cloud at Amazon Web Services with all services being located in Ireland. AWS is a [GDPR compliant](https://aws.amazon.com/compliance/gdpr-center/) cloud infrastructure provider [with extensive security and compliance programs](https://aws.amazon.com/security/) as well as unparalleled access control mechanisms to ensure data privacy. Employed facilities are compliant with the ISO 27001 and 27018 standards. OpenProject cloud environment is continuously backing up user data with data at rest being fully encrypted with AES-256. Each individual instance is logically separated and data is persisted in a unique database schema, reducing the risk of intersection or data leaks between instances.[ https://www.openproject.org/gdpr-compliance/](https://www.openproject.org/gdpr-compliance/)
### Is there a size limit for uploading documents to the** **OpenProject** **cloud edition?**
There is no limit in OpenProject in terms of the number of files that you can upload and work with in OpenProject. There is only a restriction in terms of the maximum file size: A file can have a size up to 256 MB.
### My OpenProject cloud trial expired – can I still access my data?**
Due to data privacy reasons we automatically delete OpenProject trial environments a couple of weeks after they have expired.If your OpenProject Trial is not accessible through the known URL, it has likely been deleted.You can easily create a new OpenProject trial environment from https://start.openproject.com/. Simply enter your organization name (you can use the same name as before) and click on "Start Free Trial".In order to avoid that your data is getting deleted, please select a plan during your trial duration or shortly after your OpenProject trial environment has expired.
### Can we pay the** **OpenProject** **cloud edition by transfer?**
Yes, for customers in the EU it is possible to pay by bank transfer (as well as by credit card).To do this, you can sign into your OpenProject environment and select the "Buy now" button from the top menu. You are then directed to the payment page, where you can select the number of users you want to work with and your country. Then you can check the option to pay by invoice and fill out the billing information. You will then receive an invoice from us.

@ -107,7 +107,11 @@ This code of conduct is adapted from the [Contributor Covenant](http://contribut
## OpenProject Contributor License Agreement (CLA)
If you want to contribute to OpenProject, please make sure to accept our Contributor License Agreement first. The contributor license agreement documents the rights granted by contributors to OpenProject.
[Read and accept the Contributor License Agreement here.](http://openproject.org/contributor-license-agreement/)
# Additional resources
@ -119,3 +123,4 @@ This code of conduct is adapted from the [Contributor Covenant](http://contribut
* [Running Tests](running-tests)
* [API Documentation](/api/)
* [Report a Bug](report-a-bug)

@ -41,15 +41,15 @@ Every developer and reviewer should read the Rails Security Guide.
## Changelog
- All changes made to the OpenProject software are managed and documented via work packages in the [OpenProject project](https://community.openproject.org/projects/openproject/).
- The [Roadmap view](https://www.openproject.org/projects/openproject/roadmap) gives a corresponding overview.
- The [Roadmap view](https://community.openproject.com/projects/openproject/roadmap) gives a corresponding overview.
- To prevent inconsistencies and avoid redundant work there is no additional change log in the source code.
## Other
- For external contributions: Check whether the author has signed a Contributor License Agreement and kindly ask for it if not
- Copyright notice: When new files are added, make sure they contain the OpenProject copyright notice (copy from any file in OpenProject)
- Adding Gems: When adding gems, make sure not only the Gemfile is updated, but also the Gemfile.lock
- No trailing whitespace
- For external contributions: Check whether the author has signed a [Contributor License Agreement](../development/#openproject-contributor-license-agreement-cla) and kindly ask for it if not.
- Copyright notice: When new files are added, make sure they contain the OpenProject copyright notice (copy from any file in OpenProject).
- Adding Gems: When adding gems, make sure not only the Gemfile is updated, but also the Gemfile.lock.
- No trailing whitespace.
- [Single newline at the end of a file](http://stackoverflow.com/questions/729692/why-should-files-end-with-a-newline).
## Readability

@ -20,3 +20,23 @@ The Enterprise Edition builds on top of the free Community Edition. An upgrade i
<iframe width="560" height="315" src="https://www.youtube.com/embed/YRF_bavXBts" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
## Frequently asked questions - FAQ
### How can I upgrade to the OpenProject Enterprise Edition?**
The Enterprise Edition is an upgrade of the self-hosted Community Edition. When you are already using the Community Edition, you can purchase an Enterprise Edition license to upgrade your OpenProject environment to the Enterprise Edition. To do this, follow these steps:
1. Navigate to https://www.openproject.org/enterprise-edition/.
2. Click on the "Book now" button.
3. Follow the steps to purchase the Enterprise Edition license.You will then receive an Enterprise Edition license key by email which you can use to upgrade your Community Edition to the Enterprise Edition.If you prefer to test the Enterprise Edition before purchasing, you can request a 14 day trial license from https://www.openproject.org/enterprise-edition/. Simply click on "Get free trial license" to receive a 14 day trial license. After 14 days it will automatically downgraded to the community edition.
### Is it possible to buy and upgrade to enterprise version on a community edition already installed?**
Yes, you can upgrade your existing OpenProject Community Edition to the Enterprise Edition. You can then continue to use the same data as before but also use the premium features. When you purchase the Enterprise Edition, you receive an Enterprise Edition license. You can use this license to upgrade your Community Edition.

@ -43,3 +43,59 @@ Watch a short 3-minute introduction video to get started with OpenProject in 5 e
Watch a **comprehensive OpenProject product introduction** video to learn how to work with OpenProject using traditional and agile project management.
<iframe width="560" height="315" src="https://www.youtube.com/embed/ebc3lcSmncA" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
## Frequently asked questions - FAQ
### Is it possible that we can have a board over all OpenProject tasks and Users?
Yes, to achieve the desired result you can navigate to the main project and on the Kanban view add the filter "subproject" "all". This will display the work packages in the main project and all subprojects.
### **Are there extra fees to pay, in terms of installing the** **OpenProject** **software?****Is it possible to adapt or rename the status list?
Yes, this is absolutely possible. To do this, you would first have to create new statuses: https://docs.openproject.org/system-admin-guide/manage-work-packages/work-package-status/In the second step you can then assign them to workflows:[ https://docs.openproject.org/system-admin-guide/manage-work-packages/work-package-workflows/](https://docs.openproject.org/system-admin-guide/manage-work-packages/work-package-workflows/)
### How can I migrate MySQL to PostgreSQL in OpenProject?
We have prepared a guide for the migration of MySQL to PostgreSQL:https://docs.openproject.org/installation-and-operations/misc/packaged-postgresql-migration/If you are experiencing difficulties in following this guide, we could use a temporary remote SSH access to your servers to perform the migration for you, or you provide us with the dump of the MySQL database and will be returned a migrated PostgreSQL dump.
### How can I activate Boards in OpenProject?
**The boards module is a feature of the enterprise edition. You can upgrade your installation by entering a valid subscription token in the application administration. You can purchase the token on our website:-> [openproject.org/enterprise-edition](https://www.openproject.org/enterprise-edition)
Additionally you need to activate the boards module in the project settings.
### What is the best way to maintain an overview of multiple projects in** **OpenProject****? Is it possible to create a dashboard that shows all the projects you are responsible for at once?
You can click on "Select a project" on the upper left side and then choose "View all projects" to get an overview of all projects. You can also apply filters to filter e.g. by projects for which you are set as the responsible. If you want to see the individual work packages in the projects, you can click on the module icon (the icon with the 9 squares) in the upper right side and choose "Work packages" from the dropdown menu. This shows all work packages across all projects you have access to. You can then click on the "Project" column header and select "Group by" to group by project. Additionally, you can then filter based on the project and e.g. only display certain projects.
### How do I prepare a budget in** **OpenProject****?
**Budgets are currently limited to a single project. They cannot be shared across multiple projects.This means that you would have to set up a separate budget for the different main and sub projects.You can however use cost reports to analyze the time (and cost) spent across multiple projects. For details, you can take a look at our user guide: https://www.openproject.org/help/time-costs/time-costs-reports-cost-report-plugin/.
### Is it possible to create a PDF export for the overview of the work packages with Gantt chart?
The export is available via the browser print function (ideally Google Chrome).
### We like for each Department to have their own custom "Status" with different values options in OpenProject. How do we do this?**
The status which can be selected by users (based on the workflow) is always determined based on the work package type and the role of the user. In order to use the same work package type (e.g. Task) but display different status for each department, you would need to create a separate role for each department. You can then add the members of a department (ideally using a group) and assign them with the correct role.https://docs.openproject.org/system-admin-guide/manage-work-packages/work-package-workflows/#edit-workflowsTo work with different status, first create those status in “Administration” > “Work packages” > “Status”.
Next, go to “Administration” > “Work packages” > “Workflow” and select the combination of Type and Role for which you would like to set the allowed workflow transition.You can e.g. create a role “Marketing – Member” and select it as well as the type (e.g. “Task”). Make sure to uncheck the option “Only display statuses that are used by this type” and click on “Edit”. Now, you can select the correct status transitions.Repeat this step for the other (department) roles (e.g. “IT – Member”) and select the desired status transitions. This way, you can set different status for each department (only the default status is shared (i.e. “New” by default)). Please keep in mind that it may not be possible for a member of a different department to update the status of a work package if it has been updated before by another department (since the workflow may not support this status transition).

@ -46,3 +46,30 @@ Now this Let's Encryt certificate is only valid for 90 days. To renew it automat
0 1 * * * certbot-auto renew --quiet --post-hook "service apache2 restart"
This will execute `certbot renew` every day at 1am. The command checks if the certificate is expired and renews it if that is the case. The web server is restarted in a post hook in order for it to pick up the new certificate.
<div class="alert alert-warning" role="alert">
## External SSL termination
If you terminate SSL externally before the request hits the OpenProject server, you need to let the OpenProject server know that the request being handled is https, even though SSL was terminated before. This is the most common source in problems in OpenProject when using an external server that terminates SSL.
Please ensure that if you're proxying to the openproject server, you set the HOST header to the internal server. This ensures that the host name of the outer request gets forwarded to the internal server. Otherwise you might see redirects in your browser to the internal host that OpenProject is running on.
On your outer proxying server, set these commands:
- In Apache2, set the `ProxyPreserveHost On`directive
- In NginX, use the following value: `proxy_set_header X-Forwarded-Host $host:$server_port;`
If you're terminating SSL on the outer server, you need to set the `X-Forwarded-Proto https`header to let OpenProject know that the request is HTTPS, even though its been terminated earlier in the request on the outer server.
- In Apache2, use `RequestHeader set "X-Forwarded-Proto" https`
- In Nginx, use `proxy_set_header X-Forwarded-Proto https;`
Finally, to let OpenProject know that it should create links with 'https' when no request is available (for example, when sending emails), you need to set the Protocol setting of OpenProject to `https`. You will find this setting on your system settings or via the rails console with `Setting.protocol = 'https'`

@ -303,7 +303,29 @@ In that case, you will be shown three additional dialogs to enter the certificat
![02d-ssl](https://github.com/opf/openproject/raw/dev/docs/installation-and-operations/installation/packaged/02d-ssl.png)
### **Skip** (not recommended)
**External SSL/TLS termination**
<div class="alert alert-warning" role="alert">
If you terminate SSL externally before the request hits the OpenProject server, you need to follow the following instructions to avoid errors in routing. If you want to use SSL on the server running OpenProject, skip this section.
</div>
If you have a separate server that is terminating SSL and only forwarding/proxying to the OpenProject server, you must select "No" in this dialog. However, there are some parameters you need to put into your outer configuration.
- If you're proxying to the openproject server, you need to forward the HOST header to the internal server. This ensures that the host name of the outer request gets forwarded to the internal server. Otherwise you might see redirects in your browser to the internal host that OpenProject is running on.
- In Apache2, set the `ProxyPreserveHost On`directive
- In NginX, use the following value: `proxy_set_header X-Forwarded-Host $host:$server_port;`
- If you're terminating SSL on the outer server, you need to set the `X-Forwarded-Proto https`header to let OpenProject know that the request is HTTPS, even though its been terminated earlier in the request on the outer server.
- In Apache2, use `RequestHeader set "X-Forwarded-Proto" https`
- In Nginx, use `proxy_set_header X-Forwarded-Proto https;`
- Finally, to let OpenProject know that it should create links with 'https' when no request is available (for example, when sending emails), you need to set the following setting: `openproject config:set SERVER_PROTOCOL_FORCE_HTTPS="true"` followed by an `openproject configure`. This ensures that OpenProject responds correctly with secure cookies even though it was not configured for https in the server configuration.
### Skip (not recommended)
The installer will not set up an external web server for accessing. You will need to either install and set up a web server such as Apache2 or Nginx to function as the web server forwarding to our internal server listeing at `localhost:6000` by proxying.

@ -0,0 +1,82 @@
---
sidebar_navigation:
title: SAML single sign-on
priority: 800
description: How to set up SAML integration for SSO with OpenProject.
robots: index, follow
keywords: SAML, SSO, single sign-on, authentication
---
# SAML
<div class="alert alert-info" role="alert">
**Note**: This documentation is valid for the OpenProject Enterprise Edition only.
</div>
You can integrate your active directory or other SAML compliant identity provider in your OpenProject Enterprise Edition.
We rely on the OmniAuth SAML plugin for this integration. You will find more technical details about the configuration options used below [on their GitHub page](https://github.com/omniauth/omniauth-saml).
### Step 1: Creating the configuration file
In your OpenProject packaged installation, you need to add the `/opt/openproject/config/plugins/auth_saml.settings.yml` file. This will contain metadata settings and connection details for your SSO identity provider.
The following example can be used as a starting point to set up your integration:
```yaml
saml:
name: "saml"
display_name: "My SSO"
# Use the default SAML icon
icon: "auth_provider-saml.png"
# omniauth-saml config
assertion_consumer_service_url: "https:/<YOUR OPENPROJECT HOSTNAME>/auth/saml/callback"
issuer: "https://<YOUR OPENPROJECT HOSTNAME>"
# IF your SSL certificate on your SSO is not trusted on this machine, you need to add it here
#idp_cert: "-----BEGIN CERTIFICATE-----\n ..... SSL CERTIFICATE HERE ...-----END CERTIFICATE-----\n"
# Otherwise, the certificate fingerprint must be added
# Either `idp_cert` or `idp_cert_fingerprint` must be present!
idp_cert_fingerprint: "E7:91:B2:E1:...",
# Replace with your single sign on URL
# For example: "https://sso.example.com/saml/singleSignOn"
idp_sso_target_url: "<YOUR SSO URL>"
# Replace with your single sign out URL
# or comment out
# For example: "https://sso.example.com/saml/proxySingleLogout"
idp_slo_target_url: "<YOUR SSO logout URL>"
# Attribute map in SAML
attribute_statements:
# What attribute in SAML maps to email (default: mail)
email: ['mail']
# What attribute in SAML maps to the user login (default: uid)
login: ['uid']
# What attribute in SAML maps to the first name (default: givenName)
first_name: ['givenName']
# What attribute in SAML maps to the last name (default: sn)
last_name: ['sn']
```
Fill out the file and restart your OpenProject server with `service openproject restart`. From there, you will see a "My SSO" login button when logging in. Clicking it will redirect to your SSO provider and return with your attribute data to set up the account, or to log in.
![my-sso](my-sso.png)
## Troubleshooting
Q: After clicking on a provider badge, I am redirected to a signup form that says a user already exists with that login.
A: This can happen if you previously created user accounts in OpenProject with the same email than what is stored in the OpenID provider. In this case, if you want to allow existing users to be automatically remapped to the OpenID provider, you should do the following:
```
sudo openproject run console
> Setting.oauth_allow_remapping_of_existing_users = true
> exit
```
Then, existing users should be able to log in using their Azure identity. Note that this works only if the user is using password-based authentication, and is not linked to any other authentication source (e.g. LDAP) or OpenID provider.

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

@ -53,3 +53,101 @@ Please choose the module you want to learn more about.
| [Documents](documents) | How to upload and share documents in OpenProject? |
| [Meetings](meetings) | How to manage meetings to create and share meeting agenda and meeting minutes? |
| [Manage projects](projects) | Edit, create, copy, delete projects and change project settings. |
## Frequently asked questions - FAQ
### How can I increase the number of users in OpenProject?
Please note that the minimum number of users is 5. You can then increase the number of users in steps of 5. Just write an email to [sales@openproject.com](mailto:sales@openproject.com)
### Is it possible to change the number of users in OpenProject?
You can always increase the number of users. The number of users can be increased in steps of 5 (e.g. you could start with 5 users and then increase the number of users to 10 users). You can purchase the Enterprise Edition from https://www.openproject.org/enterprise-edition/. Simply click on the button "Book now" and follow the steps. A reduction in the number of users would take effect after the current service period.
### **What are the OpenProject system requirements?**
OpenProject can be installed in two different ways: the packaged installation of OpenProject is the recommended way to install and maintain OpenProject using DEB or RPM packages. System requirements need one of the following Linux distributions: [Ubuntu 18.04 Bionic Beaver](https://docs.openproject.org/installation-and-operations/installation/packaged/#ubuntu-1804)[Ubuntu 16.04 Xenial Xerus](https://docs.openproject.org/installation-and-operations/installation/packaged/#ubuntu-1604)[Debian 10 Buster](https://docs.openproject.org/installation-and-operations/installation/packaged/#debian-10)[Debian 9 Stretch](https://docs.openproject.org/installation-and-operations/installation/packaged/#debian-9)[CentOS/RHEL 8.x](https://docs.openproject.org/installation-and-operations/installation/packaged/#el-8)[CentOS/RHEL 7.x](https://docs.openproject.org/installation-and-operations/installation/packaged/#el-7)[Suse Linux Enterprise Server 12](https://docs.openproject.org/installation-and-operations/installation/packaged/#sles-12)OpenProject also provides a Docker image for the Community Edition that you can very easily install and upgrade on your servers. The detailed system requirements are available here: https://www.openproject.org/system-requirements/.
### **Can I run OpenProject on Windows?**
At the moment this is not possible This article explains in detail the system requirements: https://docs.openproject.org/installation-and-operations/system-requirements/
### **Can I run OpenProject as a single user?
Our minimum plan is five users. Our pricing scheme covers three subscription options: Community ($0), Cloud (€4.95/member/month or approximately $5.60/member/month), and Enterprise (€5.95/member/month or approximately $6.73/member/month). We recommend to start with the community version free of charge if the 5 user minimum is an issue.https://www.openproject.org/download-and-installation/
### Do you have a reseller program for OpenProject?
We provide a reseller program exclusively for the OpenProject Enterprise Edition (currently not cloud) and offer a 25% discount on the regular prices as a part of this. Once you purchased the first Enterprise Edition license for a client, you receive an Enterprise Edition license for 25 users free of charge (for internal use).https://www.openproject.org/reseller-program/Please let us know once you have a particular customer request that we can send you a quote for.
### When does my OpenProject contract end?
The user may terminate the contract at any time, which will apply by the end of the subscription period (including last day). In case of credit card payment the subscription period is one month or one year; in case of payment via invoice the subscription period is one year. The agreed subscription period will be extended automatically if the contract was not terminated on time. (https://www.openproject.org/terms-of-service/)
### What shall I do when I run into payment issues with OpenProject?
In case you use the bank transfer payment method please indicate the invoice number. You can find this information in the corresponding invoice (OP…). Otherwise the automatic banking system can not detect your payment. Please do not hesitate to contact accounting@openproject.com if you have any further questions.
### Does OpenProject provide resource management?
Please note that OpenProject currently does not yet support resource management. However, this is scheduled as our main topic for 2020. You can check out our roadmap here: https://community.openproject.com/projects/openproject/work_packages?query_id=1993
### Is it possible to use multiple languages in OpenProject?
**Yes, it is possible to use OpenProject in multiple languages. We support English, German, French and a number of additional languages. Each user can select their own preferred language by signing into OpenProject, clicking on the user avatar on the upper right side and selecting "My account" from the dropdown menu.You can then select "Settings" from the side menu on the left side and change the language.[ https://docs.openproject.org/getting-started/my-account/#change-your-language](https://docs.openproject.org/getting-started/my-account/#change-your-language) Is there an OpenProject app?There is no native app for OpenProject, but OpenProject is responsive - so it is displayed well on smaller displays.**
### Do you have a step-by-step guide to installing OpenProject Enterprise under Active Directory?
We have a guide on how to use OpenProject with your Active Directory: https://www.openproject.org/help/administration/manage-ldap-authentication/.In addition, with the Enterprise Edition it is also possible to link LDAP groups with groups in OpenProject: https://www.openproject.org/help/administration/manage-ldap-authentication/synchronize-ldap-groups/.
### Is OpenProject free of charge?
We offer three different versions of OpenProject. The (on-premise) OpenProject Community Edition is completely free. You can create a trial environment for the OpenProject Cloud Edition (which offers a 14 day trial). You can get an overview of the different OpenProject editions here:[ https://www.openproject.org/pricing/](https://www.openproject.org/pricing/). If you prefer to use the free OpenProject Community Edition, you can follow these installation instructions (note that you need a Linux server to install the Community Edition): https://www.openproject.org/download-and-installation/. It is always possible to upgrade to the cloud and enterprise edition – check out the premium features here: https://www.openproject.org/enterprise-edition/
### How do I get access to the OpenProject premium features?
We offer the premium functions of OpenProject (incl. boards) for two different OpenProject variants:- For the OpenProject Cloud Edition (hosted by us),- For the self-hosted (on-premise) OpenProject Enterprise EditionIf you want to run OpenProject on your own server the OpenProject Enterprise Edition is the right option.Have you already installed the OpenProject Community Edition (https://www.openproject.org/download-and-installation/ )? If yes, you can request a trial license for the OpenProject Enterprise Edition (via https://www.openproject.org/de/enterprise-edition/ by clicking on the button "Free trial license") and test the Enterprise Edition for 14 days.
### Do you have OpenProject guest accounts?
Currently, all users working in the OpenProject Enterprise Edition need a license in order to access OpenProject. Regarding payments we only count the active (not blocked) users.
### Can I import MS Project files into** **OpenProject****?
You can indirectly import MS Project files into OpenProject using MS Excel. We offer a free Excel synchronization template which you can use to import data from Excel into OpenProject. Further instructions can be found here: https://www.openproject.org/de/synchronize-excel-openproject/.
### How can we download** **the documentation loaded on OpenProject?**
Currently, there is unfortunately no option to export all the documents in OpenProject. We could manually export the entire database (including the attachments) for you. Due to the manual effort, we would however need to charge a service fee for this. Please contact [sales@openproject.com](mailto:sales@openproject.com)

@ -11,7 +11,7 @@ keywords: wiki
In a project wiki you can collaboratively create and document information with your team, such as project documentation, specifications, guidelines, or any other important project information.
<div class="glossary">**Wiki** is defined as a module that allows to use textile-based wiki pages. In order to use the wiki module, it has to be activated in the project settings. </div>
<div class="glossary">**Wiki** is defined as a module that allows to use textile-based wiki pages. In order to use the wiki module, it has to be activated in the project settings.
| Feature | Documentation for |
| ------------------------------------------------------------ | ------------------------------------------------------------ |

@ -51,14 +51,15 @@ export class ApiV3FilterBuilder {
return JSON.stringify(this.filters);
}
public toParams():string {
public toParams(mergeParams:{[key:string]:string} = {}):string {
let transformedFilters:string[] = [];
transformedFilters = this.filters.map((filter:ApiV3Filter) => {
return this.serializeFilter(filter);
});
return `filters=${encodeURI(`[${transformedFilters.join(',')}]`)}`;
let params = { filters: `[${transformedFilters.join(",")}]`, ...mergeParams }
return new URLSearchParams(params).toString();
}
private serializeFilter(filter:ApiV3Filter) {

@ -44,7 +44,6 @@ export class WorkPackageFilterContainerComponent implements OnInit, OnDestroy {
@Input('showFilterButton') showFilterButton:boolean = false;
@Input('filterButtonText') filterButtonText:string = I18n.t('js.button_filter');
@Output() public filtersChanged = new DebouncedEventEmitter<QueryFilterInstanceResource[]>(componentDestroyed(this));
@Output() public filtersCompleted = new DebouncedEventEmitter<boolean>(componentDestroyed(this));
public visible$:Observable<Boolean>;
public filters = this.wpTableFilters.current;
@ -74,8 +73,7 @@ export class WorkPackageFilterContainerComponent implements OnInit, OnDestroy {
}
public replaceIfComplete(filters:QueryFilterInstanceResource[]) {
let complete = this.wpTableFilters.replaceIfComplete(filters);
this.filtersCompleted.emit(complete);
this.wpTableFilters.replaceIfComplete(filters);
this.filtersChanged.emit(this.filters);
}
}

@ -143,7 +143,7 @@ export class WpDestroyModal extends OpModalComponent implements OnInit {
* Otherwise we expect a redirect to where we came from,
* since the WP in view (split/full) does not exist any more.
*/
if (this.$state.current.name !== 'work-packages.list') {
if (this.$state.current.name !== 'work-packages.partitioned.list') {
this.backRoutingService.goBack(true);
}
})

@ -109,7 +109,7 @@ export class WorkPackageViewContextMenu extends OpContextMenuHandler {
copiedFromWorkPackageId: selected[0].id
};
this.$state.go('work-packages.list.copy', params);
this.$state.go('work-packages.partitioned.list.copy', params);
}
private getSelectedWorkPackages() {
@ -171,7 +171,7 @@ export class WorkPackageViewContextMenu extends OpContextMenuHandler {
disabled: false,
icon: 'icon-view-split',
class: 'detailsViewMenuItem',
href: this.$state.href('work-packages.list.details.overview', {workPackageId: this.workPackageId}),
href: this.$state.href('work-packages.partitioned.list.details.overview', {workPackageId: this.workPackageId}),
linkText: I18n.t('js.button_open_details'),
onClick: ($event:JQuery.TriggeredEvent) => {
if (LinkHandling.isClickedWithModifier($event)) {
@ -179,7 +179,7 @@ export class WorkPackageViewContextMenu extends OpContextMenuHandler {
}
this.$state.go(
'work-packages.list.details.overview',
'work-packages.partitioned.list.details.overview',
{workPackageId: this.workPackageId}
);
return true;

@ -42,6 +42,7 @@ export class WpResizerDirective implements OnInit, OnDestroy {
@Input() elementClass:string;
@Input() resizeEvent:string;
@Input() localStorageKey:string;
@Input() resizeStyle:'flexBasis'|'width' = 'flexBasis';
private resizingElement:HTMLElement;
private elementFlex:number;
@ -62,16 +63,18 @@ export class WpResizerDirective implements OnInit, OnDestroy {
this.resizingElement = <HTMLElement>document.getElementsByClassName(this.elementClass)[0];
// Get initial width from local storage and apply
let localStorageValue = window.OpenProject.guardedLocalStorage(this.localStorageKey);
this.elementFlex = localStorageValue ? parseInt(localStorageValue,
10) : this.resizingElement.offsetWidth;
let localStorageValue = this.parseLocalStorageValue();
this.elementFlex = localStorageValue || this.resizingElement.offsetWidth;
// ToDo:
// Rename variables to width
// This case only happens when the timeline is loaded but not displayed.
// Therefor the flexbasis will be set to 50%, just in px
if (this.elementFlex === 0 && this.resizingElement.parentElement) {
this.elementFlex = this.resizingElement.parentElement.offsetWidth / 2;
}
this.resizingElement.style.flexBasis = this.elementFlex + 'px';
this.resizingElement.style[this.resizeStyle] = this.elementFlex + 'px';
// Wait until dom content is loaded and initialize column layout
// Otherwise function will be executed with empty list
@ -99,7 +102,7 @@ export class WpResizerDirective implements OnInit, OnDestroy {
ngOnDestroy() {
// Reset the style when killing this directive, otherwise the style remains
this.resizingElement.style.flexBasis = null;
this.resizingElement.style[this.resizeStyle] = '';
}
@HostListener('mousedown', ['$event'])
@ -132,9 +135,9 @@ export class WpResizerDirective implements OnInit, OnDestroy {
@HostListener('window:touchend', ['$event'])
private handleTouchEnd(e:MouseEvent) {
window.removeEventListener('touchmove', this.mouseMoveHandler);
let localStorageValue = window.OpenProject.guardedLocalStorage(this.localStorageKey);
let localStorageValue = this.parseLocalStorageValue();
if (localStorageValue) {
this.elementFlex = parseInt(localStorageValue, 10);
this.elementFlex = localStorageValue;
}
}
@ -153,9 +156,9 @@ export class WpResizerDirective implements OnInit, OnDestroy {
// Take care at the end that the elementFlex-Value is the same as the actual value
// When the mouseup is outside the container these values will differ
// which will cause problems at the next movement start
let localStorageValue = window.OpenProject.guardedLocalStorage(this.localStorageKey);
let localStorageValue = this.parseLocalStorageValue();
if (localStorageValue) {
this.elementFlex = parseInt(localStorageValue, 10);
this.elementFlex = localStorageValue;
}
this.moving = false;
@ -167,6 +170,17 @@ export class WpResizerDirective implements OnInit, OnDestroy {
return false;
}
private parseLocalStorageValue():number|undefined {
let localStorageValue = window.OpenProject.guardedLocalStorage(this.localStorageKey);
let number = parseInt(localStorageValue || '', 10);
if (typeof number === 'number' && number !== NaN) {
return number;
}
return undefined;
}
private resizeElement(element:HTMLElement, e:MouseEvent) {
e.preventDefault();
e.stopPropagation();
@ -187,7 +201,7 @@ export class WpResizerDirective implements OnInit, OnDestroy {
this.applyColumnLayout(element, newValue);
// Set new width
element.style.flexBasis = newValue + 'px';
element.style[this.resizeStyle] = newValue + 'px';
}
private applyColumnLayout(element:HTMLElement, newWidth:number) {

@ -50,7 +50,7 @@ export class WorkPackageAuthorization {
public copyLink() {
const stateName = this.$state.current.name as string;
if (stateName.indexOf('work-packages.list.details') === 0) {
if (stateName.indexOf('work-packages.partitioned.list.details') === 0) {
return this.PathHelper.workPackageDetailsCopyPath(this.project.identifier, this.workPackage.id!);
} else {
return this.PathHelper.workPackageCopyPath(this.workPackage.id!);

@ -71,7 +71,7 @@ export class WorkPackageService {
if (this.$state.includes('**.list.details.**')
&& ids.indexOf(this.$state.params.workPackageId) > -1) {
this.$state.go('work-packages.list', this.$state.params);
this.$state.go('work-packages.partitioned.list', this.$state.params);
}
})
.catch(() => {

@ -27,22 +27,26 @@
// ++
import {StateService} from '@uirouter/core';
import {ChangeDetectionStrategy, Component, Input, OnInit} from '@angular/core';
import {ChangeDetectionStrategy, Component, Input, OnDestroy, OnInit} from '@angular/core';
import {I18nService} from "core-app/modules/common/i18n/i18n.service";
import {CurrentProjectService} from "core-components/projects/current-project.service";
import {AuthorisationService} from "core-app/modules/common/model-auth/model-auth.service";
import {componentDestroyed} from "ng2-rx-componentdestroyed";
@Component({
selector: 'wp-create-button',
changeDetection: ChangeDetectionStrategy.OnPush,
templateUrl: './wp-create-button.html'
})
export class WorkPackageCreateButtonComponent implements OnInit {
export class WorkPackageCreateButtonComponent implements OnInit, OnDestroy {
@Input('allowed') allowedWhen:string[];
@Input('stateName') stateName:string;
@Input('allowed') allowed:boolean;
public projectIdentifier:string|null;
public types:any;
public text = {
allowed:boolean;
projectIdentifier:string|null;
types:any;
text = {
createWithDropdown: this.I18n.t('js.work_packages.create.button'),
createButton: this.I18n.t('js.label_work_package'),
explanation: this.I18n.t('js.label_create_work_package')
@ -50,19 +54,36 @@ export class WorkPackageCreateButtonComponent implements OnInit {
constructor(readonly $state:StateService,
readonly currentProject:CurrentProjectService,
readonly authorisationService:AuthorisationService,
readonly I18n:I18nService) {
}
public ngOnInit() {
ngOnInit() {
this.projectIdentifier = this.currentProject.identifier;
// Created for interface compliance
// Find the first permission that is allowed
this.authorisationService
.observeUntil(componentDestroyed(this))
.subscribe(() => {
this.allowed = !!this
.allowedWhen
.find(combined => {
let [module, permission] = combined.split('.');
return this.authorisationService.can(module, permission);
});
});
}
ngOnDestroy():void {
// Nothing to do
}
public createWorkPackage() {
createWorkPackage() {
this.$state.go(this.stateName, {projectPath: this.projectIdentifier});
}
public isDisabled() {
isDisabled() {
return !this.allowed || this.$state.includes('**.new');
}
}

@ -42,8 +42,8 @@ import {I18nService} from "core-app/modules/common/i18n/i18n.service";
export class WorkPackageDetailsViewButtonComponent extends AbstractWorkPackageButtonComponent implements OnDestroy {
public projectIdentifier:string;
public accessKey:number = 8;
public activeState:string = 'work-packages.list.details';
public listState:string = 'work-packages.list';
public activeState:string = 'work-packages.partitioned.list.details';
public listState:string = 'work-packages.partitioned.list';
public buttonId:string = 'work-packages-details-view-button';
public buttonClass:string = 'toolbar-icon';
public iconClass:string = 'icon-info2';

@ -0,0 +1,7 @@
<button id="work-packages-settings-button"
title="{{ text.button_settings }}"
class="button last work-packages-settings-button toolbar-icon"
opSettingsContextMenu
opSettingsContextMenu-query="query">
<op-icon icon-classes="button--icon icon-show-more"></op-icon>
</button>

@ -0,0 +1,43 @@
// -- copyright
// OpenProject is an open source project management software.
// Copyright (C) 2012-2020 the OpenProject GmbH
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License version 3.
//
// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
// Copyright (C) 2006-2013 Jean-Philippe Lang
// Copyright (C) 2010-2013 the ChiliProject Team
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
// See docs/COPYRIGHT.rdoc for more details.
// ++
import {ChangeDetectionStrategy, Component} from '@angular/core';
import {I18nService} from "core-app/modules/common/i18n/i18n.service";
@Component({
templateUrl: './wp-settings-button.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class WorkPackageSettingsButtonComponent {
public text = {
'button_settings': this.I18n.t('js.button_settings')
};
constructor(readonly I18n:I18nService) {
}
}

@ -44,12 +44,35 @@ export class CardClickHandler implements CardEventHandler {
// Locate the card from event
let element = target.closest('wp-single-card');
let wpId = element.data('workPackageId');
let classIdentifier = element.data('classIdentifier');
if (!wpId) {
return true;
}
this.handleWorkPackage(wpId, element, evt);
return false;
}
protected handleWorkPackage(wpId:any, element:JQuery, evt:JQuery.TriggeredEvent) {
this.setSelection(wpId, element, evt);
// open work package on mobile after first click
this.openFullViewOnMobile(wpId);
}
protected openFullViewOnMobile(wpId:string) {
if (this.deviceService.isMobile) {
this.$state.go(
'work-packages.show',
{workPackageId: wpId}
);
}
}
protected setSelection(wpId:string, element:JQuery, evt:JQuery.TriggeredEvent) {
let classIdentifier = element.data('classIdentifier');
let index = this.wpCardView.findRenderedCard(classIdentifier);
// Update single selection if no modifier present
@ -71,15 +94,6 @@ export class CardClickHandler implements CardEventHandler {
// not matter what other card are (de-)selected below.
// Thus save that card for the details view button.
this.wpTableFocus.updateFocus(wpId);
// open work package on mobile after first click
if (this.deviceService.isMobile) {
this.$state.go(
'work-packages.show',
{workPackageId: wpId}
);
}
return false;
}
}

@ -41,11 +41,16 @@ export class CardDblClickHandler implements CardEventHandler {
return true;
}
this.handleWorkPackage(wpId);
return false;
}
protected handleWorkPackage(wpId:string) {
this.$state.go(
'work-packages.show',
{workPackageId: wpId}
);
return false;
}
}

@ -4,10 +4,10 @@ import {
ChangeDetectorRef,
Component,
ElementRef,
EventEmitter,
EventEmitter, Inject,
Injector,
Input,
OnInit,
OnInit, Optional,
Output,
ViewChild
} from "@angular/core";
@ -29,11 +29,18 @@ import {PathHelperService} from "core-app/modules/common/path-helper/path-helper
import {filter, withLatestFrom} from 'rxjs/operators';
import {CausedUpdatesService} from "core-app/modules/boards/board/caused-updates/caused-updates.service";
import {WorkPackageViewSelectionService} from "core-app/modules/work_packages/routing/wp-view-base/view-services/wp-view-selection.service";
import {CardViewHandlerRegistry} from "core-components/wp-card-view/event-handler/card-view-handler-registry";
import {
CardEventHandler,
CardViewHandlerRegistry
} from "core-components/wp-card-view/event-handler/card-view-handler-registry";
import {WorkPackageCardViewService} from "core-components/wp-card-view/services/wp-card-view.service";
import {WorkPackageCardDragAndDropService} from "core-components/wp-card-view/services/wp-card-drag-and-drop.service";
import {WorkPackageNotificationService} from "core-app/modules/work_packages/notifications/work-package-notification.service";
import {DeviceService} from "core-app/modules/common/browser/device.service";
import {
WorkPackageViewHandlerClass,
WorkPackageViewHandlerToken
} from "core-app/modules/work_packages/routing/wp-view-base/event-handling/event-handler-registry";
export type CardViewOrientation = 'horizontal'|'vertical';
@ -143,7 +150,8 @@ export class WorkPackageCardViewComponent implements OnInit, AfterViewInit {
}
// Register event handlers for the cards
new CardViewHandlerRegistry(this.injector).attachTo(this);
let registry = this.injector.get<any>(WorkPackageViewHandlerToken, CardViewHandlerRegistry);
new registry(this.injector).attachTo(this);
this.wpTableSelection.registerSelectAllListener(() => { return this.cardView.renderedCards; });
this.wpTableSelection.registerDeselectAllListener();
}

@ -75,7 +75,7 @@ export class WorkPackageSingleCardComponent implements OnDestroy, OnInit {
let classIdentifier = this.classIdentifier(wp);
this.wpTableSelection.setSelection(wp.id!, this.cardView.findRenderedCard(classIdentifier));
this.$state.go(
'work-packages.list.details',
'.details',
{workPackageId: wp.id!}
);
}

@ -35,6 +35,6 @@ import {WorkPackageCopyController} from 'core-components/wp-copy/wp-copy.control
templateUrl: '../wp-new/wp-new-split-view.html'
})
export class WorkPackageCopySplitViewComponent extends WorkPackageCopyController {
public successState = 'work-packages.list.details';
public successState = 'work-packages.partitioned.list.details';
}

@ -34,5 +34,5 @@ import {Component} from '@angular/core';
templateUrl: './wp-new-split-view.html'
})
export class WorkPackageNewSplitViewComponent extends WorkPackageCreateComponent {
public successState:string = 'work-packages.list.details';
public successState:string = 'work-packages.partitioned.list.details';
}

@ -28,8 +28,9 @@
</div>
<div class="work-packages--details--resizer hidden-for-mobile hide-when-print">
<wp-resizer [elementClass]="'work-packages-split-view--details-side'"
[localStorageKey]="'openProject-splitViewFlexBasis'"></wp-resizer>
<wp-resizer [elementClass]="'work-packages-partitioned-page--content-right'"
[localStorageKey]="'openProject-splitViewFlexBasis'"
resizeStyle="width"></wp-resizer>
</div>
</edit-form>
</div>

@ -435,7 +435,7 @@ export class WorkPackageQuerySelectDropdownComponent implements OnInit, OnDestro
const opts = {reload: true};
this.$state.go(
'work-packages.list',
'work-packages.partitioned.list',
params,
opts
);
@ -464,7 +464,7 @@ export class WorkPackageQuerySelectDropdownComponent implements OnInit, OnDestro
}
const params = this.getQueryParams(item);
return this.$state.href('work-packages.list', params);
return this.$state.href('work-packages.partitioned.list', params);
}
private highlightSelected(item:IAutocompleteItem) {

@ -0,0 +1,74 @@
// -- copyright
// OpenProject is an open source project management software.
// Copyright (C) 2012-2020 the OpenProject GmbH
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License version 3.
//
// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
// Copyright (C) 2006-2013 Jean-Philippe Lang
// Copyright (C) 2010-2013 the ChiliProject Team
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
// See docs/COPYRIGHT.rdoc for more details.
// ++
import {Injectable, Injector} from '@angular/core';
import {WorkPackagesListChecksumService} from "core-components/wp-list/wp-list-checksum.service";
import {WorkPackagesListService} from "core-components/wp-list/wp-list.service";
import {TransitionService} from "@uirouter/core";
import {Subject} from "rxjs";
@Injectable()
export class QueryParamListenerService {
readonly wpListChecksumService:WorkPackagesListChecksumService = this.injector.get(WorkPackagesListChecksumService);
readonly wpListService:WorkPackagesListService = this.injector.get(WorkPackagesListService);
readonly $transitions:TransitionService = this.injector.get(TransitionService);
public observe$ = new Subject<any>();
public queryChangeListener:Function;
constructor(readonly injector:Injector) {
this.listenForQueryParamsChanged();
}
public listenForQueryParamsChanged():any {
// Listen for param changes
return this.queryChangeListener = this.$transitions.onSuccess({}, (transition):any => {
let options = transition.options();
const params = transition.params('to');
let newChecksum = this.wpListService.getCurrentQueryProps(params);
let newId:string = params.query_id ? params.query_id.toString() : null;
// Avoid performing any changes when we're going to reload
if (options.reload || (options.custom && options.custom.notify === false)) {
return true;
}
return this.wpListChecksumService
.executeIfOutdated(newId,
newChecksum,
() => {
this.observe$.next(newChecksum);
});
});
}
public removeQueryChangeListener() {
this.queryChangeListener();
}
}

@ -110,7 +110,7 @@ export class WorkPackageRelationsHierarchyService {
workPackage.project.$load()
.then(() => {
const args = [
'work-packages.list.new',
'work-packages.partitioned.list.new',
{
parent_id: workPackage.id
}

@ -53,7 +53,7 @@ describe('keepTab service', () => {
defaults = {
showTab: 'work-packages.show.activity',
detailsTab: 'work-packages.list.details.overview'
detailsTab: 'work-packages.partitioned.list.details.overview'
};
});
@ -86,7 +86,7 @@ describe('keepTab service', () => {
});
it('should also update the value of currentDetailsTab', () => {
expect(keepTab.currentDetailsState).toEqual('work-packages.list.details.relations');
expect(keepTab.currentDetailsState).toEqual('work-packages.partitioned.list.details.relations');
});
it('should propagate the previous change', () => {
@ -95,7 +95,7 @@ describe('keepTab service', () => {
var expected = {
active: 'relations',
show: 'work-packages.show.relations',
details: 'work-packages.list.details.relations'
details: 'work-packages.partitioned.list.details.relations'
}
keepTab.observable.subscribe(cb);
@ -103,14 +103,14 @@ describe('keepTab service', () => {
});
it('should correctly change when switching back', () => {
currentPathPrefix = 'work-packages.list.details.*';
currentPathPrefix = 'work-packages.partitioned.list.details.*';
$state.current.name = 'work-packages.list.details.overview';
$state.current.name = 'work-packages.partitioned.list.details.overview';
keepTab.updateTabs();
expect(keepTab.currentShowState).toEqual('work-packages.show.activity');
expect(keepTab.currentShowTab).toEqual('activity');
expect(keepTab.currentDetailsState).toEqual('work-packages.list.details.overview');
expect(keepTab.currentDetailsState).toEqual('work-packages.partitioned.list.details.overview');
expect(keepTab.currentDetailsTab).toEqual('overview');
});
});
@ -126,22 +126,22 @@ describe('keepTab service', () => {
});
it('should set the tab to overview', () => {
expect(keepTab.currentDetailsState).toEqual('work-packages.list.details.overview');
expect(keepTab.currentDetailsState).toEqual('work-packages.partitioned.list.details.overview');
});
});
describe('when opening a details route', () => {
beforeEach(() => {
spyOn($state, 'includes').and.callFake((path:string) => {
return path === 'work-packages.list.details.*';
return path === 'work-packages.partitioned.list.details.*';
});
$state.current.name = 'work-packages.list.details.activity';
$state.current.name = 'work-packages.partitioned.list.details.activity';
keepTab.updateTabs();
});
it('should update the currentShowTab value', () => {
expect(keepTab.currentDetailsState).toEqual('work-packages.list.details.activity');
expect(keepTab.currentDetailsState).toEqual('work-packages.partitioned.list.details.activity');
expect(keepTab.currentDetailsTab).toEqual('activity');
});
@ -155,7 +155,7 @@ describe('keepTab service', () => {
var expected = {
active: 'activity',
details: 'work-packages.list.details.activity',
details: 'work-packages.partitioned.list.details.activity',
show: 'work-packages.show.activity'
};

@ -65,11 +65,11 @@ export class KeepTabService {
}
public get currentDetailsState():string {
return 'work-packages.list.details.' + this.currentDetailsTab;
return 'work-packages.partitioned.list.details.' + this.currentDetailsTab;
}
public isDetailsState(stateName:string) {
return stateName === 'work-packages.list.details';
return stateName === 'work-packages.partitioned.list.details';
}
public get currentShowTab():string {
@ -110,7 +110,7 @@ export class KeepTabService {
}
if (stateName === 'details') {
return this.$state.includes('work-packages.list.details.*');
return this.$state.includes('work-packages.partitioned.list.details.*');
}
return false;

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

Loading…
Cancel
Save