Merge branch 'release/15.4' into dev

This commit is contained in:
OpenProject Actions CI
2025-03-11 03:40:19 +00:00
65 changed files with 198 additions and 76 deletions
+1 -1
View File
@@ -1629,6 +1629,7 @@ af:
journal_notes: "Comment"
lastname: "Van"
login: "Username"
lock_version: "Lock version"
mail: "E-pos"
name: "Naam"
note: "Note"
@@ -4173,7 +4174,6 @@ af:
nothing_to_preview: "Niks om te voorskou"
api_v3:
attributes:
lock_version: "Slot Weergawe"
property: "Property"
errors:
code_400: "Bad request: %{message}"
+1 -1
View File
@@ -1709,6 +1709,7 @@ ar:
journal_notes: "Comment"
lastname: "الاسم الأخير"
login: "Username"
lock_version: "Lock version"
mail: "البريد الإكتروني"
name: "الاسم"
note: "Note"
@@ -4339,7 +4340,6 @@ ar:
nothing_to_preview: "لا شيء للمعاينة"
api_v3:
attributes:
lock_version: "قفل الإصدار"
property: "Property"
errors:
code_400: "Bad request: %{message}"
+1 -1
View File
@@ -1629,6 +1629,7 @@ az:
journal_notes: "Comment"
lastname: "Last name"
login: "Username"
lock_version: "Lock version"
mail: "Email"
name: "Name"
note: "Note"
@@ -4173,7 +4174,6 @@ az:
nothing_to_preview: "Nothing to preview"
api_v3:
attributes:
lock_version: "Lock Version"
property: "Property"
errors:
code_400: "Bad request: %{message}"
+1 -1
View File
@@ -1669,6 +1669,7 @@ be:
journal_notes: "Comment"
lastname: "Прозвішча"
login: "Username"
lock_version: "Lock version"
mail: "Email"
name: "Імя"
note: "Note"
@@ -4257,7 +4258,6 @@ be:
nothing_to_preview: "Nothing to preview"
api_v3:
attributes:
lock_version: "Lock Version"
property: "Property"
errors:
code_400: "Bad request: %{message}"
+1 -1
View File
@@ -1629,6 +1629,7 @@ bg:
journal_notes: "Comment"
lastname: "Фамилно име"
login: "Username"
lock_version: "Lock version"
mail: "E-mail"
name: "Име"
note: "Note"
@@ -4173,7 +4174,6 @@ bg:
nothing_to_preview: "Nothing to preview"
api_v3:
attributes:
lock_version: "Lock Version"
property: "Property"
errors:
code_400: "Bad request: %{message}"
+1 -1
View File
@@ -1626,6 +1626,7 @@ ca:
journal_notes: "Comment"
lastname: "Cognom"
login: "Nom d'usuari"
lock_version: "Lock version"
mail: "Correu electrònic"
name: "Nom"
note: "Note"
@@ -4164,7 +4165,6 @@ ca:
nothing_to_preview: "Res per previsualitzar"
api_v3:
attributes:
lock_version: "Bloquejar versió"
property: "Propietat"
errors:
code_400: "Sol·licitud incorrecta: %{message}"
+1 -1
View File
@@ -1629,6 +1629,7 @@ ckb-IR:
journal_notes: "Comment"
lastname: "Last name"
login: "Username"
lock_version: "Lock version"
mail: "Email"
name: "Name"
note: "Note"
@@ -4173,7 +4174,6 @@ ckb-IR:
nothing_to_preview: "Nothing to preview"
api_v3:
attributes:
lock_version: "Lock Version"
property: "Property"
errors:
code_400: "Bad request: %{message}"
+1 -1
View File
@@ -1669,6 +1669,7 @@ cs:
journal_notes: "Comment"
lastname: "Příjmení"
login: "Uživatelské jméno"
lock_version: "Lock version"
mail: "E-mail"
name: "Název"
note: "Poznámka"
@@ -4255,7 +4256,6 @@ cs:
nothing_to_preview: "Nic pro náhled"
api_v3:
attributes:
lock_version: "Uzamknout verzi"
property: "Vlastnost"
errors:
code_400: "Špatný požadavek: %{message}"
+1 -1
View File
@@ -1627,6 +1627,7 @@ da:
journal_notes: "Comment"
lastname: "Efternavn"
login: "Username"
lock_version: "Lock version"
mail: "E-mail"
name: "Navn"
note: "Note"
@@ -4169,7 +4170,6 @@ da:
nothing_to_preview: "Intet at forhåndsvise"
api_v3:
attributes:
lock_version: "Lås version"
property: "Property"
errors:
code_400: "Bad request: %{message}"
+1 -1
View File
@@ -1622,6 +1622,7 @@ de:
journal_notes: "Kommentar"
lastname: "Nachname"
login: "Benutzername"
lock_version: "Lock version"
mail: "E-Mail"
name: "Name"
note: "Anmerkung"
@@ -4165,7 +4166,6 @@ de:
nothing_to_preview: "Keine Vorschau verfügbar"
api_v3:
attributes:
lock_version: "Version sperren"
property: "Eigenschaft"
errors:
code_400: "Ungültige Anfrage: %{message}"
+1 -1
View File
@@ -1625,6 +1625,7 @@ el:
journal_notes: "Comment"
lastname: "Επώνυμο"
login: "Όνομα χρήστη"
lock_version: "Lock version"
mail: "Email"
name: "Όνομα"
note: "Note"
@@ -4167,7 +4168,6 @@ el:
nothing_to_preview: "Δεν υπάρχει κάτι για προεπισκόπηση"
api_v3:
attributes:
lock_version: "Κλείδωμα Έκδοσης"
property: "Property"
errors:
code_400: "Λάθος αίτημα: %{message}"
+1 -1
View File
@@ -1629,6 +1629,7 @@ eo:
journal_notes: "Comment"
lastname: "Familinomo"
login: "Uzantnomo"
lock_version: "Lock version"
mail: "Retpoŝto"
name: "Nomo"
note: "Note"
@@ -4173,7 +4174,6 @@ eo:
nothing_to_preview: "Nothing to preview"
api_v3:
attributes:
lock_version: "Lock Version"
property: "Property"
errors:
code_400: "Bad request: %{message}"
+1 -1
View File
@@ -1627,6 +1627,7 @@ es:
journal_notes: "Comment"
lastname: "Apellido"
login: "Nombre usuario"
lock_version: "Lock version"
mail: "Correo electrónico"
name: "Nombre"
note: "Nota"
@@ -4169,7 +4170,6 @@ es:
nothing_to_preview: "Nada para previsualizar"
api_v3:
attributes:
lock_version: "Versión Bloqueada"
property: "Propiedad"
errors:
code_400: "Solicitud errónea: %{message}"
+1 -1
View File
@@ -1629,6 +1629,7 @@ et:
journal_notes: "Comment"
lastname: "Perekonnanimi"
login: "Kasutajanimi"
lock_version: "Lock version"
mail: "E-posti aadress"
name: "Nimi"
note: "Note"
@@ -4173,7 +4174,6 @@ et:
nothing_to_preview: "Eelvaateks pole midagi näidata"
api_v3:
attributes:
lock_version: "Lock Version"
property: "Property"
errors:
code_400: "Bad request: %{message}"
+1 -1
View File
@@ -1629,6 +1629,7 @@ eu:
journal_notes: "Comment"
lastname: "Last name"
login: "Username"
lock_version: "Lock version"
mail: "Email"
name: "Name"
note: "Note"
@@ -4173,7 +4174,6 @@ eu:
nothing_to_preview: "Nothing to preview"
api_v3:
attributes:
lock_version: "Lock Version"
property: "Property"
errors:
code_400: "Bad request: %{message}"
+1 -1
View File
@@ -1629,6 +1629,7 @@ fa:
journal_notes: "Comment"
lastname: "نام خانوادگی"
login: "نام كاربري"
lock_version: "Lock version"
mail: "Email"
name: "نام"
note: "Note"
@@ -4173,7 +4174,6 @@ fa:
nothing_to_preview: "Nothing to preview"
api_v3:
attributes:
lock_version: "قفل نگارش"
property: "Property"
errors:
code_400: "Bad request: %{message}"
+1 -1
View File
@@ -1629,6 +1629,7 @@ fi:
journal_notes: "Comment"
lastname: "Sukunimi"
login: "Käyttäjätunnus"
lock_version: "Lock version"
mail: "Sähköposti"
name: "Nimi"
note: "Note"
@@ -4173,7 +4174,6 @@ fi:
nothing_to_preview: "Ei esikatseltavaa"
api_v3:
attributes:
lock_version: "Lock Version"
property: "Property"
errors:
code_400: "Bad request: %{message}"
+1 -1
View File
@@ -1629,6 +1629,7 @@ fil:
journal_notes: "Comment"
lastname: "Huling pangalan"
login: "Username"
lock_version: "Lock version"
mail: "Email"
name: "Pangalan"
note: "Note"
@@ -4171,7 +4172,6 @@ fil:
nothing_to_preview: "Walang mai-preview"
api_v3:
attributes:
lock_version: "Nakakandadong bersyon"
property: "Property"
errors:
code_400: "Bad request: %{message}"
+1 -1
View File
@@ -1627,6 +1627,7 @@ fr:
journal_notes: "Comment"
lastname: "Nom de famille"
login: "Nom d'utilisateur"
lock_version: "Lock version"
mail: "E-mail"
name: "Nom"
note: "Note"
@@ -4170,7 +4171,6 @@ fr:
nothing_to_preview: "Rien à afficher en apperçu"
api_v3:
attributes:
lock_version: "Version Lock"
property: "Propriété"
errors:
code_400: "Mauvaise requête : %{message}"
+1 -1
View File
@@ -1669,6 +1669,7 @@ he:
journal_notes: "Comment"
lastname: "שם משפחה"
login: "Username"
lock_version: "Lock version"
mail: "אימייל"
name: "שם"
note: "Note"
@@ -4257,7 +4258,6 @@ he:
nothing_to_preview: "Nothing to preview"
api_v3:
attributes:
lock_version: "גרסת מנעול"
property: "Property"
errors:
code_400: "Bad request: %{message}"
+1 -1
View File
@@ -1627,6 +1627,7 @@ hi:
journal_notes: "Comment"
lastname: "अंतिम नाम"
login: "Username"
lock_version: "Lock version"
mail: "ईमेल"
name: "नाम"
note: "Note"
@@ -4171,7 +4172,6 @@ hi:
nothing_to_preview: "Nothing to preview"
api_v3:
attributes:
lock_version: "Lock Version"
property: "Property"
errors:
code_400: "Bad request: %{message}"
+1 -1
View File
@@ -1649,6 +1649,7 @@ hr:
journal_notes: "Comment"
lastname: "Prezime"
login: "Korisničko ime"
lock_version: "Lock version"
mail: "Email"
name: "Naziv"
note: "Note"
@@ -4215,7 +4216,6 @@ hr:
nothing_to_preview: "Ne postoji zapis za pregled"
api_v3:
attributes:
lock_version: "Zaključavanje verzije"
property: "Property"
errors:
code_400: "Bad request: %{message}"
+1 -1
View File
@@ -1628,6 +1628,7 @@ hu:
journal_notes: "Comment"
lastname: "Vezetéknév"
login: "Felhasználónév"
lock_version: "Lock version"
mail: "Email"
name: "Név"
note: "Note"
@@ -4171,7 +4172,6 @@ hu:
nothing_to_preview: "Nincs előnézet"
api_v3:
attributes:
lock_version: "Lezárt változat"
property: "Property"
errors:
code_400: "Hibás hívás %{message}"
+1 -1
View File
@@ -1605,6 +1605,7 @@ id:
journal_notes: "Comment"
lastname: "Nama belakang"
login: "Nama pengguna"
lock_version: "Lock version"
mail: "Email"
name: "Nama"
note: "Note"
@@ -4124,7 +4125,6 @@ id:
nothing_to_preview: "Tidak ada pre-view"
api_v3:
attributes:
lock_version: "Lock Version"
property: "Properti"
errors:
code_400: "Permintaan buruk: %{message}"
+1 -1
View File
@@ -1626,6 +1626,7 @@ it:
journal_notes: "Comment"
lastname: "Cognome"
login: "Nome utente"
lock_version: "Lock version"
mail: "Email"
name: "Nome"
note: "Nota"
@@ -4170,7 +4171,6 @@ it:
nothing_to_preview: "Niente in anteprima"
api_v3:
attributes:
lock_version: "Blocca Versione"
property: "Proprietà"
errors:
code_400: "Richiesta non valida: %{message}"
+1 -1
View File
@@ -1607,6 +1607,7 @@ ja:
journal_notes: "Comment"
lastname: "苗字"
login: "ユーザー名"
lock_version: "Lock version"
mail: "電子メールアドレス"
name: "名称"
note: "Note"
@@ -4128,7 +4129,6 @@ ja:
nothing_to_preview: "プレビューできるものは何もありません。"
api_v3:
attributes:
lock_version: "ロックバージョン"
property: "Property"
errors:
code_400: "不正なリクエスト: %{message}"
+1 -1
View File
@@ -1629,6 +1629,7 @@ ka:
journal_notes: "Comment"
lastname: "გვარი"
login: "მომხმარებლის სახელი"
lock_version: "Lock version"
mail: "ელფოსტა"
name: "სახელი"
note: "Note"
@@ -4173,7 +4174,6 @@ ka:
nothing_to_preview: "Nothing to preview"
api_v3:
attributes:
lock_version: "ვერსიის ჩაკეტვა"
property: "თვისება"
errors:
code_400: "Bad request: %{message}"
+1 -1
View File
@@ -1629,6 +1629,7 @@ kk:
journal_notes: "Comment"
lastname: "Last name"
login: "Username"
lock_version: "Lock version"
mail: "Email"
name: "Name"
note: "Note"
@@ -4173,7 +4174,6 @@ kk:
nothing_to_preview: "Nothing to preview"
api_v3:
attributes:
lock_version: "Lock Version"
property: "Property"
errors:
code_400: "Bad request: %{message}"
+1 -1
View File
@@ -1609,6 +1609,7 @@ ko:
journal_notes: "Comment"
lastname: "성"
login: "사용자 이름"
lock_version: "Lock version"
mail: "이메일"
name: "이름"
note: "메모"
@@ -4128,7 +4129,6 @@ ko:
nothing_to_preview: "미리 볼 내용 없음"
api_v3:
attributes:
lock_version: "잠금 버전"
property: "속성"
errors:
code_400: "잘못된 요청: %{message}"
+1 -1
View File
@@ -1666,6 +1666,7 @@ lt:
journal_notes: "Comment"
lastname: "Pavardė"
login: "Naudotojas"
lock_version: "Lock version"
mail: "El. paštas"
name: "Vardas"
note: "Note"
@@ -4250,7 +4251,6 @@ lt:
nothing_to_preview: "Nėra ką rodyti"
api_v3:
attributes:
lock_version: "Užrakto versija"
property: "Savybė"
errors:
code_400: "Bloga užklausa: %{message}"
+1 -1
View File
@@ -1649,6 +1649,7 @@ lv:
journal_notes: "Comment"
lastname: "Uzvārds"
login: "Username"
lock_version: "Lock version"
mail: "E-Pasts"
name: "Nosaukums"
note: "Note"
@@ -4215,7 +4216,6 @@ lv:
nothing_to_preview: "Nothing to preview"
api_v3:
attributes:
lock_version: "Lock Version"
property: "Property"
errors:
code_400: "Bad request: %{message}"
+1 -1
View File
@@ -1629,6 +1629,7 @@ mn:
journal_notes: "Comment"
lastname: "Last name"
login: "Username"
lock_version: "Lock version"
mail: "Email"
name: "Name"
note: "Note"
@@ -4173,7 +4174,6 @@ mn:
nothing_to_preview: "Nothing to preview"
api_v3:
attributes:
lock_version: "Lock Version"
property: "Property"
errors:
code_400: "Bad request: %{message}"
+1 -1
View File
@@ -1607,6 +1607,7 @@ ms:
journal_notes: "Comment"
lastname: "Nama akhir"
login: "Nama pengguna"
lock_version: "Lock version"
mail: "E-mel"
name: "Nama"
note: "Nota"
@@ -4128,7 +4129,6 @@ ms:
nothing_to_preview: "Tiada kandungan untuk dipreviu"
api_v3:
attributes:
lock_version: "Versi Terkunci "
property: "Ciri-ciri"
errors:
code_400: "Ralat Permintaan: %{message}"
+1 -1
View File
@@ -1629,6 +1629,7 @@ ne:
journal_notes: "Comment"
lastname: "Last name"
login: "Username"
lock_version: "Lock version"
mail: "Email"
name: "Name"
note: "Note"
@@ -4173,7 +4174,6 @@ ne:
nothing_to_preview: "Nothing to preview"
api_v3:
attributes:
lock_version: "Lock Version"
property: "Property"
errors:
code_400: "Bad request: %{message}"
+1 -1
View File
@@ -1625,6 +1625,7 @@ nl:
journal_notes: "Comment"
lastname: "Achternaam"
login: "Gebruikersnaam"
lock_version: "Lock version"
mail: "E-mail"
name: "Naam"
note: "Opmerking"
@@ -4167,7 +4168,6 @@ nl:
nothing_to_preview: "Niets om te bekijken"
api_v3:
attributes:
lock_version: "Vergrendel versie"
property: "Eigendom"
errors:
code_400: "Verkeerd verzoek: %{message}"
+1 -1
View File
@@ -1628,6 +1628,7 @@
journal_notes: "Comment"
lastname: "Etternavn"
login: "Brukernavn"
lock_version: "Lock version"
mail: "E-post"
name: "Navn"
note: "Note"
@@ -4172,7 +4173,6 @@
nothing_to_preview: "Ingenting å forhåndsvise"
api_v3:
attributes:
lock_version: "Låst versjon"
property: "Egenskap"
errors:
code_400: "Feil forespørsel: %{message}"
+1 -1
View File
@@ -1666,6 +1666,7 @@ pl:
journal_notes: "Comment"
lastname: "Nazwisko"
login: "Nazwa użytkownika"
lock_version: "Lock version"
mail: "Adres e-mail"
name: "Nazwa"
note: "Uwaga"
@@ -4251,7 +4252,6 @@ pl:
nothing_to_preview: "Nie ma nic do podglądu"
api_v3:
attributes:
lock_version: "Wersja zablokowana"
property: "Własność"
errors:
code_400: "Nieprawidłowe żądanie: %{message}"
+1 -1
View File
@@ -1626,6 +1626,7 @@ pt-BR:
journal_notes: "Comment"
lastname: "Sobrenome"
login: "Nome de usuário"
lock_version: "Lock version"
mail: "E-mail"
name: "Nome"
note: "Nota"
@@ -4168,7 +4169,6 @@ pt-BR:
nothing_to_preview: "Nada para visualizar"
api_v3:
attributes:
lock_version: "Bloquear versão"
property: "Propriedade"
errors:
code_400: "Requisição inválida: %{message}"
+1 -1
View File
@@ -1626,6 +1626,7 @@ pt-PT:
journal_notes: "Comment"
lastname: "Último nome"
login: "Nome do Utilizador"
lock_version: "Lock version"
mail: "E-mail"
name: "Nome"
note: "Nota"
@@ -4167,7 +4168,6 @@ pt-PT:
nothing_to_preview: "Nada para Visualizar"
api_v3:
attributes:
lock_version: "Versão de bloqueio"
property: "Propriedade"
errors:
code_400: "Pedido incorreto: %{message}"
+1 -1
View File
@@ -1649,6 +1649,7 @@ ro:
journal_notes: "Comment"
lastname: "Nume"
login: "Utilizator"
lock_version: "Lock version"
mail: "E-mail"
name: "Nume"
note: "Note"
@@ -4214,7 +4215,6 @@ ro:
nothing_to_preview: "Nimic de previzualizat"
api_v3:
attributes:
lock_version: "Blocare versiune"
property: "Proprietate"
errors:
code_400: "Cerere greșită: %{message}"
+1 -1
View File
@@ -1667,6 +1667,7 @@ ru:
journal_notes: "Комментарий"
lastname: "Фамилия"
login: "Имя пользователя"
lock_version: "Lock version"
mail: "Электронная почта"
name: "Имя"
note: "Заметка"
@@ -4251,7 +4252,6 @@ ru:
nothing_to_preview: "Нет ничего для предосмотра"
api_v3:
attributes:
lock_version: "Блокировать этап"
property: "Свойство"
errors:
code_400: "Неверный запрос: %{message}"
+1 -1
View File
@@ -1629,6 +1629,7 @@ rw:
journal_notes: "Comment"
lastname: "Last name"
login: "Username"
lock_version: "Lock version"
mail: "Email"
name: "Name"
note: "Note"
@@ -4173,7 +4174,6 @@ rw:
nothing_to_preview: "Nothing to preview"
api_v3:
attributes:
lock_version: "Lock Version"
property: "Property"
errors:
code_400: "Bad request: %{message}"
+1 -1
View File
@@ -1629,6 +1629,7 @@ si:
journal_notes: "Comment"
lastname: "අවසාන නම"
login: "පරිශීලක නාමය"
lock_version: "Lock version"
mail: "ඊ-තැපැල්"
name: "නම"
note: "Note"
@@ -4173,7 +4174,6 @@ si:
nothing_to_preview: "පෙරදසුන් කිරීමට කිසිවක් නැත"
api_v3:
attributes:
lock_version: "අගුලු අනුවාදය"
property: "Property"
errors:
code_400: "නරක ඉල්ලීම: %{message}"
+1 -1
View File
@@ -1669,6 +1669,7 @@ sk:
journal_notes: "Comment"
lastname: "Priezvisko"
login: "Používateľské meno"
lock_version: "Lock version"
mail: "E-mail"
name: "Názov"
note: "Note"
@@ -4256,7 +4257,6 @@ sk:
nothing_to_preview: "Nič na zobrazenie náhľadu"
api_v3:
attributes:
lock_version: "Uzamknúť verziu"
property: "Property"
errors:
code_400: "Bad request: %{message}"
+1 -1
View File
@@ -1668,6 +1668,7 @@ sl:
journal_notes: "Comment"
lastname: "Priimek"
login: "Uporabniško ime"
lock_version: "Lock version"
mail: "E-pošta"
name: "Ime"
note: "Note"
@@ -4255,7 +4256,6 @@ sl:
nothing_to_preview: "Ničesar za predogled"
api_v3:
attributes:
lock_version: "Zakleni verzijo"
property: "Property"
errors:
code_400: "Slaba zahteva: %{message}"
+1 -1
View File
@@ -1649,6 +1649,7 @@ sr:
journal_notes: "Comment"
lastname: "Last name"
login: "Username"
lock_version: "Lock version"
mail: "Email"
name: "Name"
note: "Note"
@@ -4215,7 +4216,6 @@ sr:
nothing_to_preview: "Nothing to preview"
api_v3:
attributes:
lock_version: "Lock Version"
property: "Property"
errors:
code_400: "Bad request: %{message}"
+1 -1
View File
@@ -1629,6 +1629,7 @@ sv:
journal_notes: "Comment"
lastname: "Efternamn"
login: "Användarnamn"
lock_version: "Lock version"
mail: "E-post"
name: "Namn"
note: "Note"
@@ -4170,7 +4171,6 @@ sv:
nothing_to_preview: "Ingenting att förhandsgranska"
api_v3:
attributes:
lock_version: "Lås version"
property: "Property"
errors:
code_400: "Felaktig begäran: %{message}"
+1 -1
View File
@@ -1609,6 +1609,7 @@ th:
journal_notes: "Comment"
lastname: "นามสกุล"
login: "Username"
lock_version: "Lock version"
mail: "อีเมล"
name: "ชื่อ"
note: "Note"
@@ -4131,7 +4132,6 @@ th:
nothing_to_preview: "ไม่มีอะไรให้แสดงเป็นตัวอย่าง"
api_v3:
attributes:
lock_version: "Lock Version"
property: "Property"
errors:
code_400: "Bad request: %{message}"
+1 -1
View File
@@ -1628,6 +1628,7 @@ tr:
journal_notes: "Yorum"
lastname: "Soyisim"
login: "Kullanıcı adı"
lock_version: "Lock version"
mail: "Eposta"
name: "İsim"
note: "Not"
@@ -4169,7 +4170,6 @@ tr:
nothing_to_preview: "Önizlenecek bir şey yok"
api_v3:
attributes:
lock_version: "Sürümü Kilitle"
property: "Özellik"
errors:
code_400: "Geçersiz istek: %{message}"
+1 -1
View File
@@ -1664,6 +1664,7 @@ uk:
journal_notes: "Comment"
lastname: "Прізвище"
login: "Ім'я користувача"
lock_version: "Lock version"
mail: "Електронна пошта"
name: "Ім’я"
note: "Примітка"
@@ -4249,7 +4250,6 @@ uk:
nothing_to_preview: "Нічого для перегляду"
api_v3:
attributes:
lock_version: "Версія замку"
property: "Властивість"
errors:
code_400: "Поганий запит: %{message}"
+1 -1
View File
@@ -1629,6 +1629,7 @@ uz:
journal_notes: "Comment"
lastname: "Last name"
login: "Username"
lock_version: "Lock version"
mail: "Email"
name: "Name"
note: "Note"
@@ -4173,7 +4174,6 @@ uz:
nothing_to_preview: "Nothing to preview"
api_v3:
attributes:
lock_version: "Lock Version"
property: "Property"
errors:
code_400: "Bad request: %{message}"
+1 -1
View File
@@ -1609,6 +1609,7 @@ vi:
journal_notes: "Comment"
lastname: "Họ"
login: "Tên người dùng"
lock_version: "Lock version"
mail: "Thư điện tử"
name: "Tên"
note: "Note"
@@ -4130,7 +4131,6 @@ vi:
nothing_to_preview: "Không có gì để xem trước"
api_v3:
attributes:
lock_version: "Phiên bản khóa"
property: "Thuộc tính"
errors:
code_400: "Yêu cầu không hợp lệ: %{message}"
+1 -1
View File
@@ -1605,6 +1605,7 @@ zh-CN:
journal_notes: "评论"
lastname: "姓氏"
login: "用户名"
lock_version: "Lock version"
mail: "电子邮件"
name: "名称"
note: "备注"
@@ -4121,7 +4122,6 @@ zh-CN:
nothing_to_preview: "没有什么要预览"
api_v3:
attributes:
lock_version: "锁版"
property: "属性"
errors:
code_400: "错误的请求:%{message}"
+1 -1
View File
@@ -1607,6 +1607,7 @@ zh-TW:
journal_notes: "留言"
lastname: "姓:"
login: "使用者帳號"
lock_version: "Lock version"
mail: "電子郵件"
name: "名稱"
note: "備註"
@@ -4127,7 +4128,6 @@ zh-TW:
nothing_to_preview: "沒有內容可預覽"
api_v3:
attributes:
lock_version: "鎖定版本"
property: "屬性"
errors:
code_400: "錯誤請求:%{message}"
+1 -1
View File
@@ -1714,6 +1714,7 @@ en:
journal_notes: "Comment"
lastname: "Last name"
login: "Username"
lock_version: "Lock version"
mail: "Email"
name: "Name"
note: "Note"
@@ -4413,7 +4414,6 @@ en:
api_v3:
attributes:
lock_version: "Lock Version"
property: "Property"
errors:
code_400: "Bad request: %{message}"
@@ -0,0 +1,69 @@
//-- copyright
// OpenProject is an open source project management software.
// Copyright (C) the OpenProject GmbH
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License version 3.
//
// OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
// Copyright (C) 2006-2013 Jean-Philippe Lang
// Copyright (C) 2010-2013 the ChiliProject Team
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
//
// See COPYRIGHT and LICENSE files for more details.
//++
/* jshint expr: true */
import { waitForAsync } from '@angular/core/testing';
import { OpCalendarService } from 'core-app/features/calendar/op-calendar.service';
describe('OP calendar service', () => {
let service:OpCalendarService;
beforeEach(waitForAsync(() => {
// This is not a valid constructor call, but since we only want to test a helper method that does not
// depend on injected services, we can pass null values here.
// @ts-expect-error ignore invalid constructor call since we don't need a completely valid instance
service = new OpCalendarService(null, null, null);
}));
describe('stripYearFromDateFormat', () => {
it('from dotted syntax', () => {
expect(service.stripYearFromDateFormat('DD.MM.YYYY')).toEqual('DD.MM.');
});
it('from slash syntax', () => {
expect(service.stripYearFromDateFormat('MM/DD/YYYY')).toEqual('MM/DD');
expect(service.stripYearFromDateFormat('DD/MM/YYYY')).toEqual('DD/MM');
});
it('from dash syntax', () => {
expect(service.stripYearFromDateFormat('DD-MM-YYYY')).toEqual('DD-MM');
expect(service.stripYearFromDateFormat('YYYY-MM-DD')).toEqual('MM-DD');
});
it('from spaced syntax', () => {
expect(service.stripYearFromDateFormat('DD MMM YYYY')).toEqual('DD MMM');
expect(service.stripYearFromDateFormat('DD MMMM YYYY')).toEqual('DD MMMM');
});
it('from comma syntax', () => {
expect(service.stripYearFromDateFormat('MMM DD, YYYY')).toEqual('MMM DD');
expect(service.stripYearFromDateFormat('MMMM DD, YYY')).toEqual('MMMM DD');
});
});
});
@@ -8,6 +8,8 @@ import { WeekdayService } from 'core-app/core/days/weekday.service';
import { DayResourceService } from 'core-app/core/state/days/day.service';
import { IDay } from 'core-app/core/state/days/day.model';
import * as moment from 'moment-timezone';
import { ConfigurationService } from 'core-app/core/config/configuration.service';
import { DayHeaderContentArg } from '@fullcalendar/core';
@Injectable()
export class OpCalendarService extends UntilDestroyedMixin {
@@ -18,6 +20,7 @@ export class OpCalendarService extends UntilDestroyedMixin {
constructor(
readonly weekdayService:WeekdayService,
readonly dayService:DayResourceService,
readonly configurationService:ConfigurationService,
) {
super();
}
@@ -31,7 +34,7 @@ export class OpCalendarService extends UntilDestroyedMixin {
this.resizeObs = new ResizeObserver(() => this.resize$.next());
}
this.resizeObs.observe(v.nativeElement);
this.resizeObs.observe(v.nativeElement as Element);
}
applyNonWorkingDay({ date }:{ date?:Date }, nonWorkingDays:IDay[]):string[] {
@@ -42,4 +45,29 @@ export class OpCalendarService extends UntilDestroyedMixin {
}
return [];
}
dayHeaderContent(event:DayHeaderContentArg):string {
// When the user did not configure a custom date format, we can always return the default content for the
// fullcalendar day header.
if (!this.configurationService.dateFormatPresent()) {
return event.text;
}
// Additionally, we must use the default in dayGridMonth view, as it displays the day of the week:
if (event.view.type === 'dayGridMonth') {
return event.text;
}
// We are not in month grid view and there is a date format configured => return a formatted date according to
// the settings. Prefix the day of the week name for better readability.
const configuredDateFormat = this.configurationService.dateFormat();
const formatWithoutYear = this.stripYearFromDateFormat(configuredDateFormat);
const utcDate = moment(event.date).utc();
return utcDate.format(`ddd ${formatWithoutYear}`);
}
stripYearFromDateFormat(format:string):string {
return format.replace(/(\/|-|,?\s?)Y{3,4}$/, '').replace(/^Y{4}-/, '');
}
}
@@ -124,7 +124,7 @@ export class OpWorkPackagesCalendarService extends UntilDestroyedMixin {
if (this.isMilestone(workPackage)) {
return workPackage.date;
}
return workPackage[`${type}Date`] as string;
return workPackage[`${type}Date`];
}
isMilestone(workPackage:WorkPackageResource):boolean {
@@ -133,11 +133,13 @@ export class OpWorkPackagesCalendarService extends UntilDestroyedMixin {
warnOnTooManyResults(collection:WorkPackageCollectionResource, isStatic = false):void {
if (collection.count < collection.total) {
this.tooManyResultsText = this.I18n.t('js.calendar.too_many',
this.tooManyResultsText = this.I18n.t(
'js.calendar.too_many',
{
count: collection.total,
max: OpWorkPackagesCalendarService.MAX_DISPLAYED,
});
},
);
} else {
this.tooManyResultsText = null;
}
@@ -180,7 +182,6 @@ export class OpWorkPackagesCalendarService extends UntilDestroyedMixin {
// 3. We are already loaded and are refetching data (for changed dates, e.g.)
let queryProps:string|undefined;
if (this.initializingWithQuery) {
// This is the case on initially loading the calendar with a query_id present in the url params but no
// query props to overwrite the query settings.
@@ -201,7 +202,7 @@ export class OpWorkPackagesCalendarService extends UntilDestroyedMixin {
// There might also be a query_id but the settings persisted in it are overwritten by the props.
if (this.urlParams.query_props) {
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
const oldQueryProps:{ [key:string]:unknown } = JSON.parse(this.urlParams.query_props);
const oldQueryProps:{ [key:string]:unknown } = JSON.parse(this.urlParams.query_props as string);
// Update the date period of the calendar in the filter
const newQueryProps = {
@@ -231,9 +232,9 @@ export class OpWorkPackagesCalendarService extends UntilDestroyedMixin {
return Promise.all([this
.wpListService
.fromQueryParams({ query_id: queryId, query_props: queryProps, }, projectIdentifier || undefined)
.fromQueryParams({ query_id: queryId, query_props: queryProps }, projectIdentifier || undefined)
.toPromise(),
])
]);
}
public generateQueryProps(
@@ -360,6 +361,7 @@ export class OpWorkPackagesCalendarService extends UntilDestroyedMixin {
dayGridClassNames: (data:DayCellContentArg) => this.calendarService.applyNonWorkingDay(data, this.nonWorkingDays),
slotLaneClassNames: (data:SlotLaneContentArg) => this.calendarService.applyNonWorkingDay(data, this.nonWorkingDays),
slotLabelClassNames: (data:SlotLabelContentArg) => this.calendarService.applyNonWorkingDay(data, this.nonWorkingDays),
dayHeaderContent: (data:DayHeaderContentArg) => this.calendarService.dayHeaderContent(data),
};
}
@@ -184,6 +184,7 @@ export class TimeEntryCalendarComponent implements AfterViewInit, OnDestroy {
dayGridClassNames: (data:DayCellContentArg) => this.calendar.applyNonWorkingDay(data, this.nonWorkingDays),
slotLaneClassNames: (data:SlotLaneContentArg) => this.calendar.applyNonWorkingDay(data, this.nonWorkingDays),
slotLabelClassNames: (data:SlotLabelContentArg) => this.calendar.applyNonWorkingDay(data, this.nonWorkingDays),
dayHeaderContent: (data:DayHeaderContentArg) => this.calendar.dayHeaderContent(data),
};
private initializeCalendar(displayedDayss:DisplayedDays) {
@@ -308,7 +309,7 @@ export class TimeEntryCalendarComponent implements AfterViewInit, OnDestroy {
return entries.map((entry) => {
let start:Moment;
let end:Moment;
const hours = this.timezone.toHours(entry.hours) * this.scaleRatio;
const hours = this.timezone.toHours(entry.hours as string) * this.scaleRatio;
const spentOn = entry.spentOn;
if (hoursDistribution[spentOn]) {
@@ -347,7 +348,7 @@ export class TimeEntryCalendarComponent implements AfterViewInit, OnDestroy {
const dateSums:{ [key:string]:number } = {};
entries.forEach((entry) => {
const hours = this.timezone.toHours(entry.hours);
const hours = this.timezone.toHours(entry.hours as string);
const spentOn = entry.spentOn;
if (dateSums[spentOn]) {
@@ -421,7 +422,7 @@ export class TimeEntryCalendarComponent implements AfterViewInit, OnDestroy {
private dispatchEventClick(event:CalendarViewEvent):void {
if (event.event.extendedProps.entry) {
this.editEvent(event.event.extendedProps.entry);
this.editEvent(event.event.extendedProps.entry as TimeEntryResource);
} else if (event.el.classList.contains(ADD_ENTRY_CLASS_NAME) && !event.el.classList.contains(ADD_ENTRY_PROHIBITED_CLASS_NAME)) {
this.addEvent(moment(event.event.startStr));
}
@@ -535,7 +536,7 @@ export class TimeEntryCalendarComponent implements AfterViewInit, OnDestroy {
const schema = (await this.schemaCache.ensureLoaded(entry as TimeEntryResource)) as TimeEntrySchema;
jQuery(event.el).tooltip({
content: this.tooltipContentString(event.event.extendedProps.entry, schema),
content: this.tooltipContentString(event.event.extendedProps.entry as TimeEntryResource, schema),
items: '.fc-event',
close() {
jQuery('.ui-helper-hidden-accessible').remove();
@@ -555,11 +556,11 @@ export class TimeEntryCalendarComponent implements AfterViewInit, OnDestroy {
private prependDuration(event:CalendarViewEvent):void {
const timeEntry = event.event.extendedProps.entry as TimeEntryResource;
if (this.timezone.toHours(timeEntry.hours) < 0.5) {
if (this.timezone.toHours(timeEntry.hours as string) < 0.5) {
return;
}
const formattedDuration = this.timezone.formattedDuration(timeEntry.hours);
const formattedDuration = this.timezone.formattedDuration(timeEntry.hours as string);
jQuery(event.el)
.find('.fc-event-title')
@@ -578,7 +579,7 @@ export class TimeEntryCalendarComponent implements AfterViewInit, OnDestroy {
private appendFadeout(event:CalendarViewEvent):void {
const timeEntry = event.event.extendedProps.entry as TimeEntryResource;
if (this.timezone.toHours(timeEntry.hours) < 0.5) {
if (this.timezone.toHours(timeEntry.hours as string) < 0.5) {
return;
}
@@ -636,7 +637,7 @@ export class TimeEntryCalendarComponent implements AfterViewInit, OnDestroy {
</li>
<li class="tooltip--map--item">
<span class="tooltip--map--key">${schema.hours.name}:</span>
<span class="tooltip--map--value">${this.timezone.formattedDuration(entry.hours)}</span>
<span class="tooltip--map--value">${this.timezone.formattedDuration(entry.hours as string)}</span>
</li>
<li class="tooltip--map--item">
<span class="tooltip--map--key">${schema.comment.name}:</span>
+3
View File
@@ -28,6 +28,9 @@
.fc-non-working-day
background: rgb(109 109 109 / 20%)
.fc-col-header-cell
word-break: break-word
// The days in full calendar are anchor elements which we do not
// want to like like actual links
.fc-col-header-cell a,
@@ -107,7 +107,6 @@ module API
schema :lock_version,
type: "Integer",
name_source: ->(*) { I18n.t("api_v3.attributes.lock_version") },
show_if: ->(*) { @show_lock_version }
schema :id,
@@ -122,4 +122,21 @@ RSpec.describe "Calendar Widget", :js, with_settings: { start_of_week: 1 } do
work_package.reload
expect(work_package.due_date).to eq Time.zone.today.beginning_of_week.next_occurring(:tuesday)
end
context "when looking at the date headers" do
let(:next_tuesday) { Time.zone.today.beginning_of_week.next_occurring(:tuesday) }
let(:tue_css_selector) { ".fc-day-tue .fc-col-header-cell-cushion" }
it "shows the default date format" do
expected = /Tue #{next_tuesday.month}\/#{next_tuesday.day}/
expect(page).to have_css(tue_css_selector, text: expected)
end
context "with a date format configured", with_settings: { date_format: "%d.%m.%Y" } do
it "shows the configured date format" do
expected = /Tue #{next_tuesday.day.to_s.rjust(2, '0')}\.#{next_tuesday.month.to_s.rjust(2, '0')}\./
expect(page).to have_css(tue_css_selector, text: expected)
end
end
end
end
@@ -94,6 +94,10 @@ RSpec.describe "Work package calendars", :js do
expect(page)
.to have_no_css ".fc-event-title", text: another_future_work_package.subject
# The columns are set correctly according to month view.
expect(page).to have_css ".fc-day-mon .fc-col-header-cell-cushion", text: "Mon"
expect(page).to have_css ".fc-day-tue .fc-col-header-cell-cushion", text: "Tue"
filters.expect_filter_count 1
filters.open
@@ -70,12 +70,12 @@ class MeetingOutcomesController < ApplicationController
if call.success?
render_base_outcome_component_via_turbo_stream(meeting: @meeting, meeting_agenda_item: @meeting_agenda_item,
meeting_outcome: @meeting_outcome, edit: false)
update_header_component_via_turbo_stream
else
render_base_error_in_flash_message_via_turbo_stream(call.errors)
update_all_via_turbo_stream
end
update_all_via_turbo_stream
respond_with_turbo_streams
end
@@ -112,7 +112,6 @@ class MeetingOutcomesController < ApplicationController
if call.success?
render_base_outcome_component_via_turbo_stream(meeting: @meeting, meeting_agenda_item: @meeting_agenda_item,
meeting_outcome: call.result, edit: false)
update_header_component_via_turbo_stream
else
render_base_error_in_flash_message_via_turbo_stream(call.errors)
end
@@ -235,7 +235,7 @@ RSpec.describe API::V3::WorkPackages::Schema::WorkPackageSchemaRepresenter do
it_behaves_like "has basic schema properties" do
let(:path) { "lockVersion" }
let(:type) { "Integer" }
let(:name) { I18n.t("api_v3.attributes.lock_version") }
let(:name) { I18n.t("attributes.lock_version") }
let(:required) { true }
let(:writable) { true }
end