Compare commits
21 Commits
enh/dashbo
...
enh/option
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6d6faf65e6 | ||
|
|
26f68475f7 | ||
|
|
3e88e8c251 | ||
|
|
e93c3c0f9b | ||
|
|
cd78abef5f | ||
|
|
3811959b91 | ||
|
|
8abfac7f93 | ||
|
|
87a308c10f | ||
|
|
e8cc17ffdf | ||
|
|
3738d1e02b | ||
|
|
626a8bea7d | ||
|
|
c0831a852e | ||
|
|
2085a23b08 | ||
|
|
a9971963b2 | ||
|
|
20821680d9 | ||
|
|
214fb3417d | ||
|
|
327d579521 | ||
|
|
225a22c93e | ||
|
|
9f7901519b | ||
|
|
6d8a03840e | ||
|
|
6ea6303c81 |
@@ -17,7 +17,7 @@
|
||||
- 🚀 Get your project organized
|
||||
|
||||
</description>
|
||||
<version>1.4.0-alpha1</version>
|
||||
<version>1.4.0</version>
|
||||
<licence>agpl</licence>
|
||||
<author>Julius Härtl</author>
|
||||
<namespace>Deck</namespace>
|
||||
|
||||
@@ -112,12 +112,12 @@ OC.L10N.register(
|
||||
"Select a list" : "Vyberte sloupec",
|
||||
"Card title" : "Název karty",
|
||||
"Cancel" : "Storno",
|
||||
"Creating the new card…" : "Vytváření nové karty...",
|
||||
"\"{card}\" was added to \"{board}\"" : "\"{card}\" bylo přidáno do \"{board}\"",
|
||||
"Creating the new card…" : "Vytváření nové karty…",
|
||||
"\"{card}\" was added to \"{board}\"" : "„{card}“ bylo přidáno do „{board}“",
|
||||
"Open card" : "Otevřít kartu",
|
||||
"Close" : "Zavřít",
|
||||
"Create card" : "Vytvořit kartu",
|
||||
"Select a card" : "Vybrat tabuli",
|
||||
"Select a card" : "Vybrat kartu",
|
||||
"Select the card to link to a project" : "Vyberte kartu kterou propojit s projektem",
|
||||
"Link to card" : "Propojit s kartou",
|
||||
"File already exists" : "Soubor už existuje",
|
||||
@@ -206,7 +206,7 @@ OC.L10N.register(
|
||||
"Remove due date" : "Odstranit termín",
|
||||
"Select Date" : "Vybrat datum",
|
||||
"Save" : "Uložit",
|
||||
"The comment cannot be empty." : "Komentář je třeba vyplnit",
|
||||
"The comment cannot be empty." : "Komentář je třeba vyplnit.",
|
||||
"The comment cannot be longer than 1000 characters." : "Délka komentáře může být nejvýše 1 000 znaků.",
|
||||
"In reply to" : "V odpověď na",
|
||||
"Reply" : "Odpovědět",
|
||||
|
||||
@@ -110,12 +110,12 @@
|
||||
"Select a list" : "Vyberte sloupec",
|
||||
"Card title" : "Název karty",
|
||||
"Cancel" : "Storno",
|
||||
"Creating the new card…" : "Vytváření nové karty...",
|
||||
"\"{card}\" was added to \"{board}\"" : "\"{card}\" bylo přidáno do \"{board}\"",
|
||||
"Creating the new card…" : "Vytváření nové karty…",
|
||||
"\"{card}\" was added to \"{board}\"" : "„{card}“ bylo přidáno do „{board}“",
|
||||
"Open card" : "Otevřít kartu",
|
||||
"Close" : "Zavřít",
|
||||
"Create card" : "Vytvořit kartu",
|
||||
"Select a card" : "Vybrat tabuli",
|
||||
"Select a card" : "Vybrat kartu",
|
||||
"Select the card to link to a project" : "Vyberte kartu kterou propojit s projektem",
|
||||
"Link to card" : "Propojit s kartou",
|
||||
"File already exists" : "Soubor už existuje",
|
||||
@@ -204,7 +204,7 @@
|
||||
"Remove due date" : "Odstranit termín",
|
||||
"Select Date" : "Vybrat datum",
|
||||
"Save" : "Uložit",
|
||||
"The comment cannot be empty." : "Komentář je třeba vyplnit",
|
||||
"The comment cannot be empty." : "Komentář je třeba vyplnit.",
|
||||
"The comment cannot be longer than 1000 characters." : "Délka komentáře může být nejvýše 1 000 znaků.",
|
||||
"In reply to" : "V odpověď na",
|
||||
"Reply" : "Odpovědět",
|
||||
|
||||
@@ -107,9 +107,16 @@ OC.L10N.register(
|
||||
"Select the board to link to a project" : "Избери табла за поврзување со проект",
|
||||
"Search by board title" : "Барај по име на табла",
|
||||
"Select board" : "Избери табла",
|
||||
"Create a new card" : "Креирајте нова картица",
|
||||
"Select a board" : "Избери табла",
|
||||
"Select a list" : "Избери листа",
|
||||
"Card title" : "Наслов на картицата",
|
||||
"Cancel" : "Откажи",
|
||||
"Creating the new card…" : "Креирање нова картица...",
|
||||
"\"{card}\" was added to \"{board}\"" : "\"{card}\" е додадена на \"{board}\"",
|
||||
"Open card" : "Отвори картица",
|
||||
"Close" : "Затвори",
|
||||
"Create card" : "Креирајте картица",
|
||||
"Select a card" : "Избери картица",
|
||||
"Select the card to link to a project" : "Избери картица за поврзување со проект",
|
||||
"Link to card" : "Линк до картица",
|
||||
@@ -258,6 +265,8 @@ OC.L10N.register(
|
||||
"upcoming cards" : "престојни картици",
|
||||
"Link to a board" : "Линк до табла",
|
||||
"Link to a card" : "Линк до картица",
|
||||
"Create a card" : "Креирајте картица",
|
||||
"Message from {author} in {conversationName}" : "Порака од {author} во {conversationName}",
|
||||
"Something went wrong" : "Нешто не е во ред",
|
||||
"Failed to upload {name}" : "Неуспешно прикачување {name}",
|
||||
"Maximum file size of {size} exceeded" : "Максималната големина на датотека од {size} е достигната",
|
||||
|
||||
@@ -105,9 +105,16 @@
|
||||
"Select the board to link to a project" : "Избери табла за поврзување со проект",
|
||||
"Search by board title" : "Барај по име на табла",
|
||||
"Select board" : "Избери табла",
|
||||
"Create a new card" : "Креирајте нова картица",
|
||||
"Select a board" : "Избери табла",
|
||||
"Select a list" : "Избери листа",
|
||||
"Card title" : "Наслов на картицата",
|
||||
"Cancel" : "Откажи",
|
||||
"Creating the new card…" : "Креирање нова картица...",
|
||||
"\"{card}\" was added to \"{board}\"" : "\"{card}\" е додадена на \"{board}\"",
|
||||
"Open card" : "Отвори картица",
|
||||
"Close" : "Затвори",
|
||||
"Create card" : "Креирајте картица",
|
||||
"Select a card" : "Избери картица",
|
||||
"Select the card to link to a project" : "Избери картица за поврзување со проект",
|
||||
"Link to card" : "Линк до картица",
|
||||
@@ -256,6 +263,8 @@
|
||||
"upcoming cards" : "престојни картици",
|
||||
"Link to a board" : "Линк до табла",
|
||||
"Link to a card" : "Линк до картица",
|
||||
"Create a card" : "Креирајте картица",
|
||||
"Message from {author} in {conversationName}" : "Порака од {author} во {conversationName}",
|
||||
"Something went wrong" : "Нешто не е во ред",
|
||||
"Failed to upload {name}" : "Неуспешно прикачување {name}",
|
||||
"Maximum file size of {size} exceeded" : "Максималната големина на датотека од {size} е достигната",
|
||||
|
||||
103
l10n/sc.js
103
l10n/sc.js
@@ -167,11 +167,112 @@ OC.L10N.register(
|
||||
"Can manage" : "Faghet a gestire",
|
||||
"Delete" : "Cantzella",
|
||||
"Failed to create share with {displayName}" : "No at fatu a creare cumpartzidura cun {displayName}",
|
||||
"Add a new list" : "Agiunghe un'elencu nou",
|
||||
"Archive all cards" : "Archìvia totu is ischedas",
|
||||
"Delete list" : "Cantzella elencu",
|
||||
"Add card" : "Agiunghe ischeda",
|
||||
"Archive all cards in this list" : "Archìvia totu is ischedas in cust'elencu",
|
||||
"Add a new card" : "Agiùnghe un'ischeda noa",
|
||||
"Card name" : "Nùmene de s'ischeda",
|
||||
"List deleted" : "Elencu cantzelladu",
|
||||
"Edit" : "Modìfica ",
|
||||
"Add a new tag" : "Agiunghe un'eticheta noa",
|
||||
"title and color value must be provided" : "tocat de frunire su tìtulu e su balore de su colore",
|
||||
"Board name" : "Nùmene de sa lavagna",
|
||||
"Members" : "Membros",
|
||||
"Upload new files" : "Carriga archìvios noos",
|
||||
"Share from Files" : "Cumpartzi dae Archìvios",
|
||||
"Add this attachment" : "Agiunghe custu alligongiadu",
|
||||
"Show in Files" : "Mustra in Archìvios",
|
||||
"Unshare file" : "Annulla cumpartzidura de s'archìviu",
|
||||
"Delete Attachment" : "Cantzella alligongiadu",
|
||||
"Restore Attachment" : "Riprìstina alligongiadu",
|
||||
"File to share" : "Archìviu de cumpartzire",
|
||||
"Invalid path selected" : "Caminu seletzionadu non bàlidu",
|
||||
"Open in sidebar view" : "Aberi in s'istanca laterale",
|
||||
"Open in bigger view" : "Aberi in una bista prus ampra",
|
||||
"Attachments" : "Alligongiados",
|
||||
"Comments" : "Cummentos",
|
||||
"Modified" : "Modificadu",
|
||||
"Created" : "Creadu",
|
||||
"The title cannot be empty." : "Su tìtulu non podet èssere bòidu",
|
||||
"No comments yet. Begin the discussion!" : "Perunu cummentu ancora. Cumintzat sa chistionada!",
|
||||
"Assign a tag to this card…" : "Assigna un'eticheta a cust'ischeda...",
|
||||
"Assign to users" : "Assigna a utentes",
|
||||
"Assign to users/groups/circles" : "Assigna a utentes/grupos/tropas",
|
||||
"Assign a user to this card…" : "Assigna utente a cust'ischeda...",
|
||||
"Due date" : "Iscadèntzia",
|
||||
"Set a due date" : "Imposta iscadèntzia",
|
||||
"Remove due date" : "Boga s'iscadèntzia",
|
||||
"Select Date" : "Seletziona data",
|
||||
"Save" : "Sarva",
|
||||
"Description" : "Descritzione"
|
||||
"The comment cannot be empty." : "Su cummentu non podet èssere bòidu",
|
||||
"The comment cannot be longer than 1000 characters." : "Su cummentu non podet èssere prus longu de 1000 caràteres.",
|
||||
"In reply to" : "Rispondende a ",
|
||||
"Reply" : "Risponde",
|
||||
"Update" : "Agiorna",
|
||||
"Description" : "Descritzione",
|
||||
"(Unsaved)" : "(Non sarbada)",
|
||||
"(Saving…)" : "(Sarbende…)",
|
||||
"Formatting help" : "Ghia pro sa formatatzione",
|
||||
"Edit description" : "Modìfica descritzione",
|
||||
"View description" : "Visualiza descritzione",
|
||||
"Add Attachment" : "Agiunghe alligongiadu",
|
||||
"Write a description …" : "Iscrie una descritzione ...",
|
||||
"Choose attachment" : "Sèbera un'alligongiadu",
|
||||
"(group)" : "(grupu)",
|
||||
"(circle)" : "(tropa)",
|
||||
"Assign to me" : "Assigna a mie",
|
||||
"Unassign myself" : "Annulla s'assignatzione a mie",
|
||||
"Move card" : "Tràmuda ischeda",
|
||||
"Unarchive card" : "Ischeda no archiviada",
|
||||
"Archive card" : "Archìviu no archiviadu",
|
||||
"Delete card" : "Cantzella ischeda",
|
||||
"Move card to another board" : "Tràmuda s'ischeda a un'àtera lavagna",
|
||||
"Card deleted" : "Ischeda cantzellada",
|
||||
"seconds ago" : "segundos a immoe",
|
||||
"All boards" : "Totu is lavagnas",
|
||||
"Archived boards" : "Lavagnas archiviadas",
|
||||
"Shared with you" : "Cumpartzidu cun tegus",
|
||||
"Use bigger card view" : "Imprea bista cun ischedas prus mannas",
|
||||
"Show boards in calendar/tasks" : "Mustra lavagnas in calendàriu/fainas",
|
||||
"Limit deck usage of groups" : "Mìnima s'impreu de deck de is grupos",
|
||||
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Su de minimare su deck at a impedire a is utentes chi non faghent parte de cuddos grupos de si creare lavagnas pròpias. Is utentes ant a èssere ancora capassos de traballare in is lavagnas chi fiant istadas cumpartzidas cun issos etotu,",
|
||||
"Board details" : "Detàllios lavagna",
|
||||
"Edit board" : "Modìfica lavagna",
|
||||
"Clone board" : "Clona lavagna",
|
||||
"Unarchive board" : "Annulla s'archiviatzione de sa lavagna",
|
||||
"Archive board" : "Archìvia lavagna",
|
||||
"Turn on due date reminders" : "Allughe is notìficas pro ammentare is iscadèntzias",
|
||||
"Turn off due date reminders" : "Istuda is notìficas pro ammentare is iscadèntzias",
|
||||
"Due date reminders" : "Notìficas pro ammentare is iscadèntzias",
|
||||
"All cards" : "Totu is ischedas",
|
||||
"Assigned cards" : "Ischedas assignadas",
|
||||
"No notifications" : "Peruna notìfica",
|
||||
"Delete board" : "Cantzella lavagna",
|
||||
"Board {0} deleted" : "Lavagna {0} cantzellada",
|
||||
"Only assigned cards" : "Isceti ischedas assignadas",
|
||||
"No reminder" : "Perunu apuntu",
|
||||
"An error occurred" : "Ddoe at àpidu un'errore",
|
||||
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Ses seguru chi cheres cantzellare sa lavagna {title}? Custa operatzione at a cantzellare totu is datos de custa lavagna.",
|
||||
"Delete the board?" : "Cheres cantzellare sa lavagna?",
|
||||
"Loading filtered view" : "Carrigamentu de sa bista cun su filtru",
|
||||
"Today" : "Oe",
|
||||
"Tomorrow" : "Cras",
|
||||
"This week" : "Custa chida",
|
||||
"No due" : "Peruna iscadèntzia",
|
||||
"No upcoming cards" : "Peruna ischeda abarrada",
|
||||
"upcoming cards" : "ischedas abarradas",
|
||||
"Link to a board" : "Collega a una tabella",
|
||||
"Link to a card" : "Collega a un'ischeda",
|
||||
"Create a card" : "Crea un'ischeda",
|
||||
"Message from {author} in {conversationName}" : "Messàgiu de {author} in {conversationName}",
|
||||
"Something went wrong" : "Ddoe at àpidu un'errore",
|
||||
"Failed to upload {name}" : "No at fatu a agiornare {name}",
|
||||
"Maximum file size of {size} exceeded" : "Mannària màssima de s'archìviu de {size} superada",
|
||||
"Error creating the share" : "Errore in sa creatzione de sa cumpatzidura",
|
||||
"Share with a Deck card" : "Cumpartzi cun un'ischeda deck",
|
||||
"Share {file} with a Deck card" : "Cumpartzi {file} cun un'ischeda de deck",
|
||||
"Share" : "Cumpartzi"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
103
l10n/sc.json
103
l10n/sc.json
@@ -165,11 +165,112 @@
|
||||
"Can manage" : "Faghet a gestire",
|
||||
"Delete" : "Cantzella",
|
||||
"Failed to create share with {displayName}" : "No at fatu a creare cumpartzidura cun {displayName}",
|
||||
"Add a new list" : "Agiunghe un'elencu nou",
|
||||
"Archive all cards" : "Archìvia totu is ischedas",
|
||||
"Delete list" : "Cantzella elencu",
|
||||
"Add card" : "Agiunghe ischeda",
|
||||
"Archive all cards in this list" : "Archìvia totu is ischedas in cust'elencu",
|
||||
"Add a new card" : "Agiùnghe un'ischeda noa",
|
||||
"Card name" : "Nùmene de s'ischeda",
|
||||
"List deleted" : "Elencu cantzelladu",
|
||||
"Edit" : "Modìfica ",
|
||||
"Add a new tag" : "Agiunghe un'eticheta noa",
|
||||
"title and color value must be provided" : "tocat de frunire su tìtulu e su balore de su colore",
|
||||
"Board name" : "Nùmene de sa lavagna",
|
||||
"Members" : "Membros",
|
||||
"Upload new files" : "Carriga archìvios noos",
|
||||
"Share from Files" : "Cumpartzi dae Archìvios",
|
||||
"Add this attachment" : "Agiunghe custu alligongiadu",
|
||||
"Show in Files" : "Mustra in Archìvios",
|
||||
"Unshare file" : "Annulla cumpartzidura de s'archìviu",
|
||||
"Delete Attachment" : "Cantzella alligongiadu",
|
||||
"Restore Attachment" : "Riprìstina alligongiadu",
|
||||
"File to share" : "Archìviu de cumpartzire",
|
||||
"Invalid path selected" : "Caminu seletzionadu non bàlidu",
|
||||
"Open in sidebar view" : "Aberi in s'istanca laterale",
|
||||
"Open in bigger view" : "Aberi in una bista prus ampra",
|
||||
"Attachments" : "Alligongiados",
|
||||
"Comments" : "Cummentos",
|
||||
"Modified" : "Modificadu",
|
||||
"Created" : "Creadu",
|
||||
"The title cannot be empty." : "Su tìtulu non podet èssere bòidu",
|
||||
"No comments yet. Begin the discussion!" : "Perunu cummentu ancora. Cumintzat sa chistionada!",
|
||||
"Assign a tag to this card…" : "Assigna un'eticheta a cust'ischeda...",
|
||||
"Assign to users" : "Assigna a utentes",
|
||||
"Assign to users/groups/circles" : "Assigna a utentes/grupos/tropas",
|
||||
"Assign a user to this card…" : "Assigna utente a cust'ischeda...",
|
||||
"Due date" : "Iscadèntzia",
|
||||
"Set a due date" : "Imposta iscadèntzia",
|
||||
"Remove due date" : "Boga s'iscadèntzia",
|
||||
"Select Date" : "Seletziona data",
|
||||
"Save" : "Sarva",
|
||||
"Description" : "Descritzione"
|
||||
"The comment cannot be empty." : "Su cummentu non podet èssere bòidu",
|
||||
"The comment cannot be longer than 1000 characters." : "Su cummentu non podet èssere prus longu de 1000 caràteres.",
|
||||
"In reply to" : "Rispondende a ",
|
||||
"Reply" : "Risponde",
|
||||
"Update" : "Agiorna",
|
||||
"Description" : "Descritzione",
|
||||
"(Unsaved)" : "(Non sarbada)",
|
||||
"(Saving…)" : "(Sarbende…)",
|
||||
"Formatting help" : "Ghia pro sa formatatzione",
|
||||
"Edit description" : "Modìfica descritzione",
|
||||
"View description" : "Visualiza descritzione",
|
||||
"Add Attachment" : "Agiunghe alligongiadu",
|
||||
"Write a description …" : "Iscrie una descritzione ...",
|
||||
"Choose attachment" : "Sèbera un'alligongiadu",
|
||||
"(group)" : "(grupu)",
|
||||
"(circle)" : "(tropa)",
|
||||
"Assign to me" : "Assigna a mie",
|
||||
"Unassign myself" : "Annulla s'assignatzione a mie",
|
||||
"Move card" : "Tràmuda ischeda",
|
||||
"Unarchive card" : "Ischeda no archiviada",
|
||||
"Archive card" : "Archìviu no archiviadu",
|
||||
"Delete card" : "Cantzella ischeda",
|
||||
"Move card to another board" : "Tràmuda s'ischeda a un'àtera lavagna",
|
||||
"Card deleted" : "Ischeda cantzellada",
|
||||
"seconds ago" : "segundos a immoe",
|
||||
"All boards" : "Totu is lavagnas",
|
||||
"Archived boards" : "Lavagnas archiviadas",
|
||||
"Shared with you" : "Cumpartzidu cun tegus",
|
||||
"Use bigger card view" : "Imprea bista cun ischedas prus mannas",
|
||||
"Show boards in calendar/tasks" : "Mustra lavagnas in calendàriu/fainas",
|
||||
"Limit deck usage of groups" : "Mìnima s'impreu de deck de is grupos",
|
||||
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Su de minimare su deck at a impedire a is utentes chi non faghent parte de cuddos grupos de si creare lavagnas pròpias. Is utentes ant a èssere ancora capassos de traballare in is lavagnas chi fiant istadas cumpartzidas cun issos etotu,",
|
||||
"Board details" : "Detàllios lavagna",
|
||||
"Edit board" : "Modìfica lavagna",
|
||||
"Clone board" : "Clona lavagna",
|
||||
"Unarchive board" : "Annulla s'archiviatzione de sa lavagna",
|
||||
"Archive board" : "Archìvia lavagna",
|
||||
"Turn on due date reminders" : "Allughe is notìficas pro ammentare is iscadèntzias",
|
||||
"Turn off due date reminders" : "Istuda is notìficas pro ammentare is iscadèntzias",
|
||||
"Due date reminders" : "Notìficas pro ammentare is iscadèntzias",
|
||||
"All cards" : "Totu is ischedas",
|
||||
"Assigned cards" : "Ischedas assignadas",
|
||||
"No notifications" : "Peruna notìfica",
|
||||
"Delete board" : "Cantzella lavagna",
|
||||
"Board {0} deleted" : "Lavagna {0} cantzellada",
|
||||
"Only assigned cards" : "Isceti ischedas assignadas",
|
||||
"No reminder" : "Perunu apuntu",
|
||||
"An error occurred" : "Ddoe at àpidu un'errore",
|
||||
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Ses seguru chi cheres cantzellare sa lavagna {title}? Custa operatzione at a cantzellare totu is datos de custa lavagna.",
|
||||
"Delete the board?" : "Cheres cantzellare sa lavagna?",
|
||||
"Loading filtered view" : "Carrigamentu de sa bista cun su filtru",
|
||||
"Today" : "Oe",
|
||||
"Tomorrow" : "Cras",
|
||||
"This week" : "Custa chida",
|
||||
"No due" : "Peruna iscadèntzia",
|
||||
"No upcoming cards" : "Peruna ischeda abarrada",
|
||||
"upcoming cards" : "ischedas abarradas",
|
||||
"Link to a board" : "Collega a una tabella",
|
||||
"Link to a card" : "Collega a un'ischeda",
|
||||
"Create a card" : "Crea un'ischeda",
|
||||
"Message from {author} in {conversationName}" : "Messàgiu de {author} in {conversationName}",
|
||||
"Something went wrong" : "Ddoe at àpidu un'errore",
|
||||
"Failed to upload {name}" : "No at fatu a agiornare {name}",
|
||||
"Maximum file size of {size} exceeded" : "Mannària màssima de s'archìviu de {size} superada",
|
||||
"Error creating the share" : "Errore in sa creatzione de sa cumpatzidura",
|
||||
"Share with a Deck card" : "Cumpartzi cun un'ischeda deck",
|
||||
"Share {file} with a Deck card" : "Cumpartzi {file} cun un'ischeda de deck",
|
||||
"Share" : "Cumpartzi"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -107,9 +107,16 @@ OC.L10N.register(
|
||||
"Select the board to link to a project" : "Izberite zbirko za povezavo s projektom",
|
||||
"Search by board title" : "Išči po imenu zbirke",
|
||||
"Select board" : "Izbor zbirke",
|
||||
"Create a new card" : "Ustvari novo nalogo",
|
||||
"Select a board" : "Izbor zbirke",
|
||||
"Select a list" : "Izbor seznama",
|
||||
"Card title" : "Naslov naloge",
|
||||
"Cancel" : "Prekliči",
|
||||
"Creating the new card…" : "Poteka ustvarjanje nove naloge ...",
|
||||
"\"{card}\" was added to \"{board}\"" : "Naloga »{card}« je dodana v zbirko »{board}«.",
|
||||
"Open card" : "Odpri nalogo",
|
||||
"Close" : "Zapri",
|
||||
"Create card" : "Ustvari nalogo",
|
||||
"Select a card" : "Izbor naloge",
|
||||
"Select the card to link to a project" : "Izbor naloge za povezavo do projekta",
|
||||
"Link to card" : "Poveži nalogo",
|
||||
@@ -258,6 +265,7 @@ OC.L10N.register(
|
||||
"upcoming cards" : "prihajajoče naloge",
|
||||
"Link to a board" : "Povezava do zbirke",
|
||||
"Link to a card" : "Povezava do naloge",
|
||||
"Create a card" : "Ustvari nalogo",
|
||||
"Something went wrong" : "Prišlo je do napake ...",
|
||||
"Failed to upload {name}" : "Pošiljanje {name} je spodletelo",
|
||||
"Maximum file size of {size} exceeded" : "Omejitev velikosti datoteke {size} je prekoračena.",
|
||||
|
||||
@@ -105,9 +105,16 @@
|
||||
"Select the board to link to a project" : "Izberite zbirko za povezavo s projektom",
|
||||
"Search by board title" : "Išči po imenu zbirke",
|
||||
"Select board" : "Izbor zbirke",
|
||||
"Create a new card" : "Ustvari novo nalogo",
|
||||
"Select a board" : "Izbor zbirke",
|
||||
"Select a list" : "Izbor seznama",
|
||||
"Card title" : "Naslov naloge",
|
||||
"Cancel" : "Prekliči",
|
||||
"Creating the new card…" : "Poteka ustvarjanje nove naloge ...",
|
||||
"\"{card}\" was added to \"{board}\"" : "Naloga »{card}« je dodana v zbirko »{board}«.",
|
||||
"Open card" : "Odpri nalogo",
|
||||
"Close" : "Zapri",
|
||||
"Create card" : "Ustvari nalogo",
|
||||
"Select a card" : "Izbor naloge",
|
||||
"Select the card to link to a project" : "Izbor naloge za povezavo do projekta",
|
||||
"Link to card" : "Poveži nalogo",
|
||||
@@ -256,6 +263,7 @@
|
||||
"upcoming cards" : "prihajajoče naloge",
|
||||
"Link to a board" : "Povezava do zbirke",
|
||||
"Link to a card" : "Povezava do naloge",
|
||||
"Create a card" : "Ustvari nalogo",
|
||||
"Something went wrong" : "Prišlo je do napake ...",
|
||||
"Failed to upload {name}" : "Pošiljanje {name} je spodletelo",
|
||||
"Maximum file size of {size} exceeded" : "Omejitev velikosti datoteke {size} je prekoračena.",
|
||||
|
||||
134
l10n/zh_HK.js
134
l10n/zh_HK.js
@@ -61,29 +61,29 @@ OC.L10N.register(
|
||||
"{user} has deleted the attachment {attachment} from card {card}" : "{user} 已從卡 {card} 中刪除附件 {attachment}",
|
||||
"You have restored the attachment {attachment} to card {card}" : "您恢復了卡片 {card} 中的附件 {attachment}",
|
||||
"{user} has restored the attachment {attachment} to card {card}" : "{user} 恢復了卡片 {card} 中的附件 {attachment}",
|
||||
"You have commented on card {card}" : "您評論了卡片 {card}",
|
||||
"{user} has commented on card {card}" : "{user} 評論了卡片 {card}",
|
||||
"You have commented on card {card}" : "您意見了卡片 {card}",
|
||||
"{user} has commented on card {card}" : "{user} 意見了卡片 {card}",
|
||||
"A <strong>card description</strong> inside the Deck app has been changed" : "Deck 應用程式中的 <strong>卡片描述</strong> 已改變",
|
||||
"Deck" : "Deck",
|
||||
"Changes in the <strong>Deck app</strong>" : "<strong>Deck 應用程式</strong>中的改變",
|
||||
"A <strong>comment</strong> was created on a card" : "卡片上創建了一個 <strong>評論</strong>",
|
||||
"Upcoming cards" : "即將到期的卡片",
|
||||
"A <strong>comment</strong> was created on a card" : "卡片上創建了一個 <strong>意見</strong>",
|
||||
"Upcoming cards" : "快將到期的卡片",
|
||||
"Personal" : "個人",
|
||||
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "%s 已將 “%s” 中的卡片 “%s” 指派給您。",
|
||||
"{user} has assigned the card \"%s\" on \"%s\" to you." : "{user} 已將 “%s” 中的卡片 “%s” 指派給您。",
|
||||
"The card \"%s\" on \"%s\" has reached its due date." : "\"%s\"中的卡片 \"%s\" 已到期。",
|
||||
"%s has mentioned you in a comment on \"%s\"." : "%s 在 “%s” 的評論中提到了您。",
|
||||
"{user} has mentioned you in a comment on \"%s\"." : "{user} 在 “%s” 的評論中提到了您。",
|
||||
"%s has mentioned you in a comment on \"%s\"." : "%s 在 “%s” 的意見中提到了您。",
|
||||
"{user} has mentioned you in a comment on \"%s\"." : "{user} 在 “%s” 的意見中提到了您。",
|
||||
"The board \"%s\" has been shared with you by %s." : "面板 \"%s\" 已由 %s 分享給您。",
|
||||
"{user} has shared the board %s with you." : "{user} 分享面板 %s 給您。",
|
||||
"No data was provided to create an attachment." : "未能提供數據以創建附件",
|
||||
"Finished" : "完成",
|
||||
"To review" : "回顧",
|
||||
"Action needed" : "需要操作",
|
||||
"Later" : "稍後",
|
||||
"To review" : "待審閱",
|
||||
"Action needed" : "需要採取行動",
|
||||
"Later" : "稍後處理",
|
||||
"copy" : "複製",
|
||||
"To do" : "待辦",
|
||||
"Doing" : "進行中",
|
||||
"Doing" : "執行中",
|
||||
"Done" : "完成",
|
||||
"Example Task 3" : "示例任務 3",
|
||||
"Example Task 2" : "示例任務 2",
|
||||
@@ -95,16 +95,16 @@ OC.L10N.register(
|
||||
"No file was uploaded" : "沒有檔案被上傳",
|
||||
"Missing a temporary folder" : "找不到暫存資料夾",
|
||||
"Could not write file to disk" : "寫入硬碟失敗",
|
||||
"A PHP extension stopped the file upload" : "一個 PHP 擴充功能終止檔案的上傳",
|
||||
"A PHP extension stopped the file upload" : "某個 PHP 擴充功能終止檔案的上傳",
|
||||
"No file uploaded or file size exceeds maximum of %s" : "沒有上傳檔案或檔案大小超過 %s 的最大值",
|
||||
"Card not found" : "未找到卡片",
|
||||
"Path is already shared with this card" : "已和這張卡片分享了路徑",
|
||||
"Invalid date, date format must be YYYY-MM-DD" : "無效的日期,需為 YYYY-MM-DD 格式",
|
||||
"Personal planning and team project organization" : "個人規劃和團隊項目組織",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck是一種看板式組織工具,旨在針對與Nextcloud集成的團隊進行個人計劃和項目組織。\n\n\n- 📥 增加您的任務到card和把它們整理好\n- 📄 寫下額外的筆記在markdown\n- 🔖 分配標籤以更好地組織您的工作\n- 👥 與您的團隊,朋友或家人分享\n- 📎 附加檔案並將其嵌入到您的 markdown 描述\n- 💬 使用評論與您的團隊討論\n- ⚡ 在活動流中跟踪更改\n- 🚀 讓您的項目井井有條",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck是一種看板式組織工具,旨在針對與Nextcloud集成的團隊進行個人計劃和項目組織。\n\n\n- 📥 增加您的任務到card和把它們整理好\n- 📄 寫下額外的筆記在markdown\n- 🔖 分配標籤以更好地組織您的工作\n- 👥 與您的團隊,朋友或家人分享\n- 📎 附加檔案並將其嵌入到您的 markdown 描述\n- 💬 使用意見與您的團隊討論\n- ⚡ 在活動流中跟踪更改\n- 🚀 讓您的項目井井有條",
|
||||
"Card details" : "卡片詳情",
|
||||
"Add board" : "添加面板",
|
||||
"Select the board to link to a project" : "選擇要鏈接到一個項目的面板",
|
||||
"Select the board to link to a project" : "選擇要連結到一個項目的面板",
|
||||
"Search by board title" : "通過標題搜索面板",
|
||||
"Select board" : "選擇面板",
|
||||
"Create a new card" : "建立新卡片",
|
||||
@@ -117,24 +117,24 @@ OC.L10N.register(
|
||||
"Open card" : "打開卡片",
|
||||
"Close" : "關閉",
|
||||
"Create card" : "建立卡片",
|
||||
"Select a card" : "選擇一張卡片",
|
||||
"Select the card to link to a project" : "選擇要鏈接到一個項目的卡片",
|
||||
"Link to card" : "鏈接到卡片",
|
||||
"File already exists" : "文件已存在",
|
||||
"A file with the name {filename} already exists." : "使用文件名 {filename} 的文件已存在。",
|
||||
"Select a card" : "選擇卡片",
|
||||
"Select the card to link to a project" : "選擇要連結到一個項目的卡片",
|
||||
"Link to card" : "連結到卡片",
|
||||
"File already exists" : "檔案已存在",
|
||||
"A file with the name {filename} already exists." : "名稱為 {filename} 的檔案已存在。",
|
||||
"Do you want to overwrite it?" : "您確定要覆蓋嗎?",
|
||||
"Overwrite file" : "覆蓋文件",
|
||||
"Keep existing file" : "保持已存在的文件",
|
||||
"This board is read only" : "此面板是只讀的",
|
||||
"Drop your files to upload" : "拖放您的文件以上傳",
|
||||
"Overwrite file" : "覆蓋檔案",
|
||||
"Keep existing file" : "保持已存在的檔案",
|
||||
"This board is read only" : "此面板是唯讀的",
|
||||
"Drop your files to upload" : "拖放您的檔案以上傳",
|
||||
"Archived cards" : "已存檔卡片",
|
||||
"Add list" : "添加列表",
|
||||
"List name" : "列表名稱",
|
||||
"Add list" : "添加清單",
|
||||
"List name" : "清單名稱",
|
||||
"Apply filter" : "應用過濾器",
|
||||
"Filter by tag" : "標籤篩選",
|
||||
"Filter by assigned user" : "根據指定用戶過濾",
|
||||
"Unassigned" : "未分配",
|
||||
"Filter by due date" : "根據到期日過濾",
|
||||
"Filter by tag" : "以標籤過濾",
|
||||
"Filter by assigned user" : "以指派用戶過濾",
|
||||
"Unassigned" : "未指派",
|
||||
"Filter by due date" : "以到期日過濾",
|
||||
"Overdue" : "逾期",
|
||||
"Next 24 hours" : "未來24小時",
|
||||
"Next 7 days" : "未來7曰",
|
||||
@@ -146,41 +146,41 @@ OC.L10N.register(
|
||||
"Toggle compact mode" : "切換簡潔模式",
|
||||
"Details" : "詳情",
|
||||
"Loading board" : "正在加載面板",
|
||||
"No lists available" : "無列表可用",
|
||||
"Create a new list to add cards to this board" : "創建一個新列表來添加卡片到這個看板",
|
||||
"No lists available" : "無清單可用",
|
||||
"Create a new list to add cards to this board" : "創建一張新清單來添加卡片到這個看板",
|
||||
"Board not found" : "未找到面板",
|
||||
"Sharing" : "正在分享",
|
||||
"Tags" : "標籤",
|
||||
"Deleted items" : "已刪除項",
|
||||
"Deleted items" : "已刪除項目",
|
||||
"Timeline" : "時間線",
|
||||
"Deleted lists" : "已刪除的列表",
|
||||
"Deleted lists" : "已刪除的清單",
|
||||
"Undo" : "撤消",
|
||||
"Deleted cards" : "已刪除卡片",
|
||||
"Share board with a user, group or circle …" : "與一個用戶,群組或圈子分享面板...",
|
||||
"Searching for users, groups and circles …" : "正在搜索用戶、群組和圈子 ......",
|
||||
"Share board with a user, group or circle …" : "與一個用戶、群組或圈子分享面板...",
|
||||
"Searching for users, groups and circles …" : "正在搜尋用戶、群組和圈子 ......",
|
||||
"No participants found" : "未找到參與者",
|
||||
"Board owner" : "面板擁有者",
|
||||
"Board owner" : "面板板主",
|
||||
"(Group)" : "(群組)",
|
||||
"(Circle)" : "(圈子)",
|
||||
"Can edit" : "可以編輯",
|
||||
"Can share" : "可以分享",
|
||||
"Can manage" : "可以管理",
|
||||
"Delete" : "刪除",
|
||||
"Failed to create share with {displayName}" : "用 {displayName} 創建分享失敗",
|
||||
"Add a new list" : "添加一個新列表",
|
||||
"Failed to create share with {displayName}" : "無法為 {displayName} 創建分享",
|
||||
"Add a new list" : "添加一張新清單",
|
||||
"Archive all cards" : "封存所有卡片",
|
||||
"Delete list" : "刪除列表",
|
||||
"Delete list" : "刪除清單",
|
||||
"Add card" : "添加卡片",
|
||||
"Archive all cards in this list" : "存檔該列表的所有卡片",
|
||||
"Archive all cards in this list" : "封存此清單內的所有卡片",
|
||||
"Add a new card" : "添加一張新卡片",
|
||||
"Card name" : "卡片名",
|
||||
"List deleted" : "列表被刪除",
|
||||
"Card name" : "卡片名稱",
|
||||
"List deleted" : "清單已被刪除",
|
||||
"Edit" : "編輯",
|
||||
"Add a new tag" : "新增一個標籤",
|
||||
"Add a new tag" : "添加新標籤",
|
||||
"title and color value must be provided" : "必須提供標題和顏色值",
|
||||
"Board name" : "看板名",
|
||||
"Members" : "會員",
|
||||
"Upload new files" : "上傳新文件",
|
||||
"Board name" : "面板名",
|
||||
"Members" : "成員",
|
||||
"Upload new files" : "上傳新檔案",
|
||||
"Share from Files" : "從檔案進行分享",
|
||||
"Add this attachment" : "添加此附件",
|
||||
"Show in Files" : "顯示在檔案中",
|
||||
@@ -192,40 +192,40 @@ OC.L10N.register(
|
||||
"Open in sidebar view" : "在側邊欄視圖中打開",
|
||||
"Open in bigger view" : "在較大視圖中打開",
|
||||
"Attachments" : "附件",
|
||||
"Comments" : "評論",
|
||||
"Modified" : "已修改",
|
||||
"Created" : "已創建",
|
||||
"The title cannot be empty." : "標題不能為空",
|
||||
"No comments yet. Begin the discussion!" : "還沒有評論。 開始討論吧!",
|
||||
"Comments" : "意見",
|
||||
"Modified" : "修改於",
|
||||
"Created" : "建立於",
|
||||
"The title cannot be empty." : "標題不能為空。",
|
||||
"No comments yet. Begin the discussion!" : "尚無意見,開始討論吧!",
|
||||
"Assign a tag to this card…" : "為該卡片分配標籤…",
|
||||
"Assign to users" : "指派給用戶",
|
||||
"Assign to users/groups/circles" : "分配給用戶/群組/圈子",
|
||||
"Assign a user to this card…" : "為該卡片指派用戶…",
|
||||
"Due date" : "截至日期",
|
||||
"Set a due date" : "設置一個到期日",
|
||||
"Remove due date" : "移除截至日期",
|
||||
"Assign to users/groups/circles" : "指派給用戶/群組/圈子",
|
||||
"Assign a user to this card…" : "將此卡片指派給用戶...",
|
||||
"Due date" : "到期日",
|
||||
"Set a due date" : "設置到期日",
|
||||
"Remove due date" : "移除到期日",
|
||||
"Select Date" : "選擇日期",
|
||||
"Save" : "保存",
|
||||
"The comment cannot be empty." : "註釋不能為空。",
|
||||
"The comment cannot be longer than 1000 characters." : "註釋不能超過 1000 個字符。",
|
||||
"In reply to" : "回复",
|
||||
"Reply" : "回复",
|
||||
"The comment cannot be empty." : "意見不能為空。",
|
||||
"The comment cannot be longer than 1000 characters." : "意見不能超過 1000 個字符。",
|
||||
"In reply to" : "回覆",
|
||||
"Reply" : "回覆",
|
||||
"Update" : "更新",
|
||||
"Description" : "描述",
|
||||
"(Unsaved)" : "(未保存的)",
|
||||
"(Saving…)" : "(正在保存...)",
|
||||
"(Saving…)" : "(保存中...)",
|
||||
"Formatting help" : "格式化幫助",
|
||||
"Edit description" : "編輯描述",
|
||||
"View description" : "查看描述",
|
||||
"Add Attachment" : "添加附件",
|
||||
"Write a description …" : "寫一段描述",
|
||||
"Choose attachment" : "選擇附件",
|
||||
"(group)" : "(組)",
|
||||
"(group)" : "(群組)",
|
||||
"(circle)" : "(圈子)",
|
||||
"Assign to me" : "指派給我",
|
||||
"Unassign myself" : "自己解除分配",
|
||||
"Unassign myself" : "自己解除指派",
|
||||
"Move card" : "移動卡片",
|
||||
"Unarchive card" : "恢復卡片存檔",
|
||||
"Unarchive card" : "取消對卡片的封存",
|
||||
"Archive card" : "封存卡片",
|
||||
"Delete card" : "刪除卡片",
|
||||
"Move card to another board" : "將卡片移到其他面板",
|
||||
@@ -250,15 +250,15 @@ OC.L10N.register(
|
||||
"Assigned cards" : "分配的卡片",
|
||||
"No notifications" : "無通知",
|
||||
"Delete board" : "刪除面板",
|
||||
"Board {0} deleted" : "面板 {0} 被刪除",
|
||||
"Only assigned cards" : "僅分配的卡片",
|
||||
"Board {0} deleted" : "面板 {0} 已被刪除",
|
||||
"Only assigned cards" : "僅指派了的卡片",
|
||||
"No reminder" : "無提醒",
|
||||
"An error occurred" : "發生錯誤",
|
||||
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "你確定你要刪除 {title} 面板嗎?面板內所有數據都將因此被刪除。",
|
||||
"Delete the board?" : "是否刪除面板?",
|
||||
"Loading filtered view" : "正在加載已過濾視圖",
|
||||
"Today" : "今天",
|
||||
"Tomorrow" : "明天",
|
||||
"Today" : "今日",
|
||||
"Tomorrow" : "明日",
|
||||
"This week" : "本星期",
|
||||
"No due" : "沒有到期的",
|
||||
"No upcoming cards" : "沒有快將到期的卡片",
|
||||
|
||||
134
l10n/zh_HK.json
134
l10n/zh_HK.json
@@ -59,29 +59,29 @@
|
||||
"{user} has deleted the attachment {attachment} from card {card}" : "{user} 已從卡 {card} 中刪除附件 {attachment}",
|
||||
"You have restored the attachment {attachment} to card {card}" : "您恢復了卡片 {card} 中的附件 {attachment}",
|
||||
"{user} has restored the attachment {attachment} to card {card}" : "{user} 恢復了卡片 {card} 中的附件 {attachment}",
|
||||
"You have commented on card {card}" : "您評論了卡片 {card}",
|
||||
"{user} has commented on card {card}" : "{user} 評論了卡片 {card}",
|
||||
"You have commented on card {card}" : "您意見了卡片 {card}",
|
||||
"{user} has commented on card {card}" : "{user} 意見了卡片 {card}",
|
||||
"A <strong>card description</strong> inside the Deck app has been changed" : "Deck 應用程式中的 <strong>卡片描述</strong> 已改變",
|
||||
"Deck" : "Deck",
|
||||
"Changes in the <strong>Deck app</strong>" : "<strong>Deck 應用程式</strong>中的改變",
|
||||
"A <strong>comment</strong> was created on a card" : "卡片上創建了一個 <strong>評論</strong>",
|
||||
"Upcoming cards" : "即將到期的卡片",
|
||||
"A <strong>comment</strong> was created on a card" : "卡片上創建了一個 <strong>意見</strong>",
|
||||
"Upcoming cards" : "快將到期的卡片",
|
||||
"Personal" : "個人",
|
||||
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "%s 已將 “%s” 中的卡片 “%s” 指派給您。",
|
||||
"{user} has assigned the card \"%s\" on \"%s\" to you." : "{user} 已將 “%s” 中的卡片 “%s” 指派給您。",
|
||||
"The card \"%s\" on \"%s\" has reached its due date." : "\"%s\"中的卡片 \"%s\" 已到期。",
|
||||
"%s has mentioned you in a comment on \"%s\"." : "%s 在 “%s” 的評論中提到了您。",
|
||||
"{user} has mentioned you in a comment on \"%s\"." : "{user} 在 “%s” 的評論中提到了您。",
|
||||
"%s has mentioned you in a comment on \"%s\"." : "%s 在 “%s” 的意見中提到了您。",
|
||||
"{user} has mentioned you in a comment on \"%s\"." : "{user} 在 “%s” 的意見中提到了您。",
|
||||
"The board \"%s\" has been shared with you by %s." : "面板 \"%s\" 已由 %s 分享給您。",
|
||||
"{user} has shared the board %s with you." : "{user} 分享面板 %s 給您。",
|
||||
"No data was provided to create an attachment." : "未能提供數據以創建附件",
|
||||
"Finished" : "完成",
|
||||
"To review" : "回顧",
|
||||
"Action needed" : "需要操作",
|
||||
"Later" : "稍後",
|
||||
"To review" : "待審閱",
|
||||
"Action needed" : "需要採取行動",
|
||||
"Later" : "稍後處理",
|
||||
"copy" : "複製",
|
||||
"To do" : "待辦",
|
||||
"Doing" : "進行中",
|
||||
"Doing" : "執行中",
|
||||
"Done" : "完成",
|
||||
"Example Task 3" : "示例任務 3",
|
||||
"Example Task 2" : "示例任務 2",
|
||||
@@ -93,16 +93,16 @@
|
||||
"No file was uploaded" : "沒有檔案被上傳",
|
||||
"Missing a temporary folder" : "找不到暫存資料夾",
|
||||
"Could not write file to disk" : "寫入硬碟失敗",
|
||||
"A PHP extension stopped the file upload" : "一個 PHP 擴充功能終止檔案的上傳",
|
||||
"A PHP extension stopped the file upload" : "某個 PHP 擴充功能終止檔案的上傳",
|
||||
"No file uploaded or file size exceeds maximum of %s" : "沒有上傳檔案或檔案大小超過 %s 的最大值",
|
||||
"Card not found" : "未找到卡片",
|
||||
"Path is already shared with this card" : "已和這張卡片分享了路徑",
|
||||
"Invalid date, date format must be YYYY-MM-DD" : "無效的日期,需為 YYYY-MM-DD 格式",
|
||||
"Personal planning and team project organization" : "個人規劃和團隊項目組織",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck是一種看板式組織工具,旨在針對與Nextcloud集成的團隊進行個人計劃和項目組織。\n\n\n- 📥 增加您的任務到card和把它們整理好\n- 📄 寫下額外的筆記在markdown\n- 🔖 分配標籤以更好地組織您的工作\n- 👥 與您的團隊,朋友或家人分享\n- 📎 附加檔案並將其嵌入到您的 markdown 描述\n- 💬 使用評論與您的團隊討論\n- ⚡ 在活動流中跟踪更改\n- 🚀 讓您的項目井井有條",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck是一種看板式組織工具,旨在針對與Nextcloud集成的團隊進行個人計劃和項目組織。\n\n\n- 📥 增加您的任務到card和把它們整理好\n- 📄 寫下額外的筆記在markdown\n- 🔖 分配標籤以更好地組織您的工作\n- 👥 與您的團隊,朋友或家人分享\n- 📎 附加檔案並將其嵌入到您的 markdown 描述\n- 💬 使用意見與您的團隊討論\n- ⚡ 在活動流中跟踪更改\n- 🚀 讓您的項目井井有條",
|
||||
"Card details" : "卡片詳情",
|
||||
"Add board" : "添加面板",
|
||||
"Select the board to link to a project" : "選擇要鏈接到一個項目的面板",
|
||||
"Select the board to link to a project" : "選擇要連結到一個項目的面板",
|
||||
"Search by board title" : "通過標題搜索面板",
|
||||
"Select board" : "選擇面板",
|
||||
"Create a new card" : "建立新卡片",
|
||||
@@ -115,24 +115,24 @@
|
||||
"Open card" : "打開卡片",
|
||||
"Close" : "關閉",
|
||||
"Create card" : "建立卡片",
|
||||
"Select a card" : "選擇一張卡片",
|
||||
"Select the card to link to a project" : "選擇要鏈接到一個項目的卡片",
|
||||
"Link to card" : "鏈接到卡片",
|
||||
"File already exists" : "文件已存在",
|
||||
"A file with the name {filename} already exists." : "使用文件名 {filename} 的文件已存在。",
|
||||
"Select a card" : "選擇卡片",
|
||||
"Select the card to link to a project" : "選擇要連結到一個項目的卡片",
|
||||
"Link to card" : "連結到卡片",
|
||||
"File already exists" : "檔案已存在",
|
||||
"A file with the name {filename} already exists." : "名稱為 {filename} 的檔案已存在。",
|
||||
"Do you want to overwrite it?" : "您確定要覆蓋嗎?",
|
||||
"Overwrite file" : "覆蓋文件",
|
||||
"Keep existing file" : "保持已存在的文件",
|
||||
"This board is read only" : "此面板是只讀的",
|
||||
"Drop your files to upload" : "拖放您的文件以上傳",
|
||||
"Overwrite file" : "覆蓋檔案",
|
||||
"Keep existing file" : "保持已存在的檔案",
|
||||
"This board is read only" : "此面板是唯讀的",
|
||||
"Drop your files to upload" : "拖放您的檔案以上傳",
|
||||
"Archived cards" : "已存檔卡片",
|
||||
"Add list" : "添加列表",
|
||||
"List name" : "列表名稱",
|
||||
"Add list" : "添加清單",
|
||||
"List name" : "清單名稱",
|
||||
"Apply filter" : "應用過濾器",
|
||||
"Filter by tag" : "標籤篩選",
|
||||
"Filter by assigned user" : "根據指定用戶過濾",
|
||||
"Unassigned" : "未分配",
|
||||
"Filter by due date" : "根據到期日過濾",
|
||||
"Filter by tag" : "以標籤過濾",
|
||||
"Filter by assigned user" : "以指派用戶過濾",
|
||||
"Unassigned" : "未指派",
|
||||
"Filter by due date" : "以到期日過濾",
|
||||
"Overdue" : "逾期",
|
||||
"Next 24 hours" : "未來24小時",
|
||||
"Next 7 days" : "未來7曰",
|
||||
@@ -144,41 +144,41 @@
|
||||
"Toggle compact mode" : "切換簡潔模式",
|
||||
"Details" : "詳情",
|
||||
"Loading board" : "正在加載面板",
|
||||
"No lists available" : "無列表可用",
|
||||
"Create a new list to add cards to this board" : "創建一個新列表來添加卡片到這個看板",
|
||||
"No lists available" : "無清單可用",
|
||||
"Create a new list to add cards to this board" : "創建一張新清單來添加卡片到這個看板",
|
||||
"Board not found" : "未找到面板",
|
||||
"Sharing" : "正在分享",
|
||||
"Tags" : "標籤",
|
||||
"Deleted items" : "已刪除項",
|
||||
"Deleted items" : "已刪除項目",
|
||||
"Timeline" : "時間線",
|
||||
"Deleted lists" : "已刪除的列表",
|
||||
"Deleted lists" : "已刪除的清單",
|
||||
"Undo" : "撤消",
|
||||
"Deleted cards" : "已刪除卡片",
|
||||
"Share board with a user, group or circle …" : "與一個用戶,群組或圈子分享面板...",
|
||||
"Searching for users, groups and circles …" : "正在搜索用戶、群組和圈子 ......",
|
||||
"Share board with a user, group or circle …" : "與一個用戶、群組或圈子分享面板...",
|
||||
"Searching for users, groups and circles …" : "正在搜尋用戶、群組和圈子 ......",
|
||||
"No participants found" : "未找到參與者",
|
||||
"Board owner" : "面板擁有者",
|
||||
"Board owner" : "面板板主",
|
||||
"(Group)" : "(群組)",
|
||||
"(Circle)" : "(圈子)",
|
||||
"Can edit" : "可以編輯",
|
||||
"Can share" : "可以分享",
|
||||
"Can manage" : "可以管理",
|
||||
"Delete" : "刪除",
|
||||
"Failed to create share with {displayName}" : "用 {displayName} 創建分享失敗",
|
||||
"Add a new list" : "添加一個新列表",
|
||||
"Failed to create share with {displayName}" : "無法為 {displayName} 創建分享",
|
||||
"Add a new list" : "添加一張新清單",
|
||||
"Archive all cards" : "封存所有卡片",
|
||||
"Delete list" : "刪除列表",
|
||||
"Delete list" : "刪除清單",
|
||||
"Add card" : "添加卡片",
|
||||
"Archive all cards in this list" : "存檔該列表的所有卡片",
|
||||
"Archive all cards in this list" : "封存此清單內的所有卡片",
|
||||
"Add a new card" : "添加一張新卡片",
|
||||
"Card name" : "卡片名",
|
||||
"List deleted" : "列表被刪除",
|
||||
"Card name" : "卡片名稱",
|
||||
"List deleted" : "清單已被刪除",
|
||||
"Edit" : "編輯",
|
||||
"Add a new tag" : "新增一個標籤",
|
||||
"Add a new tag" : "添加新標籤",
|
||||
"title and color value must be provided" : "必須提供標題和顏色值",
|
||||
"Board name" : "看板名",
|
||||
"Members" : "會員",
|
||||
"Upload new files" : "上傳新文件",
|
||||
"Board name" : "面板名",
|
||||
"Members" : "成員",
|
||||
"Upload new files" : "上傳新檔案",
|
||||
"Share from Files" : "從檔案進行分享",
|
||||
"Add this attachment" : "添加此附件",
|
||||
"Show in Files" : "顯示在檔案中",
|
||||
@@ -190,40 +190,40 @@
|
||||
"Open in sidebar view" : "在側邊欄視圖中打開",
|
||||
"Open in bigger view" : "在較大視圖中打開",
|
||||
"Attachments" : "附件",
|
||||
"Comments" : "評論",
|
||||
"Modified" : "已修改",
|
||||
"Created" : "已創建",
|
||||
"The title cannot be empty." : "標題不能為空",
|
||||
"No comments yet. Begin the discussion!" : "還沒有評論。 開始討論吧!",
|
||||
"Comments" : "意見",
|
||||
"Modified" : "修改於",
|
||||
"Created" : "建立於",
|
||||
"The title cannot be empty." : "標題不能為空。",
|
||||
"No comments yet. Begin the discussion!" : "尚無意見,開始討論吧!",
|
||||
"Assign a tag to this card…" : "為該卡片分配標籤…",
|
||||
"Assign to users" : "指派給用戶",
|
||||
"Assign to users/groups/circles" : "分配給用戶/群組/圈子",
|
||||
"Assign a user to this card…" : "為該卡片指派用戶…",
|
||||
"Due date" : "截至日期",
|
||||
"Set a due date" : "設置一個到期日",
|
||||
"Remove due date" : "移除截至日期",
|
||||
"Assign to users/groups/circles" : "指派給用戶/群組/圈子",
|
||||
"Assign a user to this card…" : "將此卡片指派給用戶...",
|
||||
"Due date" : "到期日",
|
||||
"Set a due date" : "設置到期日",
|
||||
"Remove due date" : "移除到期日",
|
||||
"Select Date" : "選擇日期",
|
||||
"Save" : "保存",
|
||||
"The comment cannot be empty." : "註釋不能為空。",
|
||||
"The comment cannot be longer than 1000 characters." : "註釋不能超過 1000 個字符。",
|
||||
"In reply to" : "回复",
|
||||
"Reply" : "回复",
|
||||
"The comment cannot be empty." : "意見不能為空。",
|
||||
"The comment cannot be longer than 1000 characters." : "意見不能超過 1000 個字符。",
|
||||
"In reply to" : "回覆",
|
||||
"Reply" : "回覆",
|
||||
"Update" : "更新",
|
||||
"Description" : "描述",
|
||||
"(Unsaved)" : "(未保存的)",
|
||||
"(Saving…)" : "(正在保存...)",
|
||||
"(Saving…)" : "(保存中...)",
|
||||
"Formatting help" : "格式化幫助",
|
||||
"Edit description" : "編輯描述",
|
||||
"View description" : "查看描述",
|
||||
"Add Attachment" : "添加附件",
|
||||
"Write a description …" : "寫一段描述",
|
||||
"Choose attachment" : "選擇附件",
|
||||
"(group)" : "(組)",
|
||||
"(group)" : "(群組)",
|
||||
"(circle)" : "(圈子)",
|
||||
"Assign to me" : "指派給我",
|
||||
"Unassign myself" : "自己解除分配",
|
||||
"Unassign myself" : "自己解除指派",
|
||||
"Move card" : "移動卡片",
|
||||
"Unarchive card" : "恢復卡片存檔",
|
||||
"Unarchive card" : "取消對卡片的封存",
|
||||
"Archive card" : "封存卡片",
|
||||
"Delete card" : "刪除卡片",
|
||||
"Move card to another board" : "將卡片移到其他面板",
|
||||
@@ -248,15 +248,15 @@
|
||||
"Assigned cards" : "分配的卡片",
|
||||
"No notifications" : "無通知",
|
||||
"Delete board" : "刪除面板",
|
||||
"Board {0} deleted" : "面板 {0} 被刪除",
|
||||
"Only assigned cards" : "僅分配的卡片",
|
||||
"Board {0} deleted" : "面板 {0} 已被刪除",
|
||||
"Only assigned cards" : "僅指派了的卡片",
|
||||
"No reminder" : "無提醒",
|
||||
"An error occurred" : "發生錯誤",
|
||||
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "你確定你要刪除 {title} 面板嗎?面板內所有數據都將因此被刪除。",
|
||||
"Delete the board?" : "是否刪除面板?",
|
||||
"Loading filtered view" : "正在加載已過濾視圖",
|
||||
"Today" : "今天",
|
||||
"Tomorrow" : "明天",
|
||||
"Today" : "今日",
|
||||
"Tomorrow" : "明日",
|
||||
"This week" : "本星期",
|
||||
"No due" : "沒有到期的",
|
||||
"No upcoming cards" : "沒有快將到期的卡片",
|
||||
|
||||
@@ -73,10 +73,11 @@ class BoardController extends ApiController {
|
||||
* @param $title
|
||||
* @param $color
|
||||
* @param $archived
|
||||
* @param $upcoming_show_only_assigned_cards
|
||||
* @return \OCP\AppFramework\Db\Entity
|
||||
*/
|
||||
public function update($id, $title, $color, $archived) {
|
||||
return $this->boardService->update($id, $title, $color, $archived);
|
||||
public function update($id, $title, $color, $archived, $upcoming_show_only_assigned_cards) {
|
||||
return $this->boardService->update($id, $title, $color, $archived, $upcoming_show_only_assigned_cards);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -36,6 +36,7 @@ class Board extends RelationalEntity {
|
||||
protected $stacks = [];
|
||||
protected $deletedAt = 0;
|
||||
protected $lastModified = 0;
|
||||
protected $upcoming_show_only_assigned_cards = true;
|
||||
|
||||
protected $settings = [];
|
||||
|
||||
@@ -45,6 +46,7 @@ class Board extends RelationalEntity {
|
||||
$this->addType('archived', 'boolean');
|
||||
$this->addType('deletedAt', 'integer');
|
||||
$this->addType('lastModified', 'integer');
|
||||
$this->addType('upcoming_show_only_assigned_cards', 'boolean');
|
||||
$this->addRelation('labels');
|
||||
$this->addRelation('acl');
|
||||
$this->addRelation('shared');
|
||||
|
||||
@@ -66,7 +66,7 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
||||
* @throws DoesNotExistException
|
||||
*/
|
||||
public function find($id, $withLabels = false, $withAcl = false) {
|
||||
$sql = 'SELECT id, title, owner, color, archived, deleted_at, last_modified FROM `*PREFIX*deck_boards` ' .
|
||||
$sql = 'SELECT id, title, owner, color, archived, deleted_at, last_modified, upcoming_show_only_assigned_cards FROM `*PREFIX*deck_boards` ' .
|
||||
'WHERE `id` = ?';
|
||||
$board = $this->findEntity($sql, [$id]);
|
||||
|
||||
@@ -105,12 +105,12 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
||||
*/
|
||||
public function findAllByUser($userId, $limit = null, $offset = null, $since = -1, $includeArchived = true) {
|
||||
// FIXME: One moving to QBMapper we should allow filtering the boards probably by method chaining for additional where clauses
|
||||
$sql = 'SELECT id, title, owner, color, archived, deleted_at, 0 as shared, last_modified FROM `*PREFIX*deck_boards` WHERE owner = ? AND last_modified > ?';
|
||||
$sql = 'SELECT id, title, owner, color, archived, deleted_at, 0 as shared, last_modified, upcoming_show_only_assigned_cards FROM `*PREFIX*deck_boards` WHERE owner = ? AND last_modified > ?';
|
||||
if (!$includeArchived) {
|
||||
$sql .= ' AND NOT archived AND deleted_at = 0';
|
||||
}
|
||||
$sql .= ' UNION ' .
|
||||
'SELECT boards.id, title, owner, color, archived, deleted_at, 1 as shared, last_modified FROM `*PREFIX*deck_boards` as boards ' .
|
||||
'SELECT boards.id, title, owner, color, archived, deleted_at, 1 as shared, last_modified, upcoming_show_only_assigned_cards FROM `*PREFIX*deck_boards` as boards ' .
|
||||
'JOIN `*PREFIX*deck_board_acl` as acl ON boards.id=acl.board_id WHERE acl.participant=? AND acl.type=? AND boards.owner != ? AND last_modified > ?';
|
||||
if (!$includeArchived) {
|
||||
$sql .= ' AND NOT archived AND deleted_at = 0';
|
||||
@@ -142,7 +142,7 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
||||
if (count($groups) <= 0) {
|
||||
return [];
|
||||
}
|
||||
$sql = 'SELECT boards.id, title, owner, color, archived, deleted_at, 2 as shared, last_modified FROM `*PREFIX*deck_boards` as boards ' .
|
||||
$sql = 'SELECT boards.id, title, owner, color, archived, deleted_at, 2 as shared, last_modified, upcoming_show_only_assigned_cards FROM `*PREFIX*deck_boards` as boards ' .
|
||||
'INNER JOIN `*PREFIX*deck_board_acl` as acl ON boards.id=acl.board_id WHERE owner != ? AND type=? AND (';
|
||||
for ($i = 0, $iMax = count($groups); $i < $iMax; $i++) {
|
||||
$sql .= 'acl.participant = ? ';
|
||||
@@ -169,12 +169,12 @@ class BoardMapper extends DeckMapper implements IPermissionMapper {
|
||||
}
|
||||
$circles = array_map(function ($circle) {
|
||||
return $circle->getUniqueId();
|
||||
}, \OCA\Circles\Api\v1\Circles::joinedCircles('', true));
|
||||
}, \OCA\Circles\Api\v1\Circles::joinedCircles($userId, true));
|
||||
if (count($circles) === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$sql = 'SELECT boards.id, title, owner, color, archived, deleted_at, 2 as shared, last_modified FROM `*PREFIX*deck_boards` as boards ' .
|
||||
$sql = 'SELECT boards.id, title, owner, color, archived, deleted_at, 2 as shared, last_modified, upcoming_show_only_assigned_cards FROM `*PREFIX*deck_boards` as boards ' .
|
||||
'INNER JOIN `*PREFIX*deck_board_acl` as acl ON boards.id=acl.board_id WHERE owner != ? AND type=? AND (';
|
||||
for ($i = 0, $iMax = count($circles); $i < $iMax; $i++) {
|
||||
$sql .= 'acl.participant = ? ';
|
||||
|
||||
26
lib/Migration/Version010404Date20210305.php
Normal file
26
lib/Migration/Version010404Date20210305.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace OCA\Deck\Migration;
|
||||
|
||||
use Closure;
|
||||
use OCP\DB\ISchemaWrapper;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\SimpleMigrationStep;
|
||||
|
||||
class Version010404Date20210305 extends SimpleMigrationStep {
|
||||
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options): ?ISchemaWrapper {
|
||||
/** @var ISchemaWrapper $schema */
|
||||
$schema = $schemaClosure();
|
||||
|
||||
$table = $schema->getTable('deck_boards');
|
||||
if (!$table->hasColumn('upcoming_show_only_assigned_cards')) {
|
||||
$table->addColumn('upcoming_show_only_assigned_cards', 'boolean', [
|
||||
'notnull' => false,
|
||||
'default' => true
|
||||
]);
|
||||
}
|
||||
return $schema;
|
||||
}
|
||||
}
|
||||
@@ -422,13 +422,14 @@ class BoardService {
|
||||
* @param $title
|
||||
* @param $color
|
||||
* @param $archived
|
||||
* @param $upcoming_show_only_assigned_cards
|
||||
* @return \OCP\AppFramework\Db\Entity
|
||||
* @throws DoesNotExistException
|
||||
* @throws \OCA\Deck\NoPermissionException
|
||||
* @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException
|
||||
* @throws BadRequestException
|
||||
*/
|
||||
public function update($id, $title, $color, $archived) {
|
||||
public function update($id, $title, $color, $archived, $upcoming_show_only_assigned_cards) {
|
||||
if (is_numeric($id) === false) {
|
||||
throw new BadRequestException('board id must be a number');
|
||||
}
|
||||
@@ -445,12 +446,17 @@ class BoardService {
|
||||
throw new BadRequestException('archived must be a boolean');
|
||||
}
|
||||
|
||||
if (is_bool($upcoming_show_only_assigned_cards) === false) {
|
||||
throw new BadRequestException('upcoming_show_only_assigned_cards must be a boolean');
|
||||
}
|
||||
|
||||
$this->permissionService->checkPermission($this->boardMapper, $id, Acl::PERMISSION_MANAGE);
|
||||
$board = $this->find($id);
|
||||
$changes = new ChangeSet($board);
|
||||
$board->setTitle($title);
|
||||
$board->setColor($color);
|
||||
$board->setArchived($archived);
|
||||
$board->setUpcoming_show_only_assigned_cards($upcoming_show_only_assigned_cards);
|
||||
$changes->setAfter($board);
|
||||
$this->boardMapper->update($board); // operate on clone so we can check for updated fields
|
||||
$this->boardMapper->mapOwner($board);
|
||||
|
||||
@@ -27,10 +27,9 @@ use OCA\Deck\Db\Attachment;
|
||||
use OCA\Deck\Db\AttachmentMapper;
|
||||
use OCA\Deck\StatusException;
|
||||
use OCA\Deck\Exceptions\ConflictException;
|
||||
use OCP\AppFramework\Http\ContentSecurityPolicy;
|
||||
use OCP\AppFramework\Http\FileDisplayResponse;
|
||||
use OCP\AppFramework\Http\StreamResponse;
|
||||
use OCP\Files\IAppData;
|
||||
use OCP\Files\IMimeTypeDetector;
|
||||
use OCP\Files\IRootFolder;
|
||||
use OCP\Files\NotFoundException;
|
||||
use OCP\Files\NotPermittedException;
|
||||
@@ -49,6 +48,7 @@ class FileService implements IAttachmentService {
|
||||
private $rootFolder;
|
||||
private $config;
|
||||
private $attachmentMapper;
|
||||
private $mimeTypeDetector;
|
||||
|
||||
public function __construct(
|
||||
IL10N $l10n,
|
||||
@@ -57,7 +57,8 @@ class FileService implements IAttachmentService {
|
||||
ILogger $logger,
|
||||
IRootFolder $rootFolder,
|
||||
IConfig $config,
|
||||
AttachmentMapper $attachmentMapper
|
||||
AttachmentMapper $attachmentMapper,
|
||||
IMimeTypeDetector $mimeTypeDetector
|
||||
) {
|
||||
$this->l10n = $l10n;
|
||||
$this->appData = $appData;
|
||||
@@ -66,6 +67,7 @@ class FileService implements IAttachmentService {
|
||||
$this->rootFolder = $rootFolder;
|
||||
$this->config = $config;
|
||||
$this->attachmentMapper = $attachmentMapper;
|
||||
$this->mimeTypeDetector = $mimeTypeDetector;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -225,27 +227,14 @@ class FileService implements IAttachmentService {
|
||||
|
||||
/**
|
||||
* @param Attachment $attachment
|
||||
* @return FileDisplayResponse|\OCP\AppFramework\Http\Response|StreamResponse
|
||||
* @return StreamResponse
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function display(Attachment $attachment) {
|
||||
$file = $this->getFileFromRootFolder($attachment);
|
||||
if (method_exists($file, 'fopen')) {
|
||||
$response = new StreamResponse($file->fopen('r'));
|
||||
$response->addHeader('Content-Disposition', 'inline; filename="' . rawurldecode($file->getName()) . '"');
|
||||
} else {
|
||||
$response = new FileDisplayResponse($file);
|
||||
}
|
||||
// We need those since otherwise chrome won't show the PDF file with CSP rule object-src 'none'
|
||||
// https://bugs.chromium.org/p/chromium/issues/detail?id=271452
|
||||
$policy = new ContentSecurityPolicy();
|
||||
$policy->addAllowedObjectDomain('\'self\'');
|
||||
$policy->addAllowedObjectDomain('blob:');
|
||||
$policy->addAllowedMediaDomain('\'self\'');
|
||||
$policy->addAllowedMediaDomain('blob:');
|
||||
$response->setContentSecurityPolicy($policy);
|
||||
|
||||
$response->addHeader('Content-Type', $file->getMimeType());
|
||||
$response = new StreamResponse($file->fopen('rb'));
|
||||
$response->addHeader('Content-Disposition', 'attachment; filename="' . rawurldecode($file->getName()) . '"');
|
||||
$response->addHeader('Content-Type', $this->mimeTypeDetector->getSecureMimeType($file->getMimeType()));
|
||||
return $response;
|
||||
}
|
||||
|
||||
|
||||
@@ -26,10 +26,9 @@ namespace OCA\Deck\Service;
|
||||
use OCA\Deck\Db\Attachment;
|
||||
use OCA\Deck\Sharing\DeckShareProvider;
|
||||
use OCA\Deck\StatusException;
|
||||
use OCP\AppFramework\Http\ContentSecurityPolicy;
|
||||
use OCP\AppFramework\Http\FileDisplayResponse;
|
||||
use OCP\AppFramework\Http\StreamResponse;
|
||||
use OCP\Constants;
|
||||
use OCP\Files\IMimeTypeDetector;
|
||||
use OCP\Files\IRootFolder;
|
||||
use OCP\Files\NotFoundException;
|
||||
use OCP\IDBConnection;
|
||||
@@ -50,6 +49,7 @@ class FilesAppService implements IAttachmentService, ICustomAttachmentService {
|
||||
private $l10n;
|
||||
private $preview;
|
||||
private $permissionService;
|
||||
private $mimeTypeDetector;
|
||||
|
||||
public function __construct(
|
||||
IRequest $request,
|
||||
@@ -60,6 +60,7 @@ class FilesAppService implements IAttachmentService, ICustomAttachmentService {
|
||||
DeckShareProvider $shareProvider,
|
||||
IPreview $preview,
|
||||
PermissionService $permissionService,
|
||||
IMimeTypeDetector $mimeTypeDetector,
|
||||
string $userId = null
|
||||
) {
|
||||
$this->request = $request;
|
||||
@@ -70,6 +71,7 @@ class FilesAppService implements IAttachmentService, ICustomAttachmentService {
|
||||
$this->shareManager = $shareManager;
|
||||
$this->userId = $userId;
|
||||
$this->preview = $preview;
|
||||
$this->mimeTypeDetector = $mimeTypeDetector;
|
||||
}
|
||||
|
||||
public function listAttachments(int $cardId): array {
|
||||
@@ -147,22 +149,10 @@ class FilesAppService implements IAttachmentService, ICustomAttachmentService {
|
||||
if ($file === null || $share->getSharedWith() !== (string)$attachment->getCardId()) {
|
||||
throw new NotFoundException('File not found');
|
||||
}
|
||||
if (method_exists($file, 'fopen')) {
|
||||
$response = new StreamResponse($file->fopen('r'));
|
||||
$response->addHeader('Content-Disposition', 'inline; filename="' . rawurldecode($file->getName()) . '"');
|
||||
} else {
|
||||
$response = new FileDisplayResponse($file);
|
||||
}
|
||||
// We need those since otherwise chrome won't show the PDF file with CSP rule object-src 'none'
|
||||
// https://bugs.chromium.org/p/chromium/issues/detail?id=271452
|
||||
$policy = new ContentSecurityPolicy();
|
||||
$policy->addAllowedObjectDomain('\'self\'');
|
||||
$policy->addAllowedObjectDomain('blob:');
|
||||
$policy->addAllowedMediaDomain('\'self\'');
|
||||
$policy->addAllowedMediaDomain('blob:');
|
||||
$response->setContentSecurityPolicy($policy);
|
||||
|
||||
$response->addHeader('Content-Type', $file->getMimeType());
|
||||
$response = new StreamResponse($file->fopen('rb'));
|
||||
$response->addHeader('Content-Disposition', 'attachment; filename="' . rawurldecode($file->getName()) . '"');
|
||||
$response->addHeader('Content-Type', $this->mimeTypeDetector->getSecureMimeType($file->getMimeType()));
|
||||
return $response;
|
||||
}
|
||||
|
||||
@@ -184,7 +174,6 @@ class FilesAppService implements IAttachmentService, ICustomAttachmentService {
|
||||
throw new StatusException('Could not read file');
|
||||
}
|
||||
$target->putContent($content);
|
||||
fclose($content);
|
||||
|
||||
$share = $this->shareManager->newShare();
|
||||
$share->setNode($target);
|
||||
|
||||
861
package-lock.json
generated
861
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -29,7 +29,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/polyfill": "^7.12.1",
|
||||
"@babel/runtime": "^7.13.8",
|
||||
"@babel/runtime": "^7.13.9",
|
||||
"@juliushaertl/vue-richtext": "^1.0.1",
|
||||
"@nextcloud/auth": "^1.3.0",
|
||||
"@nextcloud/axios": "^1.6.0",
|
||||
@@ -41,7 +41,7 @@
|
||||
"@nextcloud/moment": "^1.1.1",
|
||||
"@nextcloud/router": "^1.2.0",
|
||||
"@nextcloud/vue": "^3.6.0",
|
||||
"@nextcloud/vue-dashboard": "^1.0.1",
|
||||
"@nextcloud/vue-dashboard": "^1.1.0",
|
||||
"blueimp-md5": "^2.18.0",
|
||||
"dompurify": "^2.2.6",
|
||||
"lodash": "^4.17.21",
|
||||
@@ -70,7 +70,7 @@
|
||||
"devDependencies": {
|
||||
"@babel/core": "^7.13.8",
|
||||
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
|
||||
"@babel/preset-env": "^7.13.8",
|
||||
"@babel/preset-env": "^7.13.10",
|
||||
"@nextcloud/browserslist-config": "^1.0.0",
|
||||
"@nextcloud/eslint-config": "^2.2.0",
|
||||
"@nextcloud/eslint-plugin": "^1.5.0",
|
||||
@@ -88,7 +88,7 @@
|
||||
"eslint-loader": "^4.0.2",
|
||||
"eslint-plugin-import": "^2.22.1",
|
||||
"eslint-plugin-node": "^11.1.0",
|
||||
"eslint-plugin-promise": "^4.2.1",
|
||||
"eslint-plugin-promise": "^4.3.1",
|
||||
"eslint-plugin-standard": "^4.1.0",
|
||||
"eslint-plugin-vue": "^6.2.2",
|
||||
"file-loader": "^6.2.0",
|
||||
|
||||
@@ -112,6 +112,12 @@
|
||||
{{ dueDateReminderText }}
|
||||
</ActionButton>
|
||||
|
||||
<ActionCheckbox v-if="canManage"
|
||||
:checked="board.upcoming_show_only_assigned_cards"
|
||||
@change="actionToggleUpcoming_show_only_assigned_cards">
|
||||
{{ t('deck', 'Show only cards assigned to me in upcoming view') }}
|
||||
</ActionCheckbox>
|
||||
|
||||
<ActionButton v-if="canManage && !isDueSubmenuActive"
|
||||
icon="icon-delete"
|
||||
:close-after-click="true"
|
||||
@@ -133,7 +139,7 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { AppNavigationIconBullet, AppNavigationCounter, AppNavigationItem, ColorPicker, Actions, ActionButton } from '@nextcloud/vue'
|
||||
import { AppNavigationIconBullet, AppNavigationCounter, AppNavigationItem, ColorPicker, Actions, ActionButton, ActionCheckbox } from '@nextcloud/vue'
|
||||
import ClickOutside from 'vue-click-outside'
|
||||
|
||||
export default {
|
||||
@@ -145,6 +151,7 @@ export default {
|
||||
ColorPicker,
|
||||
Actions,
|
||||
ActionButton,
|
||||
ActionCheckbox,
|
||||
},
|
||||
directives: {
|
||||
ClickOutside,
|
||||
@@ -311,6 +318,9 @@ export default {
|
||||
this.isDueSubmenuActive = false
|
||||
this.updateDueSetting = null
|
||||
},
|
||||
actionToggleUpcoming_show_only_assigned_cards() {
|
||||
this.$store.dispatch('toggleUpcoming_show_only_assigned_cards', this.board)
|
||||
},
|
||||
},
|
||||
inject: [
|
||||
'boardApi',
|
||||
|
||||
@@ -308,6 +308,13 @@ export default new Vuex.Store({
|
||||
Vue.delete(state.currentBoard.acl, removeIndex)
|
||||
}
|
||||
},
|
||||
toggleUpcoming_show_only_assigned_cards(state, board) {
|
||||
let currentBoard = state.boards.filter((b) => {
|
||||
return board.id === b.id
|
||||
})
|
||||
currentBoard = currentBoard[0]
|
||||
Vue.set(currentBoard, 'upcoming_show_only_assigned_cards', board.upcoming_show_only_assigned_cards)
|
||||
},
|
||||
|
||||
},
|
||||
actions: {
|
||||
@@ -490,5 +497,13 @@ export default new Vuex.Store({
|
||||
dispatch('loadBoardById', acl.boardId)
|
||||
})
|
||||
},
|
||||
toggleUpcoming_show_only_assigned_cards({ commit }, board) {
|
||||
const boardCopy = JSON.parse(JSON.stringify(board))
|
||||
boardCopy.upcoming_show_only_assigned_cards = !boardCopy.upcoming_show_only_assigned_cards
|
||||
apiClient.updateBoard(boardCopy)
|
||||
.then((board) => {
|
||||
commit('toggleUpcoming_show_only_assigned_cards', board)
|
||||
})
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
@@ -25,10 +25,10 @@ namespace OCA\Deck\Service;
|
||||
|
||||
use OCA\Deck\Db\Attachment;
|
||||
use OCA\Deck\Db\AttachmentMapper;
|
||||
use OCP\AppFramework\Http\ContentSecurityPolicy;
|
||||
use OCP\AppFramework\Http\StreamResponse;
|
||||
use OCP\Files\Folder;
|
||||
use OCP\Files\IAppData;
|
||||
use OCP\Files\IMimeTypeDetector;
|
||||
use OCP\Files\IRootFolder;
|
||||
use OCP\Files\SimpleFS\ISimpleFile;
|
||||
use OCP\Files\SimpleFS\ISimpleFolder;
|
||||
@@ -57,6 +57,8 @@ class FileServiceTest extends TestCase {
|
||||
private $config;
|
||||
/** @var AttachmentMapper|MockObject */
|
||||
private $attachmentMapper;
|
||||
/** @var IMimeTypeDetector|MockObject */
|
||||
private $mimeTypeDetector;
|
||||
|
||||
public function setUp(): void {
|
||||
parent::setUp();
|
||||
@@ -67,7 +69,8 @@ class FileServiceTest extends TestCase {
|
||||
$this->rootFolder = $this->createMock(IRootFolder::class);
|
||||
$this->config = $this->createMock(IConfig::class);
|
||||
$this->attachmentMapper = $this->createMock(AttachmentMapper::class);
|
||||
$this->fileService = new FileService($this->l10n, $this->appData, $this->request, $this->logger, $this->rootFolder, $this->config, $this->attachmentMapper);
|
||||
$this->mimeTypeDetector = $this->createMock(IMimeTypeDetector::class);
|
||||
$this->fileService = new FileService($this->l10n, $this->appData, $this->request, $this->logger, $this->rootFolder, $this->config, $this->attachmentMapper, $this->mimeTypeDetector);
|
||||
}
|
||||
|
||||
public function mockGetFolder($cardId) {
|
||||
@@ -268,51 +271,13 @@ class FileServiceTest extends TestCase {
|
||||
$file->expects($this->any())
|
||||
->method('fopen')
|
||||
->willReturn('fileresource');
|
||||
$this->mimeTypeDetector->expects($this->once())
|
||||
->method('getSecureMimeType')
|
||||
->willReturn('image/jpeg');
|
||||
$actual = $this->fileService->display($attachment);
|
||||
$expected = new StreamResponse('fileresource');
|
||||
$expected->addHeader('Content-Type', 'image/jpeg');
|
||||
$expected->addHeader('Content-Disposition', 'inline; filename="' . rawurldecode($file->getName()) . '"');
|
||||
$policy = new ContentSecurityPolicy();
|
||||
$policy->addAllowedObjectDomain('\'self\'');
|
||||
$policy->addAllowedObjectDomain('blob:');
|
||||
$policy->addAllowedMediaDomain('\'self\'');
|
||||
$policy->addAllowedMediaDomain('blob:');
|
||||
$expected->setContentSecurityPolicy($policy);
|
||||
$this->assertEquals($expected, $actual);
|
||||
}
|
||||
|
||||
public function testDisplayPdf() {
|
||||
$this->config->expects($this->once())
|
||||
->method('getSystemValue')
|
||||
->willReturn('123');
|
||||
$appDataFolder = $this->createMock(Folder::class);
|
||||
$deckAppDataFolder = $this->createMock(Folder::class);
|
||||
$cardFolder = $this->createMock(Folder::class);
|
||||
$this->rootFolder->expects($this->once())->method('get')->willReturn($appDataFolder);
|
||||
$appDataFolder->expects($this->once())->method('get')->willReturn($deckAppDataFolder);
|
||||
$deckAppDataFolder->expects($this->once())->method('get')->willReturn($cardFolder);
|
||||
$attachment = $this->getAttachment();
|
||||
$file = $this->createMock(\OCP\Files\File::class);
|
||||
$cardFolder->expects($this->once())->method('get')->willReturn($file);
|
||||
$file->expects($this->any())
|
||||
->method('getMimeType')
|
||||
->willReturn('application/pdf');
|
||||
$file->expects($this->any())
|
||||
->method('getName')
|
||||
->willReturn('file1');
|
||||
$file->expects($this->any())
|
||||
->method('fopen')
|
||||
->willReturn('fileresource');
|
||||
$actual = $this->fileService->display($attachment);
|
||||
$expected = new StreamResponse('fileresource');
|
||||
$expected->addHeader('Content-Disposition', 'inline; filename="' . rawurldecode($file->getName()) . '"');
|
||||
$expected->addHeader('Content-Type', 'application/pdf');
|
||||
$policy = new ContentSecurityPolicy();
|
||||
$policy->addAllowedObjectDomain('\'self\'');
|
||||
$policy->addAllowedObjectDomain('blob:');
|
||||
$policy->addAllowedMediaDomain('\'self\'');
|
||||
$policy->addAllowedMediaDomain('blob:');
|
||||
$expected->setContentSecurityPolicy($policy);
|
||||
$expected->addHeader('Content-Disposition', 'attachment; filename="' . rawurldecode($file->getName()) . '"');
|
||||
$this->assertEquals($expected, $actual);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user