diff --git a/app/components/work_packages/activities_tab/journals/item_component.html.erb b/app/components/work_packages/activities_tab/journals/item_component.html.erb
index 46e88201e3c8..7ea180f1a7ae 100644
--- a/app/components/work_packages/activities_tab/journals/item_component.html.erb
+++ b/app/components/work_packages/activities_tab/journals/item_component.html.erb
@@ -30,6 +30,16 @@
classes: "work-packages-activities-tab-journals-item-component--user-name ellipsis hidden-for-mobile") do
truncated_user_name(journal.user)
end
+ if journal.initial?
+ header_start_container.with_column(
+ mr: 1,
+ classes: "work-packages-activities-tab-journals-item-component-details--journal-type hidden-for-mobile"
+ ) do
+ render(Primer::Beta::Text.new(font_size: :small, color: :subtle, mt: 1)) do
+ I18n.t("activities.work_packages.activity_tab.created_on")
+ end
+ end
+ end
header_start_container.with_column(mr: 1, classes: "hidden-for-mobile") do
render(Primer::Beta::Text.new(font_size: :small, color: :subtle, mt: 1)) { format_time(journal.updated_at) }
end
diff --git a/app/controllers/work_packages/activities_tab_controller.rb b/app/controllers/work_packages/activities_tab_controller.rb
index cfe19ecc31c8..93ac7ba6cde9 100644
--- a/app/controllers/work_packages/activities_tab_controller.rb
+++ b/app/controllers/work_packages/activities_tab_controller.rb
@@ -106,28 +106,33 @@ def cancel_edit
end
def create
- call = create_journal_service_call
+ begin
+ call = create_journal_service_call
- if call.success? && call.result
- set_last_server_timestamp_to_headers
- handle_successful_create_call(call)
- else
- handle_failed_create_call(call) # errors should be rendered in the form
- @turbo_status = :bad_request
+ if call.success? && call.result
+ set_last_server_timestamp_to_headers
+ handle_successful_create_call(call)
+ else
+ handle_failed_create_or_update_call(call)
+ end
+ rescue StandardError => e
+ handle_internal_server_error(e)
end
respond_with_turbo_streams
end
def update
- call = Journals::UpdateService.new(model: @journal, user: User.current).call(
- notes: journal_params[:notes]
- )
+ begin
+ call = update_journal_service_call
- if call.success? && call.result
- update_item_show_component(journal: call.result, grouped_emoji_reactions: grouped_emoji_reactions_for_journal)
- else
- handle_failed_update_call(call)
+ if call.success? && call.result
+ update_item_show_component(journal: call.result, grouped_emoji_reactions: grouped_emoji_reactions_for_journal)
+ else
+ handle_failed_create_or_update_call(call)
+ end
+ rescue StandardError => e
+ handle_internal_server_error(e)
end
respond_with_turbo_streams
@@ -182,19 +187,11 @@ def respond_with_error(error_message)
# turbo_stream requests (tab is already rendered and an error occured in subsequent requests) are handled below
format.turbo_stream do
@turbo_status = :not_found
- render_error_banner_via_turbo_stream(error_message)
+ render_error_flash_message_via_turbo_stream(message: error_message)
end
end
end
- def render_error_banner_via_turbo_stream(error_message)
- update_via_turbo_stream(
- component: WorkPackages::ActivitiesTab::ErrorStreamComponent.new(
- error_message:
- )
- )
- end
-
def find_work_package
@work_package = WorkPackage.find(params[:work_package_id])
rescue ActiveRecord::RecordNotFound
@@ -259,22 +256,22 @@ def perform_update_streams_from_last_update_timestamp
end
end
- def handle_failed_create_call(call)
- update_via_turbo_stream(
- component: WorkPackages::ActivitiesTab::Journals::NewComponent.new(
- work_package: @work_package,
- journal: call.result,
- form_hidden_initially: false
- )
- )
- end
-
- def handle_failed_update_call(call)
+ def handle_failed_create_or_update_call(call)
@turbo_status = if call.errors&.first&.type == :error_unauthorized
:forbidden
else
:bad_request
end
+ render_error_flash_message_via_turbo_stream(
+ message: call.errors&.full_messages&.join(", ")
+ )
+ end
+
+ def handle_internal_server_error(error)
+ @turbo_status = :internal_server_error
+ render_error_flash_message_via_turbo_stream(
+ message: error.message
+ )
end
def replace_whole_tab
@@ -306,6 +303,12 @@ def create_journal_service_call
###
end
+ def update_journal_service_call
+ Journals::UpdateService.new(model: @journal, user: User.current).call(
+ notes: journal_params[:notes]
+ )
+ end
+
def generate_time_based_update_streams(last_update_timestamp)
journals = @work_package
.journals
diff --git a/config/locales/crowdin/de.yml b/config/locales/crowdin/de.yml
index 2ebedfaf51da..7f6bc565d25e 100644
--- a/config/locales/crowdin/de.yml
+++ b/config/locales/crowdin/de.yml
@@ -2815,9 +2815,9 @@ de:
notice_locking_conflict: "Die Informationen wurde zwischenzeitlich von einem anderen Benutzer geändert."
notice_locking_conflict_additional_information: "Die Änderung(en) wurde(n) durchgeführt von %{users}."
notice_locking_conflict_reload_page: "Bitte laden Sie die Seite neu, prüfen Sie die Anpassungen und geben Sie Ihre Änderungen noch einmal ein."
- notice_locking_conflict_warning: "This page has been updated by someone else. To not lose your edits, copy them locally and reload to view the updated version."
- notice_locking_conflict_danger: "Could not save your changes because of conflicting modifications. To not lose your edits, copy them locally and reload to view the updated version."
- notice_locking_conflict_action_button: "Discard changes and reload"
+ notice_locking_conflict_warning: "Diese Seite wurde von jemand anderem aktualisiert. Um Ihre Änderungen nicht zu verlieren, kopieren Sie sie lokal und laden Sie sie erneut, um die aktualisierte Version anzuzeigen."
+ notice_locking_conflict_danger: "Ihre Änderungen konnten wegen in Konflikt stehender Änderungen nicht gespeichert werden. Um Ihre Änderungen nicht zu verlieren, kopieren Sie sie lokal und laden Sie sie erneut, um die aktualisierte Version anzuzeigen."
+ notice_locking_conflict_action_button: "Änderungen verwerfen und neu laden"
notice_member_added: '%{name} zum Projekt hinzugefügt.'
notice_members_added: '%{number} Benutzer zum Projekt hinzugefügt.'
notice_member_removed: "%{user} aus dem Projekt entfernt."
diff --git a/config/locales/crowdin/js-ko.yml b/config/locales/crowdin/js-ko.yml
index 8cf7ed3b9857..ebedc5034d53 100644
--- a/config/locales/crowdin/js-ko.yml
+++ b/config/locales/crowdin/js-ko.yml
@@ -359,7 +359,7 @@ ko:
"15_0":
standard:
new_features_html: >
- The release brings various features and improvements for you, e.g.
- Boost your communication with a better structured Activity tab, real-time loading messages and notifications, emoji reactions, and more.
- Benefit from easy Single Sign-On authentication settings with SAML and OIDC in your Enterprise Cloud administration.
- Use the new 'Standard global role' and enable permissions to view email addresses.
- Enjoy easier navigation in project lists with quick action table headers.
- Experience simplified design settings with fewer sidebar design variables needed.
- Reduce manual cleanup when adding a custom field to a type – no more auto-applying to all projects.
- Benefit from improved navigation clarity – 'My account' is renamed to 'Account settings'.
+ 이 릴리즈는 다음과 같은 다양한 기능과 개선 사항을 제공합니다.
- 더욱 체계화된 활동 탭, 실시간 로딩 메시지 및 알림, 이모티콘 반응 등으로 커뮤니케이션을 강화합니다.
- Enterprise Cloud 관리에서 SAML 및 OIDC로 간편한 Single Sign-On 인증 설정의 장점을 누립니다.
- 새로운 '표준 글로벌 역할'을 사용하고 이메일 주소를 볼 수 있는 권한을 활성화합니다.
- 빠른 작업 테이블 헤더로 프로젝트 목록에서 더욱 쉽게 탐색합니다.
- 필요한 사이드바 디자인 변수가 더 적은 간소화된 디자인 설정을 이용합니다.
- 유형에 사용자 지정 필드를 추가할 때 수동 정리가 줄어듭니다. 더 이상 모든 프로젝트에 자동 적용되지 않습니다.
- 탐색의 명확성이 개선되었습니다. '내 계정'이 '계정 설정'으로 이름이 변경되었습니다.
ical_sharing_modal:
title: "캘린더 구독"
inital_setup_error_message: "데이터를 가져오는 중에 오류가 발생했습니다."
diff --git a/config/locales/crowdin/js-pt-BR.yml b/config/locales/crowdin/js-pt-BR.yml
index 9b4463d68952..1c0098f23b32 100644
--- a/config/locales/crowdin/js-pt-BR.yml
+++ b/config/locales/crowdin/js-pt-BR.yml
@@ -578,10 +578,10 @@ pt-BR:
wiki: "Na wiki, você pode documentar e compartilhar conhecimento junto com sua equipe. "
backlogs:
overview: "Gerencie seu trabalho na visão de backlogs."
- sprints: "À direita você encontra o backlog do produto e de erros, à esquerda você encontra os respectivos sprints. Aqui você pode criar épicos, histórias de usuário e bugs, priorizar através de arrastar e soltar e adicioná-los a um sprint."
- task_board_arrow: "Para ver o seu quadro de tarefas, abra o menu suspenso de sprint ... "
+ sprints: "À direita, você tem o backlog de produto e o backlog de erro, à esquerda, você tem as respectivas sprints. Aqui você pode criar épicos, user stories e erros, priorizar via arrastar e soltar e adicioná-los a uma sprint."
+ task_board_arrow: "Para ver o seu quadro de tarefas, abra o menu suspenso da sprint..."
task_board_select: "... e selecione a entrada do quadro de tarefas. "
- task_board: "O painel de tarefas visualiza o progresso deste sprint. Clique no ícone mais (+) ao lado de uma história de usuário para adicionar novas tarefas ou impedimentos.
A situação pode ser atualizada arrastando e soltando."
+ task_board: "O quadro de tarefas visualiza o progresso desta sprint. Clique no ícone de mais (+) ao lado de uma user story para adicionar novas tarefas ou impedimentos.
O status pode ser atualizado por arrastar e soltar."
boards:
overview: "Selecione quadros para mudar a visão e gerenciar seu projeto usando a exibição de quadros ágeis."
lists_kanban: "Aqui você pode criar várias listas (colunas) dentro do seu painel. Este recurso permite que você crie um Quadro Kanban, por exemplo."
diff --git a/config/locales/crowdin/js-ro.yml b/config/locales/crowdin/js-ro.yml
index 525ab07045aa..ea8bf5f859a3 100644
--- a/config/locales/crowdin/js-ro.yml
+++ b/config/locales/crowdin/js-ro.yml
@@ -97,7 +97,7 @@ ro:
button_show_table: "Afișați vizualizarea tabelului"
button_show_gantt: "Arată vizualizarea Gantt"
button_show_fullscreen: "Arată vizualizarea pe tot ecranul"
- button_more_actions: "Mai multe actiuni"
+ button_more_actions: "Mai multe acțiuni"
button_quote: "Citat"
button_save: "Salvează"
button_settings: "Setări"
@@ -239,7 +239,7 @@ ro:
upsale:
become_hero: "Deveniți un erou!"
enterprise_info_html: "%{feature_title} is an Enterprise add-on."
- upgrade_info: "Vă rugăm să treceți la un plan plătit pentru a-l activa și a începe să îl utilizați în echipa dumneavoastră."
+ upgrade_info: "Te rog să treci la un plan plătit pentru a-l activa și a începe să îl utilizezi în echipa ta."
benefits:
description: "Care sunt avantajele ediției Enterprise on-premise?"
high_security: "Caracteristici de securitate"
@@ -252,7 +252,7 @@ ro:
professional_support_text: "Beneficiați de asistență fiabilă, de înaltă calitate, din partea unor ingineri de asistență seniori cu cunoștințe de specialitate în ceea ce privește utilizarea OpenProject în medii critice pentru afaceri."
button_start_trial: "Începeți o încercare gratuită"
button_upgrade: "Actualizează acum"
- button_contact_us: "Contactați-ne pentru o demonstrație"
+ button_contact_us: "Contactează-ne pentru o demonstrație"
button_book_now: "Rezervă acum"
confidence: >
Oferim încrederea unui software de gestionare a proiectelor de clasă enterprise testat și susținut - cu Open Source și o minte deschisă.
@@ -351,14 +351,14 @@ ro:
homescreen:
blocks:
new_features:
- text_new_features: "Citiți despre noile caracteristici și actualizări de produse."
+ text_new_features: "Citește despre noile caracteristici și actualizări de produse."
learn_about: "Aflați mai multe despre noile caracteristici"
#Include the version to invalidate outdated translations in other locales.
#Otherwise, e.g. chinese might still have the translations for 10.0 in the 12.0 release.
"15_0":
standard:
new_features_html: >
- The release brings various features and improvements for you, e.g.
- Boost your communication with a better structured Activity tab, real-time loading messages and notifications, emoji reactions, and more.
- Benefit from easy Single Sign-On authentication settings with SAML and OIDC in your Enterprise Cloud administration.
- Use the new 'Standard global role' and enable permissions to view email addresses.
- Enjoy easier navigation in project lists with quick action table headers.
- Experience simplified design settings with fewer sidebar design variables needed.
- Reduce manual cleanup when adding a custom field to a type – no more auto-applying to all projects.
- Benefit from improved navigation clarity – 'My account' is renamed to 'Account settings'.
+ Versiunea aduce diverse caracteristici și îmbunătățiri pentru tine, de exemplu:
- Îmbunătățește-ți comunicarea cu o filă de activitate structurată mai bună, mesaje de încărcare și notificări în timp real, reacții emoji și multe altele.
- Beneficiază de setările de autentificare unice ușor cu SAML și OIDC în administrarea Enterprise Cloud (cloud).
- Utilizează noul 'rol global standard' și activează permisiunile pentru a vizualiza adresele de e-mail.
- Bucură-te de o navigare mai ușoară în listele de proiecte cu anteturi de masă cu acțiune rapidă.
- Experiență simplificată setările de design cu mai puține variabile de proiectare laterale.
- Redu curățarea manuală la adăugarea unui câmp personalizat la un tip – nu mai există auto-aplicare la toate proiectele.
- Beneficiază de o mai bună claritate a navigării – 'Contul meu' este redenumit în 'Setări cont'.
ical_sharing_modal:
title: "Subscribe to calendar"
inital_setup_error_message: "An error occured while fetching data."
@@ -372,14 +372,14 @@ ro:
success_message: 'The URL "%{name}" was successfully copied to your clipboard. Paste it in your calendar client to complete the subscription.'
label_activate: "Activare"
label_assignee: "Executant"
- label_add_column_after: "Adauga o coloana dupa"
- label_add_column_before: "Adauga o coloana inainte"
- label_add_columns: "Adaugați coloane"
+ label_add_column_after: "Adaugă coloană după"
+ label_add_column_before: "Adaugă coloană înainte"
+ label_add_columns: "Adaugă coloane"
label_add_comment: "Adăugare comentariu"
label_add_comment_title: "Comentează și tastează @ pentru a notifica alte persoane"
label_add_row_after: "Adauga un rand dupa"
label_add_row_before: "Adauga un rand inainte"
- label_add_selected_columns: "Adăugați coloanele selectate"
+ label_add_selected_columns: "Adaugă coloanele selectate"
label_added_by: "adăugat de"
label_added_time_by: 'Adăugat de %{author} acum %{age}'
label_ago: "zile în urmă"
@@ -425,7 +425,7 @@ ro:
label_expanded: "extins"
label_expand_all: "Extindere totală"
label_expand_project_menu: "Deschideți meniul proiectului"
- label_export: "Exportare"
+ label_export: "Exportă"
label_export_preparing: "Exportul este în curs de pregătire și va fi descărcat în curând."
label_favorites: "Favorite"
label_filename: "Fișier"
@@ -444,7 +444,7 @@ ro:
label_in_more_than: "în mai mult de"
label_incoming_emails: "E-mailuri primite"
label_information_plural: "Informații"
- label_invalid: "Nevalid"
+ label_invalid: "Invalid"
label_import: "Importă"
label_latest_activity: "Activitate recentă"
label_last_updated_on: "Ultima actualizare la data de"
@@ -486,8 +486,8 @@ ro:
label_recent: "Recente"
label_reset: "Resetare"
label_remove: "Eliminare"
- label_remove_column: "Elimina colana"
- label_remove_columns: "Eliminare coloane selectate"
+ label_remove_column: "Elimină coloana"
+ label_remove_columns: "Elimină coloane selectate"
label_remove_row: "Elimina rand"
label_report: "Raportare"
label_repository_plural: "Repo-uri"
@@ -516,7 +516,7 @@ ro:
label_time_entry_plural: "Timp consumat"
label_up: "Sus"
label_user_plural: "Utilizatori"
- label_activity_show_only_comments: "Afișați doar activitățile ce conțin comentarii"
+ label_activity_show_only_comments: "Arată doar activitățile cu comentarii"
label_activity_show_all: "Afișează toate activitățile"
label_total_progress: "%{percent} % Progres total"
label_total_amount: "Total: %{amount}"
@@ -544,8 +544,8 @@ ro:
label_attachments: Atașamente
label_drop_files: "Aruncați fișierele aici pentru a atașa fișiere."
label_drop_or_click_files: "Trage fișierele aici sau clic aici pentru a atașa."
- label_drop_folders_hint: Nu puteți încărca dosare ca atașament. Vă rugăm să selectați fișiere individuale.
- label_add_attachments: "Atașare fișiere"
+ label_drop_folders_hint: Nu poți încărca dosare ca atașament. Te rog selectează fișiere individuale.
+ label_add_attachments: "Atașează fișiere"
label_formattable_attachment_hint: "Atașați și legați fișiere prin plasarea în acest câmp sau prin lipirea din clipboard."
label_remove_file: "Ştergere %{fileName}"
label_remove_watcher: "Eliminare observator %{name}"
@@ -637,14 +637,14 @@ ro:
few: "și %{count} alții"
other: "și %{count} alții"
no_results:
- at_all: "Aici vor apărea notificări noi atunci când există o activitate care vă interesează."
+ at_all: "Aici vor apărea notificări noi atunci când există o activitate care te interesează."
with_current_filter: "Nu există notificări în această vizualizare în acest moment"
mark_all_read: "Marchează toate ca și citite"
mark_as_read: "Marchează ca Citit"
text_update_date_by: "%{date} de"
total_count_warning: "Se afișează %{newest_count} cele mai recente notificări. %{more_count} în plus nu sunt afișate."
empty_state:
- no_notification: "Se pare că v-ați pus la punct."
+ no_notification: "Se pare că ești cu toate la zi."
no_notification_with_current_project_filter: "Se pare că v-ați pus la punct cu proiectul selectat."
no_notification_with_current_filter: "Se pare că ești la zi cu filtrul %{filter}."
no_notification_for_filter: "Looks like you are all caught up for this filter."
@@ -653,16 +653,16 @@ ro:
message: "Există notificări noi."
link_text: "Click here to load them."
settings:
- change_notification_settings: 'Puteți modifica setările de notificare pentru a vă asigura că nu pierdeți niciodată o actualizare importantă.'
+ change_notification_settings: 'Poți modifica setările de notificare pentru a te asigura că nu pierzi niciodată o actualizare importantă.'
title: "Setări notificare"
- notify_me: "Anunta-ma"
+ notify_me: "Notifică-mă"
reminders:
no_notification: Nicio notificare
timeframes:
normal:
PT0S: în aceeași zi
- P1D: Cu 1 zi înainte
- P3D: Cu 3 zile înainte
+ P1D: cu 1 zi înainte
+ P3D: cu 3 zile înainte
P7D: ' cu o săptămână înainte '
overdue:
P1D: zilnic
@@ -671,7 +671,7 @@ ro:
reasons:
mentioned:
title: "Menţionat"
- description: "Primește o notificare de fiecare dată când cineva mă menționează oriunde"
+ description: "Primesc o notificare de fiecare dată când cineva mă menționează oriunde"
assignee: "Executant"
responsible: "Responsabil"
shared: "Partajat"
@@ -679,7 +679,7 @@ ro:
work_package_commented: "Toate comentariile noi"
work_package_created: "Pachete de lucru noi"
work_package_processed: "Toate modificările de stare"
- work_package_prioritized: "Toate modificările prioritare"
+ work_package_prioritized: "Toate modificările de prioritate"
work_package_scheduled: "Toate modificările dății"
global:
immediately:
@@ -710,7 +710,7 @@ ro:
placeholders:
default: "-"
subject: "Introduceţi subiectul aici"
- selection: "Vă rugăm să selectaţi"
+ selection: "Te rog selectează"
description: "Descriere: Clic pentru a edita..."
relation_description: "Clic pentru a adăuga o descriere pentru această relație"
project:
@@ -854,12 +854,12 @@ ro:
scheduling:
manual: "Programarea manuală"
sort:
- sorted_asc: "Sortare ascendentă aplicată "
- sorted_dsc: "Sortare descendentă aplicată "
+ sorted_asc: "Ordonare ascendentă aplicată, "
+ sorted_dsc: "Ordonare descendentă aplicată, "
sorted_no: "Nu a fost selectată nicio sortare "
sorting_disabled: "sortarea este dezactivată"
- activate_asc: "activați pentru a sorta ascendent"
- activate_dsc: "activați pentru a sorta descendent"
+ activate_asc: "activează pentru a ordona ascendent"
+ activate_dsc: "activează pentru a ordona descendent"
activate_no: "activați pentru a înlătura sortarea"
text_work_packages_destroy_confirmation: "Sunteți sigur că doriți ștergerea pachetelor de lucru selectate?"
text_query_destroy_confirmation: "Sunteți sigur că doriți să ștergeți vizualizarea selectată?"
@@ -1054,13 +1054,13 @@ ro:
configure_button: "Configurarea tabelului pachetului de lucru"
summary: "Tabel cu pachete de lucru pe rânduri şi câmpurile pachetelor pe coloane."
text_inline_edit: "Majoritatea celulelor din acest tabel sunt butoane care activează editarea \"inline\" a câmpului respectiv."
- text_sort_hint: "Cu link-urile din capul de tabel puteți sorta, grupa, reordona, elimina și adăuga coloane la tabel."
+ text_sort_hint: "Cu link-urile din capul de tabel poți sorta, grupa, reordona, elimina și adăuga coloane la tabel."
text_select_hint: "Casetele de selectare ar trebui să fie deschise cu 'ALT' si tastele săgeată."
table_configuration:
button: "Configurați acest tabel al pachetului de lucru"
choose_display_mode: "Afișare pachete de lucru din subproiecte pe pagina proiectului principal"
modal_title: "Configurația tabelului pachetului de lucru"
- embedded_tab_disabled: "Această filă de configurare nu este disponibilă pentru vizualizarea încorporată pe care o editați."
+ embedded_tab_disabled: "Această filă de configurare nu este disponibilă pentru vizualizarea încorporată pe care o editezi."
default: "implicit"
display_settings: "Setări afișare"
default_mode: "Listă"
@@ -1083,7 +1083,7 @@ ro:
automatic: "Automat"
manually: "Manual"
warning: "La activarea modului de sortare automată, veți pierde sortarea anterioară."
- columns_help_text: "Utilizați datele de mai sus pentru a adăuga sau elimina coloane în vizualizarea tabelului. Puteți glisa și plasa coloanele pentru a le reordona."
+ columns_help_text: "Utilizează datele de mai sus pentru a adăuga sau elimina coloane în vizualizarea tabelului. Poți glisa și plasa coloanele pentru a le reordona."
upsale:
attribute_highlighting: "Aveți nevoie ca anumite pachete de lucru să iasă în evidență?"
relation_columns: "Aveți nevoie să vedeți relațiile din lista pachetelor de lucru?"
@@ -1102,7 +1102,7 @@ ro:
months: "luni"
toolbar:
settings:
- configure_view: "Configurați vizualizarea"
+ configure_view: "Configurează vizualizarea"
columns: "Coloane"
sort_by: "Sortare după"
group_by: "Grupare după"
@@ -1112,7 +1112,7 @@ ro:
hide_sums: "Ascundere totaluri"
save: "Salvează"
save_as: "Salvează ca"
- export: "Exportare"
+ export: "Exportă"
visibility_settings: "Setări vizibilitate"
share_calendar: "Subscribe to calendar"
page_settings: "Redenumire"
@@ -1222,14 +1222,14 @@ ro:
invite_principal_to_project: "Invitați %{principal} la %{project}"
project:
label: "Proiect"
- required: "Te rog să selectezi un proiect"
- lacking_permission: "Te rog să selectezi un alt proiect, deoarece nu ai permisiuni pentru a atribui utilizatori la cel selectat în prezent."
+ required: "Te rog selectează un proiect"
+ lacking_permission: "Te rog selectează un alt proiect, deoarece nu ai permisiuni pentru a atribui utilizatori la cel selectat în prezent."
lacking_permission_info: "Nu aveți permisiunea de a atribui utilizatori la proiectul în care vă aflați în prezent. Trebuie să selectați un alt proiect."
next_button: "Înainte"
no_results: "Nu au fost găsite proiecte"
no_invite_rights: "Nu aveți voie să invitați membri în acest proiect"
type:
- required: "Te rog să selectezi tipul de invitat"
+ required: "Te rog selectează tipul de invitat"
user:
title: "Utilizator"
description: "Permisiuni bazate pe rolul atribuit în proiectul selectat"
@@ -1253,15 +1253,15 @@ ro:
no_results_group: "Nu au fost găsite grupuri"
next_button: "Înainte"
required:
- user: "Te rog să selectezi un utilizator"
- placeholder: "Te rog să selectezi un substituent"
- group: "Te rog să selectezi un grup"
+ user: "Te rog selectează un utilizator"
+ placeholder: "Te rog selectează un substituent"
+ group: "Te rog selectează un grup"
role:
label: "Rolul în %{project}"
no_roles_found: "Nu au fost găsite roluri"
description: >-
This is the role that the user will receive when they join your project. Rolul definește acțiunile pe care utilizatorul are voie să le întreprindă și informațiile pe care le poate vedea. Aflați mai multe despre roluri și permisiuni.
- required: "Te rog să selectezi un rol"
+ required: "Te rog selectează un rol"
next_button: "Înainte"
message:
label: "Mesaj invitație"
diff --git a/config/locales/crowdin/js-ru.yml b/config/locales/crowdin/js-ru.yml
index b9cfe6bb1823..fd686bbcc08f 100644
--- a/config/locales/crowdin/js-ru.yml
+++ b/config/locales/crowdin/js-ru.yml
@@ -358,7 +358,7 @@ ru:
"15_0":
standard:
new_features_html: >
- The release brings various features and improvements for you, e.g.
- Boost your communication with a better structured Activity tab, real-time loading messages and notifications, emoji reactions, and more.
- Benefit from easy Single Sign-On authentication settings with SAML and OIDC in your Enterprise Cloud administration.
- Use the new 'Standard global role' and enable permissions to view email addresses.
- Enjoy easier navigation in project lists with quick action table headers.
- Experience simplified design settings with fewer sidebar design variables needed.
- Reduce manual cleanup when adding a custom field to a type – no more auto-applying to all projects.
- Benefit from improved navigation clarity – 'My account' is renamed to 'Account settings'.
+ Релиз содержит новые возможности и различные улучшения, такие как,
. - Повысьте эффективность общения благодаря более структурированной вкладке "Активность", загрузке сообщений и уведомлений в режиме реального времени, реакциям emoji и многому другому.
- Воспользуйтесь простыми настройками аутентификации Single Sign-On с помощью SAML и OIDC при администрировании Enterprise Cloud.
- Используйте новую "Стандартную глобальную роль" и включите разрешения на просмотр адресов электронной почты.
- Наслаждайтесь более удобной навигацией в списках проектов с помощью быстрых действий заголовков таблиц.
- Упрощенные настройки оформления боковой панели с меньшим количеством необходимых переменных.
- Сократите ручную очистку при добавлении пользовательского поля к типу - больше не нужно автоматически применять его ко всем проектам.
- Воспользуйтесь улучшенной ясностью навигации - "Мой аккаунт" переименован в "Настройки аккаунта".
ical_sharing_modal:
title: "Подписаться на календарь"
inital_setup_error_message: "Произошла ошибка при получении данных."
diff --git a/config/locales/crowdin/js-tr.yml b/config/locales/crowdin/js-tr.yml
index e30c0e9362fc..a906f935490a 100644
--- a/config/locales/crowdin/js-tr.yml
+++ b/config/locales/crowdin/js-tr.yml
@@ -728,7 +728,7 @@ tr:
settings:
daily:
add_time: "Süre ekle"
- enable: "Günlük email hatırlatıcılarını etkinleştir"
+ enable: "Günlük e-posta hatırlatıcılarını etkinleştir"
explanation: "Bu hatırlatıcıları yalnızca okunmamış bildirimler için ve yalnızca sizin belirlediğiniz saatlerde alacaksınız. %{no_time_zone}"
no_time_zone: "Hesabınız için bir saat dilimi yapılandırana kadar, saatler UTC olarak yorumlanacaktır."
time_label: "Zaman %{counter}:"
@@ -750,9 +750,9 @@ tr:
wiki_page_updated: "Viki sayfası güncellendi"
membership_added: "Üyelik eklendi"
membership_updated: "Üyelik güncellendi"
- title: "Email hatırlatıcıları"
+ title: "E-posta hatırlatıcıları"
pause:
- label: "Email hatırlatıcılarını geçici olarak durdur"
+ label: "E-posta hatırlatıcılarını geçici olarak durdur"
first_day: "İlk gün"
last_day: "Son gün"
text_are_you_sure: "Emin misiniz?"
diff --git a/config/locales/crowdin/js-zh-TW.yml b/config/locales/crowdin/js-zh-TW.yml
index 07ca88c02664..2c7b05c2ec32 100644
--- a/config/locales/crowdin/js-zh-TW.yml
+++ b/config/locales/crowdin/js-zh-TW.yml
@@ -387,7 +387,7 @@ zh-TW:
label_all_work_packages: "所有工作項目"
label_and: "和"
label_ascending: "昇冪"
- label_author: "作者: %{user}"
+ label_author: "工作項目發起者: %{user}"
label_avatar: "大頭貼"
label_between: "介於"
label_board: "面板"
@@ -967,7 +967,7 @@ zh-TW:
other: "其他"
properties:
assignee: "執行者"
- author: "作者"
+ author: "工作項目發起者"
createdAt: "建立於"
description: "敘述"
date: "日期"
diff --git a/config/locales/crowdin/ko.yml b/config/locales/crowdin/ko.yml
index d39efd439be4..04aea9ec3a55 100644
--- a/config/locales/crowdin/ko.yml
+++ b/config/locales/crowdin/ko.yml
@@ -26,20 +26,20 @@ ko:
no_results_title_text: 이 시간 프레임 내에서 프로젝트에 대한 활동이 없습니다.
work_packages:
activity_tab:
- no_results_title_text: No activity to display
- no_results_description_text: "Choose \"Show everything\" to show all activity and comments"
- label_activity_show_all: "Show everything"
- label_activity_show_only_comments: "Show comments only"
- label_activity_show_only_changes: "Show changes only"
- label_sort_asc: "Newest at the bottom"
- label_sort_desc: "Newest on top"
- label_type_to_comment: "Type here to comment"
- label_submit_comment: "Submit comment"
- changed_on: "changed on"
- created_on: "created this on"
- changed: "changed"
- created: "created"
- commented: "commented"
+ no_results_title_text: 표시할 활동 없음
+ no_results_description_text: "모든 활동과 코멘트를 표시하려면 '모두 표시'를 선택합니다"
+ label_activity_show_all: "모두 표시"
+ label_activity_show_only_comments: "코멘트만 표시"
+ label_activity_show_only_changes: "변경 사항만 표시"
+ label_sort_asc: "오래된 순"
+ label_sort_desc: "최신 순"
+ label_type_to_comment: "코멘트를 작성하려면 여기에 입력하세요"
+ label_submit_comment: "코멘트 제출"
+ changed_on: "- 변경함:"
+ created_on: "- 이 패키지를 생성함:"
+ changed: "- 변경함"
+ created: "- 생성함"
+ commented: "- 코멘트 작성함"
admin:
plugins:
no_results_title_text: 현재 설치된 플러그인이 없습니다.
@@ -221,20 +221,20 @@ ko:
heading: 모든 프로젝트용
description: '"모든 프로젝트용" 옵션이 선택되었으므로 모든 프로젝트에서 이 사용자 지정 필드가 활성화되었습니다. 개별 프로젝트에 대해 비활성화할 수 없습니다.'
items:
- actions: "Item actions"
+ actions: "항목 작업"
blankslate:
title: "항목 목록이 비어 있습니다"
description: "먼저 유형 계층의 사용자 지정 필드에 항목을 추가하여 시작하세요. 각 항목을 사용하여 그 아래에 계층을 만들 수 있습니다. 계층 내에서 하위 항목을 탐색하고 만들려면 생성된 항목을 클릭하세요."
placeholder:
- label: "Item label"
- short: "Short name"
+ label: "항목 레이블"
+ short: "짧은 이름"
notice:
remember_items_and_projects: "이 사용자 지정 필드의 각 탭에서 항목과 프로젝트를 설정해야 합니다."
hierarchy:
subitems:
- zero: no sub-items
- one: 1 sub-item
- other: "%{count} sub-items"
+ zero: 하위 항목 없음
+ one: 하위 항목 1개
+ other: "하위 항목 %{count}개"
text_add_new_custom_field: >
프로젝트에 새 사용자 지정 필드를 추가하려면 먼저 해당 필드를 만들어야 합니다. 그래야 이 프로젝트에 해당 필드를 추가할 수 있습니다.
is_enabled_globally: "는 세계적으로 사용 가능합니다."
@@ -247,7 +247,7 @@ ko:
is_required: "사용자 지정 필드를 필수로 표시합니다. 이렇게 하면 새 리소스를 생성하거나 기존 리소스를 업데이트할 때 이 필드를 반드시 입력해야 합니다."
is_required_for_project: "이 특성을 활성화하려면 선택하고 모든 프로젝트에서 필수로 지정하세요. 개별 프로젝트에 대해 비활성화할 수는 없습니다."
is_for_all: "모든 기존 프로젝트와 새 프로젝트에서 사용자 지정 필드를 사용 가능으로 표시합니다."
- multi_select: "Allows the user to assign multiple values to this custom field."
+ multi_select: "사용자가 이 사용자 지정 필드에 여러 값을 할당할 수 있도록 허용합니다."
searchable: "글로벌 검색 기능을 사용할 때 필드 값을 포함합니다."
searchable_for_project: "프로젝트 목록에서 이 특성을 필터로 사용 가능하게 설정하려면 선택하세요."
editable: "사용자가 필드를 편집할 수 있도록 허용합니다."
@@ -263,8 +263,8 @@ ko:
errors:
rules:
label:
- filled?: "must be filled"
- not_unique: "must be unique within the same hierarchy level"
+ filled?: "- 입력해야 합니다"
+ not_unique: "- 동일한 계층 수준 내에서 고유해야 합니다"
rules:
label: "레이블"
global_search:
@@ -495,13 +495,13 @@ ko:
이 우선 순위 색상을 할당하거나 변경하려면 클릭하세요.
테이블의 작업 패키지를 강조 표시하는 데 사용할 수 있습니다.
reactions:
- action_title: "React"
- add_reaction: "Add reaction"
- react_with: "React with %{reaction}"
- and_user: "and %{user}"
+ action_title: "반응"
+ add_reaction: "반응 추가"
+ react_with: "%{reaction}(으)로 반응"
+ and_user: "및 %{user}"
and_others:
- other: and %{count} others
- reaction_by: "%{reaction} by"
+ other: 외 %{count}건
+ reaction_by: "%{reaction} -"
reportings:
index:
no_results_title_text: 상태 보고가 없습니다.
@@ -512,14 +512,14 @@ ko:
이 상태 색상을 할당하거나 변경하려면 클릭하세요.
상태 버튼에 표시되고 테이블의 작업 패키지를 강조 표시하는 데 사용할 수 있습니다.
status_default_text: |-
- New work packages are by default set to this type. They cannot be read-only.
+ 새 작업 패키지는 기본적으로 이 유형으로 설정됩니다. 읽기 전용으로 설정할 수 없습니다.
status_excluded_from_totals_text: |-
계층의 총 작업, 남은 작업 및 완료 %에서 이 상태의 작업 패키지를
제외하려면 이 옵션을 선택하세요.
status_percent_complete_text: |-
- In status-based progress calculation mode, the % Complete of a work
- package is automatically set to this value when this status is selected.
- Ignored in work-based mode.
+ 상태 기반 진행률 계산 모드에서, 이 상태를 선택하면 작업
+ 패키지의 완료 %가 자동으로 이 값으로 설정됩니다.
+ 작업 기반 모드에서는 무시됩니다.
status_readonly_html: |
이 상태를 읽기 전용으로 작업 패키지에 표시하려면 이 옵션을 선택합니다. 상태를 제외하고 특성은 변경할 수 없습니다.
@@ -883,12 +883,12 @@ ko:
not_available: "- 시스템 구성으로 인해 사용 가능하지 않습니다."
not_deletable: "- 삭제할 수 없습니다."
not_current_user: "은(는) 현재 유효한 사용자가 아닙니다."
- not_found: "not found."
+ not_found: "- 찾을 수 없습니다."
not_a_date: "은(는) 유효한 날짜가 아닙니다."
not_a_datetime: "은(는) 유효한 날짜가 아닙니다."
not_a_number: "은(는) 숫자가 아닙니다."
not_allowed: "- 사용 권한이 없어 유효하지 않습니다."
- not_json: "is not a valid JSON object."
+ not_json: "- 유효한 JSON 개체가 아닙니다."
not_an_integer: "은(는) 정수가 아닙니다."
not_an_iso_date: "은(는) 유효한 날짜가 아닙니다. 필요한 형식: YYYY-MM-DD."
not_same_project: "은(는) 동일한 프로젝트에 속하지 않습니다."
@@ -2391,7 +2391,7 @@ ko:
label_relation_new: "새 관계"
label_release_notes: "릴리스 노트"
label_remaining_work: "남은 작업"
- label_remove_column: "Remove column"
+ label_remove_column: "열 제거"
label_remove_columns: "선택된 열 제거"
label_renamed: "이름 변경됨"
label_reply_plural: "회신"
@@ -2432,10 +2432,10 @@ ko:
label_show_completed_versions: "완료된 버전 표시"
label_columns: "열"
label_sort: "분류"
- label_sort_ascending: "Sort ascending"
+ label_sort_ascending: "오름차순 정렬"
label_sort_by: "%{value}(으)로 정렬"
label_sorted_by: "%{value}(으)로 정렬됨"
- label_sort_descending: "Sort descending"
+ label_sort_descending: "내림차순 정렬"
label_sort_higher: "위로 이동"
label_sort_highest: "맨 위로 이동"
label_sort_lower: "아래로 이동"
@@ -2784,9 +2784,9 @@ ko:
notice_locking_conflict: "그 사이에 정보가 한 명 이상의 다른 사용자에 의해 업데이트되었습니다."
notice_locking_conflict_additional_information: "%{users}의 업데이트입니다."
notice_locking_conflict_reload_page: "페이지를 다시 로드하고, 변경 사항을 검토하고, 업데이트를 다시 적용하세요."
- notice_locking_conflict_warning: "This page has been updated by someone else. To not lose your edits, copy them locally and reload to view the updated version."
- notice_locking_conflict_danger: "Could not save your changes because of conflicting modifications. To not lose your edits, copy them locally and reload to view the updated version."
- notice_locking_conflict_action_button: "Discard changes and reload"
+ notice_locking_conflict_warning: "이 페이지는 다른 사용자에 의해 업데이트되었습니다. 편집 사항을 손실하지 않으려면 로컬로 복사한 후 다시 로드하여 업데이트된 버전을 보세요."
+ notice_locking_conflict_danger: "수정 사항이 충돌하므로 변경 사항을 저장할 수 없습니다. 편집 사항이 손실되지 않게 하려면 로컬로 복사한 후 다시 로드하여 업데이트된 버전을 보세요."
+ notice_locking_conflict_action_button: "변경 사항 취소 및 다시 로드"
notice_member_added: '%{name} 이(가) 프로젝트에 추가 됨'
notice_members_added: '%{number}명의 사용자가 프로젝트에 추가되었습니다.'
notice_member_removed: "프로젝트에서 %{user} 사용자가 제거됨."
@@ -3253,7 +3253,7 @@ ko:
authentication:
single_sign_on: "Single Sign-On"
omniauth_direct_login_hint_html: >
- If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path}
login page.
+ 이 옵션이 활성화된 경우, 로그인 요청은 구성된 omniauth 공급자로 리디렉션됩니다. 로그인 드롭다운 및 로그인 페이지가 비활성화됩니다.
참고: 또한 암호 로그인을 비활성화하지 않는 경우에는 이 옵션이 활성화된 상태에서 사용자가 %{internal_path}
로그인 페이지를 방문하여 내부에서 계속 로그인할 수 있습니다.
attachments:
whitelist_text_html: >
업로드된 파일의 유효한 파일 확장명 및/또는 MIME 형식 목록을 정의합니다.
파일 확장명(예: %{ext_example}
) 또는 MIME 형식(예: %{mime_example}
)을 입력합니다.
모든 파일 형식을 업로드할 수 있도록 허용하려면 비워 둡니다. 여러 값이 허용됩니다(각 값에 대해 한 줄).
diff --git a/config/locales/crowdin/pt-BR.seeders.yml b/config/locales/crowdin/pt-BR.seeders.yml
index a6c34b79ba19..facd6129f279 100644
--- a/config/locales/crowdin/pt-BR.seeders.yml
+++ b/config/locales/crowdin/pt-BR.seeders.yml
@@ -109,7 +109,7 @@ pt-BR:
name: Painel básico
lists:
item_0:
- name: Lista de Desejo
+ name: Lista de desejos
item_1:
name: Lista curta
item_2:
@@ -122,26 +122,26 @@ pt-BR:
widgets:
item_0:
options:
- name: Bem-vindo
+ name: Boas-vindas
item_1:
options:
- name: Primeiros passos
+ name: Guia de introdução
text: |
- Estamos felizes por você ter se juntado a nós! Sugerimos que você experimente algumas coisas para começar a usar o OpenProject.
+ Estamos felizes que você tenha se juntado a nós! Aqui estão algumas sugestões para começar a usar o OpenProject.
- Descubra os recursos mais importantes com nosso [Guided Tour] ({{opSetting:base_url}}/projects/demo-project/work_packages/?start_onboarding_tour=true).
+ Descubra os principais recursos com o nosso [Tour Guiado]({{opSetting:base_url}}/projects/demo-project/work_packages/?start_onboarding_tour=true).
- _Tente as seguintes etapas:_
+ Tente as seguintes etapas:
- 1. *Convide novos membros para seu projeto*: → Vá para [Members]({{opSetting:base_url}}/projects/demo-project/members) na navegação do projeto.
- 2. *Ver o trabalho em seu projeto*: → Vá para [Work packages]({{opSetting:base_url}}/projects/demo-project/work_packages) na navegação do projeto.
- 3. *Crie um novo pacote de trabalho*: → Vá para [Work packages → Create]({{opSetting:base_url}}/projects/demo-project/work_packages/new).
- 4. *Crie e atualize um plano de projeto*: → Vá para [Plano de projeto]({{opSetting:base_url}}/projects/demo-project/work_packages?query_id=##query.id:demo_project__query__project_plan) na navegação do projeto.
- 5. *Ativar outros módulos*: → Vá para [Project settings → Modules]({{opSetting:base_url}}}/projects/demo-project/settings/modules).
- 6. *Conclua suas tarefas no projeto*: → Vá para [Work packages → Tasks]({{opSetting:base_url}}/projects/demo-project/work_packages/details/##wp.id:set_date_and_location_of_conference/overview?query_id=##query.id:demo_project__query__tasks).
+ 1. *Convide novos membros para o seu projeto*: → Vá para [Membros]({{opSetting:base_url}}/projects/demo-project/members) na navegação do projeto.
+ 2. *Veja as tarefas do seu projeto*: → Vá para [Pacotes de trabalho]({{opSetting:base_url}}/projects/demo-project/work_packages) na navegação do projeto.
+ 3. *Crie um novo pacote de trabalho*: → Vá para [Pacotes de trabalho → Criar]({{opSetting:base_url}}/projects/demo-project/work_packages/new).
+ 4. *Crie e atualize o plano do projeto*: → Vá para [Plano de projeto]({{opSetting:base_url}}/projects/demo-project/work_packages?query_id=##query.id:demo_project__query__project_plan) na navegação do projeto.
+ 5. *Ative módulos adicionais*: → Vá para [Configurações do projeto → Módulos]({{opSetting:base_url}}/projects/demo-project/settings/modules).
+ 6. *Conclua suas tarefas no projeto*: → Vá para [Pacotes de trabalho → Tarefas]({{opSetting:base_url}}/projects/demo-project/work_packages/details/##wp.id:set_date_and_location_of_conference/overview?query_id=##query.id:demo_project__query__tasks).
- Aqui você encontrará nossos [User Guides] (https://www.openproject.org/docs/user-guide/).
- Entre em contato conosco se tiver alguma dúvida ou precisar de suporte. Entre em contato conosco: [support[at]openproject.com](mailto:support@openproject.com).
+ Aqui você encontra nossos Guias do usuário.
+ Se tiver alguma dúvida ou precisar de ajuda, entre em contato conosco: [support[at]openproject.com](mailto:support@openproject.com).
item_5:
options:
name: Pacotes de trabalho
@@ -170,7 +170,7 @@ pt-BR:
item_2:
subject: Conferência
item_3:
- subject: Acompanhamento das tarefas
+ subject: Tarefas de acompanhamento
children:
item_0:
subject: Fazer upload de apresentações para o site
@@ -200,76 +200,74 @@ pt-BR:
Mais informações: [https://www.openproject.org/docs/user-guide/wiki/](https://www.openproject.org/docs/user-guide/wiki/)
scrum-project:
name: Projeto Scrum
- status_explanation: Todas as tarefas estão dentro do cronograma. As pessoas envolvidas conhecem suas tarefas. O sistema está completamente configurado.
- description: Este é um breve resumo dos objetivos deste projeto de demonstração do Scrum.
+ status_explanation: Todas as tarefas estão dentro do cronograma, e os envolvidos conhecem suas atribuições. O sistema está completamente configurado.
+ description: Este é um resumo dos objetivos deste projeto Scrum de demonstração.
news:
item_0:
- title: Bem-vindo ao seu projeto de demonstração do Scrum
+ title: Boas-vindas ao seu projeto de demonstração do Scrum
summary: |
- Estamos felizes por você ter se juntado a nós.
- Neste módulo, você pode comunicar as novidades do projeto aos membros da sua equipe.
+ Estamos felizes que você tenha se juntado a nós.
+ Neste módulo, você pode compartilhar as atualizações do projeto com os membros da sua equipe.
versions:
item_0:
- name: Registro de erros e pendências
+ name: Backlog de Bugs
item_1:
- name: Erros e Pendências do Produto
+ name: Backlog de produtos
item_2:
name: Sprint 1
wiki:
title: Sprint 1
content: |
- ### A reunião de planejamento do Sprint
+ Reunião de Planejamento da Sprint
- _Por favor, documente aqui tópicos para a reunião de planejamento do Sprint_
+ _Documente aqui os tópicos para a reunião de planejamento da Sprint
- * Caixa de Tempo (8 h)
- * Entrada: Backlog do Produto
- * Saída: Rendimento da Sprint
+ * Tempo limitado (8 h)
+ * Entrada: Backlog do produto
+ * Saída: Backlog da Sprint
- * Divida em duas caixas de tempo adicionais de 4 h:
+ * Dividido em dois blocos de tempo adicionais de 4 h:
- * O proprietário do produto apresenta o [Backlog]({{opSetting:base_url}}/projects/your-scrum-project/backlogs) e as prioridades da equipe e explica a meta do Sprint, com o qual a equipa deve concordar. Juntos, eles priorizam os tópicos do Backlog do produto que a equipe cuidará no próximo sprint. A equipe se compromete com a entrega discutida.
- * A equipe planeja autonomamente (sem o Proprietário do Produto) em detalhes e divide as tarefas dos requisitos discutidos para consolidar um [Backlog do Sprint]({{opSetting:base_url}}/projects/your-scrum-project/backlogs).
+ * O proprietário do produto apresenta o [Backlog do produto]({{opSetting:base_url}}/projects/your-scrum-project/backlogs) e as prioridades para a equipe, explicando o Objetivo da Sprint, ao qual a equipe deve concordar. Juntos, priorizam os tópicos do Backlog do produto que a equipe irá cuidar na próxima sprint. A equipe se compromete com a entrega discutida.
+ * A equipe planeja de forma autônoma (sem o proprietário do produto) em detalhes e divide as tarefas dos requisitos discutidos para consolidar um [Backlog da sprint]({{opSetting:base_url}}/projects/your-scrum-project/backlogs).
+ Reunião do Daily Scrum
- ### Reunião diária do Scrum
+ _Documente aqui os tópicos para a reunião diária de Scrum
- _Por favor, documente aqui tópicos para a reunião do Scrum Diário_
+ * Reunião curta de status diário da equipe.
+ * Tempo limitado (máx. 15 min).
+ * Reunião diária para discutir os seguintes tópicos do [Quadro de tarefas](##sprint:scrum_project__version__sprint_1).
+ *O que planejo fazer até o próximo Daily Scrum?
+ *O que bloqueou meu trabalho (Impedimentos)?
+ * O Scrum Master modera e anota os [Impedimentos da Sprint](##sprint:scrum_project__version__sprint_1).
+ * O proprietário do produto pode participar para se manter informado.
- * Reunião de status curta e diária da equipe.
- * Tempo em caixa de tempo (máx. 15 min).
- * Realização para discutir os seguintes tópicos do [Quadro de tarefas](##sprint:scrum_project__version__sprint_1).
- * O que pretendo fazer até o próximo Scrone Diário?
- * O que bloqueou o meu trabalho (pedimentos)?
- * Moderados e notas do Scrum Master [Impedimentos](##sprint:scrum_project__version__sprint_1).
- * O Proprietário do Produto pode participar a fim de se manter informado.
+ Reunião de Revisão da Sprint
- ### Reunião de Revisão do Sprint
+ _Documente aqui os tópicos para a reunião de revisão da Sprint
- _Por favor, dê aqui tópicos para a reunião de Revisão do Sprint_
+ * Tempo limitado (4 h).
+ * Máximo de uma hora de preparação por pessoa.
+ * A equipe mostra ao proprietário do produto e a outras partes interessadas o que foi alcançado nesta sprint.
+ * Importante: nada de protótipos e PowerPoint! Apenas a funcionalidade do produto finalizada (Incrementos) deve ser demonstrada.
+ * Feedback do proprietário do produto, partes interessadas e outros é desejado e será incluído no trabalho futuro.
+ * Com base nas funcionalidades demonstradas, o proprietário do produto decide se o incremento será colocado em produção ou se será desenvolvido mais. Esta possibilidade permite um ROI antecipado.
- * Tempo embalado (4 h).
- * O máximo de uma hora de preparação por pessoa.
- * A equipe mostra ao proprietário do produto e às pessoas interessadas o que foi alcançado nesta sprint.
- * Importante: sem dummies e nenhum PowerPoint! Funcionalidade de produto finalizado (Incrementos) deve ser demonstrada.
- * Feedback do Proprietário do Produto, partes interessadas e outros é desejado e será incluído no trabalho futuro.
- * Com base nas funcionalidades demonstradas, o proprietário do produto decide viver com esse incremento ou desenvolvê-lo ainda mais. Esta possibilidade permite uma ROI precoce.
+ Retrospectiva da Sprint
+ _Documente aqui os tópicos para a reunião de retrospectiva da Sprint
- ### Retrospectiva de Sprint
-
- _Por favor, coloque aqui tópicos para a reunião Retrospectiva do Sprint_
-
- * Caixa de Tempo (3 h).
- * Após o Sprint Review, será moderado pelo Scrum Master.
- * A equipe discute o sprint: o que correu bem, o que precisa de ser melhorado para ser mais produtivo para a próxima corrida, ou até mesmo mais divertido.
+ * Tempo limitado (3 h).
+ * Após a Revisão da Sprint, será moderada pelo Scrum Master.
+ * A equipe discute a sprint: o que deu certo, o que precisa ser melhorado para ser mais produtivo na próxima sprint ou até mesmo para se divertir mais.
item_3:
name: Sprint 2
categories:
item_0: Categoria 1 (a ser alterada nas configurações do projeto)
queries:
item_0:
- name: 'Plano do Projeto:'
+ name: Plano do projeto
item_1:
name: Backlog do produto
item_2:
@@ -278,12 +276,12 @@ pt-BR:
name: Tarefas
boards:
kanban:
- name: Painel Kanban
+ name: Quadro Kanban
basic:
name: Quadro de tarefas
lists:
item_0:
- name: Lista de Desejo
+ name: Lista de desejos
item_1:
name: Lista curta
item_2:
@@ -294,7 +292,7 @@ pt-BR:
widgets:
item_0:
options:
- name: Bem-vindo
+ name: Boas-vindas
item_1:
options:
name: Guia de introdução
@@ -304,11 +302,11 @@ pt-BR:
_Tente as seguintes etapas:_
1. *Convide novos membros para o seu projeto*: → Vá para [Membros]({{opSetting:base_url}}/projects/your-scrum-project/members) na navegação do projeto.
- 2. *Veja seu backlog de Produto e backlogs do Sprint*: → Vá para [Backlogs]({{opSetting:base_url}}/projects/your-scrum-project/backlogs) na navegação do projeto.
+ 2. *Veja seu backlog de Produto e backlogs da Sprint*: → Vá para [Backlogs]({{opSetting:base_url}}/projects/your-scrum-project/backlogs) na navegação do projeto.
3. *Veja seu quadro de tarefas*: → Vá para [Backlogs]({{opSetting:base_url}}/projects/your-scrum-project/backlogs) → Clique na seta para a direita em Sprint → Selecione [Quadro de tarefas](##sprint:scrum_project__version__sprint_1).
4. *Crie um novo pacote de trabalho*: → Vá para [Pacotes de trabalho → Criar]({{opSetting:base_url}}/projects/your-scrum-project/work_packages/new).
5. *Crie e atualize um plano de projeto*: → Vá para [Plano de projeto](##query:scrum_project__query__project_plan) na navegação do projeto.
- 6. *Crie um wiki de Sprint*: → Vá para [Backlogs]({{opSetting:base_url}}/projects/your-scrum-project/backlogs) e abra o wiki de sprint no menu suspenso direito em um sprint. Você pode editar o [modelo wiki]({{opSetting:base_url}}/projects/your-scrum-project/wiki/) com base em suas necessidades.
+ 6. *Crie um wiki da Sprint*: → Vá para [Backlogs]({{opSetting:base_url}}/projects/your-scrum-project/backlogs) e abra o wiki da sprint no menu suspenso direito em uma sprint. Você pode editar o [modelo wiki]({{opSetting:base_url}}/projects/your-scrum-project/wiki/) com base em suas necessidades.
7. *Ative mais módulos*: → Vá para [Configurações do projeto → Módulos]({{opSetting:base_url}}/projects/your-scrum-project/settings/modules).
Aqui você encontrará nossos [Guias do Usuário] (https://www.openproject.org/docs/user-guide/).
@@ -319,7 +317,7 @@ pt-BR:
name: Pacotes de trabalho
item_6:
options:
- name: 'Plano do Projeto:'
+ name: Plano do projeto
work_packages:
item_0:
subject: Nova tela de login
@@ -372,18 +370,18 @@ pt-BR:
item_16:
subject: Versão v2.0
wiki: |
- ### Reunião de planejamento do sprint
+ ### Reunião de planejamento da sprint
- _Documente aqui os tópicos para a reunião de planejamento do Sprint_
+ _Documente aqui os tópicos para a reunião de planejamento da Sprint_
* Intervalo de tempo fixo (8 h)
* Entrada: Backlog de produto
- * Saída: Backlog de sprint
+ * Saída: Backlog da sprint
* Dividido em dois intervalos de tempo fixos adicionais de 4 h:
- * O proprietário do produto apresenta o [Backlog do produto]({{opSetting:base_url}}/projects/your-scrum-project/backlogs) e as prioridades para a equipe e explica o Sprint objetivo, com o qual a equipe deve concordar. Juntos, eles priorizam os tópicos do Backlog de produto que a equipe cuidará no próximo sprint. A equipe se compromete com a entrega discutida.
- * A equipe planeja de forma autônoma (sem o proprietário do produto) em detalhes e divide as tarefas dos requisitos discutidos para consolidar um [Backlog de sprint]({{opSetting:base_url}}/projects/your-scrum-project/backlogs).
+ * O proprietário do produto apresenta o [Backlog do produto]({{opSetting:base_url}}/projects/your-scrum-project/backlogs) e as prioridades para a equipe e explica a Sprint objetivo, com o qual a equipe deve concordar. Juntos, eles priorizam os tópicos do Backlog de produto que a equipe cuidará no próxima sprint. A equipe se compromete com a entrega discutida.
+ * A equipe planeja de forma autônoma (sem o proprietário do produto) em detalhes e divide as tarefas dos requisitos discutidos para consolidar um [Backlog da sprint]({{opSetting:base_url}}/projects/your-scrum-project/backlogs).
### Reunião diária do Scrum
@@ -392,31 +390,31 @@ pt-BR:
* Reunião curta e diária de status da equipe.
* Intervalo de tempo fixo (máx. 15 min).
- * Reunião stand-up para discutir os seguintes tópicos do quadro de tarefas.
+ * Reunião diária para discutir os seguintes tópicos do quadro de tarefas.
* O que pretendo fazer até o próximo Scrum diário?
* O que tem bloqueado meu trabalho (impedimentos)?
- * O Scrum Master modera e anota os Impedimentos do Sprint.
+ * O Scrum Master modera e anota os Impedimentos da Sprint.
* O proprietário do produto pode participar para se manter informado.
- ### Reunião de revisão do Sprint
+ ### Reunião de revisão da Sprint
- _Documente aqui os tópicos para a reunião de Revisão do Sprint_
+ _Documente aqui os tópicos para a reunião de Revisão da Sprint_
* Intervalo de tempo fixo (4h).
* Máximo de uma hora de preparo por pessoa.
- * A equipe mostra ao proprietário do produto e outras pessoas interessadas o que foi alcançado neste sprint.
+ * A equipe mostra ao proprietário do produto e outras pessoas interessadas o que foi alcançado nesta sprint.
* Importante: sem manequins e sem PowerPoint! A funcionalidade do produto recém-acabado (incrementos) deve ser demonstrada.
* Comentários do proprietário do produto, partes interessadas e outros são desejados e serão incluídos em trabalhos futuros.
* Com base nas funcionalidades demonstradas, o proprietário do produto decide ativar esse incremento ou desenvolvê-lo ainda mais. Esta possibilidade permite um ROI antecipado.
- ### Retrospectiva do Sprint
+ ### Retrospectiva da Sprint
- _Documente aqui os tópicos para a reunião de Retrospectiva do Sprint_
+ _Documente aqui os tópicos para a reunião de Retrospectiva da Sprint_
* Intervalo de tempo fixo (3h).
- * Após a revisão do Sprint, será moderado pelo Scrum Master.
- * A equipe discute o sprint: o que deu certo, o que precisa ser melhorado para ser mais produtivo para o próximo sprint ou até mesmo se divertir mais.
+ * Após a revisão da Sprint, será moderado pelo Scrum Master.
+ * A equipe discute a sprint: o que deu certo, o que precisa ser melhorado para ser mais produtivo para a próxima sprint ou até mesmo se divertir mais.
statuses:
item_0:
name: Novo
@@ -439,7 +437,7 @@ pt-BR:
item_9:
name: Testado
item_10:
- name: Falha no teste
+ name: O teste falhou
item_11:
name: Fechado
item_12:
@@ -467,15 +465,15 @@ pt-BR:
item_2:
name: Fase
item_3:
- name: Funcionalidade
+ name: Recurso
item_4:
name: Épico
item_5:
- name: História de usuário
+ name: Histórico de usuário
item_6:
name: Bug
welcome:
- title: Bem-vindo ao OpenProject!
+ title: Boas-vindas ao OpenProject!
text: |
O OpenProject é o principal software de gestão de projetos de código aberto. Ele dá suporte à gestão de projetos clássica, ágil e híbrida e dá a você o controlo total sobre os seus dados.
diff --git a/config/locales/crowdin/ro.yml b/config/locales/crowdin/ro.yml
index 05e02f2aef4e..a353e62f37b9 100644
--- a/config/locales/crowdin/ro.yml
+++ b/config/locales/crowdin/ro.yml
@@ -26,17 +26,17 @@ ro:
no_results_title_text: Nu s-a înregistrat nicio activitate pentru acest proiect în această perioadă de timp.
work_packages:
activity_tab:
- no_results_title_text: No activity to display
- no_results_description_text: "Choose \"Show everything\" to show all activity and comments"
- label_activity_show_all: "Show everything"
- label_activity_show_only_comments: "Show comments only"
- label_activity_show_only_changes: "Show changes only"
- label_sort_asc: "Newest at the bottom"
- label_sort_desc: "Newest on top"
- label_type_to_comment: "Type here to comment"
+ no_results_title_text: Nicio activitate de afișat
+ no_results_description_text: "Alege \"Arată tot\" pentru a afișa toată activitatea și comentariile"
+ label_activity_show_all: "Afișează tot"
+ label_activity_show_only_comments: "Arată doar comentariile"
+ label_activity_show_only_changes: "Arată doar modificările"
+ label_sort_asc: "Cele mai noi jos"
+ label_sort_desc: "Cele mai noi sus"
+ label_type_to_comment: "Tastează aici pentru a comenta"
label_submit_comment: "Submit comment"
changed_on: "changed on"
- created_on: "created this on"
+ created_on: "a creat-o pe"
changed: "changed"
created: "created"
commented: "commented"
@@ -88,7 +88,7 @@ ro:
get_quote: "Obțineți o ofertă"
buttons:
upgrade: "Actualizează acum"
- contact: "Contactați-ne pentru o demonstrație"
+ contact: "Contactați-ne pentru un demo"
enterprise_info_html: "is an Enterprise add-on."
upgrade_info: "Vă rugăm să treceți la un plan plătit pentru a-l activa și a începe să îl utilizați în echipa dumneavoastră."
jemalloc_allocator: Jemalloc memory allocator
@@ -303,12 +303,12 @@ ro:
completed_text: "Cererea de ștergere a proiectului \"%{name}\" a fost finalizată."
completed_text_children: "Additionally, the following subprojects have been deleted:"
index:
- open_as_gantt: "Deschideți ca vizualizare Gantt"
+ open_as_gantt: "Deschide ca vizualizare Gantt"
no_results_title_text: În acest moment nu există proiecte
no_results_content_text: Creează proiect nou
search:
label: Project name filter
- placeholder: Search by project name
+ placeholder: Caută după numele proiectului
lists:
active: "Proiecte active"
my: "Proiectele mele"
@@ -356,7 +356,7 @@ ro:
no_results_title_text: În acest moment nu există versiuni pentru acest proiect.
no_results_content_text: Creează versiune nouă
storage:
- no_results_title_text: Acest proiect nu consumă spațiu suplimentar pe disc înregistrat.
+ no_results_title_text: Acest proiect nu consumă spațiu suplimentar pe disc.
lists:
create:
success: "The modified list has been saved as a new list"
@@ -498,7 +498,7 @@ ro:
irreversible: "Această acțiune este ireversibilă"
confirmation: "Introduceți numele de utilizator de tip placeholder %{name} pentru a confirma ștergerea."
upsale:
- title: Utilizatori de tip Placeholder
+ title: Utilizatori Placeholder
description: >
Utilizatorii de tip substituție sunt o modalitate de a atribui pachete de lucru utilizatorilor care nu fac parte din proiectul tău. Acesta poate fi utilă într-o serie de scenarii; de exemplu, dacă trebuie să urmărești sarcinile pentru o resursă care nu este încă numită sau disponibilă, sau dacă nu vrei să acorzi acestei persoane acces la OpenProject dar totuși vrei să urmărești sarcinile care le-au fost atribuite.
prioritiies:
@@ -587,11 +587,11 @@ ro:
few: "%{count} descendenți ai pachetului de lucru"
other: "%{count} pachete de lucru descendente"
bulk:
- copy_failed: "Pachetele de lucru nu au putut fi copiate."
- move_failed: "Pachetele de lucru nu au putut fi mutate."
+ copy_failed: "Pachetele de lucru nu pot fi copiate."
+ move_failed: "Pachetele de lucru nu pot fi mutate."
could_not_be_saved: "Următoarele pachete de lucru nu au putut fi salvate:"
- none_could_be_saved: "Niciunul dintre pachetele de lucru %{total} nu a putut fi actualizat."
- x_out_of_y_could_be_saved: "%{failing} din %{total} pachete de lucru nu au putut fi actualizate în timp ce %{success} ar putea fi actualizat."
+ none_could_be_saved: "Niciunul dintre pachetele de lucru %{total} nu poate fi actualizat."
+ x_out_of_y_could_be_saved: "%{failing} din %{total} pachete de lucru nu pot fi actualizate în timp ce %{success} poate fi actualizat."
selected_because_descendants: "While %{selected} work packages were selected, in total %{total} work packages are affected which includes descendants."
descendant: "descendent de selectat"
move:
@@ -626,7 +626,7 @@ ro:
account:
delete: "Ştergere cont"
delete_confirmation: "Sunteţi sigur că doriţi să ştergeţi contul?"
- deletion_pending: "Contul a fost blocat și a fost programat pentru ștergere. Rețineți că acest proces are loc în fundal. Poate dura câteva momente până când utilizatorul este complet șters."
+ deletion_pending: "Contul a fost blocat și a fost programat pentru ștergere. Reține că acest proces are loc în fundal. Poate dura câteva momente până când utilizatorul este complet șters."
deletion_info:
data_consequences:
other: 'Vor fi șterse cât mai multe din datele create de utilizator (e.g. email, preferințe, pachete de lucru, contribuții wiki). De reținut, totuși, că date precum pachete de lucru și contribuții wiki nu pot fi șterse fără a afecta activitatea altor utilizatori. Prin urmare, astfel de date sunt realocate la un cont numit "Utilizator șters". Deoarece datele fiecărui cont șters sunt realocate acestui cont, nu va mai fi posibil să se facă distincția între datele create de utilizator și datele altui cont șters.'
@@ -1008,7 +1008,7 @@ ro:
foreign_wps_reference_version: "Pachetele de lucru din proiectele care nu sunt descendente fac trimitere la versiuni ale proiectului sau la descendenți ai acestuia."
attributes:
base:
- archive_permission_missing_on_subprojects: "Nu aveţi permisiunile necesare pentru a arhiva toate sub-proiectele. Vă rugăm să contactaţi un administrator."
+ archive_permission_missing_on_subprojects: "Nu ai permisiunile necesare pentru a arhiva toate sub-proiectele. Te rog să contactezi un administrator."
types:
in_use_by_work_packages: "încă în uz în pachetele de lucru: %{types}"
enabled_modules:
@@ -1767,7 +1767,7 @@ ro:
xls:
label: "XLS"
columns:
- input_label_report: "Add columns to attribute table"
+ input_label_report: "Adaugă coloane la tabelul de atribute"
input_caption_report: "By default all attributes added as columns in the work package list are selected. Long text fields are not available in the attribute table, but can be displayed below it."
input_caption_table: "By default all attributes added as columns in the work package list are selected. Long text fields are not available in table based exports."
pdf:
@@ -2044,7 +2044,7 @@ ro:
label_ical_access_key_generation_hint: "Automatically generated when subscribing to a calendar."
label_ical_access_key_latest: "latest"
label_ical_access_key_revoke: "Revocă"
- label_add_column: "Add column"
+ label_add_column: "Adaugă coloană"
label_applied_status: "Stare aplicată"
label_archive_project: "Proiect de arhivă"
label_ascending: "Crescător"
@@ -2340,10 +2340,10 @@ ro:
label_months_from: "luni de la"
label_more: "Mai mult"
label_more_than_ago: "acum mai mult de zile"
- label_move_column_left: "Move column left"
- label_move_column_right: "Move column right"
+ label_move_column_left: "Mută coloana la stânga"
+ label_move_column_right: "Mută coloana la dreapta"
label_move_work_package: "Mutare pachet de lucru"
- label_my_account: "Account settings"
+ label_my_account: "Setări cont"
label_my_activity: "Activitatea mea"
label_my_account_data: "Datele din contul meu"
label_my_avatar: "My avatar"
@@ -2443,7 +2443,7 @@ ro:
label_project_attributes_settings: "Project attributes settings"
label_project_storage_plural: "File Storages"
label_project_storage_project_folder: "File Storages: Project folders"
- label_projects_disk_usage_information: "%{count} projects using %{used_disk_space} disk space"
+ label_projects_disk_usage_information: "%{count} proiecte care utilizează %{used_disk_space} spațiu pe disc"
label_project_view_all: "Vizualizează toate proiectele"
label_project_show_details: "Arată detaliile proietului"
label_project_hide_details: "Ascunde detaliile proiectului"
@@ -2464,8 +2464,8 @@ ro:
label_relation_new: "Relație nouă"
label_release_notes: "Note privind lansarea noii versiuni"
label_remaining_work: "Muncă rămasă"
- label_remove_column: "Remove column"
- label_remove_columns: "Eliminare coloane selectate"
+ label_remove_column: "Elimină coloana"
+ label_remove_columns: "Elimină coloane selectate"
label_renamed: "redenumit"
label_reply_plural: "Răspunsuri"
label_report: "Raportare"
@@ -2505,10 +2505,10 @@ ro:
label_show_completed_versions: "Afișare versiuni complete"
label_columns: "Coloane"
label_sort: "Sortare"
- label_sort_ascending: "Sort ascending"
+ label_sort_ascending: "Ordonează ascendent"
label_sort_by: "Sortare după %{value}"
label_sorted_by: "sortate după %{value}"
- label_sort_descending: "Sort descending"
+ label_sort_descending: "Ordonează descendent"
label_sort_higher: "Mută în sus"
label_sort_highest: "Mută sus"
label_sort_lower: "Mută în jos"
@@ -2518,8 +2518,8 @@ ro:
label_start_to_start: "început la început"
label_statistics: "Statistici"
label_status: "Stare"
- label_storage_free_space: "Spațiu pe disc rămas"
- label_storage_used_space: "Spațiu pe disc folosit"
+ label_storage_free_space: "Spațiu disc rămas"
+ label_storage_used_space: "Spațiu disc folosit"
label_storage_group: "Sistem de fișiere pentru stocare %{identifier}"
label_storage_for: "Conține stocarea pentru"
label_string: "Text"
@@ -2532,7 +2532,7 @@ ro:
label_system_storage: "Informații privind stocarea"
label_table_of_contents: "Cuprins"
label_tag: "Etichetă"
- label_team_planner: "Team Planner"
+ label_team_planner: "Planificare echipă"
label_text: "Text lung"
label_this_month: "luna curentă"
label_this_week: "săptămâna curentă"
@@ -2772,10 +2772,10 @@ ro:
mail_body_register_header_title: "E-mail de invitație pentru membrii proiectului"
mail_body_register_user: "Dragă %{name},"
mail_body_register_links_html: |
- Vă rugăm să nu ezitați să navigați pe canalul nostru de youtube (%{youtube_link}) unde oferim un webinar (%{webinar_link})
+ Nu ezita să navighezi pe canalul nostru de youtube (%{youtube_link}) unde oferim un webinar (%{webinar_link})
și videoclipuri cu “Începe” (%{get_started_link}) pentru a face primii pași în OpenProject cât mai ușor posibil.
- Dacă aveți orice întrebări suplimentare, consultați documentația noastră (%{documentation_link}) sau contactați administratorul.
+ Dacă ai orice întrebări suplimentare, consultă documentația noastră (%{documentation_link}) sau contactează administratorul.
mail_body_register_closing: "Echipa dumneavoastră OpenProject"
mail_body_register_ending: "Rămâneți conectați! Vă salutăm cu drag,"
mail_body_reminder: "%{count} pachete de lucru care vă sunt atribuite au scadență în următoarele %{days} zile:"
@@ -2888,7 +2888,7 @@ ro:
notice_automatic_set_of_standard_type: "Setare automată a tipului standard."
notice_logged_out: "Ați fost deconectat."
notice_wont_delete_auth_source: The LDAP connection cannot be deleted as long as there are still users using it.
- notice_project_cannot_update_custom_fields: "Nu puteți actualiza câmpurile particularizate disponibile ale proiectului. Proiectul este invalid: %{errors}"
+ notice_project_cannot_update_custom_fields: "Nu poți actualiza câmpurile particularizate disponibile ale proiectului. Proiectul este invalid: %{errors}"
notice_attachment_migration_wiki_page: >
Această pagină a fost generată automat în timpul actualizării OpenProject. Aceasta conține toate atașamentele asociate anterior cu %{container_type} "%{container_name}".
#Default format for numbers
@@ -2916,7 +2916,7 @@ ro:
heading_getting_started: "Urmărește prezentarea generală"
text_getting_started_description: "Obțineți o imagine de ansamblu rapidă a gestionării proiectelor și a colaborării în echipă cu OpenProject. Puteți reporni acest videoclip din meniul de ajutor."
welcome: "Bun venit la %{app_title}"
- select_language: "Vă rugăm să selectați limba dvs"
+ select_language: "Te rog selectează limba"
permission_add_work_package_notes: "Adăugare note"
permission_add_work_packages: "Adăugare pachete de lucru"
permission_add_messages: "Publicare mesaje"
@@ -3146,7 +3146,7 @@ ro:
managed: "Creează repo nou în OpenProject"
storage:
not_available: "Consumul de spațiu de stocare nu este disponibil pentru acest repo."
- update_timeout: "Păstraţi informaţia referitoare la spaţiul de stocare necesar pentru un repo timp de N minute. \nDeoarece măsurarea spațiului necesar pentru un repo poate fi costisitoare, creșteți această valoare pentru a reduce impactul în performanță."
+ update_timeout: "Păstrează ultimele informații privind spațiul necesar pe disc pentru un depozit timp de N minute.\nDeoarece numărarea spațiului necesar pe disc al unui depozit poate fi costisitoare, crește această valoare pentru a reduce impactul asupra performanței."
oauth_application_details: "Valoarea secretă a clientului nu va mai fi accesibilă după ce închideți această fereastră. Vă rugăm să copiați aceste valori în setările Nextcloud OpenProject Integration:"
oauth_application_details_link_text: "Mergi la pagina setări"
setup_documentation_details: "Dacă aveți nevoie de ajutor pentru configurarea unui nou depozit de fișiere, consultați documentația: "
@@ -3335,7 +3335,7 @@ ro:
If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path}
login page.
attachments:
whitelist_text_html: >
- Definește o listă validă de extensii de fișiere și/sau tipuri mime pentru fișierele încărcate.
Introduceți extensii de fișiere (de ex. %{ext_example}
) sau tipuri mime (e. ., %{mime_example}
).
Lăsați gol pentru a permite oricărui tip de fișier să fie încărcat. Valori multiple permise (o linie pentru fiecare valoare).
+ Definește o listă validă de extensii de fișiere și/sau tipuri mime pentru fișierele încărcate.
Introdu extensii de fișiere (de ex. %{ext_example}
) sau tipuri mime (e. ., %{mime_example}
).
Lasă gol pentru a permite oricărui tip de fișier să fie încărcat. Valori multiple permise (o linie pentru fiecare valoare).
show_work_package_attachments: >
Deactivating this option will hide the attachments list on the work packages files tab for new projects. The files attached in the description of a work package will still be uploaded in the internal attachments storage.
antivirus:
@@ -3429,7 +3429,7 @@ ro:
text_access_token_hint: "Tichetele de acces permit aplicaţiilor externe accesul la resurse din OpenProject."
text_analyze: "Continuare analiză: %{subject}"
text_are_you_sure: "Sunteți sigur?"
- text_are_you_sure_continue: "Sigur doriţi să continuați?"
+ text_are_you_sure_continue: "Sigur dorești să continui?"
text_are_you_sure_with_children: "Doriți ștergerea pachetului de lucru și a tuturor pachetelor fii?"
text_are_you_sure_with_project_custom_fields: "Deleting this attribute will also delete its values in all projects. Are you sure you want to do this?"
text_assign_to_project: "Alocare la proiect"
@@ -3509,7 +3509,7 @@ ro:
text_no_notes: "Nu sunt comentarii disponibile pentru acest pachet de lucru."
text_notice_too_many_values_are_inperformant: "Atenție: Afişarea unui număr mai mare de 100 de articole pe pagină poate creşte durata de încărcare."
text_notice_security_badge_displayed_html: >
- Notă: dacă este activată, aceasta va afișa o insignă cu starea instalării în fereastra %{information_panel_label} panoul de administrare și pe pagina principală. Aceasta este afișată numai pentru administratori.
Insigna va verifica versiunea curentă a OpenProject în raport cu baza de date oficială a versiunilor OpenProject pentru a vă alerta cu privire la orice actualizări sau vulnerabilități cunoscute. Pentru mai multe informații despre ce oferă verificarea, ce date sunt necesare pentru a furniza actualizările disponibile și cum să dezactivați această verificare, vă rugăm să vizitați documentația de configurare.
+ Notă: dacă este activată, aceasta va afișa o insignă cu starea instalării în fereastra %{information_panel_label} panoul de administrare și pe pagina principală. Aceasta este afișată numai pentru administratori.
Insigna va verifica versiunea curentă a OpenProject în raport cu baza de date oficială a versiunilor OpenProject pentru a alerta cu privire la orice actualizări sau vulnerabilități cunoscute. Pentru mai multe informații despre ce oferă verificarea, ce date sunt necesare pentru a furniza actualizările disponibile și cum să dezactivezi această verificare, te rog să vizitezi documentația de configurare.
text_own_membership_delete_confirmation: "Sunteţi cale de a elimina unele sau toate permisiunile şi e posibil să nu mai puteți edita acest proiect după aceea. \nSunteţi sigur că doriţi să continuaţi?"
text_plugin_assets_writable: "Se poate scrie în directorul de resurse pentru module"
text_powered_by: "Propulsat de %{link}"
@@ -3569,7 +3569,7 @@ ro:
queries:
apply_filter: Aplicare filtru preconfigurat
configure_view:
- heading: Configurați vizualizarea
+ heading: Configurează vizualizarea
columns:
input_label: "Adaugă coloane"
input_placeholder: "Select a column"
@@ -3791,7 +3791,7 @@ ro:
work_package: "Pachetul de lucru pe care îl căutați nu poate fi găsit sau a fost șters."
expected:
date: "AAAA-MM-ZZ (doar formate ISO 8601)"
- datetime: "AAAA-LL-ZZZZH:mm:ss[.lll][+h:mm] (orice date compatibile ISO 8601 datetime)"
+ datetime: "AAAA-LL-ZZZZH:mm:ss[.lll][+h:mm] (orice dăți compatibile ISO 8601 dată-oră)"
duration: "Durată ISO 8601"
invalid_content_type: "CONTENT-TYPE așteptat '%{content_type}', dar am primit '%{actual}'."
invalid_format: "Format invalid pentru proprietatea '%{property}': format așteptat '%{expected_format}', dar am primit '%{actual}'."
@@ -3836,7 +3836,7 @@ ro:
#Common error messages
invalid_request:
unknown: "În cerere lipsește un parametru obligatoriu, include o valoare de parametru neacceptată sau este deformată în alt mod."
- missing_param: "Lipseste parametrul necesar: %{value}."
+ missing_param: "Lipsește parametrul obligatoriu: %{value}."
request_not_authorized: "Solicitarea trebuie să fie autorizată. Parametrul necesar pentru solicitarea de autorizare lipsește sau este invalid."
invalid_redirect_uri: "URL-ul de redirecționare solicitat este deformat sau nu se potrivește cu URL-ul de redirecționare al clientului."
unauthorized_client: "Clientul nu este autorizat să efectueze această cerere folosind această metodă."
@@ -3930,12 +3930,12 @@ ro:
urn_connection_status:
connected: "Conectat"
error: "Eroare"
- failed_authorization: "Autorizarea nu a reuşit"
+ failed_authorization: "Autorizare nereușită"
labels:
label_oauth_integration: "Integrare OAuth2"
- label_redirect_uri: "Redirecționați URI"
- label_request_token: "Token de cerere"
- label_refresh_token: "Reîmprospătare token"
+ label_redirect_uri: "URI redirecționare"
+ label_request_token: "Token cerere"
+ label_refresh_token: "Token reîmprospătare"
errors:
oauth_authorization_code_grant_had_errors: "OAuth2 Authorization grant unsuccessful"
oauth_reported: "Furnizor OAuth2 raportat"
diff --git a/config/locales/crowdin/ru.seeders.yml b/config/locales/crowdin/ru.seeders.yml
index 51ed2546b41a..b1b3dcb88223 100644
--- a/config/locales/crowdin/ru.seeders.yml
+++ b/config/locales/crowdin/ru.seeders.yml
@@ -299,18 +299,20 @@ ru:
options:
name: Приступая к работе
text: |
- Мы рады, что вы присоединились! Мы рекомендуем попробовать несколько вещей, чтобы начать работу в OpenProject.
-
- _Попробуйте следующие шаги:_[Backlogs]. *Пригласите новых участников к вашему проекту*: → Перейдите к [Members]({{opSetting:base_url}}/projects/your-scrum-project/members) в навигации по проекту.
- 2. *Просмотр бэклога продукта и бэклогов Sprint *: → Перейти к [Backlogs]({{opSetting:base_url}}/projects/your-scrum-project/backlogs) в навигации по проекту.
- *Просмотр вашей панели задач*: → Перейдите на [Backlogs] ({{opSetting:base_url}}/projects/your-scrum-project/backlogs) → Нажмите на правую стрелку на Sprint → Выберите [Целевую панель](##sprint:scrum_project__version__sprint_1).
- 4. *Создать новый пакет работ*: → Перейдите к [Пакеты работ → Create]({{opSetting:base_url}}/projects/your-scrum-project/work_packages/new).
- 5. *Создать и обновить план проекта*: → Перейдите к [плану проекта](##query:scrum_project__query__project_plan) в навигации по проекту.
- 6. *Создайте вики спринта*: → Перейдите в [Backlogs]({{opSetting:base_url}}/projects/your-scrum-project/backlogs) и откройте вики спринта из правого выпадающего меню в спринте. Вы можете редактировать [шаблон вики]({{opSetting:base_url}}/projects/your-scrum-project/wiki/) на основе ваших потребностей.
- 7. *Активировать дальнейшие модули*: → Перейдите к [настройкам проекта → Модулей]({{opSetting:base_url}}/projects/your-scrum-project/settings/modules).
-
- Здесь вы найдете наши [руководства пользователя](https://www. penproject.org/docs/user-guide/).
- Пожалуйста, сообщите нам, если у вас есть какие-либо вопросы или нужна поддержка. Свяжитесь с нами: [support[at]openproject.com](mailto:support@openproject.com).
+ Мы рады, что Вы присоединились! Мы предлагаем попробовать несколько вещей, чтобы начать работу с OpenProject.
+
+ _Попробуйте выполнить следующие шаги:_
+
+ 1. *Пригласите новых участников в свой проект*: → Перейдите к [Участники]({{opSetting:base_url}}/projects/your-scrum-project/members) в меню проекта.
+ 2. *Просмотрите бэклог Вашего продукта и бэклог спринта*: → Перейдите к [Бэклог]({{opSetting:base_url}}/projects/your-scrum-project/backlogs) в меню проекта.
+ 3. *Просмотрите Вашу доску задач*: → Перейдите к [Бэклоги]({{opSetting:base_url}}/projects/your-scrum-project/backlogs) → Нажмите стрелку вправо на Этапы → Выберите [Панель задач](##sprint:scrum_project__version__sprint_1).
+ 4. *Создайте новый рабочий пакет*: → Перейдите в раздел [Рабочие пакеты → Создать]({{opSetting:base_url}}/projects/your-scrum-project/work_packages/new).
+ 5. *Создайте и обновите план проекта*: → Перейдите к разделу [План проекта](##query:scrum_project__query__project_plan) в меню проекта.
+ 6. *Создайте вики спринта*: → Перейдите в раздел [Бэклоги]({{opSetting:base_url}}/projects/your-scrum-project/backlogs) и откройте вики спринта из правого выпадающего меню в спринте. Вы можете отредактировать шаблон [wiki]({{opSetting:base_url}}/projects/your-scrum-project/wiki/) в соответствии со своими потребностями.
+ 7. *Активируйте дополнительные модули*: → Перейдите в раздел [Настройки проекта → Модули]({{opSetting:base_url}}/projects/your-scrum-project/settings/modules).
+
+ Здесь Вы найдете наши [руководства пользователя](https://www.openproject.org/docs/user-guide/).
+ Пожалуйста, сообщите нам, если у Вас возникнут вопросы или Вам понадобится поддержка. Свяжитесь с нами: [support[at]openproject.com](mailto:support@openproject.com).
item_5:
options:
name: Пакеты работ
diff --git a/config/locales/crowdin/ru.yml b/config/locales/crowdin/ru.yml
index 1ab7b95ed26d..e535898d2111 100644
--- a/config/locales/crowdin/ru.yml
+++ b/config/locales/crowdin/ru.yml
@@ -2894,9 +2894,9 @@ ru:
notice_locking_conflict: "Информация была обновлена одновременно с вами по крайней мере одним пользователем."
notice_locking_conflict_additional_information: "Обновление(-ия) пришли от %{users}."
notice_locking_conflict_reload_page: "Пожалуйста перезагрузите страницу, пересмотрите изменения и повторно примените Ваши обновления."
- notice_locking_conflict_warning: "This page has been updated by someone else. To not lose your edits, copy them locally and reload to view the updated version."
- notice_locking_conflict_danger: "Could not save your changes because of conflicting modifications. To not lose your edits, copy them locally and reload to view the updated version."
- notice_locking_conflict_action_button: "Discard changes and reload"
+ notice_locking_conflict_warning: "Эта страница была обновлена кем-то еще. Чтобы не потерять ваши изменения, скопируйте их локально и перезагрузите страницу, чтобы просмотреть обновленную версию."
+ notice_locking_conflict_danger: "Не удалось сохранить ваши изменения из-за конфликтующих изменений. Чтобы не потерять ваши изменения, скопируйте их локально и перезагрузите страницу для просмотра обновления."
+ notice_locking_conflict_action_button: "Отменить изменения и перезагрузить"
notice_member_added: '%{name} добавлено в проект.'
notice_members_added: В проект добавлено %{number} пользователей.
notice_member_removed: "Пользователь %{user} удален из проекта."
@@ -3367,7 +3367,7 @@ ru:
authentication:
single_sign_on: "Единый вход"
omniauth_direct_login_hint_html: >
- If this option is active, login requests will redirect to the configured omniauth provider. The login dropdown and sign-in page will be disabled.
Note: Unless you also disable password logins, with this option enabled, users can still log in internally by visiting the %{internal_path}
login page.
+ Если эта опция включена, запросы на вход в систему будут перенаправлены на настроенный провайдер omniauth. Выпадающий список входа и страница входа будут отключены.
Примечание: Если вы также не отключите вход по паролю, то пользователи все еще могут войти внутри системы, посетив страницу входа %{internal_path}
.
attachments:
whitelist_text_html: >
Определите список допустимых расширений файлов и/или mime типов для загруженных файлов.
Введите расширения файлов (например, %{ext_example}
) или mime типы (e. ., %{mime_example}
).
Оставьте пустым, чтобы разрешить загрузку любого типа файла. Допустимы несколько значений (одна строка для каждого значения).
diff --git a/config/locales/crowdin/sv.yml b/config/locales/crowdin/sv.yml
index d3c3c2aa1985..dc6c99dcbdee 100644
--- a/config/locales/crowdin/sv.yml
+++ b/config/locales/crowdin/sv.yml
@@ -266,7 +266,7 @@ sv:
filled?: "must be filled"
not_unique: "must be unique within the same hierarchy level"
rules:
- label: "Label"
+ label: "Etikett"
global_search:
placeholder: "Search in %{app_title}"
overwritten_tabs:
diff --git a/config/locales/crowdin/tr.yml b/config/locales/crowdin/tr.yml
index f6dc4038c473..893b50a085f5 100644
--- a/config/locales/crowdin/tr.yml
+++ b/config/locales/crowdin/tr.yml
@@ -64,8 +64,8 @@ tr:
enterprise_more_info: "Not: Kullanılan logo herkese açık olacaktır."
manage_colors: "Renk seçim seçeneklerini düzenle"
instructions:
- primary-button-color: "Strong accent color, used for the most important button on a screen."
- accent-color: "Color for links and other decently highlighted elements."
+ primary-button-color: "Güçlü vurgu rengi, genellikle ekrandaki en önemli düğme için kullanılır."
+ accent-color: "Bağlantılar ve diğer uygun biçimde vurgulanmış öğeler için renk."
header-item-bg-hover-color: "Tıklanabilir başlık bileşenleri nin üzerine gelindiğinde kullanılacak arka plan rengi."
header-item-font-color: "Tıklanabilir başlık bileşenleri için yazı rengi."
header-item-font-hover-color: "Tıklanabilir başlık bileşenleri nin üzerine gelindiğinde kullanılacak yazı rengi."
@@ -89,9 +89,9 @@ tr:
buttons:
upgrade: "Hemen Yükselt"
contact: "Demo için bizimle iletişime geçin"
- enterprise_info_html: "is an Enterprise add-on."
+ enterprise_info_html: "bir Kurumsal eklentisidir."
upgrade_info: "Etkinleştirmek ve ekibinizde kullanmaya başlamak için lütfen ücretli bir plana yükseltin."
- jemalloc_allocator: Jemalloc memory allocator
+ jemalloc_allocator: Jemalloc bellek ayırıcı
journal_aggregation:
explanation:
text: "Bir kullanıcının bireysel eylemleri (örneğin, bir iş paketini iki kez güncelleme), yaş farkı belirtilen zaman aralığından azsa tek bir eylemde toplanır. Uygulama içinde tek bir eylem olarak görüntülenecektir. Bu aynı zamanda gönderilen e-posta sayısını azaltarak bildirimleri aynı süre kadar geciktirecek ve ayrıca %{webhook_link} gecikmesini etkileyecektir."
@@ -101,16 +101,16 @@ tr:
is_active: şu an görüntüleniyor
is_inactive: şu an görüntülenmiyor
antivirus_scan:
- not_processed_yet_message: "Downloading is blocked, as file was not scanned for viruses yet. Please try again later."
- quarantined_message: "A virus was detected in file '%{filename}'. It has been quarantined and is not available for download."
- deleted_message: "A virus was detected in file '%{filename}'. The file has been deleted."
- deleted_by_admin: "The quarantined file '%{filename}' has been deleted by an administrator."
- overridden_by_admin: "The quarantine for file '%{filename}' has been removed by %{user}. The file can now be acccessed."
+ not_processed_yet_message: "Dosya henüz virüs taramasından geçirilmediği için indirme işlemi engellendi. Lütfen daha sonra tekrar deneyin."
+ quarantined_message: "'%{filename}' dosyasında bir virüs tespit edildi. Dosya karantinaya alındı ve indirilemez."
+ deleted_message: "'%{filename}' dosyasında bir virüs tespit edildi. Dosya silinmiştir."
+ deleted_by_admin: "Karantinaya alınan '%{filename}' dosyası bir yönetici tarafından silindi."
+ overridden_by_admin: "'%{filename}' dosyası için karantina %{user} tarafından kaldırıldı. Dosyaya artık erişilebilir."
quarantined_attachments:
- container: "Container"
- delete: "Delete the quarantined file"
- title: "Quarantined attachments"
- error_cannot_act_self: "Cannot perform actions on your own uploaded files."
+ container: "Depo"
+ delete: "Karantinaya alınan dosyayı sil"
+ title: "Karantinaya alınan ekler"
+ error_cannot_act_self: "Kendi yüklediğiniz dosyalar üzerinde işlem yapamazsınız."
attribute_help_texts:
note_public: "Bu alana eklediğiniz herhangi bir metin ve resim, oturum açmış tüm kullanıcılar tarafından herkes tarafından görülebilir!"
text_overview: "Bu görünümde, öznitelikleri görünüm için özel yardım metinler oluşturabilirsiniz. Tanımladığınızda, bu metinler, aidiyet öznitelik yanındaki Yardım simgesini tıklayarak gösterilebilir."
@@ -125,8 +125,8 @@ tr:
ldap_auth_sources:
ldap_error: "LDAP-Hatası: %{error_message}"
ldap_auth_failed: "LDAP sunucusunda kimlik doğrulaması yapılamadı."
- sync_failed: "Failed to synchronize from LDAP: %{message}."
- back_to_index: "Click here to go back to the list of connection."
+ sync_failed: "LDAP'den senkronizasyon başarısız oldu: %{message}."
+ back_to_index: "Bağlantı listesine geri dönmek için buraya tıklayın."
technical_warning_html: |
Bu LDAP formu, LDAP / Active Directory kurulumunuz hakkında teknik bilgi gerektirir.
@@ -218,23 +218,23 @@ tr:
admin:
custom_field_projects:
is_for_all_blank_slate:
- heading: For all projects
- description: This custom field is enabled in all projects since the "For all projects" option is checked. It cannot be deactivated for individual projects.
+ heading: Tüm projeler için
+ description: '"Tüm projeler için" seçeneği işaretli olduğu için bu proje niteliği tüm projelerde etkindir. Projeler için bağımsız olarak devre dışı bırakılamaz.'
items:
- actions: "Item actions"
+ actions: "Öğe eylemleri"
blankslate:
title: "Öğeler listeniz boş"
description: "Start by adding items to the custom field of type hierarchy. Each item can be used to create a hierarchy bellow it. To navigate and create sub-items inside a hierarchy click on the created item."
placeholder:
- label: "Item label"
- short: "Short name"
+ label: "Öğe etiketi"
+ short: "Kısa adı"
notice:
- remember_items_and_projects: "Remember to set items and projects in the respective tabs for this custom field."
+ remember_items_and_projects: "Bu özel alan için ilgili sekmelerde öğeleri ve projeleri ayarlamayı unutmayın."
hierarchy:
subitems:
- zero: no sub-items
- one: 1 sub-item
- other: "%{count} sub-items"
+ zero: alt öğe yok
+ one: 1 alt öğe
+ other: "%{count} alt öğe"
text_add_new_custom_field: >
Bir projeye yeni özel alanlar eklemeden önce onları oluşturmalısınız.
is_enabled_globally: "Genel için etkinleştirildi"
@@ -245,13 +245,13 @@ tr:
reorder_confirmation: "Uyarı: Mevcut değerlerin sırası kaybolacak. Devam et?"
instructions:
is_required: "Mark the custom field as required. This will make it mandatory to fill in the field when creating new or updating existing resources."
- is_required_for_project: "Check to enable this attribute and make it required in all projects. It cannot be deactived for individual projects."
+ is_required_for_project: "Bu özelliği etkinleştirmek ve tüm projelerde gerekli kılmak için işaretleyin. Tek tek projeler için devre dışı bırakılamaz."
is_for_all: "Mark the custom field as available in all existing and new projects."
- multi_select: "Allows the user to assign multiple values to this custom field."
+ multi_select: "Kullanıcının bu özel alana birden fazla değer atamasına izin verir."
searchable: "Include the field values when using the global search functionality."
- searchable_for_project: "Check to make this attribute available as a filter in project lists."
+ searchable_for_project: "Bu niteliği proje listelerinde filtre olarak kullanmak için işaretleyin."
editable: "Allow the field to be editable by users themselves."
- admin_only: "Check to make this attribute only visible to administrators. Users without admin rights will not be able to view or edit it."
+ admin_only: "Bu niteliğin yalnızca yöneticilere görünür kılmak için işaretleyin. Yönetici hakları olmayan kullanıcılar bunu görüntüleyemez veya düzenleyemez."
is_filter: >
Allow the custom field to be used in a filter in work package views. Note that only with 'For all projects' selected, the custom field will show up in global views.
tab:
@@ -264,11 +264,11 @@ tr:
rules:
label:
filled?: "must be filled"
- not_unique: "must be unique within the same hierarchy level"
+ not_unique: "aynı hiyerarşi seviyesi içinde benzersiz olmalıdır"
rules:
- label: "Label"
+ label: "Etiket"
global_search:
- placeholder: "Search in %{app_title}"
+ placeholder: "%{app_title} içinde ara"
overwritten_tabs:
wiki_pages: "Viki"
messages: "Forum"
@@ -293,7 +293,7 @@ tr:
work_package_attachments: "İş paketleri: ekler"
work_package_categories: "İş paketleri: kategoriler"
work_package_file_links: "Çalışma paketleri: dosya bağlantıları"
- work_package_shares: "Work packages: shares"
+ work_package_shares: "İş paketleri: paylaşımlar"
delete:
scheduled: "Silme planlandı ve arka planda gerçekleştirilir. Sonuçtan haberdar edileceksiniz."
schedule_failed: "Proje silinemiyor: %{errors}"
@@ -307,8 +307,8 @@ tr:
no_results_title_text: Şu anda hiç proje bulunmamakta
no_results_content_text: Yeni bir proje oluşturun
search:
- label: Project name filter
- placeholder: Search by project name
+ label: Proje adı filtresi
+ placeholder: Proje adına göre ara
lists:
active: "Aktif projeler"
my: "Projelerim"
@@ -469,11 +469,11 @@ tr:
browser: "Tarayıcı"
device: "Cihaz / İşletim Sistemi"
unknown_browser: "bilinmeyen tarayıcı"
- unknown_os: "unknown operating system"
- current: "Current session"
- title: "Session management"
- instructions: "This is a list of devices that have logged into your account. Revoke any sessions that you do not recognize or you have no longer access to."
- may_not_delete_current: "You cannot delete your current session."
+ unknown_os: "bilinmeyen işletim sistemi"
+ current: "Şuanki oturum"
+ title: "Oturum yönetimi"
+ instructions: "Bu, hesabınıza giriş yapmış olan cihazların bir listesidir. Tanımadığınız veya artık erişiminizin olmadığı oturumları iptal edin."
+ may_not_delete_current: "Şuanki oturumunuzu silemezsiniz."
groups:
member_in_these_groups: "Bu kullanıcı şu anda aşağıdaki grupların bir üyesidir:"
no_results_title_text: Bu kullanıcı şu anda hiçbir gruba üye değil.
@@ -501,14 +501,14 @@ tr:
Bu önceliğin rengini atamak veya değiştirmek için tıklayın.
Tablodaki iş paketlerini vurgulamak için kullanılabilir.
reactions:
- action_title: "React"
- add_reaction: "Add reaction"
- react_with: "React with %{reaction}"
- and_user: "and %{user}"
+ action_title: "Tepki"
+ add_reaction: "Tepki ekle"
+ react_with: "%{reaction} ile tepki ver"
+ and_user: "ve %{user} ile"
and_others:
- one: and 1 other
- other: and %{count} others
- reaction_by: "%{reaction} by"
+ one: ve 1 diğeri
+ other: ve %{count} tane daha
+ reaction_by: "tarafından %{reaction}"
reportings:
index:
no_results_title_text: Halen durum bildirimleri yok.
@@ -519,14 +519,13 @@ tr:
Bu durumun rengini atamak veya değiştirmek için tıklayın.
Durum düğmesinde gösterilir ve tablodaki iş paketlerini vurgulamak için kullanılabilir.
status_default_text: |-
- New work packages are by default set to this type. They cannot be read-only.
+ Yeni iş paketleri varsayılan olarak bu türe ayarlanmıştır. Salt okunur olamazlar.
status_excluded_from_totals_text: |-
- Check this option to exclude work packages with this status from totals of Work,
- Remaining work, and % Complete in a hierarchy.
+ Bir hiyerarşide bu duruma sahip iş paketlerini İş,
+ Kalan iş ve % Tamamlandı toplamlarından hariç tutmak için bu seçeneği işaretleyin.
status_percent_complete_text: |-
- In status-based progress calculation mode, the % Complete of a work
- package is automatically set to this value when this status is selected.
- Ignored in work-based mode.
+ Durum bazlı ilerleme hesaplama modunda, bu durum seçildiğinde bir işin % Tamamlandı durumu otomatik olarak bu değere ayarlanır.
+ İş bazlı modda yok sayılır.
status_readonly_html: |
Bu durumdaki iş paketlereni salt okunur olarak işaretlemek için bu seçeneği işaretleyin.
Durum haricindeki başka özellikler değiştirilemez.
@@ -539,11 +538,11 @@ tr:
is_default: "Varsayılan"
is_closed: "Kapalı"
is_readonly: "Salt okunur"
- excluded_from_totals: "Excluded from totals"
+ excluded_from_totals: "Toplamlardan hariç tutulanlar"
themes:
- dark: "Dark"
- light: "Light"
- light_high_contrast: "Light high contrast"
+ dark: "Koyu"
+ light: "Açık"
+ light_high_contrast: "Yüksek kontrastlı açık"
types:
index:
no_results_title_text: Şu anda hiç tip yok.
@@ -562,7 +561,7 @@ tr:
Seçilen renk, Gantt şemalarında veya iş paketleri tablolarında farklı türleri ayırt eder. Bu nedenle güçlü bir renk kullanılması önerilir.
versions:
overview:
- work_packages_in_archived_projects: "The version is shared with archived projects which still have work packages assigned to this version. These are counted, but will not appear in the linked views."
+ work_packages_in_archived_projects: "Sürüm, hala bu sürüme atanmış iş paketleri olan arşivlenmiş projelerle paylaşılmakta. Bunlar sayılır, ancak bağlantılı görünümlerde gösterilmez."
no_results_title_text: Bu sürüme atadığım iş paketi bulunmuyor.
wiki:
page_not_editable_index: İstenen sayfa mevcut değil (henüz). Tüm wiki sayfalarının dizinine yönlendirildiniz.
@@ -578,20 +577,20 @@ tr:
one: "Bir soydan iş paketi"
other: "%{count} Bir soydan iş paketi"
bulk:
- copy_failed: "The work packages could not be copied."
- move_failed: "The work packages could not be moved."
+ copy_failed: "İş paketleri kopyalanamadı."
+ move_failed: "İş paketleri taşınamadı."
could_not_be_saved: "Aşağıdaki iş paketleri kaydedilemedi:"
none_could_be_saved: "%{total} iş paketlerinin hiçbiri güncellenemedi."
x_out_of_y_could_be_saved: "%{total} iş paketinden %{failing} tanesi güncellenemezken %{success} güncellenebildi."
- selected_because_descendants: "While %{selected} work packages were selected, in total %{total} work packages are affected which includes descendants."
+ selected_because_descendants: "Seçilen %{selected} iş paketleri seçiliyken, toplamda alt iş paketlerini de içeren %{total} iş paketi etkilenmekte."
descendant: "seçilmiş nesil"
move:
no_common_statuses_exists: "Seçilen tüm iş paketleri için uygun bir durum yoktur. Durumları değiştirilemez."
unsupported_for_multiple_projects: "Birden çok projeden iş paketi için toplu taşıma / kopyalama desteklenmiyor"
current_type_not_available_in_target_project: >
- The current type of the work package is not enabled in the target project. Please enable the type in the target project if you'd like it to remain unchanged. Otherwise, select an available type in the target project from the list.
+ İş paketinin mevcut türü hedef projede etkinleştirilmemiştir. Değişmeden kalmasını istiyorsanız lütfen hedef projede bu türü etkinleştirin. Aksi takdirde, listeden hedef projede kullanılabilir bir tür seçin.
bulk_current_type_not_available_in_target_project: >
- The current types of the work packages aren't enabled in the target project. Please enable the types in the target project if you'd like them to remain unchanged. Otherwise, select an available type in the target project from the list.
+ İş paketinin mevcut türleri hedef projede etkinleştirilmemiştir. Değişmeden kalmasını istiyorsanız lütfen hedef projede bu türleri etkinleştirin. Aksi takdirde, listeden hedef projede kullanılabilir bir tür seçin.
sharing:
missing_workflow_warning:
title: "Workflow missing for work package sharing"
@@ -639,7 +638,7 @@ tr:
error_self_registration_disabled: >
Bu sistemde kullanıcı kaydı yapılması devre dışı bırakılmıştır. Lütfen bir yöneticiden sizin için bir hesap oluşturmasını isteyin.
error_self_registration_limited_provider: >
- User registration is limited for the Single sign-on provider '%{name}'. Please ask an administrator to activate the account for you or change the self registration limit for this provider.
+ Tek noktadan oturum açma sağlayıcısı '%{name}' için kullanıcı kaydı sınırlıdır. Lütfen yöneticiden hesabınızı sizin için etkinleştirmesini veya bu sağlayıcı için kendi kendine kayıt sınırını değiştirmesini isteyin.
login_with_auth_provider: "veya varolan hesabınızı kullanarak oturum açın"
signup_with_auth_provider: "veya kullanarak kaydolun"
auth_source_login: Hesabınızı aktifleştirmek için lütfen %{login} olarak giriş yapın.
@@ -668,12 +667,12 @@ tr:
custom_action:
actions: "Eylemler"
custom_field:
- allow_non_open_versions: "Allow non-open versions"
+ allow_non_open_versions: "Açık olmayan sürümlere izin ver"
default_value: "Varsayılan değer"
editable: "Düzenlenebilir"
field_format: "Biçim"
is_filter: "Filtre olarak kullanılan"
- is_for_all: "For all projects"
+ is_for_all: "Tüm projeler için"
is_required: "Gerekli"
max_length: "Maksimum uzunluk"
min_length: "Minimum uzunluk"
@@ -681,15 +680,15 @@ tr:
possible_values: "Olası değerler"
regexp: "Düzenli ifade"
searchable: "Aranabilir"
- admin_only: "Admin-only"
+ admin_only: "Yalnızca yönetici"
custom_value:
value: "Değer"
doorkeeper/application:
uid: "Müşteri Kimliği"
secret: "Müşteri gizliliği"
owner: "Ürün Sahibi"
- builtin: "Builtin"
- enabled: "Active"
+ builtin: "Dahili"
+ enabled: "Aktif"
redirect_uri: "Yönlendirme URI'si"
client_credentials_user_id: "Müşteri Kimlik Bilgileri ve Kullanıcı Kimliği gereklidir"
scopes: "Kapsamlar"
@@ -737,7 +736,7 @@ tr:
queries: "Sorgular"
status_code: "Proje Durumu"
description: "Açıklama"
- status_explanation: "Project status description"
+ status_explanation: "Proje durumunun tanımı"
status_codes:
not_started: "Başlatılmadı"
on_track: "Takipte"
@@ -753,8 +752,8 @@ tr:
versions: "Sürümler"
work_packages: "İş Paketleri"
project_custom_field:
- is_required: "Required for all projects"
- custom_field_section: Section
+ is_required: "Tüm projelerde zorunludur"
+ custom_field_section: Bölüm
query:
column_names: "Sütunlar"
relations_to_type_column: "%{type} ile ilişkileri"
@@ -763,7 +762,7 @@ tr:
filters: "Filtreler"
timeline_labels: "Zaman çizelgesi etiketleri"
relation:
- lag: "Lag"
+ lag: "Gecikme"
from: "İş paketi"
to: "İlgili iş paketi"
repository:
@@ -773,14 +772,14 @@ tr:
status:
is_closed: "İş paketi kapalı"
is_readonly: "İş paketi salt okunur"
- excluded_from_totals: "Exclude from calculation of totals in hierarchy"
- default_done_ratio: "% Complete"
+ excluded_from_totals: "Hiyerarşideki toplamların hesaplanmasından hariç tut"
+ default_done_ratio: "% Tamamlandı"
time_entry:
activity: "Etkinlik"
hours: "Saat"
spent_on: "Tarih"
type: "Tür"
- ongoing: "Ongoing"
+ ongoing: "Devam eden"
type:
description: "Açıklama için varsayılan metin"
attribute_groups: ""
@@ -792,7 +791,7 @@ tr:
admin: "Yönetici"
auth_source: "Authentication source"
ldap_auth_source: "LDAP bağlantısı"
- identity_url: "Identity URL"
+ identity_url: "Kimlik URL'si"
current_password: "Mevcut parola"
force_password_change: "Sonraki oturum açma işleminde parola değişikliğine zorla"
language: "Dil"
@@ -806,8 +805,8 @@ tr:
time_zone: "Zaman dilimi"
auto_hide_popups: "Başarılı bildirimleri otomatik olarak gizle"
warn_on_leaving_unsaved: "İş paketlerinden ayrılırken kaydedilmemiş değişiklik olduğunda beni uyar"
- theme: "Mode"
- mode_guideline: "Some modes will overwrite custom theme colours for accessibility and legibility. For the full custom theme, please select Light mode."
+ theme: "Mod"
+ mode_guideline: "Bazı modlar, erişilebilirlik ve okunabilirlik için özel tema renklerini değiştirecektir. Özel temada tüm özellikleri kullanmak için lütfen Açık modu seçin."
version:
effective_date: "Bitiş tarihi"
sharing: "Paylaşım"
@@ -823,7 +822,7 @@ tr:
derived_done_ratio: "Toplam tamamlanma %"
derived_remaining_hours: "Toplam kalan iş"
derived_remaining_time: "Toplam kalan iş"
- done_ratio: "% Complete"
+ done_ratio: "% Tamamlandı"
duration: "Süre"
end_insertion: "Ekleme işlemi bitti"
end_deletion: "Silme işlemi bitti"
@@ -832,16 +831,16 @@ tr:
title: "İş Günleri"
false: "Sadece iş günleri"
true: "çalışılmayan günleri dahil et"
- notify: "Notify" #used in custom actions
+ notify: "Bildirim" #used in custom actions
parent: "Üst"
parent_issue: "Üst"
parent_work_package: "Üst"
priority: "Öncelik"
- progress: "% Complete"
+ progress: "% Tamamlandı"
readonly: "Salt okunur"
remaining_hours: "Kalan çalışma"
remaining_time: "Kalan çalışma"
- shared_with_users: "Shared with"
+ shared_with_users: "Şununla paylaşıldı"
schedule_manually: "Manuel zamanlamayı etkinleştir"
spent_hours: "Harcanan zaman"
spent_time: "Harcanan zaman"
@@ -859,8 +858,8 @@ tr:
before_or_equal_to: "%{date}} tarihinden önce veya ona eşit olmalıdır."
blank: "boş bırakılamaz."
blank_nested: "'%{property}' özelliğinin ayarlanmış olması gerekir."
- cannot_delete_mapping: "is required. Cannot be deleted."
- is_for_all_cannot_modify: "is for all projects and can therefore not be modified."
+ cannot_delete_mapping: "zorunlu. Silinemez."
+ is_for_all_cannot_modify: "tüm projeler içindir ve bu nedenle değiştirilemez."
cant_link_a_work_package_with_a_descendant: "İş paketi alt görevlerinden birine bağlanamaz."
circular_dependency: "Bu ilişki döngüsel bağımlılık oluşturacak."
confirmation: "%{attribute} eşleşmiyor."
@@ -891,17 +890,17 @@ tr:
not_available: "Sistem yapılandırması nedeniyle kullanılamaz.\n"
not_deletable: "kaldırılamadı."
not_current_user: "mevcut kullanıcı değil."
- not_found: "not found."
+ not_found: "bulunamadı."
not_a_date: "geçerli bir tarih değil."
not_a_datetime: "geçerli bir zaman değil."
not_a_number: "bir sayı değil."
not_allowed: "Eksik izinler nedeniyle geçersiz."
- not_json: "is not a valid JSON object."
+ not_json: "geçerli bir JSON nesnesi değildir."
not_an_integer: "bir tamsayı değil."
not_an_iso_date: "geçerli bir tarih değil. Gerekli biçim:: YYYY-AA-GG."
not_same_project: "aynı projeye ait değil."
odd: "tek sayı olmalı."
- regex_match_failed: "does not match the regular expression %{expression}."
+ regex_match_failed: "%{expression} düzenli ifadesiyle eşleşmiyor."
regex_invalid: "atanmış düzenli ifadeler ile doğrulanamadı."
smaller_than_or_equal_to_max_length: "en fazla uzunluğa eşit veya daha küçük olmalıdır."
taken: "zaten alınmıştır."
@@ -939,7 +938,7 @@ tr:
custom_fields_project:
attributes:
project_ids:
- blank: "Please select a project."
+ blank: "Lütfen bir proje seçin."
custom_actions:
only_one_allowed: "(%{name}) yalnızca bir değer verilir."
empty: "(%{name}) değeri boş olamaz."
@@ -1397,7 +1396,7 @@ tr:
button_continue: "Devam et"
button_copy: "Kopyala"
button_copy_to_clipboard: "Panoya kopyala"
- button_copy_link_to_clipboard: "Copy link to clipboard"
+ button_copy_link_to_clipboard: "Bağlantıyı panoya kopyala"
button_copy_and_follow: "Kopyala ve takip et"
button_create: "Oluştur"
button_create_and_continue: "Oluştur ve devam et"
@@ -1411,7 +1410,7 @@ tr:
button_expand_all: "Tümünü genişlet"
button_favorite: "Favorilere Ekle"
button_filter: "Filtre"
- button_finish_setup: "Finish setup"
+ button_finish_setup: "Kurulumu bitir"
button_generate: "Üretmek"
button_list: "Liste"
button_lock: "Kilitle"
@@ -1449,23 +1448,23 @@ tr:
button_add_menu_entry: "Menü öğesi ekle"
button_configure_menu_entry: "Menü öğesini düzenle"
button_delete_menu_entry: "Menü öğesini sil"
- button_view_shared_work_packages: "View shared work packages"
- button_manage_roles: "Manage roles"
- button_remove_member: "Remove member"
- button_remove_member_and_shares: "Remove member and shares"
- button_revoke_work_package_shares: "Revoke work package shares"
- button_revoke_access: "Revoke access"
- button_revoke_all: "Revoke all"
- button_revoke_only: "Revoke only %{shared_role_name}"
- button_publish: "Make public"
- button_unpublish: "Make private"
+ button_view_shared_work_packages: "Baylaşılan iş paketlerinin göster"
+ button_manage_roles: "Görevleri yönet"
+ button_remove_member: "Üyeyi çıkart"
+ button_remove_member_and_shares: "Üye ve paylaşımlarını kaldır"
+ button_revoke_work_package_shares: "İş paketi paylaşımlarını iptal edin"
+ button_revoke_access: "Erişimi iptal et"
+ button_revoke_all: "Tümünü iptal et"
+ button_revoke_only: "Yalnızca %{shared_role_name} iptal et"
+ button_publish: "Herkese aç"
+ button_unpublish: "Özel hale getir"
consent:
checkbox_label: Yukarıdakilere dikkat ettim ve onay verdim.
failure_message: Rıza alımı başarısız oldu, işlenemedi.
title: Kullanıcı Rızası
decline_warning_message: Onay vermeyi reddettiniz ve çıkış yaptınız.
- user_has_consented: The user gave their consent to your [configured consent information text](consent_settings).
- not_yet_consented: The user has not yet given their consent to your [configured consent information text](consent_settings). They will be reminded the next time they log in.
+ user_has_consented: Kullanıcı [yapılandırılmış rıza bilgisi metninize] (consent_settings) onay verdi.
+ not_yet_consented: Kullanıcı henüz [yapılandırılmış rıza bilgisi metninize] (consent_settings) onay vermedi. Bir sonraki girişlerinde kendisine hatırlatılacak.
contact_mail_instructions: Veri değişikliği veya kaldırma isteklerini gerçekleştirmek için kullanıcıların bir veri denetleyicisine erişebilecekleri posta adresini tanımlayın.
contact_your_administrator: Hesabınızın silinmesini istiyorsanız, lütfen yöneticinize başvurun.
contact_this_mail_address: Hesabınızın silinmesini istiyorsanız, lütfen %{mail_address} ile iletişime geçin.
@@ -1576,23 +1575,23 @@ tr:
one: "1 dakika"
other: "%{count} dakika"
x_minutes_abbreviated:
- one: "1 min"
- other: "%{count} mins"
+ one: "1 dak"
+ other: "%{count} dak"
x_hours:
one: "1 saat"
other: "%{count} saat"
x_hours_abbreviated:
- one: "1 hr"
- other: "%{count} hrs"
+ one: "1 sa"
+ other: "%{count} sa"
x_weeks:
- one: "1 week"
- other: "%{count} weeks"
+ one: "1 hafta"
+ other: "%{count} hafta"
x_months:
one: "1 ay"
other: "%{count} ay"
x_years:
one: "1 yıl"
- other: "%{count} years"
+ other: "%{count} yıl"
x_seconds:
one: "1 saniye"
other: "%{count} saniye"
@@ -1649,8 +1648,8 @@ tr:
error_can_not_archive_project: "Bu proje arşivlenemiyor: %{errors}"
error_can_not_delete_entry: "Girdi silinemiyor"
error_can_not_delete_custom_field: "Özel alan silinemiyor"
- error_can_not_delete_in_use_archived_undisclosed: "There are also work packages in archived projects. You need to ask an administrator to perform the deletion to see which projects are affected."
- error_can_not_delete_in_use_archived_work_packages: "There are also work packages in archived projects. You need to reactivate the following projects first, before you can change the attribute of the respective work packages: %{archived_projects_urls}"
+ error_can_not_delete_in_use_archived_undisclosed: "Arşivlenmiş projelerde de iş paketleri var. Hangi projelerin etkilendiğini görmek için bir yöneticiden silme işlemini gerçekleştirmesini istemeniz gerekir."
+ error_can_not_delete_in_use_archived_work_packages: "Arşivlenen projelerde de iş paketleri var. İlgili iş paketlerinin niteliğini değiştirebilmeniz için önce aşağıdaki projeleri yeniden etkinleştirmeniz gerekir: %{archived_projects_urls}"
error_can_not_delete_type:
explanation: 'Bu tür iş paketleri içerir ve silinemez. Etkilenen tüm iş paketlerini bu görünümde görebilirsiniz.'
error_can_not_delete_standard_type: "Standart türler silinemez."
@@ -1675,7 +1674,7 @@ tr:
error_pdf_failed_to_export: "PDF çıktısı kaydedilemedi: %{error}"
error_token_authenticity: "Siteler Arası İstek Sahteciliği belirteci doğrulanamadı. Birden fazla tarayıcı veya sekme hakkında veri göndermeyi denediniz mi? Lütfen tüm sekmeleri kapatın ve tekrar deneyin"
error_work_package_not_found_in_project: "Iş paketi bulunamadı veya bu projeye ait değil"
- error_work_package_id_not_found: "The work package was not found."
+ error_work_package_id_not_found: "İş paketi bulunamadı."
error_must_be_project_member: "projesi üyesi olmalıdır"
error_migrations_are_pending: "OpenProject kurulumunuzda bekleyen veritabanı geçişleri var. Son yükseltme işleminizde geçiş işlemlerini gerçekleştirme ihtimalinizi büyük olasılıkla kaçırdınız. Lütfen kurulumunuzu uygun şekilde yükseltmek için yükseltme kılavuzunu kontrol edin."
error_migrations_visit_upgrade_guides: "Lütfen yükseltme kılavuzu belgelerimizi ziyaret edin"
@@ -1698,7 +1697,7 @@ tr:
error_menu_item_not_saved: Menü öğesi kaydedilemez
error_wiki_root_menu_item_conflict: >
Var olan menü üyesi "%{existing_caption}" (%{existing_identifier}) ile çakıştığından, "%{old_name}" adı "%{new_name}" olarak değiştirilemiyor.
- error_external_authentication_failed_message: "An error occurred during external authentication: %{message}"
+ error_external_authentication_failed_message: "Harici kimlik doğrulama sırasında bir hata oluştu: %{message}"
error_attribute_not_highlightable: "Nitelikler vurgulanmıyor: %{attributes}"
events:
changeset: "Değişiklikler düzenlendi"
@@ -1715,13 +1714,13 @@ tr:
work_package_note: "İk Paketi notu eklendi"
title:
project: "Proje: %{name}"
- subproject: "Subproject: %{name}"
+ subproject: "Alt-proje: %{name}"
export:
dialog:
- title: "Export"
- submit: "Export"
+ title: "Dışarı aktar"
+ submit: "Dışarı aktar"
format:
- label: "File format"
+ label: "Dosya biçimi"
options:
csv:
label: "CSV"
@@ -1730,32 +1729,32 @@ tr:
xls:
label: "XLS"
columns:
- input_label_report: "Add columns to attribute table"
- input_caption_report: "By default all attributes added as columns in the work package list are selected. Long text fields are not available in the attribute table, but can be displayed below it."
- input_caption_table: "By default all attributes added as columns in the work package list are selected. Long text fields are not available in table based exports."
+ input_label_report: "Nitelik tablosuna sütun ekle"
+ input_caption_report: "Varsayılan olarak, iş paketi listesine sütun olarak eklenen tüm nitelikler seçilir. Uzun metin alanları nitelik tablosunda mevcut değildir, ancak altında görüntülenebilir."
+ input_caption_table: "Varsayılan olarak, iş paketi listesine sütun olarak eklenen tüm nitelikler seçilir. Uzun metin alanları tablo olarak dışarı aktarımda mevcut değildir."
pdf:
export_type:
- label: "PDF export type"
+ label: "PDF dışa aktarma türü"
options:
table:
- label: "Table"
- caption: "Export the work packages list in a table with the desired columns."
+ label: "Tablo"
+ caption: "İş paketleri listesini istediğiniz sütunlarla bir tablo halinde dışa aktarın."
report:
- label: "Report"
- caption: "Export the work package on a detailed report of all work packages in the list."
+ label: "Rapor"
+ caption: "Listedeki tüm iş paketlerini içeren ayrıntılı bir rapor olarak iş paketini dışa aktarın."
gantt:
- label: "Gantt chart"
- caption: "Export the work packages list in a Gantt diagram view."
+ label: "Gantt grafiği"
+ caption: "İş paketleri listesini bir Gantt diyagramı görünümünde dışa aktarın."
include_images:
- label: "Include images"
- caption: "Exclude images to reduce the size of the PDF export."
+ label: "Görüntüleri dahil et"
+ caption: "PDF boyutunu küçültmek için görüntüleri hariç tutun."
gantt_zoom_levels:
- label: "Zoom levels"
- caption: "Select what is the zoom level for dates displayed in the chart."
+ label: "Yakınlaştırma düzeyi"
+ caption: "Grafikte görüntülenen tarihler için yakınlaştırma düzeyinin ne olduğunu seçin."
options:
- days: "Days"
- weeks: "Weeks"
- months: "Months"
+ days: "Gün"
+ weeks: "Hafta"
+ months: "Ay"
quarters: "Quarters"
column_width:
label: "Table column width"
@@ -3572,7 +3571,7 @@ tr:
status_user_and_brute_force: "%{user} ve %{brute_force}"
status_change: "Durum değişikliği"
text_change_disabled_for_provider_login: "Ad, giriş sağlayıcınız tarafından belirlenir ve bu nedenle değiştirilemez."
- text_change_disabled_for_ldap_login: "The name and email is set by LDAP and can thus not be changed."
+ text_change_disabled_for_ldap_login: "İsim ve e-posta LDAP tarafından belirlenir ve bu nedenle değiştirilemez."
unlock: "Kilidi kaldır"
unlock_and_reset_failed_logins: "Başarısız oturum açma işlemlerinin kilidini aç ve sıfırla"
version_status_closed: "kapalı"
diff --git a/config/locales/crowdin/uk.yml b/config/locales/crowdin/uk.yml
index dc3084533ad4..4449e9dc088a 100644
--- a/config/locales/crowdin/uk.yml
+++ b/config/locales/crowdin/uk.yml
@@ -37,9 +37,9 @@ uk:
label_submit_comment: "Надіслати коментар"
changed_on: "змінено"
created_on: "створив(-ла)"
- changed: "змінено"
- created: "створено"
- commented: "прокоментовано"
+ changed: "змінив(-ла)"
+ created: "створив(-ла)"
+ commented: "прокоментував(-ла)"
admin:
plugins:
no_results_title_text: Зараз немає встановлених плагінів.
diff --git a/config/locales/crowdin/zh-TW.yml b/config/locales/crowdin/zh-TW.yml
index bf7b2d41e20f..4c4d5fb90d5b 100644
--- a/config/locales/crowdin/zh-TW.yml
+++ b/config/locales/crowdin/zh-TW.yml
@@ -1273,7 +1273,7 @@ zh-TW:
assigned_to: "執行者"
assignee: "執行者"
attachments: "附加檔"
- author: "作者"
+ author: "工作項目發起者"
base: "一般錯誤:"
blocks_ids: "已被限制的工作項目 IDs"
category: "類別"
diff --git a/docs/release-notes/14-5-0/README.md b/docs/release-notes/14-5-0/README.md
index ef89c4690755..cb0b018c7fce 100644
--- a/docs/release-notes/14-5-0/README.md
+++ b/docs/release-notes/14-5-0/README.md
@@ -78,11 +78,11 @@ See our user guide to learn more about [project lists and how to filter them](..
### PDF export of meeting agenda and meeting
-When pressing the key combination for printing – e.g. **cmd + P** for mac users or **STRG + P** for Windows users – you can create your meeting as PDF, download and print it. This has been improved with OpenProject 14.5, so that, for example, meeting buttons like **+ Add** are not displayed in the PDF.
+When pressing the key combination for printing – e.g. **cmd + P** for mac users or **CTRL + P** for Windows users – you can create your meeting as PDF, download and print it. This has been improved with OpenProject 14.5, so that, for example, meeting buttons like **+ Add** are not displayed in the PDF.
### Meetings: Disable by default "Send out invitation emails upon creation"
-When creating a new meeting in OpenProject, you can choose wheather you want to send out invitation emails or not. Up until now, this has been enabled by default. Due to user feedback, this option is now disabled per default.
+When creating a new meeting in OpenProject, you can choose whether you want to send out invitation emails or not. Up until now, this has been enabled by default. Due to user feedback, this option is now disabled per default.
### Rename actions in work package dropdown menu
@@ -131,7 +131,7 @@ In this release, the dynamic bootstrapping of Angular components has been remove
- Bugfix: \[API doc\] GET /projects missing params and incorrect response \[[#40642](https://community.openproject.org/wp/40642)\]
- Bugfix: OpenAPI Specs wrong for creating work package relations \[[#40942](https://community.openproject.org/wp/40942)\]
- Bugfix: API Description and OpenAPI Spec not consistent \[[#40945](https://community.openproject.org/wp/40945)\]
-- Bugfix: Truncaded custom fields in work package table (Browser: Edge) \[[#52890](https://community.openproject.org/wp/52890)\]
+- Bugfix: Truncated custom fields in work package table (Browser: Edge) \[[#52890](https://community.openproject.org/wp/52890)\]
- Bugfix: GitLab integration pipeline status not updated \[[#54122](https://community.openproject.org/wp/54122)\]
- Bugfix: Wrong date format in notification email \[[#54136](https://community.openproject.org/wp/54136)\]
- Bugfix: Sort order of wiki pages in side-menu wrong / inconsistent \[[#54450](https://community.openproject.org/wp/54450)\]
@@ -147,8 +147,8 @@ In this release, the dynamic bootstrapping of Angular components has been remove
- Bugfix: Internal error when trying to change 2FA settings that are enforced through ENV \[[#56821](https://community.openproject.org/wp/56821)\]
- Bugfix: FixDeletedDataJournals migration can fail sometimes \[[#56846](https://community.openproject.org/wp/56846)\]
- Bugfix: Backlogs and GitHub have unnecessarily nested menu nodes \[[#56920](https://community.openproject.org/wp/56920)\]
-- Bugfix: Wording of error message for Nextcloud host in storage form is missleading \[[#56992](https://community.openproject.org/wp/56992)\]
-- Bugfix: OpenProject Dark Mode: selection colour of table rows \[[#57003](https://community.openproject.org/wp/57003)\]
+- Bugfix: Wording of error message for Nextcloud host in storage form is misleading \[[#56992](https://community.openproject.org/wp/56992)\]
+- Bugfix: OpenProject Dark Mode: selection color of table rows \[[#57003](https://community.openproject.org/wp/57003)\]
- Bugfix: Work package toolbar has double outline on left \[[#57004](https://community.openproject.org/wp/57004)\]
- Bugfix: Firefox cuts PDF export after the first page \[[#57027](https://community.openproject.org/wp/57027)\]
- Bugfix: Some status indicators are missing a border \[[#57031](https://community.openproject.org/wp/57031)\]
@@ -158,16 +158,16 @@ In this release, the dynamic bootstrapping of Angular components has been remove
- Bugfix: Nextcloud "recheck connection" checks for GroupFolderApp though AMPF is deactivated \[[#57068](https://community.openproject.org/wp/57068)\]
- Bugfix: In the calendar widget on the My Page page, meetings are displayed with the wrong time \[[#57078](https://community.openproject.org/wp/57078)\]
- Bugfix: Default user avatar is too big for work package table rendering (safari) \[[#57093](https://community.openproject.org/wp/57093)\]
-- Bugfix: OpenProject Dark Mode: CKEditor using too light colours e.g. for pressed buttons \[[#57103](https://community.openproject.org/wp/57103)\]
+- Bugfix: OpenProject Dark Mode: CKEditor using too light colors e.g. for pressed buttons \[[#57103](https://community.openproject.org/wp/57103)\]
- Bugfix: Cannot download 2FA backup codes \[[#57146](https://community.openproject.org/wp/57146)\]
- Bugfix: OpenProject Dark Mode: diff view for description (and large text fields) not matching \[[#57151](https://community.openproject.org/wp/57151)\]
- Bugfix: Project filter in notification center is not correctly highlighted \[[#57154](https://community.openproject.org/wp/57154)\]
- Bugfix: Time and cost report : text of unit cost activity is displayed with html tag '<i>' \[[#57198](https://community.openproject.org/wp/57198)\]
- Bugfix: Meeting selection in work packages highly confusing \[[#57205](https://community.openproject.org/wp/57205)\]
- Bugfix: Attachment headlines are semi-transparent and overlapped by content \[[#57209](https://community.openproject.org/wp/57209)\]
-- Bugfix: Webhook doesn't log all errors \[[#57277](https://community.openproject.org/wp/57277)\]
+- Bugfix: Webhook doesn't log all errors \[[#57277](https://community.openproject.org/wp/57277)\]
- Bugfix: Notifications for date alerts show name of a person \[[#57279](https://community.openproject.org/wp/57279)\]
-- Bugfix: OpenProject Dark Mode: reiterate hover/active button colour \[[#57282](https://community.openproject.org/wp/57282)\]
+- Bugfix: OpenProject Dark Mode: reiterate hover/active button color \[[#57282](https://community.openproject.org/wp/57282)\]
- Bugfix: Robots follow action links unnecessarily \[[#57316](https://community.openproject.org/wp/57316)\]
- Bugfix: Some previews in the Lookbook do not work \[[#57322](https://community.openproject.org/wp/57322)\]
- Bugfix: Number of meeting participants does not add up \[[#57392](https://community.openproject.org/wp/57392)\]
diff --git a/docs/release-notes/14-6-0/README.md b/docs/release-notes/14-6-0/README.md
index 96fa924c27e2..1e7eb256be9e 100644
--- a/docs/release-notes/14-6-0/README.md
+++ b/docs/release-notes/14-6-0/README.md
@@ -83,7 +83,7 @@ On the Meetings tab in the split screen view, the number next to the “Meetings
- Bugfix: Authorization::UnknownPermissionError happened in GET::API::V3::Root#/ \[[#56064](https://community.openproject.org/wp/56064)\]
- Bugfix: Some Gantt charts get migrated to the work package module \[[#56769](https://community.openproject.org/wp/56769)\]
- Bugfix: \[API doc\] color attribute of status missing \[[#57016](https://community.openproject.org/wp/57016)\]
-- Bugfix: Menu Transparent for existings user afer db upgrade to 14.3.0 from 9.x \[[#57037](https://community.openproject.org/wp/57037)\]
+- Bugfix: Menu Transparent for existing user after db upgrade to 14.3.0 from 9.x \[[#57037](https://community.openproject.org/wp/57037)\]
- Bugfix: Right side of the instance upper banner looks misaligned \[[#57092](https://community.openproject.org/wp/57092)\]
- Bugfix: Primer: Action menu is sometimes incorrectly positioned on mobile \[[#57143](https://community.openproject.org/wp/57143)\]
- Bugfix: Icons and spacing is off on Work package table configuration view \[[#57345](https://community.openproject.org/wp/57345)\]
@@ -103,7 +103,7 @@ On the Meetings tab in the split screen view, the number next to the “Meetings
- Bugfix: www-authenticate header lacks comma \[[#58009](https://community.openproject.org/wp/58009)\]
- Bugfix: Nextcloud connection validation fails on disabled AMPF configuration \[[#58018](https://community.openproject.org/wp/58018)\]
- Bugfix: White space wrong in text diff \[[#58092](https://community.openproject.org/wp/58092)\]
-- Bugfix: Primary button with a different custom colour remains green on click/pressed \[[#58130](https://community.openproject.org/wp/58130)\]
+- Bugfix: Primary button with a different custom color remains green on click/pressed \[[#58130](https://community.openproject.org/wp/58130)\]
- Bugfix: 'dd' is showing when reloading notification center \[[#58134](https://community.openproject.org/wp/58134)\]
- Bugfix: Update storage banners to render with rounded borders \[[#58142](https://community.openproject.org/wp/58142)\]
- Bugfix: Update the post storage creation message: admins don't need to activate individual modules per project anymore \[[#58150](https://community.openproject.org/wp/58150)\]
@@ -123,7 +123,7 @@ On the Meetings tab in the split screen view, the number next to the “Meetings
- Feature: Add to connection validation that managed directory is empty for Nextcloud storages \[[#57347](https://community.openproject.org/wp/57347)\]
- Feature: Turn project list into favorite without reloading the page \[[#57505](https://community.openproject.org/wp/57505)\]
- Feature: Remove menu entry "Projects" from "System settings" submenu in the Administration \[[#57536](https://community.openproject.org/wp/57536)\]
-- Feature: Replace "Add assignee" button in Team Pleanner with "+ Assignee" \[[#57648](https://community.openproject.org/wp/57648)\]
+- Feature: Replace "Add assignee" button in Team Planner with "+ Assignee" \[[#57648](https://community.openproject.org/wp/57648)\]
- Feature: Update all clickable elements inside the box elements with the link color \[[#57649](https://community.openproject.org/wp/57649)\]
- Feature: Keep scroll position when reloading a meeting through the update flash \[[#57904](https://community.openproject.org/wp/57904)\]
- Feature: Improvements to the Participants side panel (phrasing and spacing) \[[#57911](https://community.openproject.org/wp/57911)\]
diff --git a/docs/release-notes/15-0-0/README.md b/docs/release-notes/15-0-0/README.md
index 84e49020f158..7af154f24e35 100644
--- a/docs/release-notes/15-0-0/README.md
+++ b/docs/release-notes/15-0-0/README.md
@@ -169,7 +169,7 @@ For more information, please see our updated guides on these topics:
- Feature: Primerised version of the basic work package hovercard \[[#58512](https://community.openproject.org/wp/58512)\]
- Bugfix: Work package date picker: wrong spacing \[[#47777](https://community.openproject.org/wp/47777)\]
- Bugfix: User is not taken to the secondary input field after selecting a filter \[[#53767](https://community.openproject.org/wp/53767)\]
-- Bugfix: Creating project from template doesn't take over version filter correctly \[[#53978](https://community.openproject.org/wp/53978)\]
+- Bugfix: Creating project from template doesn't take over version filter correctly \[[#53978](https://community.openproject.org/wp/53978)\]
- Bugfix: \[mobile\] Scrolling within a modal scrolls the content underneath \[[#54109](https://community.openproject.org/wp/54109)\]
- Bugfix: Missing "cause" in WP journal when closing duplicates \[[#54372](https://community.openproject.org/wp/54372)\]
- Bugfix: The Assignee drop down list in the work packages list can't show long name perfectly. \[[#55870](https://community.openproject.org/wp/55870)\]
@@ -187,10 +187,10 @@ For more information, please see our updated guides on these topics:
- Bugfix: Topbar search input text color is too dark when unfocused \[[#57950](https://community.openproject.org/wp/57950)\]
- Bugfix: The Activity entry for creation is lacking the info that it is a "Creation". \[[#57968](https://community.openproject.org/wp/57968)\]
- Bugfix: Number of listed Work Packages limited to 20 only w/o button of page number for switching \[[#57977](https://community.openproject.org/wp/57977)\]
-- Bugfix: Fix AMPF "Health status" error messages capitalisation \[[#58016](https://community.openproject.org/wp/58016)\]
+- Bugfix: Fix AMPF "Health status" error messages capitalization \[[#58016](https://community.openproject.org/wp/58016)\]
- Bugfix: User tab headers overlap when header text is long \[[#58106](https://community.openproject.org/wp/58106)\]
- Bugfix: Dark mode: "Custom text" widget - table cell editing UI has wrong colors \[[#58108](https://community.openproject.org/wp/58108)\]
-- Bugfix: Self notification doesn't trigger a notifcation and mail \[[#58151](https://community.openproject.org/wp/58151)\]
+- Bugfix: Self notification doesn't trigger a notification and mail \[[#58151](https://community.openproject.org/wp/58151)\]
- Bugfix: Unnecessary space to the right on certain view width \[[#58237](https://community.openproject.org/wp/58237)\]
- Bugfix: Access token refresh results in error message in files tab \[[#58271](https://community.openproject.org/wp/58271)\]
- Bugfix: Improve sidebar item alignment \[[#58280](https://community.openproject.org/wp/58280)\]
@@ -200,7 +200,7 @@ For more information, please see our updated guides on these topics:
- Bugfix: My page is empty if user has no permissions \[[#58341](https://community.openproject.org/wp/58341)\]
- Bugfix: Update-Warning is not readable in dark mode \[[#58359](https://community.openproject.org/wp/58359)\]
- Bugfix: Sorting custom actions by "sort" header produces 500 \[[#58361](https://community.openproject.org/wp/58361)\]
-- Bugfix: Creating project from template doesn't take over version column correctly \[[#58388](https://community.openproject.org/wp/58388)\]
+- Bugfix: Creating project from template doesn't take over version column correctly \[[#58388](https://community.openproject.org/wp/58388)\]
- Bugfix: Meetings modules is not showing the sidebar selection in the PageHeader \[[#58393](https://community.openproject.org/wp/58393)\]
- Bugfix: Enterprise banners have excessive top-margin \[[#58404](https://community.openproject.org/wp/58404)\]
- Bugfix: Enterprise banner is not shown on "new board" page \[[#58411](https://community.openproject.org/wp/58411)\]
@@ -212,7 +212,7 @@ For more information, please see our updated guides on these topics:
- Bugfix: Improve error handling when two users edit the same work package in parallel (conflict) \[[#58634](https://community.openproject.org/wp/58634)\]
- Bugfix: Slow project template selector on new project page \[[#58657](https://community.openproject.org/wp/58657)\]
- Bugfix: Admin info "bug" icon is misleading \[[#58671](https://community.openproject.org/wp/58671)\]
-- Bugfix: Emoji bar doesn't stay anchored \[[#58706](https://community.openproject.org/wp/58706)\]
+- Bugfix: Emoji bar doesn't stay anchored \[[#58706](https://community.openproject.org/wp/58706)\]
- Bugfix: Replace the + icon next to the work package creation item with a regular icon \[[#58735](https://community.openproject.org/wp/58735)\]
- Bugfix: SAML UI migration fails if expired certificate present in current configuration \[[#58851](https://community.openproject.org/wp/58851)\]
- Bugfix: OpenID connect provider does not show Redirect URI \[[#59057](https://community.openproject.org/wp/59057)\]
diff --git a/docs/release-notes/15-0-1/README.md b/docs/release-notes/15-0-1/README.md
index 84540a817e2c..4802f363f2e4 100644
--- a/docs/release-notes/15-0-1/README.md
+++ b/docs/release-notes/15-0-1/README.md
@@ -11,19 +11,11 @@ release_date: 2024-11-13
Release date: 2024-11-13
We released OpenProject [OpenProject 15.0.1](https://community.openproject.org/versions/2157).
-The release contains several bug fixes and we recommend updating to the newest version.
-In these Release Notes, we will give an overview of important feature changes.
-At the end, you will find a complete list of all changes and bug fixes.
+This release contains an important fix for OpenID Connect providers using Microsoft Entra.
+The tenant of the Azure environment was not correctly communicated to the provider, resulting in failing logins.
-## Important feature changes
+This has been fixed. If you are affected by this issue, please update to 15.0.1 and logins should be restored.
-
-
-## Important updates and breaking changes
-
-
-
-
## Bug fixes and changes
@@ -34,14 +26,3 @@ At the end, you will find a complete list of all changes and bug fixes.
-
-## Contributions
-A very special thank you goes to our sponsors for this release.
-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 Javier Valero Celada.
-
-Last but not least, we are very grateful for our very engaged translation contributors on Crowdin, who translated quite a few OpenProject strings!
-Would you like to help out with translations yourself?
-Then take a look at our translation guide and find out exactly how you can contribute.
-It is very much appreciated!
-
diff --git a/docs/release-notes/15-0-2/README.md b/docs/release-notes/15-0-2/README.md
new file mode 100644
index 000000000000..87f50df7b795
--- /dev/null
+++ b/docs/release-notes/15-0-2/README.md
@@ -0,0 +1,36 @@
+---
+title: OpenProject 15.0.2
+sidebar_navigation:
+ title: 15.0.2
+release_version: 15.0.2
+release_date: 2024-11-20
+---
+
+# OpenProject 15.0.2
+
+Release date: 2024-11-20
+
+We released OpenProject [OpenProject 15.0.2](https://community.openproject.org/versions/2158).
+The release contains several bug fixes and we recommend updating to the newest version.
+In these Release Notes, we will give an overview of important feature changes.
+At the end, you will find a complete list of all changes and bug fixes.
+
+
+
+## Bug fixes and changes
+
+
+
+
+- Bugfix: Work package creation event not displayed if aggregation includes a comment \[[#58738](https://community.openproject.org/wp/58738)\]
+- Bugfix: Error toast giving a 500 error without relevant details \[[#59065](https://community.openproject.org/wp/59065)\]
+- Bugfix: The comment box remains open and does not blur on submitting comment \[[#59279](https://community.openproject.org/wp/59279)\]
+- Bugfix: Split screen activity tab does not scroll to the right position from list view \[[#59281](https://community.openproject.org/wp/59281)\]
+- Bugfix: Storage in copied project does not have the correct Project Folder setting \[[#59344](https://community.openproject.org/wp/59344)\]
+- Bugfix: Cannot change limit\_self\_registration for SAML auth providers \[[#59370](https://community.openproject.org/wp/59370)\]
+- Bugfix: Option to limit\_self\_registration in SAML provider not respected \[[#59375](https://community.openproject.org/wp/59375)\]
+- Bugfix: Migration of SAML auth providers doesn't retain limit\_self\_registration \[[#59403](https://community.openproject.org/wp/59403)\]
+- Bugfix: OpenID connect does not allow setting custom scopes \[[#59430](https://community.openproject.org/wp/59430)\]
+
+
+
diff --git a/docs/release-notes/README.md b/docs/release-notes/README.md
index 495306a14982..0aa676ccdc3e 100644
--- a/docs/release-notes/README.md
+++ b/docs/release-notes/README.md
@@ -13,6 +13,13 @@ Stay up to date and get an overview of the new features included in the releases
+## 15.0.2
+
+Release date: 2024-11-20
+
+[Release Notes](15-0-2/)
+
+
## 15.0.1
Release date: 2024-11-13
diff --git a/docs/system-admin-guide/authentication/openid-providers/README.md b/docs/system-admin-guide/authentication/openid-providers/README.md
index 059878d9edaf..832d24d306dc 100644
--- a/docs/system-admin-guide/authentication/openid-providers/README.md
+++ b/docs/system-admin-guide/authentication/openid-providers/README.md
@@ -92,7 +92,7 @@ After pressing **CREATE** you will see a following pop-up window.
- On the next section, set **Client ID** and **Client Secret** (from step 2)
- Enable **Limit self registration** option if you want users that create accounts with this provider to bypass the configured limit for self-registration.
-![Add a new OpenID Gogole provider in OpenProject administration](openproject_system-admin-guide_authentication_openid_provider_new_google.png)
+![Add a new OpenID Google provider in OpenProject administration](openproject_system-admin-guide_authentication_openid_provider_new_google.png)
Press **Finish setup** to save the client and complete. If you go back to the index page of OpenID connect providers, the new provider should be visible.
@@ -281,7 +281,7 @@ The option takes a space-separated list of ACR values. This is functionally the
After entering Claims information, click **Finish setup** to complete the provider creation form.
-![Bildschirmfoto 2024-11-06 um 18.34.28](./custom-provider-claims.png)
+![Custom provider claims](./custom-provider-claims.png)
diff --git a/docs/system-admin-guide/design/README.md b/docs/system-admin-guide/design/README.md
index dea2a33f2c21..bfda59f151d0 100644
--- a/docs/system-admin-guide/design/README.md
+++ b/docs/system-admin-guide/design/README.md
@@ -13,9 +13,9 @@ Navigate to *Administration* -> *Design* in order to customize your OpenProject
The design page provides several options to customize your OpenProject Enterprise edition, grouped under three tabs, **Interface, Branding, PDF export styles**. You can [choose a color theme](#choose-a-color-theme) under any of these tabs.
-Under **Interface** you can also choose [custom colors](#interface-colors) for elements of the interface such as the primary button colour, accent colour, the background of the top navigation header and the main menu.
+Under **Interface** you can also choose [custom colors](#interface-colors) for elements of the interface such as the primary button color, accent color, the background of the top navigation header and the main menu.
-![Design interface settings in OpenProject adminstration](openproject_system_guide_design_interface.png)
+![Design interface settings in OpenProject administration](openproject_system_guide_design_interface.png)
Under the **Branding** tab you can also [upload a custom logo](#upload-a-custom-logo) to replace the default OpenProject logo, [set a custom favicon](#set-a-custom-favicon), which is shown as an icon in your browser window/tab, and [upload a custom touch icon](#set-a-custom-touch-icon), which is shown on your smartphone or tablet when you bookmark OpenProject on your home screen.
@@ -47,7 +47,7 @@ Click the *Upload* button to confirm and upload your logo.
-![Custom logo updated in OpenProject admistration](openproject_system_guide_design_custom_logo_uploaded.png)
+![Custom logo updated in OpenProject administration](openproject_system_guide_design_custom_logo_uploaded.png)
## Set a custom favicon
diff --git a/docs/system-admin-guide/integrations/nextcloud/README.md b/docs/system-admin-guide/integrations/nextcloud/README.md
index 6d000a6af482..ce03a0575deb 100644
--- a/docs/system-admin-guide/integrations/nextcloud/README.md
+++ b/docs/system-admin-guide/integrations/nextcloud/README.md
@@ -180,7 +180,7 @@ To add a Nextcloud to a specific project on a project level, navigate to any exi
To add a Nextcloud storage to one or multiple projects on an instance level, click on a file storage under *Administration -> Files -> External file storages* and select **Enabled in projects** tab. If the file storage setup was not completed properly, you will see a respective message.
-![Storage setup incomplete message in OprnProject file storages administration](openproject_system_guide_nextcloud_integration_setup_incomplete_message.png)
+![Storage setup incomplete message in OpenProject file storages administration](openproject_system_guide_nextcloud_integration_setup_incomplete_message.png)
If the storage was set up correctly, you will be able activate the file storage for one or multiple projects. To do that click the **+Add projects** button.
diff --git a/docs/use-cases/safe-framework/README.md b/docs/use-cases/safe-framework/README.md
index 5216fc294fb1..77a0e48afe16 100644
--- a/docs/use-cases/safe-framework/README.md
+++ b/docs/use-cases/safe-framework/README.md
@@ -77,11 +77,13 @@ You can also use [project templates](../../user-guide/projects/project-templates
Project portfolios allow you to view, organize, sort and filter through all projects and their hierarchies. Since individual projects represent Agile Release trains, project portfolios can be used to access information at a **Solution train**-level.
-![All Features and User Stories across all teams](all_features_across_all_teams.png)
+OpenProject offers a new **Project list** view that lets you create and save custom lists of Projects using your own set of filter criteria. These lists can also display custom project attributes. Individual projects can also be favourited for easier access. Project lists allow you to be build very precise and useful dashboards at a solution-train level.
-> In a near future release, OpenProject will have dedicated project portfolio features. [View mockups.](https://www.figma.com/file/YCCMdJWkrtP9YSmf49Od0i/Project-lists?type=design&node-id=470%3A13037&mode=design&t=g1EZesuy0Jj0VZFD-1)
->
-> For the moment, [global modules](../../user-guide/home/global-modules/) give you an overview of content from all projects, including the ability to view and filter though a **project list**, and view, sort and filter **work packages at a global level**.
+![You can create custom project lists](project_list_-_solution_train.png)
+
+Alternatively, one can also create a meta-project that contains multiple sub-projects (representing ARTs and teams) and create a consolidated custom view. This **work package table** view can be filtered and customised to show particular attributes and custom fields as columns, grouped and sorted. They can also be configured to display epics, features and user stories not just from sub-projects, but from entirely different projects.
+
+![All Features and User Stories across all teams](all_features_across_all_teams.png)
> **Demo:** [Solution train (project list)](https://safe.openproject.com/projects)
>
diff --git a/docs/use-cases/safe-framework/project_list_-_solution_train.png b/docs/use-cases/safe-framework/project_list_-_solution_train.png
new file mode 100644
index 000000000000..b8a8dcac5c80
Binary files /dev/null and b/docs/use-cases/safe-framework/project_list_-_solution_train.png differ
diff --git a/docs/user-guide/activity/README.md b/docs/user-guide/activity/README.md
index eb8225311e3c..7ceffd6c3dcf 100644
--- a/docs/user-guide/activity/README.md
+++ b/docs/user-guide/activity/README.md
@@ -16,7 +16,7 @@ The Activity tab within a work package maintains a history of all updates and ch
![The work package Activity tab split screen](Activity-tab.png)
-When you first access this tab, you will see the comments and list of changes in a timeline. This timeline can be sorted in either chronological (the newest comments at the bottom) or antichronological order (the newest comments on top):
+When you first access this tab, you will see the comments and list of changes in a timeline. This timeline can be sorted in either chronological (the newest comments at the bottom) or anti-chronological order (the newest comments on top):
![You can order the activities to show newest on top or at the bottom](Activity-sortOrder.png)
diff --git a/docs/user-guide/notifications/README.md b/docs/user-guide/notifications/README.md
index 6d7fda907ef0..eed7300dad35 100644
--- a/docs/user-guide/notifications/README.md
+++ b/docs/user-guide/notifications/README.md
@@ -73,7 +73,7 @@ In addition to the in-app notifications, you will also get a once-a-day summary
Click on the **Mark as read** button represented by the envelope icon on the right side of the notification row. This will mark all the notifications for that work package (indicated by the number on the blue badge) as read. You can also use the **Mark as Read** button at the bottom of the split-screen view of a work package to achieve the same result.
-![Mark notifications as read in OpenProject noticification center](openproject_user_guide_notification_center_mark_read_envelope.png)
+![Mark notifications as read in OpenProject notifications center](openproject_user_guide_notification_center_mark_read_envelope.png)
Additionally, you can mark notifications as read in the work package full screen view by clicking on the envelope icon in the upper right corner of the details view.
diff --git a/frontend/src/app/core/turbo/turbo-requests.service.ts b/frontend/src/app/core/turbo/turbo-requests.service.ts
index da2ecacc0747..fdef90241755 100644
--- a/frontend/src/app/core/turbo/turbo-requests.service.ts
+++ b/frontend/src/app/core/turbo/turbo-requests.service.ts
@@ -13,19 +13,26 @@ export class TurboRequestsService {
public request(url:string, init:RequestInit = {}, suppressErrorToast = false):Promise<{ html:string, headers:Headers }> {
return fetch(url, init)
.then((response) => {
- if (!response.ok) {
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
- }
return response.text().then((html) => ({
html,
headers: response.headers,
+ response,
}));
})
.then((result) => {
+ // the result may contain a primer error banner if any server side error appeared
+ // thus we need to render the html even for non-ok responses
renderStreamMessage(result.html);
- return result;
+ // after rendering the html, check if the response and throw an error if it's not ok
+ if (!result.response.ok) {
+ throw new Error(result.response.statusText);
+ } else {
+ // enable further processing of the html and headers in the calling function
+ return { html: result.html, headers: result.headers };
+ }
})
.catch((error) => {
+ // this should only catch errors happening in the client side parsing in the above .then() calls
if (!suppressErrorToast) {
this.toast.addError(error as string);
} else {
diff --git a/frontend/src/stimulus/controllers/dynamic/work-packages/activities-tab/index.controller.ts b/frontend/src/stimulus/controllers/dynamic/work-packages/activities-tab/index.controller.ts
index cf2cc74fa9b4..ef02a67e404a 100644
--- a/frontend/src/stimulus/controllers/dynamic/work-packages/activities-tab/index.controller.ts
+++ b/frontend/src/stimulus/controllers/dynamic/work-packages/activities-tab/index.controller.ts
@@ -398,7 +398,7 @@ export default class IndexController extends Controller {
}
private getScrollableContainer():HTMLElement | null {
- if (this.isWithinNotificationCenter()) {
+ if (this.isWithinNotificationCenter() || this.isWithinSplitScreen()) {
// valid for both mobile and desktop
return document.querySelector('.work-package-details-tab') as HTMLElement;
}
@@ -419,6 +419,10 @@ export default class IndexController extends Controller {
return window.location.pathname.includes(this.notificationCenterPathNameValue);
}
+ private isWithinSplitScreen():boolean {
+ return window.location.pathname.includes('work_packages/details');
+ }
+
private addEventListenersToCkEditorInstance() {
this.onSubmitBound = () => { void this.onSubmit(); };
this.adjustMarginBound = () => { void this.adjustJournalContainerMargin(); };
@@ -633,7 +637,7 @@ export default class IndexController extends Controller {
headers: {
'X-CSRF-Token': (document.querySelector('meta[name="csrf-token"]') as HTMLMetaElement).content,
},
- });
+ }, true);
}
private handleSuccessfulSubmission(html:string, headers:Headers) {
@@ -643,8 +647,8 @@ export default class IndexController extends Controller {
if (!this.journalsContainerTarget) return;
this.clearEditor();
- this.handleEditorVisibility();
- this.adjustJournalsContainer();
+ this.hideEditor();
+ this.resetJournalsContainerMargins();
setTimeout(() => {
if (this.isMobile() && !this.isWithinNotificationCenter()) {
@@ -663,19 +667,11 @@ export default class IndexController extends Controller {
this.saveInProgress = false;
}
- private handleEditorVisibility():void {
- if (this.isMobile()) {
- this.hideEditorIfEmpty();
- } else {
- this.focusEditor();
- }
- }
-
- private adjustJournalsContainer():void {
+ private resetJournalsContainerMargins():void {
if (!this.journalsContainerTarget) return;
this.journalsContainerTarget.style.marginBottom = '';
- this.journalsContainerTarget.classList.add('work-packages-activities-tab-index-component--journals-container_with-input-compensation');
+ this.journalsContainerTarget.classList.add('work-packages-activities-tab-index-component--journals-container_with-initial-input-compensation');
}
private setLastServerTimestampViaHeaders(headers:Headers) {
diff --git a/lib/open_project/version.rb b/lib/open_project/version.rb
index f132f737401d..da66b8a60013 100644
--- a/lib/open_project/version.rb
+++ b/lib/open_project/version.rb
@@ -33,7 +33,7 @@ module OpenProject
module VERSION # :nodoc:
MAJOR = 15
MINOR = 0
- PATCH = 1
+ PATCH = 2
class << self
# Used by semver to define the special version (if any).
diff --git a/modules/auth_saml/app/components/saml/providers/sections/show_component.html.erb b/modules/auth_saml/app/components/saml/providers/sections/show_component.html.erb
index f2777b1de598..a747fa58d42f 100644
--- a/modules/auth_saml/app/components/saml/providers/sections/show_component.html.erb
+++ b/modules/auth_saml/app/components/saml/providers/sections/show_component.html.erb
@@ -33,6 +33,7 @@
tag: :a,
scheme: :invisible,
href: edit_saml_provider_path(provider, edit_state: @target_state),
+ test_selector: "saml_provider_#{@target_state}_edit",
data: { turbo: true, turbo_stream: true },
aria: { label: I18n.t(disabled ? :label_show : :label_edit) }
)
diff --git a/modules/auth_saml/app/contracts/saml/providers/base_contract.rb b/modules/auth_saml/app/contracts/saml/providers/base_contract.rb
index 3e2a24ac82fe..2375f66cfb1c 100644
--- a/modules/auth_saml/app/contracts/saml/providers/base_contract.rb
+++ b/modules/auth_saml/app/contracts/saml/providers/base_contract.rb
@@ -64,6 +64,8 @@ def self.model
attribute :authn_requests_signed
validate :valid_certificate_key_pair
+ attribute :limit_self_registration
+
%i[mapping_mail mapping_login mapping_firstname mapping_lastname].each do |attr|
attribute attr
validates_presence_of attr, if: -> { model.public_send(:"#{attr}_changed?") }
diff --git a/modules/auth_saml/app/controllers/saml/providers_controller.rb b/modules/auth_saml/app/controllers/saml/providers_controller.rb
index 641206537bcf..f79e37580642 100644
--- a/modules/auth_saml/app/controllers/saml/providers_controller.rb
+++ b/modules/auth_saml/app/controllers/saml/providers_controller.rb
@@ -92,7 +92,7 @@ def update
successful_save_response
else
@provider = call.result
- render action: :edit
+ render action: :edit, status: :unprocessable_entity
end
end
@@ -178,7 +178,7 @@ def create_params
def update_params
params
.require(:saml_provider)
- .permit(:display_name, *Saml::Provider.stored_attributes[:options])
+ .permit(:display_name, :limit_self_registration, *Saml::Provider.stored_attributes[:options])
end
def find_provider
diff --git a/modules/auth_saml/app/models/saml/provider/hash_builder.rb b/modules/auth_saml/app/models/saml/provider/hash_builder.rb
index d6bfc89f6b5c..5cbf13df8d5a 100644
--- a/modules/auth_saml/app/models/saml/provider/hash_builder.rb
+++ b/modules/auth_saml/app/models/saml/provider/hash_builder.rb
@@ -72,6 +72,7 @@ def to_h # rubocop:disable Metrics/AbcSize
name_identifier_format:,
certificate:,
private_key:,
+ limit_self_registration:,
attribute_statements: formatted_attribute_statements,
request_attributes: formatted_request_attributes,
uid_attribute: mapping_uid.presence
diff --git a/modules/auth_saml/app/services/saml/configuration_mapper.rb b/modules/auth_saml/app/services/saml/configuration_mapper.rb
index 748745546989..79edb7ce8a0b 100644
--- a/modules/auth_saml/app/services/saml/configuration_mapper.rb
+++ b/modules/auth_saml/app/services/saml/configuration_mapper.rb
@@ -39,8 +39,9 @@ def call!
{
"options" => options,
"slug" => options.delete("name"),
+ "limit_self_registration" => ActiveModel::Type::Boolean.new.cast(options.delete("limit_self_registration")),
"display_name" => options.delete("display_name") || "SAML"
- }
+ }.compact
end
private
diff --git a/modules/auth_saml/spec/factories/saml_provider_factory.rb b/modules/auth_saml/spec/factories/saml_provider_factory.rb
index a53c2c6857c6..1862fd4adca5 100644
--- a/modules/auth_saml/spec/factories/saml_provider_factory.rb
+++ b/modules/auth_saml/spec/factories/saml_provider_factory.rb
@@ -43,6 +43,8 @@
idp_sso_service_url { "https://example.com/sso" }
idp_slo_service_url { "https://example.com/slo" }
+ limit_self_registration { true }
+
mapping_login { Saml::Defaults::MAIL_MAPPING }
mapping_mail { Saml::Defaults::MAIL_MAPPING }
mapping_firstname { Saml::Defaults::FIRSTNAME_MAPPING }
diff --git a/modules/auth_saml/spec/features/administration/saml_crud_spec.rb b/modules/auth_saml/spec/features/administration/saml_crud_spec.rb
index 0efcc2763a04..1fead778ffbe 100644
--- a/modules/auth_saml/spec/features/administration/saml_crud_spec.rb
+++ b/modules/auth_saml/spec/features/administration/saml_crud_spec.rb
@@ -57,6 +57,7 @@
fill_in "Identity provider login endpoint", with: "https://example.com/sso"
fill_in "Identity provider logout endpoint", with: "https://example.com/slo"
fill_in "Public certificate of identity provider", with: CertificateHelper.valid_certificate.to_pem
+ check "Limit self registration"
click_link_or_button "Continue"
@@ -68,11 +69,11 @@
click_link_or_button "Continue"
# Mapping form
- fill_in "Mapping for: Username", with: "login\nmail", fill_options: { clear: :backspace }
- fill_in "Mapping for: Email", with: "mail", fill_options: { clear: :backspace }
- fill_in "Mapping for: First name", with: "myName", fill_options: { clear: :backspace }
- fill_in "Mapping for: Last name", with: "myLastName", fill_options: { clear: :backspace }
- fill_in "Mapping for: Internal user id", with: "uid", fill_options: { clear: :backspace }
+ fill_in "Mapping for: Username", with: "login\nmail"
+ fill_in "Mapping for: Email", with: "mail"
+ fill_in "Mapping for: First name", with: "myName"
+ fill_in "Mapping for: Last name", with: "myLastName"
+ fill_in "Mapping for: Internal user id", with: "uid"
click_link_or_button "Continue"
@@ -105,6 +106,7 @@
expect(provider.mapping_lastname).to eq "myLastName"
expect(provider.mapping_uid).to eq "uid"
expect(provider.authn_requests_signed).to be true
+ expect(provider.limit_self_registration).to be true
click_link_or_button "Delete"
# Confirm the deletion
@@ -175,6 +177,19 @@
expect(page).to have_text "Display name has already been taken."
end
+
+ it "can toggle limit_self_registration (Regression #59370)" do
+ visit "/admin/saml/providers"
+ click_link_or_button "My provider"
+
+ page.find_test_selector("saml_provider_configuration_edit").click
+ check "Limit self registration"
+ click_link_or_button "Update"
+ wait_for_network_idle
+
+ provider.reload
+ expect(provider.limit_self_registration).to be true
+ end
end
end
diff --git a/modules/auth_saml/spec/lib/open_project/auth_saml_spec.rb b/modules/auth_saml/spec/lib/open_project/auth_saml_spec.rb
index 263cd698e03d..89b3bdaa3bcd 100644
--- a/modules/auth_saml/spec/lib/open_project/auth_saml_spec.rb
+++ b/modules/auth_saml/spec/lib/open_project/auth_saml_spec.rb
@@ -15,6 +15,7 @@
expect(subject[:assertion_consumer_service_url]).to eq "http://#{Setting.host_name}/auth/my-saml/callback"
expect(subject[:idp_sso_service_url]).to eq "https://example.com/sso"
expect(subject[:idp_slo_service_url]).to eq "https://example.com/slo"
+ expect(subject[:limit_self_registration]).to be true
attributes = subject[:attribute_statements]
expect(attributes[:email]).to eq Saml::Defaults::MAIL_MAPPING.split("\n")
@@ -30,5 +31,15 @@
expect(security[:want_assertions_signed]).to be false
expect(security[:want_assertions_encrypted]).to be false
end
+
+ context "with limit_self_registration: false" do
+ let!(:provider) do
+ create(:saml_provider, slug: "my-saml", limit_self_registration: false)
+ end
+
+ it "includes the false value in the auth hash" do
+ expect(subject[:limit_self_registration]).to be false
+ end
+ end
end
end
diff --git a/modules/auth_saml/spec/requests/saml_provider_callback_spec.rb b/modules/auth_saml/spec/requests/saml_provider_callback_spec.rb
index 4069e63b8226..eabbb252d350 100644
--- a/modules/auth_saml/spec/requests/saml_provider_callback_spec.rb
+++ b/modules/auth_saml/spec/requests/saml_provider_callback_spec.rb
@@ -42,7 +42,8 @@
digest_method: "http://www.w3.org/2001/04/xmlenc#sha256",
sp_entity_id: "https://foobar.org",
idp_cert:,
- idp_cert_fingerprint:)
+ idp_cert_fingerprint:,
+ limit_self_registration: false)
end
let(:idp_cert) { nil }
diff --git a/modules/auth_saml/spec/services/saml/configuration_mapper_spec.rb b/modules/auth_saml/spec/services/saml/configuration_mapper_spec.rb
index 6cf93f4af3fb..149c734e8429 100644
--- a/modules/auth_saml/spec/services/saml/configuration_mapper_spec.rb
+++ b/modules/auth_saml/spec/services/saml/configuration_mapper_spec.rb
@@ -50,6 +50,34 @@
end
end
+ describe "limit_self_registration" do
+ subject { result["limit_self_registration"] }
+
+ context "when provided as string" do
+ let(:configuration) { { limit_self_registration: "1" } }
+
+ it { is_expected.to be(true) }
+ end
+
+ context "when provided as false boolean" do
+ let(:configuration) { { limit_self_registration: false } }
+
+ it { is_expected.to be(false) }
+ end
+
+ context "when provided as true boolean" do
+ let(:configuration) { { limit_self_registration: true } }
+
+ it { is_expected.to be(true) }
+ end
+
+ context "when not provided" do
+ let(:configuration) { {} }
+
+ it { is_expected.to be_nil }
+ end
+ end
+
describe "slug" do
subject { result["slug"] }
diff --git a/modules/backlogs/config/locales/crowdin/pt-BR.yml b/modules/backlogs/config/locales/crowdin/pt-BR.yml
index adca5b204645..c6181178c06c 100644
--- a/modules/backlogs/config/locales/crowdin/pt-BR.yml
+++ b/modules/backlogs/config/locales/crowdin/pt-BR.yml
@@ -34,12 +34,12 @@ pt-BR:
work_package:
attributes:
blocks_ids:
- can_only_contain_work_packages_of_current_sprint: "pode conter somente os IDs dos pacotes de trabalho no sprint atual."
+ can_only_contain_work_packages_of_current_sprint: "pode conter apenas IDs de pacotes de trabalho na sprint atual."
must_block_at_least_one_work_package: "deve conter o ID de pelo menos um tíquete."
version_id:
task_version_must_be_the_same_as_story_version: "deve ser igual à versão da história dos pais."
sprint:
- cannot_end_before_it_starts: "Sprint não pode terminar antes de começar."
+ cannot_end_before_it_starts: "A sprint não pode terminar antes de começar."
backlogs:
add_new_story: "Nova história"
any: "qualquer"
@@ -57,7 +57,7 @@ pt-BR:
label_versions_default_fold_state: "Mostrar versões em modo fechado"
work_package_is_closed: "Pacote de trabalho está pronto, quando"
label_is_done_status: "Situação %{status_name} significa pronto"
- no_burndown_data: "Não há dados de burndown disponíveis. É necessário ter o conjunto de datas de início e fim de sprint."
+ no_burndown_data: "Nenhum dado de burndown disponível. É necessário definir as datas de início e fim da sprint."
points: "Pontos"
positions_could_not_be_rebuilt: "Posições não poderiam ser reconstruídas."
positions_rebuilt_successfully: "Posições reconstruídas com sucesso."
@@ -82,17 +82,17 @@ pt-BR:
backlogs_product_backlog_is_empty: "Backlog do produto está vazio"
backlogs_product_backlog_unsized: "O topo do backlog de produto tem histórias não dimensionadas"
backlogs_sizing_inconsistent: "Tamanhos das histórias contrastam com suas estimativas"
- backlogs_sprint_notes_missing: "Sprints fechados sem notas de revisão/retrospectiva"
- backlogs_sprint_unestimated: "Sprints ativos ou fechados com histórias não estimadas"
- backlogs_sprint_unsized: "Projeto tem histórias em sprints ativos ou recentemente fechados que não tem tamanho"
+ backlogs_sprint_notes_missing: "Sprints encerradas sem notas de retrospectiva/revisão"
+ backlogs_sprint_unestimated: "Sprints encerradas ou ativas com histórias não estimadas"
+ backlogs_sprint_unsized: "O projeto tem histórias em sprints ativas ou recentemente encerradas que não foram dimensionadas"
backlogs_sprints: "Sprints"
backlogs_story: "História"
backlogs_story_type: "Tipos de história"
backlogs_task: "Tarefa"
backlogs_task_type: "Tipo de tarefa"
backlogs_velocity_missing: "Nenhuma velocidade foi calculada para este projeto"
- backlogs_velocity_varies: "Velocidade varia significativamente ao longo de sprints"
- backlogs_wiki_template: "Modelo para a página de wiki da sprint"
+ backlogs_velocity_varies: "A velocidade varia significativamente entre as sprints"
+ backlogs_wiki_template: "Modelo para página wiki da sprint"
backlogs_empty_title: "Não há versões definidas para serem usadas nos backlogs"
backlogs_empty_action_text: "Para iniciar com backlogs, crie uma nova versão e atribua a uma coluna de backlogs."
button_edit_wiki: "Editar página wiki"
@@ -120,9 +120,9 @@ pt-BR:
label_points_burn_up: "Acima"
label_product_backlog: "Backlog do produto"
label_select_all: "Selecionar tudo"
- label_sprint_backlog: "Backlog do sprint"
+ label_sprint_backlog: "backlog da sprint"
label_sprint_cards: "Exportar cartões"
- label_sprint_impediments: "Impedimentos do Sprint"
+ label_sprint_impediments: "Impedimentos da Sprint"
label_sprint_name: "Sprint \"%{name}\""
label_sprint_velocity: "Velocidade %{velocity}, baseado em %{sprints} sprints, com uma média de %{days} dias"
label_stories: "Histórias"
diff --git a/modules/bim/config/locales/crowdin/pt-BR.seeders.yml b/modules/bim/config/locales/crowdin/pt-BR.seeders.yml
index 0d82162c385c..f6babbe76fde 100644
--- a/modules/bim/config/locales/crowdin/pt-BR.seeders.yml
+++ b/modules/bim/config/locales/crowdin/pt-BR.seeders.yml
@@ -459,7 +459,7 @@ pt-BR:
name: Pacotes de trabalho
item_6:
options:
- name: Etapas
+ name: Marcos
work_packages:
item_0:
subject: Kick off do projeto criando modelo BIM
diff --git a/modules/boards/config/locales/crowdin/js-ro.yml b/modules/boards/config/locales/crowdin/js-ro.yml
index 1d9dbc15c521..bcc598a1e862 100644
--- a/modules/boards/config/locales/crowdin/js-ro.yml
+++ b/modules/boards/config/locales/crowdin/js-ro.yml
@@ -28,7 +28,7 @@ ro:
error_attribute_not_writable: "Nu se poate muta pachetul de lucru, %{attribute} nu este inscriptibil."
error_loading_the_list: "Eroare la încărcarea listei: %{error_message}"
error_permission_missing: "Lipsește permisiunea de a crea interogări publice"
- error_cannot_move_into_self: "Nu puteți muta un pachet de lucru în coloana sa proprie."
+ error_cannot_move_into_self: "Nu p0ți muta un pachet de lucru în coloana sa proprie."
text_hidden_list_warning: "Nu toate listele sunt afișate deoarece nu aveți permisiunea. Contactați administratorul pentru mai multe informații."
click_to_remove_list: "Clic pentru a elimina această listă"
board_type:
diff --git a/modules/calendar/config/locales/crowdin/js-ro.yml b/modules/calendar/config/locales/crowdin/js-ro.yml
index ced4dcf1b8f6..c970dc3245a2 100644
--- a/modules/calendar/config/locales/crowdin/js-ro.yml
+++ b/modules/calendar/config/locales/crowdin/js-ro.yml
@@ -2,7 +2,7 @@
ro:
js:
calendar:
- create_new: 'Creați un calendar nou'
+ create_new: 'Creează un calendar nou'
title: 'Calendar'
too_many: 'Există %{count} pachete de lucru în total, dar numai %{max} poate fi afișat.'
unsaved_title: 'Calendar fără nume'
diff --git a/modules/calendar/config/locales/crowdin/ro.yml b/modules/calendar/config/locales/crowdin/ro.yml
index e17a56839dc5..bb0848980691 100644
--- a/modules/calendar/config/locales/crowdin/ro.yml
+++ b/modules/calendar/config/locales/crowdin/ro.yml
@@ -7,6 +7,6 @@ ro:
label_calendar_plural: "Calendare"
label_new_calendar: "New calendar"
permission_view_calendar: "Vezi calendarele"
- permission_manage_calendars: "Gestionare calendare"
+ permission_manage_calendars: "Gestionează calendare"
permission_share_calendars: "Subscribe to iCalendars"
project_module_calendar_view: "Calendare"
diff --git a/modules/meeting/config/locales/crowdin/ro.yml b/modules/meeting/config/locales/crowdin/ro.yml
index afe45f003ad8..d696519184c1 100644
--- a/modules/meeting/config/locales/crowdin/ro.yml
+++ b/modules/meeting/config/locales/crowdin/ro.yml
@@ -62,7 +62,7 @@ ro:
meeting_section: "Section"
activity:
filter:
- meeting: "Reuniuni"
+ meeting: "Întâlniri"
item:
meeting_agenda_item:
duration:
diff --git a/modules/meeting/config/locales/crowdin/zh-TW.yml b/modules/meeting/config/locales/crowdin/zh-TW.yml
index 6b20d71eb236..d2eabd4a0c1c 100644
--- a/modules/meeting/config/locales/crowdin/zh-TW.yml
+++ b/modules/meeting/config/locales/crowdin/zh-TW.yml
@@ -43,7 +43,7 @@ zh-TW:
start_time_hour: "開始時間"
meeting_agenda_item:
title: "標題"
- author: "作者"
+ author: "會議發起者"
duration_in_minutes: "分鐘"
description: "備註"
presenter: "簡報者"
diff --git a/modules/openid_connect/app/components/openid_connect/providers/client_details_form.rb b/modules/openid_connect/app/components/openid_connect/providers/client_details_form.rb
index 8c945ac679aa..609c3304381f 100644
--- a/modules/openid_connect/app/components/openid_connect/providers/client_details_form.rb
+++ b/modules/openid_connect/app/components/openid_connect/providers/client_details_form.rb
@@ -29,6 +29,8 @@
module OpenIDConnect
module Providers
class ClientDetailsForm < BaseForm
+ include Redmine::I18n
+
form do |f|
%i[client_id client_secret].each do |attr|
f.text_field(
@@ -48,6 +50,20 @@ class ClientDetailsForm < BaseForm
required: false,
input_width: :large
)
+ f.text_field(
+ name: :scope,
+ label: I18n.t("activemodel.attributes.openid_connect/provider.scope"),
+ placeholder: "openid email profile",
+ caption: link_translate(
+ "openid_connect.instructions.scope",
+ links: {
+ docs_url: "https://openid.net/specs/openid-connect-basic-1_0.html#Scopes"
+ }
+ ),
+ disabled: provider.seeded_from_env?,
+ required: false,
+ input_width: :large
+ )
f.check_box(
name: :limit_self_registration,
label: I18n.t("activemodel.attributes.openid_connect/provider.limit_self_registration"),
diff --git a/modules/openid_connect/app/models/openid_connect/provider.rb b/modules/openid_connect/app/models/openid_connect/provider.rb
index 18fa645b5150..c61e5b04589a 100644
--- a/modules/openid_connect/app/models/openid_connect/provider.rb
+++ b/modules/openid_connect/app/models/openid_connect/provider.rb
@@ -31,6 +31,7 @@ class Provider < AuthProvider
store_attribute :options, :scheme, :string
store_attribute :options, :port, :string
+ store_attribute :options, :scope, :string
store_attribute :options, :claims, :string
store_attribute :options, :acr_values, :string
diff --git a/modules/openid_connect/app/models/openid_connect/provider/hash_builder.rb b/modules/openid_connect/app/models/openid_connect/provider/hash_builder.rb
index 601867a80d1c..0beea596b22e 100644
--- a/modules/openid_connect/app/models/openid_connect/provider/hash_builder.rb
+++ b/modules/openid_connect/app/models/openid_connect/provider/hash_builder.rb
@@ -19,6 +19,7 @@ def to_h # rubocop:disable Metrics/AbcSize
authorization_endpoint:,
jwks_uri:,
issuer:,
+ scope:,
identifier: client_id,
secret: client_secret,
token_endpoint:,
diff --git a/modules/openid_connect/app/services/openid_connect/configuration_mapper.rb b/modules/openid_connect/app/services/openid_connect/configuration_mapper.rb
index 5ee45847c192..bd9f5247febe 100644
--- a/modules/openid_connect/app/services/openid_connect/configuration_mapper.rb
+++ b/modules/openid_connect/app/services/openid_connect/configuration_mapper.rb
@@ -53,6 +53,7 @@ def call! # rubocop:disable Metrics/AbcSize
"limit_self_registration" => options["limit_self_registration"],
"use_graph_api" => options["use_graph_api"],
"acr_values" => options["acr_values"],
+ "scope" => extract_scope(options["scope"]),
"authorization_endpoint" => extract_url(options, "authorization_endpoint"),
"token_endpoint" => extract_url(options, "token_endpoint"),
"userinfo_endpoint" => extract_url(options, "userinfo_endpoint"),
@@ -68,6 +69,17 @@ def call! # rubocop:disable Metrics/AbcSize
private
+ def extract_scope(value)
+ return if value.blank?
+
+ case value
+ when Array
+ value.join(" ")
+ else
+ value
+ end
+ end
+
def oidc_provider(options)
case options["name"]
when /azure/
diff --git a/modules/openid_connect/config/locales/crowdin/de.yml b/modules/openid_connect/config/locales/crowdin/de.yml
index ab6de0c139bf..b6e1d5b2bfe9 100644
--- a/modules/openid_connect/config/locales/crowdin/de.yml
+++ b/modules/openid_connect/config/locales/crowdin/de.yml
@@ -59,8 +59,8 @@ de:
metadata_url: Ich habe eine Discovery-Endpunkt-URL
client_id: Dies ist die Client-ID, die Sie von Ihrem OpenID Connect-Anbieter erhalten haben
client_secret: Dies ist das Client-Secret, die Sie von Ihrem OpenID Connect-Anbieter erhalten haben
- limit_self_registration: If enabled, users can only register using this provider if configuration on the provider's end allows it.
- display_name: The name of the provider. This will be displayed as the login button and in the list of providers.
+ limit_self_registration: Wenn diese Option aktiviert ist, können sich Benutzer nur dann über diesen Anbieter registrieren, wenn die Konfiguration aufseiten des Anbieters dies zulässt.
+ display_name: Der Name des Anbieters. Dieser wird als Anmeldeschaltfläche und in der Liste der Anbieter angezeigt.
tenant: 'Bitte ersetzen Sie den vorgegebenen Mandanten durch Ihren eigenen, falls zutreffend. Siehe diese Dokumentation von Microsoft Entra.'
post_logout_redirect_uri: Die URL, an die der OpenID Connect-Anbieter nach einer erfolgreichen Abmeldung weiterleiten soll.
claims: >
diff --git a/modules/openid_connect/config/locales/crowdin/ko.yml b/modules/openid_connect/config/locales/crowdin/ko.yml
index e6f9ab5da0d7..0f42284c0f54 100644
--- a/modules/openid_connect/config/locales/crowdin/ko.yml
+++ b/modules/openid_connect/config/locales/crowdin/ko.yml
@@ -37,52 +37,52 @@ ko:
format: "검색 엔드포인트 URL %{message}"
response_is_not_successful: " - 응답 상태는 %{status}입니다."
response_is_not_json: " - JSON 본문을 반환하지 않습니다."
- response_misses_required_attributes: " does not return required attributes. Missing attributes are: %{missing_attributes}."
+ response_misses_required_attributes: " - 필수 특성을 반환하지 않습니다. 누락된 특성: %{missing_attributes}."
provider:
delete_warning:
- input_delete_confirmation: Enter the provider name %{name} to confirm deletion.
- irreversible_notice: Deleting an SSO provider is an irreversible action.
- provider: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:'
- delete_result_1: Remove the provider from the list of available providers.
+ input_delete_confirmation: 삭제를 확인하려면 공급자 이름 %{name}(을)를 입력하세요.
+ irreversible_notice: SSO 공급자를 삭제하면 되돌릴 수 없습니다.
+ provider: 'SSO 공급자 %{name}을(를) 삭제하시겠습니까? 이 작업을 확인하려면 아래 필드에 공급자 이름을 입력하세요. 이렇게 하면 다음과 같이 됩니다.'
+ delete_result_1: 사용 가능한 공급자 목록에서 공급자를 제거합니다.
delete_result_user_count:
- zero: No users are currently using this provider. No further action is required.
- one: "One user is currently still using this provider. They will need to be re-invited or logging in with another provider."
- other: "%{count} users are currently still using this provider. They will need to be re-invited or logging in with another provider."
+ zero: 현재 이 공급자를 사용하는 사용자가 없습니다. 추가 조치가 필요하지 않습니다.
+ one: "1명의 사용자가 이 공급자를 계속 사용하고 있습니다. 해당 사용자를 다시 초대하거나 다른 공급자로 로그인해야 합니다."
+ other: "%{count}명의 사용자가 이 공급자를 계속 사용하고 있습니다. 해당 사용자를 다시 초대하거나 다른 공급자로 로그인해야 합니다."
delete_result_direct: 이 공급자는 직접 로그인 공급자로 표시됩니다. 이 설정은 제거되며 사용자는 더 이상 로그인을 위해 해당 공급자로 리디렉션되지 않습니다.
openid_connect:
menu_title: OpenID 공급자
delete_title: "OpenID Connect 공급자 삭제"
instructions:
redirect_url: 로그인 성공 후 OpenID Connect 공급자가 OpenProject로 다시 리디렉션할 때 사용해야 하는 리디렉션 URL입니다.
- endpoint_url: OpenID Connect 공급자가 사용자에게 제공한 엔드포인트 URL
+ endpoint_url: OpenID Connect 공급자가 귀하에게 제공한 엔드포인트 URL
metadata_none: 이 정보가 없습니다
metadata_url: 검색 엔드포인트 URL이 있습니다
- client_id: This is the client ID given to you by your OpenID Connect provider
- client_secret: This is the client secret given to you by your OpenID Connect provider
- limit_self_registration: If enabled, users can only register using this provider if configuration on the provider's end allows it.
- display_name: The name of the provider. This will be displayed as the login button and in the list of providers.
- tenant: 'Please replace the default tenant with your own if applicable. See this.'
- post_logout_redirect_uri: The URL the OpenID Connect provider should redirect to after a logout request.
+ client_id: OpenID Connect 공급자가 귀하에게 제공한 클라이언트 ID입니다
+ client_secret: OpenID Connect 공급자가 귀하에게 제공한 클라이언트 비밀번호입니다
+ limit_self_registration: 활성화된 경우, 사용자는 공급자 측의 구성에서 허용하는 경우에만 이 공급자를 사용하여 등록할 수 있습니다.
+ display_name: 공급자 이름입니다. 로그인 버튼으로 표시되며 공급자 목록에 표시됩니다.
+ tenant: '해당되는 경우 기본 테넌트를 고유한 테넌트로 교체하세요. 여기를 참조하세요.'
+ post_logout_redirect_uri: 로그아웃 요청 후 OpenID Connect 공급자가 리디렉션해야 하는 URL입니다.
claims: >
- You can request additional claims for the userinfo and id token endpoints. Please see [our OpenID connect documentation](docs_url) for more information.
+ 사용자 정보 및 ID 토큰 엔드포인트에 대한 추가 클레임을 요청할 수 있습니다. 자세한 내용은 [OpenID Connect 문서](docs_url)를 참조하세요.
acr_values: >
- Request non-essential claims in an easier format. See [our documentation on acr_values](docs_url) for more information.
+ 필수적이지 않은 클레임은 더 간편한 형식으로 요청하세요. 자세한 내용은 [acr_values에 대한 문서](docs_url)를 참조하세요.
mapping_login: >
- Provide a custom mapping in the userinfo response to be used for the login attribute.
+ 로그인 특성에 사용할 사용자 정보 응답에 사용자 지정 매핑을 제공합니다.
mapping_email: >
- Provide a custom mapping in the userinfo response to be used for the email attribute.
+ 이메일 특성에 사용할 사용자 정보 응답에 사용자 지정 매핑을 제공합니다.
mapping_first_name: >
- Provide a custom mapping in the userinfo response to be used for the first name.
+ 이름에 사용할 사용자 정보 응답에 사용자 지정 매핑을 제공합니다.
mapping_last_name: >
- Provide a custom mapping in the userinfo response to be used for the last name.
+ 성에 사용할 사용자 정보 응답에 사용자 지정 매핑을 제공합니다.
mapping_admin: >
- Provide a custom mapping in the userinfo response to be used for the admin status. It expects a boolean attribute to be returned.
+ 관리자 상태에 사용할 사용자 정보 응답에 사용자 지정 매핑을 제공합니다. 부울 특성이 반환될 것으로 예상됩니다.
settings:
- metadata_none: I don't have this information
- metadata_url: I have a discovery endpoint URL
- endpoint_url: Endpoint URL
+ metadata_none: 이 정보가 없습니다
+ metadata_url: 검색 엔드포인트 URL이 있습니다
+ endpoint_url: 엔드포인트 URL
providers:
- seeded_from_env: "This provider was seeded from the environment configuration. It cannot be edited."
+ seeded_from_env: "이 공급자는 환경 구성에서 시드되었으며, 편집할 수 없습니다."
google:
name: Google
microsoft_entra:
@@ -96,26 +96,26 @@ ko:
label_empty_title: 아직 구성된 OpenID 공급자가 없습니다.
label_empty_description: 여기에서 보려면 공급자를 추가합니다.
label_metadata: OpenID Connect 검색 엔드포인트
- label_automatic_configuration: Automatic configuration
- label_optional_configuration: Optional configuration
+ label_automatic_configuration: 자동 구성
+ label_optional_configuration: 옵션 구성
label_advanced_configuration: 고급 구성
label_configuration_details: 메타데이터
label_client_details: 클라이언트 세부 정보
label_attribute_mapping: 특성 매핑
- client_details_description: Configuration details of OpenProject as an OIDC client
+ client_details_description: OIDC 클라이언트인 OpenProject의 구성 세부 정보
no_results_table: 아직 정의된 공급자가 없습니다.
plural: OpenID 공급자
singular: OpenID 공급자
section_texts:
- metadata: Pre-fill configuration using an OpenID Connect discovery endpoint URL
- metadata_form_banner: Editing the discovery endpoint may override existing pre-filled metadata values.
- metadata_form_title: OpenID Connect Discovery endpoint
- metadata_form_description: If your identity provider has a discovery endpoint URL. Use it below to pre-fill configuration.
- configuration_metadata: The information has been pre-filled using the supplied discovery endpoint. In most cases, they do not require editing.
- configuration: Configuration details of the OpenID Connect provider
- display_name: The display name visible to users.
- attribute_mapping: Configure the mapping of attributes between OpenProject and the OpenID Connect provider.
- claims: Request additional claims for the ID token or userinfo response.
+ metadata: OpenID Connect 검색 엔드포인트 URL을 사용하여 구성 미리 채우기
+ metadata_form_banner: 검색 엔드포인트를 편집하면 미리 채워진 기존 메타데이터 값이 재정의될 수 있습니다.
+ metadata_form_title: OpenID Connect 검색 엔드포인트
+ metadata_form_description: ID 공급자에게 검색 엔드포인트 URL이 있는 경우. 구성을 미리 채우려면 아래 항목을 사용하세요.
+ configuration_metadata: 이 정보는 제공된 검색 엔드포인트를 사용하여 미리 채워졌습니다. 대부분의 경우 편집할 필요가 없습니다.
+ configuration: OpenID Connect 공급자의 구성 세부 정보
+ display_name: 사용자에게 표시되는 표시 이름입니다.
+ attribute_mapping: OpenProject와 OpenID Connect 공급자 간의 특성 매핑을 구성합니다.
+ claims: ID 토큰 또는 사용자 정보 응답에 대한 추가 클레임을 요청합니다.
setting_instructions:
limit_self_registration: >
활성화되면, 사용자는 자체 등록 설정에서 허용하는 경우에만 이 공급자를 사용하여 등록할 수 있습니다.
diff --git a/modules/openid_connect/config/locales/crowdin/pt-BR.yml b/modules/openid_connect/config/locales/crowdin/pt-BR.yml
index 0bfe16eb0fee..7de2cdbc14c1 100644
--- a/modules/openid_connect/config/locales/crowdin/pt-BR.yml
+++ b/modules/openid_connect/config/locales/crowdin/pt-BR.yml
@@ -47,7 +47,7 @@ pt-BR:
delete_result_user_count:
zero: Nenhum usuário está utilizando este provedor no momento. Não é necessária nenhuma ação adicional.
one: "Há um usuário utilizando este provedor. Ele precisará ser re-convidado ou fazer login com outro provedor."
- other: "Atualmente, %{count} usuários ainda estão usando este provedor. Eles precisarão ser re-convidados ou fazer login com outro provedor."
+ other: "Há %{count} usuários utilizando este provedor. Eles precisarão ser re-convidados ou fazer login com outro provedor."
delete_result_direct: Este provedor está configurado como provedor de login direto. A configuração será removida e os usuários não serão mais redirecionados para ele para realizar o login.
openid_connect:
menu_title: Provedores OpenID
@@ -59,8 +59,8 @@ pt-BR:
metadata_url: Tenho um URL de endpoint de descoberta
client_id: Este é o ID do cliente fornecido pelo seu provedor OpenID Connect
client_secret: Este é o segredo do cliente fornecido pelo seu provedor OpenID Connect
- limit_self_registration: If enabled, users can only register using this provider if configuration on the provider's end allows it.
- display_name: The name of the provider. This will be displayed as the login button and in the list of providers.
+ limit_self_registration: Se ativado, os usuários só poderão se registrar usando este provedor se a configuração no lado do provedor permitir.
+ display_name: Nome do provedor. Ele será exibido como o botão de login e na lista de provedores.
tenant: 'Substitua o locatário padrão pelo seu, se necessário. Consulte aqui.'
post_logout_redirect_uri: O URL para a qual o provedor OpenID Connect deve redirecionar após a solicitação de logout.
claims: >
diff --git a/modules/openid_connect/config/locales/crowdin/pt-PT.yml b/modules/openid_connect/config/locales/crowdin/pt-PT.yml
index fd58ecd669cb..017d308da3e9 100644
--- a/modules/openid_connect/config/locales/crowdin/pt-PT.yml
+++ b/modules/openid_connect/config/locales/crowdin/pt-PT.yml
@@ -59,8 +59,8 @@ pt-PT:
metadata_url: Tenho um URL de endpoint de descoberta
client_id: Este é o ID de cliente que lhe foi atribuído pelo seu fornecedor OpenID Connect
client_secret: Este é o segredo do cliente que lhe foi atribuído pelo seu fornecedor OpenID Connect
- limit_self_registration: If enabled, users can only register using this provider if configuration on the provider's end allows it.
- display_name: The name of the provider. This will be displayed as the login button and in the list of providers.
+ limit_self_registration: Se estiver ativado, os utilizadores só podem registar-se utilizando este fornecedor se a configuração do fornecedor o permitir.
+ display_name: O nome do fornecedor. Este nome será apresentado no botão de início de sessão e na lista de fornecedores.
tenant: 'Substitua o inquilino predefinido pelo seu próprio inquilino, se aplicável. Consulte este artigo.'
post_logout_redirect_uri: O URL para o qual o fornecedor do OpenID Connect deve redirecionar após um pedido de encerramento de sessão.
claims: >
diff --git a/modules/openid_connect/config/locales/crowdin/ru.yml b/modules/openid_connect/config/locales/crowdin/ru.yml
index 465287eda176..dfd051f42c4b 100644
--- a/modules/openid_connect/config/locales/crowdin/ru.yml
+++ b/modules/openid_connect/config/locales/crowdin/ru.yml
@@ -8,7 +8,7 @@ ru:
attributes:
openid_connect/provider:
name: Имя
- slug: Unique identifier
+ slug: Уникальный идентификатор
display_name: Отображаемое имя
client_id: ID клиента
client_secret: Закрытый ключ клиента
@@ -27,7 +27,7 @@ ru:
icon: Пользовательская иконка
claims: Претензии
acr_values: Значения ACR
- redirect_url: Redirect URL
+ redirect_url: URL переадресации
activerecord:
errors:
models:
@@ -53,14 +53,14 @@ ru:
menu_title: Провайдеры OpenID
delete_title: "Удалить провайдера OpenID Connect"
instructions:
- redirect_url: This is the redirect URL that the OpenID Connect provider should use to redirect back to OpenProject after a successful login.
+ redirect_url: Это URL, который провайдер OpenID Connect должен использовать для перенаправления обратно на OpenProject после успешного входа в систему.
endpoint_url: URL-адрес конечной точки, указанный поставщиком OpenID Connect
metadata_none: У меня нет этой информации
metadata_url: У меня есть URL конечной точки обнаружения
client_id: Это идентификатор клиента, присвоенный вам провайдером OpenID Connect
client_secret: Это ключ клиента, предоставленный вам провайдером OpenID Connect
- limit_self_registration: If enabled, users can only register using this provider if configuration on the provider's end allows it.
- display_name: The name of the provider. This will be displayed as the login button and in the list of providers.
+ limit_self_registration: Если эта опция включена, пользователи смогут регистрироваться у этого провайдера только в том случае, если конфигурация провайдера позволяет это делать.
+ display_name: Это имя провайдера. Оно будет отображаться как кнопка входа и в списке провайдеров.
tenant: 'Пожалуйста, замените владельца по умолчанию на своего собственного, если это применимо. См. это.'
post_logout_redirect_uri: URL-адрес, на который провайдер OpenID Connect должен перенаправить Вас после запроса на выход из системы.
claims: >
diff --git a/modules/openid_connect/config/locales/crowdin/tr.yml b/modules/openid_connect/config/locales/crowdin/tr.yml
index aa48fbb1ee1f..0c0aa0a3b6f7 100644
--- a/modules/openid_connect/config/locales/crowdin/tr.yml
+++ b/modules/openid_connect/config/locales/crowdin/tr.yml
@@ -1,7 +1,7 @@
tr:
plugin_openproject_openid_connect:
name: "OpenProject OpenID Connect"
- description: "Adds OmniAuth OpenID Connect strategy providers to OpenProject."
+ description: "OmniAuth OpenID Bağlantı strateji sağlayıcılarını OpenProject'e ekler."
logout_warning: >
Çıkış yaptınız. Gönderdiğiniz herhangi bir formun içeriği kaybolabilir. Lütfen giriş yapın].
activemodel:
@@ -10,23 +10,23 @@ tr:
name: İsim
slug: Unique identifier
display_name: Ekran adı
- client_id: Client ID
- client_secret: Client secret
+ client_id: İstemci ID
+ client_secret: İstemci gizliliği
secret: Gizli
scope: kapsam
limit_self_registration: Limit self registration
- authorization_endpoint: Authorization endpoint
- userinfo_endpoint: User information endpoint
- token_endpoint: Token endpoint
- end_session_endpoint: End session endpoint
- post_logout_redirect_uri: Post logout redirect URI
+ authorization_endpoint: Yetkilendirme bitiş noktası
+ userinfo_endpoint: Kullanıcı bilgisi bitiş noktası
+ token_endpoint: Gösterge bitiş noktası
+ end_session_endpoint: Oturum bitiş noktasını sonlandır
+ post_logout_redirect_uri: Oturum kapatma sonrası yönlendirme URI'si
jwks_uri: JWKS URI
- issuer: Issuer
- tenant: Tenant
- metadata_url: Metadata URL
- icon: Custom icon
- claims: Claims
- acr_values: ACR values
+ issuer: Sağlayıcı
+ tenant: Müşteri
+ metadata_url: Metaveri URL'si
+ icon: Özel simge
+ claims: Bilgiler
+ acr_values: ACR değerleri
redirect_url: Redirect URL
activerecord:
errors:
@@ -34,41 +34,41 @@ tr:
openid_connect/provider:
attributes:
metadata_url:
- format: "Discovery endpoint URL %{message}"
- response_is_not_successful: " responds with %{status}."
- response_is_not_json: " does not return JSON body."
- response_misses_required_attributes: " does not return required attributes. Missing attributes are: %{missing_attributes}."
+ format: "Keşif uç noktası URL'si %{message}"
+ response_is_not_successful: " %{status} ile yanıt verir."
+ response_is_not_json: " JSON gövdesini cevap olarak vermez."
+ response_misses_required_attributes: " gerekli öznitelikleri döndürmez. Eksik öznitelikler: %{missing_attributes}."
provider:
delete_warning:
- input_delete_confirmation: Enter the provider name %{name} to confirm deletion.
- irreversible_notice: Deleting an SSO provider is an irreversible action.
- provider: 'Are you sure you want to delete the SSO provider %{name}? To confirm this action please enter the name of the provider in the field below, this will:'
- delete_result_1: Remove the provider from the list of available providers.
+ input_delete_confirmation: Silme işlemini onaylamak için sağlayıcı %{name} ismini girin.
+ irreversible_notice: SSO sağlayıcısını silme geri alınamaz bir işlemdir.
+ provider: 'SSO sağlayıcısı %{name} silmek istediğinize emin misiniz? İşlemi onaylamak için lütfen sağlayıcının adını aşağıdaki alana giriniz:'
+ delete_result_1: Sağlayıcının adını mevcut sağlayıcılardan kaldır.
delete_result_user_count:
- zero: No users are currently using this provider. No further action is required.
- one: "One user is currently still using this provider. They will need to be re-invited or logging in with another provider."
- other: "%{count} users are currently still using this provider. They will need to be re-invited or logging in with another provider."
- delete_result_direct: This provider is marked as a direct login provider. The setting will be removed and users will no longer be redirected to the provider for login.
+ zero: Bu sağlayıcıyı hiçbir kullanıcı kullanmıyor. Ek bir işleme gerek yok.
+ one: "Bir kullanıcı bu sağlayıcıyı kullanıyor. Tekrar davet edilmesi ya da başka bir kullanıcı ile giriş yapması gerekecek."
+ other: "%{count} kullanıcı bu sağlayıcıyı kullanıyor. Tekrar davet edilmeleri ya da başka bir kullanıcı ile giriş yapmaları gerekecek."
+ delete_result_direct: Bu sağlayıcı doğrudan oturum açma sağlayıcısı olarak işaretlenmiştir. Ayar kaldırılacak ve kullanıcılar artık oturum açmak için sağlayıcıya yönlendirilmeyecektir.
openid_connect:
menu_title: OpenID sağlayıcıları
- delete_title: "Delete OpenID Connect provider"
+ delete_title: "OpenID Connect sağlayıcısını sil"
instructions:
redirect_url: This is the redirect URL that the OpenID Connect provider should use to redirect back to OpenProject after a successful login.
- endpoint_url: The endpoint URL given to you by the OpenID Connect provider
- metadata_none: I don't have this information
- metadata_url: I have a discovery endpoint URL
- client_id: This is the client ID given to you by your OpenID Connect provider
- client_secret: This is the client secret given to you by your OpenID Connect provider
+ endpoint_url: OpenID Connect sağlayıcısı tarafından size verilen uç nokta URL'si
+ metadata_none: Bu bilgiye sahip değilim
+ metadata_url: Bir keşif uç noktası URL'im var
+ client_id: OpenID Connect sağlayıcısı tarafından size verilen istemci URL'si
+ client_secret: OpenID Connect sağlayıcısı tarafından size verilen gizlilik URL'si
limit_self_registration: If enabled, users can only register using this provider if configuration on the provider's end allows it.
display_name: The name of the provider. This will be displayed as the login button and in the list of providers.
- tenant: 'Please replace the default tenant with your own if applicable. See this.'
- post_logout_redirect_uri: The URL the OpenID Connect provider should redirect to after a logout request.
+ tenant: 'Lütfen öntanımlı müşteriyi kendinizinkiyle değiştirin, mümkünse. Bu belgeye bakın.'
+ post_logout_redirect_uri: OpenID Connect sağlayıcısının bir oturum kapatma isteğinden sonra yeniden yönlendirmesi gereken URL.
claims: >
- You can request additional claims for the userinfo and id token endpoints. Please see [our OpenID connect documentation](docs_url) for more information.
+ Kullanıcı bilgisi ve id göstergesi uç noktaları için ek bilgi talebinde bulunabilirsiniz. Daha fazla bilgi için lütfen [OpenID bağlantı belgelerimize] (docs_url) bakın.
acr_values: >
- Request non-essential claims in an easier format. See [our documentation on acr_values](docs_url) for more information.
+ Zorunlu olmayan bilgileri daha kolay bir biçimde talep edin. Daha fazla bilgi için [acr_values hakkındaki belgelerimize] (docs_url) bakın.
mapping_login: >
- Provide a custom mapping in the userinfo response to be used for the login attribute.
+ Oturum açma özniteliği için kullanılmak üzere userinfo yanıtında özel bir eşleme sağlayın.
mapping_email: >
Provide a custom mapping in the userinfo response to be used for the email attribute.
mapping_first_name: >
diff --git a/modules/openid_connect/config/locales/crowdin/zh-CN.yml b/modules/openid_connect/config/locales/crowdin/zh-CN.yml
index 4cd989caa0f0..527ff30b4d0b 100644
--- a/modules/openid_connect/config/locales/crowdin/zh-CN.yml
+++ b/modules/openid_connect/config/locales/crowdin/zh-CN.yml
@@ -59,8 +59,8 @@ zh-CN:
metadata_url: 我有一个发现端点网址
client_id: 这是您的 OpenID Connect 提供商给您的客户端 ID
client_secret: 这是您的 OpenID Connect 提供商给您的客户端密钥
- limit_self_registration: If enabled, users can only register using this provider if configuration on the provider's end allows it.
- display_name: The name of the provider. This will be displayed as the login button and in the list of providers.
+ limit_self_registration: 如果启用,用户只能在提供商的配置允许的情况下使用该提供商进行注册。
+ display_name: 提供商的名称。这将显示为登录按钮以及提供商列表中的名称。
tenant: '如果适用,请将默认租户替换为您自己的租户。请参阅此处。'
post_logout_redirect_uri: OpenID Connect 提供商在注销请求后应重定向到的 URL。
claims: >
diff --git a/modules/openid_connect/config/locales/crowdin/zh-TW.yml b/modules/openid_connect/config/locales/crowdin/zh-TW.yml
index 82fd5373a980..3723a79c703c 100644
--- a/modules/openid_connect/config/locales/crowdin/zh-TW.yml
+++ b/modules/openid_connect/config/locales/crowdin/zh-TW.yml
@@ -59,8 +59,8 @@ zh-TW:
metadata_url: 我有一個發現端點 URL
client_id: 這是 OpenID Connect 提供者給予您的用戶端 ID
client_secret: 這是 OpenID Connect 提供者給予您的用戶端密鑰
- limit_self_registration: If enabled, users can only register using this provider if configuration on the provider's end allows it.
- display_name: The name of the provider. This will be displayed as the login button and in the list of providers.
+ limit_self_registration: 如果啟用,只有在提供商端的設定允許的情況下,使用者才能使用此提供商註冊。
+ display_name: 提供商的名稱。這將會顯示在登入按鈕及提供商清單中。
tenant: '如果適用,請用您自己的租戶取代預設租戶。請參閱此內容。'
post_logout_redirect_uri: OpenID Connect 提供者應在登出請求後重定向至的 URL。
claims: >
diff --git a/modules/openid_connect/config/locales/en.yml b/modules/openid_connect/config/locales/en.yml
index ed720f91b4bb..03d0ab584753 100644
--- a/modules/openid_connect/config/locales/en.yml
+++ b/modules/openid_connect/config/locales/en.yml
@@ -66,6 +66,7 @@ en:
limit_self_registration: If enabled, users can only register using this provider if configuration on the provider's end allows it.
display_name: The name of the provider. This will be displayed as the login button and in the list of providers.
tenant: Please replace the default tenant with your own if applicable. See this.
+ scope: If you want to request custom scopes, you can add one or multiple scope values separated by spaces here. For more information, see the [OpenID Connect documentation](docs_url).
post_logout_redirect_uri: The URL the OpenID Connect provider should redirect to after a logout request.
claims: >
You can request additional claims for the userinfo and id token endpoints. Please see [our OpenID connect documentation](docs_url) for more information.
diff --git a/modules/openid_connect/spec/features/administration/oidc_custom_crud_spec.rb b/modules/openid_connect/spec/features/administration/oidc_custom_crud_spec.rb
index 714723041076..ab1f0cd42cac 100644
--- a/modules/openid_connect/spec/features/administration/oidc_custom_crud_spec.rb
+++ b/modules/openid_connect/spec/features/administration/oidc_custom_crud_spec.rb
@@ -64,6 +64,9 @@
fill_in "Client ID", with: "client_id"
fill_in "Client secret", with: "client secret"
+ # Scope
+ fill_in "Scope", with: "custom_scope another_scope"
+
click_link_or_button "Continue"
# Mapping form
diff --git a/modules/openid_connect/spec/migration/migrate_oidc_settings_to_providers_spec.rb b/modules/openid_connect/spec/migration/migrate_oidc_settings_to_providers_spec.rb
index 045779278060..2938dbb23c3c 100644
--- a/modules/openid_connect/spec/migration/migrate_oidc_settings_to_providers_spec.rb
+++ b/modules/openid_connect/spec/migration/migrate_oidc_settings_to_providers_spec.rb
@@ -107,6 +107,7 @@ class TestOpenIDConnectProvider < OpenIDConnect::Provider
host: "localhost",
port: "8080",
scheme: "http",
+ scope: ["foo", "bar"],
identifier: "http://localhost:3000",
secret: "IVl6GxxujAQ3mt6thAXKxyYYvmyRr8jw",
issuer: "http://localhost:8080/realms/test",
@@ -129,6 +130,7 @@ class TestOpenIDConnectProvider < OpenIDConnect::Provider
expect(provider.host).to eq "localhost"
expect(provider.port).to eq "8080"
expect(provider.scheme).to eq "http"
+ expect(provider.scope).to eq "foo bar"
expect(provider.client_id).to eq "http://localhost:3000"
expect(provider.client_secret).to eq "IVl6GxxujAQ3mt6thAXKxyYYvmyRr8jw"
expect(provider.issuer).to eq "http://localhost:8080/realms/test"
diff --git a/modules/openid_connect/spec/services/openid_connect/configuration_mapper_spec.rb b/modules/openid_connect/spec/services/openid_connect/configuration_mapper_spec.rb
index e5dd3128f681..e8daef6db17e 100644
--- a/modules/openid_connect/spec/services/openid_connect/configuration_mapper_spec.rb
+++ b/modules/openid_connect/spec/services/openid_connect/configuration_mapper_spec.rb
@@ -98,6 +98,28 @@
end
end
+ describe "scope" do
+ subject { result }
+
+ context "when provided" do
+ let(:configuration) { { scope: "custom" } }
+
+ it { is_expected.to include("scope" => "custom") }
+ end
+
+ context "when provided as array" do
+ let(:configuration) { { scope: ["foo", "bar"] } }
+
+ it { is_expected.to include("scope" => "foo bar") }
+ end
+
+ context "when not provided" do
+ let(:configuration) { { foo: "bar" } }
+
+ it { is_expected.not_to have_key("scope") }
+ end
+ end
+
describe "issuer" do
subject { result }
diff --git a/modules/storages/app/common/storages/peripherals/storage_interaction/nextcloud/copy_template_folder_command.rb b/modules/storages/app/common/storages/peripherals/storage_interaction/nextcloud/copy_template_folder_command.rb
index c69ef2e6d210..7b673626cf10 100644
--- a/modules/storages/app/common/storages/peripherals/storage_interaction/nextcloud/copy_template_folder_command.rb
+++ b/modules/storages/app/common/storages/peripherals/storage_interaction/nextcloud/copy_template_folder_command.rb
@@ -137,10 +137,14 @@ def handle_response(response)
# rubocop:enable Metrics/AbcSize
def get_folder_id(auth_strategy, destination_path)
+ # file_path_to_id_map query returns keys without trailing slashes
+ # TODO: Harden this with https://community.openproject.org/wp/57850
+ sanitized_path = destination_path.chomp("/")
+
Registry
.resolve("nextcloud.queries.file_path_to_id_map")
- .call(storage: @storage, auth_strategy:, folder: ParentFolder.new(destination_path), depth: 0)
- .map { |result| @data.with(id: result[destination_path].id) }
+ .call(storage: @storage, auth_strategy:, folder: ParentFolder.new(sanitized_path), depth: 0)
+ .map { |result| @data.with(id: result[sanitized_path].id) }
end
def source = self.class
diff --git a/modules/storages/config/locales/crowdin/ko.yml b/modules/storages/config/locales/crowdin/ko.yml
index 05fbc46a7436..0f905157a220 100644
--- a/modules/storages/config/locales/crowdin/ko.yml
+++ b/modules/storages/config/locales/crowdin/ko.yml
@@ -115,7 +115,7 @@ ko:
permission_not_set: '- %{path}에 대한 권한을 설정할 수 없습니다.'
remote_folders:
not_allowed: '%{username}에게는 %{group_folder} 폴더에 대한 액세스 권한이 없습니다. Nextcloud의 폴더 권한을 확인하세요.'
- not_found: "%{group_folder} folder wasn't found. Please check your Nextcloud setup."
+ not_found: "%{group_folder} 폴더를 찾을 수 없습니다. Nextcloud 설정을 확인하세요."
remove_user_from_group:
conflict: '다음과 같은 이유로 %{user} 사용자를 %{group} 그룹에서 제거할 수 없습니다: %{reason}'
failed_to_remove: '다음과 같은 이유로 %{user} 사용자를 %{group} 그룹에서 제거할 수 없습니다: %{reason}'
diff --git a/modules/team_planner/config/locales/crowdin/js-ro.yml b/modules/team_planner/config/locales/crowdin/js-ro.yml
index a8960cd99bc8..2a4b159aaecf 100644
--- a/modules/team_planner/config/locales/crowdin/js-ro.yml
+++ b/modules/team_planner/config/locales/crowdin/js-ro.yml
@@ -5,10 +5,10 @@ ro:
add_existing: 'Adaugă existent'
add_existing_title: 'Adăugarea pachetelor de lucru existente'
create_label: 'Planificator echipă'
- create_title: 'Creați un nou planificator de echipă'
+ create_title: 'Creează planificare echipă nouă'
unsaved_title: 'Planificator de echipă nenumit'
no_data: 'Adăugați persoane desemnate pentru a vă configura planificatorul echipei.'
- add_assignee: 'Assignee'
+ add_assignee: 'Executant'
remove_assignee: 'Înlătură responsabil'
two_weeks: '2-săptămână'
one_week: '1-săptămână'
@@ -18,9 +18,9 @@ ro:
today: 'Azi'
drag_here_to_remove: 'Trageți aici pentru a elimina responsabilul și a începe și a termina datele.'
cannot_drag_here: 'Nu se poate elimina pachetul de lucru din cauza permisiunilor sau restricțiilor de editare.'
- cannot_drag_to_non_working_day: 'Acest pachet de lucru nu poate începe/încheia o zi nelucrătoare.'
+ cannot_drag_to_non_working_day: 'Acest pachet de lucru nu poate să înceapă/se încheie într-o zi nelucrătoare.'
quick_add:
- empty_state: 'Utilizați câmpul de căutare pentru a găsi pachete de lucru și trageți-le la planificator pentru a-l atribui cuiva și defini datele de început și de sfârșit.'
+ empty_state: 'Utilizează câmpul de căutare pentru a găsi pachete de lucru și trage-le în planificare pentru a-l atribui cuiva și defini datele de început și de sfârșit.'
search_placeholder: 'Caută...'
modify:
errors:
diff --git a/modules/team_planner/config/locales/crowdin/ro.yml b/modules/team_planner/config/locales/crowdin/ro.yml
index 7bd738200e06..1b3c3660aa0e 100644
--- a/modules/team_planner/config/locales/crowdin/ro.yml
+++ b/modules/team_planner/config/locales/crowdin/ro.yml
@@ -1,16 +1,16 @@
#English strings go here
ro:
plugin_openproject_team_planner:
- name: "OpenProject Team Planner"
+ name: "Planificare echipă OpenProject"
description: "Provides team planner views."
permission_view_team_planner: "Vezi planificatorul echipei"
permission_manage_team_planner: "Gestionează planificatorul de echipe"
- project_module_team_planner_view: "Planificatori echipă"
+ project_module_team_planner_view: "Planificare echipă"
team_planner:
label_team_planner: "Planificator echipă"
label_new_team_planner: "Planificator echipă nou"
label_create_new_team_planner: "Creează planificator echipă nou"
- label_team_planner_plural: "Planificatori echipe"
+ label_team_planner_plural: "Planificare echipă"
label_assignees: "Responsabili"
upsale:
title: "Planificator echipă"
diff --git a/modules/two_factor_authentication/config/locales/crowdin/ro.yml b/modules/two_factor_authentication/config/locales/crowdin/ro.yml
index cbe0b0ab98b8..e6ca7a61979a 100644
--- a/modules/two_factor_authentication/config/locales/crowdin/ro.yml
+++ b/modules/two_factor_authentication/config/locales/crowdin/ro.yml
@@ -58,7 +58,7 @@ ro:
label_enforced: "Aplicați 2FA"
label_remember: "Rețineți autentificarea 2FA"
text_configuration: |
- Notă: Aceste valori reprezintă configurația curentă la nivelul întregii aplicații. Nu puteți dezactiva setările impuse de configurație sau modifica strategiile active curente, deoarece acestea necesită o repornire a serverului.
+ Notă: Aceste valori reprezintă configurația curentă la nivelul întregii aplicații. Nu poți dezactiva setările impuse de configurație sau modifica strategiile active curente, deoarece acestea necesită o repornire a serverului.
text_configuration_guide: Pentru mai multe informații, consultați ghidul de configurare.
text_enforced: "Activează această setare pentru a forța toți utilizatorii să înregistreze un dispozitiv 2FA la următoarea autentificare. Poate fi dezactivată numai atunci când nu este impusă prin configurare."
text_remember: |
@@ -79,7 +79,7 @@ ro:
text_2fa_disabled: "The user did not set up a 2FA device through their 'My account page'"
only_sms_allowed: "Only SMS delivery can be set up for other users."
upsale:
- title: "Autentificare cu doi factori"
+ title: "Autentificare doi factori"
description: "Consolidarea securității instanței OpenProject prin oferirea (sau impunerea) autentificării cu doi factori pentru toți membrii proiectului."
backup_codes:
none_found: Nu există coduri de rezervă pentru acest cont.
diff --git a/modules/two_factor_authentication/config/locales/crowdin/tr.yml b/modules/two_factor_authentication/config/locales/crowdin/tr.yml
index 3afe9edc685d..a6a5acf7cfcb 100644
--- a/modules/two_factor_authentication/config/locales/crowdin/tr.yml
+++ b/modules/two_factor_authentication/config/locales/crowdin/tr.yml
@@ -79,7 +79,7 @@ tr:
text_2fa_disabled: "The user did not set up a 2FA device through their 'My account page'"
only_sms_allowed: "Only SMS delivery can be set up for other users."
upsale:
- title: "İki faktörlü kimlik doğrulama"
+ title: "İki aşamalı kimlik doğrulama"
description: "Tüm proje üyelerine iki faktörlü kimlik doğrulama sunarak (veya zorunlu kılarak) OpenProject bulut sunucunuzun güvenliğini güçlendirin."
backup_codes:
none_found: Bu hesap için yedek kod yok.
diff --git a/spec/features/activities/work_package/activities_spec.rb b/spec/features/activities/work_package/activities_spec.rb
index 5428863f8fde..51adef83a422 100644
--- a/spec/features/activities/work_package/activities_spec.rb
+++ b/spec/features/activities/work_package/activities_spec.rb
@@ -27,8 +27,11 @@
#++
require "spec_helper"
+require "support/flash/expectations"
RSpec.describe "Work package activity", :js, :with_cuprite, with_flag: { primerized_work_package_activities: true } do
+ include Flash::Expectations
+
let(:project) { create(:project) }
let(:admin) { create(:admin) }
let(:member_role) do
@@ -372,7 +375,7 @@
version: 2)
# the comment is shown without browser reload
- wait_for { page }.to have_test_selector("op-journal-notes-body", text: "First comment by member")
+ activity_tab.expect_journal_notes(text: "First comment by member")
# simulate comments made within the polling interval
create(:work_package_journal, user: member, notes: "Second comment by member", journable: work_package, version: 3)
@@ -390,7 +393,7 @@
first_journal.update!(notes: "First comment by member updated")
# properly updates the comment when the comment is updated
- wait(delay: 0.5).for { page }.to have_test_selector("op-journal-notes-body", text: "First comment by member updated")
+ activity_tab.expect_journal_notes(text: "First comment by member updated")
end
end
@@ -1244,4 +1247,111 @@
end
end
end
+
+ describe "error handling" do
+ let(:work_package) { create(:work_package, project:, author: admin) }
+
+ current_user { admin }
+
+ before do
+ wp_page.visit!
+ wp_page.wait_for_activity_tab
+ end
+
+ context "when adding a comment" do
+ context "when the creation call raises an unknown server error" do
+ before do
+ allow_any_instance_of(WorkPackages::ActivitiesTabController) # rubocop:disable RSpec/AnyInstance
+ .to receive(:create_journal_service_call)
+ .and_raise(StandardError.new("Test error"))
+ end
+
+ it "shows an error banner when the server returns an error" do
+ activity_tab.add_comment(text: "First comment by admin", save: false)
+
+ page.find_test_selector("op-submit-work-package-journal-form").click
+
+ expect_flash(message: "Test error", type: :error)
+
+ # expect the editor content not to be lost
+ within_test_selector("op-work-package-journal-form-element") do
+ editor = FormFields::Primerized::EditorFormField.new("notes", selector: "#work-package-journal-form-element")
+ editor.expect_value("First comment by admin")
+ end
+ end
+ end
+
+ context "when the creation call fails with a validation error" do
+ before do
+ allow_any_instance_of(AddWorkPackageNoteService) # rubocop:disable RSpec/AnyInstance
+ .to receive(:call)
+ .and_return(
+ ServiceResult.failure(errors: ActiveModel::Errors.new(Journal.new).tap do |e|
+ e.add(:notes, "Validation error")
+ end)
+ )
+ end
+
+ it "shows a validation error banner" do
+ activity_tab.add_comment(text: "First comment by admin", save: false)
+
+ page.find_test_selector("op-submit-work-package-journal-form").click
+
+ expect_flash(message: "Validation error", type: :error)
+
+ # expect the editor content not to be lost
+ within_test_selector("op-work-package-journal-form-element") do
+ editor = FormFields::Primerized::EditorFormField.new("notes", selector: "#work-package-journal-form-element")
+ editor.expect_value("First comment by admin")
+ end
+ end
+ end
+ end
+
+ context "when editing a comment" do
+ let!(:first_comment_by_admin) do
+ create(:work_package_journal, user: admin, notes: "First comment by admin", journable: work_package, version: 2)
+ end
+
+ context "when the update call raises an unknown server error" do
+ before do
+ allow_any_instance_of(WorkPackages::ActivitiesTabController) # rubocop:disable RSpec/AnyInstance
+ .to receive(:update_journal_service_call)
+ .and_raise(StandardError.new("Test error"))
+ end
+
+ it "shows an error banner" do
+ activity_tab.edit_comment(first_comment_by_admin, text: "First comment by admin edited", save: false)
+
+ page.within_test_selector("op-work-package-journal-form-element") do
+ page.find_test_selector("op-submit-work-package-journal-form").click
+ end
+
+ expect_flash(message: "Test error", type: :error)
+ end
+ end
+
+ context "when the update call fails with a validation error" do
+ before do
+ allow_any_instance_of(Journals::UpdateService) # rubocop:disable RSpec/AnyInstance
+ .to receive(:call)
+ .and_return(
+ ServiceResult.failure(errors: ActiveModel::Errors.new(Journal.new).tap do |e|
+ e.add(:notes, "Validation error")
+ end)
+ )
+ end
+
+ it "shows a validation error banner" do
+ activity_tab.edit_comment(first_comment_by_admin, text: "First comment by admin edited", save: false)
+
+ page.within_test_selector("op-work-package-journal-form-element") do
+ page.find_test_selector("op-submit-work-package-journal-form").click
+ end
+
+ expect_flash(message: "Validation error", type: :error)
+ end
+ end
+ end
+ end
end
diff --git a/spec/support/components/work_packages/activities.rb b/spec/support/components/work_packages/activities.rb
index 822808fea401..80f0f9c2a271 100644
--- a/spec/support/components/work_packages/activities.rb
+++ b/spec/support/components/work_packages/activities.rb
@@ -98,7 +98,7 @@ def expect_no_journal_notes_header(text: nil)
end
def expect_journal_notes(text: nil)
- expect(page).to have_test_selector("op-journal-notes-body", text:)
+ expect(page).to have_test_selector("op-journal-notes-body", text:, wait: 10)
end
def expect_notification_bubble
@@ -175,18 +175,20 @@ def add_comment(text: nil, save: true)
end
end
- def edit_comment(journal, text: nil)
+ def edit_comment(journal, text: nil, save: true)
within_journal_entry(journal) do
page.find_test_selector("op-wp-journal-#{journal.id}-action-menu").click
page.find_test_selector("op-wp-journal-#{journal.id}-edit").click
page.within_test_selector("op-work-package-journal-form-element") do
FormFields::Primerized::EditorFormField.new("notes", selector: "#work-package-journal-form-element").set_value(text)
- page.find_test_selector("op-submit-work-package-journal-form").click
+ page.find_test_selector("op-submit-work-package-journal-form").click if save
end
- # wait for the comment to be loaded
- wait_for { page }.to have_test_selector("op-journal-notes-body", text:)
+ if save
+ # wait for the comment to be loaded
+ wait_for { page }.to have_test_selector("op-journal-notes-body", text:)
+ end
end
end