mirror of
https://github.com/opf/openproject.git
synced 2026-06-13 19:20:00 +00:00
Merge branch 'dev' into merge-release/17.1-20260206041730
This commit is contained in:
@@ -5,6 +5,11 @@ updates:
|
||||
schedule:
|
||||
interval: "daily"
|
||||
target-branch: "dev"
|
||||
cooldown:
|
||||
default-days: 5
|
||||
semver-major-days: 30
|
||||
semver-minor-days: 14
|
||||
semver-patch-days: 5
|
||||
groups:
|
||||
angular:
|
||||
patterns:
|
||||
@@ -40,6 +45,11 @@ updates:
|
||||
schedule:
|
||||
interval: "daily"
|
||||
target-branch: "dev"
|
||||
cooldown:
|
||||
default-days: 5
|
||||
semver-major-days: 30
|
||||
semver-minor-days: 14
|
||||
semver-patch-days: 5
|
||||
groups:
|
||||
aws-gems:
|
||||
patterns:
|
||||
|
||||
@@ -72,6 +72,7 @@ jobs:
|
||||
samachon,
|
||||
shiroginne,
|
||||
toy,
|
||||
tiroessler,
|
||||
ulferts,
|
||||
vonTronje,
|
||||
vspielau,
|
||||
|
||||
@@ -21,8 +21,10 @@ jobs:
|
||||
REPOSITORY: opf/openproject-flavours
|
||||
WORKFLOW_ID: ci.yml
|
||||
REF_NAME: ${{ github.ref_name }}
|
||||
THIS_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
||||
run: |
|
||||
PAYLOAD=$(jq -n --arg ref "$REF_NAME" '{"ref": "dev", "inputs": {"ref": $ref}}')
|
||||
PAYLOAD=$(jq -n --arg ref "$REF_NAME" --arg triggered_by_url "$THIS_RUN_URL" \
|
||||
'{"ref": "dev", "inputs": {"ref": $ref, "triggered_by_url": $triggered_by_url}}')
|
||||
curl -i --fail-with-body -H"authorization: Bearer $TOKEN" \
|
||||
-XPOST -H"Accept: application/vnd.github.v3+json" \
|
||||
https://api.github.com/repos/$REPOSITORY/actions/workflows/$WORKFLOW_ID/dispatches \
|
||||
|
||||
@@ -270,7 +270,7 @@ jobs:
|
||||
|
||||
sleep 60
|
||||
|
||||
docker logs openproject --tail 100
|
||||
docker logs openproject --tail 300
|
||||
wget -O- --retry-on-http-error=503,502 --retry-connrefused http://localhost:8080/api/v3
|
||||
- name: Push image
|
||||
id: push
|
||||
|
||||
@@ -38,6 +38,7 @@ jobs:
|
||||
BASE_REF: ${{ github.base_ref }}
|
||||
HEAD_REF: ${{ github.event.pull_request.head.ref }}
|
||||
REF_NAME: ${{ github.ref_name }}
|
||||
THIS_RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
|
||||
# ref:
|
||||
# * on push this will be `dev` or a specific release branch (e.g. release/16.1) - there is always a matching branch for that downstream
|
||||
# * on pull_request we use the PR branch's base (e.g. dev or a release branch) to match the above
|
||||
@@ -64,7 +65,8 @@ jobs:
|
||||
exit 0
|
||||
fi
|
||||
|
||||
PAYLOAD=$(jq -n --arg ref "$REF" --arg core_ref "$CORE_REF" '{"ref": $ref, "inputs": {"core_ref": $core_ref}}')
|
||||
PAYLOAD=$(jq -n --arg ref "$REF" --arg core_ref "$CORE_REF" --arg triggered_by_url "$THIS_RUN_URL" \
|
||||
'{"ref": $ref, "inputs": {"core_ref": $core_ref, "triggered_by_url": $triggered_by_url}}')
|
||||
OUTPUT_FILE=/tmp/request-output
|
||||
|
||||
echo "Triggering $WORKFLOW_ID workflow on $REPOSITORY branch '$REF', which will check out core branch '$CORE_REF'"
|
||||
|
||||
+1
-2
@@ -4,7 +4,7 @@ We are pleased that you are thinking about contributing to OpenProject! This gui
|
||||
|
||||
## Get in touch
|
||||
|
||||
Please get in touch with us using our [development forum](https://community.openproject.org/projects/openproject/boards/7) or send us an email to [info@openproject.com](mailto:info@openproject.com).
|
||||
Please get in touch with us using our [OpenProject community platform](https://community.openproject.org/) or send us an email to [info@openproject.com](mailto:info@openproject.com).
|
||||
|
||||
## Issue tracking and coordination
|
||||
|
||||
@@ -12,7 +12,6 @@ We eat our own ice cream so we use OpenProject for roadmap planning and team col
|
||||
|
||||
- [Product roadmap](https://community.openproject.org/projects/openproject/roadmap)
|
||||
- [Wish list](https://community.openproject.org/projects/openproject/work_packages?query_id=180)
|
||||
- [Bug backlog board](https://community.openproject.org/projects/openproject/boards/2905)
|
||||
- [Report a bug](https://www.openproject.org/docs/development/report-a-bug/)
|
||||
- [Submit a feature idea](https://www.openproject.org/docs/development/submit-feature-idea/)
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
OpenProject is an open source project management software.
|
||||
|
||||
Copyright (C) 2012-2025 the OpenProject GmbH
|
||||
Copyright (C) 2012-2026 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
|
||||
|
||||
@@ -200,7 +200,7 @@ gem "fog-aws"
|
||||
|
||||
gem "aws-sdk-core", "~> 3.241"
|
||||
# File upload via fog + screenshots on travis
|
||||
gem "aws-sdk-s3", "~> 1.211"
|
||||
gem "aws-sdk-s3", "~> 1.213"
|
||||
|
||||
gem "openproject-token", "~> 8.6.0"
|
||||
|
||||
|
||||
+15
-15
@@ -203,7 +203,7 @@ PATH
|
||||
remote: modules/two_factor_authentication
|
||||
specs:
|
||||
openproject-two_factor_authentication (1.0.0)
|
||||
aws-sdk-sns (>= 1.101, < 1.112)
|
||||
aws-sdk-sns (>= 1.101, < 1.113)
|
||||
messagebird-rest (>= 1.4.2, < 5.1.0)
|
||||
rotp (~> 6.1)
|
||||
webauthn (~> 3.0)
|
||||
@@ -339,8 +339,8 @@ GEM
|
||||
awesome_nested_set (3.9.0)
|
||||
activerecord (>= 4.0.0, < 8.2)
|
||||
aws-eventstream (1.4.0)
|
||||
aws-partitions (1.1202.0)
|
||||
aws-sdk-core (3.241.3)
|
||||
aws-partitions (1.1210.0)
|
||||
aws-sdk-core (3.241.4)
|
||||
aws-eventstream (~> 1, >= 1.3.0)
|
||||
aws-partitions (~> 1, >= 1.992.0)
|
||||
aws-sigv4 (~> 1.9)
|
||||
@@ -348,15 +348,15 @@ GEM
|
||||
bigdecimal
|
||||
jmespath (~> 1, >= 1.6.1)
|
||||
logger
|
||||
aws-sdk-kms (1.120.0)
|
||||
aws-sdk-core (~> 3, >= 3.241.3)
|
||||
aws-sdk-kms (1.121.0)
|
||||
aws-sdk-core (~> 3, >= 3.241.4)
|
||||
aws-sigv4 (~> 1.5)
|
||||
aws-sdk-s3 (1.211.0)
|
||||
aws-sdk-core (~> 3, >= 3.241.3)
|
||||
aws-sdk-s3 (1.213.0)
|
||||
aws-sdk-core (~> 3, >= 3.241.4)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.5)
|
||||
aws-sdk-sns (1.111.0)
|
||||
aws-sdk-core (~> 3, >= 3.241.3)
|
||||
aws-sdk-sns (1.112.0)
|
||||
aws-sdk-core (~> 3, >= 3.241.4)
|
||||
aws-sigv4 (~> 1.5)
|
||||
aws-sigv4 (1.12.1)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
@@ -1548,7 +1548,7 @@ DEPENDENCIES
|
||||
auto_strip_attributes (~> 2.5)
|
||||
awesome_nested_set (~> 3.9.0)
|
||||
aws-sdk-core (~> 3.241)
|
||||
aws-sdk-s3 (~> 1.211)
|
||||
aws-sdk-s3 (~> 1.213)
|
||||
axe-core-rspec
|
||||
bcrypt (~> 3.1.6)
|
||||
bootsnap (~> 1.20.0)
|
||||
@@ -1788,11 +1788,11 @@ CHECKSUMS
|
||||
auto_strip_attributes (2.6.0) sha256=a7e2e0cf744de2bcd947fd68014220702bcc88c81274c1cd9ce6f7316aae39b0
|
||||
awesome_nested_set (3.9.0) sha256=3ce99e816550f97f4de118e621630070aacf24928b920fe4a68846578a8daaed
|
||||
aws-eventstream (1.4.0) sha256=116bf85c436200d1060811e6f5d2d40c88f65448f2125bc77ffce5121e6e183b
|
||||
aws-partitions (1.1202.0) sha256=c8aa0f134a23464c61cfd00edfb4b6d968b01847a8b591d4dcc0c63a4897c301
|
||||
aws-sdk-core (3.241.3) sha256=c7c445ecf1c601c860fd537458b2eb8df0c5df01e63c371849e6594e6b1d4f47
|
||||
aws-sdk-kms (1.120.0) sha256=a206ac6f62efbe971f802e8399d2702496a5c5bc800abcf94ead87bdddfdfd80
|
||||
aws-sdk-s3 (1.211.0) sha256=2ae5feb09ff4862462824f267b76601ed16922a15de56cf51e4fa99bc5b3f519
|
||||
aws-sdk-sns (1.111.0) sha256=195edbd6953d4caa2748bd4861e0fe8df54d90aadf07a0ac268987b946c7e5be
|
||||
aws-partitions (1.1210.0) sha256=04143b868f8b3fc481f68552df6a430f1083a56e2afec5a6bc5c89532ab423fe
|
||||
aws-sdk-core (3.241.4) sha256=a42ccba8c24ea9800e7b6c40aa201c967458f7c460044a6eebf64fbf1226e4fd
|
||||
aws-sdk-kms (1.121.0) sha256=d563c1cfb4b5754efbc671216c8eca875338748adad0f42518c28dfa0a2d01e0
|
||||
aws-sdk-s3 (1.213.0) sha256=af596ccf544582406db610e95cc9099276eaf03142f57a2f30f76940e598e50d
|
||||
aws-sdk-sns (1.112.0) sha256=aff1b1b5bbcb4229599221c558a41790c1cd1a1fed47ac3d27d27512ad24b254
|
||||
aws-sigv4 (1.12.1) sha256=6973ff95cb0fd0dc58ba26e90e9510a2219525d07620c8babeb70ef831826c00
|
||||
axe-core-api (4.11.0) sha256=3d9c94e3c8f8f9b8f154a3ce036b3dec2dabf7bb7de5e51d663b18bd8a0d691b
|
||||
axe-core-rspec (4.11.0) sha256=3c3e3ef3863d9f5243e056b7da328932c0b6682dda299bb4bd74d760641486d7
|
||||
|
||||
@@ -29,9 +29,9 @@ See COPYRIGHT and LICENSE files for more details.
|
||||
|
||||
<%=
|
||||
render(Primer::OpenProject::PageHeader.new(test_selector: "custom-fields--page-header")) do |header|
|
||||
header.with_title { @custom_field.attribute_in_database("name") }
|
||||
header.with_title { page_title }
|
||||
|
||||
header.with_breadcrumbs(breadcrumbs_items)
|
||||
header.with_breadcrumbs(breadcrumbs_items, selected_item_font_weight: :normal)
|
||||
|
||||
helpers.render_tab_header_nav(header, tabs, test_selector: :custom_field_detail_header)
|
||||
end
|
||||
|
||||
@@ -76,11 +76,19 @@ module Admin
|
||||
|
||||
private
|
||||
|
||||
def page_title
|
||||
concat @custom_field.attribute_in_database("name")
|
||||
concat render(Primer::Beta::Text.new(color: :muted)) { " (#{helpers.label_for_custom_field_format(@custom_field.field_format)})" }
|
||||
end
|
||||
|
||||
def breadcrumbs_items
|
||||
[{ href: admin_index_path, text: t(:label_administration) },
|
||||
{ href: custom_fields_path, text: t(:label_custom_field_plural) },
|
||||
{ href: custom_fields_path(tab: @custom_field.type), text: I18n.t(@custom_field.type_name) },
|
||||
@custom_field.attribute_in_database("name")]
|
||||
[
|
||||
{ href: admin_index_path, text: t(:label_administration) },
|
||||
{ href: custom_fields_path, text: t(:label_custom_field_plural) },
|
||||
{ href: custom_fields_path(tab: @custom_field.type), text: I18n.t(@custom_field.type_name) },
|
||||
helpers.nested_breadcrumb_element(helpers.label_for_custom_field_format(model.field_format),
|
||||
@custom_field.attribute_in_database("name"))
|
||||
]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -28,9 +28,9 @@ See COPYRIGHT and LICENSE files for more details.
|
||||
++#%>
|
||||
<%=
|
||||
render(Primer::OpenProject::PageHeader.new) do |header|
|
||||
header.with_title { @custom_field.attribute_in_database("name") }
|
||||
header.with_title { page_title }
|
||||
header.with_description { t("settings.project_attributes.edit.description") } unless hide_description?
|
||||
header.with_breadcrumbs(breadcrumbs_items)
|
||||
header.with_breadcrumbs(breadcrumbs_items, selected_item_font_weight: :normal)
|
||||
|
||||
helpers.render_tab_header_nav(header, tabs, test_selector: :project_attribute_detail_header)
|
||||
end
|
||||
|
||||
@@ -78,11 +78,19 @@ module Settings
|
||||
tabs
|
||||
end
|
||||
|
||||
def page_title
|
||||
concat @custom_field.attribute_in_database("name")
|
||||
concat render(Primer::Beta::Text.new(color: :muted)) { " (#{helpers.label_for_custom_field_format(@custom_field.field_format)})" }
|
||||
end
|
||||
|
||||
def breadcrumbs_items
|
||||
[{ href: admin_index_path, text: t("label_administration") },
|
||||
{ href: admin_settings_project_custom_fields_path, text: t("label_project_plural") },
|
||||
{ href: admin_settings_project_custom_fields_path, text: t("settings.project_attributes.heading") },
|
||||
@custom_field.attribute_in_database("name")]
|
||||
[
|
||||
{ href: admin_index_path, text: t("label_administration") },
|
||||
{ href: admin_settings_project_custom_fields_path, text: t("label_project_plural") },
|
||||
{ href: admin_settings_project_custom_fields_path, text: t("settings.project_attributes.heading") },
|
||||
helpers.nested_breadcrumb_element(helpers.label_for_custom_field_format(@custom_field.field_format),
|
||||
@custom_field.attribute_in_database("name"))
|
||||
]
|
||||
end
|
||||
|
||||
def hide_description?
|
||||
|
||||
@@ -29,7 +29,7 @@ See COPYRIGHT and LICENSE files for more details.
|
||||
|
||||
<%=
|
||||
render(Primer::OpenProject::PageHeader.new) do |header|
|
||||
header.with_title { t("settings.project_attributes.new.heading") }
|
||||
header.with_title { page_title }
|
||||
header.with_description { t("settings.project_attributes.new.description") } unless hide_description?
|
||||
header.with_breadcrumbs(breadcrumb_items, selected_item_font_weight: :normal)
|
||||
end
|
||||
|
||||
@@ -31,6 +31,11 @@
|
||||
module Settings
|
||||
module ProjectCustomFields
|
||||
class NewFormHeaderComponent < ApplicationComponent
|
||||
def page_title
|
||||
concat t("settings.project_attributes.new.heading")
|
||||
concat render(Primer::Beta::Text.new(color: :muted)) { " (#{helpers.label_for_custom_field_format(model.field_format)})" }
|
||||
end
|
||||
|
||||
def breadcrumb_items
|
||||
[
|
||||
{ href: admin_index_path, text: t("label_administration") },
|
||||
|
||||
@@ -30,5 +30,6 @@
|
||||
|
||||
module Token
|
||||
class API < Named
|
||||
prefix :opapi
|
||||
end
|
||||
end
|
||||
|
||||
@@ -32,6 +32,8 @@ module Token
|
||||
class AutoLogin < HashedToken
|
||||
include ExpirableToken
|
||||
|
||||
prefix :opal
|
||||
|
||||
has_many :autologin_session_links,
|
||||
class_name: "Sessions::AutologinSessionLink",
|
||||
foreign_key: "token_id",
|
||||
|
||||
@@ -30,6 +30,8 @@
|
||||
|
||||
module Token
|
||||
class Backup < HashedToken
|
||||
prefix :opbk
|
||||
|
||||
def ready?
|
||||
return false if created_at.nil?
|
||||
|
||||
|
||||
+29
-14
@@ -64,22 +64,37 @@ module Token
|
||||
# Delete previous token of this type upon save
|
||||
before_save :delete_previous_token
|
||||
|
||||
##
|
||||
# Find a token from the token value
|
||||
def self.find_by_plaintext_value(input)
|
||||
find_by(value: input)
|
||||
end
|
||||
class << self
|
||||
##
|
||||
# A DSL method allowing to define a prefix for all generated tokens, making it possible to recognize
|
||||
# the purpose of a token by looking at the token value.
|
||||
#
|
||||
# class MyToken < HashedToken
|
||||
# prefix :my
|
||||
# end
|
||||
def prefix(value = nil)
|
||||
@prefix = value.to_s if value
|
||||
|
||||
##
|
||||
# Find tokens for the given user
|
||||
def self.for_user(user)
|
||||
where(user:)
|
||||
end
|
||||
@prefix
|
||||
end
|
||||
|
||||
##
|
||||
# Generate a random hex token value
|
||||
def self.generate_token_value
|
||||
SecureRandom.hex(32)
|
||||
##
|
||||
# Find a token from the token value
|
||||
def find_by_plaintext_value(input)
|
||||
find_by(value: input)
|
||||
end
|
||||
|
||||
##
|
||||
# Find tokens for the given user
|
||||
def for_user(user)
|
||||
where(user:)
|
||||
end
|
||||
|
||||
##
|
||||
# Generate a random hex token value
|
||||
def generate_token_value
|
||||
[prefix, SecureRandom.hex(32)].compact.join("-")
|
||||
end
|
||||
end
|
||||
|
||||
##
|
||||
|
||||
@@ -53,7 +53,7 @@ module Token
|
||||
|
||||
class << self
|
||||
def create_and_return_value(user)
|
||||
create(user:).plain_value
|
||||
create!(user:).plain_value
|
||||
end
|
||||
|
||||
##
|
||||
|
||||
@@ -30,6 +30,8 @@
|
||||
|
||||
module Token
|
||||
class ICal < HashedToken
|
||||
prefix :opical
|
||||
|
||||
# restrict the usage of one ical token to one query (calendar)
|
||||
has_one :ical_token_query_assignment, required: true, dependent: :destroy, foreign_key: :ical_token_id,
|
||||
class_name: "ICalTokenQueryAssignment", inverse_of: :ical_token
|
||||
|
||||
@@ -31,7 +31,10 @@ See COPYRIGHT and LICENSE files for more details.
|
||||
|
||||
<%=
|
||||
render(Primer::OpenProject::PageHeader.new(test_selector: "custom-fields--page-header")) do |header|
|
||||
header.with_title { t(:label_custom_field_new) }
|
||||
header.with_title do
|
||||
concat t(:label_custom_field_new)
|
||||
concat render(Primer::Beta::Text.new(color: :muted)) { " (#{label_for_custom_field_format(@custom_field.field_format)})" }
|
||||
end
|
||||
header.with_breadcrumbs(
|
||||
[{ href: admin_index_path, text: t(:label_administration) },
|
||||
{ href: custom_fields_path, text: t(:label_custom_field_plural) },
|
||||
|
||||
@@ -384,7 +384,7 @@ default:
|
||||
# password: admin
|
||||
|
||||
# By default, the APIv3 allows authentication through basic auth.
|
||||
# Uncomment the following line to restrict APIv3 access to session.
|
||||
# Uncomment the following line to prevent APIv3 access using Basic auth.
|
||||
# apiv3_enable_basic_auth: false
|
||||
|
||||
# You can configure where users should be sent after the login
|
||||
|
||||
@@ -34,6 +34,7 @@ strategies = [
|
||||
[:basic_auth_failure, namespace::BasicAuthFailure, "Basic"],
|
||||
[:global_basic_auth, namespace::GlobalBasicAuth, "Basic"],
|
||||
[:user_basic_auth, namespace::UserBasicAuth, "Basic"],
|
||||
[:user_api_token, namespace::UserAPIToken, "Bearer"],
|
||||
[:oauth, namespace::DoorkeeperOAuth, "Bearer"],
|
||||
[:anonymous_fallback, namespace::AnonymousFallback, "Basic"],
|
||||
[:jwt_oidc, namespace::JwtOidc, "Bearer"],
|
||||
@@ -48,6 +49,7 @@ OpenProject::Authentication.update_strategies(OpenProject::Authentication::Scope
|
||||
%i[global_basic_auth
|
||||
user_basic_auth
|
||||
basic_auth_failure
|
||||
user_api_token
|
||||
oauth
|
||||
jwt_oidc
|
||||
session
|
||||
@@ -59,7 +61,7 @@ OpenProject::Authentication.update_strategies(OpenProject::Authentication::Scope
|
||||
end
|
||||
|
||||
OpenProject::Authentication.update_strategies(OpenProject::Authentication::Scope::MCP_SCOPE, { store: false }) do |_|
|
||||
%i[oauth jwt_oidc user_basic_auth basic_auth_failure]
|
||||
%i[user_api_token oauth jwt_oidc user_basic_auth basic_auth_failure]
|
||||
end
|
||||
|
||||
Rails.application.configure do |app|
|
||||
|
||||
@@ -1291,7 +1291,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"
|
||||
@@ -1660,7 +1660,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í "
|
||||
@@ -1958,11 +1958,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"
|
||||
@@ -3032,7 +3032,7 @@ cs:
|
||||
ai: "Artificial Intelligence (AI)"
|
||||
aggregation: "Agregace"
|
||||
api_and_webhooks: "API & Webhooky"
|
||||
mail_notification: "E-mailové notifikace"
|
||||
mail_notification: "E-mailová upozornění"
|
||||
mails_and_notifications: "E-maily a oznámení"
|
||||
mcp_configurations: "Model Context Protocol (MCP)"
|
||||
quick_add:
|
||||
@@ -3118,7 +3118,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."
|
||||
@@ -3561,9 +3561,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"
|
||||
@@ -3587,7 +3587,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"
|
||||
@@ -3752,7 +3752,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"
|
||||
@@ -3860,28 +3860,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"
|
||||
@@ -3890,7 +3890,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"
|
||||
@@ -4189,7 +4189,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"
|
||||
@@ -4670,7 +4670,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"
|
||||
@@ -4851,7 +4851,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"
|
||||
|
||||
@@ -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"
|
||||
@@ -916,10 +916,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:
|
||||
@@ -973,7 +973,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."
|
||||
@@ -1076,7 +1076,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"
|
||||
@@ -1320,7 +1320,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"
|
||||
@@ -1817,7 +1817,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:
|
||||
@@ -2621,7 +2621,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}"
|
||||
@@ -2896,7 +2896,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"
|
||||
@@ -3220,7 +3220,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"
|
||||
@@ -4276,7 +4276,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:
|
||||
@@ -4914,7 +4914,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:
|
||||
|
||||
@@ -981,7 +981,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."
|
||||
|
||||
@@ -2856,7 +2856,7 @@ it:
|
||||
new_features_list:
|
||||
line_0: Avvio automatico del progetto (componente aggiuntivo Enterprise).
|
||||
line_1: "Riunioni: aggiungi macro-attività nuove o esistenti come risultati."
|
||||
line_2: "Meetings: show iCal responses in OpenProject."
|
||||
line_2: "Riunioni: mostra le risposte dei partecipanti nelle sottoscrizioni iCal."
|
||||
line_3: "Riunioni ricorrenti: duplica i punti dell'ordine del giorno della prossima ricorrenza."
|
||||
line_4: "Rilascio alla community: evidenziazione degli attributi."
|
||||
line_5: Avviso prima dell'apertura di link esterni nei contenuti forniti dall'utente (componente aggiuntivo Enterprise).
|
||||
|
||||
@@ -107,7 +107,7 @@ ja:
|
||||
jemalloc_allocator: Jemalloc メモリアロケータ
|
||||
journal_aggregation:
|
||||
explanation:
|
||||
text: "ユーザーの個々のアクション(例えば、ワークパッケージを2回更新する)は、それらの年齢差が指定されたタイムスパン未満である場合、単一のアクションに集約されます。これらはアプリケーション内で1つのアクションとして表示されます。これはまた、送信されるメールの数を減らし、 %{webhook_link} の遅延にも影響します。"
|
||||
text: "ユーザーの個々のアクション (例:ワークパッケージを2回更新する)は、指定された時間範囲よりも時間差が小さい場合、単一のアクションに集約されます。 これらはアプリケーション内で単一のアクションとして表示されます。 これにより、送信されるメールの数が減少し、 %{webhook_link} の遅延にも影響します。"
|
||||
link: "webhook"
|
||||
mcp_configurations:
|
||||
index:
|
||||
@@ -128,13 +128,13 @@ ja:
|
||||
success: "MCP configuration was updated successfully."
|
||||
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: "トークンが生成されました"
|
||||
@@ -147,21 +147,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クライアントがまだ設定されていません"
|
||||
@@ -691,26 +691,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:
|
||||
@@ -734,7 +734,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は無効です。'
|
||||
password_confirmation_dialog:
|
||||
confirmation_required: "You need to enter your account password to confirm this change."
|
||||
title: "Confirm your password to continue"
|
||||
@@ -755,7 +755,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: "ブラウザ"
|
||||
@@ -769,17 +769,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:
|
||||
@@ -836,7 +836,7 @@ ja:
|
||||
placeholder_users:
|
||||
right_to_manage_members_missing: >
|
||||
プレースホルダーユーザを削除する権限がありません。 プレースホルダー ユーザーがメンバーであるすべてのプロジェクトのメンバーを管理する権利はありません。
|
||||
delete_tooltip: "プレースホルダー・ユーザーの削除"
|
||||
delete_tooltip: "プレースホルダー ユーザーを削除"
|
||||
deletion_info:
|
||||
heading: "プレースホルダー ユーザー %{name} を削除"
|
||||
data_consequences: >
|
||||
@@ -854,11 +854,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: 現在、ステータス報告はありません。
|
||||
@@ -869,19 +869,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: 新しいステータスを追加
|
||||
@@ -891,7 +892,7 @@ ja:
|
||||
is_readonly: "読み取り専用"
|
||||
excluded_from_totals: "合計から除外"
|
||||
themes:
|
||||
dark: "暗い"
|
||||
dark: "ダーク"
|
||||
light: "ライト"
|
||||
sync_with_os: "自動(OSのテーマ設定に追従)"
|
||||
types:
|
||||
@@ -1009,15 +1010,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: "ワークパッケージの共有のためのワークフローがありません"
|
||||
@@ -1042,9 +1043,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} を追加"
|
||||
|
||||
@@ -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"
|
||||
@@ -455,7 +455,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"
|
||||
@@ -864,7 +864,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"
|
||||
@@ -1061,7 +1061,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: "子ページへのリンク"
|
||||
@@ -211,10 +211,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: "営業日とみなす曜日を変更すると、このサイト内のすべてのプロジェクトのすべてのワークパッケージの開始日と終了日に影響を与える可能性があります。"
|
||||
@@ -296,14 +296,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}"
|
||||
@@ -316,7 +316,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: "すべてのプロジェクト"
|
||||
@@ -429,7 +429,7 @@ ja:
|
||||
label_repository_plural: "リポジトリ"
|
||||
label_resize_project_menu: "Resize project menu"
|
||||
label_save_as: "名前をつけて保存"
|
||||
label_search_columns: "列を検索"
|
||||
label_search_columns: "列を検索する"
|
||||
label_select_watcher: "ウォッチャーを選択..."
|
||||
label_selected_filter_list: "選択されたフィルタ"
|
||||
label_show_attributes: "すべての属性を表示"
|
||||
@@ -467,8 +467,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: "アップロードした人"
|
||||
@@ -499,7 +499,7 @@ ja:
|
||||
label_version_plural: "バージョン"
|
||||
label_view_has_changed: "このビューには未保存の変更があります。 クリックすると保存します。"
|
||||
help_texts:
|
||||
show_modal: "ヘルプテキストを表示"
|
||||
show_modal: "ヘルプテキストを表示する"
|
||||
onboarding:
|
||||
buttons:
|
||||
skip: "スキップ"
|
||||
@@ -507,7 +507,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> 最後までステップを完了することをお勧めします。ツアーはいつでも再開できます。"
|
||||
@@ -614,33 +614,33 @@ 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: "プロジェクトの設定を削除する"
|
||||
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: "ここにタイトルを入力します"
|
||||
@@ -650,7 +650,7 @@ ja:
|
||||
project:
|
||||
autocompleter:
|
||||
label: "プロジェクト名の入力補完"
|
||||
click_to_switch_to_project: "プロジェクト: %{projectname}"
|
||||
click_to_switch_to_project: "プロジェクト: %{projectname}"
|
||||
context: "プロジェクトのコンテキスト"
|
||||
not_available: "プロジェクトなし"
|
||||
required_outside_context: >
|
||||
@@ -658,30 +658,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: "Создать"
|
||||
|
||||
@@ -104,7 +104,7 @@ vi:
|
||||
button_save: "lưu lại"
|
||||
button_settings: "cài đặt"
|
||||
button_uncheck_all: "Bỏ chọn tất cả"
|
||||
button_update: "cập nhật"
|
||||
button_update: "Cập Nhật"
|
||||
button_export-atom: "Tải xuống nguyên tử"
|
||||
button_generate_pdf: "Tạo PDF"
|
||||
button_create: "Tạo mới"
|
||||
|
||||
@@ -2810,7 +2810,7 @@ ko:
|
||||
new_features_list:
|
||||
line_0: 자동화된 프로젝트 시작(Enterprise 추가 기능).
|
||||
line_1: "미팅: 새 작업 패키지 또는 기존 작업 패키지를 결과로 추가합니다."
|
||||
line_2: "Meetings: show iCal responses in OpenProject."
|
||||
line_2: "미팅: iCal 구독에서 참가자 응답을 표시합니다."
|
||||
line_3: "반복 미팅: 의제 항목을 다음 항목에 복제합니다."
|
||||
line_4: "커뮤니티에 릴리스: 특성이 강조 표시됩니다."
|
||||
line_5: 사용자 제공 콘텐츠에서 외부 링크를 열기 전에 표시되는 경고입니다(Enterprise 추가 기능).
|
||||
|
||||
@@ -2953,7 +2953,7 @@ pl:
|
||||
new_features_list:
|
||||
line_0: Zautomatyzowane inicjowanie projektów (dodatek wersji Enterprise).
|
||||
line_1: "Spotkania: dodawaj nowe lub istniejące pakiety robocze jako wyniki."
|
||||
line_2: "Meetings: show iCal responses in OpenProject."
|
||||
line_2: "Spotkania: pokaż odpowiedzi uczestników w subskrypcjach iCal."
|
||||
line_3: "Spotkania cykliczne: duplikuj punkty planu spotkania w następnym wystąpieniu."
|
||||
line_4: "Udostępnianie społeczności: wyróżnianie atrybutów."
|
||||
line_5: Ostrzeżenie przed otwarciem linków zewnętrznych w treści dostarczonej przez użytkownika (dodatek wersji Enterprise).
|
||||
|
||||
@@ -3263,7 +3263,7 @@ ro:
|
||||
label_duplicated_by: "dublat de"
|
||||
label_duplicate: "duplicat"
|
||||
label_duplicates: "dublează"
|
||||
label_edit: "Editează"
|
||||
label_edit: "Editare"
|
||||
label_edit_attribute: "Edit attribute"
|
||||
label_edit_x: "Editare: %{x}"
|
||||
label_enable_multi_select: "Comutare selecție multiplă"
|
||||
@@ -3321,7 +3321,7 @@ ro:
|
||||
label_global_roles: "Roluri globale"
|
||||
label_git_path: "Calea catre directorul .git"
|
||||
label_greater_or_equal: ">="
|
||||
label_group_by: "Grupează după"
|
||||
label_group_by: "Grupare după"
|
||||
label_group_new: "Grupare nouă"
|
||||
label_group: "Grup"
|
||||
label_group_named: "Grup %{name}"
|
||||
|
||||
@@ -2403,8 +2403,8 @@ sl:
|
||||
- "avgust"
|
||||
- "september"
|
||||
- "oktober"
|
||||
- "november"
|
||||
- "december"
|
||||
- "November"
|
||||
- "December"
|
||||
order:
|
||||
- :leto
|
||||
- :mesec
|
||||
|
||||
@@ -2951,7 +2951,7 @@ uk:
|
||||
new_features_list:
|
||||
line_0: Автоматизований запуск проєктів (надбудова Enterprise).
|
||||
line_1: "Наради: додавайте нові або наявні пакети робіт як підсумки."
|
||||
line_2: "Meetings: show iCal responses in OpenProject."
|
||||
line_2: "Наради: показуйте відповіді учасників у підписках iCal."
|
||||
line_3: "Повторювані наради: копіюйте пункти порядку денного в наступну нараду."
|
||||
line_4: "Випуск Community: виділення атрибутів."
|
||||
line_5: Попередження перед відкриттям зовнішніх посилань у контенті, створеному користувачем (надбудова Enterprise).
|
||||
@@ -3391,7 +3391,7 @@ uk:
|
||||
label_index_by_title: "Індекс за назвою"
|
||||
label_information: "Інформація"
|
||||
label_information_plural: "Інформація"
|
||||
label_installation_guides: "Інструкції із встановлення"
|
||||
label_installation_guides: "Інструкції зі встановлення"
|
||||
label_integer: "Ціле число"
|
||||
label_interface: "Інтерфейс"
|
||||
label_internal: "Власне"
|
||||
|
||||
@@ -2808,7 +2808,7 @@ vi:
|
||||
new_features_list:
|
||||
line_0: Khởi tạo dự án tự động (Phần mở rộng doanh nghiệp).
|
||||
line_1: "Họp: Thêm các gói công việc mới hoặc hiện có làm kết quả."
|
||||
line_2: "Meetings: show iCal responses in OpenProject."
|
||||
line_2: "Họp: Hiển thị phản hồi của người tham gia trong các đăng ký iCal."
|
||||
line_3: "Cuộc họp định kỳ: Sao chép các mục trong chương trình nghị sự sang lần họp tiếp theo."
|
||||
line_4: "Phát hành cho cộng đồng: Tính năng làm nổi bật thuộc tính."
|
||||
line_5: Cảnh báo trước khi mở các liên kết bên ngoài trong nội dung do người dùng cung cấp (Phần mở rộng doanh nghiệp).
|
||||
|
||||
@@ -97,7 +97,7 @@ zh-CN:
|
||||
demo-project:
|
||||
name: 演示项目
|
||||
status_explanation: 所有任务都按计划进行。相关人员均知晓各自任务。系统已完全建立。
|
||||
description: 这是对此演示 Scrum 项目目标的简短摘要。
|
||||
description: 这是对此演示项目目标的简短摘要。
|
||||
news:
|
||||
item_0:
|
||||
title: 欢迎来到您的演示项目
|
||||
@@ -216,7 +216,7 @@ zh-CN:
|
||||
scrum-project:
|
||||
name: Scrum 项目
|
||||
status_explanation: 所有任务都按计划进行。相关人员均知晓各自任务。系统已完全建立。
|
||||
description: 这是对此演示 Scrum 项目目标的简短摘要。
|
||||
description: 这是对此演示Scrum项目目标的简短摘要。
|
||||
news:
|
||||
item_0:
|
||||
title: 欢迎来到您的 Scrum 演示项目
|
||||
|
||||
@@ -87,7 +87,7 @@ zh-CN:
|
||||
token_placeholder: "在此处粘贴您的企业版支持令牌"
|
||||
add_token: "上传企业版支持令牌"
|
||||
replace_token: "替换您当前的支持令牌"
|
||||
order: "订购本地部署版的 Enterprise edition"
|
||||
order: "订购本地部署的 Enterprise edition"
|
||||
paste: "粘贴您企业版的支持令牌"
|
||||
required_for_feature: "此功能仅限具激活的企业版支持令牌的订阅者使用。"
|
||||
enterprise_link: "如需了解详细信息,请单击此处。"
|
||||
@@ -1223,7 +1223,7 @@ zh-CN:
|
||||
page: "页"
|
||||
row_count: "行数"
|
||||
column_count: "列数"
|
||||
widgets: "微件"
|
||||
widgets: "小部件"
|
||||
journal:
|
||||
notes: "备注"
|
||||
cause_type: "Cause 类型"
|
||||
@@ -2806,7 +2806,7 @@ zh-CN:
|
||||
new_features_list:
|
||||
line_0: 自动化项目启动(企业版附加组件)。
|
||||
line_1: "会议:添加新工作包或现有工作包作为成果。"
|
||||
line_2: "Meetings: show iCal responses in OpenProject."
|
||||
line_2: "会议:在 iCal 订阅中显示参加者的回复。"
|
||||
line_3: "定期会议:将议程条目复制到下一事件。"
|
||||
line_4: "发布到社区:特性高亮显示。"
|
||||
line_5: 在打开用户提供内容中的外部链接前发出警告(企业版附加组件)。
|
||||
@@ -3500,7 +3500,7 @@ zh-CN:
|
||||
label_revision_id: "修订版本 %{value}"
|
||||
label_revision_plural: "修订"
|
||||
label_roadmap: "路线图"
|
||||
label_roadmap_edit: "编辑路线图%{name}"
|
||||
label_roadmap_edit: "编辑路线图 %{name}"
|
||||
label_roadmap_due_in: "%{value} 到期"
|
||||
label_roadmap_no_work_packages: "该版本没有工作包。"
|
||||
label_roadmap_overdue: "%{value} 超时"
|
||||
@@ -4221,7 +4221,7 @@ zh-CN:
|
||||
managed: "在 OpenProject 中创建新的存储库"
|
||||
storage:
|
||||
not_available: "磁盘存储开销不可用于此存储库。"
|
||||
update_timeout: "在 N 分钟内保留存储库最后所需的磁盘空间信息。由于计算存储库所需的磁盘空间可能增加系统开销,增加该值可以减少性能影响。"
|
||||
update_timeout: "在 N 分钟内保留存储库最后所需磁盘空间的信息。由于计算存储库所需的磁盘空间可能增加系统开销,增加该值可以减少性能影响。"
|
||||
oauth_application_details: "关闭此窗口后,将无法再次访问客户端密钥值。请将这些值复制到 Nextcloud OpenProject 集成设置中:"
|
||||
oauth_application_details_link_text: "转到设置页面"
|
||||
setup_documentation_details: "如果您在配置新文件存储方面需要帮助,请查看文档:"
|
||||
@@ -4430,7 +4430,7 @@ zh-CN:
|
||||
setting_session_ttl_hint: "当设置的值低于5时,其作用类似于禁用。"
|
||||
setting_session_ttl_enabled: "会话过期"
|
||||
setting_start_of_week: "一周起始日"
|
||||
setting_sys_api_enabled: "启用存储库管理网页服务"
|
||||
setting_sys_api_enabled: "启用版本库管理 web 服务"
|
||||
setting_sys_api_description: "存储库管理网页服务提供了集成的,用户授权的存储库访问。"
|
||||
setting_time_format: "时间"
|
||||
setting_total_percent_complete_mode: "计算 完成% 层次结构总数"
|
||||
@@ -4859,7 +4859,7 @@ zh-CN:
|
||||
warning_user_limit_reached_admin: >
|
||||
添加额外的用户将超出当前限制。请<a href="%{upgrade_url}">升级您的计划</a>,以确保外部用户能够访问此实例。
|
||||
warning_user_limit_reached_instructions: >
|
||||
您已达到用户限制(%{current}/%{max} 活跃用户)。请联系 sales@openproject.com 升级您的企业版计划以添加额外用户。
|
||||
您达到了用户限制(%{current}/%{max}活跃用户)。 请联系sales@openproject.com以升级您的Enterprise edition计划并添加其他用户。
|
||||
warning_protocol_mismatch_html: >
|
||||
|
||||
warning_bar:
|
||||
|
||||
@@ -3203,7 +3203,7 @@ zh-TW:
|
||||
label_filter_add: "新增條件"
|
||||
label_filter_by: "篩選條件:"
|
||||
label_filter_any_name_attribute: "名稱屬性"
|
||||
label_filter_plural: "篩選條件"
|
||||
label_filter_plural: "篩選器"
|
||||
label_filters_toggle: "顯示/隱藏篩選條件"
|
||||
label_float: "浮點數"
|
||||
label_folder: "資料夾"
|
||||
@@ -3218,8 +3218,8 @@ zh-TW:
|
||||
label_global_modules: "全域模組"
|
||||
label_global_roles: "全域角色"
|
||||
label_git_path: ".git 目錄的路徑"
|
||||
label_greater_or_equal: "之前"
|
||||
label_group_by: "分類"
|
||||
label_greater_or_equal: ">="
|
||||
label_group_by: "分組依據"
|
||||
label_group_new: "新增群組"
|
||||
label_group: "群組"
|
||||
label_group_named: "群組名稱 %{name}"
|
||||
@@ -3231,7 +3231,7 @@ zh-TW:
|
||||
label_hierarchy: "階層"
|
||||
label_hierarchy_leaf: "頁面結構頁"
|
||||
label_home: "Home"
|
||||
label_subject_or_id: "名稱或 id"
|
||||
label_subject_or_id: "主旨或 id"
|
||||
label_calendar_subscriptions: "訂閱行事曆"
|
||||
label_identifier: "識別碼"
|
||||
label_in: "在"
|
||||
@@ -3281,7 +3281,7 @@ zh-TW:
|
||||
label_latest_revision_plural: "最新版本"
|
||||
label_ldap_authentication: "LDAP 認證"
|
||||
label_learn_more: "了解更多"
|
||||
label_less_or_equal: "之後"
|
||||
label_less_or_equal: "<="
|
||||
label_less_than_ago: "幾天內"
|
||||
label_link_url: "連結(URL)"
|
||||
label_list: "清單"
|
||||
|
||||
+1
-1
@@ -87,7 +87,7 @@ services:
|
||||
networks:
|
||||
- network
|
||||
environment:
|
||||
__VITE_ADDITIONAL_SERVER_ALLOWED_HOSTS: "openproject-assets.${OPENPROJECT_DOCKER_DEV_TLD}"
|
||||
__VITE_ADDITIONAL_SERVER_ALLOWED_HOSTS: "openproject-assets.${OPENPROJECT_DOCKER_DEV_TLD:-local}"
|
||||
ports:
|
||||
- "${FE_PORT:-4200}:4200"
|
||||
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
OPENPROJECT_DOCKER_DEV_TLD=local
|
||||
@@ -1 +1,2 @@
|
||||
.env
|
||||
docker-compose.override.yml
|
||||
|
||||
@@ -19,10 +19,10 @@ services:
|
||||
networks:
|
||||
- external
|
||||
extra_hosts:
|
||||
- "openproject.${OPENPROJECT_DOCKER_DEV_TLD}:host-gateway"
|
||||
- "openproject.${OPENPROJECT_DOCKER_DEV_TLD:-local}:host-gateway"
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.gitlab.rule=Host(`gitlab.${OPENPROJECT_DOCKER_DEV_TLD}`)"
|
||||
- "traefik.http.routers.gitlab.rule=Host(`gitlab.${OPENPROJECT_DOCKER_DEV_TLD:-local}`)"
|
||||
- "traefik.http.routers.gitlab.entrypoints=websecure"
|
||||
- "traefik.http.services.gitlab.loadbalancer.server.port=80"
|
||||
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
OPENPROJECT_DOCKER_DEV_TLD=local
|
||||
@@ -1 +1,2 @@
|
||||
.env
|
||||
docker-compose.override.yml
|
||||
|
||||
@@ -5,7 +5,7 @@ services:
|
||||
image: openproject/hocuspocus:latest
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.hocuspocus.rule=Host(`hocuspocus.${OPENPROJECT_DOCKER_DEV_TLD}`)"
|
||||
- "traefik.http.routers.hocuspocus.rule=Host(`hocuspocus.${OPENPROJECT_DOCKER_DEV_TLD:-local}`)"
|
||||
- "traefik.http.routers.hocuspocus.service=hocuspocus-service"
|
||||
- "traefik.http.routers.hocuspocus.tls=true"
|
||||
- "traefik.http.services.hocuspocus-service.loadbalancer.server.port=1234"
|
||||
@@ -14,7 +14,7 @@ services:
|
||||
networks:
|
||||
- gateway
|
||||
environment:
|
||||
- ALLOWED_DOMAINS=openproject.${OPENPROJECT_DOCKER_DEV_TLD},localhost
|
||||
- ALLOWED_DOMAINS=openproject.${OPENPROJECT_DOCKER_DEV_TLD:-local},localhost
|
||||
- NODE_TLS_REJECT_UNAUTHORIZED=0
|
||||
- SECRET=secret12345
|
||||
networks:
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
OPENPROJECT_DOCKER_DEV_TLD=local
|
||||
@@ -1 +1,2 @@
|
||||
.env
|
||||
docker-compose.override.yml
|
||||
|
||||
@@ -35,7 +35,7 @@ services:
|
||||
- KEYCLOAK_ADMIN=admin
|
||||
- KEYCLOAK_ADMIN_PASSWORD=admin
|
||||
- KC_DB_SCHEMA=public
|
||||
- KC_HOSTNAME=keycloak.${OPENPROJECT_DOCKER_DEV_TLD}
|
||||
- KC_HOSTNAME=keycloak.${OPENPROJECT_DOCKER_DEV_TLD:-local}
|
||||
- KC_TRANSACTION_XA_ENABLED=false
|
||||
volumes:
|
||||
- /etc/ssl/certs/ca-certificates.crt:/etc/ssl/certs/ca-certificates.crt:ro
|
||||
@@ -43,7 +43,7 @@ services:
|
||||
- ./themes/:/opt/keycloak/themes/
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.keycloak-sub-secure.rule=Host(`keycloak.${OPENPROJECT_DOCKER_DEV_TLD}`)"
|
||||
- "traefik.http.routers.keycloak-sub-secure.rule=Host(`keycloak.${OPENPROJECT_DOCKER_DEV_TLD:-local}`)"
|
||||
- "traefik.http.routers.keycloak-sub-secure.entrypoints=websecure"
|
||||
depends_on:
|
||||
- db-keycloak
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
OPENPROJECT_DOCKER_DEV_TLD=local
|
||||
@@ -1 +1,2 @@
|
||||
.env
|
||||
docker-compose.override.yml
|
||||
|
||||
@@ -19,13 +19,13 @@ services:
|
||||
- "traefik.enable=true"
|
||||
# MinIO API
|
||||
- "traefik.http.routers.minio.entrypoints=websecure"
|
||||
- "traefik.http.routers.minio.rule=Host(`minio.${OPENPROJECT_DOCKER_DEV_TLD}`)"
|
||||
- "traefik.http.routers.minio.rule=Host(`minio.${OPENPROJECT_DOCKER_DEV_TLD:-local}`)"
|
||||
- "traefik.http.routers.minio.service=minio"
|
||||
- "traefik.http.routers.minio.tls.certresolver=step"
|
||||
- "traefik.http.services.minio.loadbalancer.server.port=9000"
|
||||
# MinIO Admin Console (Management UI)
|
||||
- "traefik.http.routers.minioadmin.entrypoints=websecure"
|
||||
- "traefik.http.routers.minioadmin.rule=Host(`minioadmin.${OPENPROJECT_DOCKER_DEV_TLD}`)"
|
||||
- "traefik.http.routers.minioadmin.rule=Host(`minioadmin.${OPENPROJECT_DOCKER_DEV_TLD:-local}`)"
|
||||
- "traefik.http.routers.minioadmin.service=minioadmin"
|
||||
- "traefik.http.routers.minioadmin.tls.certresolver=step"
|
||||
- "traefik.http.services.minioadmin.loadbalancer.server.port=9001"
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
OPENPROJECT_DOCKER_DEV_TLD=local
|
||||
@@ -1 +1,2 @@
|
||||
.env
|
||||
docker-compose.override.yml
|
||||
|
||||
@@ -11,7 +11,7 @@ services:
|
||||
# - ../nextcloud_apps:/var/www/html/custom_apps
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.nextcloud.rule=Host(`nextcloud.${OPENPROJECT_DOCKER_DEV_TLD}`)"
|
||||
- "traefik.http.routers.nextcloud.rule=Host(`nextcloud.${OPENPROJECT_DOCKER_DEV_TLD:-local}`)"
|
||||
- "traefik.http.routers.nextcloud.entrypoints=websecure"
|
||||
|
||||
cron:
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
OPENPROJECT_DOCKER_DEV_TLD=local
|
||||
@@ -1,3 +1,3 @@
|
||||
.env
|
||||
acme.json
|
||||
|
||||
docker-compose.override.yml
|
||||
|
||||
@@ -6,30 +6,30 @@ x-op-env-override: &environment
|
||||
SSL_CERT_FILE: /etc/ssl/certs/ca-certificates.crt
|
||||
# uncomment and set all the envs below to integrate keycloak with OpenProject
|
||||
# OPENPROJECT_OPENID__CONNECT_KEYCLOAK_DISPLAY__NAME: Keycloak
|
||||
# OPENPROJECT_OPENID__CONNECT_KEYCLOAK_HOST: keycloak.${OPENPROJECT_DOCKER_DEV_TLD}
|
||||
# OPENPROJECT_OPENID__CONNECT_KEYCLOAK_IDENTIFIER: https://openproject.${OPENPROJECT_DOCKER_DEV_TLD}
|
||||
# OPENPROJECT_OPENID__CONNECT_KEYCLOAK_HOST: keycloak.${OPENPROJECT_DOCKER_DEV_TLD:-local}
|
||||
# OPENPROJECT_OPENID__CONNECT_KEYCLOAK_IDENTIFIER: https://openproject.${OPENPROJECT_DOCKER_DEV_TLD:-local}
|
||||
# OPENPROJECT_OPENID__CONNECT_KEYCLOAK_SECRET: <The client secret you copied from keycloak>
|
||||
# OPENPROJECT_OPENID__CONNECT_KEYCLOAK_ISSUER: https://keycloak.${OPENPROJECT_DOCKER_DEV_TLD}/realms/<REALM>
|
||||
# OPENPROJECT_OPENID__CONNECT_KEYCLOAK_ISSUER: https://keycloak.${OPENPROJECT_DOCKER_DEV_TLD:-local}/realms/<REALM>
|
||||
# OPENPROJECT_OPENID__CONNECT_KEYCLOAK_AUTHORIZATION__ENDPOINT: /realms/<REALM>/protocol/openid-connect/auth
|
||||
# OPENPROJECT_OPENID__CONNECT_KEYCLOAK_TOKEN__ENDPOINT: /realms/<REALM>/protocol/openid-connect/token
|
||||
# OPENPROJECT_OPENID__CONNECT_KEYCLOAK_USERINFO__ENDPOINT: /realms/<REALM>/protocol/openid-connect/userinfo
|
||||
# OPENPROJECT_OPENID__CONNECT_KEYCLOAK_END__SESSION__ENDPOINT: https://keycloak.${OPENPROJECT_DOCKER_DEV_TLD}/realms/<REALM>/protocol/openid-connect/logout
|
||||
# OPENPROJECT_OPENID__CONNECT_KEYCLOAK_END__SESSION__ENDPOINT: https://keycloak.${OPENPROJECT_DOCKER_DEV_TLD:-local}/realms/<REALM>/protocol/openid-connect/logout
|
||||
# uncomment the following for using minio (local S3) as file storage with TLS support:
|
||||
# OPENPROJECT_ATTACHMENTS__STORAGE: "fog"
|
||||
# OPENPROJECT_FOG_DIRECTORY: "openproject-uploads"
|
||||
# OPENPROJECT_FOG_CREDENTIALS_PROVIDER: "AWS" # Minio is S3 compliant, so we can use the AWS provider
|
||||
# OPENPROJECT_FOG_CREDENTIALS_ENDPOINT: "https://minio.${OPENPROJECT_DOCKER_DEV_TLD}"
|
||||
# OPENPROJECT_FOG_CREDENTIALS_ENDPOINT: "https://minio.${OPENPROJECT_DOCKER_DEV_TLD:-local}"
|
||||
# OPENPROJECT_FOG_CREDENTIALS_AWS__ACCESS__KEY__ID: "minioadmin"
|
||||
# OPENPROJECT_FOG_CREDENTIALS_AWS__SECRET__ACCESS__KEY: "minioadmin"
|
||||
# OPENPROJECT_FOG_CREDENTIALS_PATH__STYLE: "true"
|
||||
# OPENPROJECT_FOG_CREDENTIALS_REGION: "us-east-1"
|
||||
# OPENPROJECT_DEV_EXTRA_HOSTS: "${OPENPROJECT_DEV_HOST},minio.${OPENPROJECT_DOCKER_DEV_TLD}"
|
||||
# OPENPROJECT_DEV_EXTRA_HOSTS: "${OPENPROJECT_DEV_HOST},minio.${OPENPROJECT_DOCKER_DEV_TLD:-local}"
|
||||
|
||||
services:
|
||||
backend:
|
||||
environment:
|
||||
<<: *environment
|
||||
OPENPROJECT_CLI_PROXY: "https://openproject-assets.${OPENPROJECT_DOCKER_DEV_TLD}"
|
||||
OPENPROJECT_CLI_PROXY: "https://openproject-assets.${OPENPROJECT_DOCKER_DEV_TLD:-local}"
|
||||
networks:
|
||||
- external
|
||||
volumes:
|
||||
@@ -42,7 +42,7 @@ services:
|
||||
# - ~/.step/certs:/usr/local/share/ca-certificates
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.openproject.rule=Host(`openproject.${OPENPROJECT_DOCKER_DEV_TLD}`)"
|
||||
- "traefik.http.routers.openproject.rule=Host(`openproject.${OPENPROJECT_DOCKER_DEV_TLD:-local}`)"
|
||||
- "traefik.http.routers.openproject.entrypoints=websecure"
|
||||
|
||||
worker:
|
||||
@@ -77,7 +77,7 @@ services:
|
||||
- external
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.openproject-assets.rule=Host(`openproject-assets.${OPENPROJECT_DOCKER_DEV_TLD}`)"
|
||||
- "traefik.http.routers.openproject-assets.rule=Host(`openproject-assets.${OPENPROJECT_DOCKER_DEV_TLD:-local}`)"
|
||||
- "traefik.http.routers.openproject-assets.entrypoints=websecure"
|
||||
|
||||
# You need to define the same external network
|
||||
|
||||
@@ -13,17 +13,17 @@ services:
|
||||
networks:
|
||||
external:
|
||||
aliases:
|
||||
- traefik.${OPENPROJECT_DOCKER_DEV_TLD}
|
||||
- openproject.${OPENPROJECT_DOCKER_DEV_TLD}
|
||||
- openproject-assets.${OPENPROJECT_DOCKER_DEV_TLD}
|
||||
- nextcloud.${OPENPROJECT_DOCKER_DEV_TLD}
|
||||
- gitlab.${OPENPROJECT_DOCKER_DEV_TLD}
|
||||
- keycloak.${OPENPROJECT_DOCKER_DEV_TLD}
|
||||
- hocuspocus.${OPENPROJECT_DOCKER_DEV_TLD}
|
||||
- minio.${OPENPROJECT_DOCKER_DEV_TLD}
|
||||
- minioadmin.${OPENPROJECT_DOCKER_DEV_TLD}
|
||||
- traefik.${OPENPROJECT_DOCKER_DEV_TLD:-local}
|
||||
- openproject.${OPENPROJECT_DOCKER_DEV_TLD:-local}
|
||||
- openproject-assets.${OPENPROJECT_DOCKER_DEV_TLD:-local}
|
||||
- nextcloud.${OPENPROJECT_DOCKER_DEV_TLD:-local}
|
||||
- gitlab.${OPENPROJECT_DOCKER_DEV_TLD:-local}
|
||||
- keycloak.${OPENPROJECT_DOCKER_DEV_TLD:-local}
|
||||
- hocuspocus.${OPENPROJECT_DOCKER_DEV_TLD:-local}
|
||||
- minio.${OPENPROJECT_DOCKER_DEV_TLD:-local}
|
||||
- minioadmin.${OPENPROJECT_DOCKER_DEV_TLD:-local}
|
||||
labels:
|
||||
- "traefik.http.routers.traefik.rule=Host(`traefik.${OPENPROJECT_DOCKER_DEV_TLD}`)"
|
||||
- "traefik.http.routers.traefik.rule=Host(`traefik.${OPENPROJECT_DOCKER_DEV_TLD:-local}`)"
|
||||
- "traefik.http.routers.traefik.service=api@internal"
|
||||
- "traefik.http.routers.traefik.entrypoints=websecure"
|
||||
|
||||
|
||||
@@ -49,7 +49,15 @@ info:
|
||||
|
||||
## Authentication
|
||||
|
||||
The API supports the following authentication schemes: OAuth2, session based authentication, and basic auth.
|
||||
The API supports the following authentication schemes:
|
||||
|
||||
* Session-based authentication
|
||||
* API tokens
|
||||
* passed as Bearer token
|
||||
* passed via Basic auth
|
||||
* OAuth 2.0
|
||||
* using built-in authorization server
|
||||
* using an external authorization server (RFC 9068)
|
||||
|
||||
Depending on the settings of the OpenProject instance many resources can be accessed without being authenticated.
|
||||
In case the instance requires authentication on all requests the client will receive an **HTTP 401** status code
|
||||
@@ -57,26 +65,38 @@ info:
|
||||
|
||||
Otherwise unauthenticated clients have all the permissions of the anonymous user.
|
||||
|
||||
### Session-based Authentication
|
||||
### Session-based authentication
|
||||
|
||||
This means you have to login to OpenProject via the Web-Interface to be authenticated in the API.
|
||||
This method is well-suited for clients acting within the browser, like the Angular-Client built into OpenProject.
|
||||
|
||||
In this case, you always need to pass the HTTP header `X-Requested-With "XMLHttpRequest"` for authentication.
|
||||
|
||||
### API Key through Basic Auth
|
||||
### API token as bearer token
|
||||
|
||||
Users can authenticate towards the API v3 using basic auth with the user name `apikey` (NOT your login) and the API key as the password.
|
||||
Users can find their API key on their account page.
|
||||
Users can authenticate towards the API v3 using an API token as a bearer token.
|
||||
|
||||
Example:
|
||||
For example:
|
||||
|
||||
```shell
|
||||
API_KEY=2519132cdf62dcf5a66fd96394672079f9e9cad1
|
||||
API_KEY=opapi-2519132cdf62dcf5a66fd96394672079f9e9cad1
|
||||
curl -H "Authorization: Bearer $API_KEY" https://community.openproject.org/api/v3/users/42
|
||||
```
|
||||
|
||||
Users can generate API tokens on their account page.
|
||||
|
||||
### API token through Basic Auth
|
||||
|
||||
API tokens can also be used with basic auth, using the user name `apikey` (NOT your login) and the API token as the password.
|
||||
|
||||
For example:
|
||||
|
||||
```shell
|
||||
API_KEY=opapi-2519132cdf62dcf5a66fd96394672079f9e9cad1
|
||||
curl -u apikey:$API_KEY https://community.openproject.org/api/v3/users/42
|
||||
```
|
||||
|
||||
### OAuth2.0 authentication
|
||||
### OAuth 2.0 authentication
|
||||
|
||||
OpenProject allows authentication and authorization with OAuth2 with *Authorization code flow*, as well as *Client credentials* operation modes.
|
||||
|
||||
@@ -91,7 +111,7 @@ info:
|
||||
|
||||
- [Client credentials](https://oauth.net/2/grant-types/client-credentials/) - Requires an application to be bound to an impersonating user for non-public access
|
||||
|
||||
### OIDC provider generated JWT as a Bearer token
|
||||
### OAuth 2.0 using an external authorization server
|
||||
|
||||
There is a possibility to use JSON Web Tokens (JWT) generated by an OIDC provider configured in OpenProject as a bearer token to do authenticated requests against the API.
|
||||
The following requirements must be met:
|
||||
@@ -103,7 +123,7 @@ info:
|
||||
- JWT **scope** claim must include a valid scope to access the desired API (e.g. `api_v3` for APIv3)
|
||||
- JWT must be actual (neither expired or too early to be used)
|
||||
- JWT must be passed in Authorization header like: `Authorization: Bearer {jwt}`
|
||||
- User from **sub** claim must be logged in OpenProject before otherwise it will be not authenticated
|
||||
- User from **sub** claim must be linked to OpenProject before (e.g. by logging in), otherwise it will be not authenticated
|
||||
|
||||
In more general terms, OpenProject should be compliant to [RFC 9068](https://www.rfc-editor.org/rfc/rfc9068) when validating access tokens.
|
||||
|
||||
|
||||
@@ -452,13 +452,14 @@ to have Nextcloud running to test the Nextcloud-OpenProject integration. To do t
|
||||
|
||||
### Alternative: Using Let's encrypt
|
||||
|
||||
An alternative approach is to issue certificates through Let's encrypt. This allows you to skip steps related to usage and setup
|
||||
of a custom, non-trusted CA. However, it requires that you have access to a domain name that you control and requires additional
|
||||
step to make the reverse proxy publicly reachable, which is not in scope of what this documentation can cover.
|
||||
An alternative approach is to issue certificates through Let's encrypt. This allows you to skip steps related to usage
|
||||
and setup of a custom, non-trusted CA. However, it requires that you have access to a domain name that you control and
|
||||
requires an additional step to make the reverse proxy publicly reachable, which is not in the scope of what this
|
||||
documentation can cover.
|
||||
|
||||
If you need such a setup, you can change the `docker-compose.override.yml` for the reverse proxy, to use `letsencrypt` (see the
|
||||
corresponding `docker-compose.override.example.yml`). Make sure to export an environment variable with your alternative DNS zone
|
||||
before starting anything via docker compose. For example:
|
||||
If you need such a setup, you can change the `docker-compose.override.yml` for the reverse proxy, to use `letsencrypt`
|
||||
(see the corresponding `docker-compose.override.example.yml`). Make sure to export an environment variable, or define
|
||||
it in the `.env` files, with your alternative DNS zone before starting anything via docker compose. For example:
|
||||
|
||||
```bash
|
||||
export OPENPROJECT_DOCKER_DEV_TLD=dev.example.com
|
||||
|
||||
@@ -34,7 +34,7 @@ OpenProject currently requires some bundled extensions, that should be available
|
||||
- [btree_gist: GiST operator classes with B-tree behavior](https://www.postgresql.org/docs/current/btree-gist.html)
|
||||
- [unaccent: a text search dictionary which removes diacritics](https://www.postgresql.org/docs/current/unaccent.html)
|
||||
|
||||
Additionally, OpenProject will try to create a [custom collation](https://www.postgresql.org/docs/current/collation.html) for version sorting that depends on `und-u-kn-true` ICU collation.
|
||||
Additionally, OpenProject will try to create a [custom collation](https://www.postgresql.org/docs/current/collation.html) for version sorting that depends on `und-u-kn-true` ICU collation.
|
||||
|
||||
|
||||
## Scaling requirements
|
||||
@@ -214,6 +214,7 @@ OpenProject supports the latest versions of the major browsers.
|
||||
|
||||
* [Nextcloud 30](https://nextcloud.com/changelog/#latest30)
|
||||
* [Nextcloud 31](https://nextcloud.com/changelog/#latest31)
|
||||
* [Nextcloud 32](https://nextcloud.com/changelog/#latest32)
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
@@ -228,13 +229,13 @@ OpenProject supports the latest versions of the major browsers.
|
||||
|
||||
##### OpenProject integration
|
||||
|
||||
* [OpenProject Integration 2.10.0](https://github.com/nextcloud/integration_openproject/releases/tag/v2.10.0)
|
||||
* [OpenProject Integration 2.11.1](https://github.com/nextcloud/integration_openproject/releases/tag/v2.11.1)
|
||||
|
||||
##### Team folders
|
||||
|
||||
If you want to use the feature of [automatically managed project folders](../../system-admin-guide/integrations/nextcloud/#4-automatically-managed-project-folders) you need to install the [Team folders](https://apps.nextcloud.com/apps/groupfolders) app in Nextcloud (formerly Group folders).
|
||||
|
||||
* [Team folders 19.1.7](https://github.com/nextcloud/groupfolders/releases/tag/v19.1.7)
|
||||
* [Team folders 19.1.14](https://github.com/nextcloud/groupfolders/releases/tag/v19.1.14)
|
||||
|
||||
### Keycloak token exchange
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ release_date: 2024-08-14
|
||||
|
||||
Release date: 2024-08-14
|
||||
|
||||
We released [OpenProject 14.4.0](https://community.openproject.org/versions/2063). The release contains several bug fixes and we recommend updating to the newest version.
|
||||
We released [OpenProject 14.4.0](https://community.openproject.org/versions/2063). The release contains several bug fixes and we recommend updating to the newest version.
|
||||
|
||||
In these Release Notes, we will give an overview of important technical updates as well as important feature changes. At the end, you will find a complete list of all changes and bug fixes.
|
||||
|
||||
@@ -22,7 +22,7 @@ OpenProject 14.4 introduces a new feature that allows OpenID clients, such as Ne
|
||||
|
||||
With this feature, the OpenProject API will validate access tokens issued by the OpenID provider (Keycloak) by checking the token's signature and authenticating the user using the sub claim value. This integration ensures secure and efficient API authentication for OpenID clients.
|
||||
|
||||
For more details, take a look at our [API documentation](../../../api/introduction/#oidc-provider-generated-jwt-as-a-bearer-token).
|
||||
For more details, take a look at our [API documentation](../../../api/introduction/#oauth-20-using-an-external-authorization-server).
|
||||
|
||||
### Improve error messages and logs of automatically managed project folders synchronization services/jobs
|
||||
|
||||
@@ -38,7 +38,7 @@ For more details, see this [work package](https://community.openproject.org/wp/5
|
||||
|
||||
### Personal settings: Dark mode
|
||||
|
||||
Dark mode for OpenProject is finally here! In the '[My account](../../../user-guide/account-settings/#look-and-feel)' section under 'Interface', there is an **option labeled 'Mode' where users can now select 'Dark (Beta).'** – as an alternative to the light mode. When the dark mode is selected, the change applies only to that user, not to the entire instance.
|
||||
Dark mode for OpenProject is finally here! In the '[My account](../../../user-guide/account-settings/#look-and-feel)' section under 'Interface', there is an **option labeled 'Mode' where users can now select 'Dark (Beta).'** – as an alternative to the light mode. When the dark mode is selected, the change applies only to that user, not to the entire instance.
|
||||
|
||||

|
||||
|
||||
@@ -222,12 +222,12 @@ Clicking on the "Details" link will take the user to the diff view, which is als
|
||||
|
||||
## Contributions
|
||||
|
||||
A very special thank you goes to the City of Cologne again for sponsoring features on project attributes and project lists.
|
||||
A very special thank you goes to the City of Cologne again for sponsoring features on project attributes and project lists.
|
||||
|
||||
Also a big thanks to our Community members for reporting bugs and helping us identify and provide fixes.
|
||||
Special thanks for reporting and finding bugs go to Johan Bouduin, Sven Kunze and Marcel Carvalho.
|
||||
|
||||
Last but not least, we are very grateful for our very engaged translation contributors on Crowdin, who translated quite a few OpenProject strings! This release we would like to highlight the three following users:
|
||||
Last but not least, we are very grateful for our very engaged translation contributors on Crowdin, who translated quite a few OpenProject strings! This release we would like to highlight the three following users:
|
||||
|
||||
- [Jeff Li](https://crowdin.com/profile/jeff_li) for translations to Chinese Simplified,
|
||||
- [Adam Siemienski](https://crowdin.com/profile/siemienas) for translations to Polish,
|
||||
|
||||
@@ -80,11 +80,78 @@ From a technical perspective, real-time collaboration relies on a running [Hocus
|
||||
|
||||
### Enable real-time collaboration for packaged installations
|
||||
|
||||
To enable real-time collaboration in packaged installations, follow these steps:
|
||||
1. Download and install [op-blocknote-hocuspocus](https://github.com/opf/op-blocknote-hocuspocus)
|
||||
2. Set up the server by following the instructions in the GitHub repository
|
||||
3. Manually configure the server URL & secret in the *Documents* administration settings in OpenProject.
|
||||
> [!NOTE]
|
||||
#### 1. Install hocuspocus
|
||||
|
||||
The easiest way to install hocuspocus is by using the Docker container.
|
||||
You can do so by using the following steps.
|
||||
|
||||
Create a hocuspocus directory:
|
||||
|
||||
```shell
|
||||
mkdir hocuspocus
|
||||
cd hocuspocus
|
||||
```
|
||||
Then you can create a `docker-compose.yml` file with the following content inside the `hocuspocus` directory:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
hocuspocus:
|
||||
image: <hocuspocus_image>
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
SECRET: "secret123"
|
||||
ports:
|
||||
- "127.0.0.1:1234:1234"
|
||||
```
|
||||
Replace the `<hocuspocus_image>` with the image from [here](https://github.com/opf/openproject-docker-compose/blob/stable/17/docker-compose.yml#L122).
|
||||
|
||||
Run hocuspocus:
|
||||
|
||||
```shell
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
#### 2. Configure Apache
|
||||
|
||||
> [!NOTE]
|
||||
> This part of the docs assumes that you are using the generated Apache config by the OpenProject wizard
|
||||
|
||||
Create `/etc/openproject/addons/apache2/custom/vhost/hocuspocus.conf` with the following content:
|
||||
|
||||
```apache
|
||||
ProxyPass /hocuspocus ws://127.0.0.1:1234/hocuspocus
|
||||
ProxyPassReverse /hocuspocus ws://127.0.0.1:1234/hocuspocus
|
||||
```
|
||||
**For Debian/Ubuntu-based systems, run the following commands:**
|
||||
|
||||
Enable the `proxy_wstunnel` module:
|
||||
|
||||
```shell
|
||||
sudo a2enmod proxy_wstunnel
|
||||
```
|
||||
|
||||
Restart Apache:
|
||||
|
||||
```shell
|
||||
sudo service apache2 restart
|
||||
```
|
||||
|
||||
**For RHEL/CentOS-based systems, run the following command:**
|
||||
|
||||
```shell
|
||||
sudo service httpd restart
|
||||
```
|
||||
|
||||
#### 3. Enable real-time collaboration
|
||||
|
||||
Manually configure the server URL & secret in the *Documents* administration settings in OpenProject.
|
||||
Here you need to provide the URL in the following format: `wss://<your_op_hostname>/hocuspocus`.
|
||||
If you are using HTTP in your instance, the protocol has to be `ws://` instead of `wss://`.
|
||||
|
||||
> [!NOTE]
|
||||
> The secret must be identical in both op-blocknote-hocuspocus and OpenProject.
|
||||
|
||||
For more background on this feature, see [this blog article](https://www.openproject.org/blog/real-time-collaboration-in-documents/) on the introduction of real-time collaboration in documents.
|
||||
|
||||

|
||||
|
||||
For more background on this feature, see [this blog article](https://www.openproject.org/blog/real-time-collaboration-in-documents/) on the introduction of real-time collaboration in documents.
|
||||
|
||||
BIN
Binary file not shown.
|
After Width: | Height: | Size: 36 KiB |
Generated
+390
-485
File diff suppressed because it is too large
Load Diff
+18
-18
@@ -6,18 +6,18 @@
|
||||
"private": true,
|
||||
"devDependencies": {
|
||||
"@angular-builders/custom-esbuild": "^21.0.3",
|
||||
"@angular-devkit/build-angular": "^21.1.1",
|
||||
"@angular-devkit/build-angular": "^21.1.2",
|
||||
"@angular-eslint/builder": "20.7.0",
|
||||
"@angular-eslint/eslint-plugin": "20.7.0",
|
||||
"@angular-eslint/eslint-plugin-template": "20.7.0",
|
||||
"@angular-eslint/schematics": "20.7.0",
|
||||
"@angular-eslint/template-parser": "20.7.0",
|
||||
"@angular/language-service": "21.1.1",
|
||||
"@angular/language-service": "21.1.2",
|
||||
"@eslint/js": "^9.39.2",
|
||||
"@html-eslint/eslint-plugin": "^0.54.0",
|
||||
"@html-eslint/parser": "^0.54.0",
|
||||
"@jsdevtools/coverage-istanbul-loader": "3.0.5",
|
||||
"@stylistic/eslint-plugin": "^5.6.1",
|
||||
"@stylistic/eslint-plugin": "^5.7.1",
|
||||
"@types/codemirror": "5.60.5",
|
||||
"@types/dom-navigation": "^1.0.3",
|
||||
"@types/dragula": "^3.7.5",
|
||||
@@ -38,7 +38,7 @@
|
||||
"@types/uuid": "^11.0.0",
|
||||
"@types/webpack-env": "^1.16.0",
|
||||
"@typescript-eslint/eslint-plugin": "8.53.0",
|
||||
"@typescript-eslint/parser": "8.52.0",
|
||||
"@typescript-eslint/parser": "8.53.1",
|
||||
"angular-eslint": "^21.1.0",
|
||||
"browserslist": "^4.28.1",
|
||||
"eslint": "^9.39.2",
|
||||
@@ -64,18 +64,18 @@
|
||||
"wscat": "^6.1.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"@angular/animations": "^21.1.1",
|
||||
"@angular/cdk": "^21.1.1",
|
||||
"@angular/cli": "^21.1.1",
|
||||
"@angular/common": "^21.1.1",
|
||||
"@angular/compiler": "^21.1.1",
|
||||
"@angular/compiler-cli": "^21.1.1",
|
||||
"@angular/core": "^21.1.1",
|
||||
"@angular/elements": "^21.1.1",
|
||||
"@angular/forms": "^21.1.1",
|
||||
"@angular/platform-browser": "^21.1.1",
|
||||
"@angular/platform-browser-dynamic": "^21.1.1",
|
||||
"@angular/router": "^21.1.1",
|
||||
"@angular/animations": "^21.1.2",
|
||||
"@angular/cdk": "^21.1.2",
|
||||
"@angular/cli": "^21.1.2",
|
||||
"@angular/common": "^21.1.2",
|
||||
"@angular/compiler": "^21.1.2",
|
||||
"@angular/compiler-cli": "^21.1.2",
|
||||
"@angular/core": "^21.1.2",
|
||||
"@angular/elements": "^21.1.2",
|
||||
"@angular/forms": "^21.1.2",
|
||||
"@angular/platform-browser": "^21.1.2",
|
||||
"@angular/platform-browser-dynamic": "^21.1.2",
|
||||
"@angular/router": "^21.1.2",
|
||||
"@appsignal/javascript": "^1.6.1",
|
||||
"@appsignal/plugin-breadcrumbs-console": "^1.1.37",
|
||||
"@appsignal/plugin-breadcrumbs-network": "^1.1.24",
|
||||
@@ -104,7 +104,7 @@
|
||||
"@hotwired/turbo-rails": "^8.0.20",
|
||||
"@knowledgecode/delegate": "^0.10.0",
|
||||
"@kolkov/ngx-gallery": "^2.0.1",
|
||||
"@mantine/core": "^8.3.10",
|
||||
"@mantine/core": "^8.3.13",
|
||||
"@mantine/hooks": "^8.3.6",
|
||||
"@mantine/utils": "^6.0.22",
|
||||
"@ng-select/ng-option-highlight": "^20.6.3",
|
||||
@@ -133,7 +133,7 @@
|
||||
"chartjs-plugin-datalabels": "^2.2.0",
|
||||
"codemirror": "^5.62.0",
|
||||
"copy-text-to-clipboard": "^3.2.2",
|
||||
"core-js": "^3.47.0",
|
||||
"core-js": "^3.48.0",
|
||||
"crossvent": "^1.5.4",
|
||||
"dom-autoscroller": "^2.2.8",
|
||||
"dom-plane": "^1.0.2",
|
||||
|
||||
@@ -32,7 +32,7 @@ require "open3"
|
||||
module OpenProject
|
||||
module VERSION # :nodoc:
|
||||
MAJOR = 17
|
||||
MINOR = 1
|
||||
MINOR = 2
|
||||
PATCH = 0
|
||||
|
||||
class << self
|
||||
|
||||
@@ -0,0 +1,83 @@
|
||||
# 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 OpenProject
|
||||
module Authentication
|
||||
module Strategies
|
||||
module Warden
|
||||
##
|
||||
# Allows users to authenticate using their API key as a Bearer token.
|
||||
# Note that in order for a user to be able to generate one
|
||||
# `Setting.rest_api_enabled` has to be `1`.
|
||||
class UserAPIToken < ::Warden::Strategies::Base
|
||||
include FailWithHeader
|
||||
|
||||
def valid?
|
||||
return false unless Setting.rest_api_enabled?
|
||||
|
||||
@access_token = ::Doorkeeper::OAuth::Token.from_bearer_authorization(
|
||||
::Doorkeeper::Grape::AuthorizationDecorator.new(request)
|
||||
)
|
||||
return false if @access_token.blank?
|
||||
|
||||
@access_token.start_with?(::Token::API.prefix)
|
||||
end
|
||||
|
||||
def authenticate!
|
||||
token = ::Token::API.find_by_plaintext_value(@access_token) # rubocop:disable Rails/DynamicFindBy
|
||||
return fail_with_header!(error: "invalid_token") if token.nil?
|
||||
|
||||
authentication_result(token.user)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def authentication_result(user)
|
||||
if user.nil?
|
||||
return fail_with_header!(
|
||||
error: "invalid_token",
|
||||
error_description: "The user identified by the token is not known"
|
||||
)
|
||||
end
|
||||
|
||||
if user.active?
|
||||
success!(user)
|
||||
else
|
||||
fail_with_header!(
|
||||
error: "invalid_token",
|
||||
error_description: "The user account is locked"
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -28,7 +28,7 @@ ro:
|
||||
work_package:
|
||||
position: "Poziție"
|
||||
story_points: "Puncte"
|
||||
backlogs_work_package_type: "Tipul de restante"
|
||||
backlogs_work_package_type: "Tip restanță"
|
||||
errors:
|
||||
models:
|
||||
work_package:
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
#++
|
||||
zh-TW:
|
||||
plugin_openproject_backlogs:
|
||||
name: "OpenProject待辦事項"
|
||||
name: "OpenProject代辦事項"
|
||||
description: "此模組新增了讓敏捷團隊能夠在 Scrum 專案中使用 OpenProject 的功能。"
|
||||
activerecord:
|
||||
attributes:
|
||||
|
||||
@@ -59,7 +59,7 @@ fr:
|
||||
perform_description: "Voulez-vous importer ou mettre à jour les problèmes repris ci-dessus ?"
|
||||
replace_with_system_user: 'Les remplacer par l''utilisateur "Système"'
|
||||
import_as_system_user: 'Les importer comme utilisateur "Système".'
|
||||
what_to_do: "Que voulez-vous faire ?"
|
||||
what_to_do: "Que voulez-vous faire?"
|
||||
work_package_has_newer_changes: "Obsolète ! Ce sujet n'a pas été mis à jour, car les derniers changements sur le serveur étaient plus récents que la \"ModifiedDate\" du sujet importé. Toutefois, les commentaires sur le sujet ont été importés."
|
||||
bcf_file_not_found: "Impossible de localiser le fichier BCF. Veuillez recommencer le processus de téléversement."
|
||||
export:
|
||||
|
||||
@@ -27,7 +27,7 @@ cs:
|
||||
budget:
|
||||
author: "Autor"
|
||||
available: "Dostupné"
|
||||
budget: "Plánované"
|
||||
budget: "Rozpočet"
|
||||
budget_ratio: "Stráveno (poměr)"
|
||||
description: "Popis"
|
||||
spent: "Strávený čas"
|
||||
|
||||
@@ -205,7 +205,7 @@ ja:
|
||||
setting_enforce_tracking_start_and_end_times: "開始/終了時間を必須とする"
|
||||
setting_enforce_without_allow: "開始時間と終了時間を要求することは許可されていないとできません"
|
||||
setting_allow_tracking_start_and_end_times_caption: "時間を記録する際に、開始時間と終了時間を入力できるようにする。"
|
||||
setting_enforce_tracking_start_and_end_times_caption: "時間を記録する際、開始時間と終了時間の入力を必須にします。"
|
||||
setting_enforce_tracking_start_and_end_times_caption: "時間を記録する際、開始時間と終了時間の入力が必須となる。"
|
||||
text_assign_time_and_cost_entries_to_project: "報告された時間とコストをプロジェクトに割り当てる"
|
||||
text_destroy_cost_entries_question: "削除しようとしているワークパッケージが%{cost_entries} 件報告されました。どうしますか?"
|
||||
text_destroy_time_and_cost_entries: "報告された時間とコストを削除する"
|
||||
|
||||
@@ -60,17 +60,23 @@ rw:
|
||||
merge_request_reopened_comment: >
|
||||
**MR Reopened:** Merge request %{mr_number} [%{mr_title}](%{mr_url}) for [%{repository}](%{repository_url}) has been reopened by [%{gitlab_user}](%{gitlab_user_url}).
|
||||
note_commit_referenced_comment: >
|
||||
**Referenced in Commit:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in a Commit Note [%{commit_id}](%{commit_url}) on [%{repository}](%{repository_url}): %{commit_note}
|
||||
**Referenced in Commit:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in a Commit Note [%{commit_id}](%{commit_url}) on [%{repository}](%{repository_url}):
|
||||
%{commit_note}
|
||||
note_mr_referenced_comment: >
|
||||
**Referenced in MR:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) on [%{repository}](%{repository_url}): %{mr_note}
|
||||
**Referenced in MR:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) on [%{repository}](%{repository_url}):
|
||||
%{mr_note}
|
||||
note_mr_commented_comment: >
|
||||
**Commented in MR:** [%{gitlab_user}](%{gitlab_user_url}) commented this WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) on [%{repository}](%{repository_url}): %{mr_note}
|
||||
**Commented in MR:** [%{gitlab_user}](%{gitlab_user_url}) commented this WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) on [%{repository}](%{repository_url}):
|
||||
%{mr_note}
|
||||
note_issue_referenced_comment: >
|
||||
**Referenced in Issue:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) on [%{repository}](%{repository_url}): %{issue_note}
|
||||
**Referenced in Issue:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) on [%{repository}](%{repository_url}):
|
||||
%{issue_note}
|
||||
note_issue_commented_comment: >
|
||||
**Commented in Issue:** [%{gitlab_user}](%{gitlab_user_url}) commented this WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) on [%{repository}](%{repository_url}): %{issue_note}
|
||||
**Commented in Issue:** [%{gitlab_user}](%{gitlab_user_url}) commented this WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) on [%{repository}](%{repository_url}):
|
||||
%{issue_note}
|
||||
note_snippet_referenced_comment: >
|
||||
**Referenced in Snippet:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Snippet %{snippet_number} [%{snippet_title}](%{snippet_url}) on [%{repository}](%{repository_url}): %{snippet_note}
|
||||
**Referenced in Snippet:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Snippet %{snippet_number} [%{snippet_title}](%{snippet_url}) on [%{repository}](%{repository_url}):
|
||||
%{snippet_note}
|
||||
issue_opened_referenced_comment: >
|
||||
**Issue Opened:** Issue %{issue_number} [%{issue_title}](%{issue_url}) for [%{repository}](%{repository_url}) has been opened by [%{gitlab_user}](%{gitlab_user_url}).
|
||||
issue_closed_referenced_comment: >
|
||||
@@ -78,8 +84,11 @@ rw:
|
||||
issue_reopened_referenced_comment: >
|
||||
**Issue Reopened:** Issue %{issue_number} [%{issue_title}](%{issue_url}) for [%{repository}](%{repository_url}) has been reopened by [%{gitlab_user}](%{gitlab_user_url}).
|
||||
push_single_commit_comment: >
|
||||
**Pushed in MR:** [%{gitlab_user}](%{gitlab_user_url}) pushed [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}: %{commit_note}
|
||||
**Pushed in MR:** [%{gitlab_user}](%{gitlab_user_url}) pushed [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}:
|
||||
%{commit_note}
|
||||
push_single_commit_comment_with_ref: >
|
||||
**Pushed in %{reference}:** [%{gitlab_user}](%{gitlab_user_url}) pushed [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}: %{commit_note}
|
||||
**Pushed in %{reference}:** [%{gitlab_user}](%{gitlab_user_url}) pushed [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}:
|
||||
%{commit_note}
|
||||
push_multiple_commits_comment: >
|
||||
**Pushed in MR:** [%{gitlab_user}](%{gitlab_user_url}) pushed multiple commits [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}: %{commit_note}
|
||||
**Pushed in MR:** [%{gitlab_user}](%{gitlab_user_url}) pushed multiple commits [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}:
|
||||
%{commit_note}
|
||||
|
||||
@@ -60,17 +60,23 @@ uz:
|
||||
merge_request_reopened_comment: >
|
||||
**MR Reopened:** Merge request %{mr_number} [%{mr_title}](%{mr_url}) for [%{repository}](%{repository_url}) has been reopened by [%{gitlab_user}](%{gitlab_user_url}).
|
||||
note_commit_referenced_comment: >
|
||||
**Referenced in Commit:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in a Commit Note [%{commit_id}](%{commit_url}) on [%{repository}](%{repository_url}): %{commit_note}
|
||||
**Referenced in Commit:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in a Commit Note [%{commit_id}](%{commit_url}) on [%{repository}](%{repository_url}):
|
||||
%{commit_note}
|
||||
note_mr_referenced_comment: >
|
||||
**Referenced in MR:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) on [%{repository}](%{repository_url}): %{mr_note}
|
||||
**Referenced in MR:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) on [%{repository}](%{repository_url}):
|
||||
%{mr_note}
|
||||
note_mr_commented_comment: >
|
||||
**Commented in MR:** [%{gitlab_user}](%{gitlab_user_url}) commented this WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) on [%{repository}](%{repository_url}): %{mr_note}
|
||||
**Commented in MR:** [%{gitlab_user}](%{gitlab_user_url}) commented this WP in Merge Request %{mr_number} [%{mr_title}](%{mr_url}) on [%{repository}](%{repository_url}):
|
||||
%{mr_note}
|
||||
note_issue_referenced_comment: >
|
||||
**Referenced in Issue:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) on [%{repository}](%{repository_url}): %{issue_note}
|
||||
**Referenced in Issue:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) on [%{repository}](%{repository_url}):
|
||||
%{issue_note}
|
||||
note_issue_commented_comment: >
|
||||
**Commented in Issue:** [%{gitlab_user}](%{gitlab_user_url}) commented this WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) on [%{repository}](%{repository_url}): %{issue_note}
|
||||
**Commented in Issue:** [%{gitlab_user}](%{gitlab_user_url}) commented this WP in Issue %{issue_number} [%{issue_title}](%{issue_url}) on [%{repository}](%{repository_url}):
|
||||
%{issue_note}
|
||||
note_snippet_referenced_comment: >
|
||||
**Referenced in Snippet:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Snippet %{snippet_number} [%{snippet_title}](%{snippet_url}) on [%{repository}](%{repository_url}): %{snippet_note}
|
||||
**Referenced in Snippet:** [%{gitlab_user}](%{gitlab_user_url}) referenced this WP in Snippet %{snippet_number} [%{snippet_title}](%{snippet_url}) on [%{repository}](%{repository_url}):
|
||||
%{snippet_note}
|
||||
issue_opened_referenced_comment: >
|
||||
**Issue Opened:** Issue %{issue_number} [%{issue_title}](%{issue_url}) for [%{repository}](%{repository_url}) has been opened by [%{gitlab_user}](%{gitlab_user_url}).
|
||||
issue_closed_referenced_comment: >
|
||||
@@ -78,8 +84,11 @@ uz:
|
||||
issue_reopened_referenced_comment: >
|
||||
**Issue Reopened:** Issue %{issue_number} [%{issue_title}](%{issue_url}) for [%{repository}](%{repository_url}) has been reopened by [%{gitlab_user}](%{gitlab_user_url}).
|
||||
push_single_commit_comment: >
|
||||
**Pushed in MR:** [%{gitlab_user}](%{gitlab_user_url}) pushed [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}: %{commit_note}
|
||||
**Pushed in MR:** [%{gitlab_user}](%{gitlab_user_url}) pushed [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}:
|
||||
%{commit_note}
|
||||
push_single_commit_comment_with_ref: >
|
||||
**Pushed in %{reference}:** [%{gitlab_user}](%{gitlab_user_url}) pushed [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}: %{commit_note}
|
||||
**Pushed in %{reference}:** [%{gitlab_user}](%{gitlab_user_url}) pushed [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}:
|
||||
%{commit_note}
|
||||
push_multiple_commits_comment: >
|
||||
**Pushed in MR:** [%{gitlab_user}](%{gitlab_user_url}) pushed multiple commits [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}: %{commit_note}
|
||||
**Pushed in MR:** [%{gitlab_user}](%{gitlab_user_url}) pushed multiple commits [%{commit_number}](%{commit_url}) to [%{repository}](%{repository_url}) at %{commit_timestamp}:
|
||||
%{commit_note}
|
||||
|
||||
@@ -6,7 +6,7 @@ zh-CN:
|
||||
description: '与 OpenProject 组同步 LDAP 组以管理用户,更改他们的权限以便不同组的用户管理。'
|
||||
plugin_openproject_ldap_groups:
|
||||
name: "OpenProject LDAP 组"
|
||||
description: "LDAP组成员同步。"
|
||||
description: "LDAP 组成员同步。"
|
||||
activerecord:
|
||||
attributes:
|
||||
ldap_groups/synchronized_group:
|
||||
|
||||
@@ -15,7 +15,7 @@ zh-TW:
|
||||
ldap_auth_source: 'LDAP 連線'
|
||||
sync_users: '同步使用者'
|
||||
ldap_groups/synchronized_filter:
|
||||
filter_string: 'LDAP篩選條件'
|
||||
filter_string: '簡約登入目錄制約(LDAP)篩選'
|
||||
auth_source: '驗證來源'
|
||||
ldap_auth_source: 'LDAP 連線'
|
||||
group_name_attribute: "群組名字屬性"
|
||||
|
||||
@@ -489,7 +489,7 @@ cs:
|
||||
notice_meeting_updated: "Tato stránka byla aktualizována někým jiným. Pro zobrazení změn znovu načtena."
|
||||
permission_create_meetings: "Vytvořit schůzku\n"
|
||||
permission_edit_meetings: "Upravit schůzku"
|
||||
permission_delete_meetings: "Odstranit schůzky"
|
||||
permission_delete_meetings: "Smazat schůzku"
|
||||
permission_view_meetings: "Zobrazit schůzky"
|
||||
permission_manage_agendas: "Správa zápisů"
|
||||
permission_manage_agendas_explanation: "Allows creating, editing and removing agenda items"
|
||||
|
||||
@@ -226,9 +226,9 @@ ja:
|
||||
header: "キャンセルされました:会議「%{title}」"
|
||||
header_occurrence: "キャンセル: ミーティング発生'%{title}'"
|
||||
header_series: "キャンセル: ミーティングシリーズ '%{title}'"
|
||||
summary_occurrence: "An occurrence of '%{title}' has been cancelled by %{actor}, or you have been removed as a participant"
|
||||
summary_series: "Meeting series '%{title}' has been cancelled by %{actor}, or you have been removed as a participant"
|
||||
summary: "'%{title}' has been cancelled by %{actor}, or you have been removed as a participant"
|
||||
summary_occurrence: "%{title}'の発生は %{actor}によってキャンセルされました。"
|
||||
summary_series: "ミーティングシリーズ '%{title}' は、 %{actor} によってキャンセルされました。"
|
||||
summary: "'%{title}' は %{actor} によってキャンセルされました。"
|
||||
date_time: "予定日時"
|
||||
participant_added:
|
||||
header: "Meeting '%{title}' - Participant added"
|
||||
@@ -271,7 +271,7 @@ ja:
|
||||
title: "ミーティングのキャンセル"
|
||||
heading: "このミーティングをキャンセルしますか?"
|
||||
confirmation_message_html: >
|
||||
テンプレートにない会議情報は失われます。 続行しますか?
|
||||
テンプレートにない会議情報は失われます。 続けますか?
|
||||
confirm_button: "発生をキャンセル"
|
||||
blankslate:
|
||||
title: "表示するミーティングがありません"
|
||||
@@ -463,7 +463,7 @@ ja:
|
||||
confirm_button: "この予定をキャンセル"
|
||||
end_series_dialog:
|
||||
title: "一連の会議を終了"
|
||||
notice_successful_notification: "参加者全員にカレンダー更新の電子メールを送信"
|
||||
notice_successful_notification: "すべての出席者にカレンダーの更新をメールしました"
|
||||
notice_timezone_missing: タイムゾーンが設定されていない場合、%{zone} が使用されます。タイムゾーンを選択するには、ここをクリックしてください。
|
||||
notice_meeting_updated: "このページは他の誰かによって更新されました。変更を表示するには再読み込みしてください。"
|
||||
permission_create_meetings: "会議を作成"
|
||||
@@ -548,7 +548,7 @@ ja:
|
||||
このバックログは、このワンタイムミーティングに固有のものです.アイテムをドラッグして追加またはミーティングの議題から削除することができます.
|
||||
label_agenda_backlog_clear_title: "議題のバックログをクリアしますか?"
|
||||
text_agenda_backlog_clear_description: >
|
||||
現在アジェンダバックログにあるすべての項目を削除してもよろしいですか?このアクションは元に戻せません。
|
||||
議題のバックログ内のすべての項目を削除してもよろしいですか?この操作は取り消せません。
|
||||
label_series_backlog: "シリーズバックログ"
|
||||
text_series_backlog: >
|
||||
バックログはこのシリーズのすべての出現と共有されます。 項目をドラッグして、特定のミーティングから項目を追加または削除できます。
|
||||
@@ -580,7 +580,7 @@ ja:
|
||||
text_meeting_closed_description: "この会議は終了しています。これ以上、議題項目の追加/削除はできません。"
|
||||
text_meeting_in_progress_description: "議題を変更したり、各項目のアウトカムを記録したり、参加者の出席を追跡することができます。 ミーティングが完了すると、ミーティングをクローズとしてマークしてロックできます。"
|
||||
text_meeting_open_dropdown_description: "既存の結果は残りますが、ユーザーは新しい結果を追加することはできません。"
|
||||
text_meeting_in_progress_dropdown_description: "会議中に必要な情報や決定事項などの成果を文書化する。"
|
||||
text_meeting_in_progress_dropdown_description: "会議中に取られた情報のニーズや意思決定などの成果を記録します。"
|
||||
text_meeting_closed_dropdown_description: "この会議は終了しました。これ以上、議題や結果を変更することはできません。"
|
||||
text_meeting_draft_banner: "現在下書きモードです。 ミーティングの詳細を変更したり出席者を追加/削除したりしても,このミーティングはカレンダーの更新や招待状を送信しません。"
|
||||
text_exit_draft_mode_dialog_title: "このミーティングを開いて招待を送信しますか?"
|
||||
|
||||
@@ -226,9 +226,9 @@ vi:
|
||||
header: "Đã hủy: Cuộc họp '%{title}'"
|
||||
header_occurrence: "Đã hủy: Cuộc họp diễn ra '%{title}'"
|
||||
header_series: "Đã hủy: Chuỗi cuộc họp '%{title}'"
|
||||
summary_occurrence: "An occurrence of '%{title}' has been cancelled by %{actor}, or you have been removed as a participant"
|
||||
summary_series: "Meeting series '%{title}' has been cancelled by %{actor}, or you have been removed as a participant"
|
||||
summary: "'%{title}' has been cancelled by %{actor}, or you have been removed as a participant"
|
||||
summary_occurrence: "Sự xuất hiện của '%{title}' đã bị hủy bởi %{actor}."
|
||||
summary_series: "Chuỗi cuộc họp '%{title}' đã bị hủy bởi %{actor}."
|
||||
summary: "'%{title}' đã bị hủy bởi %{actor}."
|
||||
date_time: "Ngày/giờ dự kiến"
|
||||
participant_added:
|
||||
header: "Họp '%{title}' - Thành viên tham gia đã được thêm vào"
|
||||
@@ -242,7 +242,7 @@ vi:
|
||||
summary_series: "%{actor} Đã loại bỏ \" %{participant} \" khỏi chuỗi cuộc họp \"%{title}\""
|
||||
ended:
|
||||
header_series: "Đã kết thúc: Chuỗi cuộc họp '%{title}'"
|
||||
summary_series: "Meeting series '%{title}' has been ended by %{actor}"
|
||||
summary_series: "Chuỗi cuộc họp '%{title}' đã kết thúc bởi %{actor}."
|
||||
updated:
|
||||
header: "Cuộc họp '%{title}' đã được cập nhật"
|
||||
summary: "Cuộc họp '%{title}' đã được cập nhật bởi %{actor}"
|
||||
@@ -523,8 +523,8 @@ vi:
|
||||
label_agenda_item_move_up: "Di chuyển lên"
|
||||
label_agenda_item_move_down: "Dịch xuống"
|
||||
label_agenda_item_duplicate: "trùng lặp"
|
||||
label_agenda_item_duplicate_in_next: "Duplicate in next meeting"
|
||||
label_agenda_item_duplicate_in_next_title: "Duplicate in next meeting?"
|
||||
label_agenda_item_duplicate_in_next: "Trùng lặp trong lần xuất hiện tiếp theo"
|
||||
label_agenda_item_duplicate_in_next_title: "Trùng lặp trong lần xuất hiện tiếp theo?"
|
||||
label_agenda_item_add_notes: "Thêm ghi chú"
|
||||
label_agenda_item_add_outcome: "Thêm kết quả"
|
||||
label_agenda_item_work_package_add: "Thêm gói công việc"
|
||||
|
||||
@@ -70,7 +70,7 @@ ro:
|
||||
label_filter: "Filtrează"
|
||||
label_filter_add: "Adaugă filtru"
|
||||
label_filter_plural: "Filtre"
|
||||
label_group_by: "Grupează după"
|
||||
label_group_by: "Grupare după"
|
||||
label_group_by_add: "Adaugă atributul Grupează-după"
|
||||
label_inactive: "Inactiv"
|
||||
label_no: "Nu"
|
||||
|
||||
@@ -53,7 +53,7 @@ zh-TW:
|
||||
label_money: "金額"
|
||||
label_month_reporting: "月"
|
||||
label_new_report: "新建成本報表"
|
||||
label_open: "開啟"
|
||||
label_open: "開啟中"
|
||||
label_operator: "操作員"
|
||||
label_private_report_plural: "私密成本報告"
|
||||
label_progress_bar_explanation: "產生報告中..."
|
||||
@@ -70,7 +70,7 @@ zh-TW:
|
||||
label_filter: "篩選條件"
|
||||
label_filter_add: "新增篩選條件"
|
||||
label_filter_plural: "篩選條件"
|
||||
label_group_by: "分類"
|
||||
label_group_by: "分組依據"
|
||||
label_group_by_add: "新增群組欄位"
|
||||
label_inactive: "«不活動»"
|
||||
label_no: "否"
|
||||
|
||||
@@ -18,7 +18,7 @@ ja:
|
||||
token_exchange_scope: ストレージスコープ
|
||||
storages/project_storage:
|
||||
project_folder: プロジェクトフォルダ
|
||||
project_folder_mode: プロジェクトフォルダーモード
|
||||
project_folder_mode: プロジェクトフォルダモード
|
||||
storage: ストレージ
|
||||
storage_url: ストレージURL
|
||||
storages/sharepoint_storage:
|
||||
@@ -29,53 +29,53 @@ ja:
|
||||
storages/storage:
|
||||
authentication_method: 認証方法
|
||||
creator: 作成者
|
||||
drive: ドライブID
|
||||
drive: ドライブ ID
|
||||
host: ホスト
|
||||
name: 名称
|
||||
password: アプリケーションのパスワード
|
||||
provider_type: プロバイダー・タイプ
|
||||
tenant: ディレクトリ(テナント)ID
|
||||
provider_type: プロバイダーの種類
|
||||
tenant: ディレクトリ (テナント) ID
|
||||
errors:
|
||||
messages:
|
||||
invalid_host_url: は有効な URL ではありません。
|
||||
invalid_sharepoint_url: は有効なSharePointサイト、ライブラリ、ドキュメントのURLではありません。
|
||||
not_linked_to_project: はプロジェクトにリンクされていない。
|
||||
invalid_sharepoint_url: は有効なSharePointサイト、ライブラリ、またはドキュメントのURLではありません。
|
||||
not_linked_to_project: はプロジェクトにリンクされていません。
|
||||
models:
|
||||
storages/file_link:
|
||||
attributes:
|
||||
origin_id:
|
||||
only_numeric_or_uuid: には数値かuuidしか指定できない。
|
||||
only_numeric_or_uuid: は数値またはuuidのみとなります。
|
||||
storages/project_storage:
|
||||
attributes:
|
||||
project_folder_id:
|
||||
blank: フォルダーを選択してください。
|
||||
project_folder_mode:
|
||||
mode_unavailable: はこのストレージでは使用できない。
|
||||
mode_unavailable: このストレージでは使用できません。
|
||||
project_ids:
|
||||
blank: プロジェクトを選択してください。
|
||||
storages/storage:
|
||||
attributes:
|
||||
host:
|
||||
authorization_header_missing: が完全にセットアップされていません。APIリクエストのベアラートークンベースの認証に必要な "Authorization "ヘッダーをNextcloudインスタンスが受け取っていません。HTTPサーバーの設定を再度ご確認ください。
|
||||
cannot_be_connected_to: に到達できませんでした。ホストに到達可能で、OpenProject 統合アプリがインストールされていることを確認してください。
|
||||
minimal_nextcloud_version_unmet: 最小バージョン要件を満たしていない(Nextcloud 23以上である必要があります。)
|
||||
not_nextcloud_server: はNextcloudサーバーではありません。
|
||||
op_application_not_installed: は、アプリ「OpenProject integration」がインストールされていないようです。インストールしてからもう一度お試しください。
|
||||
authorization_header_missing: 完全には設定されていません。 Nextcloudインスタンスは、APIリクエストのベアラートークンベースの認可に必要な「Authorization」ヘッダーを受け取りません。 HTTPサーバーの設定を再確認してください。
|
||||
cannot_be_connected_to: に到達できませんでした。ホストが到達可能で、OpenProject 統合アプリがインストールされていることを確認してください。
|
||||
minimal_nextcloud_version_unmet: 最小バージョン要件を満たしていません(Nextcloud23以上でなければなりません)
|
||||
not_nextcloud_server: はNextcloudサーバーではありません
|
||||
op_application_not_installed: アプリ「OpenProject統合」がインストールされていません。最初にインストールしてからもう一度お試しください。
|
||||
password:
|
||||
invalid_password: は無効である。
|
||||
invalid_password: は無効です。
|
||||
unknown_error: could not be validated with the file storage provider. Please verify that the connection is functioning properly.
|
||||
models:
|
||||
file_link: ファイル
|
||||
storages/storage: ストレージ
|
||||
api_v3:
|
||||
errors:
|
||||
too_many_elements_created_at_once: 一度に作成される要素が多すぎる。最大でも %{max} 、 %{actual}。
|
||||
too_many_elements_created_at_once: 一度に作成された要素が多すぎます。 %{max} の期待値は %{actual} です。
|
||||
external_file_storages: 外部ファイルストレージ
|
||||
permission_create_files: '自動的に管理されたプロジェクトフォルダ: ファイルの作成'
|
||||
permission_create_files_explanation: この権限はNextcloudストレージでのみ利用できます
|
||||
permission_delete_files: '自動的に管理されたプロジェクトフォルダ: ファイルの削除'
|
||||
permission_delete_files_explanation: この権限はNextcloudストレージでのみ利用できます
|
||||
permission_header_for_project_module_storages: 自動的に管理されるプロジェクトフォルダ
|
||||
permission_header_for_project_module_storages: 自動的に管理されたプロジェクトフォルダ
|
||||
permission_manage_file_links: ファイルへのリンク管理
|
||||
permission_manage_files_in_project: プロジェクト内のファイル管理
|
||||
permission_read_files: '自動的に管理されたプロジェクトフォルダ: ファイルの読み込み'
|
||||
@@ -86,16 +86,16 @@ ja:
|
||||
project_module_storages: ファイルを添付する
|
||||
project_storages:
|
||||
edit_project_folder:
|
||||
label: プロジェクトフォルダの編集
|
||||
label: プロジェクトフォルダを編集
|
||||
open:
|
||||
contact_admin: このエラーを解決するには、管理者に連絡してください。
|
||||
remote_identity_error: ストレージへの接続中に予期せぬエラーが発生しました。
|
||||
contact_admin: このエラーを解決するには管理者に問い合わせてください。
|
||||
remote_identity_error: ストレージへの接続中に予期しないエラーが発生しました。
|
||||
project_folder_mode:
|
||||
automatic: 自動的に管理される
|
||||
inactive: 特定のフォルダなし
|
||||
automatic: 自動的に管理
|
||||
inactive: 特定のフォルダがありません
|
||||
manual: 既存のフォルダを手動で管理
|
||||
remove_project:
|
||||
deletion_failure_flash: ストレージからのプロジェクトの削除に失敗しました。 %{error}
|
||||
deletion_failure_flash: プロジェクトをストレージから削除できませんでした。 %{error}
|
||||
label: プロジェクトを削除
|
||||
services:
|
||||
attributes:
|
||||
@@ -110,7 +110,7 @@ ja:
|
||||
one_drive_sync_service:
|
||||
create_folder: 'プロジェクトフォルダの作成を管理:'
|
||||
ensure_root_folder_permissions: 'ベースフォルダの権限を設定:'
|
||||
hide_inactive_folders: '非アクティブフォルダを隠す ステップ:'
|
||||
hide_inactive_folders: '非アクティブフォルダを隠す ステップ'
|
||||
remote_folders: 'Read contents of the drive root folder:'
|
||||
rename_project_folder: '管理プロジェクトフォルダの名前を変更します:'
|
||||
sharepoint_sync_service:
|
||||
@@ -121,16 +121,16 @@ ja:
|
||||
rename_project_folder: '管理プロジェクトフォルダの名前を変更します:'
|
||||
errors:
|
||||
messages:
|
||||
error: 予期しないエラーが発生しました。OpenProject のログを確認するか、管理者に連絡してください
|
||||
error: 予期しないエラーが発生しました。OpenProject のログを確認するか、管理者に連絡してください。
|
||||
forbidden: OpenProject could not access the requested resource. Please check your permissions configuration on the Storage Provider.
|
||||
unauthorized: OpenProjectはストレージプロバイダと認証できませんでした。アクセスできることを確認してください。
|
||||
models:
|
||||
copy_project_folders_service:
|
||||
conflict: フォルダ %{destination_path} は既に存在する。上書きを避けるために処理を中断しています。
|
||||
error: 予期しないエラーが発生しました。OpenProject のログを確認するか、管理者に連絡してください
|
||||
forbidden: OpenProject はソースフォルダにアクセスできませんでした。ストレージ・プロバイダの権限設定を確認してください
|
||||
error: 予期しないエラーが発生しました。OpenProject のログを確認するか、管理者に連絡してください。
|
||||
forbidden: OpenProject はソースフォルダにアクセスできませんでした。ストレージ・プロバイダの権限設定を確認してください。
|
||||
not_found: ソース・テンプレートの場所 %{source_path} が見つかりませんでした。
|
||||
unauthorized: OpenProject はストレージプロバイダと認証できませんでした。ストレージの設定を確認してください
|
||||
unauthorized: OpenProject はストレージプロバイダと認証できませんでした。ストレージの設定を確認してください。
|
||||
nextcloud_sync_service:
|
||||
attributes:
|
||||
add_user_to_group:
|
||||
@@ -151,31 +151,31 @@ ja:
|
||||
conflict: '以下の理由により、 %{user} のユーザーを %{group} グループから削除できませんでした: %{reason}'
|
||||
failed_to_remove: '以下の理由により、 %{user} のユーザーを %{group} グループから削除できませんでした: %{reason}'
|
||||
rename_project_folder:
|
||||
conflict: OpenProjectは、同じ名前のフォルダが既に存在するため、プロジェクトフォルダの名前を %{current_path} に変更できませんでした
|
||||
forbidden: OpenProject ユーザーは %{current_path} フォルダにアクセスできません。
|
||||
not_found: "%{current_path} は見つからなかった。"
|
||||
conflict: OpenProjectは、同じ名前のフォルダが既に存在するため、プロジェクトフォルダの名前を %{current_path} に変更できませんでした。
|
||||
forbidden: OpenProjectユーザーは %{current_path} フォルダにアクセスできません。
|
||||
not_found: "%{current_path} は見つかりませんでした。"
|
||||
set_folders_permissions:
|
||||
permission_not_set: '%{path}にパーミッションを設定できなかった。'
|
||||
error: 予期しないエラーが発生しました。Nextcloud インスタンスに到達可能であることを確認し、OpenProject ワーカーのログを確認してください
|
||||
permission_not_set: '%{path} に権限を設定できませんでした。'
|
||||
error: 予期しないエラーが発生しました。Nextcloudインスタンスがアクセス可能であることを確認し、詳細についてはOpenProjectワーカーログを確認してください。
|
||||
group_does_not_exist: "%{group} は存在しません。Nextcloudインスタンスの設定を確認してください。"
|
||||
insufficient_privileges: OpenProjectには、 %{group}に %{user} を追加するのに十分な権限がありません。Nextcloudのグループ設定を確認してください。
|
||||
not_allowed: ネクストクラウドはリクエストをブロックする。
|
||||
insufficient_privileges: OpenProjectには %{user} を %{group}に追加するための十分な権限がありません。Nextcloudでグループ設定を確認してください。
|
||||
not_allowed: Nextcloudはリクエストをブロックします。
|
||||
not_found: OpenProject could not find the file on the Nextcloud Storage Provider. Please check if it wasn't deleted.
|
||||
unauthorized: OpenProjectがNextcloudと同期できませんでした。ストレージとNextcloudの設定を確認してください。
|
||||
user_does_not_exist: "%{user} はNextcloudには存在しません。"
|
||||
user_does_not_exist: "Nextcloudには%{user} は存在しません。"
|
||||
one_drive_sync_service:
|
||||
attributes:
|
||||
create_folder:
|
||||
conflict: '%{folder_name} はすでに %{parent_location}に存在している。'
|
||||
not_found: "%{parent_location} は見つからなかった。"
|
||||
conflict: '%{folder_name} は %{parent_location} に既に存在します。'
|
||||
not_found: "%{parent_location} は見つかりませんでした。"
|
||||
hide_inactive_folders:
|
||||
permission_not_set: '%{path}にパーミッションを設定できなかった。'
|
||||
permission_not_set: '%{path} に権限を設定できませんでした。'
|
||||
remote_folders:
|
||||
request_error: OpenProject は %{drive_id}ドライブにアクセスできませんでした。ストレージの設定が正しいかどうか確認してください。
|
||||
request_error: OpenProjectがドライブ %{drive_id}にアクセスできませんでした。ストレージの設定が正しいか確認してください。
|
||||
rename_project_folder:
|
||||
conflict: OpenProject could not rename the folder %{current_path} to %{project_folder_name} as a folder with the same name already exists.
|
||||
forbidden: OpenProject は、 %{current_path} にアクセスできず、名前を変更できません。
|
||||
not_found: "%{current_path} は見つからなかった。"
|
||||
forbidden: OpenProject は名前を変更するために %{current_path} にアクセスできません。
|
||||
not_found: "%{current_path} は見つかりませんでした。"
|
||||
set_folders_permissions:
|
||||
permission_not_set: '%{path} に権限を設定できませんでした。'
|
||||
error: An unexpected error occurred. Please ensure that OneDrive is reachable and check OpenProject worker logs for more information.
|
||||
@@ -303,41 +303,41 @@ ja:
|
||||
drive_id_format: ドライブIDフォーマット
|
||||
header: 構成
|
||||
host: ホスト URL
|
||||
host_url_accessible: アクセス可能なホストURL
|
||||
host_url_accessible: ホスト URL アクセス
|
||||
storage_configured: 設定完了
|
||||
tenant_id: テナントID
|
||||
tenant_id: Tenant ID
|
||||
failures:
|
||||
other: "%{count} チェック失敗"
|
||||
other: "%{count} チェックに失敗しました"
|
||||
success: すべてのチェックに合格
|
||||
warnings:
|
||||
other: "%{count} は警告を返しました"
|
||||
connection_validation:
|
||||
client_id_invalid: 設定されたOAuth 2クライアントIDが無効です。設定を確認してください。
|
||||
client_secret_invalid: 設定されたOAuth 2クライアントシークレットが無効です。設定を確認してください。
|
||||
nc_dependency_missing: 'ファイルストレージに必要な依存関係がありません。次の依存関係を追加してください: %{dependency}。'
|
||||
nc_dependency_missing: 'ファイルストレージに必要な依存関係がありません。次の依存関係を追加してください: %{dependency}。'
|
||||
nc_dependency_version_mismatch: '%{dependency} アプリのバージョンがサポートされていません。Nextcloudサーバーをアップデートしてください。'
|
||||
nc_host_not_found: 設定されたホストURLにNextcloudサーバーが見つかりません。設定を確認してください。
|
||||
nc_oauth_request_not_found: 現在接続しているユーザーを取得するエンドポイントが見つかりませんでした。詳細については、サーバーのログを確認してください。
|
||||
nc_oauth_request_unauthorized: 現在のユーザーにはリモートファイルストレージにアクセスする権限がありません。サーバーのログを確認してください。
|
||||
nc_oauth_token_missing: OpenProjectでは、ユーザーがNextcloudアカウントをリンクしていないため、ユーザーレベルのNextcloudとの通信をテストできません。
|
||||
nc_oauth_token_missing: OpenProject は、Nextcloudアカウントへのリンクがまだないため、Nextcloudとのユーザーレベルの通信をテストできません。
|
||||
nc_team_folder_not_found: The team folder could not be found.
|
||||
nc_unexpected_content: Unexpected content found in the managed team folder.
|
||||
nc_userless_access_denied: 設定されているアプリのパスワードが無効です。
|
||||
not_configured: 接続を検証できませんでした。先に設定を完了してください。
|
||||
od_client_cant_delete_folder: クライアントがフォルダの削除に失敗しています。お使いのストレージのセットアップドキュメントを確認してください。
|
||||
od_client_write_permission_missing: クライアントの書き込み権限が不足しているようです。お使いのストレージのセットアップドキュメントを確認してください。
|
||||
od_drive_id_invalid: 設定されたドライブIDが無効のようです。設定を確認してください。
|
||||
od_drive_id_not_found: 設定されたドライブIDが見つかりません。設定を確認してください。
|
||||
od_oauth_request_not_found: 現在接続しているユーザーを取得するエンドポイントが見つかりませんでした。詳細については、サーバーのログを確認してください。
|
||||
od_oauth_request_unauthorized: 現在のユーザーにはリモートファイルストレージにアクセスする権限がありません。サーバーのログを確認してください。
|
||||
od_oauth_token_missing: OpenProjectは、ユーザーがまだMicrosoftアカウントをリンクしていないため、OneDriveとのユーザーレベルの通信をテストできません。
|
||||
od_tenant_id_wrong: 設定されたディレクトリ(テナント)IDが無効です。設定を確認してください。
|
||||
od_client_cant_delete_folder: クライアントがフォルダを削除できません。ストレージのセットアップドキュメントを確認してください。
|
||||
od_client_write_permission_missing: クライアントは書き込み権限がありません。ストレージの設定ドキュメントを確認してください。
|
||||
od_drive_id_invalid: 設定されたドライブ ID が無効です。設定を確認してください。
|
||||
od_drive_id_not_found: 設定されたドライブ ID が見つかりません。設定を確認してください。
|
||||
od_oauth_request_not_found: 現在接続されているユーザーを取得するエンドポイントが見つかりませんでした。詳細についてはサーバーログを確認してください。
|
||||
od_oauth_request_unauthorized: 現在のユーザーはリモートファイルストレージにアクセスする権限がありません。詳細についてはサーバーログを確認してください。
|
||||
od_oauth_token_missing: OpenProject は、ユーザーが Microsoft アカウントをまだリンクしていないため、OneDrive とのユーザー レベルの通信をテストできません。
|
||||
od_tenant_id_wrong: 設定されたディレクトリ (テナント) IDは無効です。設定を確認してください。
|
||||
od_test_folder_exists: テストに必要なフォルダ %{folder_name} はすでに存在します。削除して再度お試しください。
|
||||
od_unexpected_content: ドライブに予期しないコンテンツが見つかりました。
|
||||
offline_access_scope_missing: OpenID Connectプロバイダがoffline_accessスコープを要求するように設定することをお勧めします。統合はまだ機能するかもしれませんが、リフレッシュトークンの有効期限が切れていないことを確認してください。
|
||||
offline_access_scope_missing: offline_access スコープを要求するために OpenID Connect プロバイダを設定することをお勧めします。 統合はまだ動作するかもしれませんが、更新トークンが期限切れでないことを確認してください。
|
||||
oidc_cant_refresh_token: ストレージへのアクセスを確認中にエラーが発生しました。詳細についてはサーバーログを確認してください。
|
||||
oidc_non_oidc_user: 現在のユーザーはプロビジョニングされていますが、OpenID Connect (OIDC) Identity Providerによってプロビジョニングされていません。OIDCプロビジョニングされたユーザーでチェックを再実行してください。
|
||||
oidc_non_provisioned_user: 現在のユーザはOpenID Connect Identity Providerから提供されていません。提供されたユーザーでチェックを再実行してください。
|
||||
oidc_non_oidc_user: 現在のユーザは、プロビジョニング中にOpenID Connect(OIDC)アイデンティティプロバイダによってプロビジョニングされていませんでした。OIDCプロビジョニングされたユーザでチェックを再実行してください。
|
||||
oidc_non_provisioned_user: 現在のユーザーはOpenID Connectアイデンティティプロバイダーによって提供されていません。指定されたユーザーとチェックを再実行してください。
|
||||
oidc_provider_cant_exchange: OpenID Connectプロバイダはトークン交換をサポートしていないようですが、トークン交換はストレージ用に設定されています。
|
||||
oidc_token_acquisition_failed: OpenID Connectのセットアップでは、必要なオーディエンスが提供されておらず、トークン交換機能も提供されていません。詳しくはドキュメントをご覧ください。
|
||||
oidc_token_exchange_failed: OpenID Connect ProviderのToken Exchange設定に問題があるようです。設定を確認し、再度お試しください。
|
||||
@@ -352,7 +352,7 @@ ja:
|
||||
sp_oauth_token_missing: OpenProject は、ユーザーがまだ SharePoint アカウントをリンクしていないため、ユーザーレベルの SharePoint との通信をテストできません。
|
||||
sp_tenant_id_missing: 構成されたディレクトリ(テナント)IDがSharePointにありません。設定を確認してください。
|
||||
sp_unexpected_content: Unexpected content found in the SharePoint Document Library.
|
||||
unknown_error: 接続を検証できませんでした。不明なエラーが発生しました。詳細については、サーバーのログを確認してください。
|
||||
unknown_error: 接続を検証できませんでした。不明なエラーが発生しました。詳細についてはサーバーログを確認してください。
|
||||
label_error: エラー
|
||||
label_failed: 失敗しました
|
||||
label_healthy: 健康的
|
||||
@@ -360,55 +360,55 @@ ja:
|
||||
label_pending: 保留中
|
||||
label_skipped: スキップ
|
||||
label_warning: 注意
|
||||
no_report: 報告書なし
|
||||
no_report_description: 今すぐチェックを実行し、このファイル・ストレージの完全な健全性ステータスをレポートする。
|
||||
no_report: 利用可能なレポートがありません
|
||||
no_report_description: 今すぐこのファイルストレージの完全な健康状態レポートを確認します。
|
||||
open_report: 完全な健康報告を開く
|
||||
project_folders:
|
||||
subtitle: 自動的に管理されるプロジェクトフォルダ
|
||||
since: '%{datetime}より'
|
||||
since: '%{datetime} 以降'
|
||||
summary:
|
||||
failure: いくつかのチェックに失敗し、システムが期待通りに機能しない。
|
||||
success: すべての接続とシステムは期待通りに機能している。
|
||||
warning: いくつかのチェックは警告を返した。これは予期せぬ動作につながる可能性がある。
|
||||
title: 健康状態報告
|
||||
failure: いくつかのチェックに失敗し、システムが期待どおりに動作しません。
|
||||
success: すべての接続とシステムは期待どおりに動作しています。
|
||||
warning: いくつかのチェックが警告を返しました。これは予期しない動作につながる可能性があります。
|
||||
title: 健康状態レポート
|
||||
health_email_notifications:
|
||||
description_disabled: 管理者は、重要なアップデートがあった場合、メールでアップデートを受け取ることはできません。
|
||||
description_enabled: 管理者は、重要なアップデートがあった場合、メールで最新情報を受け取ります。
|
||||
error_could_not_be_saved: 電子メール通知の設定を保存できませんでした。もう一度お試しください。
|
||||
error_could_not_be_saved: メール通知設定を保存できませんでした。もう一度やり直してください。
|
||||
title: 管理者にメールで更新する
|
||||
help_texts:
|
||||
project_folder: プロジェクトフォルダは、このプロジェクトのファイルアップロード用のデフォルトフォルダです。それでも、ユーザーは他の場所にファイルをアップロードすることができます。
|
||||
project_folder_bulk: プロジェクトフォルダは、選択したすべてのプロジェクトのファイルアップロード用のデフォルトフォルダです。これは、各プロジェクト設定で個別に変更できます。それでも、ユーザーは他の場所にファイルをアップロードすることができます。
|
||||
project_folder: プロジェクトフォルダは、このプロジェクトのファイルアップロードのデフォルトフォルダです。ただし、ユーザーは他の場所にファイルをアップロードすることができます。
|
||||
project_folder_bulk: プロジェクトフォルダは、選択したすべてのプロジェクトのファイルアップロードのデフォルトフォルダです。 プロジェクトごとの設定で個別に変更することができますが、ユーザーは別の場所にファイルをアップロードすることもできます。
|
||||
instructions:
|
||||
all_available_storages_already_added: 利用可能なすべてのストレージはすでにプロジェクトに追加されている。
|
||||
authentication_method: OpenProject とストレージ間のリクエストの認証方法。
|
||||
automatic_folder: これにより、このプロジェクトのルート・フォルダーが自動的に作成され、各プロジェクト・メンバーのアクセス権が管理されます。
|
||||
empty_project_folder_validation: 続行するには、フォルダの選択が必須です。
|
||||
existing_manual_folder: 既存のフォルダをこのプロジェクトのルートフォルダとして指定することができます。ただし、パーミッションは自動的に管理されないため、管理者は関連するユーザーがアクセスできることを手動で確認する必要があります。選択したフォルダは、複数のプロジェクトで使用できます。
|
||||
host: https:// を含むストレージのホスト・アドレスを追加してください。255文字以内にしてください。
|
||||
managed_project_folders_application_password_caption: '%{provider_type_link}からこの値をコピーして、自動管理フォルダを有効にする。'
|
||||
name: ユーザーが複数のストレージを区別できるように、ストレージに名前を付ける。
|
||||
all_available_storages_already_added: 利用可能なすべてのストレージが既にプロジェクトに追加されています。
|
||||
authentication_method: OpenProjectとストレージ間のリクエストは認証されます。
|
||||
automatic_folder: これにより、このプロジェクトのルートフォルダが自動的に作成され、各プロジェクトメンバーのアクセス権限が管理されます。
|
||||
empty_project_folder_validation: フォルダの選択は必須です。
|
||||
existing_manual_folder: このプロジェクトのルートフォルダとして既存のフォルダを指定できます。 ただし、権限は自動的に管理されておらず、管理者は関連するユーザーに手動でアクセス権があることを確認する必要があります。 選択したフォルダは複数のプロジェクトで使用できます。
|
||||
host: https://を含むストレージのホストアドレスを追加してください。255文字以内にしてください。
|
||||
managed_project_folders_application_password_caption: '%{provider_type_link} からこの値をコピーすることで、自動管理フォルダを有効にします。'
|
||||
name: ユーザーが複数のストレージを区別できるように、ストレージに名前を付けます。
|
||||
new_storage: 詳しくは、<a target='_blank' href='%{provider_link}'> %{provider_name} ファイルストレージ</a>統合の設定に関するドキュメントをお読みください。
|
||||
nextcloud:
|
||||
application_link_text: アプリケーション "Integration OpenProject"
|
||||
integration: ネクストクラウド管理 / OpenProject
|
||||
integration: Nextcloudの管理 / OpenProject
|
||||
oauth_configuration: '%{application_link_text} からこれらの値をコピーします。'
|
||||
provider_configuration: セットアップを行う前に、Nextcloudインスタンスの管理者権限があり、 %{application_link_text} がインストールされていることを確認してください。
|
||||
storage_audience: Nextcloud インスタンスが ID プロバイダとの通信に使用するクライアント ID。
|
||||
storage_audience_placeholder: 例:ネクストクラウド
|
||||
token_exchange_scope: トークン交換時に要求するスコープを、それぞれスペースで区切って指定する。
|
||||
no_specific_folder: デフォルトでは、ファイルをアップロードすると、各ユーザーは自分のホームフォルダから開始します。
|
||||
no_storage_set_up: ファイルストレージはまだ設定されていない。
|
||||
not_logged_into_storage: プロジェクトフォルダを選択するには、まずログインしてください。
|
||||
provider_configuration: Nextcloudインスタンスに管理権限があり、設定を行う前に %{application_link_text} がインストールされていることを確認してください。
|
||||
storage_audience: NextcloudインスタンスがIDプロバイダーと通信するために使用するクライアントID。
|
||||
storage_audience_placeholder: 例:nextcloud
|
||||
token_exchange_scope: トークン交換中に要求されるべきスコープは、それぞれスペースで区切られています。
|
||||
no_specific_folder: デフォルトでは、各ユーザーはファイルをアップロードしたときに自分のホームフォルダから開始します。
|
||||
no_storage_set_up: まだ設定されているファイルストレージがありません。
|
||||
not_logged_into_storage: プロジェクトフォルダを選択するには、最初にログインしてください
|
||||
oauth_application_details: クライアントシークレットの値は、このウィンドウを閉じた後は二度とアクセスできなくなります。これらの値を %{oauth_application_details_link}にコピーしてください。
|
||||
oauth_application_details_link_text: NextcloudのOpenProject統合設定
|
||||
oauth_application_details_link_text: Nextcloud OpenProjectインテグレーション設定
|
||||
one_drive:
|
||||
application_link_text: Azure Portal
|
||||
copy_redirect_uri: リダイレクトURIをコピーする
|
||||
documentation_link_text: OneDriveファイルストレージのドキュメント
|
||||
drive_id: '%{drive_id_link_text} の手順に従って、目的のドライブからIDをコピーしてください。'
|
||||
integration: ワンドライブ
|
||||
missing_client_id_for_redirect_uri: OAuthの値を入力してURIを生成してください。
|
||||
integration: OneDrive
|
||||
missing_client_id_for_redirect_uri: OAuthの値を入力してURIを生成してください
|
||||
oauth_client_redirect_uri: この値を「リダイレクト URIs」にある新しい Web リダイレクト URI にコピーしてください。
|
||||
oauth_client_secret: Client 資格情報にアプリケーション クライアント シークレットがない場合は、新しいシークレットを作成してください。
|
||||
oauth_configuration: '%{application_link_text}、目的のアプリケーションからこれらの値をコピーします。'
|
||||
@@ -480,13 +480,13 @@ ja:
|
||||
login_button_aria_label: '%{storage} にログイン'
|
||||
login_button_label: "%{provider_type} ログイン"
|
||||
project_settings:
|
||||
description: プロジェクトフォルダにアクセスするには、 %{storage}にログインする必要があります。
|
||||
description: プロジェクトフォルダにアクセスするには、 %{storage} にログインする必要があります。
|
||||
requesting_access_to: '%{storage} へのアクセスをリクエストしています'
|
||||
storage_admin:
|
||||
description: このストレージにプロジェクトを追加するには、 %{provider_type}にログインする必要があります。ログインしてもう一度やり直してください。
|
||||
open_project_storage_modal:
|
||||
success:
|
||||
subtitle: リダイレクトされます
|
||||
subtitle: リダイレクトしています
|
||||
title: 連携のセットアップが完了しました
|
||||
timeout:
|
||||
link_text: ファイルストレージセットアップの状態の状態
|
||||
@@ -505,8 +505,8 @@ ja:
|
||||
subtitle_short: OpenProjectにプロジェクトごとにフォルダを自動的に作成させます。
|
||||
title: 自動的に管理されるプロジェクトフォルダ
|
||||
project_settings:
|
||||
edit: このプロジェクトのファイル・ストレージを編集する
|
||||
members_connection_status: メンバーの接続状況
|
||||
edit: このプロジェクトのファイルストレージを編集
|
||||
members_connection_status: 会員の接続状況
|
||||
new: このプロジェクトにファイルストレージを追加する
|
||||
project_storage_members:
|
||||
subtitle: 全プロジェクトメンバーのストレージ %{storage_name_link} の接続状態を確認する。
|
||||
@@ -517,14 +517,14 @@ ja:
|
||||
provider_types:
|
||||
label: プロバイダー・タイプ
|
||||
nextcloud:
|
||||
label_oauth_client_id: NextcloudのOAuthクライアントID
|
||||
label_oauth_client_secret: NextcloudOAuthクライアントシークレット
|
||||
label_oauth_client_id: Nextcloud OAuthクライアントID
|
||||
label_oauth_client_secret: Nextcloud OAuth クライアントシークレット
|
||||
name: ネクストクラウド
|
||||
name_placeholder: 例:ネクストクラウド
|
||||
one_drive:
|
||||
label_oauth_client_id: Azure OAuthアプリケーション(クライアント)ID
|
||||
label_oauth_client_id: Azure OAuth アプリケーション (クライアント) ID
|
||||
label_oauth_client_secret: Azure OAuth クライアントの秘密値
|
||||
name: ワンドライブ
|
||||
name: OneDrive
|
||||
name_placeholder: '例: OneDrive'
|
||||
sharepoint:
|
||||
drive_description: OpenProject access-managed document library
|
||||
@@ -534,18 +534,18 @@ ja:
|
||||
name_placeholder: 例:シェアポイント
|
||||
show_attachments_toggle:
|
||||
description: このオプションを無効にすると、作業パッケージのファイルタブの添付ファイルリストが非表示になります。ワークパッケージの説明に添付されたファイルは、内部添付ファイルストレージにアップロードされます。
|
||||
label: ワークパッケージのファイルタブに添付ファイルを表示
|
||||
label: ワークパッケージファイルタブに添付ファイルを表示
|
||||
storage_audience:
|
||||
documentation_intro: 以下のオプションと ID プロバイダの設定の詳細については、当社のドキュメントをお読みください。
|
||||
documentation_intro: アイデンティティプロバイダの以下のオプションと設定については、当社のドキュメントをお読みください。
|
||||
idp:
|
||||
helptext: OpenProjectは、ストレージへのリクエストを認証するために、ログイン時にIDプロバイダから受け取ったアクセストークンを使用します。別のトークンを取得しようとすることはありません。
|
||||
label: ユーザーログイン時に取得したアクセストークンを使用する
|
||||
helptext: OpenProjectはログイン中にIDプロバイダーが受け取ったアクセストークンを使用して、ストレージへのリクエストを認証します。 別のトークンを取得しようとしません。
|
||||
label: ログイン中に取得したアクセストークンを使用する
|
||||
manual:
|
||||
helptext: OpenProjectは、指定されたオーディエンスのIDプロバイダとトークンを交換します。
|
||||
helptext: OpenProject は、特定のオーディエンスの ID プロバイダーとトークンを交換します。
|
||||
label: Manually specify audience for which to exchange access token (Recommended)
|
||||
storage_list_blank_slate:
|
||||
description: ストレージを追加して、ここで見ることができる。
|
||||
heading: あなたはまだ倉庫を持っていない。
|
||||
description: ここにそれらを見るためにストレージを追加します。
|
||||
heading: まだストレージがありません。
|
||||
successful_storage_connection: ストレージが正常に接続されました! 使用する各プロジェクトの「プロジェクト」タブでストレージをアクティブにすることを忘れないでください。
|
||||
upsell:
|
||||
one_drive:
|
||||
|
||||
@@ -3,14 +3,14 @@ ja:
|
||||
js:
|
||||
storages:
|
||||
authentication_error: "%{storageType} での認証に失敗しました"
|
||||
link_files_in_storage: "リンクファイル %{storageType}"
|
||||
link_existing_files: "既存のファイルをリンク"
|
||||
upload_files: "ファイルのアップロード"
|
||||
link_files_in_storage: "%{storageType}のファイルをリンクする"
|
||||
link_existing_files: "既存のファイルをリンクする"
|
||||
upload_files: "ログファイル"
|
||||
drop_files: "ここにファイルをドロップして、 %{name} にアップロードします。"
|
||||
drop_or_click_files: "ここにファイルをドロップするか、クリックして %{name} にアップロードします。"
|
||||
login: "%{storageType} ログイン"
|
||||
login_to: "%{storageType}にログイン"
|
||||
no_connection: "%{storageType} 接続がありません"
|
||||
no_connection: "%{storageType} 接続なし"
|
||||
open_storage: "%{storageType} を開く"
|
||||
select_location: "場所を選択"
|
||||
choose_location: "場所を選ぶ"
|
||||
@@ -24,7 +24,7 @@ ja:
|
||||
authentication_error: "%{storageType} へのリクエストを認証できませんでした。これはエラーです。"
|
||||
connection_error: >
|
||||
%{storageType} の設定が一部機能していません。 %{storageType} 管理者にお問い合わせください。
|
||||
live_data_error: "ファイルの詳細の取得に失敗しました"
|
||||
live_data_error: "ファイル詳細の取得エラー"
|
||||
live_data_error_description: >
|
||||
一部の %{storageType} データを取得できませんでした。このページを再読み込みするか、 %{storageType} 管理者にお問い合わせください。
|
||||
no_file_links: "このワークパッケージにファイルをリンクするには、 %{storageType}を使用してください。"
|
||||
@@ -33,7 +33,7 @@ ja:
|
||||
suggest_logout: ログアウトしてログインし直すと、この問題が解決するかどうか試してみてください。
|
||||
suggest_relink: 以下のログインボタンからアカウントを再リンクすると、この問題が解決するかどうか試してみてください。
|
||||
files:
|
||||
already_existing_header: "このファイルはすでに存在する"
|
||||
already_existing_header: "このファイルは既に存在します"
|
||||
already_existing_body: >
|
||||
このファイルをアップロードしようとしている場所に、"%{fileName}"という名前のファイルがすでに存在します。どうしますか?
|
||||
directory_not_writeable: "このフォルダにファイルを追加する権限がありません。"
|
||||
@@ -41,7 +41,7 @@ ja:
|
||||
dragging_folder: "%{storageType} へのアップロードはフォルダをサポートしていません。"
|
||||
empty_folder: "このフォルダは空です。"
|
||||
empty_folder_location_hint: "下のボタンをクリックして、この場所にファイルをアップロードしてください。"
|
||||
file_not_selectable_location: "場所を選択する過程でファイルを選択することはできない。"
|
||||
file_not_selectable_location: "ファイルを選択することは、場所を選択する過程ではできません。"
|
||||
project_folder_no_access: >
|
||||
プロジェクトフォルダにアクセスできません。管理者に連絡してアクセス権を取得するか、別の場所にファイルをアップロードしてください。
|
||||
managed_project_folder_not_available: >
|
||||
@@ -79,9 +79,9 @@ ja:
|
||||
ファイル (%{fileName}) の容量がストレージ・クォータの許容量を超えています。管理者に連絡して、このクォータを変更してください。
|
||||
detail:
|
||||
nextcloud: >
|
||||
最新版のNextcloudアプリ「OpenProject Integration」がインストールされていることを確認し、管理者にお問い合わせください。
|
||||
Nextcloudアプリ「OpenProject統合」の最新バージョンがインストールされていることを確認し、詳細については管理者にお問い合わせください。
|
||||
link_uploaded_file_error: >
|
||||
最近アップロードされたファイル '%{fileName}' をワークパッケージ %{workPackageId}にリンクするエラーが発生しました。
|
||||
最近アップロードされたファイル '%{fileName}' をワークパッケージ %{workPackageId} にリンクしてエラーが発生しました。
|
||||
tooltip:
|
||||
not_logged_in: "このファイルにアクセスするには、ストレージにログインしてください。"
|
||||
view_not_allowed: "このファイルを閲覧する権限がありません。"
|
||||
|
||||
@@ -19,7 +19,7 @@ fr:
|
||||
today: 'Aujourd''hui'
|
||||
drag_here_to_remove: 'Faites glisser ici pour supprimer le responsable et les dates de début et de fin.'
|
||||
cannot_drag_here: 'Impossible de déplacer le lot de travail en raison de restrictions d''autorisation ou d''édition.'
|
||||
cannot_drag_to_non_working_day: 'Ce lot de travaux ne peut pas démarrer/terminer sur un jour non ouvré.'
|
||||
cannot_drag_to_non_working_day: 'Ce lot de travail ne peut pas démarrer/terminer sur un jour non ouvré.'
|
||||
quick_add:
|
||||
empty_state: 'Utilisez le champ de recherche pour trouver des lots de travaux et faites-les glisser vers le planificateur pour l''assigner à quelqu''un et définir des dates de début et de fin.'
|
||||
search_placeholder: 'Rechercher...'
|
||||
|
||||
@@ -178,7 +178,7 @@ ro:
|
||||
label_expiration_hint: "%{date} sau la deconectare"
|
||||
label_actions: "Acțiuni"
|
||||
label_confirmed: "Confirmat"
|
||||
button_continue: "Continuă"
|
||||
button_continue: "Continuaţi"
|
||||
button_make_default: "Marcați ca implicit"
|
||||
label_unverified_phone: "Telefonul mobil nu a fost încă verificat"
|
||||
notice_phone_number_format: "Te rog să introduci numărul în următorul format: +XX XXXXXXXX."
|
||||
|
||||
@@ -178,7 +178,7 @@ ru:
|
||||
label_expiration_hint: "%{date} или при выходе из системы"
|
||||
label_actions: "Действия"
|
||||
label_confirmed: "Подтвержден"
|
||||
button_continue: "Продолжить"
|
||||
button_continue: "Далее"
|
||||
button_make_default: "Задать по умолчанию"
|
||||
label_unverified_phone: "Сотовый телефон еще не подтвержден"
|
||||
notice_phone_number_format: "Введите номер в следующем формате: +XX XXXXXXXX."
|
||||
|
||||
@@ -119,7 +119,7 @@ uk:
|
||||
failed_to_delete: "Не вдалося видалити пристрій 2FA."
|
||||
is_default_cannot_delete: "Пристрій позначено як типовий і його не можна видалити через активну політику безпеки. Перед видаленням позначте інший пристрій як стандартний."
|
||||
not_existing: "Для вашого облікового запису не зареєстровано жодного пристрою 2FA."
|
||||
2fa_from_input: Введіть код, отриманий на пристрій %{device_name}, щоб підтвердити свою особу.
|
||||
2fa_from_input: Введіть код, що надійшов на пристрій %{device_name}, щоб підтвердити свою особу.
|
||||
2fa_from_webauthn: Укажіть пристрій WebAuthn <strong>%{device_name}</strong>. Якщо це USB-пристрій, переконайтеся, що його підключено, і торкніться його. Потім натисніть кнопку входу.
|
||||
webauthn:
|
||||
title: "WebAuthn"
|
||||
|
||||
@@ -16,6 +16,6 @@ Gem::Specification.new do |s|
|
||||
s.add_dependency "rotp", "~> 6.1"
|
||||
s.add_dependency "webauthn", "~> 3.0"
|
||||
|
||||
s.add_dependency "aws-sdk-sns", ">= 1.101", "< 1.112"
|
||||
s.add_dependency "aws-sdk-sns", ">= 1.101", "< 1.113"
|
||||
s.metadata["rubygems_mfa_required"] = "true"
|
||||
end
|
||||
|
||||
@@ -13,4 +13,4 @@ zh-CN:
|
||||
xls_with_relations: "带关系的 XLS"
|
||||
xls_export:
|
||||
child_of: 此项的子项
|
||||
parent_of: 此项的父级
|
||||
parent_of: 此项的父项
|
||||
|
||||
@@ -47,4 +47,18 @@ RSpec.describe Token::Base do
|
||||
expect(described_class.exists?(subject.id)).to be false
|
||||
expect(described_class.exists?(t2.id)).to be true
|
||||
end
|
||||
|
||||
context "when defining a prefix" do
|
||||
subject { subclass.new(user:) }
|
||||
|
||||
let(:subclass) { Class.new(described_class) { prefix :test } }
|
||||
|
||||
it "has a plaintext value starting with the prefix" do
|
||||
expect(subject.value).to start_with("test-")
|
||||
end
|
||||
|
||||
it "has the regular token value after the prefix" do
|
||||
expect(subject.value.delete_prefix("test-").length).to eq(64)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -225,6 +225,74 @@ RSpec.describe "API V3 Authentication" do
|
||||
end
|
||||
end
|
||||
|
||||
describe "API Key as Bearer token" do
|
||||
let(:token) { create(:api_token, user:) }
|
||||
let(:bearer_token) { token.plain_value }
|
||||
let(:expected_message) { "You did not provide the correct credentials." }
|
||||
|
||||
before do
|
||||
user
|
||||
|
||||
header "Authorization", "Bearer #{bearer_token}"
|
||||
|
||||
get resource
|
||||
end
|
||||
|
||||
context "with a valid access token" do
|
||||
it "authenticates successfully" do
|
||||
expect(last_response).to have_http_status :ok
|
||||
end
|
||||
end
|
||||
|
||||
context "with an invalid access token" do
|
||||
let(:bearer_token) { "opapi-1337" }
|
||||
let(:expected_www_auth_header) do
|
||||
%{Bearer realm="OpenProject API", #{resource_metadata}, scope="api_v3", error="invalid_token"}
|
||||
end
|
||||
|
||||
it "returns unauthorized" do
|
||||
expect(last_response).to have_http_status :unauthorized
|
||||
expect(last_response.header["WWW-Authenticate"]).to eq(expected_www_auth_header)
|
||||
expect(JSON.parse(last_response.body)).to eq(error_response_body)
|
||||
end
|
||||
end
|
||||
|
||||
context "when the token's user can't be found" do
|
||||
let(:expected_www_auth_header) do
|
||||
%{Bearer realm="OpenProject API", #{resource_metadata}, scope="api_v3", error="invalid_token"}
|
||||
end
|
||||
|
||||
around do |ex|
|
||||
# create the token before deleting the user; right now it especially works, because a foreign key constraint prevents
|
||||
# tokens without users
|
||||
token
|
||||
user.destroy!
|
||||
ex.run
|
||||
end
|
||||
|
||||
it "returns unauthorized" do
|
||||
expect(last_response).to have_http_status :unauthorized
|
||||
expect(last_response.header["WWW-Authenticate"]).to eq(expected_www_auth_header)
|
||||
expect(JSON.parse(last_response.body)).to eq(error_response_body)
|
||||
end
|
||||
end
|
||||
|
||||
context "when the token's user is locked" do
|
||||
let(:user) { create(:user, :locked) }
|
||||
let(:expected_www_auth_header) do
|
||||
"Bearer realm=\"OpenProject API\", #{resource_metadata}, scope=\"api_v3\", error=\"invalid_token\", " \
|
||||
"error_description=\"#{expected_error_description}\""
|
||||
end
|
||||
let(:expected_error_description) { "The user account is locked" }
|
||||
|
||||
it "returns unauthorized" do
|
||||
expect(last_response).to have_http_status :unauthorized
|
||||
expect(last_response.header["WWW-Authenticate"]).to eq(expected_www_auth_header)
|
||||
expect(JSON.parse(last_response.body)).to eq(error_response_body)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe "basic auth" do
|
||||
let(:expected_message) { "You need to be authenticated to access this resource." }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user