mirror of
https://github.com/opf/openproject.git
synced 2026-06-14 03:30:14 +00:00
Merge branch 'dev' into merge-release/17.0-20260108132255
This commit is contained in:
@@ -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
@@ -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
|
||||
|
||||
@@ -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
File diff suppressed because it is too large
Load Diff
+1
-1
@@ -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
|
||||
|
||||
+4
-1
@@ -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
|
||||
%>
|
||||
+7
-8
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -29,6 +29,8 @@
|
||||
#++
|
||||
|
||||
module NumberFormatHelper
|
||||
include ActionView::Helpers::NumberHelper
|
||||
|
||||
def number_with_limit(number, opts = {})
|
||||
init_formatting_options(opts) => { digits:, precision:, length_limit: }
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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, &)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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}",
|
||||
|
||||
@@ -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
|
||||
@@ -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])
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
%>
|
||||
|
||||
|
||||
@@ -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")
|
||||
)
|
||||
%>
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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: "يتم السماح فقط رسائل الحالة الأدنى (أ-ي) وأرقام، والشرطات وتسطير، يجب أن تبدأ بحرف حالة الأدنى."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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: "Επιτρέπονται μόνο πεζά γράμματα (α-ω), αριθμοί, παύλες και κάτω παύλες, πρέπει να αρχίζουν με πεζό γράμμα."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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 d’autorisations 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: "n’est 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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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クライアントは、OpenProjectのSCIMサーバー 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)・数字・ハイフン・アンダースコアが使えます。アルファベット小文字で始まる必要があります。"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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: "URL(iCalendar)を使って外部クライアントでこのカレンダーを購読し、そこから最新のワークパッケージ情報を見ることができます。"
|
||||
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}"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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ă"
|
||||
|
||||
@@ -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: "Создать"
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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), 숫자, 대시(-) 및 밑줄(_)만 허용됩니다. 소문자로 시작해야 합니다."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user