Merge branch 'dev' into merge-release/17.1-20260206041730

This commit is contained in:
Dombi Attila
2026-02-06 13:57:42 +02:00
99 changed files with 1188 additions and 949 deletions
+10
View File
@@ -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:
+1
View File
@@ -72,6 +72,7 @@ jobs:
samachon,
shiroginne,
toy,
tiroessler,
ulferts,
vonTronje,
vspielau,
+3 -1
View File
@@ -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 \
+1 -1
View File
@@ -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
+3 -1
View File
@@ -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
View File
@@ -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 -1
View File
@@ -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
+1 -1
View File
@@ -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
View File
@@ -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") },
+1
View File
@@ -30,5 +30,6 @@
module Token
class API < Named
prefix :opapi
end
end
+2
View File
@@ -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",
+2
View File
@@ -30,6 +30,8 @@
module Token
class Backup < HashedToken
prefix :opbk
def ready?
return false if created_at.nil?
+29 -14
View File
@@ -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
##
+1 -1
View File
@@ -53,7 +53,7 @@ module Token
class << self
def create_and_return_value(user)
create(user:).plain_value
create!(user:).plain_value
end
##
+2
View File
@@ -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
+4 -1
View File
@@ -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) },
+1 -1
View File
@@ -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
+3 -1
View File
@@ -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|
+25 -25
View File
@@ -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"
+14 -14
View File
@@ -85,11 +85,11 @@ de:
title: "Enterprise-Token hinzufügen"
type_token_text: "Enterprise-Token Text"
token_placeholder: "Enterprise-Token Text hier einfügen"
add_token: "Enterprise-Edition Support Token hochladen"
add_token: "Enterprise edition Support Token hochladen"
replace_token: "Aktuellen Enterprise edition Support Token ersetzen"
order: "Enterprise on-premises bestellen"
paste: "Enterprise-Edition Support Token hier einfügen"
required_for_feature: "Dieses Add-on ist nur mit einem aktiven Enterprise-Edition Support-Token verfügbar."
paste: "Enterprise edition Support Token hier einfügen"
required_for_feature: "Dieses Add-on ist nur mit einem aktiven Enterprise edition Support-Token verfügbar."
enterprise_link: "Klicken Sie hier für weitere Informationen."
start_trial: "Kostenlose Testversion starten"
book_now: "Jetzt buchen"
@@ -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:
+1 -1
View File
@@ -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."
+1 -1
View File
@@ -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).
+54 -53
View File
@@ -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クライアントは、OpenProjectSCIMサーバ APIと相互作用して、ユーザアカウントグループのプロビジョニング、更新、およびデプロビジョニングを行うことができます。"
label_create_button: "SCIMクライアント追加"
new:
title: "新しいSCIMクライアント"
revoke_static_token_dialog_component:
confirm_button: "取り消す"
title: "静的トークンの失効"
heading: "このトークンを本当に取り消しすか?"
description: "このトークンを使っている SCIM クライアントは、OpenProject の SCIM サーバ API にアクセスできなくなります。"
title: "静的トークンを取り消す"
heading: "このトークンを取り消してもよろしいですか?"
description: "このトークンを使用する SCIM クライアントは、OpenProject の SCIM サーバ API にアクセスできなくなります。"
table_component:
blank_slate:
title: "SCIMクライアントがまだ設定されていません"
@@ -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} を追加"
+1 -1
View File
@@ -104,7 +104,7 @@ ca:
button_save: "Desa"
button_settings: "Configuració"
button_uncheck_all: "Desmarca-ho tot"
button_update: "Actualitzar"
button_update: "Actualitza"
button_export-atom: "Descarregar Atom"
button_generate_pdf: "Generate PDF"
button_create: "Crear"
+4 -4
View File
@@ -138,7 +138,7 @@ de:
description_available_columns: "Verfügbare Spalten"
description_current_position: "Sie sind hier: "
description_select_work_package: "Arbeitspaket #%{id} auswählen"
description_subwork_package: "Unteraufgabe von Arbeitspaket #%{id}"
description_subwork_package: "Kind von Arbeitspaket #%{id}"
editor:
revisions: "Lokale Änderungen anzeigen"
no_revisions: "Keine lokalen Änderungen gefunden"
@@ -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"
+41 -41
View File
@@ -32,12 +32,12 @@ ja:
draggable_hint: |
埋め込み画像または添付ファイルをエディタにドラッグします。
ドラッグしつづけると閉じているエディタ領域が開きます。
quarantined_hint: "ウイルスが発見されたように、ファイルは隔離されています。ダウンロードできません。"
quarantined_hint: "ウイルスが発見されたため,ファイルは隔離されています。ダウンロードできません。"
autocomplete_ng_select:
add_tag: "アイテムを追加"
add_tag: "項目を追加"
clear_all: "すべてクリア"
loading: "読み込み中..."
not_found: "アイテムが見つかりません"
not_found: "見つかりませんでした"
type_to_search: "検索キーワードを入力"
autocomplete_select:
placeholder:
@@ -67,7 +67,7 @@ ja:
button_back_to_list_view: "リスト表示に戻る"
button_cancel: "キャンセル"
button_close: "閉じる"
button_change_project: "のプロジェクトに移"
button_change_project: "のプロジェクトに移"
button_check_all: "全てを選択"
button_configure-form: "フォームを設定"
button_confirm: "確認"
@@ -75,7 +75,7 @@ ja:
button_copy: "コピー"
button_copy_to_clipboard: "クリップボードにコピー"
button_copy_link_to_clipboard: "クリップボードにリンクをコピー"
button_copy_to_other_project: "別のプロジェクトで複製"
button_copy_to_other_project: "別のプロジェクトで複製する"
button_custom-fields: "カスタムフィールド"
button_delete: "削除"
button_delete_watcher: "ウォッチャーを削除"
@@ -97,7 +97,7 @@ ja:
button_open_fullscreen: "全画面表示を開く"
button_show_cards: "カードビュー表示"
button_show_list: "リストビュー表示"
button_show_table: "テーブルビューを表示"
button_show_table: "テーブル表示"
button_show_gantt: "ガントビューを表示"
button_show_fullscreen: "全画面表示"
button_more_actions: "その他の操作"
@@ -107,7 +107,7 @@ ja:
button_uncheck_all: "全てを選択解除"
button_update: "更新"
button_export-atom: "Atomをダウンロード"
button_generate_pdf: "PDFを生成"
button_generate_pdf: "PDF成"
button_create: "作成"
card:
add_new: "新規カード追加"
@@ -141,8 +141,8 @@ ja:
description_select_work_package: "ワークパッケージを選択 #%{id}"
description_subwork_package: "ワークパッケージの子 #%{id}"
editor:
revisions: "ローカルの変更を表示"
no_revisions: "ローカルの変更は見つかりませんでした"
revisions: "ローカルの修正を表示"
no_revisions: "ローカルでの修正は見つからず"
preview: "プレビューモードの切り替え"
source_code: "Markdown ソースモードの切り替え"
error_saving_failed: "次のエラーで文書を保存するのに失敗しました: %{error}"
@@ -155,7 +155,7 @@ ja:
attribute_reference:
macro_help_tooltip: "このテキストセグメントはマクロによって動的にレンダリングされています。"
not_found: "要求されたリソースが見つかりませんでした"
nested_macro: "このマクロは %{model} %{id} を再帰的に参照しています。"
nested_macro: "このマクロは %{model} %{id}を再帰的に参照してい。"
invalid_attribute: "選択した属性 '%{name}' は存在しません。"
child_pages:
button: "子ページへのリンク"
@@ -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: "URLiCalendarを使って外部クライアントでこのカレンダーを購読し、そこから最新のワークパッケージ情報をることができます。"
warning: "このURLを他のユーザーと共有しないでください。このリンクがあれば、誰でもアカウントやパスワードなしでワークパッケージの詳細をることができます。"
token_name_label: "どこで使うのですか?"
description: "URL(iCalendar)を使用して、外部クライアントでこのカレンダーを購読し、そこから最新の作業パッケージ情報を表示することができます。"
warning: "このURLを他のユーザーと共有しないでください。このリンクを持つ誰でもアカウントやパスワードなしでワークパッケージの詳細を表示することができます。"
token_name_label: "どこで使うのですか?"
token_name_placeholder: '名前を入力してください。例:"電話"'
token_name_description_text: 'If you subscribe to this calendar from multiple devices, this name will help you distinguish between them in your <a href="%{myAccessTokensUrl}" target="_blank">access tokens</a> list.'
copy_url_label: "URLをコピー"
ical_generation_error_text: "カレンダー URL生成にエラーが発生しました。"
success_message: 'URL "%{name}" は正常にクリップボードにコピーされました。サブスクリプションを完了するためにカレンダークライアントに貼り付けてください。'
ical_generation_error_text: "カレンダーURL生成にエラーが発生しました。"
success_message: 'URL "%{name}" クリップボードにコピーされました。カレンダークライアントに貼り付けて購読を完了してください。'
label_activate: "有効にする"
label_assignee: "担当者"
label_assignee_alt_text: "This work package is assigned to %{name}"
@@ -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}"
+1 -1
View File
@@ -104,7 +104,7 @@
button_save: "Lagre"
button_settings: "Innstillinger"
button_uncheck_all: "Avmerk alle"
button_update: "Oppdater"
button_update: "Oppdatèr"
button_export-atom: "Last ned Atom"
button_generate_pdf: "Generate PDF"
button_create: "Opprett"
+1 -1
View File
@@ -104,7 +104,7 @@ ro:
button_save: "Salvează"
button_settings: "Setări"
button_uncheck_all: "Deselectează tot"
button_update: "Actualizează"
button_update: "Actualizare"
button_export-atom: "Descarcă Atom"
button_generate_pdf: "Generează PDF"
button_create: "Creează"
+1 -1
View File
@@ -104,7 +104,7 @@ ru:
button_save: "Сохранить"
button_settings: "Настройки"
button_uncheck_all: "Снять все отметки"
button_update: "Обновить"
button_update: "Обновление"
button_export-atom: "Скачать Atom"
button_generate_pdf: "Создать PDF"
button_create: "Создать"
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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 추가 기능).
+1 -1
View File
@@ -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).
+2 -2
View File
@@ -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}"
+2 -2
View File
@@ -2403,8 +2403,8 @@ sl:
- "avgust"
- "september"
- "oktober"
- "november"
- "december"
- "November"
- "December"
order:
- :leto
- :mesec
+2 -2
View File
@@ -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: "Власне"
+1 -1
View File
@@ -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).
+2 -2
View File
@@ -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 演示项目
+7 -7
View File
@@ -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:
+5 -5
View File
@@ -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
View File
@@ -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
View File
@@ -1 +0,0 @@
OPENPROJECT_DOCKER_DEV_TLD=local
+1
View File
@@ -1 +1,2 @@
.env
docker-compose.override.yml
+2 -2
View File
@@ -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
View File
@@ -1 +0,0 @@
OPENPROJECT_DOCKER_DEV_TLD=local
+1
View File
@@ -1 +1,2 @@
.env
docker-compose.override.yml
+2 -2
View File
@@ -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
View File
@@ -1 +0,0 @@
OPENPROJECT_DOCKER_DEV_TLD=local
+1
View File
@@ -1 +1,2 @@
.env
docker-compose.override.yml
+2 -2
View File
@@ -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
View File
@@ -1 +0,0 @@
OPENPROJECT_DOCKER_DEV_TLD=local
+1
View File
@@ -1 +1,2 @@
.env
docker-compose.override.yml
+2 -2
View File
@@ -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
View File
@@ -1 +0,0 @@
OPENPROJECT_DOCKER_DEV_TLD=local
+1
View File
@@ -1 +1,2 @@
.env
docker-compose.override.yml
+1 -1
View File
@@ -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
View File
@@ -1 +0,0 @@
OPENPROJECT_DOCKER_DEV_TLD=local
+1 -1
View File
@@ -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
+10 -10
View File
@@ -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"
+30 -10
View File
@@ -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
+5 -5
View File
@@ -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.
![News setting for dark mode in OpenProject, displayed in dark mode](openproject-14-4-dark-mode.png)
@@ -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,
+73 -6
View File
@@ -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.
![Administration settings for real-time documents collaboration in OpenProject](openproject_system_guide_documents_real_time_collaboration_settings.png)
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.
Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

+390 -485
View File
File diff suppressed because it is too large Load Diff
+18 -18
View File
@@ -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",
+1 -1
View File
@@ -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:
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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: "否"
+102 -102
View File
@@ -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: NextcloudOpenProject統合設定
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: NextcloudOAuthクライアント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: 此项的父
+14
View File
@@ -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." }