Release OpenProject 16.1.1
@@ -114,7 +114,6 @@ npm-debug.log*
|
||||
node_modules/
|
||||
|
||||
# Ignore global package-lock.json that generates
|
||||
/package-lock.json
|
||||
plaintext.yml
|
||||
structure.sql
|
||||
|
||||
|
||||
@@ -27,8 +27,12 @@ See COPYRIGHT and LICENSE files for more details.
|
||||
|
||||
++#%>
|
||||
|
||||
<% helpers.html_title t(:label_administration),
|
||||
t("settings.project_phase_definitions.heading"),
|
||||
definition_heading %>
|
||||
|
||||
<%= render Primer::OpenProject::PageHeader.new do |header|
|
||||
header.with_title { t("settings.project_phase_definitions.#{heading_scope}.heading") }
|
||||
header.with_title { definition_heading }
|
||||
header.with_description { t("settings.project_phase_definitions.new.description") }
|
||||
header.with_breadcrumbs(breadcrumbs_items)
|
||||
end %>
|
||||
|
||||
@@ -31,7 +31,13 @@
|
||||
module Settings
|
||||
module ProjectLifeCycleStepDefinitions
|
||||
class FormHeaderComponent < ApplicationComponent
|
||||
options :heading_scope
|
||||
def definition_heading
|
||||
if model.persisted?
|
||||
model.name
|
||||
else
|
||||
t("settings.project_phase_definitions.new.heading")
|
||||
end
|
||||
end
|
||||
|
||||
def breadcrumbs_items
|
||||
[
|
||||
@@ -47,7 +53,7 @@ module Settings
|
||||
href: admin_settings_project_phase_definitions_path,
|
||||
text: t("settings.project_phase_definitions.heading")
|
||||
},
|
||||
t("settings.project_phase_definitions.#{heading_scope}.heading")
|
||||
definition_heading
|
||||
]
|
||||
end
|
||||
end
|
||||
|
||||
@@ -68,29 +68,29 @@ module Attachments
|
||||
end
|
||||
|
||||
##
|
||||
# Validates the content type, if a whitelist is set
|
||||
# Validates the content type, if a allowlist is set
|
||||
def validate_content_type
|
||||
# If the whitelist is empty, assume all files are allowed
|
||||
# If the allowlist is empty, assume all files are allowed
|
||||
# as before
|
||||
unless matches_whitelist?(attachment_whitelist)
|
||||
Rails.logger.info { "Uploaded file #{model.filename} with type #{model.content_type} does not match whitelist" }
|
||||
errors.add :content_type, :not_whitelisted, value: model.content_type
|
||||
unless matches_allowlist?(attachment_allowlist)
|
||||
Rails.logger.info { "Uploaded file #{model.filename} with type #{model.content_type} does not match allowlist" }
|
||||
errors.add :content_type, :not_allowlisted, value: model.content_type
|
||||
end
|
||||
end
|
||||
|
||||
##
|
||||
# Get the user-defined whitelist or a custom whitelist
|
||||
# Get the user-defined allowlist or a custom allowlist
|
||||
# defined for this invocation
|
||||
def attachment_whitelist
|
||||
Array(options.fetch(:whitelist, Setting.attachment_whitelist))
|
||||
def attachment_allowlist
|
||||
Array(options.fetch(:allowlist, Setting.attachment_whitelist))
|
||||
end
|
||||
|
||||
##
|
||||
# Returns whether the attachment matches the whitelist
|
||||
def matches_whitelist?(whitelist)
|
||||
return true if whitelist.empty?
|
||||
# Returns whether the attachment matches the allowlist
|
||||
def matches_allowlist?(allowlist)
|
||||
return true if allowlist.empty?
|
||||
|
||||
whitelist.include?(model.content_type) || whitelist.include?("*#{model.extension}")
|
||||
allowlist.include?(model.content_type) || allowlist.include?("*#{model.extension}")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
#-- copyright
|
||||
# OpenProject is an open source project management software.
|
||||
# Copyright (C) the OpenProject GmbH
|
||||
@@ -289,6 +291,7 @@ module WorkPackages
|
||||
|
||||
def validate_parent_not_self
|
||||
if model.parent == model
|
||||
errors.delete(:parent_id) # remove the error added by closure_tree's cycle detection
|
||||
errors.add :parent, :cannot_be_self_assigned
|
||||
end
|
||||
end
|
||||
@@ -304,11 +307,22 @@ module WorkPackages
|
||||
if model.parent_id_changed? &&
|
||||
model.parent_id &&
|
||||
errors.exclude?(:parent) &&
|
||||
WorkPackage.relatable(model, Relation::TYPE_PARENT).where(id: model.parent_id).empty?
|
||||
current_parent_unrelatable?
|
||||
# closure_tree adds an error on :parent_id because of the cycle
|
||||
# detection, and active_record sees the error when saving the children
|
||||
# association and adds an error on :children as well. We need to remove
|
||||
# them.
|
||||
errors.delete(:parent_id) # remove the error added by closure_tree
|
||||
errors.delete(:children) # remove the error added by active_record
|
||||
# add our own error
|
||||
errors.add :parent, :cant_link_a_work_package_with_a_descendant
|
||||
end
|
||||
end
|
||||
|
||||
def current_parent_unrelatable?
|
||||
WorkPackage.relatable(model, Relation::TYPE_PARENT).where(id: model.parent_id).empty?
|
||||
end
|
||||
|
||||
def validate_status_exists
|
||||
errors.add :status, :does_not_exist if model.status && !status_exists?
|
||||
end
|
||||
|
||||
@@ -111,7 +111,6 @@ class WorkPackages::ActivitiesTabController < ApplicationController
|
||||
call = create_journal_service_call
|
||||
|
||||
if call.success? && call.result
|
||||
claim_journal_attachments_for(call.result)
|
||||
set_last_server_timestamp_to_headers
|
||||
handle_successful_create_call(call)
|
||||
else
|
||||
@@ -129,7 +128,6 @@ class WorkPackages::ActivitiesTabController < ApplicationController
|
||||
call = update_journal_service_call
|
||||
|
||||
if call.success? && call.result
|
||||
claim_journal_attachments_for(call.result)
|
||||
update_item_show_component(journal: call.result, grouped_emoji_reactions: grouped_emoji_reactions_for_journal)
|
||||
else
|
||||
handle_failed_create_or_update_call(call)
|
||||
@@ -321,12 +319,6 @@ class WorkPackages::ActivitiesTabController < ApplicationController
|
||||
Journals::UpdateService.new(model: @journal, user: User.current).call(notes:)
|
||||
end
|
||||
|
||||
def claim_journal_attachments_for(journal)
|
||||
WorkPackages::ActivitiesTab::CommentAttachmentsClaims::ClaimsService
|
||||
.new(user: User.current, model: journal)
|
||||
.call
|
||||
end
|
||||
|
||||
def generate_time_based_update_streams(last_update_timestamp)
|
||||
journals = @work_package
|
||||
.journals
|
||||
|
||||
@@ -44,7 +44,7 @@ class AddWorkPackageNoteService
|
||||
self.contract_class = WorkPackages::CreateNoteContract
|
||||
end
|
||||
|
||||
def call(notes, send_notifications: nil, internal: false)
|
||||
def call(notes, send_notifications: nil, internal: false) # rubocop:disable Metrics/AbcSize
|
||||
in_context(work_package, send_notifications:) do
|
||||
work_package.add_journal(user:, notes:, internal:)
|
||||
|
||||
@@ -60,7 +60,18 @@ class AddWorkPackageNoteService
|
||||
end
|
||||
end
|
||||
|
||||
ServiceResult.new(success:, result: journal, errors:)
|
||||
ServiceResult.new(success:, result: journal, errors:).on_success do |r|
|
||||
attachments_claims = claim_attachments_for(r.result)
|
||||
r.add_dependent!(attachments_claims)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def claim_attachments_for(journal)
|
||||
WorkPackages::ActivitiesTab::CommentAttachmentsClaims::ClaimsService
|
||||
.new(user: User.current, model: journal)
|
||||
.call
|
||||
end
|
||||
end
|
||||
|
||||
@@ -36,8 +36,8 @@ module Attachments
|
||||
# @param whitelist A custom whitelist to validate with, or empty to disable validation
|
||||
#
|
||||
# Warning: When passing an empty whitelist, this results in no validations on the content type taking place.
|
||||
def self.bypass_whitelist(user:, whitelist: [])
|
||||
new(user:, contract_options: { whitelist: whitelist.map(&:to_s) })
|
||||
def self.bypass_allowlist(user:, allowlist: [])
|
||||
new(user:, contract_options: { allowlist: allowlist.map(&:to_s) })
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,140 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
# -- copyright
|
||||
# OpenProject is an open source project management software.
|
||||
# Copyright (C) the OpenProject GmbH
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License version 3.
|
||||
#
|
||||
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
|
||||
# Copyright (C) 2006-2013 Jean-Philippe Lang
|
||||
# Copyright (C) 2010-2013 the ChiliProject Team
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License
|
||||
# as published by the Free Software Foundation; either version 2
|
||||
# of the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
#
|
||||
# See COPYRIGHT and LICENSE files for more details.
|
||||
# ++
|
||||
|
||||
module Attachments
|
||||
class FinishDirectUploadService < BaseServices::BaseContracted
|
||||
def initialize(user:, model:, contract_class: nil, contract_options: {})
|
||||
self.model = model
|
||||
super(user:, contract_class:, contract_options:)
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
alias_method :attachment, :model
|
||||
|
||||
def service_context(send_notifications:, &)
|
||||
# Overwriting the call to in_context to place the semaphore on the container and not on the attachment.
|
||||
# Since the service will write a journal on the container, there should not be another
|
||||
# process that modifies the container while this service is running.
|
||||
in_context(attachment.container, send_notifications:, &)
|
||||
end
|
||||
|
||||
def validate_params(_params)
|
||||
super.tap do |call|
|
||||
validate_local_file_exists(call)
|
||||
end
|
||||
end
|
||||
|
||||
def before_perform(*)
|
||||
super.tap do
|
||||
set_attachment_parameters
|
||||
end
|
||||
end
|
||||
|
||||
def persist(call)
|
||||
super.tap do |service_result|
|
||||
unless attachment.save
|
||||
service_result.errors = attachment.errors
|
||||
service_result.success = false
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def after_perform(service_call)
|
||||
super.tap do
|
||||
journalize_container
|
||||
attachment_created_event
|
||||
schedule_jobs
|
||||
end
|
||||
end
|
||||
|
||||
def validate_local_file_exists(call)
|
||||
unless local_file
|
||||
call.errors.add(:base, "File for attachment #{attachment.filename} was not uploaded.")
|
||||
call.success = false
|
||||
end
|
||||
end
|
||||
|
||||
def set_attachment_parameters
|
||||
attachment.extend(OpenProject::ChangedBySystem)
|
||||
attachment.change_by_system do
|
||||
attachment.status = :uploaded
|
||||
attachment.file = local_file
|
||||
end
|
||||
end
|
||||
|
||||
def schedule_jobs
|
||||
attachment.extract_fulltext
|
||||
end
|
||||
|
||||
def journalize_container
|
||||
journable = attachment.container
|
||||
|
||||
return unless journable&.class&.journaled?
|
||||
|
||||
# Touching the journable will lead to the journal created next having its own timestamp.
|
||||
# That timestamp will not adequately reflect the time the attachment was uploaded. This job
|
||||
# right here might be executed way later than the time the attachment was uploaded. Ideally,
|
||||
# the journals would be created bearing the time stamps of the attachment's created_at.
|
||||
# This remains a TODO.
|
||||
# But with the timestamp update in place as it is, at least the collapsing of aggregated journals
|
||||
# from days before with the newly uploaded attachment is prevented.
|
||||
touch_journable(journable)
|
||||
|
||||
Journals::CreateService
|
||||
.new(journable, attachment.author)
|
||||
.call
|
||||
end
|
||||
|
||||
def touch_journable(journable)
|
||||
# Not using touch here on purpose,
|
||||
# as to avoid changing lock versions on the journables for this change
|
||||
attributes = journable.send(:timestamp_attributes_for_update_in_model)
|
||||
|
||||
timestamps = attributes.index_with { Time.current }
|
||||
journable.update_columns(timestamps) if timestamps.any?
|
||||
end
|
||||
|
||||
def attachment_created_event
|
||||
OpenProject::Notifications.send(
|
||||
OpenProject::Events::ATTACHMENT_CREATED,
|
||||
attachment:
|
||||
)
|
||||
end
|
||||
|
||||
def default_contract_class
|
||||
::Attachments::CreateContract
|
||||
end
|
||||
|
||||
def local_file
|
||||
attachment&.diskfile
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,3 +1,5 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
#-- copyright
|
||||
# OpenProject is an open source project management software.
|
||||
# Copyright (C) the OpenProject GmbH
|
||||
@@ -31,11 +33,28 @@ module Journals
|
||||
protected
|
||||
|
||||
def after_perform(call)
|
||||
if call.success? && activity_comment?(call.result)
|
||||
attachments_claims = claim_attachments_for(call.result)
|
||||
call.add_dependent!(attachments_claims)
|
||||
end
|
||||
|
||||
OpenProject::Notifications.send(OpenProject::Events::JOURNAL_UPDATED,
|
||||
journal: call.result,
|
||||
send_notification: Journal::NotificationConfiguration.active?)
|
||||
|
||||
call
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def activity_comment?(journal)
|
||||
journal.notes.present?
|
||||
end
|
||||
|
||||
def claim_attachments_for(journal)
|
||||
WorkPackages::ActivitiesTab::CommentAttachmentsClaims::ClaimsService
|
||||
.new(user: User.current, model: journal)
|
||||
.call
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -31,17 +31,9 @@ module Reminders
|
||||
include Reminders::ServiceHelpers
|
||||
|
||||
def after_perform(service_call)
|
||||
reschedule_reminder(service_call.result) if remind_at_changed?
|
||||
reschedule_reminder(service_call.result) if model.saved_change_to_remind_at?
|
||||
|
||||
service_call
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def remind_at_changed?
|
||||
# For some reason reminder.remind_at_changed? returns false
|
||||
# so we assume a change if remind_at is present in the params (would have passed contract validation)
|
||||
params[:remind_at].present?
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -102,13 +102,21 @@ class WorkPackages::ScheduleDependency
|
||||
def automatically_scheduled_ancestors(work_package)
|
||||
@automatically_scheduled_ancestors ||= {}
|
||||
@automatically_scheduled_ancestors[work_package] ||= begin
|
||||
parent = parent_of(work_package)
|
||||
work_packages_to_process = [work_package]
|
||||
result = []
|
||||
processed_ids = Set.new
|
||||
|
||||
if parent&.schedule_automatically?
|
||||
[parent, *automatically_scheduled_ancestors(parent)]
|
||||
else
|
||||
[]
|
||||
while current = work_packages_to_process.shift
|
||||
processed_ids.add(current.id)
|
||||
|
||||
parent = parent_of(current)
|
||||
|
||||
if parent&.schedule_automatically?
|
||||
result << parent unless parent.id == work_package.id
|
||||
work_packages_to_process << parent unless processed_ids.include?(parent.id)
|
||||
end
|
||||
end
|
||||
result
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
#-- copyright
|
||||
# OpenProject is an open source project management software.
|
||||
# Copyright (C) the OpenProject GmbH
|
||||
@@ -62,9 +64,28 @@ class WorkPackages::ScheduleDependency::DependencyGraph
|
||||
def full_dependencies_of(work_package_id)
|
||||
@full_dependent_ids ||= {}
|
||||
@full_dependent_ids[work_package_id] ||= begin
|
||||
ids = dependent_ids_for_work_package_id(work_package_id)
|
||||
ids += ids.flat_map { full_dependencies_of(_1) }
|
||||
ids.uniq
|
||||
visited = Set.new
|
||||
stack = [work_package_id]
|
||||
result = Set.new
|
||||
|
||||
while stack.any?
|
||||
current_id = stack.pop
|
||||
|
||||
visited.add(current_id)
|
||||
|
||||
# Get direct dependencies for current work package
|
||||
dependent_ids = dependent_ids_for_work_package_id(current_id)
|
||||
|
||||
dependent_ids.each do |dependent_id|
|
||||
# Add to result set
|
||||
result.add(dependent_id) unless dependent_id == work_package_id
|
||||
|
||||
# Add to stack for further processing (if not already visited)
|
||||
stack.push(dependent_id) unless visited.include?(dependent_id)
|
||||
end
|
||||
end
|
||||
|
||||
result.to_a
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -27,12 +27,6 @@ See COPYRIGHT and LICENSE files for more details.
|
||||
|
||||
++#%>
|
||||
|
||||
<% heading_scope = @definition.persisted? ? :edit : :new %>
|
||||
|
||||
<% html_title t(:label_administration),
|
||||
t("settings.project_phase_definitions.heading"),
|
||||
t("settings.project_phase_definitions.#{heading_scope}.heading") %>
|
||||
|
||||
<%= render Settings::ProjectLifeCycleStepDefinitions::FormHeaderComponent.new(@definition, heading_scope:) %>
|
||||
<%= render Settings::ProjectLifeCycleStepDefinitions::FormHeaderComponent.new(@definition) %>
|
||||
|
||||
<%= render Projects::LifeCycleStepDefinitions::FormComponent.new(@definition) %>
|
||||
|
||||
@@ -85,6 +85,7 @@
|
||||
<% selected = action.value_objects.map { |v| { id: v[:value], name: v[:label] } } %>
|
||||
<%= angular_component_tag "opce-user-autocompleter",
|
||||
inputs: {
|
||||
multiple: action.multi_value?,
|
||||
hideSelected: true,
|
||||
defaultData: false,
|
||||
placeholder: I18n.t(:label_user_search),
|
||||
|
||||
@@ -29,115 +29,53 @@
|
||||
class Attachments::FinishDirectUploadJob < ApplicationJob
|
||||
queue_with_priority :high
|
||||
|
||||
def perform(attachment_id, whitelist: true)
|
||||
def perform(attachment_id, allowlist: true)
|
||||
attachment = Attachment.pending_direct_upload.find_by(id: attachment_id)
|
||||
# An attachment is guaranteed to have a file.
|
||||
# But if the attachment is nil the expression attachment&.file will be nil and attachment&.file.local_file
|
||||
# will throw a NoMethodError: undefined method local_file' for nil:NilClass`.
|
||||
local_file = attachment && attachment.file.local_file
|
||||
|
||||
if local_file.nil?
|
||||
return Rails.logger.error("File for attachment #{attachment_id} was not uploaded.")
|
||||
unless attachment
|
||||
log_not_found(attachment_id)
|
||||
return
|
||||
end
|
||||
|
||||
User.execute_as(attachment.author) do
|
||||
attach_uploaded_file(attachment, local_file, whitelist)
|
||||
Attachments::FinishDirectUploadService
|
||||
.new(user: attachment.author, model: attachment, contract_options: derive_contract_options(allowlist))
|
||||
.call
|
||||
.on_failure do |call|
|
||||
destroy_attachment_and_log_errors(attachment, call.errors)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def attach_uploaded_file(attachment, local_file, whitelist)
|
||||
set_attributes_from_file(attachment, local_file)
|
||||
validate_attachment(attachment, whitelist)
|
||||
save_attachment(attachment)
|
||||
journalize_container(attachment)
|
||||
attachment_created_event(attachment)
|
||||
schedule_jobs(attachment)
|
||||
rescue StandardError => e
|
||||
::OpenProject.logger.error e
|
||||
def destroy_attachment_and_log_errors(attachment, errors)
|
||||
attachment.destroy
|
||||
ensure
|
||||
FileUtils.rm_rf(local_file.path)
|
||||
errors = errors.full_messages
|
||||
|
||||
OpenProject.logger.error(
|
||||
<<~MSG
|
||||
Failed to finish attachment upload for:
|
||||
* user: #{attachment.author_id} - #{attachment.author.name}
|
||||
* container: #{attachment.container_id} - #{attachment.container}
|
||||
* attachment file name: #{attachment.filename}
|
||||
|
||||
Errors:
|
||||
#{errors.join("\n ")}
|
||||
MSG
|
||||
)
|
||||
end
|
||||
|
||||
def set_attributes_from_file(attachment, local_file)
|
||||
attachment.extend(OpenProject::ChangedBySystem)
|
||||
attachment.change_by_system do
|
||||
attachment.status = :uploaded
|
||||
attachment.set_file_size local_file
|
||||
attachment.set_content_type local_file
|
||||
attachment.set_digest local_file
|
||||
end
|
||||
def log_not_found(attachment_id)
|
||||
OpenProject.logger.error("Attachment #{attachment_id} not found")
|
||||
end
|
||||
|
||||
def save_attachment(attachment)
|
||||
attachment.save! if attachment.changed?
|
||||
end
|
||||
|
||||
def validate_attachment(attachment, whitelist)
|
||||
contract = create_contract attachment, whitelist
|
||||
|
||||
unless contract.valid?
|
||||
errors = contract.errors.full_messages.join(", ")
|
||||
raise "Failed to validate attachment #{attachment.id}: #{errors}"
|
||||
end
|
||||
end
|
||||
|
||||
def create_contract(attachment, whitelist)
|
||||
options = derive_contract_options(whitelist)
|
||||
::Attachments::CreateContract.new attachment,
|
||||
attachment.author,
|
||||
options:
|
||||
end
|
||||
|
||||
def schedule_jobs(attachment)
|
||||
attachment.extract_fulltext
|
||||
end
|
||||
|
||||
def derive_contract_options(whitelist)
|
||||
case whitelist
|
||||
def derive_contract_options(allowlist)
|
||||
case allowlist
|
||||
when false
|
||||
{ whitelist: [] }
|
||||
{ allowlist: [] }
|
||||
when Array
|
||||
{ whitelist: whitelist.map(&:to_s) }
|
||||
{ allowlist: allowlist.map(&:to_s) }
|
||||
else
|
||||
{}
|
||||
end
|
||||
end
|
||||
|
||||
def journalize_container(attachment)
|
||||
journable = attachment.container
|
||||
|
||||
return unless journable&.class&.journaled?
|
||||
|
||||
# Touching the journable will lead to the journal created next having its own timestamp.
|
||||
# That timestamp will not adequately reflect the time the attachment was uploaded. This job
|
||||
# right here might be executed way later than the time the attachment was uploaded. Ideally,
|
||||
# the journals would be created bearing the time stamps of the attachment's created_at.
|
||||
# This remains a TODO.
|
||||
# But with the timestamp update in place as it is, at least the collapsing of aggregated journals
|
||||
# from days before with the newly uploaded attachment is prevented.
|
||||
touch_journable(journable)
|
||||
|
||||
Journals::CreateService
|
||||
.new(journable, attachment.author)
|
||||
.call
|
||||
end
|
||||
|
||||
def touch_journable(journable)
|
||||
# Not using touch here on purpose,
|
||||
# as to avoid changing lock versions on the journables for this change
|
||||
attributes = journable.send(:timestamp_attributes_for_update_in_model)
|
||||
|
||||
timestamps = attributes.index_with { Time.now }
|
||||
journable.update_columns(timestamps) if timestamps.any?
|
||||
end
|
||||
|
||||
def attachment_created_event(attachment)
|
||||
OpenProject::Notifications.send(
|
||||
OpenProject::Events::ATTACHMENT_CREATED,
|
||||
attachment:
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -134,7 +134,7 @@ class BackupJob < ApplicationJob
|
||||
def store_backup(file_name, backup:, user:)
|
||||
File.open(file_name) do |file|
|
||||
call = Attachments::CreateService
|
||||
.bypass_whitelist(user:)
|
||||
.bypass_allowlist(user:)
|
||||
.call(container: backup, filename: file_name, file:, description: "OpenProject backup")
|
||||
|
||||
call.on_success do
|
||||
|
||||
@@ -117,7 +117,7 @@ module Exports
|
||||
filename = clean_filename(export_result)
|
||||
|
||||
call = Attachments::CreateService
|
||||
.bypass_whitelist(user: User.current)
|
||||
.bypass_allowlist(user: User.current)
|
||||
.call(container:, file:, filename:, description: "")
|
||||
|
||||
call.on_success do
|
||||
|
||||
@@ -1160,7 +1160,7 @@ module Settings
|
||||
default: {
|
||||
"workers" => 2,
|
||||
"timeout" => Rails.env.production? ? 120 : 0,
|
||||
"wait_timeout" => 10,
|
||||
"wait_timeout" => 30,
|
||||
"min_threads" => 4,
|
||||
"max_threads" => 16
|
||||
},
|
||||
|
||||
@@ -122,7 +122,14 @@ Redmine::MenuManager.map :account_menu do |menu|
|
||||
}
|
||||
menu.push :logout,
|
||||
:signout_path,
|
||||
if: ->(_) { User.current.logged? }
|
||||
if: ->(_) { User.current.logged? },
|
||||
html: {
|
||||
data: {
|
||||
# Turbo-drive needs to be disabled, as we might redirect to other origins
|
||||
# as a result here (e.g., post logout SSO redirects).
|
||||
turbo: false
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
Redmine::MenuManager.map :global_menu do |menu|
|
||||
|
||||
@@ -1208,7 +1208,7 @@ af:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3932,8 +3932,6 @@ af:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1240,7 +1240,7 @@ ar:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -4094,8 +4094,6 @@ ar:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1208,7 +1208,7 @@ az:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3932,8 +3932,6 @@ az:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1224,7 +1224,7 @@ be:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -4014,8 +4014,6 @@ be:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1208,7 +1208,7 @@ bg:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "Типът на съдържанието на файла не може да бъде празен."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3932,8 +3932,6 @@ bg:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1205,7 +1205,7 @@ ca:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "El tipus de contingut del fitxer no pot ser buit."
|
||||
not_whitelisted: "El fitxer s'ha rebutjat per un filtre automàtic. '%{value}' no és a la llista blanca de càrrega."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3923,8 +3923,6 @@ ca:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1208,7 +1208,7 @@ ckb-IR:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3932,8 +3932,6 @@ ckb-IR:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1224,7 +1224,7 @@ cs:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "Typ obsahu souboru nemůže být prázdný."
|
||||
not_whitelisted: "Soubor byl odmítnut automatickým filtrem. '%{value}' není na seznamu povolených pro nahrávání."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -4013,8 +4013,6 @@ cs:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1206,7 +1206,7 @@ da:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3928,8 +3928,6 @@ da:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1200,7 +1200,7 @@ de:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "Der Content-Type der Datei darf nicht leer sein."
|
||||
not_whitelisted: "Die Datei wurde von einem automatischen Filter abgelehnt. '%{value}' ist nicht für Uploads freigegeben."
|
||||
not_allowlisted: "Die Datei wurde von einem automatischen Filter abgelehnt. ‚%{value}‘ ist für den Upload nicht zulässig."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3924,8 +3924,6 @@ de:
|
||||
new:
|
||||
description: "Änderungen an dieser Projekt-Phase werden in allen sie verwendenden Projekten sichtbar."
|
||||
heading: "Neue Phase"
|
||||
edit:
|
||||
heading: "Phase bearbeiten"
|
||||
both_gate: "Gate zum Beginn und zum Ende"
|
||||
no_gate: "Kein Gate"
|
||||
start_gate: "Gate zum Beginn"
|
||||
@@ -4300,12 +4298,12 @@ de:
|
||||
message: "Das Teilen von Projektlisten mit einzelnen Nutzern ist ein Enterprise Add-on"
|
||||
working_days:
|
||||
info: >
|
||||
Days that are not selected are skipped when scheduling work packages and project life cycles (and not included in the day count). These can be overridden at a work-package level.
|
||||
Tage, die nicht ausgewählt sind, werden bei der Planung von Arbeitspaketen und Projektphasen übersprungen (und bei der Tageszählung nicht berücksichtigt). Diese können auf Arbeitspaket-Ebene überschrieben werden.
|
||||
instance_wide_info: >
|
||||
Daten, die der Liste unten hinzugefügt werden, gelten als arbeitsfrei und werden bei der Planung von Arbeitspaketen übersprungen.
|
||||
change_button: "Arbeitstage ändern"
|
||||
warning: >
|
||||
Changing which days of the week are considered working days or non-working days can affect the start and finish days of all work packages and life cycles in all projects in this instance.
|
||||
Die Änderung der Wochentage, die als Arbeitstage oder arbeitsfreie Tage gelten, kann sich auf die Start- und Endtage aller Arbeitspakete und Projektphasen in allen Projekten auswirken.
|
||||
journal_note:
|
||||
changed: _**Arbeitstage** geändert (%{changes})._
|
||||
days:
|
||||
|
||||
@@ -1204,7 +1204,7 @@ el:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3927,8 +3927,6 @@ el:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1208,7 +1208,7 @@ eo:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3932,8 +3932,6 @@ eo:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1205,7 +1205,7 @@ es:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "El tipo de contenido del archivo no puede estar en blanco."
|
||||
not_whitelisted: "El archivo se rechazó a causa de un filtro automático. «%{value}» no se incluye en la lista de permitidos para carga."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3928,8 +3928,6 @@ es:
|
||||
new:
|
||||
description: "Los cambios en esta fase del proyecto se reflejarán en todos los proyectos en los que esté activada."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Puerta inicial y final"
|
||||
no_gate: "Sin puerta"
|
||||
start_gate: "Puerta de inicio"
|
||||
|
||||
@@ -1208,7 +1208,7 @@ et:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3932,8 +3932,6 @@ et:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1208,7 +1208,7 @@ eu:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3932,8 +3932,6 @@ eu:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1208,7 +1208,7 @@ fa:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3932,8 +3932,6 @@ fa:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1208,7 +1208,7 @@ fi:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3932,8 +3932,6 @@ fi:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1208,7 +1208,7 @@ fil:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3930,8 +3930,6 @@ fil:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1206,7 +1206,7 @@ fr:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "Le type de contenu du fichier ne peut pas être vide."
|
||||
not_whitelisted: "Le fichier a été rejeté par un filtre automatique. « %{value} » n'est pas en liste blanche pour le téléversement."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3930,8 +3930,6 @@ fr:
|
||||
new:
|
||||
description: "Les modifications apportées à cette phase du projet seront répercutées dans tous les projets où elle est activée."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Porte de début et de fin"
|
||||
no_gate: "Aucune porte"
|
||||
start_gate: "Porte de début"
|
||||
|
||||
@@ -1224,7 +1224,7 @@ he:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -4014,8 +4014,6 @@ he:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1207,7 +1207,7 @@ hi:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3931,8 +3931,6 @@ hi:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1216,7 +1216,7 @@ hr:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3973,8 +3973,6 @@ hr:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1207,7 +1207,7 @@ hu:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "A fájltípus nem lehet üres."
|
||||
not_whitelisted: "Az automatikus szűrő visszautasította a fájlt. Feltöltésnél a '%{value}' nem engedélyezett."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}\n"
|
||||
capability:
|
||||
context:
|
||||
@@ -3930,8 +3930,6 @@ hu:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1196,7 +1196,7 @@ id:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "Jenis konten file tidak boleh kosong."
|
||||
not_whitelisted: "File ditolak oleh filter otomatis. '%{value}' tidak masuk daftar putih untuk unggahan."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3884,8 +3884,6 @@ id:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1205,7 +1205,7 @@ it:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "Il tipo di contenuto del file non può essere vuoto."
|
||||
not_whitelisted: "Il file è stato rifiutato da un filtro automatico. Non è possibile caricare '%{value}'."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3929,8 +3929,6 @@ it:
|
||||
new:
|
||||
description: "Le modifiche a questa fase di progetto si rifletteranno in tutti i progetti in cui è abilitata."
|
||||
heading: "Nuova fase"
|
||||
edit:
|
||||
heading: "Modifica fase"
|
||||
both_gate: "Controlli di inizio e fine"
|
||||
no_gate: "Nessun controllo"
|
||||
start_gate: "Inizia controllo"
|
||||
|
||||
@@ -37,8 +37,8 @@ ja:
|
||||
label_submit_comment: "コメントする"
|
||||
label_who: 誰が?
|
||||
changed_on: "を変更した"
|
||||
created_on: "created this on"
|
||||
changed: "changed"
|
||||
created_on: "これを作成したのは"
|
||||
changed: "変更済み"
|
||||
created: "作成する"
|
||||
commented: "コメント"
|
||||
internal_comment: 内部コメント
|
||||
@@ -70,8 +70,8 @@ ja:
|
||||
custom_colors: "カスタム色"
|
||||
manage_colors: "色の選択オプションを編集"
|
||||
instructions:
|
||||
primary-button-color: "Strong accent color, used for the most important button on a screen."
|
||||
accent-color: "Color for links and other decently highlighted elements."
|
||||
primary-button-color: "画面上で最も重要なボタンに使用される強いアクセントカラー。"
|
||||
accent-color: "リンクや強調表示された要素の色。"
|
||||
header-item-bg-hover-color: "クリック可能なヘッダー項目にマウスを置いたときの背景色。"
|
||||
header-item-font-color: "クリック可能なヘッダー項目のフォント色。"
|
||||
header-item-font-hover-color: "クリック可能なヘッダー項目にマウスを置いたときのフォント色。"
|
||||
@@ -97,7 +97,7 @@ ja:
|
||||
contact: "デモについてはお問い合わせください"
|
||||
enterprise_info_html: "は、Enterprise <span class='spot-icon spot-icon_inline spot-icon_enterprise-addons'></span> アドオンです。"
|
||||
upgrade_info: "有料プランにアップグレードして、チームで使用を開始してください。"
|
||||
jemalloc_allocator: Jemalloc memory allocator
|
||||
jemalloc_allocator: Jemalloc メモリアロケータ
|
||||
journal_aggregation:
|
||||
explanation:
|
||||
text: "Individual actions of a user (e.g. updating a work package twice) are aggregated into a single action if their age difference is less than the specified timespan. They will be displayed as a single action within the application. This will also delay notifications by the same amount of time reducing the number of emails being sent and will also affect %{webhook_link} delay."
|
||||
@@ -237,8 +237,8 @@ ja:
|
||||
heading: "カスタムフィールド項目を削除しますか?"
|
||||
description: "This action will irreversibly remove the item and all its sub-items. Any assigned values will be permanently deleted. If this field is required, removing items may cause existing work packages to become invalid."
|
||||
placeholder:
|
||||
label: "Item label"
|
||||
short: "Short name"
|
||||
label: "アイテムラベル"
|
||||
short: "ショートネーム"
|
||||
notice:
|
||||
remember_items_and_projects: "Remember to set items and projects in the respective tabs for this custom field."
|
||||
hierarchy:
|
||||
@@ -286,16 +286,16 @@ ja:
|
||||
short:
|
||||
not_unique: "は、同じ階層レベル内で一意である必要があります。"
|
||||
parent:
|
||||
not_descendant: "must be a descendant of the hierarchy root."
|
||||
not_descendant: "階層ルートの子孫でなければなりません"
|
||||
rules:
|
||||
depth: "Depth"
|
||||
item: "Item"
|
||||
depth: "深さ"
|
||||
item: "アイテム"
|
||||
label: "Label"
|
||||
short: "Short name"
|
||||
short: "ショートネーム"
|
||||
parent: "親項目"
|
||||
blueprint: "Pattern blueprint"
|
||||
global_search:
|
||||
placeholder: "Search in %{app_title}"
|
||||
placeholder: "%{app_title}で検索"
|
||||
overwritten_tabs:
|
||||
all: "全て"
|
||||
messages: "フォーラム"
|
||||
@@ -349,7 +349,7 @@ ja:
|
||||
delete_modal:
|
||||
title: "プロジェクトリストの削除"
|
||||
heading: "このプロジェクトリストを削除しますか?"
|
||||
text: "This action will not delete any project the list contains. Are you sure you want to delete this project list?"
|
||||
text: "この操作では、リストに含まれるプロジェクトは削除されません。本当にこのプロジェクトリストを削除しますか?"
|
||||
settings:
|
||||
header_details: 基本情報
|
||||
header_status: プロジェクトの進捗状況
|
||||
@@ -365,14 +365,14 @@ ja:
|
||||
description: >
|
||||
このプロジェクトは公開されています。このインスタンスにアクセスできる人は誰でも、自分の役割と関連する権限に応じて、このプロジェクトを表示し、操作することができます。サブプロジェクトは影響を受けず、独自の設定を持ちます。
|
||||
private_confirmation:
|
||||
checkbox: "I understand that this will make the previously public content private."
|
||||
title: "Make this project private?"
|
||||
checkbox: "これにより、公開されていたコンテンツが非公開になることを理解しています。"
|
||||
title: "このプロジェクトを非公開にしますか?"
|
||||
description: >
|
||||
The project will only be visible to project members depending on their role and associated permissions. Sub-projects are not affected and have their own settings.
|
||||
change_identifier: 識別子の変更
|
||||
actions:
|
||||
label_enable_all: "Enable all"
|
||||
label_disable_all: "Disable all"
|
||||
label_enable_all: "全て有効"
|
||||
label_disable_all: "すべて無効"
|
||||
activities:
|
||||
no_results_title_text: 現在、有効な活動はありません。
|
||||
forums:
|
||||
@@ -398,7 +398,7 @@ ja:
|
||||
title: "Project attributes"
|
||||
description_html: 'These project attributes will be displayed in your <a href=%{overview_url} target="_blank">project overview page</a> under their respective sections. You can enable or disable individual attributes. Project attributes and sections are defined in the <a href=%{admin_settings_url} target="_blank">administration settings</a> by the administrator of the instance. '
|
||||
filter:
|
||||
label: "Search project attribute"
|
||||
label: "プロジェクトの属性を検索"
|
||||
actions:
|
||||
label_enable_single: "Active in this project, click to disable"
|
||||
label_disable_single: "Inactive in this project, click to enable"
|
||||
@@ -490,14 +490,14 @@ ja:
|
||||
my:
|
||||
access_token:
|
||||
create_dialog:
|
||||
title: Token generated
|
||||
title: トークン生成完了
|
||||
header: '%{type} トークンが生成されました'
|
||||
warning: このトークンが表示されるのは今回だけなので、必ずコピーしてください。
|
||||
errors:
|
||||
token_name_blank: "Please provide an API token name"
|
||||
token_name_in_use: "This API token name is already in use, please select a different one"
|
||||
new_access_token_dialog_title: "Create new API token"
|
||||
new_access_token_dialog_show_button_text: "API token"
|
||||
token_name_blank: "APIトークン名を入力してください"
|
||||
token_name_in_use: "この API トークン名は既に使用されています。別のトークンを選択してください"
|
||||
new_access_token_dialog_title: "新しいAPIトークンを作成"
|
||||
new_access_token_dialog_show_button_text: "APIトークン"
|
||||
new_access_token_dialog_text_field_placeholder_text: "My API token"
|
||||
new_access_token_dialog_text_field_label: "名称"
|
||||
new_access_token_dialog_submit_button_text: "作成"
|
||||
@@ -523,7 +523,7 @@ ja:
|
||||
remembered_devices: "Remembered devices"
|
||||
remembered_devices_caption: "A list of all devices that logged into this account using the 'Stay logged in' option."
|
||||
session_name: "%{browser_name} %{browser_version} on %{os_name}"
|
||||
browser: "Browser"
|
||||
browser: "ブラウザ"
|
||||
device: "デバイス / OS"
|
||||
unknown_browser: "不明なブラウザ"
|
||||
unknown_os: "不明なオペレーティング システム"
|
||||
@@ -890,7 +890,7 @@ ja:
|
||||
uid: "クライアントID"
|
||||
secret: "秘密鍵"
|
||||
owner: "所有者"
|
||||
builtin: "Builtin"
|
||||
builtin: "組み込み"
|
||||
enabled: "アクティブ"
|
||||
redirect_uri: "リダイレクトURI"
|
||||
client_credentials_user_id: "クライアント資格情報ユーザーID"
|
||||
@@ -967,11 +967,11 @@ ja:
|
||||
custom_field_section: セクション
|
||||
project/phase:
|
||||
date_range: "期間"
|
||||
definition: "Definition"
|
||||
definition: "定義"
|
||||
duration: "Duration"
|
||||
start_date: "Start date"
|
||||
start_date_caption: "Follows the previous phase."
|
||||
finish_date: "Finish date"
|
||||
start_date: "開始日"
|
||||
start_date_caption: "前のフェーズに従います。"
|
||||
finish_date: "終了日"
|
||||
project/phase_definition:
|
||||
name: "名称"
|
||||
color: "色"
|
||||
@@ -1198,7 +1198,7 @@ ja:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -1864,7 +1864,7 @@ ja:
|
||||
#Use the strftime parameters for formats.
|
||||
#When no format has been given, it uses default.
|
||||
#You can provide other formats here if you like!
|
||||
default: "%m/%d/%Y"
|
||||
default: "%Y / %m / %d"
|
||||
long: "%B %d、%Y"
|
||||
short: "%b%d"
|
||||
#Don't forget the nil at the beginning; there's no such thing as a 0th month
|
||||
@@ -1918,7 +1918,7 @@ ja:
|
||||
x_months:
|
||||
other: "%{count} ヶ月間"
|
||||
x_years:
|
||||
other: "%{count} years"
|
||||
other: "%{count} 年"
|
||||
x_seconds:
|
||||
other: "%{count} 秒"
|
||||
x_seconds_abbreviated:
|
||||
@@ -2177,7 +2177,7 @@ ja:
|
||||
long_text_fields:
|
||||
input_caption: "By default all long text fields are selected."
|
||||
input_label: "Add long text fields"
|
||||
input_placeholder: "Search for long text fields"
|
||||
input_placeholder: "長いテキストフィールドを検索"
|
||||
drag_area_label: "Manage long text fields"
|
||||
xls:
|
||||
include_relations:
|
||||
@@ -2813,7 +2813,7 @@ ja:
|
||||
label_password_rule_special: "特殊文字"
|
||||
label_password_rule_uppercase: "大文字"
|
||||
label_path_encoding: "パスのエンコード"
|
||||
label_per_page: "ページ毎"
|
||||
label_per_page: "1ページあたりの件数"
|
||||
label_people: "人"
|
||||
label_permissions: "権限"
|
||||
label_permissions_report: "権限のレポート"
|
||||
@@ -2914,7 +2914,7 @@ ja:
|
||||
label_scroll_left: "Scroll left"
|
||||
label_scroll_right: "Scroll right"
|
||||
label_search: "検索"
|
||||
label_search_by_name: "Search by name"
|
||||
label_search_by_name: "名前で検索"
|
||||
label_send_information: "Send new credentials to the user"
|
||||
label_send_test_email: "テスト電子メールを送信"
|
||||
label_session: "セッション"
|
||||
@@ -3417,7 +3417,7 @@ ja:
|
||||
permission_protect_wiki_pages: "Wikiページの凍結"
|
||||
permission_rename_wiki_pages: "Wikiページ名の変更"
|
||||
permission_save_queries: "ビューを保存"
|
||||
permission_search_project: "Search project"
|
||||
permission_search_project: "プロジェクトを検索"
|
||||
permission_select_custom_fields: "カスタムフィールドの選択"
|
||||
permission_select_project_custom_fields: "プロジェクト属性の選択"
|
||||
permission_select_project_phases: "Select project phases"
|
||||
@@ -3480,7 +3480,7 @@ ja:
|
||||
warning_one: プロジェクトのメンバーは、プロジェクトのリポジトリを再配置する必要があります。
|
||||
warning_two: プロジェクトへの既存のリンクは機能しなくなります。
|
||||
title: プロジェクトの識別子を変更
|
||||
not_available: "Project N/A"
|
||||
not_available: "プロジェクトなし"
|
||||
template:
|
||||
copying: >
|
||||
プロジェクトは選択したテンプレートプロジェクトから作成されています。プロジェクトが利用可能になるとすぐにメールで通知されます。
|
||||
@@ -3889,8 +3889,6 @@ ja:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
@@ -4303,7 +4301,7 @@ ja:
|
||||
reminder: "The reminder you are looking for cannot be found or has been deleted."
|
||||
expected:
|
||||
date: "YYYY-MM-DD (ISO 8601 日付のみ)"
|
||||
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+hh:mm] (any compatible ISO 8601 datetime)"
|
||||
datetime: "YYYY-MM-DDThh:mm:ss[.lll][+h:mm] (ISO 8601形式の日時)"
|
||||
duration: "ISO 8601 期間"
|
||||
invalid_content_type: "コンテンツの種類は'%{content_type}'を期待されたが '%{actual}'を得ました。"
|
||||
invalid_format: "不正なフォーマットのプロパティ '%{property}': 期待されるフォーマットは '%{expected_format}', ですが '%{actual}'を受け取りました."
|
||||
|
||||
@@ -274,10 +274,10 @@ de:
|
||||
change_button: "Speichern und neu planen"
|
||||
change_title: "Arbeitstage ändern"
|
||||
removed_title: "Sie werden die folgenden Tage aus der Liste der arbeitsfreien Tage entfernen:"
|
||||
change_description: "Changing which days of the week are considered working days or non-working days can affect the start and finish days of all work packages and life cycles in all projects in this instance."
|
||||
change_description: "Die Änderung der Wochentage, die als Arbeitstage oder arbeitsfreie Tage gelten, kann sich auf die Start- und Endtage aller Arbeitspakete und Projektphasen in allen Projekten auswirken."
|
||||
warning: >
|
||||
The changes might take some time to take effect. You will be notified when all relevant work packages and project life cycles have been updated.
|
||||
Are you sure you want to continue?
|
||||
Es kann einige Zeit dauern, bis die Änderungen wirksam werden. Sie werden benachrichtigt, wenn alle relevanten Arbeitspakete und Projektphasen aktualisiert worden sind.
|
||||
Sind Sie sicher, dass Sie fortfahren möchten?
|
||||
work_packages_settings:
|
||||
warning_progress_calculation_mode_change_from_status_to_field_html: >-
|
||||
Wenn Sie den Modus der Fortschrittsberechnung von statusbasiert auf arbeitsbasiert ändern, ist das Feld <i>% abgeschlossen</i> frei editierbar. Wenn Sie optional Werte für <i>Aufwand</i> oder <i>Verbleibenden Aufwand</i> eingeben, werden diese auch mit <i>% abgeschlossen</i> verknüpft. Eine Änderung des <i>verbleibenden Aufwands</i> aktualisiert dann <i>% abgschlossen</i>.
|
||||
|
||||
@@ -277,8 +277,7 @@ es:
|
||||
removed_title: "Eliminará los siguientes días de la lista de días no laborables:"
|
||||
change_description: "Changing which days of the week are considered working days or non-working days can affect the start and finish days of all work packages and life cycles in all projects in this instance."
|
||||
warning: >
|
||||
The changes might take some time to take effect. You will be notified when all relevant work packages and project life cycles have been updated.
|
||||
Are you sure you want to continue?
|
||||
|
||||
work_packages_settings:
|
||||
warning_progress_calculation_mode_change_from_status_to_field_html: >-
|
||||
Cambiar el modo de cálculo del progreso de basado en el estado a basado en el trabajo hará que el campo <i>% completado</i> se pueda editar libremente. Si introduce opcionalmente valores para <i>Trabajo</i> o <i>Trabajo restante</i>, también se vincularán a <i>% completado</i>. Cambiar <i>Trabajo restante</i> puede entonces actualizar <i>% completado</i>.
|
||||
|
||||
@@ -1042,7 +1042,7 @@ ja:
|
||||
tomorrow: "Tomorrow"
|
||||
three_days: "In 3 days"
|
||||
week: "In a week"
|
||||
month: "In a month"
|
||||
month: "1ヶ月以内"
|
||||
custom: "At a particular date/time"
|
||||
scheduling:
|
||||
is_parent: "このワークパッケージの日付は、その子から自動的に推定されます。日付を設定するには、「手動スケジューリング」を有効にします。"
|
||||
|
||||
@@ -274,10 +274,10 @@ ro:
|
||||
change_button: "Salvează și reprogramează"
|
||||
change_title: "Modifică zilelor lucrătoare"
|
||||
removed_title: "Veţi elimina următoarele zile din lista de zile nelucrătoare:"
|
||||
change_description: "Changing which days of the week are considered working days or non-working days can affect the start and finish days of all work packages and life cycles in all projects in this instance."
|
||||
change_description: "Schimbarea zilelor din săptămână care sunt considerate zile lucrătoare sau zile nelucrătoare poate afecta zilele de începere și de încheiere a tuturor pachetelor de lucru și ciclurilor de viață în toate proiectele, în acest caz."
|
||||
warning: >
|
||||
The changes might take some time to take effect. You will be notified when all relevant work packages and project life cycles have been updated.
|
||||
Are you sure you want to continue?
|
||||
Modificările ar putea dura ceva timp pentru a produce efecte. Vei fi notificat când toate pachetele de lucru relevante și ciclurile de viață ale proiectului au fost actualizate.
|
||||
Ești sigur că vrei să continui?
|
||||
work_packages_settings:
|
||||
warning_progress_calculation_mode_change_from_status_to_field_html: >-
|
||||
Changing progress calculation mode from status-based to work-based will make the <i>% Complete</i> field freely editable. If you optionally enter values for <i>Work</i> or <i>Remaining work</i>, they will also be linked to <i>% Complete</i>. Changing <i>Remaining work</i> can then update <i>% Complete</i>.
|
||||
@@ -360,7 +360,7 @@ ro:
|
||||
"16_1":
|
||||
standard:
|
||||
new_features_html: >
|
||||
The release contains various new features and improvements, such as <br> <ul class="%{list_styling_class}"> <li>Structure the project life cycle with phases and phase gates.</li> <li>Export meetings in PDF format.</li> <li>Set smart default options for reminders.</li> <li>Use negative lag for work package dates.</li> <li>Display hierarchy trees for hierarchy custom fields.</li> <li>Benefit from improved accessibility for the date picker with ARIA live regions.</li> </ul>
|
||||
Publicarea conține diverse caracteristici noi și îmbunătățiri, cum ar fi <br> <ul class="%{list_styling_class}"> <li>Structura ciclul de viață al proiectului cu etape și faze.</li> <li>Ședințe la export în format PDF.</li> <li>Setează opțiuni implicite inteligente pentru mementouri.</li> <li>Utilizați decalajul negativ pentru pachetele de lucru.</li> <li>Afișați copaci ierarhici pentru câmpuri personalizate ierarhice.</li> <li>Beneficiază de o mai bună accesibilitate pentru selectorul de date cu regiunile vii ARIA</li> </ul>
|
||||
ical_sharing_modal:
|
||||
title: "Subscribe to calendar"
|
||||
inital_setup_error_message: "An error occured while fetching data."
|
||||
@@ -592,7 +592,7 @@ ro:
|
||||
drag: "Trage și aruncă cartonașele dintr-o listă dată pentru a le reordona sau muta în altă listă. <br> Poți da click pe pictograma (i) din colțul din dreapta sus sau poți face dublu clic pe un card pentru a-i deschide detaliile."
|
||||
wp:
|
||||
toggler: "Acum să ne uităm la secțiunea <b>Pachet de lucru</b>, care vă oferă o vizualizare mai detaliată a activității dumneavoastră."
|
||||
list: "Acest pachet <b>de lucru</b> oferă o listă a tuturor activităților din proiectul tău, cum ar fi sarcini, jaloane, faze și altele. <br> Pachetele de lucru pot fi create și editate direct din acest punct de vedere. Pentru a accesa detaliile unui anumit pachet de lucru, faceți dublu clic pe rând."
|
||||
list: "Acest pachet <b>de lucru</b> oferă o listă a tuturor activităților din proiectul tău, cum ar fi sarcini, jaloane, faze și altele. <br> Pachetele de lucru pot fi create și editate direct din acest punct de vedere. Pentru a accesa detaliile unui anumit pachet de lucru, fă dublu clic pe rând."
|
||||
full_view: "Vizualizarea <b>pentru detaliile pachetului de lucru</b> furnizează toate informațiile relevante referitoare la un anumit pachet de lucru, cum ar fi descrierea, starea, prioritatea, activitățile, dependențele si comentariile."
|
||||
back_button: "Utilizează săgeata de întoarcere din colțul din stânga sus pentru a ieși și pentru a reveni la lista pachetelor de lucru."
|
||||
create_button: "Butonul <b>Creează</b> va adăuga un nou pachet de lucru la proiectul tău."
|
||||
|
||||
@@ -215,12 +215,12 @@ ru:
|
||||
label_company: "Компания"
|
||||
label_first_name: "Имя"
|
||||
label_last_name: "Фамилия"
|
||||
label_domain: "Домен"
|
||||
label_domain: "Доменное имя"
|
||||
label_subscriber: "Подписчик"
|
||||
label_maximum_users: "Максимальное число активных пользователей"
|
||||
label_starts_at: "Начиная с"
|
||||
label_expires_at: "Срок действия до"
|
||||
label_plan: "План"
|
||||
label_plan: "Подписка"
|
||||
label_additional_features: "Дополнительные возможности"
|
||||
receive_newsletter: Я хочу получать <a target="_blank" href="%{link}">новостную рассылку от OpenProject</a>.
|
||||
taken_domain: На каждом домене может быть только один активный пробный период.
|
||||
@@ -274,10 +274,10 @@ ru:
|
||||
change_button: "Сохранить и перенести"
|
||||
change_title: "Изменить рабочие дни"
|
||||
removed_title: "Следующие дни будут удалены из списка нерабочих дней:"
|
||||
change_description: "Changing which days of the week are considered working days or non-working days can affect the start and finish days of all work packages and life cycles in all projects in this instance."
|
||||
change_description: "Изменение дней недели, считающихся рабочими или нерабочими днями, может повлиять на начало и завершение всех пакетов работ и жизненных циклов во всех проектах."
|
||||
warning: >
|
||||
The changes might take some time to take effect. You will be notified when all relevant work packages and project life cycles have been updated.
|
||||
Are you sure you want to continue?
|
||||
Для вступления изменений в силу может потребоваться некоторое время. Вы будете уведомлены, когда все соответствующие пакеты работ и жизненные циклы проектов будут обновлены.
|
||||
Хотите продолжить?
|
||||
work_packages_settings:
|
||||
warning_progress_calculation_mode_change_from_status_to_field_html: >-
|
||||
При изменении расчета прогресса с режима "На основе статуса" на режим "На основе трудозатрат" поле <i>% завершения</i> станет редактируемым. Если Вы дополнительно введете значения для <i>Предполагаемого времени</i> или <i>Оставшихся часов</i>, они также будут связаны с <i>% завершения</i>. Изменение значения <i>Оставшихся часов</i> может привести к обновлению <i>% завершения</i>.
|
||||
@@ -360,7 +360,7 @@ ru:
|
||||
"16_1":
|
||||
standard:
|
||||
new_features_html: >
|
||||
Релиз содержит различные новые функции и улучшения, например <br> <ul class="%{list_styling_class}"> <li>Структура жизненного цикла проекта с этапами и стадиями.</li> <li>Экспорт совещаний в формате PDF.</li> <li>Установка смарт-параметров по умолчанию для напоминаний.</li> <li>Использование отрицательного лага для даты пакета работ.</li> <li>Отображение иерархических деревьев для иерархии пользовательских полей.</li> <li>Улучшение доступности для выбора даты с ARIA регионами.</li> </ul>
|
||||
Релиз содержит различные новые функции и улучшения, например <br> <ul class="%{list_styling_class}"> <li>Структура жизненного цикла проекта с этапами и стадиями.</li> <li>Экспорт совещаний в формате PDF.</li> <li>Установка смарт-параметров по умолчанию для напоминаний.</li> <li>Использование отрицательной задержки для даты пакета работ.</li> <li>Отображение иерархических деревьев для иерархии пользовательских полей.</li> <li>Улучшение доступности для выбора даты с ARIA регионами.</li> </ul>
|
||||
ical_sharing_modal:
|
||||
title: "Подписаться на календарь"
|
||||
inital_setup_error_message: "Произошла ошибка при получении данных."
|
||||
|
||||
@@ -275,10 +275,10 @@ zh-CN:
|
||||
change_button: "保存并重新安排"
|
||||
change_title: "更改工作日"
|
||||
removed_title: "您将从非工作日列表中删除以下日期:"
|
||||
change_description: "Changing which days of the week are considered working days or non-working days can affect the start and finish days of all work packages and life cycles in all projects in this instance."
|
||||
change_description: "在这种情况下,更改一周中哪几天被视为工作日或非工作日会影响所有项目中所有工作包和生命周期的开始和结束日期。"
|
||||
warning: >
|
||||
The changes might take some time to take effect. You will be notified when all relevant work packages and project life cycles have been updated.
|
||||
Are you sure you want to continue?
|
||||
更改可能需要一些时间才能生效。所有相关工作包和项目生命周期更新后,您将收到通知。
|
||||
您确定要继续吗?
|
||||
work_packages_settings:
|
||||
warning_progress_calculation_mode_change_from_status_to_field_html: >-
|
||||
将进度计算模式从基于状态改为基于工时,将使<i>完成 %</i>字段可自由编辑。如果您选择输入<i>工时</i>或<i>剩余工时</i>的值,它们也将与<i>完成 %</i>相关联。更改<i>剩余工时</i>就可以更新<i>完成 %</i>。
|
||||
|
||||
@@ -1206,7 +1206,7 @@ zh-TW:
|
||||
invite_to_project: "邀請%{type} 加入 %{project}"
|
||||
User: "使用者"
|
||||
Group: "群組"
|
||||
PlaceholderUser: "占位使用者"
|
||||
PlaceholderUser: "佔位使用者"
|
||||
invite_principal_to_project: "邀請 %{principal} 加入 %{project}"
|
||||
project:
|
||||
label: "專案"
|
||||
@@ -1225,7 +1225,7 @@ zh-TW:
|
||||
title: "群組"
|
||||
description: "基於所選專案中所分配角色的權限"
|
||||
placeholder:
|
||||
title: "占位使用者"
|
||||
title: "佔位使用者"
|
||||
title_no_ee: "佔位使用者(僅限企業版附加元件)"
|
||||
description: "無法訪問該專案並且未發送電子郵件。"
|
||||
description_no_ee: '由於沒有存取專案權限,所以不會發送電子郵件。<br>請查看<a href="%{eeHref}" target="_blank">企業版</a>。'
|
||||
@@ -1242,7 +1242,7 @@ zh-TW:
|
||||
next_button: "下一個"
|
||||
required:
|
||||
user: "請選擇一個使用者"
|
||||
placeholder: "請選擇占位使用者"
|
||||
placeholder: "請選擇佔位使用者"
|
||||
group: "請選擇一個群組"
|
||||
role:
|
||||
label: "%{project} 中的角色"
|
||||
|
||||
@@ -1208,7 +1208,7 @@ ka:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3932,8 +3932,6 @@ ka:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1208,7 +1208,7 @@ kk:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3932,8 +3932,6 @@ kk:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1200,7 +1200,7 @@ ko:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "파일의 콘텐츠 유형은 비워둘 수 없습니다."
|
||||
not_whitelisted: "파일이 자동 필터에 의해 거부되었습니다. '%{value}'은(는) 업로드 허용 목록에 등록되지 않았습니다."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3888,8 +3888,6 @@ ko:
|
||||
new:
|
||||
description: "이 프로젝트 단계의 변경 사항은 이 단계가 활성화된 모든 프로젝트에 반영됩니다."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "시작 및 완료 게이트"
|
||||
no_gate: "게이트 없음"
|
||||
start_gate: "시작 게이트"
|
||||
|
||||
@@ -1221,7 +1221,7 @@ lt:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "Failo turinio tipas negali būti tuščias."
|
||||
not_whitelisted: "Failą atmetė automatinis filtras. „%{value}“ nėra tinkamas įkėlimui."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -4008,8 +4008,6 @@ lt:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1216,7 +1216,7 @@ lv:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3973,8 +3973,6 @@ lv:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1208,7 +1208,7 @@ mn:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3932,8 +3932,6 @@ mn:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1198,7 +1198,7 @@ ms:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "Jenis kandungan fail tidak boleh kosong."
|
||||
not_whitelisted: "Fail ditolak oleh penyaring automatik. '%{value}' tidak diluluskan untuk dimuat naik."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3888,8 +3888,6 @@ ms:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1208,7 +1208,7 @@ ne:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3932,8 +3932,6 @@ ne:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1204,7 +1204,7 @@ nl:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "Het inhoudstype van het bestand mag niet leeg zijn."
|
||||
not_whitelisted: "Het bestand is geweigerd door een automatisch filter. '%{value}' is niet gewhitelist voor uploaden."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3927,8 +3927,6 @@ nl:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1207,7 +1207,7 @@
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "Filens innholdstype kan ikke være tom."
|
||||
not_whitelisted: "Filen ble avvist av et automatisk filter. '%{value}' er ikke hvitelistet for opplasting."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3931,8 +3931,6 @@
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1220,7 +1220,7 @@ pl:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "Zawartość tego typu zwartości nie może być pusta."
|
||||
not_whitelisted: "Plik został odrzucony przez automatyczny filtr. '%{value}' nie jest na białej liście do przesyłania."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -4007,8 +4007,6 @@ pl:
|
||||
new:
|
||||
description: "Zmiany w tej fazie projektu zostaną odzwierciedlone we wszystkich projektach, w których jest ona włączona."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Bramka początkowa i końcowa"
|
||||
no_gate: "Brak bramki"
|
||||
start_gate: "Bramka początkowa"
|
||||
|
||||
@@ -1205,7 +1205,7 @@ pt-BR:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "O tipo de conteúdo do arquivo não pode ficar em branco."
|
||||
not_whitelisted: "O arquivo foi rejeitado por um filtro automático. '%{value}' não está na lista de permissões para ser enviado."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3928,8 +3928,6 @@ pt-BR:
|
||||
new:
|
||||
description: "As alterações nesta fase do projeto serão aplicadas a todos os projetos nos quais ela esteja ativada."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Controle inicial e controle final"
|
||||
no_gate: "Sem controle"
|
||||
start_gate: "Data inicial"
|
||||
|
||||
@@ -1205,7 +1205,7 @@ pt-PT:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "O tipo de conteúdo do ficheiro não pode ficar em branco."
|
||||
not_whitelisted: "O ficheiro foi rejeitado por um filtro automático. '%{value}' não está na lista branca para upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3926,8 +3926,6 @@ pt-PT:
|
||||
new:
|
||||
description: "As alterações a esta fase do projeto serão refletidas em todos os projetos em que estiver ativada."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Porta de início e conclusão"
|
||||
no_gate: "Sem porta"
|
||||
start_gate: "Porta de início"
|
||||
|
||||
@@ -36,13 +36,13 @@ ro:
|
||||
name: Negru
|
||||
project_phase_colors:
|
||||
item_0:
|
||||
name: PM2 Orange
|
||||
name: PM2 Portocaliu
|
||||
item_1:
|
||||
name: PM2 Red
|
||||
name: PM2 Roșu
|
||||
item_2:
|
||||
name: PM2 Magenta
|
||||
item_3:
|
||||
name: PM2 Green Yellow
|
||||
name: PM2 Verde Galben
|
||||
document_categories:
|
||||
item_0:
|
||||
name: Documentație
|
||||
@@ -81,16 +81,16 @@ ro:
|
||||
standard:
|
||||
project_phases:
|
||||
item_0:
|
||||
name: Initiating
|
||||
name: Inițializare
|
||||
item_1:
|
||||
name: Planificare
|
||||
start_gate: Ready for Planning
|
||||
start_gate: Gata pentru planificare
|
||||
item_2:
|
||||
name: Executing
|
||||
start_gate: Ready for Executing
|
||||
name: Execuție
|
||||
start_gate: Gata de execuție
|
||||
item_3:
|
||||
name: Closing
|
||||
start_gate: Ready for Closing
|
||||
name: Închidere
|
||||
start_gate: Gata pentru închidere
|
||||
priorities:
|
||||
item_0:
|
||||
name: Scăzută
|
||||
|
||||
@@ -387,14 +387,14 @@ ro:
|
||||
no_results_title_text: În acest moment nu există câmpuri personalizate disponibile.
|
||||
life_cycle:
|
||||
header:
|
||||
title: "Project life cycle"
|
||||
description_html: "The active project phases define this project's life cycle and are defined in the <a href=%{admin_settings_url} target=\"_blank\">administration settings</a>. Enabled phases will be displayed in your <a href=%{overview_url} target=\"_blank\">project overview</a>."
|
||||
non_defined: "No phases are currently defined."
|
||||
section_header: "Phases"
|
||||
title: "Ciclul de viață proiect"
|
||||
description_html: "Fazele de proiect active definesc ciclul de viață al acestui proiect și sunt definite în setările de administrare <a href=%{admin_settings_url} target=\"_blank\"></a>. Fazele activate vor fi afișate în prezentarea generală <a href=%{overview_url} target=\"_blank\">a proiectului tău</a>."
|
||||
non_defined: "Nici o fază nu este definită."
|
||||
section_header: "Faze"
|
||||
step:
|
||||
use_in_project: "Use %{step} in this project"
|
||||
use_in_project: "Utilizează %{step} în acest proiect"
|
||||
filter:
|
||||
label: "Search project phase"
|
||||
label: "Caută fază proiect"
|
||||
project_custom_fields:
|
||||
header:
|
||||
title: "Atributele proiectului"
|
||||
@@ -985,18 +985,18 @@ ro:
|
||||
custom_field_section: Secțiune
|
||||
project/phase:
|
||||
date_range: "Interval calendaristic"
|
||||
definition: "Definition"
|
||||
duration: "Duration"
|
||||
start_date: "Start date"
|
||||
start_date_caption: "Follows the previous phase."
|
||||
finish_date: "Finish date"
|
||||
definition: "Definiţie"
|
||||
duration: "Durată"
|
||||
start_date: "Dată început"
|
||||
start_date_caption: "Urmează faza anterioară."
|
||||
finish_date: "Dată finalizare"
|
||||
project/phase_definition:
|
||||
name: "Nume"
|
||||
color: "Culoare"
|
||||
start_gate: "Start phase gate"
|
||||
start_gate_name: "Start phase gate name"
|
||||
finish_gate: "Finish phase gate"
|
||||
finish_gate_name: "Finish phase gate name"
|
||||
start_gate: "Înecput poartă fază"
|
||||
start_gate_name: "Nume început poartă fază"
|
||||
finish_gate: "Final poartă fază"
|
||||
finish_gate_name: "Nume final poartă fază"
|
||||
query:
|
||||
sums: "Sums"
|
||||
columns: "Coloane"
|
||||
@@ -1216,7 +1216,7 @@ ro:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "Tipul de conținut al fișierului nu poate fi necompletat."
|
||||
not_whitelisted: "Fişierul a fost respins de un filtru automat. '%{value}' nu este whitelisted pentru încărcare."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -1302,11 +1302,11 @@ ro:
|
||||
project/phase:
|
||||
attributes:
|
||||
start_date:
|
||||
must_be_before_finish_date: "must be before the finish date."
|
||||
non_continuous_dates: "can't be earlier than the previous phase's end date."
|
||||
must_be_before_finish_date: "trebuie să fie înainte de data finală."
|
||||
non_continuous_dates: "nu poate fi mai devreme de data de încheiere a fazei anterioare."
|
||||
finish_date:
|
||||
must_be_after_start_date: "must be after the start date."
|
||||
cannot_be_a_non_working_day: "can't be a non-working day."
|
||||
must_be_after_start_date: "trebuie să fie după dată început."
|
||||
cannot_be_a_non_working_day: "nu poate fi o zi nelucrătoare."
|
||||
query:
|
||||
attributes:
|
||||
project:
|
||||
@@ -1617,14 +1617,14 @@ ro:
|
||||
wiki_edit: "Wiki"
|
||||
work_package: "Pachete de lucru"
|
||||
project_phase:
|
||||
activated: "Activat"
|
||||
added_date: "set to %{date}"
|
||||
changed_date: "changed from %{from} to %{to}"
|
||||
deactivated: "Dezactivat"
|
||||
deleted_project_phase: "Deleted project phase"
|
||||
phase_and_both_gates: "%{phase_message}. %{start_gate_message}, and %{finish_gate_message}"
|
||||
activated: "activat"
|
||||
added_date: "setează la %{date}"
|
||||
changed_date: "schimbat de la %{from} la %{to}"
|
||||
deactivated: "dezactivat"
|
||||
deleted_project_phase: "Fază proiect ștearsă"
|
||||
phase_and_both_gates: "%{phase_message}. %{start_gate_message}, și %{finish_gate_message}"
|
||||
phase_and_one_gate: "%{phase_message}. %{gate_message}"
|
||||
removed_date: "date deleted %{date}"
|
||||
removed_date: "dată ștearsă %{date}"
|
||||
#common attributes of all models
|
||||
attributes:
|
||||
active: "Activ"
|
||||
@@ -1691,8 +1691,8 @@ ro:
|
||||
priority: "Prioritate"
|
||||
project: "Proiect"
|
||||
project_ids: "Project IDs"
|
||||
project_phase: "Project phase"
|
||||
project_phase_definition: "Project phase"
|
||||
project_phase: "Fază proiect"
|
||||
project_phase_definition: "Fază proiect"
|
||||
reason: "Motiv"
|
||||
responsible: "Responsabil"
|
||||
required: "Obligatoriu"
|
||||
@@ -2047,7 +2047,7 @@ ro:
|
||||
internal_comments: Comentarii interne
|
||||
custom_actions: Custom Actions
|
||||
custom_field_hierarchies: Custom fields of type hierarchy
|
||||
customize_life_cycle: Customize Life Cycle
|
||||
customize_life_cycle: Personalizează ciclul de viață
|
||||
date_alerts: Date Alerts
|
||||
define_custom_style: Custom theme and logo
|
||||
edit_attribute_groups: Edit Attribute Groups
|
||||
@@ -2080,7 +2080,7 @@ ro:
|
||||
work_package_subject_generation:
|
||||
description: "Create automatically generated subjects using referenced attributes and text."
|
||||
customize_life_cycle:
|
||||
description: "Create and organize different project phases than the ones provided by PM2 project cycle planning."
|
||||
description: "Creează și organizează diferite faze de proiect decât cele furnizate de planificarea ciclului proiectului PM2."
|
||||
conditional_highlighting:
|
||||
description: "Need certain work packages to stand out from the mass? Use conditional highlighting in the work packages table."
|
||||
work_package_query_relation_columns:
|
||||
@@ -2869,7 +2869,7 @@ ro:
|
||||
label_none_parentheses: "(niciuna)"
|
||||
label_not_contains: "nu conține"
|
||||
label_not_equals: "nu este"
|
||||
label_life_cycle_step_plural: "Project life cycle"
|
||||
label_life_cycle_step_plural: "Ciclul de viață proiect"
|
||||
label_on: "pe"
|
||||
label_operator_all: "nu este gol"
|
||||
label_operator_none: "este gol"
|
||||
@@ -2931,7 +2931,7 @@ ro:
|
||||
label_project_new: "Proiect nou"
|
||||
label_project_plural: "Proiecte"
|
||||
label_project_list_plural: "Listă proiecte"
|
||||
label_project_life_cycle: "Project life cycle"
|
||||
label_project_life_cycle: "Ciclul de viață proiect"
|
||||
label_project_attributes_plural: "Atribute proiect"
|
||||
label_project_custom_field_plural: "Atribute proiect"
|
||||
label_project_settings: "Setările proiectului"
|
||||
@@ -3473,7 +3473,7 @@ ro:
|
||||
permission_edit_others_internal_comments_explanation: "Atenție: Utilizatorii cu această permisiune pot edita comentariile interne ale altor utilizatori."
|
||||
permission_edit_project: "Editare proiect"
|
||||
permission_edit_project_attributes: "Edit project attributes"
|
||||
permission_edit_project_phases: "Edit project phases"
|
||||
permission_edit_project_phases: "Editează faze proiect"
|
||||
permission_edit_reportings: "Editare raportări"
|
||||
permission_edit_time_entries: "Editează jurnalele de timp pentru alți utilizatori"
|
||||
permission_edit_timelines: "Editare linii de timp"
|
||||
@@ -3503,8 +3503,8 @@ ro:
|
||||
permission_search_project: "Caută proiect"
|
||||
permission_select_custom_fields: "Selectează câmpuri personalizate"
|
||||
permission_select_project_custom_fields: "Select project attributes"
|
||||
permission_select_project_phases: "Select project phases"
|
||||
permission_select_project_phases_explanation: "Activate/Deactivate the phases in a project. Enables the user to select the life cycle appropriate for the project as inactive phases will not be visible in the project overview page nor the project list."
|
||||
permission_select_project_phases: "Selectează faze proiect"
|
||||
permission_select_project_phases_explanation: "Activează/Dezactivează fazele unui proiect. Permite utilizatorului să selecteze ciclul de viață potrivit pentru proiect ca fazele inactive nu vor fi vizibile în pagina de ansamblu a proiectului și nici în lista de proiecte."
|
||||
permission_select_project_modules: "Selectare module proiect"
|
||||
permission_share_work_packages: "Partajare pachete de lucru"
|
||||
permission_manage_types: "Selectare tipuri"
|
||||
@@ -3530,7 +3530,7 @@ ro:
|
||||
permission_work_package_assigned_explanation: "Pachetele de lucru pot fi atribuite utilizatorilor și grupurilor care dețin acest rol în proiectul respectiv"
|
||||
permission_view_project_activity: "Vezi activitate proiect"
|
||||
permission_view_project_attributes: "Vezi atribute proiect"
|
||||
permission_view_project_phases: "View project phases"
|
||||
permission_view_project_phases: "Vezi faze proiect"
|
||||
permission_save_bcf_queries: "Save BCF queries"
|
||||
permission_manage_public_bcf_queries: "Manage public BCF queries"
|
||||
permission_edit_attribute_help_texts: "Edit attribute help texts"
|
||||
@@ -3556,9 +3556,9 @@ ro:
|
||||
subprojects_confirmation: "Se vor șterge și sub-proiectul/sub-proiectele: %{value}."
|
||||
title: "Ștergere proiect %{name}"
|
||||
filters:
|
||||
project_phase: "Project phase: %{phase}"
|
||||
project_phase_any: "Project phase: Any"
|
||||
project_phase_gate: "Project phase gate: %{gate}"
|
||||
project_phase: "Fază proiect: %{phase}"
|
||||
project_phase_any: "Fază proiect: Oricare"
|
||||
project_phase_gate: "Poartă fază proiect: %{gate}"
|
||||
identifier:
|
||||
warning_one: Participanții la proiect vor trebui să mute arhivele proiectului.
|
||||
warning_two: Legăturile existente la acest proiect nu vor mai funcționa.
|
||||
@@ -3960,26 +3960,24 @@ ro:
|
||||
heading: "New attribute"
|
||||
description: "Modificările la acest atribut al proiectului se vor reflecta în toate proiectele în care este activată. Atributele necesare nu pot fi dezactivate pentru fiecare proiect."
|
||||
project_phase_definitions:
|
||||
heading: "Project life cycle"
|
||||
heading_description: "Project life cycle define the project phases that can be used for your project planning and will appear in the overview page of each project. These attributes can be enabled or disabled but not re-ordered at a project level."
|
||||
heading: "Ciclul de viață proiect"
|
||||
heading_description: "Ciclul de viață al proiectului definește fazele proiectului care pot fi utilizate pentru planificarea proiectului și vor apărea în pagina de ansamblu a fiecărui proiect. Aceste atribute pot fi activate sau dezactivate, dar nu pot fi reordonate la nivel de proiect."
|
||||
label_add: "Adaugă"
|
||||
label_add_description: "Add project phase definition"
|
||||
label_add_description: "Adaugă definiție fază proiect"
|
||||
filter:
|
||||
label: "Search project phase"
|
||||
section_header: "Phases"
|
||||
non_defined: "No phases are currently defined."
|
||||
phase_gates: "Phase gates"
|
||||
label: "Caută fază proiect"
|
||||
section_header: "Faze"
|
||||
non_defined: "Nicio fază nu este definită."
|
||||
phase_gates: "Porți fază"
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
start_gate_caption: "Add a gate with the start date of the phase"
|
||||
finish_gate: "Finish gate"
|
||||
finish_gate_caption: "Add a gate with the end date of the phase"
|
||||
description: "Modificările aduse acestei faze de proiect se vor reflecta în toate proiectele în care aceasta este activată."
|
||||
heading: "Fază nouă"
|
||||
both_gate: "Început și final poartă"
|
||||
no_gate: "Fără poartă"
|
||||
start_gate: "Poartă început"
|
||||
start_gate_caption: "Adăugați o poartă cu data de începere a fazei"
|
||||
finish_gate: "Poartă final"
|
||||
finish_gate_caption: "Adăugă o poartă cu data de final a fazei"
|
||||
projects:
|
||||
missing_dependencies: "Project module %{module} was checked which depends on %{dependencies}. You need to check these dependencies as well."
|
||||
section_new_projects: "Setări pentru proiecte noi"
|
||||
@@ -4018,7 +4016,7 @@ ro:
|
||||
text_are_you_sure_continue: "Sigur dorești să continui?"
|
||||
text_are_you_sure_with_children: "Doriți ștergerea pachetului de lucru și a tuturor pachetelor fii?"
|
||||
text_are_you_sure_with_project_custom_fields: "Deleting this attribute will also delete its values in all projects. Are you sure you want to do this?"
|
||||
text_are_you_sure_with_project_life_cycle_step: "Deleting this phase will also delete its usages in all projects. Are you sure you want to do this?"
|
||||
text_are_you_sure_with_project_life_cycle_step: "Ștergerea acestei faze va șterge și utilizarea sa în toate proiectele. Ești sigur că vrei să faci asta?"
|
||||
text_assign_to_project: "Alocare la proiect"
|
||||
text_form_configuration: >
|
||||
Puteți personaliza ce câmpuri vor fi afișate în formularele pachetelor de lucru. Puteți grupa în mod liber câmpurile pentru a reflecta nevoile domeniului dumneavoastră.
|
||||
@@ -4350,12 +4348,12 @@ ro:
|
||||
message: "Partajarea listelor de proiecte cu utilizatorii individuali este un add-on Enterprise."
|
||||
working_days:
|
||||
info: >
|
||||
Days that are not selected are skipped when scheduling work packages and project life cycles (and not included in the day count). These can be overridden at a work-package level.
|
||||
Zile care nu sunt selectate sunt omise când se programează pachetele de lucru și ciclul de viață al proiectului (și nu sunt incluse în numărul zilelor). Acestea pot fi suprascrise la nivelul pachetului de lucru.
|
||||
instance_wide_info: >
|
||||
Dates added to the list below are considered non-working and skipped when scheduling work packages.
|
||||
change_button: "Modifică zilelor lucrătoare"
|
||||
warning: >
|
||||
Changing which days of the week are considered working days or non-working days can affect the start and finish days of all work packages and life cycles in all projects in this instance.
|
||||
Schimbarea zilelor din săptămână care sunt considerate zile lucrătoare sau zile nelucrătoare poate afecta zilele de începere și de încheiere a tuturor pachetelor de lucru și ciclurilor de viață în toate proiectele, în acest caz.
|
||||
journal_note:
|
||||
changed: _**Zile lucrătoare** schimbate (%{changes})._
|
||||
days:
|
||||
|
||||
@@ -773,7 +773,7 @@ ru:
|
||||
label_edit_x: "Редактировать %{x}"
|
||||
label_add_description: "Добавить описание"
|
||||
lag:
|
||||
subject: "Отставание"
|
||||
subject: "Задержка"
|
||||
caption: |-
|
||||
Минимальное количество рабочих дней, которое должно быть между двумя пакетами работ.
|
||||
Оно также может быть отрицательным.
|
||||
@@ -923,7 +923,7 @@ ru:
|
||||
emoji_reaction:
|
||||
reactable: "Реакция на"
|
||||
enterprise_token:
|
||||
domain: "Домен"
|
||||
domain: "Доменное имя"
|
||||
starts_at: "Действует с"
|
||||
subscriber: "Подписчик"
|
||||
encoded_token: "Маркер поддержки корпоративной версии"
|
||||
@@ -1029,7 +1029,7 @@ ru:
|
||||
include_subprojects: "Включить подпроекты"
|
||||
results: "Результаты"
|
||||
relation:
|
||||
lag: "Отставание"
|
||||
lag: "Задержка"
|
||||
from: "Похожий пакет работ"
|
||||
to: "Похожий пакет работ"
|
||||
relation_type: "Тип отношения"
|
||||
@@ -1222,7 +1222,7 @@ ru:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "Тип содержимого файла не может быть пустым."
|
||||
not_whitelisted: "Файл был отклонен автоматическим фильтром. '%{value}' не является белым списком для загрузки."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -4009,8 +4009,6 @@ ru:
|
||||
new:
|
||||
description: "Изменения на этом этапе проекта будут отражены во всех проектах, где он включен."
|
||||
heading: "Новый этап"
|
||||
edit:
|
||||
heading: "Изменить этап"
|
||||
both_gate: "Начать и завершить стадию"
|
||||
no_gate: "Нет стадии"
|
||||
start_gate: "Начать стадию"
|
||||
@@ -4387,12 +4385,12 @@ ru:
|
||||
message: "Совместное использование списков проектов с отдельными пользователями является корпоративным дополнением."
|
||||
working_days:
|
||||
info: >
|
||||
Days that are not selected are skipped when scheduling work packages and project life cycles (and not included in the day count). These can be overridden at a work-package level.
|
||||
Невыбранные дни пропускаются при планировании пакетов работ и жизненного цикла проекта (и не включаются в подсчет дней). Они могут быть переопределены на уровне пакетов работ.
|
||||
instance_wide_info: >
|
||||
Даты, добавленные в список ниже, считаются нерабочими и пропускаются при планировании пакетов работ.
|
||||
change_button: "Изменить рабочие дни"
|
||||
warning: >
|
||||
Changing which days of the week are considered working days or non-working days can affect the start and finish days of all work packages and life cycles in all projects in this instance.
|
||||
Изменение дней недели, считающихся рабочими или нерабочими днями, может повлиять на начало и завершение всех пакетов работ и жизненных циклов во всех проектах.
|
||||
journal_note:
|
||||
changed: _**Рабочие дни** изменены (%{changes})._
|
||||
days:
|
||||
|
||||
@@ -1208,7 +1208,7 @@ rw:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3932,8 +3932,6 @@ rw:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1208,7 +1208,7 @@ si:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3932,8 +3932,6 @@ si:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1224,7 +1224,7 @@ sk:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -4013,8 +4013,6 @@ sk:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1223,7 +1223,7 @@ sl:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -4012,8 +4012,6 @@ sl:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1216,7 +1216,7 @@ sr:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3973,8 +3973,6 @@ sr:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1208,7 +1208,7 @@ sv:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3930,8 +3930,6 @@ sv:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1200,7 +1200,7 @@ th:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3891,8 +3891,6 @@ th:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1207,7 +1207,7 @@ tr:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "Dosyanın içerik türü boş olamaz."
|
||||
not_whitelisted: "Dosya, otomatik bir filtre tarafından reddedildi. '%{value}' yükleme için beyaz listeye alınmadı."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3929,8 +3929,6 @@ tr:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1217,7 +1217,7 @@ uk:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "Тип контенту файлу не може бути пустий."
|
||||
not_whitelisted: "Файл відхилено автоматичним фільтром. Завантаження «%{value}» не дозволено."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -4005,8 +4005,6 @@ uk:
|
||||
new:
|
||||
description: "Зміни цього етапу проєкту відображатимуться в усіх проєктах із цим етапом."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Початкова й кінцева контрольні точки"
|
||||
no_gate: "Немає контрольної точки"
|
||||
start_gate: "Початкова контрольна точка"
|
||||
|
||||
@@ -1208,7 +1208,7 @@ uz:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3932,8 +3932,6 @@ uz:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1200,7 +1200,7 @@ vi:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "Loại nội dung của tệp không thể để trống."
|
||||
not_whitelisted: "Tệp đã bị từ chối bởi bộ lọc tự động. '%{value}' không được phép tải lên."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3891,8 +3891,6 @@ vi:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -1196,7 +1196,7 @@ zh-CN:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "文件的内容类型不能为空。"
|
||||
not_whitelisted: "文件被自动筛选器拒绝。“%{value}”未被列入上传白名单。"
|
||||
not_allowlisted: "文件被自动过滤器拒绝。%{value}' 不允许上传。"
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -3882,8 +3882,6 @@ zh-CN:
|
||||
new:
|
||||
description: "对此项目阶段的更改将反映在所有启用的项目中。"
|
||||
heading: "新增阶段"
|
||||
edit:
|
||||
heading: "编辑阶段"
|
||||
both_gate: "开始和结束关口"
|
||||
no_gate: "无关口"
|
||||
start_gate: "开始关口"
|
||||
@@ -4257,12 +4255,12 @@ zh-CN:
|
||||
message: "与单个用户共享项目列表是一项企业附加功能。"
|
||||
working_days:
|
||||
info: >
|
||||
Days that are not selected are skipped when scheduling work packages and project life cycles (and not included in the day count). These can be overridden at a work-package level.
|
||||
在计划工作包和项目生命周期时,未选择的日期将被跳过(不计入天数)。可以在工作包级别覆盖这些选项。
|
||||
instance_wide_info: >
|
||||
添加到以下列表的日期被视为非工作日,在安排工作包时将被跳过。
|
||||
change_button: "更改工作日"
|
||||
warning: >
|
||||
Changing which days of the week are considered working days or non-working days can affect the start and finish days of all work packages and life cycles in all projects in this instance.
|
||||
在这种情况下,更改一周中哪几天被视为工作日或非工作日会影响所有项目中所有工作包和生命周期的开始和结束日期。
|
||||
journal_note:
|
||||
changed: _**工作日**已更改(%{changes})。_
|
||||
days:
|
||||
|
||||
@@ -552,7 +552,7 @@ zh-TW:
|
||||
data_consequences: >
|
||||
出現的所有佔位符用戶(例如,作為受理人、負責人或其他用戶值) 將被重新分配給一個名為“已刪除用戶”的帳戶。 由於每個已刪除帳戶的數據都會被重新分配給此帳戶,因此無法將用戶創建的數據與另一個已刪除帳戶的數據區分。
|
||||
irreversible: "這一行動是不可還原的"
|
||||
confirmation: "輸入占位使用者名稱 %{name} 確認刪除。"
|
||||
confirmation: "輸入佔位使用者名稱 %{name} 確認刪除。"
|
||||
priorities:
|
||||
edit:
|
||||
priority_color_text: |
|
||||
@@ -1196,7 +1196,7 @@ zh-TW:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "文件的內容類型不能為空。"
|
||||
not_whitelisted: "該文件被拒絕。 “%{value}”未列入上傳白名單。"
|
||||
not_allowlisted: "檔案被自動過濾器拒絕。'%{value}' 不允許上傳。"
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -1513,7 +1513,7 @@ zh-TW:
|
||||
news: "最新消息"
|
||||
notification:
|
||||
other: "通知"
|
||||
placeholder_user: "占位使用者"
|
||||
placeholder_user: "佔位使用者"
|
||||
project:
|
||||
other: "專案"
|
||||
project_query:
|
||||
@@ -1973,7 +1973,7 @@ zh-TW:
|
||||
ldap_groups: 同步LDAP使用者與群組
|
||||
nextcloud_sso: Nextcloud 儲存空間的單一登入(SSO)
|
||||
one_drive_sharepoint_file_storage: OneDrive/SharePoint 檔案儲存
|
||||
placeholder_users: 占位使用者
|
||||
placeholder_users: 佔位使用者
|
||||
project_list_sharing: 專案清單分享
|
||||
readonly_work_packages: 唯讀工作套件
|
||||
sso_auth_providers: 單一登入
|
||||
@@ -2032,7 +2032,7 @@ zh-TW:
|
||||
virus_scanning:
|
||||
description: "確保在其他使用者存取 OpenProject 中上傳的檔案前,對其進行病毒掃描。"
|
||||
placeholder_users:
|
||||
title: 占位使用者
|
||||
title: 佔位使用者
|
||||
description: >
|
||||
「佔位使用者」是一種將工作套件分配給不屬於您專案成員的方法。它們在一系列場景中十分有用;例如,如果您需要追蹤尚未命名或可用的資源的任務,或者如果您不想讓該人員存取專案,但仍希望追蹤分配給他們的任務。
|
||||
internal_comments:
|
||||
@@ -2152,7 +2152,7 @@ zh-TW:
|
||||
label: "甘特圖"
|
||||
caption: "匯出甘特圖檢視中的工作套件清單。"
|
||||
include_images:
|
||||
label: "包含圖片"
|
||||
label: "圖片"
|
||||
caption: "排除影像以減少 PDF 匯出的大小。"
|
||||
gantt_zoom_levels:
|
||||
label: "縮放等級"
|
||||
@@ -2816,9 +2816,9 @@ zh-TW:
|
||||
label_permissions: "權限"
|
||||
label_permissions_report: "權限列表"
|
||||
label_personalize_page: "個人化本頁"
|
||||
label_placeholder_user: "占位使用者"
|
||||
label_placeholder_user: "佔位使用者"
|
||||
label_placeholder_user_new: "新的佔位使用者"
|
||||
label_placeholder_user_plural: "占位使用者"
|
||||
label_placeholder_user_plural: "佔位使用者"
|
||||
label_planning: "計劃中"
|
||||
label_please_login: "請登入"
|
||||
label_plugins: "擴充套件"
|
||||
@@ -3353,7 +3353,7 @@ zh-TW:
|
||||
permission_archive_project: "封存專案"
|
||||
permission_create_user: "新增使用者"
|
||||
permission_manage_user: "編輯使用者"
|
||||
permission_manage_placeholder_user: "建立、編輯及刪除占位使用者"
|
||||
permission_manage_placeholder_user: "建立、編輯及刪除佔位使用者"
|
||||
permission_add_subprojects: "建立子專案"
|
||||
permission_add_work_package_watchers: "新增監看者"
|
||||
permission_assign_versions: "指派版本"
|
||||
@@ -3885,8 +3885,6 @@ zh-TW:
|
||||
new:
|
||||
description: "此專案階段的變更會反映在啟用此階段的所有專案中。"
|
||||
heading: "新增階段"
|
||||
edit:
|
||||
heading: "編輯階段"
|
||||
both_gate: "開始以及結束關卡"
|
||||
no_gate: "沒有關卡"
|
||||
start_gate: "開始關卡"
|
||||
|
||||
@@ -1286,7 +1286,7 @@ en:
|
||||
attributes:
|
||||
content_type:
|
||||
blank: "The content type of the file cannot be blank."
|
||||
not_whitelisted: "The file was rejected by an automatic filter. '%{value}' is not whitelisted for upload."
|
||||
not_allowlisted: "The file was rejected by an automatic filter. '%{value}' is not allowed for upload."
|
||||
format: "%{message}"
|
||||
capability:
|
||||
context:
|
||||
@@ -4117,8 +4117,6 @@ en:
|
||||
new:
|
||||
description: "Changes to this project phase will be reflected in all projects where it is enabled."
|
||||
heading: "New phase"
|
||||
edit:
|
||||
heading: "Edit phase"
|
||||
both_gate: "Start and finish gate"
|
||||
no_gate: "No gate"
|
||||
start_gate: "Start gate"
|
||||
|
||||
@@ -156,6 +156,8 @@ enterprise_features:
|
||||
href: https://www.openproject.org/docs/user-guide/activity/#internal-comments-enterprise-add-on
|
||||
nextcloud_sso:
|
||||
href: https://www.openproject.org/docs/system-admin-guide/integrations/nextcloud/oidc-sso
|
||||
customize_life_cycle:
|
||||
href: https://www.openproject.org/docs/system-admin-guide/projects/project-life-cycle/
|
||||
sysadmin_docs:
|
||||
saml:
|
||||
href: https://www.openproject.org/docs/system-admin-guide/authentication/saml/
|
||||
|
||||
@@ -349,7 +349,7 @@ In OpenProject, the project life cycle consists of [phases](#phase) and [phase g
|
||||
|
||||
Phases and phase gates are visible on the [project overview](#project-overview) page, in [work package tables](#work-package-table), and in [project lists](#project-lists). They can be used for filtering, grouping, and scheduling. Project administrators can activate relevant phases and gates for each project, while the global configuration of phases is an [Enterprise add-on](#enterprise-add-on).
|
||||
|
||||
[Read more acout the project life cycle in our system admin guide](../system-admin-guide/projects/project-life-cycle).
|
||||
[Read more about the project life cycle in our system admin guide](../system-admin-guide/projects/project-life-cycle).
|
||||
|
||||
### Project lists
|
||||
|
||||
|
||||
@@ -10,10 +10,14 @@ release_date: 2025-06-18
|
||||
|
||||
Release date: 2025-06-18
|
||||
|
||||
We released [OpenProject 16.1.0](https://community.openproject.org/versions/2194). The release contains several bug fixes and we recommend updating to the newest version. In these Release Notes, we will give an overview of important feature changes and important technical changes. At the end, you will find a complete list of all changes and bug fixes.
|
||||
We released [OpenProject 16.1.0](https://community.openproject.org/versions/2194). The release contains several bug fixes and we recommend updating to the newest version. In these Release Notes, we will give an overview of important feature changes and important technical changes. At the end, you will find a complete list of all changes and bug fixes.
|
||||
|
||||
## Important feature changes
|
||||
|
||||
Take a look at our release video showing the most important features introduced in OpenProject 16.1.0:
|
||||
|
||||

|
||||
|
||||
### Structure the project life cycle with phases and phase gates
|
||||
|
||||
OpenProject 16.1 introduces a powerful new way to reflect your project’s structure over time: using project phases like **Initiating, Planning, Executing, and Closing**, with optional phase gates at the start or end of each phase.
|
||||
@@ -37,7 +41,7 @@ One of the most upvoted Community requests is now available: You can now **expor
|
||||
|
||||
Meeting organizers and participants can generate a printable PDF that includes the agenda, outcomes, participants, and more. This makes it ideal for sharing with colleagues, archiving meeting records, or informing stakeholders who could not attend.
|
||||
|
||||
The export is available via the More (⋯) menu for both one-time meetings and individual occurrences of recurring meetings. You can **customize the PDF** before download by choosing wheather to include:
|
||||
The export is available via the More (⋯) menu for both one-time meetings and individual occurrences of recurring meetings. You can **customize the PDF** before download by choosing whether to include:
|
||||
|
||||
- the list of participants,
|
||||
- the list of attachments,
|
||||
@@ -152,7 +156,7 @@ Developers can now read and manage emoji reactions, create and update reminders,
|
||||
- Feature: Add hovercard to gates \[[#62608](https://community.openproject.org/wp/62608)\]
|
||||
- Feature: TreeView Primer View Component \[[#62667](https://community.openproject.org/wp/62667)\]
|
||||
- Feature: Implementing ARIA live regions to communicate contextual changes \[[#62708](https://community.openproject.org/wp/62708)\]
|
||||
- Feature: Show a TreeView on the page of hierachy customFields \[[#62993](https://community.openproject.org/wp/62993)\]
|
||||
- Feature: Show a TreeView on the page of hierarchy customFields \[[#62993](https://community.openproject.org/wp/62993)\]
|
||||
- Feature: Show attribute help texts in Primerized Project Settings > Information form \[[#63737](https://community.openproject.org/wp/63737)\]
|
||||
- Feature: Primerize attribute help texts \[[#63738](https://community.openproject.org/wp/63738)\]
|
||||
- Feature: Re-order and re-structure the 'More' action menu for sections and agenda items \[[#64074](https://community.openproject.org/wp/64074)\]
|
||||
@@ -166,7 +170,7 @@ Developers can now read and manage emoji reactions, create and update reminders,
|
||||
- Bugfix: Project search is under the Search icon in New Recurring Meeting modal \[[#59945](https://community.openproject.org/wp/59945)\]
|
||||
- Bugfix: User can't save lifecycle modal if project is invalid \[[#60666](https://community.openproject.org/wp/60666)\]
|
||||
- Bugfix: Activity Tab renders the same turbo frame multiple times inside of itself \[[#61544](https://community.openproject.org/wp/61544)\]
|
||||
- Bugfix: The 'overdue' date colour does not adapt well to dark mode (fixed hex/odd colour variable) \[[#62199](https://community.openproject.org/wp/62199)\]
|
||||
- Bugfix: The 'overdue' date color does not adapt well to dark mode (fixed hex/odd color variable) \[[#62199](https://community.openproject.org/wp/62199)\]
|
||||
- Bugfix: Seeder fails during upgrade with ArgumentError: Nothing registered with reference :default\_role\_project\_admin (ArgumentError) \[[#62582](https://community.openproject.org/wp/62582)\]
|
||||
- Bugfix: (Regression) Error on Save (in various places) \[[#62627](https://community.openproject.org/wp/62627)\]
|
||||
- Bugfix: Reminders: saving without entering a date or time throws an error but also unnecessarily clears the other field \[[#63461](https://community.openproject.org/wp/63461)\]
|
||||
|
||||
|
Before Width: | Height: | Size: 320 KiB After Width: | Height: | Size: 152 KiB |
|
Before Width: | Height: | Size: 259 KiB After Width: | Height: | Size: 129 KiB |
|
Before Width: | Height: | Size: 308 KiB After Width: | Height: | Size: 162 KiB |
|
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 92 KiB After Width: | Height: | Size: 54 KiB |
@@ -0,0 +1,38 @@
|
||||
---
|
||||
title: OpenProject 16.1.1
|
||||
sidebar_navigation:
|
||||
title: 16.1.1
|
||||
release_version: 16.1.1
|
||||
release_date: 2025-06-26
|
||||
---
|
||||
|
||||
# OpenProject 16.1.1
|
||||
|
||||
Release date: 2025-06-26
|
||||
|
||||
We released OpenProject [OpenProject 16.1.1](https://community.openproject.org/versions/2206).
|
||||
The release contains several bug fixes and we recommend updating to the newest version.
|
||||
In these Release Notes, we will give an overview of important feature changes.
|
||||
At the end, you will find a complete list of all changes and bug fixes.
|
||||
|
||||
<!--more-->
|
||||
|
||||
## Bug fixes and changes
|
||||
|
||||
<!-- Warning: Anything within the below lines will be automatically removed by the release script -->
|
||||
<!-- BEGIN AUTOMATED SECTION -->
|
||||
|
||||
- Bugfix: ActiveRecord::Deadlocked on Attachments::FinishDirectUploadJob#perform leading to lost uploads \[[#63380](https://community.openproject.org/wp/63380)\]
|
||||
- Bugfix: Unclear error message on bulk edit of parent and children wps \[[#64203](https://community.openproject.org/wp/64203)\]
|
||||
- Bugfix: Wrong wording for project phases in system administration \[[#64794](https://community.openproject.org/wp/64794)\]
|
||||
- Bugfix: Edited reminder is not working (not reminding at the selected time and date) \[[#64971](https://community.openproject.org/wp/64971)\]
|
||||
- Bugfix: Error 500 when making a predecessor with children a child of its successor \[[#64973](https://community.openproject.org/wp/64973)\]
|
||||
- Bugfix: Rendering and Server Error when managing a Custom Action with a multi-select user custom field. \[[#64981](https://community.openproject.org/wp/64981)\]
|
||||
- Bugfix: ActiveRecord::RecordNotUnique (app/services/journals/create\_service.rb:99 in block in Journals::CreateService#create\_journal) \[[#65009](https://community.openproject.org/wp/65009)\]
|
||||
- Bugfix: SystemStackError in WorkPackage::SchedulingRules#schedule\_automatically? \[[#65062](https://community.openproject.org/wp/65062)\]
|
||||
- Bugfix: OIDC does not forward to end\_session\_endpoint as configured \[[#65076](https://community.openproject.org/wp/65076)\]
|
||||
- Bugfix: Inline comment attachments are not linked to the comment when submit is via API \[[#65077](https://community.openproject.org/wp/65077)\]
|
||||
- Bugfix: create\_meeting\_minutes was never renamed to manage\_outcomes \[[#65081](https://community.openproject.org/wp/65081)\]
|
||||
|
||||
<!-- END AUTOMATED SECTION -->
|
||||
<!-- Warning: Anything above this line will be automatically removed by the release script -->
|
||||
@@ -13,6 +13,13 @@ Stay up to date and get an overview of the new features included in the releases
|
||||
<!--- New release notes are generated below. Do not remove comment. -->
|
||||
<!--- RELEASE MARKER -->
|
||||
|
||||
## 16.1.1
|
||||
|
||||
Release date: 2025-06-26
|
||||
|
||||
[Release Notes](16-1-1/)
|
||||
|
||||
|
||||
## 16.1.0
|
||||
|
||||
Release date: 2025-06-18
|
||||
|
||||
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 35 KiB |