Merge branch 'dev' into merge-release/17.0-20260108132255

This commit is contained in:
Alexander Brandon Coles
2026-01-08 10:26:08 -03:00
551 changed files with 12066 additions and 5906 deletions
+7 -7
View File
@@ -103,7 +103,7 @@ jobs:
./docker/prod/setup/precompile-assets.sh
# public/assets will be saved as artifact, so temporarily copying config file there as well
cp config/frontend_assets.manifest.json public/assets/frontend_assets.manifest.json
- uses: actions/upload-artifact@v5
- uses: actions/upload-artifact@v6
with:
path: public/
name: public-assets-${{ inputs.tag }}-${{ github.sha }}
@@ -163,7 +163,7 @@ jobs:
run: |
cp ./docker/prod/Dockerfile ./Dockerfile
- name: Download precompiled public assets
uses: actions/download-artifact@v6
uses: actions/download-artifact@v7
with:
name: public-assets-${{ inputs.tag }}-${{ github.sha }}
path: public/
@@ -208,7 +208,7 @@ jobs:
${{ needs.setup.outputs.registry_image }}
- name: Restore vendor/bundle
id: restore-vendor-bundle
uses: actions/cache/restore@v4
uses: actions/cache/restore@v5
with:
path: |
vendor/bundle
@@ -243,7 +243,7 @@ jobs:
docker rm bundle
- name: Save vendor/bundle
id: save-vendor-bundle
uses: actions/cache/save@v4
uses: actions/cache/save@v5
with:
path: |
vendor/bundle
@@ -292,7 +292,7 @@ jobs:
digest="${{ steps.push.outputs.digest }}"
touch "/tmp/digests/${digest#sha256:}"
- name: Upload digest
uses: actions/upload-artifact@v5
uses: actions/upload-artifact@v6
with:
name: digests-${{ inputs.tag }}-${{ matrix.target }}-${{ matrix.digest }}
path: /tmp/digests/*
@@ -308,13 +308,13 @@ jobs:
- build
steps:
- name: Merge digests
uses: actions/upload-artifact/merge@v5
uses: actions/upload-artifact/merge@v6
with:
pattern: "digests-${{ inputs.tag }}-${{ matrix.target }}-${{ matrix.digest }}*"
overwrite: true
name: "merged-digests-${{ inputs.tag }}-${{ matrix.target }}-${{ github.run_number }}-${{ github.run_attempt }}"
- name: Download digests
uses: actions/download-artifact@v6
uses: actions/download-artifact@v7
with:
name: "merged-digests-${{ inputs.tag }}-${{ matrix.target }}-${{ github.run_number }}-${{ github.run_attempt }}"
path: /tmp/digests
+139 -135
View File
@@ -59,6 +59,9 @@ Layout/MultilineMethodCallIndentation:
Layout/MultilineOperationIndentation:
Enabled: false
Lint/AmbiguousBlockAssociation:
AllowedMethods: [change]
Lint/AmbiguousOperator:
Enabled: false
@@ -98,14 +101,11 @@ Lint/UnderscorePrefixedVariableName:
Lint/Void:
Enabled: false
Lint/AmbiguousBlockAssociation:
AllowedMethods: [change]
Metrics/ClassLength:
Enabled: false
Metrics/CyclomaticComplexity:
Enabled: false
Metrics/AbcSize:
Enabled: true
Exclude:
- "spec/**/*.rb"
- "modules/*/spec/**/*.rb"
Metrics/BlockLength:
Enabled: false
@@ -113,6 +113,12 @@ Metrics/BlockLength:
Metrics/BlockNesting:
Enabled: false
Metrics/ClassLength:
Enabled: false
Metrics/CyclomaticComplexity:
Enabled: false
Metrics/MethodLength:
Enabled: false
@@ -122,12 +128,6 @@ Metrics/ModuleLength:
Metrics/ParameterLists:
Enabled: false
Metrics/AbcSize:
Enabled: true
Exclude:
- "spec/**/*.rb"
- "modules/*/spec/**/*.rb"
Naming/AccessorMethodName:
Enabled: false
@@ -150,10 +150,15 @@ Naming/VariableNumber:
- '\w_20\d\d' # allow dates like christmas_2022 or date_2034_04_12
- '\w\d++(_\d++)+' # allow hierarchical data like child1_2_5 (second + in regex is possessive qualifier)
- 'custom_field_\d+' # allow custom field method names to be called with send :custom_field_1001
# There are valid cases in which to use methods like:
# * update_all
# * touch_all
Rails/SkipsModelValidations:
OpenProject/AddPreviewForViewComponent:
Include:
- app/components/op_turbo/**.rb
- app/components/op_primer/**.rb
- app/components/open_project/**.rb
- app/components/concerns/**.rb
Performance/Casecmp:
Enabled: false
# Don't force us to use tag instead of content_tag
@@ -161,55 +166,6 @@ Rails/SkipsModelValidations:
Rails/ContentTag:
Enabled: false
# Disable I18n.locale = in specs, where it is reset
# by us explicitly
Rails/I18nLocaleAssignment:
Enabled: true
Exclude:
- "spec/**/*.rb"
# Do not bother if `let` statements use an index in their name
RSpec/IndexedLet:
Enabled: false
# The http verbs in Rack::Test do not accept named parameters (params: params)
Rails/HttpPositionalArguments:
Enabled: false
# require_dependency is an obsolete method for Rails applications running in Zeitwerk mode.
Rails/RequireDependency:
Enabled: true
# For feature specs, we tend to have longer specs that cover a larger part of the functionality.
# This is done for multiple reasons:
# * performance, as setting up integration tests is costly
# * following a scenario that is closer to how a user interacts
RSpec/ExampleLength:
Max: 25
Enabled: true
Exclude:
- "spec/features/**/*.rb"
- "modules/*/spec/features/**/*.rb"
# We have specs that have no expect(..) syntax,
# but only helper classes that expect themselves
RSpec/NoExpectationExample:
Enabled: false
RSpec/DescribeClass:
Enabled: true
Exclude:
- "spec/features/**/*.rb"
- "modules/*/spec/features/**/*.rb"
# Nothing wrong with `include_examples` when used properly.
RSpec/IncludeExamples:
Enabled: false
# Allow number HTTP status codes in specs
RSpecRails/HttpStatus:
Enabled: false
# dynamic finders cop clashes with capybara ID cop
Rails/DynamicFindBy:
Enabled: true
@@ -230,53 +186,38 @@ Rails/FindEach:
- select
- lock
# The http verbs in Rack::Test do not accept named parameters (params: params)
Rails/HttpPositionalArguments:
Enabled: false
# Disable I18n.locale = in specs, where it is reset
# by us explicitly
Rails/I18nLocaleAssignment:
Enabled: true
Exclude:
- "spec/**/*.rb"
# We have config.active_record.belongs_to_required_by_default = false ,
# which means, we do have to declare presence validators on belongs_to relations.
Rails/RedundantPresenceValidationOnBelongsTo:
Enabled: false
# See RSpec/ExampleLength for why feature specs are excluded
RSpec/MultipleExpectations:
Max: 15
Enabled: true
Exclude:
- "spec/features/**/*.rb"
- "modules/*/spec/features/**/*.rb"
RSpec/MultipleMemoizedHelpers:
Enabled: false
RSpec/NestedGroups:
Enabled: false
# Don't force the second argument of describe
# to be .class_method or #instance_method
RSpec/DescribeMethod:
Enabled: false
# Don't force the second argument of describe
# to match the exact file name
RSpec/SpecFilePathFormat:
CustomTransform:
OpenIDConnect: openid_connect
OAuthClients: oauth_clients
OAuth: oauth
ICal: ical
IgnoreMethods: true
# Prevent "fit" or similar to be committed
RSpec/Focus:
# require_dependency is an obsolete method for Rails applications running in Zeitwerk mode.
Rails/RequireDependency:
Enabled: true
# We use let!() to ensure dependencies are created
# instead of let() and referencing them explicitly
RSpec/LetSetup:
# Require save! to prevent saving without validation when saving outside of a condition.
Rails/SaveBang:
Enabled: true
# There are valid cases in which to use methods like:
# * update_all
# * touch_all
Rails/SkipsModelValidations:
Enabled: false
RSpec/LeadingSubject:
Enabled: false
RSpec/NamedSubject:
# Allow number HTTP status codes in specs
RSpecRails/HttpStatus:
Enabled: false
# expect not_to change is not working as expected
@@ -303,6 +244,79 @@ RSpec/ContextWording:
- within
- without
RSpec/DescribeClass:
Enabled: true
Exclude:
- "spec/features/**/*.rb"
- "modules/*/spec/features/**/*.rb"
# Don't force the second argument of describe
# to be .class_method or #instance_method
RSpec/DescribeMethod:
Enabled: false
# For feature specs, we tend to have longer specs that cover a larger part of the functionality.
# This is done for multiple reasons:
# * performance, as setting up integration tests is costly
# * following a scenario that is closer to how a user interacts
RSpec/ExampleLength:
Max: 25
Enabled: true
Exclude:
- "spec/features/**/*.rb"
- "modules/*/spec/features/**/*.rb"
# Prevent "fit" or similar to be committed
RSpec/Focus:
Enabled: true
# Nothing wrong with `include_examples` when used properly.
RSpec/IncludeExamples:
Enabled: false
# Do not bother if `let` statements use an index in their name
RSpec/IndexedLet:
Enabled: false
RSpec/LeadingSubject:
Enabled: false
# We use let!() to ensure dependencies are created
# instead of let() and referencing them explicitly
RSpec/LetSetup:
Enabled: false
# We have specs that have no expect(..) syntax,
# but only helper classes that expect themselves
RSpec/NoExpectationExample:
Enabled: false
# See RSpec/ExampleLength for why feature specs are excluded
RSpec/MultipleExpectations:
Max: 15
Enabled: true
Exclude:
- "spec/features/**/*.rb"
- "modules/*/spec/features/**/*.rb"
RSpec/MultipleMemoizedHelpers:
Enabled: false
RSpec/NestedGroups:
Enabled: false
# Don't force the second argument of describe
# to match the exact file name
RSpec/SpecFilePathFormat:
CustomTransform:
OpenIDConnect: openid_connect
OAuthClients: oauth_clients
EnforcedInflector: active_support
IgnoreMethods: true
RSpec/NamedSubject:
Enabled: false
Style/Alias:
Enabled: false
@@ -367,6 +381,19 @@ Style/FormatString:
Style/FormatStringToken:
AllowedMethods: [redirect]
Style/FrozenStringLiteralComment:
Enabled: true
EnforcedStyle: always_true
Style/HashEachMethods:
Enabled: true
Style/HashTransformKeys:
Enabled: true
Style/HashTransformValues:
Enabled: true
Style/GlobalVars:
Enabled: false
@@ -409,6 +436,13 @@ Style/NilComparison:
Style/Not:
Enabled: false
Style/NumericLiterals:
Enabled: false
# Avoid enforcing "positive?"
Style/NumericPredicate:
Enabled: false
Style/OneLineConditional:
Enabled: false
@@ -471,33 +505,3 @@ Style/WhileUntilModifier:
Style/WordArray:
Enabled: false
Style/FrozenStringLiteralComment:
Enabled: true
EnforcedStyle: always_true
Style/NumericLiterals:
Enabled: false
# Avoid enforcing "positive?"
Style/NumericPredicate:
Enabled: false
Style/HashEachMethods:
Enabled: true
Style/HashTransformKeys:
Enabled: true
Style/HashTransformValues:
Enabled: true
Performance/Casecmp:
Enabled: false
OpenProject/AddPreviewForViewComponent:
Include:
- app/components/op_turbo/**.rb
- app/components/op_primer/**.rb
- app/components/open_project/**.rb
- app/components/concerns/**.rb
+22 -18
View File
@@ -46,6 +46,8 @@ gem "responders", "~> 3.2"
gem "ffi", "~> 1.15"
gem "connection_pool", "~> 2.5.5"
gem "rdoc", ">= 2.4.2"
gem "doorkeeper", "~> 5.8.0"
@@ -60,13 +62,13 @@ gem "warden-basic_auth", "~> 0.2.1"
gem "pagy"
gem "will_paginate", "~> 4.0.0"
gem "friendly_id", "~> 5.5.0"
gem "friendly_id", "~> 5.6.0"
gem "scimitar", "~> 2.13"
gem "acts_as_list", "~> 1.2.6"
gem "acts_as_tree", "~> 2.9.0"
gem "awesome_nested_set", "~> 3.8.0"
gem "awesome_nested_set", "~> 3.9.0"
gem "closure_tree", "~> 9.3.0"
gem "rubytree", "~> 2.1.0"
@@ -95,7 +97,7 @@ gem "deckar01-task_list", "~> 2.3.1"
# Requires escape-utils for faster escaping
gem "escape_utils", "~> 1.3"
# Syntax highlighting used in html-pipeline with rouge
gem "rouge", "~> 4.6.1"
gem "rouge", "~> 4.7.0"
# HTML sanitization used for html-pipeline
gem "sanitize", "~> 7.0.0"
# HTML autolinking for mails and urls (replaces autolink)
@@ -109,7 +111,7 @@ gem "svg-graph", "~> 2.2.0"
gem "date_validator", "~> 0.12.0"
gem "email_validator", "~> 2.2.3"
gem "json_schemer", "~> 2.4.0"
gem "json_schemer", "~> 2.5.0"
gem "ruby-duration", "~> 3.2.0"
gem "mail", "2.9.0"
@@ -121,7 +123,7 @@ gem "sys-filesystem", "~> 1.5.0", require: false
gem "bcrypt", "~> 3.1.6"
gem "multi_json", "~> 1.17.0"
gem "multi_json", "~> 1.19.0"
gem "oj", "~> 3.16.12"
gem "daemons"
@@ -139,7 +141,7 @@ gem "rack-attack", "~> 6.8.0"
gem "browser", "~> 6.2.0"
# Providing health checks
gem "okcomputer", "~> 1.19.0"
gem "okcomputer", "~> 1.19.1"
# Lograge to provide sane and non-verbose logging
gem "lograge", "~> 0.14.0"
@@ -151,7 +153,7 @@ gem "structured_warnings", "~> 0.5.0"
# don't require by default, instead load on-demand when actually configured
gem "airbrake", "~> 13.0.0", require: false
gem "markly", "~> 0.14" # another Markdown parser like commonmarker, but with AST support used in PDF export
gem "markly", "~> 0.15" # another markdown parser like commonmarker, but with AST support used in PDF export
gem "md_to_pdf", git: "https://github.com/opf/md-to-pdf", ref: "6c565541bfa390c58d90d49aa9b487777704fc66"
gem "prawn", "~> 2.4"
gem "ttfunk", "~> 1.7.0" # remove after https://github.com/prawnpdf/prawn/issues/1346 resolved.
@@ -159,6 +161,8 @@ gem "ttfunk", "~> 1.7.0" # remove after https://github.com/prawnpdf/prawn/issues
# prawn implicitly depends on matrix gem no longer in ruby core with 3.1
gem "matrix", "~> 0.4.3"
gem "mcp", "~> 0.4.0"
gem "meta-tags", "~> 2.22.2"
gem "paper_trail", "~> 17.0.0"
@@ -179,7 +183,7 @@ group :production do
end
gem "i18n-js", "~> 4.2.4"
gem "rails-i18n", "~> 8.0.0"
gem "rails-i18n", "~> 8.1.0"
gem "sprockets", "~> 3.7.2" # lock sprockets below 4.0
gem "sprockets-rails", "~> 3.5.1"
@@ -188,19 +192,19 @@ gem "puma", "~> 7.1"
gem "puma-plugin-statsd", "~> 2.7"
gem "rack-timeout", "~> 0.7.0", require: "rack/timeout/base"
gem "nokogiri", "~> 1.18.10"
gem "nokogiri", "~> 1.19.0"
gem "carrierwave", "~> 1.3.4"
gem "carrierwave_direct", "~> 2.1.0"
gem "fog-aws"
gem "aws-sdk-core", "~> 3.239"
gem "aws-sdk-core", "~> 3.241"
# File upload via fog + screenshots on travis
gem "aws-sdk-s3", "~> 1.205"
gem "aws-sdk-s3", "~> 1.210"
gem "openproject-token", "~> 8.3.0"
gem "openproject-token", "~> 8.4.0"
gem "plaintext", "~> 0.3.2"
gem "plaintext", "~> 0.3.7"
gem "ruby-progressbar", "~> 1.13.0", require: false
@@ -227,12 +231,12 @@ gem "yabeda-rails"
# opentelemetry
gem "opentelemetry-exporter-otlp", "~> 0.31.0", require: false
gem "opentelemetry-instrumentation-all", "~> 0.87.0", require: false
gem "opentelemetry-instrumentation-all", "~> 0.89.0", require: false
gem "opentelemetry-sdk", "~> 1.10", require: false
gem "view_component", "~> 4.1.1"
# Lookbook
gem "lookbook", "2.3.13"
gem "lookbook", "2.3.14"
gem "inline_svg", "~> 1.10.0"
@@ -358,7 +362,7 @@ group :development, :test do
gem "rubocop-factory_bot", require: false
gem "rubocop-openproject", require: false
gem "rubocop-performance", require: false
gem "rubocop-rails", "= 2.33.3", require: false # 2.33.4 has issues with Rails/ActionControllerFlashBeforeRender
gem "rubocop-rails", "~> 2.34.2"
gem "rubocop-rspec", require: false
gem "rubocop-rspec_rails", require: false
@@ -376,7 +380,7 @@ group :development, :test do
gem "active_record_doctor", "~> 2.0.1"
end
gem "bootsnap", "~> 1.19.0", require: false
gem "bootsnap", "~> 1.20.0", require: false
# API gems
gem "grape", "~> 2.4.0"
@@ -404,7 +408,7 @@ group :postgres do
end
# Support application loading when no database exists yet.
gem "activerecord-nulldb-adapter", "~> 1.1.1"
gem "activerecord-nulldb-adapter", "~> 1.2.2"
# Have application level locks on the database to have a mutex shared between workers/hosts.
# We e.g. employ this to safeguard the creation of journals.
+343 -361
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -8,7 +8,7 @@ gem 'omniauth-openid_connect-providers',
gem 'omniauth-openid-connect',
git: 'https://github.com/opf/omniauth-openid-connect.git',
ref: 'f0c1ecdb26e39017a9e929af75a166c772d960bb'
ref: '825d06235b64f6bc872bba709f1c2d48fd5cede4'
group :opf_plugins do
# included so that engines can reference OpenProject::Version
@@ -46,12 +46,15 @@ See COPYRIGHT and LICENSE files for more details.
) do |tree_view|
parent = @hierarchy_item.parent
descendants = hierarchy_service.get_descendants(item: @hierarchy_item).value!
item_formatter = standard_tree_view_item_formatter
label_fn = lambda { |item| item_formatter.format(item:) }
item_options = {
select_variant: :single,
expanded: [parent],
current: @hierarchy_item,
disabled: [parent] + descendants
disabled: [parent] + descendants,
label_fn:
}
populate_tree_view(tree_view, @custom_field, show_root: true, item_options:)
@@ -49,6 +49,7 @@ See COPYRIGHT and LICENSE files for more details.
end
end
label_addition = secondary_text
if label_addition.present?
item_information.with_column(mr: 2) do
render(Primer::Beta::Text.new(color: :subtle)) { label_addition }
@@ -55,6 +55,15 @@ module Admin
self.class.menu_id(item: model)
end
def secondary_text
::CustomFields::Hierarchy::HierarchicalItemFormatter
.new(label: false,
number_length_limit: 42,
number_integer_digit_limit: 40,
number_precision: 40)
.format(item: model)
end
def item_link
if project_custom_field_context?
admin_settings_project_custom_field_item_path(custom_field_id, model)
@@ -30,10 +30,12 @@ See COPYRIGHT and LICENSE files for more details.
<%=
render(Primer::Alpha::TreeView.new(node_variant: :anchor)) do |tree_view|
item_formatter = standard_tree_view_item_formatter
item_options = {
href_fn: lambda { |item| href_for(item) },
expanded: [@active_item, @active_item.parent],
current: @active_item
current: @active_item,
label_fn: lambda { |item| item_formatter.format(item:) }
}
populate_tree_view(tree_view, @custom_field, item_options:)
@@ -0,0 +1,61 @@
<%#-- 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.
++#%>
<%= render(Primer::Alpha::Dialog.new(
id: "password-confirmation-dialog",
title: t(".title"),
data: { controller: "password-confirmation-dialog" },
test_selector: "op-my--password-confirmation-dialog"
)) do |dialog|
dialog.with_body do
content_tag(:form, id: "password-confirmation-form", data: { password_confirmation_dialog_target: "form" }) do
render(Primer::Alpha::TextField.new(
type: "password",
name: "password_confirmation",
label: User.human_attribute_name(:password),
caption: t(".confirmation_required"),
data: { password_confirmation_dialog_target: "passwordInput" }
))
end
end
dialog.with_footer do
concat(render(Primer::Beta::Button.new(data: { "close-dialog-id": "password-confirmation-dialog" })) { t("button_cancel") })
concat(
render(Primer::Beta::Button.new(
scheme: :primary,
type: :submit,
form: "password-confirmation-form",
test_selector: "op-my--password-confirmation-dialog--submit-button",
data: { password_confirmation_dialog_target: "submitButton" }
)) { t("button_confirm") }
)
end
end
%>
@@ -1,6 +1,6 @@
# frozen_string_literal: true
# -- copyright
#-- copyright
# OpenProject is an open source project management software.
# Copyright (C) the OpenProject GmbH
#
@@ -23,14 +23,13 @@
#
# 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.
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# See COPYRIGHT and LICENSE files for more details.
# ++
#++
class Projects::ExportListModalComponent < ApplicationComponent
include OpTurbo::Streamable
MODAL_ID = "op-project-list-export-dialog"
options :query
module My
class PasswordConfirmationDialog < ApplicationComponent
include OpTurbo::Streamable
end
end
@@ -1,23 +0,0 @@
<%= render(
Primer::Alpha::Dialog.new(
title: t("js.label_export"),
id: MODAL_ID
)
) do |d| %>
<% d.with_header(variant: :large) %>
<% d.with_body do %>
<ul class="op-export-options">
<% helpers.supported_export_formats.each do |key| %>
<li class="op-export-options--option">
<%= link_to projects_path(format: key, **helpers.projects_query_params.except(:page, :per_page)),
"data-controller": "job-dialog",
"data-job-dialog-close-dialog-id-value": MODAL_ID,
class: "op-export-options--option-link" do %>
<%= helpers.op_icon("icon-big icon-export-#{key}") %>
<span class="op-export-options--option-label"><%= t("export.format.#{key}") %></span>
<% end %>
</li>
<% end %>
</ul>
<% end %>
<% end %>
@@ -126,13 +126,18 @@
end
if can_export?
menu.with_item(
tag: :a,
label: t("js.label_export"),
href: export_list_modal_projects_path(projects_query_params),
content_arguments: { data: { controller: "async-dialog" }, rel: "nofollow" }
) do |item|
item.with_leading_visual_icon(icon: :download)
menu.with_sub_menu_item(label: t("js.label_export")) do |submenu|
submenu.with_leading_visual_icon(icon: :download)
helpers.supported_export_formats.each do |key|
submenu.with_item(
label: t("export.format.#{key}"),
tag: :a,
href: projects_path(format: key, **helpers.projects_query_params.except(:page, :per_page)),
content_arguments: { data: { controller: "job-dialog" }, rel: "nofollow" }
) do |item|
item.with_leading_visual_icon(icon: "op-#{key == "csv" ? "file-csv" : key}")
end
end
end
end
+2 -1
View File
@@ -38,7 +38,8 @@ module Users
}
attribute :firstname
attribute :lastname
attribute :mail
attribute :mail,
writable: ->(*) { model.new_record? || model.id == user.id || user.admin? }
attribute :admin,
writable: ->(*) { user.admin? && model.id != user.id }
attribute :language
+8 -1
View File
@@ -29,12 +29,19 @@
#++
class APIDocsController < ApplicationController
before_action :require_login
before_action :require_login,
:check_if_api_docs_enabled
no_authorization_required! :index
helper API::APIDocsHelper
def index
render locals: { turbo_opt_out: true }
end
private
def check_if_api_docs_enabled
render_404 unless Setting.apiv3_docs_enabled?
end
end
+5
View File
@@ -48,6 +48,7 @@ class MyController < ApplicationController
:update_settings,
:password,
:change_password,
:password_confirmation_dialog,
:notifications,
:reminders
@@ -85,6 +86,10 @@ class MyController < ApplicationController
end
end
def password_confirmation_dialog
respond_with_dialog My::PasswordConfirmationDialog.new
end
# Configure user's in app notifications
def notifications; end
@@ -0,0 +1,86 @@
# 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.
#++
class OAuthMetadataController < ApplicationController
no_authorization_required! :authorization_server, :protected_resource
skip_before_action :check_if_login_required
def authorization_server
grant_types = Doorkeeper.configuration.grant_flows
grant_types += ["refresh_token"] if Doorkeeper.configuration.refresh_token_enabled?
render json: {
issuer: local_issuer,
authorization_endpoint: oauth_authorization_url,
token_endpoint: oauth_token_url,
introspection_endpoint: oauth_introspect_url,
scopes_supported: Doorkeeper.configuration.scopes.to_a,
response_types_supported: response_types(Doorkeeper.configuration.grant_flows),
grant_types_supported: grant_types,
service_documentation: OpenProject::Static::Links.url_for(:oauth_applications)
}
end
def protected_resource
render json: {
resource: resource_url,
resource_name: Setting.app_title,
authorization_servers:,
scopes_supported: OpenProject::Authentication::Scope.values,
bearer_methods_supported: ["header"],
resource_documentation: OpenProject::Static::Links.url_for(:api_docs)
}
end
private
def response_types(grant_types)
grant_types.filter_map do |grant|
case grant
when "authorization_code"
"code"
when "implicit"
"token"
end
end
end
def authorization_servers
OpenIDConnect::Provider.where(available: true).map(&:issuer) + [local_issuer]
end
def instance_base_url
"http#{'s' if request.ssl?}://#{Setting.host_name}"
end
alias resource_url instance_base_url
alias local_issuer instance_base_url
end
+3 -7
View File
@@ -34,10 +34,10 @@ class ProjectsController < ApplicationController
menu_item :overview
menu_item :roadmap, only: :roadmap
before_action :find_project, except: %i[index new create export_list_modal]
before_action :load_query_or_deny_access, only: %i[index export_list_modal]
before_action :find_project, except: %i[index new create]
before_action :load_query_or_deny_access, only: %i[index]
before_action :authorize,
only: %i[copy_form copy deactivate_work_package_attachments export_list_modal export_project_initiation_pdf]
only: %i[copy_form copy deactivate_work_package_attachments export_project_initiation_pdf]
before_action :authorize_global, only: %i[new create]
before_action :require_admin, only: %i[destroy destroy_info]
before_action :find_optional_parent, only: :new
@@ -172,10 +172,6 @@ class ProjectsController < ApplicationController
end
end
def export_list_modal
respond_with_dialog Projects::ExportListModalComponent.new(query: @query)
end
def export_project_initiation_pdf
export = Project::PDFExport::ProjectInitiation.new(@project).export!
send_data(export.content, type: export.mime_type, filename: export.title)
+5 -1
View File
@@ -37,6 +37,7 @@ class LoginForm < ApplicationForm
f.text_field(
name: :username,
id: "username#{@id_suffix}",
value: @username,
autofocus: @username.blank?,
label: User.human_attribute_name(:login),
@@ -46,6 +47,7 @@ class LoginForm < ApplicationForm
f.text_field(
name: :password,
id: "password#{@id_suffix}",
type: :password,
autofocus: @username.present?,
label: User.human_attribute_name(:password),
@@ -55,6 +57,7 @@ class LoginForm < ApplicationForm
if Setting::Autologin.enabled?
f.check_box name: "autologin",
id: "autologin#{@id_suffix}",
checked: false,
value: 1,
label: I18n.t("users.autologins.prompt",
@@ -85,9 +88,10 @@ class LoginForm < ApplicationForm
end
end
def initialize(back_url: nil, username: nil)
def initialize(back_url: nil, username: nil, id_suffix: nil)
super()
@back_url = back_url
@username = username
@id_suffix = id_suffix
end
end
@@ -43,6 +43,12 @@ module CustomFieldHierarchyTreeViewHelper
add_sub_tree(tree_view, hierarchy_hash, item_options)
end
def standard_tree_view_item_formatter
::CustomFields::Hierarchy::HierarchicalItemFormatter.new(number_integer_digit_limit: 8,
number_length_limit: 9,
number_precision: 4)
end
private
def add_sub_tree(tree, hierarchy_hash, item_options)
+2
View File
@@ -29,6 +29,8 @@
#++
module NumberFormatHelper
include ActionView::Helpers::NumberHelper
def number_with_limit(number, opts = {})
init_formatting_options(opts) => { digits:, precision:, length_limit: }
+1 -1
View File
@@ -60,7 +60,7 @@ module PasswordHelper
controller = with_data.fetch(:controller, "")
if password_confirmation_required?
with_data.merge(controller: "#{controller} password-confirmation-dialog".strip)
with_data.merge(controller: "#{controller} require-password-confirmation".strip)
else
with_data
end
+9 -1
View File
@@ -37,8 +37,9 @@ class CustomField::Hierarchy::Item < ApplicationRecord
scope :including_children, -> { includes(children: :children) }
def to_s = suffix.empty? ? label : "#{label} #{suffix}"
def to_s = formatter.format(item: self)
# @deprecated Use [CustomFields::Hierarchy::HierarchicalItemFormatter] instead.
def ancestry_path(include_shorts_and_weights: false)
path = self_and_ancestors.filter_map(&:label).reverse.join(" / ")
@@ -47,9 +48,16 @@ class CustomField::Hierarchy::Item < ApplicationRecord
suffix.empty? ? path : "#{path} #{suffix}"
end
# @deprecated Use [CustomFields::Hierarchy::HierarchicalItemFormatter] instead.
def suffix
return "" if short.nil? && weight.nil?
"(#{short || weight})"
end
private
def formatter
CustomFields::Hierarchy::HierarchicalItemFormatter.default
end
end
+5 -2
View File
@@ -62,8 +62,11 @@ module Exports::PDF::Common::Common
mime_type: "application/pdf"
end
def error(message)
raise ::Exports::ExportError.new message
def error(pdf_error, custom_message = nil)
message = custom_message || I18n.t(:error_pdf_failed_to_export, error: pdf_error.message)
result = ::Exports::ExportError.new message
result.set_backtrace pdf_error.backtrace
raise result
end
def with_padding(opts, &)
+15 -3
View File
@@ -59,15 +59,27 @@ class Exports::PDF::Common::View
end
def self.valid_custom_font?
CustomStyle.current.present? &&
CustomStyle.current.export_font_regular.present? &&
CustomStyle.current.export_font_regular.local_file.present?
cs = CustomStyle.current
return false if cs.blank?
valid_custom_font_cut?(cs.export_font_regular) &&
valid_optional_custom_font_cut?(cs.export_font_bold) &&
valid_optional_custom_font_cut?(cs.export_font_italic) &&
valid_optional_custom_font_cut?(cs.export_font_bold_italic)
# Something in the remote storage failed. Log, but do not stop PDF generation
rescue StandardError => e
Rails.logger.error "Failed to apply custom PDF font to export: #{e.message}:\n#{e.backtrace.join("\n")}"
false
end
def self.valid_custom_font_cut?(cut)
cut.present? && cut.local_file.present?
end
def self.valid_optional_custom_font_cut?(cut)
cut.blank? || cut.local_file.present?
end
def options
@options ||= {}
end
+1 -2
View File
@@ -65,8 +65,7 @@ module Exports::PDF
render_demo
success(pdf.render)
rescue StandardError => e
Rails.logger.error "Failed to generate demo PDF: #{e.message}:\n#{e.backtrace.join("\n")}"
error(I18n.t(:error_pdf_failed_to_export, error: e.message))
error(e)
ensure
delete_all_resized_images
end
+32
View File
@@ -0,0 +1,32 @@
# 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.
#++
class McpConfiguration < ApplicationRecord
end
+1 -1
View File
@@ -47,7 +47,7 @@ class Project < ApplicationRecord
IDENTIFIER_MAX_LENGTH = 100
# reserved identifiers
RESERVED_IDENTIFIERS = %w[new menu queries filters export_list_modal].freeze
RESERVED_IDENTIFIERS = %w[new menu queries filters].freeze
enum :workspace_type, {
project: "project",
@@ -68,8 +68,7 @@ class Project::PDFExport::ProjectInitiation < Exports::Exporter
render_doc
success(pdf.render)
rescue StandardError => e
Rails.logger.error "Failed to generate project creation PDF: #{e.message}:\n#{e.backtrace.join("\n")}"
error(I18n.t(:error_pdf_failed_to_export, error: e.message))
error(e)
ensure
delete_all_resized_images
end
+1 -2
View File
@@ -60,8 +60,7 @@ module Projects::Exports
file = render_pdf(all_projects)
success(file)
rescue StandardError => e
Rails.logger.error "Failed to generate PDF export: #{e.message}:\n#{e.backtrace.join("\n")}"
error(I18n.t(:error_pdf_failed_to_export, error: e.message))
error(e)
end
def title
+5 -1
View File
@@ -90,6 +90,10 @@ class User < Principal
inverse_of: :user,
dependent: :destroy
has_many :recurring_meeting_interim_responses,
inverse_of: :user,
dependent: :destroy
has_many :notification_settings,
dependent: :destroy
@@ -739,7 +743,7 @@ class User < Principal
def self.register_failed_login_attempt_if_user_exists_for(login)
user = User.find_by_login(login)
user.log_failed_login if user.present?
user.presence&.log_failed_login
nil
end
@@ -59,8 +59,7 @@ class WorkPackage::PDFExport::DocumentGenerator < Exports::Exporter
render_doc
success(pdf.render)
rescue StandardError => e
Rails.logger.error "Failed to generate PDF export: #{e.message}:\n#{e.backtrace.join("\n")}"
error(I18n.t(:error_pdf_failed_to_export, error: e.message))
error(e)
ensure
delete_all_resized_images
end
@@ -83,24 +83,17 @@ class WorkPackage::PDFExport::WorkPackageListToPdf < WorkPackage::Exports::Query
end
def export!
handle_export_errors do
success(render_work_packages(query.results.work_packages))
end
success(render_work_packages(query.results.work_packages))
rescue Prawn::Errors::CannotFit => e
error(e, I18n.t(:error_pdf_export_too_many_columns))
rescue Exports::PDF::Components::Gantt::InvalidDateRangeError => e
error(e, e.message)
rescue StandardError => e
error(e)
end
private
def handle_export_errors
yield
rescue Prawn::Errors::CannotFit
error(I18n.t(:error_pdf_export_too_many_columns))
rescue Exports::PDF::Components::Gantt::InvalidDateRangeError => e
error(e.message)
rescue StandardError => e
Rails.logger.error "Failed to generate PDF export: #{e.message}:\n#{e.backtrace.join("\n")}"
error(I18n.t(:error_pdf_failed_to_export, error: e.message))
end
def setup_page!
self.pdf = get_pdf
@@ -59,8 +59,7 @@ class WorkPackage::PDFExport::WorkPackageToPdf < Exports::Exporter
render_work_package
success(pdf.render)
rescue StandardError => e
Rails.logger.error "Failed to generate PDF export: #{e.message}:\n#{e.backtrace.join("\n")}"
error(I18n.t(:error_pdf_failed_to_export, error: e.message))
error(e)
ensure
delete_all_resized_images
end
@@ -33,7 +33,7 @@ module WorkPackageTypes
class TokenPropertyMapper
STRING_OR_NIL = ->(v) { v&.to_s }
ARRAY = ->(v) { v.compact.presence&.join(", ") }
DATE = ->(v) { v&.strftime("%Y-%m-%d") }
DATE = ->(v) { v&.strftime(Setting.date_format || "%Y-%m-%d") }
DURATION = ->(v) { DurationConverter.output(v) }
class << self
@@ -120,11 +120,13 @@ module WorkPackageTypes
end
def tokenize(custom_field_scope, prefix = nil)
custom_field_scope.pluck(:name, :id, :multi_value).map do |name, id, multiple|
custom_field_scope.pluck(:name, :id, :field_format, :multi_value).map do |name, id, format, multiple|
formatter = if multiple
ARRAY
elsif format == "date"
DATE
else
->(v) { v.is_a?(Symbol) ? v : v&.to_s }
->(v) { v.is_a?(Symbol) ? v : STRING_OR_NIL.call(v) }
end
AttributeToken.new(
:"#{prefix}custom_field_#{id}",
+76
View File
@@ -0,0 +1,76 @@
# 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.
#++
class McpConfigurationSeeder < Seeder
def seed_data!
seed_server_config if server_missing?
seed_tool_configs
end
def applicable?
server_missing? || tools_missing?
end
def not_applicable_message
"No seeding of additional MCP configuration necessary."
end
private
def seed_server_config
McpConfiguration.create!(
identifier: API::Mcp::CONFIGURATION_IDENTIFIER,
title: Setting.app_title,
description: "Performs project management tasks on the given installation of OpenProject.",
enabled: true
)
end
def seed_tool_configs
McpTools.all.each do |thing| # rubocop:disable Rails/FindEach
next if McpConfiguration.find_by(identifier: thing.qualified_name)
McpConfiguration.create!(
identifier: thing.qualified_name,
title: thing.default_title,
description: thing.default_description,
enabled: true
)
end
end
def server_missing?
McpConfiguration.where(identifier: API::Mcp::CONFIGURATION_IDENTIFIER).empty?
end
def tools_missing?
(McpTools.all.map(&:qualified_name) - McpConfiguration.pluck(:identifier)).any?
end
end
+7
View File
@@ -81,6 +81,7 @@ class RootSeeder < Seeder
seed_development_data if seed_development_data?
seed_plugins_data
seed_env_data
seed_mcp_configuration
cleanup_seed_data
end
@@ -179,6 +180,12 @@ class RootSeeder < Seeder
end
end
def seed_mcp_configuration
print_status "*** Seeding MCP configuration"
McpConfigurationSeeder.new(seed_data).seed!
McpConfigurationSeeder
end
def desired_lang
desired_lang = ENV.fetch("OPENPROJECT_SEED_LOCALE", Setting.default_language)
@@ -0,0 +1,106 @@
# 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 CustomFields
module Hierarchy
class HierarchicalItemFormatter
include NumberFormatHelper
class << self
def default
@default ||= new
end
end
# @param [Boolean] path Show the full item ancestor path if true
# @param [Boolean] label Show the item label if true
# @param [Boolean] suffix Show the item short or weight if true
# @param [Boolean] suffix_parentheses Wrap suffix in parentheses.
# @param [Integer] number_length_limit If formatting numbers, restrict the whole length of the number to the
# given limit before falling back to scientific notation.
# @param [Integer] number_integer_digit_limit If formatting numbers, restrict the integer part of the number to
# the given limit before falling back to scientific notation.
# @param [Integer] number_precision If formatting numbers, round to the given precision.
def initialize(path: false,
label: true,
suffix: true,
suffix_parentheses: true,
number_length_limit: 9,
number_integer_digit_limit: 8,
number_precision: 4)
@path = path
@label = label
@suffix = suffix
@suffix_parentheses = suffix_parentheses
@number_length_limit = number_length_limit
@number_integer_digit_limit = number_integer_digit_limit
@number_precision = number_precision
end
def format(item:)
path = []
path << ancestors(item) if @path
path << item.label if @label
str_parts = []
str_parts << path.join(" / ") if path.present?
if @suffix
suffix = format_suffix(item)
str_parts << suffix if suffix.present?
end
str_parts.join(" ")
end
private
def ancestors(item) = persistence_service.get_ancestors(item:).value!.filter_map(&:label)
def format_suffix(item)
return "" if item.short.nil? && item.weight.nil?
opts = {
length_limit: @number_length_limit,
digits: @number_integer_digit_limit,
precision: @number_precision
}
str = item.short.presence || number_with_limit(item.weight, opts)
@suffix_parentheses ? "(#{str})" : str
end
def persistence_service
@persistence_service ||= HierarchicalItemService.new
end
end
end
end
@@ -115,6 +115,14 @@ module CustomFields
Success(item.self_and_ancestors.reverse)
end
# Gets all nodes in a tree from the item/node back to the root without the item/node itself.
# Ordered from root to leaf
# @param item [CustomField::Hierarchy::Item] the parent of the node
# @return [Success(Array<CustomField::Hierarchy::Item>)]
def get_ancestors(item:)
Success(item.ancestors.reverse)
end
# Gets all descendant nodes in a tree starting from the item/node.
# @param item [CustomField::Hierarchy::Item] the node
# @param include_self [Boolean] flag
@@ -33,7 +33,7 @@ module IncomingEmails
REFERENCES_RE = %r{^<?op\.([a-z_]+)-(\d+)@}
IGNORED_HEADERS = {
AUTOMATIC_HEADERS = {
"X-Auto-Response-Suppress" => "oof",
"Auto-Submitted" => /\Aauto-/
}.freeze
@@ -41,6 +41,7 @@ module IncomingEmails
# Registry for mail handlers
def self.handlers
@handlers ||= [
IncomingEmails::Handlers::MeetingResponse,
IncomingEmails::Handlers::MessageReply,
IncomingEmails::Handlers::WorkPackage
]
@@ -60,9 +61,12 @@ module IncomingEmails
@email = email
@options = assign_options(options)
@sender_email = email.from.to_a.first.to_s.strip
@automated_email ||= automatic_header_present?
@logs = []
end
def automated_email? = !!@automated_email
def call!
return if ignore_mail?
@@ -71,7 +75,7 @@ module IncomingEmails
# We only dispatch the action if a user has been accepted or created
dispatch if user.present?
ensure
report_errors if !@success && Setting.report_incoming_email_errors?
report_errors unless @success
end
private
@@ -138,7 +142,7 @@ module IncomingEmails
self
.class
.handlers
.find { |h| h.handles?(email, reference:) }
.find { |h| h.handles?(email, reference:, automated_email: automated_email?) }
&.new(email, user:, plain_text_body:, reference:, options:)
end
@@ -175,6 +179,8 @@ module IncomingEmails
end
def report_errors
return if automated_email?
return unless Setting.report_incoming_email_errors?
return if logs.empty?
UserMailer.incoming_email_error(user, mail_as_hash(email), logs).deliver_later
@@ -202,7 +208,7 @@ module IncomingEmails
end
def ignore_mail?
mail_from_system? || ignored_by_header? || ignored_user? || mail_with_ics_attachment?
mail_from_system? || ignored_user?
end
def mail_from_system?
@@ -224,16 +230,14 @@ module IncomingEmails
.map { |mail| mail.to_s.strip.downcase }
end
def ignored_by_header?
# Ignore auto generated emails
IGNORED_HEADERS.each do |key, ignored_value|
def automatic_header_present?
AUTOMATIC_HEADERS.each do |key, ignored_value|
value = email.header[key]
next if value.blank?
value = value.to_s.downcase
if (ignored_value.is_a?(Regexp) && value.match(ignored_value)) || value == ignored_value
log "ignoring email with #{key}:#{value} header", report: false
# no point reporting back in case of auto-generated emails
log "email has automated #{key}:#{value} header", report: false
return true
end
end
@@ -250,16 +254,6 @@ module IncomingEmails
end
end
def mail_with_ics_attachment?
if email.attachments.any? { |a| a.content_type.start_with?("text/calendar") } ||
(email.multipart? && email.parts.any? { |part| part.content_type.start_with?("text/calendar") })
log "ignoring email with calendar attachment from [#{sender_email}]"
true
else
false
end
end
# Find a matching object reference in the mail's references header.
# We set this header in outgoing emails to include an encoded reference to the object
def object_reference_from_header
@@ -40,7 +40,7 @@ module IncomingEmails::Handlers
end
# Override in subclasses to determine if this handler can process the email
def self.handles?(email, reference:)
def self.handles?(email, reference:, automated_email:)
raise NotImplementedError, "Subclasses must implement can_handle? method"
end
@@ -0,0 +1,60 @@
# 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 IncomingEmails::Handlers
class MeetingResponse < Base
# Override in subclasses to determine if this handler can process the email
def self.handles?(email, **)
email.attachments.any? { |a| a.content_type.start_with?("text/calendar") } ||
(email.multipart? && email.parts.any? { |part| part.content_type.start_with?("text/calendar") })
end
# Override in subclasses to process the email
def process
ical_string = extract_ical_string
if ical_string.blank?
return ServiceResult.failure(message: "No iCalendar data found in email from [#{user.mail}]")
end
AllMeetings::HandleICalResponseService.new(user: user).call(ical_string: ical_string)
end
private
def extract_ical_string
attachment = email.attachments.find { |a| a.content_type.start_with?("text/calendar") }
return attachment.decoded if attachment
calendar_part = email.parts.find { |part| part.content_type.start_with?("text/calendar") }
if calendar_part
Redmine::CodesetUtil.to_utf8(calendar_part.body.decoded, calendar_part.charset)
end
end
end
end
@@ -30,8 +30,8 @@
module IncomingEmails::Handlers
class MessageReply < Base
# Override in subclasses to determine if this handler can process the email
def self.handles?(_email, reference:)
reference[:klass] == "message"
def self.handles?(_email, reference:, automated_email:)
!automated_email && reference[:klass] == "message"
end
# Override in subclasses to process the email
@@ -38,7 +38,9 @@ module IncomingEmails::Handlers
include WorkPackages::SkipAuthorizationChecks
end
def self.handles?(_email, reference:)
def self.handles?(_email, reference:, automated_email:)
return false if automated_email
# Handle work package replies if there's a references match
# And handle defaults
reference[:klass].nil? || %w[work_package journal].include?(reference[:klass])
+73
View File
@@ -0,0 +1,73 @@
# 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.
#++
class JsonSchemaLoader
def initialize(base_path: "docs/api/apiv3/components/schemas")
@base_path = base_path
end
def load(schema_name)
load_file("#{@base_path}/#{schema_name}.yml")
end
private
def load_file(file_name)
return schema_cache.fetch(file_name) if schema_cache.key?(file_name)
schema = YAML.load_file(file_name).deep_symbolize_keys
schema = resolve_references(schema, file_name)
schema_cache[file_name] = schema
end
def resolve_references(schema, file_name)
if schema.key?(:$ref)
ref_file = File.join(File.dirname(file_name), schema.fetch(:$ref))
return load_file(ref_file)
end
schema.to_h do |key, value|
next [key, resolve_references(value, file_name)] if value.is_a?(Hash)
if value.is_a?(Array)
next [
key,
value.map { |v| v.is_a?(Hash) ? resolve_references(v, file_name) : v }
]
end
[key, value]
end
end
def schema_cache
@schema_cache ||= {}
end
end
+47
View File
@@ -0,0 +1,47 @@
# 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 McpTools
class << self
def all
[
McpTools::SearchProject
]
end
def enabled
McpConfiguration.where(enabled: true).pluck(:identifier).filter_map { |name| tools_by_name[name] }
end
def tools_by_name
all.index_by(&:qualified_name)
end
end
end
+106
View File
@@ -0,0 +1,106 @@
# 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 McpTools
class Base
class << self
def qualified_name
"tools/#{name}"
end
def default_title(title = nil)
@default_title = title if title.present?
@default_title
end
def default_description(description = nil)
@default_description = description if description.present?
@default_description
end
def name(name = nil)
@name = name if name.present?
@name
end
def input_schema(schema = nil)
@input_schema = schema if schema.present?
@input_schema
end
def output_schema(schema = nil)
@output_schema = schema if schema.present?
@output_schema
end
def tool
config = McpConfiguration.find_by(identifier: qualified_name)
return nil if config.nil?
implementation = self
MCP::Tool.define(
name:,
title: config.title,
description: config.description,
input_schema:,
output_schema:
) do |opts|
implementation.new(tool_context: self).handle_request(**opts)
end
end
end
def initialize(tool_context:)
@tool_context = tool_context
end
def handle_request(**)
result = call(**)
if Rails.env.local?
# We are only validating the output during development, so we can see errors during dev, but do not break the
# API in production due to minor schema differences.
@tool_context.output_schema.validate_result(result.to_json)
end
MCP::Tool::Response.new([{ type: "text", text: result.to_json }], structured_content: result)
end
# Intended to be implemented by subclasses. It should return a structured result (e.g. a Hash or Array).
def call(**)
raise NotImplemented, "#{self.class} needs to implement #call method"
end
end
end
+74
View File
@@ -0,0 +1,74 @@
# 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 McpTools
class SearchProject < Base
# TODO: The mcp gem does not support pagination, so we only limit the number of results for now
MAX_SIZE = 100
default_title "Search projects"
default_description "Search projects matching all of the passed input parameters. " \
"Parameters not passed are ignored. Results are limited to a maximum of #{MAX_SIZE} projects."
name "search_project"
input_schema(
properties: {
name: { type: "string", description: "Name of the project. Accepts partial project names, not case-sensitive." },
identifier: { type: "string", description: "Project indentifier. Case-sensitive, matching exactly." },
status_code: { type: "string", enum: Project.status_codes.keys, description: "The project status." }
}
)
output_schema(
type: :array,
items: JsonSchemaLoader.new.load("project_model")
)
def call(name: nil, identifier: nil, status_code: nil)
query = { name:, identifier:, status_code: }.compact
if query.present?
projects = projects_for_query(query)
projects.map { |p| API::V3::Projects::ProjectRepresenter.create(p, current_user: User.current) }
else
[]
end
end
private
def projects_for_query(query)
name = query.delete(:name)
projects = Project.visible.where(query).limit(MAX_SIZE)
projects = projects.where("name ILIKE '%#{OpenProject::SqlSanitization.quoted_sanitized_sql_like(name)}%'") if name
projects
end
end
end
+8 -1
View File
@@ -33,7 +33,14 @@ See COPYRIGHT and LICENSE files for more details.
url: { controller: "/account", action: "login" },
method: :post
) do |form_builder|
render(LoginForm.new(form_builder, back_url: back_url_to_current_page, username: params[:username]))
render(
LoginForm.new(
form_builder,
back_url: back_url_to_current_page,
username: params[:username],
id_suffix: "-pulldown"
)
)
end
%>
+23 -8
View File
@@ -1,9 +1,24 @@
<%= nonced_javascript_include_tag "openapi-explorer.min.js" %>
<%= nonced_javascript_include_tag variable_asset_path("openapi-explorer.js"), skip_pipeline: true %>
<%= content_tag(
"openapi-explorer",
"",
"spec-url": api_v3_paths.api_spec,
"server-url": api_v3_paths.root_path,
"nav-bg-color": color_by_variable("main-menu-bg-color")
) %>
<%= nonced_javascript_tag do %>
(function() {
// set openapi-explorer parent width and height explicitly to prevent them being set to 100vw/100vh by the script
// which leads to double scroll bars
// https://github.com/Authress-Engineering/openapi-explorer/blob/49d4d32de6fd7b14a8f5f95fbfefa8cd72e72587/src/openapi-explorer.js#L191-L196
const contentBody = document.getElementById('content-body');
if (contentBody) {
contentBody.style.width = 'auto';
contentBody.style.height = 'auto';
}
})();
<% end %>
<%=
content_tag(
"openapi-explorer",
"",
"spec-url": api_v3_paths.api_spec,
"server-url": api_v3_paths.root_path,
"nav-bg-color": color_by_variable("main-menu-bg-color")
)
%>
-1
View File
@@ -39,7 +39,6 @@ Disallow: <%= activities_path %>
Disallow: /activity
Disallow: <%= search_path %>
Disallow: /project_queries/configure_view_modal
Disallow: /projects/export_list_modal
<%# Generally allow /projects but disallow those links that change columns, sort order or per page settings %>
Disallow: /projects?*columns=
Disallow: /projects?*sortBy=
@@ -22,6 +22,7 @@
<div class="form--field -required">
<%= f.text_field :mail,
required: true,
disabled: !(@user.new_record? || User.current.admin?),
container_class: "-middle" %>
</div>
+3 -8
View File
@@ -49,17 +49,12 @@ OpenProject::FeatureDecisions.add :calculated_value_project_attribute,
description: "Allows the use of calculated values as a project attribute.",
force_active: true
OpenProject::FeatureDecisions.add :oidc_group_sync,
description: "Allows to synchronize groups from OpenID Connect providers",
force_active: true
OpenProject::FeatureDecisions.add :scim_api,
description: "Enables SCIM API.",
force_active: true
OpenProject::FeatureDecisions.add :beta_widgets,
description: "Enables BETA versions of widgets."
OpenProject::FeatureDecisions.add :mcp_server,
description: "Enables the experimental MCP API."
OpenProject::FeatureDecisions.add :minutes_styling_meeting_pdf,
description: "Allow exporting a meeting with FITKO styling. " \
"See #65124 for details."
+43
View File
@@ -0,0 +1,43 @@
# 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.
#++
MCP.configure do |config|
config.exception_reporter = lambda do |exception, server_context|
cause = exception.cause
message = "Unhandled exception occured during MCP request: #{exception}"
if cause
message += ", caused by #{cause} at #{cause.backtrace.first}"
end
Rails.logger.error message
OpenProject::Appsignal.trace_exception(exception, server_context) if OpenProject::Appsignal.enabled?
OpenProject::OpenTelemetry.trace_exception(exception, server_context) if OpenProject::OpenTelemetry.enabled?
end
end
+1 -1
View File
@@ -588,7 +588,7 @@ Redmine::MenuManager.map :admin_menu do |menu|
menu.push :scim_clients,
{ controller: "/admin/scim_clients", action: "index" },
if: ->(_) { User.current.admin? && OpenProject::FeatureDecisions.scim_api_active? },
if: ->(_) { User.current.admin? },
parent: :authentication,
caption: ScimClient.model_name.human(count: 2),
enterprise_feature: "scim_api"
+1 -1
View File
@@ -158,7 +158,7 @@ Rails.application.reloader.to_prepare do
map.permission :export_projects,
{
projects: %i[export_list_modal export_project_initiation_pdf]
projects: %i[export_project_initiation_pdf]
},
permissible_on: :project,
dependencies: :view_project
-3
View File
@@ -43,9 +43,6 @@ Rails.application.config.to_prepare do
)
return handle_scim_error(error)
end
if !OpenProject::FeatureDecisions.scim_api_active?
return handle_scim_error(Scimitar::AuthenticationError.new)
end
warden = request.env["warden"]
user = warden.authenticate(scope: :scim_v2)
+4
View File
@@ -58,6 +58,10 @@ OpenProject::Authentication.update_strategies(OpenProject::Authentication::Scope
%i[oauth jwt_oidc]
end
OpenProject::Authentication.update_strategies(OpenProject::Authentication::Scope::MCP_SCOPE, { store: false }) do |_|
%i[oauth jwt_oidc]
end
Rails.application.configure do |app|
app.config.middleware.use OpenProject::Authentication::Manager, intercept_401: false # rubocop:disable Naming/VariableNumber
end
+4 -1
View File
@@ -1511,7 +1511,8 @@ af:
not_a_datetime: "is not a valid date time."
not_a_number: "is not a number."
not_allowed: "is invalid because of missing permissions."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "is not an integer."
not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD."
not_same_project: "doesn't belong to the same project."
@@ -2168,6 +2169,7 @@ af:
button_print: "Print"
button_quote: "Haal aan"
button_remove: Remove
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "Hernoem"
button_replace: "Replace"
@@ -4724,6 +4726,7 @@ af:
Note: if enabled, this will display a badge with your installation status in the <a href="%{information_panel_path}">%{information_panel_label}</a> administration panel, and on the home page. It is displayed to administrators only. <br/> The badge will check your current OpenProject version against the official OpenProject release database to alert you of any updates or known vulnerabilities. For more information on what the check provides, what data is needed to provide available updates, and how to disable this check, please visit <a href="%{more_info_url}">the configuration documentation</a>.
text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Plugin assets directory writable"
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
+4 -1
View File
@@ -1547,7 +1547,8 @@ ar:
not_a_datetime: "is not a valid date time."
not_a_number: "ليس رقماً."
not_allowed: "is invalid because of missing permissions."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "ليس عدداً صحيحاً."
not_an_iso_date: "ليس تاريخًا صالحًا. الشكل المطلوب: YYYY-MM-DD."
not_same_project: "لا ينتمي إلى نفس المشروع."
@@ -2272,6 +2273,7 @@ ar:
button_print: "طباعة"
button_quote: "اقتباس"
button_remove: إزالة
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "اعادة التّسمية"
button_replace: "Replace"
@@ -4918,6 +4920,7 @@ ar:
Note: if enabled, this will display a badge with your installation status in the <a href="%{information_panel_path}">%{information_panel_label}</a> administration panel, and on the home page. It is displayed to administrators only. <br/> The badge will check your current OpenProject version against the official OpenProject release database to alert you of any updates or known vulnerabilities. For more information on what the check provides, what data is needed to provide available updates, and how to disable this check, please visit <a href="%{more_info_url}">the configuration documentation</a>.
text_own_membership_delete_confirmation: "أنت على وشك إزالة بعض أو كافة الأذونات الخاصة بك، وقد لن تكون قادراً على تحرير هذا المشروع بعد ذلك. هل أنت متأكد من أنك تريد المتابعة؟"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "دليل أصول البرنامج المساعدة القابل للكتابة"
text_powered_by: "بواسطة %{link}"
text_project_identifier_info: "يتم السماح فقط رسائل الحالة الأدنى (أ-ي) وأرقام، والشرطات وتسطير، يجب أن تبدأ بحرف حالة الأدنى."
+4 -1
View File
@@ -1511,7 +1511,8 @@ az:
not_a_datetime: "is not a valid date time."
not_a_number: "is not a number."
not_allowed: "is invalid because of missing permissions."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "is not an integer."
not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD."
not_same_project: "doesn't belong to the same project."
@@ -2168,6 +2169,7 @@ az:
button_print: "Print"
button_quote: "Sitat"
button_remove: Remove
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "Rename"
button_replace: "Replace"
@@ -4724,6 +4726,7 @@ az:
Note: if enabled, this will display a badge with your installation status in the <a href="%{information_panel_path}">%{information_panel_label}</a> administration panel, and on the home page. It is displayed to administrators only. <br/> The badge will check your current OpenProject version against the official OpenProject release database to alert you of any updates or known vulnerabilities. For more information on what the check provides, what data is needed to provide available updates, and how to disable this check, please visit <a href="%{more_info_url}">the configuration documentation</a>.
text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Plugin assets directory writable"
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
+4 -1
View File
@@ -1529,7 +1529,8 @@ be:
not_a_datetime: "is not a valid date time."
not_a_number: "is not a number."
not_allowed: "is invalid because of missing permissions."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "is not an integer."
not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD."
not_same_project: "doesn't belong to the same project."
@@ -2220,6 +2221,7 @@ be:
button_print: "Print"
button_quote: "Quote"
button_remove: Remove
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "Rename"
button_replace: "Replace"
@@ -4822,6 +4824,7 @@ be:
Note: if enabled, this will display a badge with your installation status in the <a href="%{information_panel_path}">%{information_panel_label}</a> administration panel, and on the home page. It is displayed to administrators only. <br/> The badge will check your current OpenProject version against the official OpenProject release database to alert you of any updates or known vulnerabilities. For more information on what the check provides, what data is needed to provide available updates, and how to disable this check, please visit <a href="%{more_info_url}">the configuration documentation</a>.
text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Plugin assets directory writable"
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
+4 -1
View File
@@ -1511,7 +1511,8 @@ bg:
not_a_datetime: "не е валидна дата и час."
not_a_number: "не е число."
not_allowed: "е невалиден поради липса на достъп."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "не е цяло число."
not_an_iso_date: "не е валидна дата. Изискван формат: ГГГГ-ММ-ДД."
not_same_project: "не принадлежат към един и същ проект."
@@ -2168,6 +2169,7 @@ bg:
button_print: "Отпечатване"
button_quote: "Цитат"
button_remove: Премахване
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "Преименуване"
button_replace: "Замени"
@@ -4724,6 +4726,7 @@ bg:
Note: if enabled, this will display a badge with your installation status in the <a href="%{information_panel_path}">%{information_panel_label}</a> administration panel, and on the home page. It is displayed to administrators only. <br/> The badge will check your current OpenProject version against the official OpenProject release database to alert you of any updates or known vulnerabilities. For more information on what the check provides, what data is needed to provide available updates, and how to disable this check, please visit <a href="%{more_info_url}">the configuration documentation</a>.
text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Plugin assets directory writable"
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
+4 -1
View File
@@ -1508,7 +1508,8 @@ ca:
not_a_datetime: "no és una data-i-hora vàlida."
not_a_number: "no és un número."
not_allowed: "és invàlid perquè falten permisos."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "no és un enter."
not_an_iso_date: "no és una data vàlida. Format requerit: AAAA-MM-DD."
not_same_project: "no pertany al mateix projecte."
@@ -2165,6 +2166,7 @@ ca:
button_print: "Imprimir"
button_quote: "Citar"
button_remove: Suprimir
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "Renombrar"
button_replace: "Substitueix"
@@ -4715,6 +4717,7 @@ ca:
Nota: si està activat, es mostra un indicador amb l'estat de la teva instal·lació <a href="%{information_panel_path}">%{information_panel_label}</a> en el panell d'administració i a la pàgina inicial. Només es mostra als administradors. <br/> L'indicador comprova la teva versió d'OpenProject actual amb la versió oficial i t'avisa si hi ha actualitzacions o qualsevol vulnerabilitat. Per a més informació en quina informació es proveïx, quines dades són necessàries per actualitzacions i com desactivar aquesta funció, si us plau, visita <a href="%{more_info_url}">la documentació de configuració</a>.
text_own_membership_delete_confirmation: "Estàs a punt d'eliminar algun o tots els teus permisos i potser no podreu editar més aquest projecte.\nEstàs segur que vols continuar?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Es pot escriure als complements actius"
text_powered_by: "Desenvolupat per %{link}"
text_project_identifier_info: "Només es permeten lletres minúscules (a-z), números, guions i guions baixos, i ha de començar amb una lletra minúscula."
+4 -1
View File
@@ -1511,7 +1511,8 @@ ckb-IR:
not_a_datetime: "is not a valid date time."
not_a_number: "is not a number."
not_allowed: "is invalid because of missing permissions."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "is not an integer."
not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD."
not_same_project: "doesn't belong to the same project."
@@ -2168,6 +2169,7 @@ ckb-IR:
button_print: "Print"
button_quote: "Quote"
button_remove: Remove
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "Rename"
button_replace: "Replace"
@@ -4724,6 +4726,7 @@ ckb-IR:
Note: if enabled, this will display a badge with your installation status in the <a href="%{information_panel_path}">%{information_panel_label}</a> administration panel, and on the home page. It is displayed to administrators only. <br/> The badge will check your current OpenProject version against the official OpenProject release database to alert you of any updates or known vulnerabilities. For more information on what the check provides, what data is needed to provide available updates, and how to disable this check, please visit <a href="%{more_info_url}">the configuration documentation</a>.
text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Plugin assets directory writable"
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
+29 -26
View File
@@ -1265,7 +1265,7 @@ cs:
enabled_modules: "Povolené moduly"
identifier: "Identifikátor"
latest_activity_at: "Poslední aktivita"
parent: "Nadřazený projekt"
parent: "Podprojekt"
project_creation_wizard_enabled: "Project initiation request"
public_value:
title: "Viditelnost"
@@ -1529,7 +1529,8 @@ cs:
not_a_datetime: "není platný čas."
not_a_number: "není číslo."
not_allowed: "je neplatný z důvodu chybějících oprávnění."
not_json: "není platný objekt JSON."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "není celé číslo."
not_an_iso_date: "není platné datum. Požadovaný formát: RRRR-MM-DD."
not_same_project: "nepatří do stejného projektu."
@@ -1632,7 +1633,7 @@ cs:
meeting:
error_conflict: "Nelze uložit, protože schůzku mezitím aktualizoval někdo jiný. Znovu načtěte stránku."
notifications:
at_least_one_channel: "Pro odesílání notifikací musí být specifikován alespoň jeden kanál"
at_least_one_channel: "Alespoň jeden kanál pro odesílání oznámení musí být specifikován."
attributes:
read_ian:
read_on_creation: "nelze nastavit na pravdivé při vytváření oznámení "
@@ -1930,11 +1931,11 @@ cs:
member: "Člen"
news: "Novinky"
notification:
one: "Notifikace"
few: "Notifikací"
many: "Notifikací"
other: "Notifikace"
placeholder_user: "Placeholder uživatel"
one: "Oznámení"
few: "Oznámení"
many: "Oznámení"
other: "Oznámení"
placeholder_user: "placeholder uživatel"
project:
one: "Projekt"
few: "Projekty"
@@ -2220,6 +2221,7 @@ cs:
button_print: "Tisk"
button_quote: "Citovat"
button_remove: Odstranit
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Odstranit připomenutí"
button_rename: "Přejmenovat"
button_replace: "Nahradit"
@@ -2986,7 +2988,7 @@ cs:
instructions_after_error: "Zkuste se znovu přihlásit kliknutím na %{signin}. Pokud chyba přetrvává, požádejte správce o pomoc."
menus:
admin:
mail_notification: "E-mailové notifikace"
mail_notification: "E-mailová upozornění"
mails_and_notifications: "E-maily a oznámení"
aggregation: "Agregace"
api_and_webhooks: "API & Webhooky"
@@ -3050,7 +3052,7 @@ cs:
by_project: "Nepřečteno dle projektu"
by_reason: "Důvod"
inbox: "Doručená pošta"
send_notifications: "Pro tuto akci odeslat notifikaci"
send_notifications: "Odeslat oznámení pro tuto akci"
work_packages:
subject:
created: "Pracovní balíček byl vytvořen."
@@ -3491,9 +3493,9 @@ cs:
label_permissions: "Práva"
label_permissions_report: "Přehled oprávnění"
label_personalize_page: "Přizpůsobit tuto stránku"
label_placeholder_user: "Placeholder uživatel"
label_placeholder_user: "placeholder uživatel"
label_placeholder_user_new: ""
label_placeholder_user_plural: "Placeholder uživatelé"
label_placeholder_user_plural: "placeholder uživatelé"
label_planning: "Plánování"
label_please_login: "Přihlaste se prosím"
label_plugins: "Pluginy"
@@ -3517,7 +3519,7 @@ cs:
label_project_attribute_plural: "Atributy projektu"
label_project_attribute_manage_link: "Správa atributů produktu"
label_project_count: "Celkový počet projektů"
label_project_copy_notifications: "Během kopírování projektu odeslat notifikace e-mailem"
label_project_copy_notifications: "Během kopie projektu odeslat oznámení e-mailem"
label_project_initiation_export_pdf: "Export PDF for %{project_creation_name}"
label_project_latest: "Nejnovější projekty"
label_project_default_type: "Povolit prázdný typ"
@@ -3685,7 +3687,7 @@ cs:
label_version_new: "Nová verze"
label_version_edit: "Upravit verzi"
label_version_plural: "Verze"
label_version_sharing_descendants: "S podprojekty"
label_version_sharing_descendants: "S Podprojekty"
label_version_sharing_hierarchy: "S hierarchií projektu"
label_version_sharing_none: "Není sdíleno"
label_version_sharing_system: "Se všemi projekty"
@@ -3793,28 +3795,28 @@ cs:
digests:
including_mention_singular: "včetně zmínky"
including_mention_plural: "včetně %{number_mentioned} zmínění"
unread_notification_singular: "1 nepřečtená notifikace"
unread_notification_plural: "%{number_unread} nepřečtených notifikací"
unread_notification_singular: "1 nepřečtené oznámení"
unread_notification_plural: "%{number_unread} nepřečtených oznámení"
you_have: "Máte"
logo_alt_text: "Logo"
mention:
subject: "%{user_name} vás zmínil v #%{id} - %{subject}"
notification:
center: "Centrum notifikací"
center: "Centrum oznámení"
see_in_center: "Zobrazit komentář v oznamovacím centru"
settings: "Změnit nastavení e-mailu"
salutation: "Ahoj %{user}!"
salutation_full_name: "Jméno a příjmení"
work_packages:
created_at: "Vytvořeno v %{timestamp} uživatelem %{user} "
login_to_see_all: "Přihlaste se pro zobrazení všech notifikací."
login_to_see_all: "Přihlaste se pro zobrazení všech oznámení."
mentioned: "Byli jste <b>zmíněni v komentáři</b>"
mentioned_by: "%{user} vás zmínil v komentáři OpenProject"
more_to_see:
one: "Existuje ještě 1 pracovní balíček s notifikací."
few: "Existuje ještě %{count} pracovních balíčků s notifikacema."
many: "Existuje ještě %{count} pracovních balíčků s notifikacema."
other: "Existuje ještě %{count} pracovních balíčků s notifikacema."
one: "Máte ještě 1 pracovní balíček s notifikací."
few: "Existuje ještě %{count} pracovních balíčků s oznámeními."
many: "Máte ještě %{count} pracovních balíčků s notifikacemi."
other: "Existuje ještě %{count} pracovních balíčků s oznámeními."
open_in_browser: "Otevřít v prohlížeči"
reason:
watched: "Sledováno"
@@ -3823,7 +3825,7 @@ cs:
mentioned: "Zmíněné"
shared: "Sdílené"
subscribed: "vše"
prefix: "Obdrženo z důvodu nastavení notifikací: %{reason}"
prefix: "Obdrženo z důvodu nastavení oznámení: %{reason}"
date_alert_start_date: "Upozornění na datum"
date_alert_due_date: "Upozornění na datum"
reminder: "Připomínka"
@@ -4122,7 +4124,7 @@ cs:
permission_move_work_packages: "Přesun pracovních balíčků"
permission_protect_wiki_pages: "Ochrana stránky wiki"
permission_rename_wiki_pages: "Přejmenovat stránky wiki"
permission_save_queries: "Uložit zobrazení"
permission_save_queries: "Uložit pohled"
permission_search_project: "Hledat projekt"
permission_select_custom_fields: "Vybrat vlastní pole"
permission_select_project_custom_fields: "Vyberte atributy projektu"
@@ -4594,7 +4596,7 @@ cs:
enable_subscriptions_text_html: Umožňuje uživatelům s nezbytnými oprávněními přihlásit se do OpenProject kalendářů a získat přístup k informacím o pracovním balíčku prostřednictvím externího klienta kalendáře. <strong>Poznámka:</strong> Před povolením si prosím přečtěte <a href="%{link}" target="_blank">podrobnosti o odběru</a>.
language_name_being_default: "%{language_name} (výchozí)"
notifications:
events_explanation: "Určuje, pro kterou událost je odeslán e-mail. Pracovní balíčky jsou z tohoto seznamu vyloučeny, protože notifikace pro ně mohou být nastavena speciálně pro každého uživatele."
events_explanation: "Určuje, pro kterou událost je odeslán e-mail. Pracovní balíčky jsou z tohoto seznamu vyloučeny, protože oznámení pro ně mohou být nastavena speciálně pro každého uživatele."
delay_minutes_explanation: "Odesílání e-mailu může být pozdrženo, aby bylo uživatelům s nakonfigurovaným v oznámení aplikace před odesláním pošty potvrzeno oznámení. Uživatelé, kteří si přečtou oznámení v aplikaci, nedostanou e-mail pro již přečtené oznámení."
other: "Ostatní"
passwords: "Hesla"
@@ -4775,7 +4777,7 @@ cs:
text_destroy_with_associated: "Existují další objekty, které jsou přiřazeny k pracovním balíčkům a které mají být odstraněny. Tyto objekty jsou následující typy:"
text_destroy_what_to_do: "Co chcete udělat?"
text_diff_truncated: "... Toto rozlišení bylo zkráceno, protože přesahuje maximální velikost, kterou lze zobrazit."
text_email_delivery_not_configured: "Doručení e-mailu není nakonfigurováno a notifikace jsou zakázány.\nNakonfigurujte váš SMTP server pro jejich povolení."
text_email_delivery_not_configured: "Doručení e-mailu není nakonfigurováno a oznámení jsou zakázána.\nNakonfigurujte váš SMTP server pro jejich povolení."
text_enumeration_category_reassign_to: "Přiřadit je k této hodnotě:"
text_enumeration_destroy_question: "%{count} objektů je přiřazeno k této hodnotě."
text_file_repository_writable: "Do adresáře příloh lze zapisovat"
@@ -4821,6 +4823,7 @@ cs:
Poznámka: Pokud je povoleno, bude zobrazen odznak se stavem instalace v <a href="%{information_panel_path}">%{information_panel_label}</a> administrativním panelu, a na domovské stránce. Zobrazuje se pouze administrátorům. <br/> Odznak zkontroluje vaši aktuální verzi OpenProject proti oficiální databázi OpenProject release, aby vás upozornil na jakékoliv aktualizace nebo známá slabá místa. Pro více informací o tom, co kontrola stanoví, jaké údaje jsou potřebné k poskytnutí dostupných aktualizací, a jak tuto kontrolu zakázat, navštivte <a href="%{more_info_url}">konfigurační dokumentaci</a>.
text_own_membership_delete_confirmation: "Chystáte se odebrat si některá nebo všechna svá oprávnění, potom již nemusíte být schopni upravit tento projekt.\nOpravdu chcete pokračovat?"
text_permanent_delete_confirmation_checkbox_label: "Beru na vědomí, že toto vymazání nelze vzít zpět."
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Zapisovatelný adresář aktiv pluginu"
text_powered_by: "Běží na %{link}"
text_project_identifier_info: "Jsou povolena pouze malá písmena (a-z), číslice, pomlčky a podtržítka. Musí začínat malým písmenem."
+4 -1
View File
@@ -1509,7 +1509,8 @@ da:
not_a_datetime: "is not a valid date time."
not_a_number: "er ikke et tal."
not_allowed: "is invalid because of missing permissions."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "er ikke et heltal."
not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD."
not_same_project: "hører ikke til samme projekt."
@@ -2166,6 +2167,7 @@ da:
button_print: "Print"
button_quote: "Citer"
button_remove: Fjern
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "Omdøb"
button_replace: "Replace"
@@ -4720,6 +4722,7 @@ da:
Note: if enabled, this will display a badge with your installation status in the <a href="%{information_panel_path}">%{information_panel_label}</a> administration panel, and on the home page. It is displayed to administrators only. <br/> The badge will check your current OpenProject version against the official OpenProject release database to alert you of any updates or known vulnerabilities. For more information on what the check provides, what data is needed to provide available updates, and how to disable this check, please visit <a href="%{more_info_url}">the configuration documentation</a>.
text_own_membership_delete_confirmation: "Du er ved at fjerne nogle af, eller alle dine tilladelser og vil muligvis ikke kunne redigere projektet herefter.\nEr du sikker på, du vil fortsætte?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Brug af plugin forudsætter at dette arkiv er skrivbart"
text_powered_by: "Drevet af %{link}"
text_project_identifier_info: "Kun små bogstaver (a-z), tal, - og _ er tilladt; først tegn skal være et bogstav."
+18 -15
View File
@@ -85,11 +85,11 @@ de:
title: "Enterprise-Token hinzufügen"
type_token_text: "Enterprise-Token Text"
token_placeholder: "Enterprise-Token Text hier einfügen"
add_token: "Enterprise-Edition Support Token hochladen"
add_token: "Enterprise edition Support Token hochladen"
replace_token: "Aktuellen Enterprise edition Support Token ersetzen"
order: "Enterprise on-premises bestellen"
paste: "Enterprise-Edition Support Token hier einfügen"
required_for_feature: "Dieses Add-on ist nur mit einem aktiven Enterprise-Edition Support-Token verfügbar."
paste: "Enterprise edition Support Token hier einfügen"
required_for_feature: "Dieses Add-on ist nur mit einem aktiven Enterprise edition Support-Token verfügbar."
enterprise_link: "Klicken Sie hier für weitere Informationen."
start_trial: "Kostenlose Testversion starten"
book_now: "Jetzt buchen"
@@ -894,10 +894,10 @@ de:
tab: "Titel konfigurieren"
manually_editable_subjects:
label: "Manuell bearbeitbare Titel"
caption: "Nutzer:innen können die Titel der Arbeitspakete ohne Einschränkungen manuell eingeben und bearbeiten."
caption: "Benutzer können die Titel der Arbeitspakete ohne Einschränkungen manuell eingeben und bearbeiten."
automatically_generated_subjects:
label: "Automatisch generierte Titel"
caption: "Definieren Sie ein Schema aus referenzierten Attributen und Freitext für die automatische Generierung von Arbeitspakettiteln. Nutzer:innen können diese nicht manuell editieren."
caption: "Definieren Sie ein Schema aus referenzierten Attributen und Freitext für die automatische Generierung von Arbeitspakettiteln. Nutzer können diese nicht manuell editieren."
token:
label_with_context: "%{attribute_context}: %{attribute_label}"
context:
@@ -951,7 +951,7 @@ de:
manual_with_children: "Hat Unteraufgaben aber ihre Startdaten werden ignoriert."
title:
automatic_mobile: "Automatisch geplant."
automatic_with_children: "Unteraufgaben bestimmen Termine."
automatic_with_children: "Die Termine sind durch untergeordnete Arbeitspakete bestimmt."
automatic_with_predecessor: "Der Anfangstermin wird von einem Vorgänger festgelegt."
manual_mobile: "Manuell geplant."
manually_scheduled: "Manuell geplant Daten unabhängig von Beziehungen."
@@ -1054,7 +1054,7 @@ de:
label_child_plural: "Unteraufgaben"
new_child: "Neue Unteraufgabe"
new_child_description: "Erstellt ein zugehöriges Arbeitspaket als Unteraufgabe des aktuellen (übergeordneten) Arbeitspakets"
child: "Unteraufgabe"
child: "Kind"
child_description: "Macht das zugehörige Arbeitspaket zu einer Unteraufgabe des aktuellen (übergeordneten) Arbeitspakets"
parent: "Übergeordnetes Arbeitspaket"
parent_description: "Wandelt das verknüpfte in ein übergeordnetes Arbeitspaket dieses Arbeitspakets um"
@@ -1294,7 +1294,7 @@ de:
column_names: "Spalten"
relations_to_type_column: "Beziehungen zu %{type}"
relations_of_type_column: "Beziehungen der Art: %{type}"
child_work_packages: "Unteraufgaben"
child_work_packages: "Kinder"
group_by: "Gruppiere Ergebnisse nach"
sort_by: "Ergebnisse sortieren nach"
filters: "Filter"
@@ -1503,7 +1503,8 @@ de:
not_a_datetime: "ist kein gültiges Datum."
not_a_number: "ist keine Zahl."
not_allowed: "ist ungültig aufgrund fehlender Berechtigungen."
not_json: "ist kein gültiges JSON-Objekt."
not_json: "konnte nicht als JSON gelsen werden."
not_json_object: "ist kein gültiges JSON-Objekt."
not_an_integer: "ist keine ganzzahlige Zahl."
not_an_iso_date: "ist kein gültiges Datum - Erwartetes Format: YYY-MM-DD."
not_same_project: "gehört nicht zum selben Projekt."
@@ -1789,7 +1790,7 @@ de:
status_transition_invalid: "ist ungültig, da kein valider Übergang vom alten zum neuen Status für die aktuelle Rolle des Nutzers existiert."
status_invalid_in_type: "ist ungültig, da der aktuelle Status nicht in diesem Typ vorhanden ist."
type:
cannot_be_milestone_due_to_children: "kann kein Meilenstein werden, da dieses Arbeitspaket Unteraufgaben besitzt."
cannot_be_milestone_due_to_children: "kann kein Meilenstein werden, da dieses Arbeitspaket Unterelemente besitzt."
priority_id:
only_active_priorities_allowed: "muss aktiv sein."
category:
@@ -2160,6 +2161,7 @@ de:
button_print: "Drucken"
button_quote: "Zitieren"
button_remove: Entfernen
button_remove_permanently: "Endgültig löschen"
button_remove_reminder: "Erinnerung entfernen"
button_rename: "Umbenennen"
button_replace: "Ersetzen"
@@ -2580,7 +2582,7 @@ de:
error_custom_option_not_found: "Option ist nicht vorhanden."
error_enterprise_plan_needed: "Sie benötigen den Enterprise-Plan %{plan}, um diese Aktion durchzuführen."
error_enterprise_activation_user_limit: "Ihr Konto konnte nicht aktiviert werden (Nutzerlimit erreicht). Bitte kontaktieren Sie Ihren Administrator um Zugriff zu erhalten."
error_enterprise_token_invalid_domain: "Die Enterprise-Edition ist nicht aktiv. Die aktuelle Domain (%{actual}) entspricht nicht dem erwarteten Hostnamen (%{expected})."
error_enterprise_token_invalid_domain: "Die Enterprise edition ist nicht aktiv. Die aktuelle Domain (%{actual}) entspricht nicht dem erwarteten Hostnamen (%{expected})."
error_failed_to_delete_entry: "Fehler beim Löschen dieses Eintrags."
error_in_dependent: "Fehler beim Versuch, abhängiges Objekt zu ändern: %{dependent_class} #%{related_id} - %{related_subject}: %{error}"
error_in_new_dependent: "Fehler beim Versuch, abhängiges Objekt zu erstellen: %{dependent_class} - %{related_subject}: %{error}"
@@ -2857,7 +2859,7 @@ de:
dates:
working: "%{date} ist jetzt ein Arbeitstag"
non_working: "%{date} ist jetzt ein arbeitsfreier Tag"
progress_mode_changed_to_status_based: Fortschrittberechnung wurde auf Status-bezogen gesetzt
progress_mode_changed_to_status_based: Fortschrittberechnung wurde auf Status-basiert gesetzt
status_excluded_from_totals_set_to_false_message: jetzt in den Gesamtwerten der Hierarchie enthalten
status_excluded_from_totals_set_to_true_message: jetzt von den Hierarchie-Gesamtwerten ausgeschlossen
status_percent_complete_changed: "% abgeschlossen von %{old_value}% auf %{new_value} % geändert"
@@ -3155,7 +3157,7 @@ de:
label_enumerations: "Aufzählungen"
label_enterprise: "Enterprise"
label_enterprise_active_users: "%{current}/%{limit} gebuchte aktive Nutzer"
label_enterprise_edition: "Enterprise Edition"
label_enterprise_edition: "Enterprise edition"
label_enterprise_support: "Enterprise Support"
label_environment: "Umgebung"
label_estimates_and_progress: "Schätzungen und Fortschritt"
@@ -4213,7 +4215,7 @@ de:
update_timeout: "Speichere die Informationen bzgl. des genutzten Festplattenspeichers eines Projektarchivs für N Minuten.\nErhöhen Sie diesen Wert zur Verbesserung der Performance, da die Erfassung des genutzten Festplattenspeichers Ressourcen-intensiv ist."
oauth_application_details: "Der Client Geheimcode wird nach dem Schließen dieses Fensters nicht mehr zugänglich sein. Bitte kopieren Sie diese Werte in die Nextcloud OpenProject Integrationseinstellungen:"
oauth_application_details_link_text: "Zu den Einstellungen gehen"
setup_documentation_details: "Wenn Sie Hilfe bei der Konfiguration eines neuen Dateispeichers benötigen, konsultieren Sie bitte die Dokumentation: "
setup_documentation_details: "Wenn Sie Hilfe bei der Konfiguration eines neuen Datei-Speichers benötigen, konsultieren Sie bitte die Dokumentation: "
setup_documentation_details_link_text: "Dateispeicher einrichten"
show_warning_details: "Um diesen Dateispeicher nutzen zu können, müssen Sie das Modul und den spezifischen Speicher in den Projekteinstellungen jedes gewünschten Projekts aktivieren."
subversion:
@@ -4718,6 +4720,7 @@ de:
Hinweis: Wenn aktiviert, wird dies eine Plakette mit dem Status Ihrer Installation in der <a href="%{information_panel_path}">%{information_panel_label}</a> unter Administration und auf der Startseite anzeigen. Es wird nur Administratoren gezeigt. <br/> Die Plakette überprüft Ihre aktuelle OpenProject-Version gegen die offizielle Release Datenbank, um Sie über Updates oder bekannten Sicherheitslücken zu informieren. Für die Überprüfung der Version werden Daten benötigt, um verfügbare Updates für Ihre Umgebung zurückzugeben. Für mehr Informationen über die Plakette, welche Daten sie benötigt und wie Sie diese Überprüfung deaktivieren können, besuchen Sie bitte <a href="%{more_info_url}">die Konfigurationsdokumentation</a>.
text_own_membership_delete_confirmation: "Sie sind dabei, einige oder alle Ihre Berechtigungen zu entfernen. Es ist möglich, dass Sie danach das Projekt nicht mehr ansehen oder bearbeiten dürfen.\nSind Sie sicher, dass Sie dies tun möchten?"
text_permanent_delete_confirmation_checkbox_label: "Ich verstehe, dass diese Löschung nicht rückgängig gemacht werden kann"
text_permanent_remove_confirmation_checkbox_label: "Ich verstehe, dass diese Löschung nicht rückgängig gemacht werden kann"
text_plugin_assets_writable: "Verzeichnis für Plugin-Assets beschreibbar"
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Kleinbuchstaben (a-z), Ziffern, Binde- und Unterstriche erlaubt. Muss mit einem Kleinbuchstaben beginnen."
@@ -4839,7 +4842,7 @@ de:
warning_user_limit_reached_admin: >
Das Hinzufügen zusätzlicher Benutzer überschreitet das aktuelle Benutzerlimit. Bitte <a href="%{upgrade_url}">aktualisieren Sie Ihr Abonnement</a> um sicherzustellen, dass externe Benutzer auf diese Instanz zugreifen können.
warning_user_limit_reached_instructions: >
Du hast dein Nutzerlimit erreicht (%{current}/%{max} active users). Bitte kontaktiere sales@openproject.com um deinen Enterprise Edition Plan upzugraden und weitere Nutzer hinzuzufügen.
Du hast dein Nutzerlimit erreicht (%{current}/%{max} active users). Bitte kontaktiere sales@openproject.com um deinen Enterprise edition Plan upzugraden und weitere Nutzer hinzuzufügen.
warning_protocol_mismatch_html: >
warning_bar:
+4 -1
View File
@@ -1507,7 +1507,8 @@ el:
not_a_datetime: "δεν είναι έγκυρη ημερομηνία και ώρα."
not_a_number: "δεν είναι αριθμός."
not_allowed: "δεν είναι έγκυρο επειδή λείπουν δικαιώματα."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "δεν είναι ακέραιος αριθμός."
not_an_iso_date: "δεν είναι έγκυρη ημερομηνία. Απαιτούμενη μορφοποίηση: ΕΕΕΕ-ΜΜ-ΗΗ."
not_same_project: "δεν ανήκει στο ίδιο έργο."
@@ -2164,6 +2165,7 @@ el:
button_print: "Εκτύπωση"
button_quote: "Παράθεση"
button_remove: Αφαίρεση
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "Μετονομασία"
button_replace: "Αντικατάσταση"
@@ -4719,6 +4721,7 @@ el:
Σημείωση: Εάν ενεργοποιηθεί, θα εμφανιστεί ένα σήμα με την κατάσταση της εγκατάστασής σας στον <a href="%{information_panel_path}">%{information_panel_label}</a> πίνακα διαχείρισης, καθώς και στην αρχική σελίδα. Εμφανίζεται μόνο στους διαχειριστές. <br/> Το σήμα θα ελέγξει την τρέχουσα έκδοση του OpenProject σε σύγκριση με την επίσημη βάση δεδομένων εκδόσεων OpenProject για να σας ειδοποιήσει ενημερώσεις ή γνωστές ευπάθειες. Για περισσότερες πληροφορίες στο τι παρέχει αυτός ο έλεγχος, τι δεδομένα χρειάζονται για να παρέχονται οι διαθέσιμες ενημερώσεις και πως να απενεργοποιήσετε αυτό τον έλεγχο, παρακαλούμε επισκεφθείτε την <a href="%{more_info_url}"> τεκμηρίωση διαμόρφωσης</a>.
text_own_membership_delete_confirmation: "Πρόκειται να αφαιρέσετε μερικά ή όλα τα δικαιώματα και ενδέχεται να μην μπορείτε να επεξεργαστείτε πλέον το έργο μετά από αυτό.\nΕίστε βέβαιοι ότι θέλετε να συνεχίσετε;"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Εγγράψιμος κατάλογος plugin assets"
text_powered_by: "Υποστηρίζεται από %{link}"
text_project_identifier_info: "Επιτρέπονται μόνο πεζά γράμματα (α-ω), αριθμοί, παύλες και κάτω παύλες, πρέπει να αρχίζουν με πεζό γράμμα."
+4 -1
View File
@@ -1511,7 +1511,8 @@ eo:
not_a_datetime: "Ĝi ne estas valida dato/horo."
not_a_number: "Ĝi ne estas numero."
not_allowed: "nevalida pro manko de permesoj."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "ĝi ne estas entjero."
not_an_iso_date: "Ĝi ne estas valida dato. Deviga datumo estas: JJJJ-MM-TT."
not_same_project: "doesn't belong to the same project."
@@ -2168,6 +2169,7 @@ eo:
button_print: "Printi"
button_quote: "Citi"
button_remove: Forigi
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "Alinomi"
button_replace: "Anstataŭigi"
@@ -4724,6 +4726,7 @@ eo:
Note: if enabled, this will display a badge with your installation status in the <a href="%{information_panel_path}">%{information_panel_label}</a> administration panel, and on the home page. It is displayed to administrators only. <br/> The badge will check your current OpenProject version against the official OpenProject release database to alert you of any updates or known vulnerabilities. For more information on what the check provides, what data is needed to provide available updates, and how to disable this check, please visit <a href="%{more_info_url}">the configuration documentation</a>.
text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Plugin assets directory writable"
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
+5 -2
View File
@@ -959,7 +959,7 @@ es:
automatic_with_children: "Fechas determinadas por paquetes de trabajo secundarios."
automatic_with_predecessor: "La fecha de inicio la fija un predecesor."
manual_mobile: "Programado manualmente."
manually_scheduled: "Programado manualmente. No afectadas por relaciones."
manually_scheduled: "Programado manualmente. Fechas no afectadas por relaciones."
blankslate:
title: "Sin predecesores"
description: "Para activar la programación automática, este paquete de trabajo debe tener al menos un predecesor. Entonces se programará automáticamente para que comience después del predecesor más cercano."
@@ -1508,7 +1508,8 @@ es:
not_a_datetime: "no es una fecha/hora válida."
not_a_number: "No es un número."
not_allowed: "no es válido porque faltan permisos."
not_json: "no es un objeto JSON válido."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "No es un entero."
not_an_iso_date: "no es una fecha válida. Requiere formato: AAAA-MM-DD."
not_same_project: "no pertenecen a un mismo proyecto."
@@ -2165,6 +2166,7 @@ es:
button_print: "Imprimir"
button_quote: "Comentario"
button_remove: Eliminar
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Eliminar recordatorio"
button_rename: "Cambiar el nombre"
button_replace: "Sustituir"
@@ -4720,6 +4722,7 @@ es:
Nota: al activarse, se mostrará una insignia con el estado de instalación en el <a href="%{information_panel_path}">%{information_panel_label}</a> panel de administración, y en la página principal. Solamente será visible para administradores. <br/> La insignia comprobará tu versión actual de OpenProject comparada con la base de datos oficial de OpenProject para alertarte de cualquier actualización o vulnerabilidad. Para más información sobre las funciones de la comprobación, los datos necesarios para conseguir actualizaciones disponibles, o para desactivar esta comprobación, por favor visita <a href="%{more_info_url}">la documentación de configuración</a>.
text_own_membership_delete_confirmation: "Estás a punto de eliminar algunos o todos tus permisos, y podrías no poder volver a editar este proyecto.\n¿Estás seguro/a de que quieres continuar?"
text_permanent_delete_confirmation_checkbox_label: "Entiendo que esta eliminación no se puede revertir"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Directorio de extensiones activos escribible"
text_powered_by: "Con tecnología de %{link}"
text_project_identifier_info: "Se permiten sólo letras minúsculas (a-z), números, guiones y guiones bajos, debe comenzar con una letra minúscula."
+4 -1
View File
@@ -1511,7 +1511,8 @@ et:
not_a_datetime: "is not a valid date time."
not_a_number: "pole arv."
not_allowed: "is invalid because of missing permissions."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "pole täisarv."
not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD."
not_same_project: "doesn't belong to the same project."
@@ -2168,6 +2169,7 @@ et:
button_print: "Prindi"
button_quote: "Tsiteeri"
button_remove: Eemalda
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Eemalda meeldetuletus"
button_rename: "Nimeta ümber"
button_replace: "Asenda"
@@ -4724,6 +4726,7 @@ et:
Note: if enabled, this will display a badge with your installation status in the <a href="%{information_panel_path}">%{information_panel_label}</a> administration panel, and on the home page. It is displayed to administrators only. <br/> The badge will check your current OpenProject version against the official OpenProject release database to alert you of any updates or known vulnerabilities. For more information on what the check provides, what data is needed to provide available updates, and how to disable this check, please visit <a href="%{more_info_url}">the configuration documentation</a>.
text_own_membership_delete_confirmation: "Sa võtad endalt ära osa või kõik õigused ega saa edaspidi seda projekti võib-olla enam muuta.\nOled sa jätkamises kindel?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Lisamoodulite abifailide kataloog on kirjutatav"
text_powered_by: "Jooksutab %{link}"
text_project_identifier_info: "Lubatud on ainult väikesed tähed (a-z), numbrid ja kriipsud. Peab algama väikse tähega."
+4 -1
View File
@@ -1511,7 +1511,8 @@ eu:
not_a_datetime: "is not a valid date time."
not_a_number: "is not a number."
not_allowed: "is invalid because of missing permissions."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "is not an integer."
not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD."
not_same_project: "doesn't belong to the same project."
@@ -2168,6 +2169,7 @@ eu:
button_print: "Print"
button_quote: "Quote"
button_remove: Remove
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "Rename"
button_replace: "Replace"
@@ -4724,6 +4726,7 @@ eu:
Note: if enabled, this will display a badge with your installation status in the <a href="%{information_panel_path}">%{information_panel_label}</a> administration panel, and on the home page. It is displayed to administrators only. <br/> The badge will check your current OpenProject version against the official OpenProject release database to alert you of any updates or known vulnerabilities. For more information on what the check provides, what data is needed to provide available updates, and how to disable this check, please visit <a href="%{more_info_url}">the configuration documentation</a>.
text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Plugin assets directory writable"
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
+4 -1
View File
@@ -1511,7 +1511,8 @@ fa:
not_a_datetime: "is not a valid date time."
not_a_number: "is not a number."
not_allowed: "is invalid because of missing permissions."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "is not an integer."
not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD."
not_same_project: "doesn't belong to the same project."
@@ -2168,6 +2169,7 @@ fa:
button_print: "چاپ کردن"
button_quote: "نقل قول"
button_remove: Remove
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "تغییر نام"
button_replace: "Replace"
@@ -4724,6 +4726,7 @@ fa:
Note: if enabled, this will display a badge with your installation status in the <a href="%{information_panel_path}">%{information_panel_label}</a> administration panel, and on the home page. It is displayed to administrators only. <br/> The badge will check your current OpenProject version against the official OpenProject release database to alert you of any updates or known vulnerabilities. For more information on what the check provides, what data is needed to provide available updates, and how to disable this check, please visit <a href="%{more_info_url}">the configuration documentation</a>.
text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Plugin assets directory writable"
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
+4 -1
View File
@@ -1511,7 +1511,8 @@ fi:
not_a_datetime: "ei ole kelvollinen aika."
not_a_number: "ei ole numero."
not_allowed: "is invalid because of missing permissions."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "ei ole kokonaisluku."
not_an_iso_date: "ei ole kelvollinen päivämäärä. Vaadittava muoto: VVVV-KK-PP."
not_same_project: "ei kuulu samaan projektiin."
@@ -2168,6 +2169,7 @@ fi:
button_print: "Tulosta"
button_quote: "Siteeraa"
button_remove: Poista
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "Nimeä uudelleen"
button_replace: "Korvaa"
@@ -4724,6 +4726,7 @@ fi:
Note: if enabled, this will display a badge with your installation status in the <a href="%{information_panel_path}">%{information_panel_label}</a> administration panel, and on the home page. It is displayed to administrators only. <br/> The badge will check your current OpenProject version against the official OpenProject release database to alert you of any updates or known vulnerabilities. For more information on what the check provides, what data is needed to provide available updates, and how to disable this check, please visit <a href="%{more_info_url}">the configuration documentation</a>.
text_own_membership_delete_confirmation: "Olet aikeissa poistaa yhden tai useamman käyttöoikeuden ja et ehkä voi enää muokata tätä projektia sen jälkeen. Haluatko varmasti jatkaa?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Plugin varat hakemisto kirjoitettavissa"
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Vain pienet kirjaimet (a-z), numerot, väliviivat ja alaviivat ovat sallittuja. Ensimmäisenä tulee olla pieni kirjain."
+4 -1
View File
@@ -1511,7 +1511,8 @@ fil:
not_a_datetime: "ay hindi balido ang petsa ng oras."
not_a_number: "ay hindi numero."
not_allowed: "is invalid because of missing permissions."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "ay hindi integer."
not_an_iso_date: "ay hindi balido ang petsa. Ang kinakailangan format: YYYY-MM-DD."
not_same_project: "ay hindi nabibilang sa parehong proyekto."
@@ -2168,6 +2169,7 @@ fil:
button_print: "I-print"
button_quote: "Quote"
button_remove: Tanggalin
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "Baguhin ang pangalan"
button_replace: "Palitan"
@@ -4722,6 +4724,7 @@ fil:
Note: if enabled, this will display a badge with your installation status in the <a href="%{information_panel_path}">%{information_panel_label}</a> administration panel, and on the home page. It is displayed to administrators only. <br/> The badge will check your current OpenProject version against the official OpenProject release database to alert you of any updates or known vulnerabilities. For more information on what the check provides, what data is needed to provide available updates, and how to disable this check, please visit <a href="%{more_info_url}">the configuration documentation</a>.
text_own_membership_delete_confirmation: "Kinakailangan mong alisin ang ilan o lahat ng iyong perniso at hindi na maaring magagawa na i-edit ang itong proyekto pagkatapos na iyan.\nSigurado ka ba gusto mong magpatuloy?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Plugin asstes directory writable"
text_powered_by: "Pinalatakbo ng %{link}"
text_project_identifier_info: "Maliit na titik lamang (a-z), mga numero, mga dash at underscore ang pinahintulutan, dapat magsimula sa maliit na titik."
+4 -1
View File
@@ -1509,7 +1509,8 @@ fr:
not_a_datetime: "n'est pas une heure valide."
not_a_number: "n'est pas un nombre."
not_allowed: "est invalide en raison dautorisations insuffisantes."
not_json: "n'est pas un objet JSON valide."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "n'est pas un entier."
not_an_iso_date: "nest pas une date valide. Format requis : AAAA-MM-JJ."
not_same_project: "n'appartient pas au même projet."
@@ -2166,6 +2167,7 @@ fr:
button_print: "Imprimer"
button_quote: "Citer"
button_remove: Supprimer
button_remove_permanently: "Supprimer définitivement"
button_remove_reminder: "Supprimer le rappel"
button_rename: "Renommer"
button_replace: "Remplacer"
@@ -4722,6 +4724,7 @@ fr:
Remarque : si cette option est activée, un badge indiquant l'état de votre installation s'affichera dans le panneau <a href="%{information_panel_path}">%{information_panel_label}</a> administration et sur la page d'accueil. Il n'est affiché que pour les administrateurs. <br/>Le badge vérifiera votre version actuelle d'OpenProject par rapport à la base de données officielle d'OpenProject pour vous avertir de toute mise à jour ou vulnérabilité connue. Pour plus d'informations sur ce que la vérification fournit, quelles données sont nécessaires pour fournir les mises à jour disponibles, et comment désactiver cette vérification, veuillez visiter <a href="%{more_info_url}">la documentation de configuration</a>.
text_own_membership_delete_confirmation: "Vous êtes sur le point de retirer tout ou partie de vos permissions et ne pourrez peut-être plus modifier le projet par la suite.\nÊtes vous sûr de vouloir continuer?"
text_permanent_delete_confirmation_checkbox_label: "Je comprends que cette suppression ne peut pas être annulée"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Répertoire des « plugin assets » est accessible en écriture"
text_powered_by: "Propulsé par %{link}"
text_project_identifier_info: "Seulement les lettres en minuscule (a-z), les nombres, les tirets et les underscores sont autorisés, il est obligatoire de commencer avec une lettre en minuscule."
+4 -1
View File
@@ -1529,7 +1529,8 @@ he:
not_a_datetime: "is not a valid date time."
not_a_number: "is not a number."
not_allowed: "is invalid because of missing permissions."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "is not an integer."
not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD."
not_same_project: "doesn't belong to the same project."
@@ -2220,6 +2221,7 @@ he:
button_print: "Print"
button_quote: "צטט"
button_remove: Remove
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "שינוי שם"
button_replace: "Replace"
@@ -4822,6 +4824,7 @@ he:
Note: if enabled, this will display a badge with your installation status in the <a href="%{information_panel_path}">%{information_panel_label}</a> administration panel, and on the home page. It is displayed to administrators only. <br/> The badge will check your current OpenProject version against the official OpenProject release database to alert you of any updates or known vulnerabilities. For more information on what the check provides, what data is needed to provide available updates, and how to disable this check, please visit <a href="%{more_info_url}">the configuration documentation</a>.
text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Plugin assets directory writable"
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
+4 -1
View File
@@ -1509,7 +1509,8 @@ hi:
not_a_datetime: "is not a valid date time."
not_a_number: "is not a number."
not_allowed: "अनुपलब्ध अनुमतियों के कारण अमांय है ।"
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "is not an integer."
not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD."
not_same_project: "doesn't belong to the same project."
@@ -2166,6 +2167,7 @@ hi:
button_print: "Print"
button_quote: "उद्धरण"
button_remove: Remove
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "नाम बदलें"
button_replace: "Replace"
@@ -4722,6 +4724,7 @@ hi:
Note: if enabled, this will display a badge with your installation status in the <a href="%{information_panel_path}">%{information_panel_label}</a> administration panel, and on the home page. It is displayed to administrators only. <br/> The badge will check your current OpenProject version against the official OpenProject release database to alert you of any updates or known vulnerabilities. For more information on what the check provides, what data is needed to provide available updates, and how to disable this check, please visit <a href="%{more_info_url}">the configuration documentation</a>.
text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Plugin assets directory writable"
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
+4 -1
View File
@@ -1520,7 +1520,8 @@ hr:
not_a_datetime: "is not a valid date time."
not_a_number: "nije tip podataka number."
not_allowed: "is invalid because of missing permissions."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "nije tip podatka integer."
not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD."
not_same_project: "ne pripada istom projektu."
@@ -2194,6 +2195,7 @@ hr:
button_print: "Ispis"
button_quote: "Citiraj"
button_remove: Ukloni
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "Preimenuj"
button_replace: "Zamijeni"
@@ -4773,6 +4775,7 @@ hr:
Note: if enabled, this will display a badge with your installation status in the <a href="%{information_panel_path}">%{information_panel_label}</a> administration panel, and on the home page. It is displayed to administrators only. <br/> The badge will check your current OpenProject version against the official OpenProject release database to alert you of any updates or known vulnerabilities. For more information on what the check provides, what data is needed to provide available updates, and how to disable this check, please visit <a href="%{more_info_url}">the configuration documentation</a>.
text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Plugin assets directory writable"
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
+4 -1
View File
@@ -1510,7 +1510,8 @@ hu:
not_a_datetime: "ez nem érvényes dátum."
not_a_number: "ez nem egy szám."
not_allowed: "hiányzó engedélyek miatt érvénytelen."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "ez nem egy szám."
not_an_iso_date: "nem érvényes dátum. A szükséges formátum ÉÉÉÉ-HH-NN."
not_same_project: "nem azonos projekthez tartozik."
@@ -2167,6 +2168,7 @@ hu:
button_print: "Nyomtatás"
button_quote: "Idéz"
button_remove: Eltávolítás
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "Átnevezés"
button_replace: "Csere"
@@ -4722,6 +4724,7 @@ hu:
Megjegyzés: ha engedélyezve van, akkor a telepítési állapotot jelző jelvény jelenik meg a <a href="%{information_panel_path}">%{information_panel_label} </a> adminisztrációs panelen és a kezdőlapon. Csak a rendszergazdák számára jelenik meg. <br/> A jelvény ellenőrzi az aktuális OpenProject verziót a hivatalos OpenProject kiadási adatbázishoz képest, hogy figyelmeztesse Önt minden frissítésre vagy ismert biztonsági résre. Ha többet szeretne megtudni arról, hogy mit tartalmaz az ellenőrzés, milyen adatokra van szükség az elérhető frissítésekhez, és hogyan tilthatja le ezt az ellenőrzést, keresse fel a <a href="%{more_info_url}"> konfigurációs dokumentációt </a>.
text_own_membership_delete_confirmation: "Értesítem arról, hogy eltávolít néhány vagy az összes jogosultságot, és ezt követően már nem lehet szerkeszteni ezt a projektet. Biztosan folytatni kívánja?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Plugin eszközök könyvtára írható"
text_powered_by: "Készítette %{link}"
text_project_identifier_info: "Csak kisbetű (a-z), számok, kötőjelek és aláhúzásjelek van engedélyezve, és kisbetűvel kell kezdődnie."
+4 -1
View File
@@ -1498,7 +1498,8 @@ id:
not_a_datetime: "bukan tanggal waktu yang valid."
not_a_number: "harus diisi angka."
not_allowed: "tidak valid karena tidak ada izin."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "harus bilangan bulat."
not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD."
not_same_project: "harus berasal dari proyek yang sama."
@@ -2138,6 +2139,7 @@ id:
button_print: "Cetak"
button_quote: "Kutipan"
button_remove: Remove
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "Ubah nama"
button_replace: "Ganti"
@@ -4668,6 +4670,7 @@ id:
Catatan: jika diaktifkan, ini akan menampilkan lencana dengan status pemasangan Anda di panel administrasi <a href="%{information_panel_path}">%{information_panel_label}</a>, dan di beranda. Ini hanya ditampilkan kepada administrator. <br/> Lencana akan memeriksa versi OpenProject Anda saat ini dengan database rilis OpenProject resmi untuk memberi tahu Anda tentang pembaruan atau kerentanan yang diketahui. Untuk informasi lebih lanjut tentang apa yang diberikan pemeriksaan, data apa yang diperlukan untuk menyediakan pembaruan yang tersedia, dan cara menonaktifkan pemeriksaan ini, silakan kunjungi <a href="%{more_info_url}">dokumentasi konfigurasi</a>.
text_own_membership_delete_confirmation: "Anda akan menghapus hak akses Anda dan mungkin Anda tidak dapat lagi mengedit Project ini. Apakah Anda yakin Anda ingin melanjutkan?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Plugin aset direktori, bisa ditulisi"
text_powered_by: "Didukung oleh %{link}"
text_project_identifier_info: "Hanya huruf kecil (a-z), angka, garis dan garis bawah yang diperbolehkan, harus diawali dengan huruf kecil."
+4 -1
View File
@@ -1508,7 +1508,8 @@ it:
not_a_datetime: "non è un'orario valido."
not_a_number: "non è un numero."
not_allowed: "non è valido a causa di autorizzazioni assenti."
not_json: "non è un oggetto JSON valido."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "non è un numero intero."
not_an_iso_date: "non è una data valida. Formato richiesto: AAAA-MM-GG."
not_same_project: "non appartiene allo stesso progetto."
@@ -2165,6 +2166,7 @@ it:
button_print: "Stampa"
button_quote: "Cita"
button_remove: Rimuovi
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Rimuovi promemoria"
button_rename: "Rinomina"
button_replace: "Sostituisci"
@@ -4721,6 +4723,7 @@ it:
Nota: se abilitata questa opzione visualizzerà un badge con lo stato dell'installazione nel pannello di amministrazione di <a href="%{information_panel_path}">%{information_panel_label}</a> e sulla home page. Verrà visualizzata solo agli amministratori. <br/> il badge controllerà la tua attuale versione di OpenProject con l'ultima versione rilasciata per avvisarti di eventuali aggiornamenti o risoluzioni di vulnerabilità note. Per ulteriori informazioni sulle funzionalità offerte dal controllo, su quali dati è necessario fornire per ottenere gli aggiornamenti disponibili e su come disabilitare questo controllo, visita <a href="%{more_info_url}">la documentazione sulla configurazione</a>.
text_own_membership_delete_confirmation: "Stai per rimuovere qualcuno o tutti i tuoi permessi e potresti non essere più in grado di modificare questo progetto dopo questo passo.\nSei sicuro di voler continuare?"
text_permanent_delete_confirmation_checkbox_label: "Sono consapevole che questa cancellazione non può essere annullata"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Cartella del pool di plugin installati scrivibile"
text_powered_by: "Offerto da %{link}"
text_project_identifier_info: "Solo le lettere minuscole (a-z), numeri, trattini e trattini bassi sono consentiti, devi iniziare con una lettera maiuscola."
+58 -54
View File
@@ -107,17 +107,17 @@ ja:
jemalloc_allocator: Jemalloc メモリアロケータ
journal_aggregation:
explanation:
text: "ユーザーの個々のアクション(例えば、ワークパッケージを2回更新するは、それらの年齢差が指定されたタイムスパン未満である場合、単一のアクションに集約されます。これらはアプリケーション内で1つのアクションとして表示されます。これはまた、送信されるメールの数を減らし、 %{webhook_link} の遅延にも影響します。"
text: "ユーザーの個々のアクション (例:ワークパッケージを2回更新する)は、指定された時間範囲よりも時間差が小さい場合、単一のアクションに集約されます。 これらはアプリケーション内で単一のアクションとして表示されます。 これにより、送信されるメールの数が減少し、 %{webhook_link} の遅延にも影響します。"
link: "webhook"
scim_clients:
authentication_methods:
sso: "IDプロバイダからのJWT"
oauth2_client: "OAuth 2.0クライアント認証情報"
sso: "アイデンティティプロバイダからのJWT"
oauth2_client: "OAuth 2.0 クライアント資格情報"
oauth2_token: "静的アクセストークン"
created_client_credentials_dialog_component:
title: "クライアント認証情報作成"
heading: "クライアント認証情報が生成されました"
one_time_hint: "クライアントシークレットが表示されるのはこの時だけです。必ずコピーしてください。"
title: "クライアントの資格情報作成されました"
heading: "クライアントの資格情報が生成されました"
one_time_hint: "クライアントシークレットが表示される唯一の時間です。今すぐコピーしてください。"
created_token_dialog_component:
title: "トークンを作成しました"
heading: "トークンが生成されました"
@@ -130,21 +130,21 @@ ja:
edit:
label_delete_scim_client: "SCIM クライアントを削除"
form:
auth_provider_description: "これは、SCIM プロバイダによって追加されたユーザが OpenProject で認証するために使用するサービスです。"
authentication_method_description_html: "これは SCIM クライアントが OpenProject で認証する方法です。OAuth トークンに<code>scim_v2</code>スコープが含まれていることを確認してください。"
description: "これらの設定オプションの詳細については、[SCIMクライアントの設定に関する文書](docs_url)を参照してください。"
auth_provider_description: "これは、SCIMプロバイダが追加したユーザがOpenProjectでの認証に使用するサービスです。"
authentication_method_description_html: "これは SCIM クライアントが OpenProject で認証する方法です。OAuth トークンに <code>scim_v2</code> スコープが含まれていることを確認してください。"
description: "設定オプションの詳細については、[SCIM クライアントの設定に関するドキュメント](docs_url)を参照してください。"
jwt_sub_description: "例えば、Keycloakの場合、これはSCIMクライアントに関連付けられたサービスアカウントのUUIDです。あなたのユースケースにあった Subject claim を見つける方法については [ドキュメント](docs_url) を参照してください。"
name_description: "このクライアントが設定された理由を他の管理者が理解しやすい名前を選んでください。"
name_description: "他の管理者がこのクライアントが設定された理由を理解するのに役立つ名前を選択してください。"
index:
description: "ここで設定された SCIM クライアントは、OpenProject SCIM サーバ API と対話し、ユーザアカウントグループのプロビジョニング、更新、デプロビジョニングを行うことができます。"
label_create_button: "SCIMクライアント追加"
description: "ここで設定されたSCIMクライアントは、OpenProjectSCIMサーバ APIと相互作用して、ユーザアカウントグループのプロビジョニング、更新、およびデプロビジョニングを行うことができます。"
label_create_button: "SCIMクライアント追加"
new:
title: "新しいSCIMクライアント"
revoke_static_token_dialog_component:
confirm_button: "取り消す"
title: "静的トークンの失効"
heading: "このトークンを本当に取り消しすか?"
description: "このトークンを使っている SCIM クライアントは、OpenProject の SCIM サーバ API にアクセスできなくなります。"
title: "静的トークンを取り消す"
heading: "このトークンを取り消してもよろしいですか?"
description: "このトークンを使用する SCIM クライアントは、OpenProject の SCIM サーバ API にアクセスできなくなります。"
table_component:
blank_slate:
title: "SCIMクライアントがまだ設定されていません"
@@ -674,26 +674,26 @@ ja:
other: "また、 %{shared_work_packages_link} はこのユーザーと共有されています。"
remove_project_membership_or_work_package_shares_too: "直接のメンバーとしてのユーザーだけを削除したい(および共有を維持したい)、またはワークパッケージの共有も削除しますか?"
will_remove_all_user_access_priveleges: "このメンバーを削除すると、プロジェクトへのユーザーのすべてのアクセス権が削除されます。ユーザーはまだサイトの一部として存在します。"
will_remove_all_group_access_priveleges: "このメンバを削除すると、プロジェクトに対するグループのすべてのアクセス権が削除されます。グループはサイトの一部としてまだ存在します。"
cannot_delete_inherited_membership: "このプロジェクトのメンバーであるグループに属しているため、このメンバーを削除することはできません。"
cannot_delete_inherited_membership_note_admin_html: "%{administration_settings_link}で、プロジェクトのメンバーとしてグループを削除することも、特定のメンバーをグループから削除することできます。"
cannot_delete_inherited_membership_note_non_admin: "プロジェクトのメンバーとしてグループを削除するか、管理者に連絡してこの特定のメンバーをグループから削除することができます。"
will_remove_all_group_access_priveleges: "このメンバを削除すると、グループのすべてのアクセス権がプロジェクトに削除されます。グループはサイトの一部として存在します。"
cannot_delete_inherited_membership: "このメンバーはこのプロジェクトのメンバーであるグループに属しているため、削除できません。"
cannot_delete_inherited_membership_note_admin_html: "プロジェクトのメンバーとしてグループを削除するか、 %{administration_settings_link} のグループからこの特定のメンバーを削除することできます。"
cannot_delete_inherited_membership_note_non_admin: "プロジェクトのメンバーとしてグループを削除するか、管理者に問い合わせてグループから特定のメンバーを削除することができます。"
delete_work_package_shares_dialog:
title: "ワークパッケージ・シェアの破棄"
title: "ワークパッケージの共有の取り消し"
shared_with_this_user_html:
other: "%{all_shared_work_packages_link} はこのユーザーと共有されています。"
shared_with_this_group_html:
other: "%{all_shared_work_packages_link} はこのグループと共有されています。"
shared_with_permission_html:
other: "%{shared_work_packages_link} のみが %{shared_role_name} 権限と共有されています。"
revoke_all_or_with_role: "すべての共有ワークパッケージ、または %{shared_role_name} 権限を持つワークパッケージのみへのアクセス権を剥奪しますか?"
will_not_affect_inherited_shares: "(これは、そのグループと共有ているワークパッケージには影響しません。"
cannot_remove_inherited: "グループで共有されワークパッケージの共有は削除できません。"
cannot_remove_inherited_with_role: "ロール %{shared_role_name} 共有されるワークパッケージは、グループを介して共有され、削除することはできません。"
cannot_remove_inherited_note_admin_html: "%{administration_settings_link}、グループへの共有を取り消すか、グループからこの特定のメンバーを削除することができます。"
cannot_remove_inherited_note_non_admin: "グループへの共有を取り消すか、管理者に連絡して特定のメンバーをグループから削除することができます。"
will_revoke_directly_granted_access: "このアクションは、グループと共有されているワークパッケージ以外の、すべてのワークパッケージへのアクセス権を剥奪する。"
will_revoke_access_to_all: "このアクションは、すべてのアクセス権を剥奪する。"
revoke_all_or_with_role: "共有されたワークパッケージ、または %{shared_role_name} 権限を持つワークパッケージのみへのアクセスを取り消しますか?"
will_not_affect_inherited_shares: "(これはグループと共有されているワークパッケージには影響しません)。"
cannot_remove_inherited: "グループで共有されワークパッケージは削除できません。"
cannot_remove_inherited_with_role: "ワークパッケージとロール %{shared_role_name} 共有されているため、削除できません。"
cannot_remove_inherited_note_admin_html: "あなたは、グループへの共有を取り消すか、 %{administration_settings_link}グループからこの特定のメンバーを削除することができます。"
cannot_remove_inherited_note_non_admin: "共有をグループ取り消すか、管理者に問い合わせてグループから特定のメンバーを削除することができます。"
will_revoke_directly_granted_access: "このアクションは、すべてのユーザーへのアクセスを取り消しますが、グループと共有されているワークパッケージです。"
will_revoke_access_to_all: "このアクションは、すべてのユーザーへのアクセスを取り消します。"
my:
access_token:
dialog:
@@ -715,7 +715,7 @@ ja:
no_results_title_text: "現在、有効なアクセス トークンはありません。"
notice_api_token_revoked: "APIトークンが削除されました。新しいトークンを作成するには、APIセクションの作成ボタンを使用してください。"
notice_rss_token_revoked: "RSSトークンが削除されました。新しいトークンを作成するには、RSSセクションのリンクを使用してください。"
notice_ical_token_revoked: 'プロジェクト "%{project_name}" のカレンダー "%{calendar_name}" の iCalendar トークン "%{token_name}" が失効しました。このトークンを持つiCalendar URLは無効になりました。'
notice_ical_token_revoked: 'プロジェクト "%{token_name}" のカレンダー "%{calendar_name}" の iCalendar トークン "%{project_name}" が取り消されました。 このトークンiCalendar URLは無効です。'
news:
index:
no_results_title_text: 現在、報告するニュースはありません。
@@ -733,7 +733,7 @@ ja:
matrix_check_uncheck_all_in_col_label_html: "Toggle all %{module} permissions for <em>%{role}</em> role"
users:
autologins:
prompt: "ログインしたまま %{num_days}"
prompt: "%{num_days} のログインを維持"
sessions:
session_name: "%{browser_name} %{browser_version} の %{os_name}"
browser: "ブラウザ"
@@ -747,17 +747,17 @@ ja:
current: "Current (this device)"
title: "セッション管理"
instructions: "You are logged in to your account through the following devices. Revoke sessions that you do not recognise or from devices you do not control."
may_not_delete_current: "現在のセッション削除することはできません。"
may_not_delete_current: "現在のセッション削除できません。"
deletion_warning: "Are you sure you want to revoke this session? You will be logged out on this device."
groups:
member_in_these_groups: "このユーザーは現在以下のグループのメンバーです:"
no_results_title_text: このユーザーは現在どのグループのメンバーでもありません。
summary_with_more: '%{names} と %{count_link}のメンバー。'
more: "%{count} もっと見る"
summary: '%{names}のメンバー'
summary_with_more: '%{names} と %{count_link} のメンバー。'
more: "%{count} 以上"
summary: '%{names} のメンバー .'
memberships:
no_results_title_text: このユーザは現在プロジェクトのメンバーではありません。
open_profile: "プロフィール"
open_profile: "プロファイルを開く"
invite_user_modal:
invite: "招待"
title:
@@ -814,7 +814,7 @@ ja:
placeholder_users:
right_to_manage_members_missing: >
プレースホルダーユーザを削除する権限がありません。 プレースホルダー ユーザーがメンバーであるすべてのプロジェクトのメンバーを管理する権利はありません。
delete_tooltip: "プレースホルダーユーザー削除"
delete_tooltip: "プレースホルダー ユーザー削除"
deletion_info:
heading: "プレースホルダー ユーザー %{name} を削除"
data_consequences: >
@@ -832,11 +832,11 @@ ja:
reactions:
action_title: "リアクト"
add_reaction: "リアクションを追加"
react_with: "%{reaction} と リアクト"
and_user: "および %{user}"
react_with: "%{reaction} で反応する"
and_user: " %{user}"
and_others:
other: と %{count} その他
reaction_by: "%{reaction} によって"
reaction_by: "%{reaction} によ"
reportings:
index:
no_results_title_text: 現在、ステータス報告はありません。
@@ -847,19 +847,20 @@ ja:
このステータスの色を割り当てたり変更する場合にクリックします。
ステータスボタンに表示され、テーブル内のワークパッケージを強調表示するために使用できます。
status_default_text: |-
新しいワークパッケージはデフォルトでこのタイプに設定され。読み取り専用にはできない
新しいワークパッケージはデフォルトでこのタイプに設定されています。読み取り専用にすることはできません
status_excluded_from_totals_text: |-
このステータスを持つワークパッケージを、階層内の「作業」、「
残作業」、「完了率」の合計から除外するには、このオプションをオンにします。
このオプションをオンにすると、このステータスワークパッケージを合計作業量
残作業量、および階層構造で完了させることができます。
status_percent_complete_text: |-
<a href="%{href}">ステータスベースの進捗計算モードでは</a>、このステータスが選択されると、作業
パッケージの「完了%」が自動的にこの値に設定される。
ワークベースモードでは無視される。
status_readonly_html: |
このステータスを持つワークパッケージを読み取り専用としてマークするには、このオプションをチェックする
ステータス以外の属性は変更できません。
ワークパッケージを読み取り専用としてマークするには、このオプションをオンにしてください
ステータスを除いて変更することはできません。
<br>
<strong>注意</strong>: 継承された値 (子やリレーションなど) 適用されます。
<strong>メモ</strong>: 継承された値 (例えば、子や関連) 適用されます。
index:
no_results_title_text: 現在、ワークパッケージのステータスはありません。
no_results_content_text: 新しいステータスを追加
@@ -869,7 +870,7 @@ ja:
is_readonly: "読み取り専用"
excluded_from_totals: "合計から除外"
themes:
dark: "暗い"
dark: "ダーク"
light: "ライト"
sync_with_os: "自動(OSのテーマ設定に追従)"
types:
@@ -987,15 +988,15 @@ ja:
could_not_be_saved: "次のワークパッケージを保存できませんでした:"
none_could_be_saved: "%{total} 作業パッケージのどれも更新できませんでした。"
x_out_of_y_could_be_saved: "%{failing} の %{total} ワークパッケージのうち、 %{success} を更新できませんでした。"
selected_because_descendants: "%{selected} ワークパッケージが選択されたが、合計 %{total} ワークパッケージが影響を受け、その中には子孫も含まれる。"
descendant: "選択された子孫"
selected_because_descendants: "%{selected} ワークパッケージが選択されている間、合計 %{total} ワークパッケージが子孫を含む影響を受けます。"
descendant: "選択された子孫です"
move:
no_common_statuses_exists: "選択されたすべてのワークパッケージに利用できるステータスはありません。 それらの状態は変更できません。"
unsupported_for_multiple_projects: "複数のプロジェクトからのワークパッケージの一括移動 / コピーはサポートされていません"
current_type_not_available_in_target_project: >
ワークパッケージの現在のタイプがターゲットプロジェクトで有効になっていません。変更しない場合は、ターゲットプロジェクトタイプを有効にしてください。そうでない場合は、リストからターゲットプロジェクトで使用可能なタイプを選択してください
ターゲット プロジェクトで現在のワークパッケージのタイプが有効になっていません。 変更を行わないようにしたい場合は、対象プロジェクトタイプを有効にしてください。 それ以外の場合は、リストからターゲット プロジェクトで使用可能なタイプを選択します
bulk_current_type_not_available_in_target_project: >
ワークパッケージの現在のタイプがターゲットプロジェクトで有効になっていません。変更しない場合は、ターゲットプロジェクトタイプを有効にしてください。そうでない場合は、リストからターゲットプロジェクトで使用可能なタイプを選択してください
現在のタイプのワークパッケージターゲット プロジェクトで有効になっていません。 変更を行わないようにしたい場合は、対象プロジェクトタイプを有効にしてください。 それ以外の場合は、リストからターゲット プロジェクトで使用可能なタイプを選択します
sharing:
missing_workflow_warning:
title: "ワークパッケージの共有のためのワークフローがありません"
@@ -1020,9 +1021,9 @@ ja:
no_results_title_text: 現在、有効なバージョンはありません。
work_package_relations_tab:
index:
action_bar_title: "他のワークパッケージとのリレーションを追加して、それらの間にリンクを作成す。"
no_results_title_text: 現在利用可能な関係はない
blankslate_heading: "関係なし"
action_bar_title: "他のワークパッケージリレーションを追加して、その間にリンクを作成します。"
no_results_title_text: 現在利用可能なリレーションはありません
blankslate_heading: "リレーションなし"
blankslate_description: "このワークパッケージにはまだリレーションがありません。"
label_add_child_button: "子要素"
label_add_x: "%{x} を追加"
@@ -1500,7 +1501,8 @@ ja:
not_a_datetime: "は有効な日時ではありません。"
not_a_number: "は数値にしてください。"
not_allowed: "権限がないため無効です。"
not_json: "は有効な JSON オブジェクトではありません。"
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "は整数にしてください。"
not_an_iso_date: "は有効な日付ではありません。必要な形式: YYYY-MM-dd。"
not_same_project: "は同じプロジェクトに属していません。"
@@ -2140,6 +2142,7 @@ ja:
button_print: "印刷"
button_quote: "引用"
button_remove: 削除
button_remove_permanently: "Remove permanently"
button_remove_reminder: "リマインダーを削除"
button_rename: "名称変更"
button_replace: "置き換え"
@@ -4673,6 +4676,7 @@ ja:
602/5000 注:有効にすると、<a href="%{information_panel_path}">%{information_panel_label}</a>管理パネルとホームページに、インストールステータスのバッジが表示されます。 管理者のみに表示されます。 <br/>バッジは、最新のOpenProjectバージョンを公式のOpenProjectリリースデータベースと照合して、アップデートや既知の脆弱性について警告します。 チェックの内容、利用可能なアップデートを提供するために必要なデータ、およびこのチェックを無効にする方法の詳細については、<a href="%{more_info_url}">設定ドキュメント</a>をご覧ください。
text_own_membership_delete_confirmation: "一部またはすべての権限を自分自身から剥奪しようとしているため、このプロジェクトを編集できなくなる可能性があります。\n本当に続けますか?"
text_permanent_delete_confirmation_checkbox_label: "私は、この削除は取り消すことができないことを理解しています。"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "プラグインの「assets」ディレクトリが書き込み可能"
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "アルファベット小文字(a-z)・数字・ハイフン・アンダースコアが使えます。アルファベット小文字で始まる必要があります。"
+1 -1
View File
@@ -104,7 +104,7 @@ ca:
button_save: "Desa"
button_settings: "Configuració"
button_uncheck_all: "Desmarca-ho tot"
button_update: "Actualitzar"
button_update: "Actualitza"
button_export-atom: "Descarregar Atom"
button_generate_pdf: "Generate PDF"
button_create: "Crear"
+4 -4
View File
@@ -138,7 +138,7 @@ de:
description_available_columns: "Verfügbare Spalten"
description_current_position: "Sie sind hier: "
description_select_work_package: "Arbeitspaket #%{id} auswählen"
description_subwork_package: "Unteraufgabe von Arbeitspaket #%{id}"
description_subwork_package: "Kind von Arbeitspaket #%{id}"
editor:
revisions: "Lokale Änderungen anzeigen"
no_revisions: "Keine lokalen Änderungen gefunden"
@@ -454,7 +454,7 @@ de:
label_total_progress: "%{percent}% Gesamtfortschritt"
label_total_amount: "Gesamt: %{amount}"
label_updated_on: "aktualisiert am"
label_value_derived_from_children: "(aggregierter Wert von Unteraufgaben)"
label_value_derived_from_children: "(aggregierter Wert von Kindelementen)"
label_children_derived_duration: "Aggregierte Dauer der Unteraufgaben"
label_warning: "Warnung"
label_work_package: "Arbeitspaket"
@@ -866,7 +866,7 @@ de:
title: "Neues Arbeitspaket"
header: "Neu: %{type}"
header_no_type: "Neues Arbeitspaket (Typ noch nicht gesetzt)"
header_with_parent: "Neu: %{type} (Unteraufgabe von %{parent_type} #%{id})"
header_with_parent: "Neu: %{type} (Kind von %{parent_type} #%{id})"
button: "Erstellen"
duplicate:
title: "Arbeitspaket duplizieren"
@@ -1063,7 +1063,7 @@ de:
single_text: "Sind Sie sicher, dass Sie das Arbeitspaket löschen möchten?"
bulk_text: "Sind Sie sicher, dass Sie die folgenden %{label} löschen möchten?"
has_children: "Dieses Arbeitspaket hat %{childUnits}:"
confirm_deletion_children: "Ich bestätige, dass alle Unteraufgaben der hier aufgeführten Arbeitspakete rekursiv entfernt werden."
confirm_deletion_children: "Ich bestätige, dass alle untergordneten Elemente der hier aufgeführten Arbeitspakete rekursiv entfernt werden."
deletes_children: "Alle Unteraufgaben und deren Nachkommen werden auch rekursiv gelöscht."
destroy_time_entry:
title: "Löschen der Zeitbuchung bestätigen"
+41 -41
View File
@@ -32,12 +32,12 @@ ja:
draggable_hint: |
埋め込み画像または添付ファイルをエディタにドラッグします。
ドラッグしつづけると閉じているエディタ領域が開きます。
quarantined_hint: "ウイルスが発見されたように、ファイルは隔離されています。ダウンロードできません。"
quarantined_hint: "ウイルスが発見されたため,ファイルは隔離されています。ダウンロードできません。"
autocomplete_ng_select:
add_tag: "アイテムを追加"
add_tag: "項目を追加"
clear_all: "すべてクリア"
loading: "読み込み中..."
not_found: "アイテムが見つかりません"
not_found: "見つかりませんでした"
type_to_search: "検索キーワードを入力"
autocomplete_select:
placeholder:
@@ -67,7 +67,7 @@ ja:
button_back_to_list_view: "リスト表示に戻る"
button_cancel: "キャンセル"
button_close: "閉じる"
button_change_project: "のプロジェクトに移"
button_change_project: "のプロジェクトに移"
button_check_all: "全てを選択"
button_configure-form: "フォームを設定"
button_confirm: "確認"
@@ -75,7 +75,7 @@ ja:
button_copy: "コピー"
button_copy_to_clipboard: "クリップボードにコピー"
button_copy_link_to_clipboard: "クリップボードにリンクをコピー"
button_copy_to_other_project: "別のプロジェクトで複製"
button_copy_to_other_project: "別のプロジェクトで複製する"
button_custom-fields: "カスタムフィールド"
button_delete: "削除"
button_delete_watcher: "ウォッチャーを削除"
@@ -97,7 +97,7 @@ ja:
button_open_fullscreen: "全画面表示を開く"
button_show_cards: "カードビュー表示"
button_show_list: "リストビュー表示"
button_show_table: "テーブルビューを表示"
button_show_table: "テーブル表示"
button_show_gantt: "ガントビューを表示"
button_show_fullscreen: "全画面表示"
button_more_actions: "その他の操作"
@@ -107,7 +107,7 @@ ja:
button_uncheck_all: "全てを選択解除"
button_update: "更新"
button_export-atom: "Atomをダウンロード"
button_generate_pdf: "PDFを生成"
button_generate_pdf: "PDF成"
button_create: "作成"
card:
add_new: "新規カード追加"
@@ -141,8 +141,8 @@ ja:
description_select_work_package: "ワークパッケージを選択 #%{id}"
description_subwork_package: "ワークパッケージの子 #%{id}"
editor:
revisions: "ローカルの変更を表示"
no_revisions: "ローカルの変更は見つかりませんでした"
revisions: "ローカルの修正を表示"
no_revisions: "ローカルでの修正は見つからず"
preview: "プレビューモードの切り替え"
source_code: "Markdown ソースモードの切り替え"
error_saving_failed: "次のエラーで文書を保存するのに失敗しました: %{error}"
@@ -155,7 +155,7 @@ ja:
attribute_reference:
macro_help_tooltip: "このテキストセグメントはマクロによって動的にレンダリングされています。"
not_found: "要求されたリソースが見つかりませんでした"
nested_macro: "このマクロは %{model} %{id} を再帰的に参照しています。"
nested_macro: "このマクロは %{model} %{id}を再帰的に参照してい。"
invalid_attribute: "選択した属性 '%{name}' は存在しません。"
child_pages:
button: "子ページへのリンク"
@@ -209,10 +209,10 @@ ja:
calendar:
empty_state_header: "休業日"
empty_state_description: '休業日が定義されていません。「休業日を追加」ボタンをクリックして日付を追加してください。'
new_date: "(新)"
new_date: "(新)"
add_non_working_day: "休業日を追加"
already_added_error: "この日付の非業日はすでに存在します。それぞれの日付に1つの非作業日が作成されます。"
change_button: "保存してスケジュールを変更"
already_added_error: "この日付の非業日はすでに存在します。一意の日付に対して作成できる非営業日は1つだけです。"
change_button: "保存してスケジュール"
change_title: "営業日を変更する"
removed_title: "以下の日を非稼働日リストから削除します:"
change_description: "営業日とみなす曜日を変更すると、このサイト内のすべてのプロジェクトのすべてのワークパッケージの開始日と終了日に影響を与える可能性があります。"
@@ -294,14 +294,14 @@ ja:
ical_sharing_modal:
title: "カレンダーを購読する"
inital_setup_error_message: "データ取得中にエラーが発生しました。"
description: "URLiCalendarを使って外部クライアントでこのカレンダーを購読し、そこから最新のワークパッケージ情報をることができます。"
warning: "このURLを他のユーザーと共有しないでください。このリンクがあれば、誰でもアカウントやパスワードなしでワークパッケージの詳細をることができます。"
token_name_label: "どこで使うのですか?"
description: "URL(iCalendar)を使用して、外部クライアントでこのカレンダーを購読し、そこから最新の作業パッケージ情報を表示することができます。"
warning: "このURLを他のユーザーと共有しないでください。このリンクを持つ誰でもアカウントやパスワードなしでワークパッケージの詳細を表示することができます。"
token_name_label: "どこで使うのですか?"
token_name_placeholder: '名前を入力してください。例:"電話"'
token_name_description_text: 'If you subscribe to this calendar from multiple devices, this name will help you distinguish between them in your <a href="%{myAccessTokensUrl}" target="_blank">access tokens</a> list.'
copy_url_label: "URLをコピー"
ical_generation_error_text: "カレンダー URL生成にエラーが発生しました。"
success_message: 'URL "%{name}" は正常にクリップボードにコピーされました。サブスクリプションを完了するためにカレンダークライアントに貼り付けてください。'
ical_generation_error_text: "カレンダーURL生成にエラーが発生しました。"
success_message: 'URL "%{name}" クリップボードにコピーされました。カレンダークライアントに貼り付けて購読を完了してください。'
label_activate: "有効にする"
label_assignee: "担当者"
label_assignee_alt_text: "This work package is assigned to %{name}"
@@ -314,7 +314,7 @@ ja:
label_add_row_before: "前に行を追加"
label_add_selected_columns: "選択した列を追加"
label_added_by: "追加した人"
label_added_time_by: '<a href="%{authorLink}">%{author}</a> %{age} に追加しました'
label_added_time_by: '追加 <a href="%{authorLink}">%{author}</a> %{age}'
label_ago: "○日前"
label_all: "全て"
label_all_projects: "すべてのプロジェクト"
@@ -428,7 +428,7 @@ ja:
label_report: "レポート"
label_repository_plural: "リポジトリ"
label_save_as: "名前をつけて保存"
label_search_columns: "列を検索"
label_search_columns: "列を検索する"
label_select_watcher: "ウォッチャーを選択..."
label_selected_filter_list: "選択されたフィルタ"
label_show_attributes: "すべての属性を表示"
@@ -466,8 +466,8 @@ ja:
label_watch_work_package: "ワークパッケージをウォッチ"
label_watcher_added_successfully: "ウォッチャーが正常に追加されました !"
label_watcher_deleted_successfully: "ウォッチャーが正常に削除されました !"
label_work_package_details_you_are_here: "あなたは %{tab} %{type} %{subject} のタブにいます。"
label_work_package_context_menu: "ワークパッケージのコンテキスト メニュー"
label_work_package_details_you_are_here: "あなたは %{type} %{subject}の %{tab} タブを表示しています。"
label_work_package_context_menu: "作業パッケージのコンテキストメニュー"
label_unwatch: "ウォッチしない"
label_unwatch_work_package: "ワークパッケージのウォッチを削除"
label_uploaded_by: "アップロードした人"
@@ -498,7 +498,7 @@ ja:
label_version_plural: "バージョン"
label_view_has_changed: "このビューには未保存の変更があります。 クリックすると保存します。"
help_texts:
show_modal: "ヘルプテキストを表示"
show_modal: "ヘルプテキストを表示する"
onboarding:
buttons:
skip: "スキップ"
@@ -506,7 +506,7 @@ ja:
got_it: "了承"
steps:
help_menu: "ヘルプ(?)メニューは、<b>その他のヘルプリソースを</b>提供します。ここでは、ユーザーガイド、役立つハウツービデオなどを見つけることができます。 <br> OpenProjectでの作業をお楽しみください!"
members: "新しい <b>メンバー</b>プロジェクトに招待します。"
members: "新しい<b>メンバー</b>プロジェクトに招待す。"
quick_add_button: "ヘッダーナビゲーションにあるプラス(+)アイコンをクリックして、<b>新規プロジェクトを作成</b>したり、<b>同僚を招待</b>したりできます。"
sidebar_arrow: "プロジェクトの<b>メインメニューに</b>戻るには、左上の矢印を使います。"
welcome: "3分間のイントロダクションツアーで、最も<b>重要な</b>機能を学びましょう。 <br> 最後までステップを完了することをお勧めします。ツアーはいつでも再開できます。"
@@ -613,36 +613,36 @@ ja:
work_package_commented: "すべての新着コメント"
work_package_created: "新しいワークパッケージ"
work_package_processed: "すべてのステータス変更"
work_package_prioritized: "すべての優先の変更"
work_package_scheduled: "すべての日付変更"
work_package_prioritized: "すべての優先順位の変更"
work_package_scheduled: "すべての日付変更"
global:
immediately:
title: "参加"
description: "自分が関与しているワークパッケージのすべてのアクティビティに関する通知(アサイニー、アカウンタブル、ウォッチャー)。"
description: "自分が関与しているワークパッケージのすべてのアクティビティに関する通知(担当、責任、ウォッチャー)。"
delayed:
title: "不参加"
description: "すべてのプロジェクトでのアクティビティの追加通知。"
description: "プロジェクトにおける活動の追加通知。"
date_alerts:
title: "日付アラート"
description: "あなたが関与している(アサイニー、アカウンタブル、ウォッチャー)オープンワークパッケージの重要な日付が近づくと自動通知。"
description: "あなたが関与している(担当、責任、ウォッチャー)オープンワークパッケージの重要な日付が近づくと自動通知。"
overdue: 期限を過ぎた場合
project_specific:
title: "プロジェクト固有の通知設定"
description: "これらのプロジェクト固有の設定は、上記のデフォルト設定を上書きす。"
description: "これらのプロジェクト固有の設定は、上記のデフォルト設定を上書きします。"
add: "プロジェクトの設定を追加する"
already_selected: "このプロジェクトは既に選択されています"
already_selected: "このプロジェクトはすでに選ばれてい"
remove: "プロジェクトの設定を削除する"
password_confirmation:
field_description: "この変更を確認するには、アカウントのパスワードを入力する必要があります。"
title: "続行するにはパスワードを確認してください"
pagination:
no_other_page: "このページだけです。"
pages_skipped: "ページスキップされました。"
pages_skipped: "ページスキップ。"
page_navigation: "ページネーション・ナビゲーション"
per_page_navigation: 'ページ毎のアイテム選択'
pages:
page_number: ページ %{number}
show_per_page: ページあたり %{number} を表示
show_per_page: ページごとに %{number}
placeholders:
default: "-"
subject: "ここにタイトルを入力します"
@@ -652,7 +652,7 @@ ja:
project:
autocompleter:
label: "プロジェクト名の入力補完"
click_to_switch_to_project: "プロジェクト: %{projectname}"
click_to_switch_to_project: "プロジェクト %{projectname}"
context: "プロジェクトのコンテキスト"
not_available: "プロジェクトなし"
required_outside_context: >
@@ -660,30 +660,30 @@ ja:
reminders:
settings:
daily:
add_time: "時間を追加"
add_time: "時間を追加する"
enable: "毎日のEメールリマインダーを有効にする"
explanation: "このリマインダーは、未読の通知に対してのみ、指定した時間帯にのみ届きます。 %{no_time_zone}"
no_time_zone: "アカウントにタイムゾーンを設定するまでは、時間はUTCで解釈されます。"
time_label: "時間 %{counter}"
title: "未読通知を毎日メールで通知する"
title: "未読通知メールのリマインダーを毎日送信する"
workdays:
title: "これらの日にリマインダーメールを受け取る"
immediate:
title: "電子メールのリマインダーを送信"
mentioned: "@mentionするとすぐに"
personal_reminder: "個人的なリマインダーを受け取ったら直ちに"
personal_reminder: "個人的なリマインダーを受け取ったとき"
alerts:
title: "その他の項目(ワークパッケージではないもの)に対する電子メールアラート"
explanation: >
本日の通知はワークパッケージに限定されています。これらのイベントが通知に含まれるようになるまで、Eメールアラートを受信し続けることを選択できます:
news_added: "ニュースが追加されました。"
news_commented: "ニュースへのコメント"
document_added: "追加された書類"
document_added: "ドキュメントの追加"
forum_messages: "新しいフォーラムメッセージ"
wiki_page_added: "Wikiページが追加されました。"
wiki_page_updated: "Wikiページが更新されました。"
membership_added: "メンバーシップ追加されました"
membership_updated: "メンバーシップ更新"
membership_added: "メンバーシップ追加"
membership_updated: "メンバーシップ更新"
title: "電子メールによるリマインダー"
pause:
label: "毎日のEメールリマインダーを一時停止する"
@@ -1172,7 +1172,7 @@ ja:
toggle_title: "ベースライン"
clear: "クリア"
apply: "適用"
header_description: "過去のいずれかの時点からこのリストに加えられた変更を強調する。"
header_description: "過去の選択した時点からこのリストに加えられた変更をハイライト"
show_changes_since: "以降の変更を表示する"
help_description: "ベースラインの基準タイムゾーン。"
time_description: "現地時間: %{datetime}"
+1 -1
View File
@@ -104,7 +104,7 @@
button_save: "Lagre"
button_settings: "Innstillinger"
button_uncheck_all: "Avmerk alle"
button_update: "Oppdater"
button_update: "Oppdatèr"
button_export-atom: "Last ned Atom"
button_generate_pdf: "Generate PDF"
button_create: "Opprett"
+1 -1
View File
@@ -104,7 +104,7 @@ ro:
button_save: "Salvează"
button_settings: "Setări"
button_uncheck_all: "Deselectează tot"
button_update: "Actualizează"
button_update: "Actualizare"
button_export-atom: "Descarcă Atom"
button_generate_pdf: "Generează PDF"
button_create: "Creează"
+1 -1
View File
@@ -104,7 +104,7 @@ ru:
button_save: "Сохранить"
button_settings: "Настройки"
button_uncheck_all: "Снять все отметки"
button_update: "Обновить"
button_update: "Обновление"
button_export-atom: "Скачать Atom"
button_generate_pdf: "Создать PDF"
button_create: "Создать"
+4 -1
View File
@@ -1511,7 +1511,8 @@ ka:
not_a_datetime: "is not a valid date time."
not_a_number: "is not a number."
not_allowed: "is invalid because of missing permissions."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "is not an integer."
not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD."
not_same_project: "doesn't belong to the same project."
@@ -2168,6 +2169,7 @@ ka:
button_print: "ბეჭდვა"
button_quote: "ციტატა"
button_remove: წაშლა
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "გადარქმევა"
button_replace: "ჩანაცვლება"
@@ -4724,6 +4726,7 @@ ka:
Note: if enabled, this will display a badge with your installation status in the <a href="%{information_panel_path}">%{information_panel_label}</a> administration panel, and on the home page. It is displayed to administrators only. <br/> The badge will check your current OpenProject version against the official OpenProject release database to alert you of any updates or known vulnerabilities. For more information on what the check provides, what data is needed to provide available updates, and how to disable this check, please visit <a href="%{more_info_url}">the configuration documentation</a>.
text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Plugin assets directory writable"
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
+4 -1
View File
@@ -1511,7 +1511,8 @@ kk:
not_a_datetime: "is not a valid date time."
not_a_number: "is not a number."
not_allowed: "is invalid because of missing permissions."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "is not an integer."
not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD."
not_same_project: "doesn't belong to the same project."
@@ -2168,6 +2169,7 @@ kk:
button_print: "Print"
button_quote: "Quote"
button_remove: Remove
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "Rename"
button_replace: "Replace"
@@ -4724,6 +4726,7 @@ kk:
Note: if enabled, this will display a badge with your installation status in the <a href="%{information_panel_path}">%{information_panel_label}</a> administration panel, and on the home page. It is displayed to administrators only. <br/> The badge will check your current OpenProject version against the official OpenProject release database to alert you of any updates or known vulnerabilities. For more information on what the check provides, what data is needed to provide available updates, and how to disable this check, please visit <a href="%{more_info_url}">the configuration documentation</a>.
text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Plugin assets directory writable"
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
+4 -1
View File
@@ -1502,7 +1502,8 @@ ko:
not_a_datetime: "은(는) 유효한 날짜가 아닙니다."
not_a_number: "은(는) 숫자가 아닙니다."
not_allowed: "- 사용 권한이 없어 유효하지 않습니다."
not_json: "- 유효한 JSON 개체가 아닙니다."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "은(는) 정수가 아닙니다."
not_an_iso_date: "은(는) 유효한 날짜가 아닙니다. 필요한 형식: YYYY-MM-DD."
not_same_project: "은(는) 동일한 프로젝트에 속하지 않습니다."
@@ -2142,6 +2143,7 @@ ko:
button_print: "인쇄"
button_quote: "인용"
button_remove: 제거
button_remove_permanently: "Remove permanently"
button_remove_reminder: "미리 알림 제거"
button_rename: "이름 바꾸기"
button_replace: "교체하기"
@@ -4672,6 +4674,7 @@ ko:
참고: 활성화하는 경우, <a href="%{information_panel_path}">%{information_panel_label}</a> 관리 패널 및 홈페이지에서 설치 상태가 나오는 배지가 표시됩니다. 배지는 관리자에게만 표시됩니다. <br/> 배지는 공식 OpenProject 릴리스 데이터베이스와 비교하여 현재 OpenProject 버전을 확인하고 업데이트 또는 알려진 취약성에 대해 알려줍니다. 이 검사에서 제공하는 사항, 사용 가능한 업데이트를 제공하기 위해 필요한 데이터 및 이 검사를 비활성화하는 방법에 대한 자세한 내용은 <a href="%{more_info_url}">구성 문서</a>를 참조하십시오.
text_own_membership_delete_confirmation: "권한의 일부 또는 전부를 삭제하려고 합니다. 이렇게 한 후에는 이 프로젝트를 더 이상 편집하지 못할 수 있습니다.\n계속하시겠습니까?"
text_permanent_delete_confirmation_checkbox_label: "이 삭제는 되돌릴 수 없음을 이해합니다."
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "플러그인 자산 디렉터리 쓰기 가능"
text_powered_by: "%{link} 제공"
text_project_identifier_info: "소문자(a-z), 숫자, 대시(-) 및 밑줄(_)만 허용됩니다. 소문자로 시작해야 합니다."
+4 -1
View File
@@ -1526,7 +1526,8 @@ lt:
not_a_datetime: "nėra tinkama data ir laikas."
not_a_number: "nėra skaičius."
not_allowed: "netinkamas dėl trūkstamų teisių."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "nėra sveikasis skaičius."
not_an_iso_date: "nėra tinkama data. Reikalingas formatas: YYYY-MM-DD."
not_same_project: "nepriklauso tam pačiam projektui."
@@ -2217,6 +2218,7 @@ lt:
button_print: "Spausdinti"
button_quote: "Cituoti"
button_remove: Pašalinti
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "Pervardinti"
button_replace: "Pakeisti"
@@ -4816,6 +4818,7 @@ lt:
Pastaba: įjungus bus rodomas ženkliukas su jūsų diegimo būsena <a href="%{information_panel_path}">%{information_panel_label}</a> administravimo skydelyje. Rodoma tik administratoriams. <br/> Ženkliukas palygins jūsų OpenProject versiją su oficialia OpenProject laidų duomenų baze ir praneš, jei yra atnaujinimų dėl žinomų saugumo problemų. Daugiau informacijos, ką daro šis tikrinimas, kokią reikia pateikti informaciją ir kaip šį tikrinimą išjungti, rasite <a href="%{more_info_url}">konfigūravimo dokumentacijoje</a>.
text_own_membership_delete_confirmation: "Jūs ketinate pašalinti keletą ar visus leidimus ir gali būti, kad nebegalėsite redaguoti šio projekto po to.\nAr jūs tikrai norite tęsti?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Į papildinių katalogą galima rašyti"
text_powered_by: "Parengta pagal %{link}"
text_project_identifier_info: "Leidžiamos tik mažosios raidės (a-z), skaitmenys, paprasti (-) ir žemi brūkšneliai (_). Taip pat privalo prasidėti mažąja raide."
+4 -1
View File
@@ -1520,7 +1520,8 @@ lv:
not_a_datetime: "is not a valid date time."
not_a_number: "nav skaitlis."
not_allowed: "is invalid because of missing permissions."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "nav vesels skaitlis."
not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD."
not_same_project: "neietilpst vienā un tai pašā projektā."
@@ -2194,6 +2195,7 @@ lv:
button_print: "Drukāt"
button_quote: "Citēt"
button_remove: Noņemt
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "Rename"
button_replace: "Replace"
@@ -4773,6 +4775,7 @@ lv:
Note: if enabled, this will display a badge with your installation status in the <a href="%{information_panel_path}">%{information_panel_label}</a> administration panel, and on the home page. It is displayed to administrators only. <br/> The badge will check your current OpenProject version against the official OpenProject release database to alert you of any updates or known vulnerabilities. For more information on what the check provides, what data is needed to provide available updates, and how to disable this check, please visit <a href="%{more_info_url}">the configuration documentation</a>.
text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Plugin assets directory writable"
text_powered_by: "Darbojas uz %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
+4 -1
View File
@@ -1511,7 +1511,8 @@ mn:
not_a_datetime: "is not a valid date time."
not_a_number: "is not a number."
not_allowed: "is invalid because of missing permissions."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "is not an integer."
not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD."
not_same_project: "doesn't belong to the same project."
@@ -2168,6 +2169,7 @@ mn:
button_print: "Print"
button_quote: "Quote"
button_remove: Remove
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "Rename"
button_replace: "Replace"
@@ -4724,6 +4726,7 @@ mn:
Note: if enabled, this will display a badge with your installation status in the <a href="%{information_panel_path}">%{information_panel_label}</a> administration panel, and on the home page. It is displayed to administrators only. <br/> The badge will check your current OpenProject version against the official OpenProject release database to alert you of any updates or known vulnerabilities. For more information on what the check provides, what data is needed to provide available updates, and how to disable this check, please visit <a href="%{more_info_url}">the configuration documentation</a>.
text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Plugin assets directory writable"
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
+4 -1
View File
@@ -1500,7 +1500,8 @@ ms:
not_a_datetime: "bukan tarikh masa yang sah."
not_a_number: "bukan nombor."
not_allowed: "adalah tidak sah kerana kekurangan kebenaran."
not_json: "bukan objek JSON yang sah."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "bukan sebuah integer."
not_an_iso_date: "bukan tarikh yang sah. Format yang diperlukan: TTTT-BB-HH."
not_same_project: "tidak tergolong dalam projek yang sama."
@@ -2140,6 +2141,7 @@ ms:
button_print: "Cetak"
button_quote: "Petikan"
button_remove: Keluarkan
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Buang peringatan"
button_rename: "Namakan semula"
button_replace: "Gantikan"
@@ -4672,6 +4674,7 @@ ms:
Perhatian: jika dibenarkan, ini akan paparkan lambang bersertaan status pemasangan di <a href="%{information_panel_path}">%{information_panel_label}</a> panel pentadbiran, dan di halaman utama. Ia hanya akan dipaparkan ke para pentadbir sahaja. <br/> Lambang tersebut akan menyemak versi OpenProject terkini anda terhadap pangkalan data keluaran rasmi OpenProject untuk memaklumkan anda tentang sebarang kemas kini atau kelemahan yang diketahui. Untuk maklumat lanjut bagi penyediaan semakan, data apa yang diperlukan untuk menyediakan kemas kini tersedia, dan bagaimana untuk menyahaktifkan semakan ini, sila kunjungi <a href="%{more_info_url}">dokumentasi konfigurasi</a>.
text_own_membership_delete_confirmation: "Anda akan mengeluarkan beberapa atau semua kebenaran anda dan mungkin tidak lagi dapat mengedit projek ini selepas itu.\nAdakah anda pasti anda ingin teruskan?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Aset plugin direktori yang boleh ditulis"
text_powered_by: "Dikuasakan oleh %{link}"
text_project_identifier_info: "Hanya huruf kecil (a-z), nombor, sengkang dan tanda garis bawah adalah dibenarkan, mesti mula dengan huruf kecil."
+4 -1
View File
@@ -1511,7 +1511,8 @@ ne:
not_a_datetime: "is not a valid date time."
not_a_number: "is not a number."
not_allowed: "is invalid because of missing permissions."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "is not an integer."
not_an_iso_date: "is not a valid date. Required format: YYYY-MM-DD."
not_same_project: "doesn't belong to the same project."
@@ -2168,6 +2169,7 @@ ne:
button_print: "Print"
button_quote: "Quote"
button_remove: Remove
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "Rename"
button_replace: "Replace"
@@ -4724,6 +4726,7 @@ ne:
Note: if enabled, this will display a badge with your installation status in the <a href="%{information_panel_path}">%{information_panel_label}</a> administration panel, and on the home page. It is displayed to administrators only. <br/> The badge will check your current OpenProject version against the official OpenProject release database to alert you of any updates or known vulnerabilities. For more information on what the check provides, what data is needed to provide available updates, and how to disable this check, please visit <a href="%{more_info_url}">the configuration documentation</a>.
text_own_membership_delete_confirmation: "You are about to remove some or all of your permissions and may no longer be able to edit this project after that.\nAre you sure you want to continue?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Plugin assets directory writable"
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Only lower case letters (a-z), numbers, dashes and underscores are allowed, must start with a lower case letter."
+4 -1
View File
@@ -1507,7 +1507,8 @@ nl:
not_a_datetime: "is geen geldige datum tijd."
not_a_number: "is geen getal."
not_allowed: "is ongeldig vanwege ontbrekende machtigingen."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "is niet een geheel getal."
not_an_iso_date: "is geen geldige datum. Vereist formaat: JJJJ-MM-DD."
not_same_project: "hoort niet bij hetzelfde project."
@@ -2164,6 +2165,7 @@ nl:
button_print: "Afdrukken"
button_quote: "Citeer"
button_remove: Verwijder
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "Naam wijzigen"
button_replace: "Vervang"
@@ -4719,6 +4721,7 @@ nl:
Opmerking: indien ingeschakeld zal dit een badge weergeven met uw installatiestatus in de <a href="%{information_panel_path}">%{information_panel_label}</a> administratie paneel, en op de homepage. Deze wordt alleen getoond aan beheerders. <br/> De badge zal uw huidige OpenProject versie controleren tegen de officiële OpenProject-database om u te waarschuwen voor updates of bekende kwetsbaarheden. Voor meer informatie over wat de controle biedt, welke gegevens nodig zijn om beschikbare updates te verstrekken en hoe deze controle kan worden uitgeschakeld, bezoek <a href="%{more_info_url}">de configuratiedocumentatie</a>.
text_own_membership_delete_confirmation: "U staat op het punt om enkele of alle van uw machtigingen te verwijderen en kan dit project daarna mogelijk niet meer bewerken.\nWeet u zeker dat u wilt doorgaan?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Plugin directory schrijfbaar"
text_powered_by: "Powered by %{link}"
text_project_identifier_info: "Alleen kleine letters (a-z), cijfers, streepjes en underscores (_) zijn toegestaan, moet beginnen met een kleine letter."
+4 -1
View File
@@ -1510,7 +1510,8 @@
not_a_datetime: "er ikke et gyldig tidspunkt for datoen."
not_a_number: "er ikke et tall."
not_allowed: "er ugyldig på grunn av manglende tillatelser."
not_json: "is not a valid JSON object."
not_json: "is not parseable as JSON."
not_json_object: "is not a JSON object."
not_an_integer: "er ikke et heltall."
not_an_iso_date: "er ikke en gyldig dato. Påkrevd format: ÅÅÅÅ-MM-DD."
not_same_project: "hører ikke til samme prosjekt."
@@ -2167,6 +2168,7 @@
button_print: "Skriv ut"
button_quote: "Sitèr"
button_remove: Fjern
button_remove_permanently: "Remove permanently"
button_remove_reminder: "Remove reminder"
button_rename: "Endre navn"
button_replace: "Erstatt"
@@ -4723,6 +4725,7 @@
Merk: Hvis aktivert, vil dette vise et merke med din installasjonsstatus i <a href="%{information_panel_path}">%{information_panel_label}</a> administrasjonspanel, og på hjemmesiden. Det er kun vist til administratorer. <br/> Merket sjekker din nåværende OpenProject versjon mot den offisielle OpenProject utgivelsesdatabasen for å varsle deg om oppdateringer og kjente sårbarheter. For mer informasjon om hva som finnes av kontrollen, hvilke data som er nødvendig for å framskaffe tilgjengelige oppdateringer, og hvordan denne sjekken kan deaktiveres, besøk <a href="%{more_info_url}">konfigurasjonsdokumentasjonen</a>.
text_own_membership_delete_confirmation: "Du er i ferd med å fjerne noen eller alle dine egne rettigheter og du vil kanskje ikke kunne redigere dette prosjektet etterpå.\nEr du sikker på at du vil fortsette?"
text_permanent_delete_confirmation_checkbox_label: "I understand that this deletion cannot be reversed"
text_permanent_remove_confirmation_checkbox_label: "I understand that this removal cannot be reversed"
text_plugin_assets_writable: "Mappen for programtillegg er skrivbar"
text_powered_by: "Driftes med %{link}"
text_project_identifier_info: "Kun små bokstaver (a-z), tall, bindestrek og understrek er tillatt. Første tegn må være liten bokstav."

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