Compare commits

...

44 Commits

Author SHA1 Message Date
Josh
6c3823ddd5 chore: make psalm happy
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-03 11:14:06 -05:00
Josh
d6bb6b8122 chore: fixup typo
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-03 11:03:02 -05:00
Josh
717338977e fix(base): use correct unit prefix for excessive memory usage logs
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-03 10:30:16 -05:00
Josh
ac516cc51b feat(util): add binary unit label support to humanFileSize()
Signed-off-by: Josh <josh.t.richards@gmail.com>
2026-02-03 10:20:55 -05:00
Joas Schilling
34c2125217 Merge pull request #58009 from nextcloud/bugfix/noid/dont-validate-empty-strings
fix(federation): Don't ask the database for an empty url
2026-02-03 09:08:12 +01:00
Joas Schilling
70fd0e3348 Merge pull request #58010 from nextcloud/test/noid/add-tests-with-input-0
test(dispatcher): Add some tests with input 0
2026-02-03 09:07:05 +01:00
Joas Schilling
9caa4e20e5 test(dispatcher): Add some tests with input 0
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-02-03 08:32:43 +01:00
Joas Schilling
ce19caa37e fix(federation): Don't ask the database for an empty url
Signed-off-by: Joas Schilling <coding@schilljs.com>
2026-02-03 07:46:28 +01:00
Nextcloud bot
128d708ac3 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-02-03 00:20:53 +00:00
Elizabeth Danzberger
b5092e598f Merge pull request #57533 from nextcloud/fix/limit-app-to-group-initial-state
fix(app-settings): limit app to group initial state
2026-02-02 13:22:23 -05:00
Côme Chilliet
550b15a19a Merge pull request #57737 from nextcloud/feat/add-twofactor-to-presets
feat: Add twofactor applications to most of the presets
2026-02-02 15:12:08 +01:00
Andy Scherzinger
55fe320359 Merge pull request #57990 from nextcloud/fix/properly-forward
fix(files): keep current folder on drag-n-drop
2026-02-02 15:04:57 +01:00
Benjamin Gaussorgues
370d9f4d47 Merge pull request #57915 from nextcloud/feat/user-mount-cache-perf-sharding 2026-02-02 14:49:39 +01:00
Stephan Orbaugh
e10805fb35 Merge pull request #57793 from pac0san/patch-1
fix(files_external): Respect explicit port configuration
2026-02-02 13:57:44 +01:00
nextcloud-command
c3ddf91572 chore(assets): Recompile assets
Signed-off-by: nextcloud-command <nextcloud-command@users.noreply.github.com>
2026-02-02 12:34:04 +00:00
pac0san
e48f871bd0 fix(files_external): Respect explicit port configuration
It allows the use of the alternative SFTP port defined in the GUI (external storage), instead of the default port (22).

Signed-off-by: pac0san <7056343+pac0san@users.noreply.github.com>
Signed-off-by: provokateurin <kate@provokateurin.de>
2026-02-02 11:27:42 +01:00
Ferdinand Thiessen
1f6fe21527 fix(files): keep current folder on drag-n-drop
When drag and drop a file we only want to scroll to the uploaded file
not changing the current view.

Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
2026-02-02 10:36:43 +01:00
Nextcloud bot
4775ce4266 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-02-02 00:20:40 +00:00
Nextcloud bot
ba99550d06 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-02-01 00:20:40 +00:00
Joas Schilling
4a4c30af55 Merge pull request #57952 from nextcloud/automated/noid/master-update-code-signing-crl
[master] fix(security): Update code signing revocation list
2026-01-31 11:17:45 +01:00
nextcloud-command
264cfed5f4 fix(security): Update code signing revocation list
Signed-off-by: GitHub <noreply@github.com>
2026-01-31 03:37:17 +00:00
Nextcloud bot
5e238a68f6 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-01-31 00:20:43 +00:00
Robin Appelman
51a4bc519b fix: make getMountsForFileId work with sharding again
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-01-30 09:52:18 +01:00
Nextcloud bot
f61ef6d7e6 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2026-01-30 00:20:39 +00:00
Andy Scherzinger
a08aec2dbd Merge pull request #57881 from nextcloud/share-target-repair
Add repair step for share targets with excess (2)
2026-01-29 19:33:13 +01:00
Robin Appelman
5d0acf80dd test: add test for share target repair
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-01-29 18:19:18 +01:00
Robin Appelman
aedae2c601 fix: add repair step for cleanup shares with excess (2)
Signed-off-by: Robin Appelman <robin@icewind.nl>
2026-01-29 18:19:16 +01:00
Benjamin Gaussorgues
4a077c3454 Merge pull request #57815 from nextcloud/feat/user-mount-cache-perf 2026-01-29 16:35:54 +01:00
Joas Schilling
2066eb4275 Merge pull request #57908 from nextcloud/fix/2fa/allow-null-redirect-url-challenge
fix(2fa): allow null redirect URL on 2FA challenge page
2026-01-29 15:30:41 +01:00
Kate
400fe317e9 Merge pull request #57893 from nextcloud/carl/cachemountinfo-refactor 2026-01-29 15:10:22 +01:00
Christoph Wurst
a228601ed0 fix(2fa): allow null redirect URL on 2FA challenge page
Signed-off-by: Christoph Wurst <1374172+ChristophWurst@users.noreply.github.com>
2026-01-29 14:41:27 +01:00
Andy Scherzinger
8160f0af8a Merge pull request #57892 from nextcloud/carl/binary-search-findIn
perf(MountManager): use binary search to find mount in path
2026-01-29 13:53:47 +01:00
Andy Scherzinger
b1a114ded5 Merge pull request #54876 from nextcloud/carl/cleanup-commands-trash
refactor: Commands and background jobs for the trashbin
2026-01-29 13:44:17 +01:00
Andy Scherzinger
f2373f1102 Merge pull request #57497 from nextcloud/carl/external-storage-ipartialmountpoint
feat(external-storage): Implement IPartialMountPoint
2026-01-29 13:14:12 +01:00
Carl Schwan
04ddeeec4a perf(MountManager): use binary search to find mount in path
Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-01-29 11:41:58 +01:00
Carl Schwan
33d6f1e984 refactor(CacheMountInfo): Use constructor paramater promotion
Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-01-29 01:45:48 +01:00
Carl Schwan
a8d69ffed1 refactor: Commands and background jobs for the trashbin
- Use modern node and SetupManager API
- Avoid passing the user by id and instead use IUser

Signed-off-by: Carl Schwan <carl.schwan@nextcloud.com>
Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-01-28 21:44:30 +01:00
Carl Schwan
916ce3f8ec feat(external-storage): Implement IPartialMountPoint
Signed-off-by: Carl Schwan <carlschwan@kde.org>
2026-01-28 17:09:22 +01:00
Benjamin Gaussorgues
f71f19c0c7 feat: optimize user mount cache
Signed-off-by: Benjamin Gaussorgues <benjamin.gaussorgues@nextcloud.com>
2026-01-27 16:31:32 +01:00
Côme Chilliet
027bb149a4 chore: Remove broken PresetManager tests
Those are not Unit tests but integration tests with bad side effects on
 other tests. I failed to clean them up so removing them.

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-01-27 16:31:22 +01:00
Elizabeth Danzberger
b7c6240327 fix(test): remove group limitation when done
Signed-off-by: Elizabeth Danzberger <elizabeth@elzody.dev>
2026-01-26 13:46:59 -05:00
Elizabeth Danzberger
90deae46c5 test: limit app to group
Signed-off-by: Elizabeth Danzberger <elizabeth@elzody.dev>
2026-01-26 12:46:35 -05:00
Elizabeth Danzberger
fc94930b16 fix(app-settings): provide groups by initial state
Signed-off-by: Elizabeth Danzberger <elizabeth@elzody.dev>
2026-01-26 12:46:24 -05:00
Côme Chilliet
fae36e04ea feat: Add twofactor applications to most of the presets
All presets which are unlikely to have SSO in place should enable
 twofactor applications.

Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2026-01-26 10:18:09 +01:00
143 changed files with 4546 additions and 603 deletions

View File

@@ -2,6 +2,8 @@ OC.L10N.register(
"contactsinteraction",
{
"Recently contacted" : "Nedavno kontaktiran",
"Contacts Interaction" : "Interakcija kontakata"
"Contacts Interaction" : "Interakcija kontakata",
"Manages interaction between accounts and contacts" : "Upravlja interakcijom između računa i kontakata",
"Collect data about accounts and contacts interactions and provide an address book for the data" : "Prikuplja podatke o interakcijama između računa i kontakata te pruža adresar za te podatke"
},
"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;");

View File

@@ -1,5 +1,7 @@
{ "translations": {
"Recently contacted" : "Nedavno kontaktiran",
"Contacts Interaction" : "Interakcija kontakata"
"Contacts Interaction" : "Interakcija kontakata",
"Manages interaction between accounts and contacts" : "Upravlja interakcijom između računa i kontakata",
"Collect data about accounts and contacts interactions and provide an address book for the data" : "Prikuplja podatke o interakcijama između računa i kontakata te pruža adresar za te podatke"
},"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"
}

View File

@@ -3,6 +3,7 @@ OC.L10N.register(
{
"Dashboard" : "Nadzorna ploča",
"Dashboard app" : "Nadzorna ploča aplikacije",
"Start your day informed\n\nThe Nextcloud Dashboard is your starting point of the day, giving you an overview of your upcoming appointments, urgent emails, chat messages, incoming tickets, latest tweets and much more! People can add the widgets they like and change the background to their liking." : "Započnite dan informirani\n\nNextcloud nadzorna ploča vaša je početna točka dana i pruža vam pregled nadolazećih termina, hitnih e-poruka, poruka u chatu, dolaznih tiketa, najnovijih tweetova i još mnogo toga! Korisnici mogu dodavati widgete koji im odgovaraju i prilagoditi pozadinu prema vlastitim željama.",
"Weather" : "Vrijeme",
"Status" : "Status",
"Good morning" : "Dobro jutro",
@@ -13,10 +14,13 @@ OC.L10N.register(
"Good evening, {name}" : "Dobar dan, {name}",
"Hello" : "Pozdrav",
"Hello, {name}" : "Pozdrav, {name}",
"Happy birthday 🥳🤩🎂🎉" : "Sretan rođendan 🥳🤩🎂🎉",
"Happy birthday, {name} 🥳🤩🎂🎉" : "Sretan rođendan, {name} 🥳🤩🎂🎉",
"Customize" : "Uredi",
"Edit widgets" : "Uredi widgete",
"Get more widgets from the App Store" : "Nabavite više widgeta iz trgovine aplikacijama",
"Weather service" : "Davatelj vremenske prognoze",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Radi vaše privatnosti, podatke o vremenu u vaše ime dohvaća vaš {productName} poslužitelj, tako da vremenska usluga ne prima nikakve osobne podatke.",
"Weather data from Met.no" : "Podaci o vremenskoj prognozi iz Met.no",
"geocoding with Nominatim" : "geokodiranje uz Nominatim",
"elevation data from OpenTopoData" : "podaci o nadmorskoj visini iz OpenTopoData",

View File

@@ -1,6 +1,7 @@
{ "translations": {
"Dashboard" : "Nadzorna ploča",
"Dashboard app" : "Nadzorna ploča aplikacije",
"Start your day informed\n\nThe Nextcloud Dashboard is your starting point of the day, giving you an overview of your upcoming appointments, urgent emails, chat messages, incoming tickets, latest tweets and much more! People can add the widgets they like and change the background to their liking." : "Započnite dan informirani\n\nNextcloud nadzorna ploča vaša je početna točka dana i pruža vam pregled nadolazećih termina, hitnih e-poruka, poruka u chatu, dolaznih tiketa, najnovijih tweetova i još mnogo toga! Korisnici mogu dodavati widgete koji im odgovaraju i prilagoditi pozadinu prema vlastitim željama.",
"Weather" : "Vrijeme",
"Status" : "Status",
"Good morning" : "Dobro jutro",
@@ -11,10 +12,13 @@
"Good evening, {name}" : "Dobar dan, {name}",
"Hello" : "Pozdrav",
"Hello, {name}" : "Pozdrav, {name}",
"Happy birthday 🥳🤩🎂🎉" : "Sretan rođendan 🥳🤩🎂🎉",
"Happy birthday, {name} 🥳🤩🎂🎉" : "Sretan rođendan, {name} 🥳🤩🎂🎉",
"Customize" : "Uredi",
"Edit widgets" : "Uredi widgete",
"Get more widgets from the App Store" : "Nabavite više widgeta iz trgovine aplikacijama",
"Weather service" : "Davatelj vremenske prognoze",
"For your privacy, the weather data is requested by your {productName} server on your behalf so the weather service receives no personal information." : "Radi vaše privatnosti, podatke o vremenu u vaše ime dohvaća vaš {productName} poslužitelj, tako da vremenska usluga ne prima nikakve osobne podatke.",
"Weather data from Met.no" : "Podaci o vremenskoj prognozi iz Met.no",
"geocoding with Nominatim" : "geokodiranje uz Nominatim",
"elevation data from OpenTopoData" : "podaci o nadmorskoj visini iz OpenTopoData",

View File

@@ -234,6 +234,8 @@ OC.L10N.register(
"Could not rename part file to final file, canceled by hook" : "Nedaří se zapsat přejmenovat částečný soubor na ten končený zrušeno háčkem (hook)",
"Could not rename part file to final file" : "Nedaří se přejmenovat částečný soubor na ten konečný",
"Failed to check file size: %1$s" : "Nepodařilo se zkontrolovat velikost souboru: %1$s",
"Could not open file: %1$s (%2$d), file does seem to exist" : "Nebylo možné otevřít soubor: %1$s (%2$d) zdá se, že soubor existuje",
"Could not open file: %1$s (%2$d), file doesn't seem to exist" : "Nebylo možné otevřít soubor: %1$s (%2$d) zdá se, že soubor neexistuje",
"Encryption not ready: %1$s" : "Šifrování není připraveno: %1$s",
"Failed to open file: %1$s" : "Nepodařilo se otevřít soubor: %1$s",
"Failed to unlink: %1$s" : "Nepodařilo se zrušit propojení: %1$s",

View File

@@ -232,6 +232,8 @@
"Could not rename part file to final file, canceled by hook" : "Nedaří se zapsat přejmenovat částečný soubor na ten končený zrušeno háčkem (hook)",
"Could not rename part file to final file" : "Nedaří se přejmenovat částečný soubor na ten konečný",
"Failed to check file size: %1$s" : "Nepodařilo se zkontrolovat velikost souboru: %1$s",
"Could not open file: %1$s (%2$d), file does seem to exist" : "Nebylo možné otevřít soubor: %1$s (%2$d) zdá se, že soubor existuje",
"Could not open file: %1$s (%2$d), file doesn't seem to exist" : "Nebylo možné otevřít soubor: %1$s (%2$d) zdá se, že soubor neexistuje",
"Encryption not ready: %1$s" : "Šifrování není připraveno: %1$s",
"Failed to open file: %1$s" : "Nepodařilo se otevřít soubor: %1$s",
"Failed to unlink: %1$s" : "Nepodařilo se zrušit propojení: %1$s",

376
apps/dav/l10n/hr.js Normal file
View File

@@ -0,0 +1,376 @@
OC.L10N.register(
"dav",
{
"Calendar" : "Kalendar",
"Tasks" : "Zadaci",
"Personal" : "Osobno",
"{actor} created calendar {calendar}" : "{actor} je stvorio kalendar {calendar}",
"You created calendar {calendar}" : "Stvorili ste kalendar {calendar}",
"{actor} deleted calendar {calendar}" : "{actor} je izbrisao kalendar {calendar}",
"You deleted calendar {calendar}" : "Izbrisali ste kalendar {calendar}",
"{actor} updated calendar {calendar}" : "{actor} je ažurirao kalendar {calendar}",
"You updated calendar {calendar}" : "Ažurirali ste kalendar {calendar}",
"{actor} restored calendar {calendar}" : "{actor} je vratio kalendar {calendar}",
"You restored calendar {calendar}" : "Vratili ste kalendar {calendar}",
"You shared calendar {calendar} as public link" : "Podijelili ste kalendar {calendar} putem javne poveznice",
"You removed public link for calendar {calendar}" : "Uklonili ste javnu poveznicu na kalendar {calendar}",
"{actor} shared calendar {calendar} with you" : "{actor} dijeli kalendar {calendar} s vama",
"You shared calendar {calendar} with {user}" : "Podijelili ste kalendar {calendar} s {user}",
"{actor} shared calendar {calendar} with {user}" : "{actor} dijeli kalendar {calendar} s {user}",
"{actor} unshared calendar {calendar} from you" : "{actor} više ne dijeli kalendar {calendar} s vama",
"You unshared calendar {calendar} from {user}" : "Više ne dijelite kalendar {calendar} s {user}",
"{actor} unshared calendar {calendar} from {user}" : "{actor} više ne dijeli kalendar {calendar} s {user}",
"{actor} unshared calendar {calendar} from themselves" : "{actor} više ne dijeli kalendar {calendar} sam sa sobom",
"You shared calendar {calendar} with group {group}" : "Podijelili ste kalendar {calendar} s grupom {group}",
"{actor} shared calendar {calendar} with group {group}" : "{actor} dijeli kalendar {calendar} s grupom {group}",
"You unshared calendar {calendar} from group {group}" : "Više ne dijelite kalendar {calendar} s grupom {group}",
"{actor} unshared calendar {calendar} from group {group}" : "{actor} više ne dijeli kalendar {calendar} s grupom {group}",
"Untitled event" : "Događaj bez naslova",
"{actor} created event {event} in calendar {calendar}" : "{actor} je stvorio događaj {event} u kalendaru {calendar}",
"You created event {event} in calendar {calendar}" : "Stvorili ste događaj {event} u kalendaru {calendar}",
"{actor} deleted event {event} from calendar {calendar}" : "{actor} je izbrisao događaj {event} iz kalendara {calendar}",
"You deleted event {event} from calendar {calendar}" : "Izbrisali ste događaj {event} iz kalendara {calendar}",
"{actor} updated event {event} in calendar {calendar}" : "{actor} je ažurirao događaj {event} u kalendaru {calendar}",
"You updated event {event} in calendar {calendar}" : "Ažurirali ste događaj {event} u kalendaru {calendar}",
"{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} je premjestio događaj {event} iz kalendara {sourceCalendar} u kalendar {targetCalendar}",
"You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Premjestili ste događaj {event} iz kalendara {sourceCalendar} u kalendar {targetCalendar}",
"{actor} restored event {event} of calendar {calendar}" : "{actor} je vratio događaj {event} kalendara {calendar}",
"You restored event {event} of calendar {calendar}" : "Vratili ste događaj {event} kalendara {calendar}",
"Busy" : "Zauzeto",
"{actor} created to-do {todo} in list {calendar}" : "{actor} je stvorio zadatak {todo} u popisu {calendar}",
"You created to-do {todo} in list {calendar}" : "Stvorili ste zadatak {todo} u popisu {calendar}",
"{actor} deleted to-do {todo} from list {calendar}" : "{actor} je izbrisao zadatak {todo} iz popisa {calendar}",
"You deleted to-do {todo} from list {calendar}" : "Izbrisali ste zadatak {todo} iz popisa {calendar}",
"{actor} updated to-do {todo} in list {calendar}" : "{actor} je ažurirao zadatak {todo} u popisu {calendar}",
"You updated to-do {todo} in list {calendar}" : "Ažurirali ste zadatak {todo} u popisu {calendar}",
"{actor} solved to-do {todo} in list {calendar}" : "{actor} je riješio zadatak {todo} u popisu {calendar}",
"You solved to-do {todo} in list {calendar}" : "Riješili ste zadatak {todo} u popisu {calendar}",
"{actor} reopened to-do {todo} in list {calendar}" : "{actor} je ponovno otvorio zadatak {todo} u popisu {calendar}",
"You reopened to-do {todo} in list {calendar}" : "Ponovno ste otvorili zadatak {todo} u popisu {calendar}",
"{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} je premjestio zadatak {todo} iz popisa {sourceCalendar} u popis {targetCalendar}",
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Premjestili ste zadatak {todo} iz popisa {sourceCalendar} u popis {targetCalendar}",
"Calendar, contacts and tasks" : "Kalendar, kontakti i zadaci",
"A <strong>calendar</strong> was modified" : "Izmijenjen je <strong>kalendar</strong>",
"A calendar <strong>event</strong> was modified" : "Izmijenjen je <strong>događaj</strong> u kalendaru",
"A calendar <strong>to-do</strong> was modified" : "Izmijenjen je <strong>zadatak</strong> u kalendaru",
"Contact birthdays" : "Rođendani kontakata",
"Death of %s" : "Smrt %s",
"Untitled calendar" : "Kalendar bez naslova",
"Calendar:" : "Kalendar:",
"Date:" : "Datum:",
"Where:" : "Gdje:",
"Description:" : "Opis:",
"_%n year_::_%n years_" : ["%n godina","%n godina","%n godina"],
"_%n month_::_%n months_" : ["%n mjesec","%n mjeseci","%n mjeseci"],
"_%n day_::_%n days_" : ["%n dan","%n dana","%n dana"],
"_%n hour_::_%n hours_" : ["%n sat","%n sati","%n sati"],
"_%n minute_::_%n minutes_" : ["%n minute/minuta","%n minuta","%n minuta"],
"%s (in %s)" : "%s (u %s)",
"%s (%s ago)" : "%s (prije %s)",
"Calendar: %s" : "Kalendar: %s",
"Date: %s" : "Datum: %s",
"Description: %s" : "Opis: %s",
"Where: %s" : "Gdje: %s",
"%1$s via %2$s" : "%1$s putem %2$s",
"In the past on %1$s for the entire day" : "U prošlosti, dana %1$s, tijekom cijelog dana",
"_In %n minute on %1$s for the entire day_::_In %n minutes on %1$s for the entire day_" : ["Za %n minutu, dana %1$s, tijekom cijelog dana","Za %n minute, dana %1$s, tijekom cijelog dana","Za %n minuta, dana %1$s, tijekom cijelog dana"],
"_In %n hour on %1$s for the entire day_::_In %n hours on %1$s for the entire day_" : ["Za %n sat, dana %1$s, tijekom cijelog dana","Za %n sata, dana %1$s, tijekom cijelog dana","Za %n sati, dana %1$s, tijekom cijelog dana"],
"_In %n day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["Za %n dan, dana %1$s, tijekom cijelog dana","Za %n dana, dana %1$s, tijekom cijelog dana","Za %n dana, dana %1$s, tijekom cijelog dana"],
"_In %n week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["Za %n tjedan, dana %1$s, tijekom cijelog dana","Za %n tjedna, dana %1$s, tijekom cijelog dana","Za %n tjedana, dana %1$s, tijekom cijelog dana"],
"_In %n month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["Za %n mjesec, dana %1$s, tijekom cijelog dana","Za %n mjeseca, dana %1$s, tijekom cijelog dana","Za %n mjeseci, dana %1$s, tijekom cijelog dana"],
"_In %n year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["Za %n godinu, dana %1$s, tijekom cijelog dana","Za %n godine, dana %1$s, tijekom cijelog dana","Za %n godina, dana %1$s, tijekom cijelog dana"],
"In the past on %1$s between %2$s - %3$s" : "U prošlosti, dana %1$s između %2$s %3$s",
"_In %n minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["Za %n minutu, dana %1$s između %2$s %3$s","Za %n minute, dana %1$s između %2$s %3$s","Za %n minuta, dana %1$s između %2$s %3$s"],
"_In %n hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["Za %n sat, dana %1$s između %2$s %3$s","Za %n sata, dana %1$s između %2$s %3$s","Za %n sati, dana %1$s između %2$s %3$s"],
"_In %n day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["Za %n dan, dana %1$s između %2$s %3$s","Za %n dana, dana %1$s između %2$s %3$s","Za %n dana, dana %1$s između %2$s %3$s"],
"_In %n week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["Za %n tjedan, dana %1$s između %2$s %3$s","Za %n tjedna, dana %1$s između %2$s %3$s","Za %n tjedana, dana %1$s između %2$s %3$s"],
"_In %n month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["Za %n mjesec, dana %1$s između %2$s %3$s","Za %n mjeseca, dana %1$s između %2$s %3$s","Za %n mjeseci, dana %1$s između %2$s %3$s"],
"_In %n year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["Za %n godinu, dana %1$s između %2$s %3$s","Za %n godine, dana %1$s između %2$s %3$s","Za %n godina, dana %1$s između %2$s %3$s"],
"Could not generate when statement" : "Nije moguće generirati vremensku odrednicu",
"Every Day for the entire day" : "Svaki dan tijekom cijelog dana",
"Every Day for the entire day until %1$s" : "Svaki dan tijekom cijelog dana do %1$s",
"Every Day between %1$s - %2$s" : "Svaki dan između %1$s - %2$s",
"Every Day between %1$s - %2$s until %3$s" : "Svaki dan između %1$s - %2$s do %3$s",
"Every %1$d Days for the entire day" : "Svakih %1$d dana tijekom cijelog dana",
"Every %1$d Days for the entire day until %2$s" : "Svakih %1$d dana tijekom cijelog dana do %2$s",
"Every %1$d Days between %2$s - %3$s" : "Svakih%1$d dana između%2$s - %3$s",
"Every %1$d Days between %2$s - %3$s until %4$s" : "Svakih %1$d dana između %2$s - %3$s do %4$s",
"Could not generate event recurrence statement" : "Nije moguće generirati izraz za ponavljanje događaja",
"Every Week on %1$s for the entire day" : "Svaki tjedan u %1$s tijekom cijelog dana",
"Every Week on %1$s for the entire day until %2$s" : "Svaki tjedan u %1$s tokom cijelog dana do %2$s",
"Every Week on %1$s between %2$s - %3$s" : "Svaki tjedan u %1$s između %2$s - %3$s",
"Every Week on %1$s between %2$s - %3$s until %4$s" : "Svaki tjedan u %1$s između %2$s - %3$s do %4$s",
"Every %1$d Weeks on %2$s for the entire day" : "Svakih %1$d tjedana od %2$s tijekom cijelog dana",
"Every %1$d Weeks on %2$s for the entire day until %3$s" : "Svakih %1$d tjedana od %2$s tijekom cijelog dana do %3$s",
"Every %1$d Weeks on %2$s between %3$s - %4$s" : "Svakih %1$d tjedana od %2$s između %3$s - %4$s",
"Every %1$d Weeks on %2$s between %3$s - %4$s until %5$s" : "Svakih %1$d tjedana od %2$s između %3$s - %4$s do %5$s",
"Every Month on the %1$s for the entire day" : "%1$s svakog mjeseca tokom cijelog dana",
"Every Month on the %1$s for the entire day until %2$s" : "%1$s svakog mjeseca tokom cijelog dana do%2$s",
"Every Month on the %1$s between %2$s - %3$s" : "%1$s svakog mjeseca između %2$s - %3$s",
"Every Month on the %1$s between %2$s - %3$s until %4$s" : "%1$s svakog mjeseca između %2$s - %3$s do %4$s",
"Every %1$d Months on the %2$s for the entire day" : "Svakih %1$d mjeseci, %2$s tokom cijelog dana",
"Every %1$d Months on the %2$s for the entire day until %3$s" : "Svakih %1$d mjeseci, %2$s tokom cijelog dana do %3$s",
"Every %1$d Months on the %2$s between %3$s - %4$s" : "Svakih %1$d mjeseci, %2$s između %3$s - %4$s",
"Every %1$d Months on the %2$s between %3$s - %4$s until %5$s" : "Svakih %1$d mjeseci, %2$s između %3$s - %4$s do %5$s",
"Every Year in %1$s on the %2$s for the entire day" : "Svake godine, %1$s, %2$s tokom cijelog dana",
"Every Year in %1$s on the %2$s for the entire day until %3$s" : "Svake godine, %1$s, %2$s tokom cijelog dana do %3$s",
"Every Year in %1$s on the %2$s between %3$s - %4$s" : "Svake godine, %1$s, %2$s između %3$s - %4$s",
"Every Year in %1$s on the %2$s between %3$s - %4$s until %5$s" : "Svake godine, %1$s, %2$s, između %3$s - %4$s do %5$s",
"Every %1$d Years in %2$s on the %3$s for the entire day" : "Svakih %1$d godina, %2$s, na %3$s tokom cijelog dana",
"Every %1$d Years in %2$s on the %3$s for the entire day until %4$s" : "Svakih %1$d godina, %2$s, na %3$s tokom cijelog dana do %4$s",
"Every %1$d Years in %2$s on the %3$s between %4$s - %5$s" : "Svakih %1$d godina, %2$s, na %3$s između %4$s - %5$s",
"Every %1$d Years in %2$s on the %3$s between %4$s - %5$s until %6$s" : "Svakih %1$d godina, %2$s, na %3$s između %4$s - %5$s do %6$s",
"On specific dates for the entire day until %1$s" : "Na određene datume, tijekom cijelog dana do %1$s",
"On specific dates between %1$s - %2$s until %3$s" : "Na određene datume između %1$s - %2$s do %3$s",
"In the past on %1$s" : "U prošlosti, dana %1$s",
"_In %n minute on %1$s_::_In %n minutes on %1$s_" : ["U %n minutu, %1$s","U %n minute, %1$s","U %n minuta, %1$s"],
"_In %n hour on %1$s_::_In %n hours on %1$s_" : ["U %n sat, %1$s","U %n sata, %1$s","U %n sati, %1$s"],
"_In %n day on %1$s_::_In %n days on %1$s_" : ["U %n dan, %1$s","U %n dana, %1$s","U %n dana, %1$s"],
"_In %n week on %1$s_::_In %n weeks on %1$s_" : ["U %n tjedan, %1$s","U %n tjedna, %1$s","U %n tjedana, %1$s"],
"_In %n month on %1$s_::_In %n months on %1$s_" : ["U %n mjesec, %1$s","U %n mjeseca, %1$s","U %n mjeseci, %1$s"],
"_In %n year on %1$s_::_In %n years on %1$s_" : ["U %n godinu, %1$s","U %n godine, %1$s","U %n godina, %1$s"],
"In the past on %1$s then on %2$s" : "U prošlosti, dana %1$s, zatim dana %2$s",
"_In %n minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["U %n minutu u %1$s, onda u %2$s","U %n minute u %1$s, onda u %2$s","U %n minuta u %1$s, onda u %2$s"],
"_In %n hour on %1$s then on %2$s_::_In %n hours on %1$s then on %2$s_" : ["U %n sat u %1$s, onda u %2$s","U %n sata u %1$s, onda u %2$s","U %n sati u %1$s, onda u %2$s"],
"_In %n day on %1$s then on %2$s_::_In %n days on %1$s then on %2$s_" : ["U %n dan u %1$s, onda u %2$s","U %n dana u %1$s, onda u %2$s","U %n dana u %1$s, onda u %2$s"],
"_In %n week on %1$s then on %2$s_::_In %n weeks on %1$s then on %2$s_" : ["U %n tjedan u %1$s, onda u %2$s","U %n tjedna u %1$s, onda u %2$s","U %n tjedana u %1$s, onda u %2$s"],
"_In %n month on %1$s then on %2$s_::_In %n months on %1$s then on %2$s_" : ["U %n mjesec u %1$s, onda u %2$s","U %n mjeseca u %1$s, onda u %2$s","U %n mjeseci u %1$s, onda u %2$s"],
"_In %n year on %1$s then on %2$s_::_In %n years on %1$s then on %2$s_" : ["U %n godinu u %1$s, onda u %2$s","U %n godine u %1$s, onda u %2$s","U %n godina u %1$s, onda u %2$s"],
"In the past on %1$s then on %2$s and %3$s" : "U prošlosti, dana %1$s, zatim dana %2$s i %3$s",
"_In %n minute on %1$s then on %2$s and %3$s_::_In %n minutes on %1$s then on %2$s and %3$s_" : ["u %n minutu dana %1$s onda dana %2$s i %3$s","u %n minute dana %1$s onda dana %2$s i %3$s","u %n minuta dana %1$s onda dana %2$s i %3$s"],
"_In %n hour on %1$s then on %2$s and %3$s_::_In %n hours on %1$s then on %2$s and %3$s_" : ["u %n sat dana %1$s onda dana %2$s i %3$s","u %n sata dana %1$s onda dana %2$s i %3$s","u %n sati dana %1$s onda dana %2$s i %3$s"],
"_In %n day on %1$s then on %2$s and %3$s_::_In %n days on %1$s then on %2$s and %3$s_" : ["u %n dan, dana %1$s onda dana %2$s i %3$s","u %n dana, dana %1$s onda dana %2$s i %3$s","u %n dana, dana %1$s onda dana %2$s i %3$s"],
"_In %n week on %1$s then on %2$s and %3$s_::_In %n weeks on %1$s then on %2$s and %3$s_" : ["u %n tjedan, dana %1$s onda dana %2$s i %3$s","u %n tjedna, dana %1$s onda dana %2$s i %3$s","u %n tjedana, dana %1$s onda dana %2$s i %3$s"],
"_In %n month on %1$s then on %2$s and %3$s_::_In %n months on %1$s then on %2$s and %3$s_" : ["u %n mjesec, dana %1$s onda dana %2$s i %3$s","u %n mjeseca, dana %1$s onda dana %2$s i %3$s","u %n mjeseci, dana %1$s onda dana %2$s i %3$s"],
"_In %n year on %1$s then on %2$s and %3$s_::_In %n years on %1$s then on %2$s and %3$s_" : ["u %n godinu, dana %1$s onda dana %2$s i %3$s","u %n godine, dana %1$s onda dana %2$s i %3$s","u %n godina, dana %1$s onda dana %2$s i %3$s"],
"Could not generate next recurrence statement" : "Nije moguće generirati sljedeći izraz ponavljanja",
"Cancelled: %1$s" : "Otkazano: %1$s",
"\"%1$s\" has been canceled" : "„%1$s” je otkazan",
"Re: %1$s" : "Odgovor: %1 $ s",
"%1$s has accepted your invitation" : "%1$s je prihvatio/la vašu pozivnicu",
"%1$s has tentatively accepted your invitation" : "%1$s je privremeno prihvatio/la vašu pozivnicu",
"%1$s has declined your invitation" : "%1$s je odbio/la vašu pozivnicu",
"%1$s has responded to your invitation" : "%1$s je odgovorio/la na vašu pozivnicu",
"Invitation updated: %1$s" : "Pozivnica ažurirana: %1$s",
"%1$s updated the event \"%2$s\"" : "%1$s je ažurirao/la događaj \"%2$s\"",
"Invitation: %1$s" : "Pozivnica: %1$s",
"%1$s would like to invite you to \"%2$s\"" : "%1$s vas želi pozvati na „%2$s”",
"Organizer:" : "Organizator:",
"Attendees:" : "Polaznici:",
"Title:" : "Naslov:",
"When:" : "Kada:",
"Location:" : "Lokacija:",
"Link:" : "Poveznica:",
"Occurring:" : "Događa se:",
"Accept" : "Prihvati",
"Decline" : "Odbij",
"More options …" : "Više mogućnosti…",
"More options at %s" : "Više mogućnosti na %s",
"Monday" : "Ponedjeljak",
"Tuesday" : "Utorak",
"Wednesday" : "Srijeda",
"Thursday" : "Četvrtak",
"Friday" : "Petak",
"Saturday" : "Subota",
"Sunday" : "Nedjelja",
"January" : "Siječanj",
"February" : "Veljača",
"March" : "Ožujak",
"April" : "Travanj",
"May" : "Svibanj",
"June" : "Lipanj",
"July" : "Srpanj",
"August" : "Kolovoz",
"September" : "Rujan",
"October" : "Listopad",
"November" : "Studeni",
"December" : "Prosinac",
"First" : "Prvi",
"Second" : "Drugi",
"Third" : "Treći",
"Fourth" : "Četvrti",
"Fifth" : "Peti",
"Last" : "Zadnji",
"Second Last" : "Drugi od kraja",
"Third Last" : "Treći od kraja",
"Fourth Last" : "Četvrti od kraja",
"Fifth Last" : "Peti od kraja",
"Contacts" : "Kontakti",
"{actor} created address book {addressbook}" : "{actor} je stvorio adresar {addressbook}",
"You created address book {addressbook}" : "Stvorili ste adresar {addressbook}",
"{actor} deleted address book {addressbook}" : "{actor} je izbrisao adresar {addressbook}",
"You deleted address book {addressbook}" : "Izbrisali ste adresar {addressbook}",
"{actor} updated address book {addressbook}" : "{actor} je ažurirao adresar {addressbook}",
"You updated address book {addressbook}" : "Ažurirali ste adresar {addressbook}",
"{actor} shared address book {addressbook} with you" : "{actor} dijeli adresar {addressbook} s vama",
"You shared address book {addressbook} with {user}" : "Dijelite adresar {addressbook} s {user}",
"{actor} shared address book {addressbook} with {user}" : "{actor} dijeli adresar {addressbook} s {user}",
"{actor} unshared address book {addressbook} from you" : "{actor} je prestao dijeliti adresar {addressbook} s vama",
"You unshared address book {addressbook} from {user}" : "Prestali ste dijeliti adresar {addressbook} s {user}",
"{actor} unshared address book {addressbook} from {user}" : "{actor} je prestao dijeliti adresar {addressbook} s {user}",
"{actor} unshared address book {addressbook} from themselves" : "{actor} je prestao dijeliti adresar {addressbook} sa sobom",
"You shared address book {addressbook} with group {group}" : "Dijelite adresar {addressbook} s grupom {group}",
"{actor} shared address book {addressbook} with group {group}" : "{actor} dijeli adresar {addressbook} s grupom {group}",
"You unshared address book {addressbook} from group {group}" : "Prestali ste dijeliti adresar {addressbook} s grupom {group}",
"{actor} unshared address book {addressbook} from group {group}" : "{actor} je prestao dijeliti adresar {addressbook} s grupom {group}",
"{actor} created contact {card} in address book {addressbook}" : "{actor} je stvorio kontakt {card} u adresaru {addressbook}",
"You created contact {card} in address book {addressbook}" : "Stvorili ste kontakt {card} u adresaru {addressbook}",
"{actor} deleted contact {card} from address book {addressbook}" : "{actor} je izbrisao kontakt {card} iz adresara {addressbook}",
"You deleted contact {card} from address book {addressbook}" : "Izbrisali ste kontakt {card} iz adresara {addressbook}",
"{actor} updated contact {card} in address book {addressbook}" : "{actor} je ažurirao kontakt {card} u adresaru {addressbook}",
"You updated contact {card} in address book {addressbook}" : "Ažurirali ste kontakt {card} u adresaru {addressbook}",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "Izmijenjen je <strong>kontakt</strong> ili <strong>adresar</strong>",
"System address book disabled" : "Adresar sustava je onemogućen",
"The system contacts address book has been automatically disabled during upgrade. This means that the address book will no longer be available to users in the contacts app or other clients. The system contacts address book was disabled because the amount of contacts in the address book exceeded the maximum recommended number of contacts. This limit is set to prevent performance issues. You can re-enable the system address book with the following command {command}" : "Adresar sistemskih kontakata automatski je onemogućen tijekom nadogradnje. To znači da adresar više neće biti dostupan korisnicima u aplikaciji Kontakti niti u drugim klijentima. Adresar sistemskih kontakata onemogućen je jer je broj kontakata u adresaru premašio maksimalno preporučeni broj. Ovo ograničenje postavljeno je radi sprječavanja problema s performansama. Adresar sustava možete ponovno omogućiti sljedećom naredbom {command}.",
"Accounts" : "Korisnički računi",
"System address book which holds all accounts" : "Adresar sustava koji sadrži sve račune",
"File is not updatable: %1$s" : "Datoteku nije moguće ažurirati: %1$s",
"Failed to get storage for file" : "Neuspjelo dohvaćanje pohrane za datoteku",
"Could not write to final file, canceled by hook" : "Nije moguće zapisati u završnu datoteku, otkazano putem kuke",
"Could not write file contents" : "Nije moguće zapisati sadržaj datoteke",
"_%n byte_::_%n bytes_" : ["%n bajt","%n bajta","%n bajtova"],
"Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Pogreška pri kopiranju datoteke na odredišnu lokaciju (kopirano: %1$s, očekivana veličina datoteke: %2$s)",
"Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side." : "Očekivana veličina datoteke je %1$s ali je pročitano (s Nextcloud klijenta) i zapisano (u Nextcloud pohranu) %2$s. To može biti problem s mrežom na strani slanja ili problem pri zapisivanju u pohranu na strani poslužitelja.",
"Could not rename part file to final file, canceled by hook" : "Nije moguće preimenovati djelomičnu datoteku u završnu datoteku, otkazano putem kuke",
"Could not rename part file to final file" : "Nije moguće preimenovati djelomičnu datoteku u završnu datoteku",
"Failed to check file size: %1$s" : "Neuspjela provjera veličine datoteke: %1$s",
"Could not open file: %1$s (%2$d), file does seem to exist" : "Nije moguće otvoriti datoteku: %1$s (%2$d), čini se da datoteka postoji",
"Could not open file: %1$s (%2$d), file doesn't seem to exist" : "Nije moguće otvoriti datoteku: %1$s (%2$d), čini se da datoteka ne postoji",
"Encryption not ready: %1$s" : "Šifriranje nije spremno: %1$s",
"Failed to open file: %1$s" : "Neuspjelo otvaranje datoteke: %1$s",
"Failed to unlink: %1$s" : "Neuspjelo uklanjanje veze: %1$s",
"Failed to write file contents: %1$s" : "Neuspjelo zapisivanje sadržaja datoteke: %1$s",
"File not found: %1$s" : "Datoteka nije pronađena: %1$s",
"Invalid target path" : "Nevažeća odredišna putanja",
"System is in maintenance mode." : "Sustav je u načinu održavanja.",
"Upgrade needed" : "Potrebno nadograditi",
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "Vaš %s treba konfigurirati za korištenje HTTPS-a kako bi se mogli upotrebljavati CalDAV i CardDAV s operacijskim sustavom iOS/macOS.",
"Configures a CalDAV account" : "Konfigurira CalDAV račun",
"Configures a CardDAV account" : "Konfigurira CardDAV račun",
"Events" : "Događaji",
"Untitled task" : "Zadatak bez naslova",
"Completed on %s" : "Završeno na %s",
"Due on %s by %s" : "%s treba završiti do %s",
"Due on %s" : "Treba završiti do %s",
"Welcome to Nextcloud Calendar!\n\nThis is a sample event - explore the flexibility of planning with Nextcloud Calendar by making any edits you want!\n\nWith Nextcloud Calendar, you can:\n- Create, edit, and manage events effortlessly.\n- Create multiple calendars and share them with teammates, friends, or family.\n- Check availability and display your busy times to others.\n- Seamlessly integrate with apps and devices via CalDAV.\n- Customize your experience: schedule recurring events, adjust notifications and other settings." : "Dobrodošli u Nextcloud Kalendar!\n\nOvo je primjer događaja istražite fleksibilnost planiranja s Nextcloud Kalendarom tako da napravite bilo kakve izmjene koje želite!\n\nUz Nextcloud Kalendar možete:\n- Jednostavno stvarati, uređivati i upravljati događajima..\n- Stvarati više kalendara i dijeliti ih s kolegama, prijateljima ili obitelji.\n- Provjeravati dostupnost i drugima prikazivati svoja zauzeta razdoblja.\n- Neprimjetno se integrirati s aplikacijama i uređajima putem CalDAV-a.\n- Prilagoditi svoje iskustvo: zakazivati ponavljajuće događaje, prilagođavati obavijesti i druge postavke.",
"Example event - open me!" : "Primjer događaja otvori me!",
"System Address Book" : "Adresar sustava",
"The system address book contains contact information for all users in your instance." : "Adresar sustava sadrži kontaktne podatke za sve korisnike u vašoj instanci.",
"Enable System Address Book" : "Omogući adresar sustava",
"DAV system address book" : "DAV adresar sustava",
"No outstanding DAV system address book sync." : "Nema neriješene sinkronizacije DAV adresara sustava.",
"The DAV system address book sync has not run yet as your instance has more than 1000 users or because an error occurred. Please run it manually by calling \"occ dav:sync-system-addressbook\"." : "Sinkronizacija DAV adresara sustava još nije pokrenuta jer vaša instanca ima više od 1000 korisnika ili je došlo do pogreške. Pokrenite je ručno pozivanjem naredbe „occ dav:sync-system-addressbook”.",
"DAV system address book size" : "Veličina DAV adresara sustava",
"The system address book is disabled" : "Adresar sustava je onemogućen",
"The system address book is enabled, but contains more than the configured limit of %d contacts" : "Adresar sustava je omogućen, ali sadrži više od konfiguriranog ograničenja od %d kontakata",
"The system address book is enabled and contains less than the configured limit of %d contacts" : "Adresar sustava je omogućen i sadrži manje od konfiguriranog ograničenja od %d kontakata",
"WebDAV endpoint" : "WebDAV krajnja točka",
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Nije moguće provjeriti je li vaš mrežni poslužitelj ispravno postavljen za omogućavanje sinkronizacije datoteka putem WebDAV-a. Molimo provjerite ručno.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Vaš mrežni poslužitelj nije pravilno podešen za sinkronizaciju podataka jer je sučelje protokola WebDAV neispravno.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Vaš mrežni poslužitelj je ispravno postavljen za omogućavanje sinkronizacije datoteka putem WebDAV-a.",
"Migrated calendar (%1$s)" : "Migriran kalendar (%1$s)",
"Calendars including events, details and attendees" : "Kalendari uključujući događaje, detalje i sudionike",
"Contacts and groups" : "Kontakti i grupe",
"WebDAV" : "WebDAV",
"Absence saved" : "Odsutnost je spremljena",
"Failed to save your absence settings" : "Neuspjelo spremanje postavki odsutnosti",
"Absence cleared" : "Odsutnost je uklonjena",
"Failed to clear your absence settings" : "Neuspjelo uklanjanje postavki odsutnosti",
"First day" : "Prvi dan",
"Last day (inclusive)" : "Zadnji dan (uključivo)",
"Out of office replacement (optional)" : "Zamjena za odsutnost iz ureda (neobavezno)",
"Name of the replacement" : "Ime zamjene",
"Short absence status" : "Kratki status odsutnosti",
"Long absence Message" : "Duga poruka o odsutnosti",
"Save" : "Spremi",
"Disable absence" : "Onemogući odsutnost",
"Failed to load availability" : "Neuspjelo učitavanje dostupnosti",
"Saved availability" : "Dostupnost je spremljena",
"Failed to save availability" : "Neuspjelo spremanje dostupnosti",
"to" : "do",
"Delete slot" : "Izbriši mjesto",
"No working hours set" : "Radno vrijeme nije postavljeno",
"Add slot" : "Dodaj mjesto",
"Weekdays" : "Dani u tjednu",
"Pick a start time for {dayName}" : "Odaberite početno vrijeme za {dayName}",
"Pick a end time for {dayName}" : "Odaberite završno vrijeme za {dayName}",
"Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Automatski postavi korisnički status na „Ne ometaj” izvan vremena dostupnosti kako bi se utišale sve obavijesti.",
"Cancel" : "Odustani",
"Import" : "Uvezi",
"Error while saving settings" : "Greška pri spremanju postavki",
"Contact reset successfully" : "Kontakt je uspješno resetiran",
"Error while resetting contact" : "Greška pri resetiranju kontakta",
"Contact imported successfully" : "Kontakt je uspješno uvezen",
"Error while importing contact" : "Greška pri uvozu kontakta",
"Import contact" : "Uvezi kontakt",
"Reset to default" : "Vrati na zadanu postavku",
"Import contacts" : "Uvezi kontakte",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Uvoz nove .vcf datoteke izbrisat će postojeći zadani kontakt i zamijeniti ga novim. Želite li nastaviti?",
"Failed to save example event creation setting" : "Neuspjelo spremanje postavke stvaranja primjer-događaja",
"Failed to upload the example event" : "Neuspjelo učitavanje primjer-događaja",
"Custom example event was saved successfully" : "Prilagođeni primjer događaja uspješno je spremljen",
"Failed to delete the custom example event" : "Neuspjelo brisanje prilagođenog primjer-događaja",
"Custom example event was deleted successfully" : "Prilagođeni primjer događaja uspješno je izbrisan",
"Import calendar event" : "Uvezi događaj u kalendar",
"Uploading a new event will overwrite the existing one." : "Učitavanje novog događaja prebrisat će postojeći.",
"Upload event" : "Učitaj događaj",
"Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "Također instalirajte {calendarappstoreopen}aplikaciju Kalendar{linkclose} ili {calendardocopen}povežite računalo i mobilni uređaj radi sinkroniziranja ↗{linkclose}.",
"Please make sure to properly set up {emailopen}the email server{linkclose}." : "Provjerite jeste li ispravno postavili {emailopen}poslužitelj e-pošte{linkclose}.",
"Calendar server" : "Poslužitelj kalendara",
"Send invitations to attendees" : "Pošaljite pozive sudionicima",
"Automatically generate a birthday calendar" : "Automatski generiraj kalendar rođendana",
"Birthday calendars will be generated by a background job." : "Kalendari rođendana generirat će se u pozadini.",
"Hence they will not be available immediately after enabling but will show up after some time." : "Stoga neće biti dostupni odmah nakon omogućivanja, ali će se pojaviti nakon nekog vremena.",
"Send notifications for events" : "Šalji obavijesti o događajima",
"Notifications are sent via background jobs, so these must occur often enough." : "Obavijesti se šalju putem pozadinskih zadataka koji se moraju dovoljno često izvoditi.",
"Send reminder notifications to calendar sharees as well" : "Šalji podsjetnike i osobama s kojima je kalendar podijeljen",
"Reminders are always sent to organizers and attendees." : "Podsjetnici se uvijek šalju organizatorima i sudionicima.",
"Enable notifications for events via push" : "Omogući slanje obavijesti o događajima putem push obavijesti",
"Example content" : "Primjer sadržaja",
"Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content." : "Primjer sadržaja služi za predstavljanje mogućnosti Nextclouda. Zadani sadržaj dolazi uz Nextcloud i može se zamijeniti prilagođenim sadržajem.",
"Availability" : "Raspoloživost",
"If you configure your working hours, other people will see when you are out of office when they book a meeting." : "Ako konfigurirate svoje radno vrijeme, drugi će vidjeti kada ste izvan ureda prilikom zakazivanja sastanka.",
"Absence" : "Odsutnost",
"Configure your next absence period." : "Konfigurirajte svoje sljedeće razdoblje odsutnosti.",
"There was an error updating your attendance status." : "Došlo je do pogreške prilikom ažuriranja statusa prisutnosti.",
"Please contact the organizer directly." : "Izravno se obratite organizatoru.",
"Are you accepting the invitation?" : "Prihvaćate li poziv?",
"Tentative" : "Uvjetno",
"Your attendance was updated successfully." : "Vaša je prisutnost uspješno ažurirana.",
"_In a minute on %1$s for the entire day_::_In %n minutes on %1$s for the entire day_" : ["U %n minutu, dana %1$s tokom cijelog dana","U %n minute, dana %1$s tokom cijelog dana","U %n minuta, dana %1$s tokom cijelog dana"],
"_In a hour on %1$s for the entire day_::_In %n hours on %1$s for the entire day_" : ["U %n sat, dana %1$s tokom cijelog dana","U %n sata, dana %1$s tokom cijelog dana","U %n sati, dana %1$s tokom cijelog dana"],
"_In a day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["U %n dan, dana %1$s tokom cijelog dana","U %n dana, dana %1$s tokom cijelog dana","U %n dana, dana %1$s tokom cijelog dana"],
"_In a week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["U %n tjedana, dana %1$s tokom cijelog dana","U %n tjedna, dana %1$s tokom cijelog dana","U %n tjedana, dana %1$s tokom cijelog dana"],
"_In a month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["U %n mjesec, dana %1$s tokom cijelog dana","U %n mjeseca, dana %1$s tokom cijelog dana","U %n mjeseci, dana %1$s tokom cijelog dana"],
"_In a year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["U %n godini, dana %1$s tokom cijelog dana","U %n godine, dana %1$s tokom cijelog dana","U %n godina, dana %1$s tokom cijelog dana"],
"_In a minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["U %n minutu, dana %1$s između %2$s - %3$s","U %n minute, dana %1$s između %2$s - %3$s","U %n minuta, dana %1$s između %2$s - %3$s"],
"_In a hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["U %n sat, dana %1$s između %2$s - %3$s","U %n sata, dana %1$s između %2$s - %3$s","U %n sati, dana %1$s između %2$s - %3$s"],
"_In a day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["U %n dan, dana %1$s između %2$s - %3$s","U %n dana, dana %1$s između %2$s - %3$s","U %n dana, dana %1$s između %2$s - %3$s"],
"_In a week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["U %n tjedan, dana %1$s između %2$s - %3$s","U %n tjedna, dana %1$s između %2$s - %3$s","U %n tjedana, dana %1$s između %2$s - %3$s"],
"_In a month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["U %n mjesec, dana %1$s između %2$s - %3$s","U %n mjeseca, dana %1$s između %2$s - %3$s","U %n mjeseci, dana %1$s između %2$s - %3$s"],
"_In a year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["U %n godini, dana %1$s između %2$s - %3$s","U %n godine, dana %1$s između %2$s - %3$s","U %n godina, dana %1$s između %2$s - %3$s"],
"_In a minute on %1$s_::_In %n minutes on %1$s_" : ["U %n minuti, dana %1$s","U %n minute, dana %1$s","U %n minuta, dana %1$s"],
"_In a hour on %1$s_::_In %n hours on %1$s_" : ["U %n sat, dana %1$s","U %n sata, dana %1$s","U %n sati, dana %1$s"],
"_In a day on %1$s_::_In %n days on %1$s_" : ["U %n dan, dana %1$s","U %n dana, dana %1$s","U %n dana, dana %1$s"],
"_In a week on %1$s_::_In %n weeks on %1$s_" : ["U %n tjedan, dana %1$s","U %n tjedna, dana %1$s","U %n tjedana, dana %1$s"],
"_In a month on %1$s_::_In %n months on %1$s_" : ["U %n mjesec, dana %1$s","U %n mjeseca, dana %1$s","U %n mjeseci, dana %1$s"],
"_In a year on %1$s_::_In %n years on %1$s_" : ["U %n godini, dana %1$s","U %n godine, dana %1$s","U %n godina, dana %1$s"],
"_In a minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["U %n minutu, dana %1$s onda dana %2$s","U %n minute, dana %1$s onda dana %2$s","U %n minuta, dana %1$s onda dana %2$s"],
"_In a hour on %1$s then on %2$s_::_In %n hours on %1$s then on %2$s_" : ["U %n sat, dana %1$s onda dana %2$s","U %n sata, dana %1$s onda dana %2$s","U %n sati, dana %1$s onda dana %2$s"],
"_In a day on %1$s then on %2$s_::_In %n days on %1$s then on %2$s_" : ["U %n dan, dana %1$s onda dana %2$s","U %n dana, dana %1$s onda dana %2$s","U %n dana, dana %1$s onda dana %2$s"],
"_In a week on %1$s then on %2$s_::_In %n weeks on %1$s then on %2$s_" : ["U %n tjedan, dana %1$s onda dana %2$s","U %n tjedna, dana %1$s onda dana %2$s","U %n tjedana, dana %1$s onda dana %2$s"],
"_In a month on %1$s then on %2$s_::_In %n months on %1$s then on %2$s_" : ["U %n mjesec, dana %1$s onda dana %2$s","U %n mjeseca, dana %1$s onda dana %2$s","U %n mjeseci, dana %1$s onda dana %2$s"],
"_In a year on %1$s then on %2$s_::_In %n years on %1$s then on %2$s_" : ["U %n godini, dana %1$s onda dana %2$s","U %n godine, dana %1$s onda dana %2$s","U %n godina, dana %1$s onda dana %2$s"],
"_In a minute on %1$s then on %2$s and %3$s_::_In %n minutes on %1$s then on %2$s and %3$s_" : ["U %n minutu, dana %1$s onda dana %2$s i %3$s","U %n minute, dana %1$s onda dana %2$s i %3$s","U %n minuta, dana %1$s onda dana %2$s i %3$s"],
"_In a hour on %1$s then on %2$s and %3$s_::_In %n hours on %1$s then on %2$s and %3$s_" : ["U %n sat, dana %1$s onda dana %2$s i %3$s","U %n sata, dana %1$s onda dana %2$s i %3$s","U %n sati, dana %1$s onda dana %2$s i %3$s"],
"_In a day on %1$s then on %2$s and %3$s_::_In %n days on %1$s then on %2$s and %3$s_" : ["U %n dan, dana %1$s onda dana %2$s i %3$s","U %n dana, dana %1$s onda dana %2$s i %3$s","U %n dana, dana %1$s onda dana %2$s i %3$s"],
"_In a week on %1$s then on %2$s and %3$s_::_In %n weeks on %1$s then on %2$s and %3$s_" : ["U %n tjedan, dana %1$s onda dana %2$s i %3$s","U %n tjedna, dana %1$s onda dana %2$s i %3$s","U %n tjedana, dana %1$s onda dana %2$s i %3$s"],
"_In a month on %1$s then on %2$s and %3$s_::_In %n months on %1$s then on %2$s and %3$s_" : ["U %n mjesec, dana %1$s onda dana %2$s i %3$s","U %n mjeseca, dana %1$s onda dana %2$s i %3$s","U %n mjeseci, dana %1$s onda dana %2$s i %3$s"],
"_In a year on %1$s then on %2$s and %3$s_::_In %n years on %1$s then on %2$s and %3$s_" : ["U %n godini, dana %1$s onda dana %2$s i %3$s","U %n godine, dana %1$s onda dana %2$s i %3$s","U %n godina, dana %1$s onda dana %2$s i %3$s"],
"Could not open file: %1$s, file does seem to exist" : "Nije moguće otvoriti datoteku: %1$s, čini se da datoteka postoji",
"Could not open file: %1$s, file doesn't seem to exist" : "Nije moguće otvoriti datoteku: %1$s, čini se da datoteka ne postoji",
"No results." : "Nema rezultata.",
"Start typing." : "Započnite s pisanjem.",
"Time zone:" : "Vremenska zona:"
},
"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;");

374
apps/dav/l10n/hr.json Normal file
View File

@@ -0,0 +1,374 @@
{ "translations": {
"Calendar" : "Kalendar",
"Tasks" : "Zadaci",
"Personal" : "Osobno",
"{actor} created calendar {calendar}" : "{actor} je stvorio kalendar {calendar}",
"You created calendar {calendar}" : "Stvorili ste kalendar {calendar}",
"{actor} deleted calendar {calendar}" : "{actor} je izbrisao kalendar {calendar}",
"You deleted calendar {calendar}" : "Izbrisali ste kalendar {calendar}",
"{actor} updated calendar {calendar}" : "{actor} je ažurirao kalendar {calendar}",
"You updated calendar {calendar}" : "Ažurirali ste kalendar {calendar}",
"{actor} restored calendar {calendar}" : "{actor} je vratio kalendar {calendar}",
"You restored calendar {calendar}" : "Vratili ste kalendar {calendar}",
"You shared calendar {calendar} as public link" : "Podijelili ste kalendar {calendar} putem javne poveznice",
"You removed public link for calendar {calendar}" : "Uklonili ste javnu poveznicu na kalendar {calendar}",
"{actor} shared calendar {calendar} with you" : "{actor} dijeli kalendar {calendar} s vama",
"You shared calendar {calendar} with {user}" : "Podijelili ste kalendar {calendar} s {user}",
"{actor} shared calendar {calendar} with {user}" : "{actor} dijeli kalendar {calendar} s {user}",
"{actor} unshared calendar {calendar} from you" : "{actor} više ne dijeli kalendar {calendar} s vama",
"You unshared calendar {calendar} from {user}" : "Više ne dijelite kalendar {calendar} s {user}",
"{actor} unshared calendar {calendar} from {user}" : "{actor} više ne dijeli kalendar {calendar} s {user}",
"{actor} unshared calendar {calendar} from themselves" : "{actor} više ne dijeli kalendar {calendar} sam sa sobom",
"You shared calendar {calendar} with group {group}" : "Podijelili ste kalendar {calendar} s grupom {group}",
"{actor} shared calendar {calendar} with group {group}" : "{actor} dijeli kalendar {calendar} s grupom {group}",
"You unshared calendar {calendar} from group {group}" : "Više ne dijelite kalendar {calendar} s grupom {group}",
"{actor} unshared calendar {calendar} from group {group}" : "{actor} više ne dijeli kalendar {calendar} s grupom {group}",
"Untitled event" : "Događaj bez naslova",
"{actor} created event {event} in calendar {calendar}" : "{actor} je stvorio događaj {event} u kalendaru {calendar}",
"You created event {event} in calendar {calendar}" : "Stvorili ste događaj {event} u kalendaru {calendar}",
"{actor} deleted event {event} from calendar {calendar}" : "{actor} je izbrisao događaj {event} iz kalendara {calendar}",
"You deleted event {event} from calendar {calendar}" : "Izbrisali ste događaj {event} iz kalendara {calendar}",
"{actor} updated event {event} in calendar {calendar}" : "{actor} je ažurirao događaj {event} u kalendaru {calendar}",
"You updated event {event} in calendar {calendar}" : "Ažurirali ste događaj {event} u kalendaru {calendar}",
"{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} je premjestio događaj {event} iz kalendara {sourceCalendar} u kalendar {targetCalendar}",
"You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Premjestili ste događaj {event} iz kalendara {sourceCalendar} u kalendar {targetCalendar}",
"{actor} restored event {event} of calendar {calendar}" : "{actor} je vratio događaj {event} kalendara {calendar}",
"You restored event {event} of calendar {calendar}" : "Vratili ste događaj {event} kalendara {calendar}",
"Busy" : "Zauzeto",
"{actor} created to-do {todo} in list {calendar}" : "{actor} je stvorio zadatak {todo} u popisu {calendar}",
"You created to-do {todo} in list {calendar}" : "Stvorili ste zadatak {todo} u popisu {calendar}",
"{actor} deleted to-do {todo} from list {calendar}" : "{actor} je izbrisao zadatak {todo} iz popisa {calendar}",
"You deleted to-do {todo} from list {calendar}" : "Izbrisali ste zadatak {todo} iz popisa {calendar}",
"{actor} updated to-do {todo} in list {calendar}" : "{actor} je ažurirao zadatak {todo} u popisu {calendar}",
"You updated to-do {todo} in list {calendar}" : "Ažurirali ste zadatak {todo} u popisu {calendar}",
"{actor} solved to-do {todo} in list {calendar}" : "{actor} je riješio zadatak {todo} u popisu {calendar}",
"You solved to-do {todo} in list {calendar}" : "Riješili ste zadatak {todo} u popisu {calendar}",
"{actor} reopened to-do {todo} in list {calendar}" : "{actor} je ponovno otvorio zadatak {todo} u popisu {calendar}",
"You reopened to-do {todo} in list {calendar}" : "Ponovno ste otvorili zadatak {todo} u popisu {calendar}",
"{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} je premjestio zadatak {todo} iz popisa {sourceCalendar} u popis {targetCalendar}",
"You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Premjestili ste zadatak {todo} iz popisa {sourceCalendar} u popis {targetCalendar}",
"Calendar, contacts and tasks" : "Kalendar, kontakti i zadaci",
"A <strong>calendar</strong> was modified" : "Izmijenjen je <strong>kalendar</strong>",
"A calendar <strong>event</strong> was modified" : "Izmijenjen je <strong>događaj</strong> u kalendaru",
"A calendar <strong>to-do</strong> was modified" : "Izmijenjen je <strong>zadatak</strong> u kalendaru",
"Contact birthdays" : "Rođendani kontakata",
"Death of %s" : "Smrt %s",
"Untitled calendar" : "Kalendar bez naslova",
"Calendar:" : "Kalendar:",
"Date:" : "Datum:",
"Where:" : "Gdje:",
"Description:" : "Opis:",
"_%n year_::_%n years_" : ["%n godina","%n godina","%n godina"],
"_%n month_::_%n months_" : ["%n mjesec","%n mjeseci","%n mjeseci"],
"_%n day_::_%n days_" : ["%n dan","%n dana","%n dana"],
"_%n hour_::_%n hours_" : ["%n sat","%n sati","%n sati"],
"_%n minute_::_%n minutes_" : ["%n minute/minuta","%n minuta","%n minuta"],
"%s (in %s)" : "%s (u %s)",
"%s (%s ago)" : "%s (prije %s)",
"Calendar: %s" : "Kalendar: %s",
"Date: %s" : "Datum: %s",
"Description: %s" : "Opis: %s",
"Where: %s" : "Gdje: %s",
"%1$s via %2$s" : "%1$s putem %2$s",
"In the past on %1$s for the entire day" : "U prošlosti, dana %1$s, tijekom cijelog dana",
"_In %n minute on %1$s for the entire day_::_In %n minutes on %1$s for the entire day_" : ["Za %n minutu, dana %1$s, tijekom cijelog dana","Za %n minute, dana %1$s, tijekom cijelog dana","Za %n minuta, dana %1$s, tijekom cijelog dana"],
"_In %n hour on %1$s for the entire day_::_In %n hours on %1$s for the entire day_" : ["Za %n sat, dana %1$s, tijekom cijelog dana","Za %n sata, dana %1$s, tijekom cijelog dana","Za %n sati, dana %1$s, tijekom cijelog dana"],
"_In %n day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["Za %n dan, dana %1$s, tijekom cijelog dana","Za %n dana, dana %1$s, tijekom cijelog dana","Za %n dana, dana %1$s, tijekom cijelog dana"],
"_In %n week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["Za %n tjedan, dana %1$s, tijekom cijelog dana","Za %n tjedna, dana %1$s, tijekom cijelog dana","Za %n tjedana, dana %1$s, tijekom cijelog dana"],
"_In %n month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["Za %n mjesec, dana %1$s, tijekom cijelog dana","Za %n mjeseca, dana %1$s, tijekom cijelog dana","Za %n mjeseci, dana %1$s, tijekom cijelog dana"],
"_In %n year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["Za %n godinu, dana %1$s, tijekom cijelog dana","Za %n godine, dana %1$s, tijekom cijelog dana","Za %n godina, dana %1$s, tijekom cijelog dana"],
"In the past on %1$s between %2$s - %3$s" : "U prošlosti, dana %1$s između %2$s %3$s",
"_In %n minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["Za %n minutu, dana %1$s između %2$s %3$s","Za %n minute, dana %1$s između %2$s %3$s","Za %n minuta, dana %1$s između %2$s %3$s"],
"_In %n hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["Za %n sat, dana %1$s između %2$s %3$s","Za %n sata, dana %1$s između %2$s %3$s","Za %n sati, dana %1$s između %2$s %3$s"],
"_In %n day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["Za %n dan, dana %1$s između %2$s %3$s","Za %n dana, dana %1$s između %2$s %3$s","Za %n dana, dana %1$s između %2$s %3$s"],
"_In %n week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["Za %n tjedan, dana %1$s između %2$s %3$s","Za %n tjedna, dana %1$s između %2$s %3$s","Za %n tjedana, dana %1$s između %2$s %3$s"],
"_In %n month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["Za %n mjesec, dana %1$s između %2$s %3$s","Za %n mjeseca, dana %1$s između %2$s %3$s","Za %n mjeseci, dana %1$s između %2$s %3$s"],
"_In %n year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["Za %n godinu, dana %1$s između %2$s %3$s","Za %n godine, dana %1$s između %2$s %3$s","Za %n godina, dana %1$s između %2$s %3$s"],
"Could not generate when statement" : "Nije moguće generirati vremensku odrednicu",
"Every Day for the entire day" : "Svaki dan tijekom cijelog dana",
"Every Day for the entire day until %1$s" : "Svaki dan tijekom cijelog dana do %1$s",
"Every Day between %1$s - %2$s" : "Svaki dan između %1$s - %2$s",
"Every Day between %1$s - %2$s until %3$s" : "Svaki dan između %1$s - %2$s do %3$s",
"Every %1$d Days for the entire day" : "Svakih %1$d dana tijekom cijelog dana",
"Every %1$d Days for the entire day until %2$s" : "Svakih %1$d dana tijekom cijelog dana do %2$s",
"Every %1$d Days between %2$s - %3$s" : "Svakih%1$d dana između%2$s - %3$s",
"Every %1$d Days between %2$s - %3$s until %4$s" : "Svakih %1$d dana između %2$s - %3$s do %4$s",
"Could not generate event recurrence statement" : "Nije moguće generirati izraz za ponavljanje događaja",
"Every Week on %1$s for the entire day" : "Svaki tjedan u %1$s tijekom cijelog dana",
"Every Week on %1$s for the entire day until %2$s" : "Svaki tjedan u %1$s tokom cijelog dana do %2$s",
"Every Week on %1$s between %2$s - %3$s" : "Svaki tjedan u %1$s između %2$s - %3$s",
"Every Week on %1$s between %2$s - %3$s until %4$s" : "Svaki tjedan u %1$s između %2$s - %3$s do %4$s",
"Every %1$d Weeks on %2$s for the entire day" : "Svakih %1$d tjedana od %2$s tijekom cijelog dana",
"Every %1$d Weeks on %2$s for the entire day until %3$s" : "Svakih %1$d tjedana od %2$s tijekom cijelog dana do %3$s",
"Every %1$d Weeks on %2$s between %3$s - %4$s" : "Svakih %1$d tjedana od %2$s između %3$s - %4$s",
"Every %1$d Weeks on %2$s between %3$s - %4$s until %5$s" : "Svakih %1$d tjedana od %2$s između %3$s - %4$s do %5$s",
"Every Month on the %1$s for the entire day" : "%1$s svakog mjeseca tokom cijelog dana",
"Every Month on the %1$s for the entire day until %2$s" : "%1$s svakog mjeseca tokom cijelog dana do%2$s",
"Every Month on the %1$s between %2$s - %3$s" : "%1$s svakog mjeseca između %2$s - %3$s",
"Every Month on the %1$s between %2$s - %3$s until %4$s" : "%1$s svakog mjeseca između %2$s - %3$s do %4$s",
"Every %1$d Months on the %2$s for the entire day" : "Svakih %1$d mjeseci, %2$s tokom cijelog dana",
"Every %1$d Months on the %2$s for the entire day until %3$s" : "Svakih %1$d mjeseci, %2$s tokom cijelog dana do %3$s",
"Every %1$d Months on the %2$s between %3$s - %4$s" : "Svakih %1$d mjeseci, %2$s između %3$s - %4$s",
"Every %1$d Months on the %2$s between %3$s - %4$s until %5$s" : "Svakih %1$d mjeseci, %2$s između %3$s - %4$s do %5$s",
"Every Year in %1$s on the %2$s for the entire day" : "Svake godine, %1$s, %2$s tokom cijelog dana",
"Every Year in %1$s on the %2$s for the entire day until %3$s" : "Svake godine, %1$s, %2$s tokom cijelog dana do %3$s",
"Every Year in %1$s on the %2$s between %3$s - %4$s" : "Svake godine, %1$s, %2$s između %3$s - %4$s",
"Every Year in %1$s on the %2$s between %3$s - %4$s until %5$s" : "Svake godine, %1$s, %2$s, između %3$s - %4$s do %5$s",
"Every %1$d Years in %2$s on the %3$s for the entire day" : "Svakih %1$d godina, %2$s, na %3$s tokom cijelog dana",
"Every %1$d Years in %2$s on the %3$s for the entire day until %4$s" : "Svakih %1$d godina, %2$s, na %3$s tokom cijelog dana do %4$s",
"Every %1$d Years in %2$s on the %3$s between %4$s - %5$s" : "Svakih %1$d godina, %2$s, na %3$s između %4$s - %5$s",
"Every %1$d Years in %2$s on the %3$s between %4$s - %5$s until %6$s" : "Svakih %1$d godina, %2$s, na %3$s između %4$s - %5$s do %6$s",
"On specific dates for the entire day until %1$s" : "Na određene datume, tijekom cijelog dana do %1$s",
"On specific dates between %1$s - %2$s until %3$s" : "Na određene datume između %1$s - %2$s do %3$s",
"In the past on %1$s" : "U prošlosti, dana %1$s",
"_In %n minute on %1$s_::_In %n minutes on %1$s_" : ["U %n minutu, %1$s","U %n minute, %1$s","U %n minuta, %1$s"],
"_In %n hour on %1$s_::_In %n hours on %1$s_" : ["U %n sat, %1$s","U %n sata, %1$s","U %n sati, %1$s"],
"_In %n day on %1$s_::_In %n days on %1$s_" : ["U %n dan, %1$s","U %n dana, %1$s","U %n dana, %1$s"],
"_In %n week on %1$s_::_In %n weeks on %1$s_" : ["U %n tjedan, %1$s","U %n tjedna, %1$s","U %n tjedana, %1$s"],
"_In %n month on %1$s_::_In %n months on %1$s_" : ["U %n mjesec, %1$s","U %n mjeseca, %1$s","U %n mjeseci, %1$s"],
"_In %n year on %1$s_::_In %n years on %1$s_" : ["U %n godinu, %1$s","U %n godine, %1$s","U %n godina, %1$s"],
"In the past on %1$s then on %2$s" : "U prošlosti, dana %1$s, zatim dana %2$s",
"_In %n minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["U %n minutu u %1$s, onda u %2$s","U %n minute u %1$s, onda u %2$s","U %n minuta u %1$s, onda u %2$s"],
"_In %n hour on %1$s then on %2$s_::_In %n hours on %1$s then on %2$s_" : ["U %n sat u %1$s, onda u %2$s","U %n sata u %1$s, onda u %2$s","U %n sati u %1$s, onda u %2$s"],
"_In %n day on %1$s then on %2$s_::_In %n days on %1$s then on %2$s_" : ["U %n dan u %1$s, onda u %2$s","U %n dana u %1$s, onda u %2$s","U %n dana u %1$s, onda u %2$s"],
"_In %n week on %1$s then on %2$s_::_In %n weeks on %1$s then on %2$s_" : ["U %n tjedan u %1$s, onda u %2$s","U %n tjedna u %1$s, onda u %2$s","U %n tjedana u %1$s, onda u %2$s"],
"_In %n month on %1$s then on %2$s_::_In %n months on %1$s then on %2$s_" : ["U %n mjesec u %1$s, onda u %2$s","U %n mjeseca u %1$s, onda u %2$s","U %n mjeseci u %1$s, onda u %2$s"],
"_In %n year on %1$s then on %2$s_::_In %n years on %1$s then on %2$s_" : ["U %n godinu u %1$s, onda u %2$s","U %n godine u %1$s, onda u %2$s","U %n godina u %1$s, onda u %2$s"],
"In the past on %1$s then on %2$s and %3$s" : "U prošlosti, dana %1$s, zatim dana %2$s i %3$s",
"_In %n minute on %1$s then on %2$s and %3$s_::_In %n minutes on %1$s then on %2$s and %3$s_" : ["u %n minutu dana %1$s onda dana %2$s i %3$s","u %n minute dana %1$s onda dana %2$s i %3$s","u %n minuta dana %1$s onda dana %2$s i %3$s"],
"_In %n hour on %1$s then on %2$s and %3$s_::_In %n hours on %1$s then on %2$s and %3$s_" : ["u %n sat dana %1$s onda dana %2$s i %3$s","u %n sata dana %1$s onda dana %2$s i %3$s","u %n sati dana %1$s onda dana %2$s i %3$s"],
"_In %n day on %1$s then on %2$s and %3$s_::_In %n days on %1$s then on %2$s and %3$s_" : ["u %n dan, dana %1$s onda dana %2$s i %3$s","u %n dana, dana %1$s onda dana %2$s i %3$s","u %n dana, dana %1$s onda dana %2$s i %3$s"],
"_In %n week on %1$s then on %2$s and %3$s_::_In %n weeks on %1$s then on %2$s and %3$s_" : ["u %n tjedan, dana %1$s onda dana %2$s i %3$s","u %n tjedna, dana %1$s onda dana %2$s i %3$s","u %n tjedana, dana %1$s onda dana %2$s i %3$s"],
"_In %n month on %1$s then on %2$s and %3$s_::_In %n months on %1$s then on %2$s and %3$s_" : ["u %n mjesec, dana %1$s onda dana %2$s i %3$s","u %n mjeseca, dana %1$s onda dana %2$s i %3$s","u %n mjeseci, dana %1$s onda dana %2$s i %3$s"],
"_In %n year on %1$s then on %2$s and %3$s_::_In %n years on %1$s then on %2$s and %3$s_" : ["u %n godinu, dana %1$s onda dana %2$s i %3$s","u %n godine, dana %1$s onda dana %2$s i %3$s","u %n godina, dana %1$s onda dana %2$s i %3$s"],
"Could not generate next recurrence statement" : "Nije moguće generirati sljedeći izraz ponavljanja",
"Cancelled: %1$s" : "Otkazano: %1$s",
"\"%1$s\" has been canceled" : "„%1$s” je otkazan",
"Re: %1$s" : "Odgovor: %1 $ s",
"%1$s has accepted your invitation" : "%1$s je prihvatio/la vašu pozivnicu",
"%1$s has tentatively accepted your invitation" : "%1$s je privremeno prihvatio/la vašu pozivnicu",
"%1$s has declined your invitation" : "%1$s je odbio/la vašu pozivnicu",
"%1$s has responded to your invitation" : "%1$s je odgovorio/la na vašu pozivnicu",
"Invitation updated: %1$s" : "Pozivnica ažurirana: %1$s",
"%1$s updated the event \"%2$s\"" : "%1$s je ažurirao/la događaj \"%2$s\"",
"Invitation: %1$s" : "Pozivnica: %1$s",
"%1$s would like to invite you to \"%2$s\"" : "%1$s vas želi pozvati na „%2$s”",
"Organizer:" : "Organizator:",
"Attendees:" : "Polaznici:",
"Title:" : "Naslov:",
"When:" : "Kada:",
"Location:" : "Lokacija:",
"Link:" : "Poveznica:",
"Occurring:" : "Događa se:",
"Accept" : "Prihvati",
"Decline" : "Odbij",
"More options …" : "Više mogućnosti…",
"More options at %s" : "Više mogućnosti na %s",
"Monday" : "Ponedjeljak",
"Tuesday" : "Utorak",
"Wednesday" : "Srijeda",
"Thursday" : "Četvrtak",
"Friday" : "Petak",
"Saturday" : "Subota",
"Sunday" : "Nedjelja",
"January" : "Siječanj",
"February" : "Veljača",
"March" : "Ožujak",
"April" : "Travanj",
"May" : "Svibanj",
"June" : "Lipanj",
"July" : "Srpanj",
"August" : "Kolovoz",
"September" : "Rujan",
"October" : "Listopad",
"November" : "Studeni",
"December" : "Prosinac",
"First" : "Prvi",
"Second" : "Drugi",
"Third" : "Treći",
"Fourth" : "Četvrti",
"Fifth" : "Peti",
"Last" : "Zadnji",
"Second Last" : "Drugi od kraja",
"Third Last" : "Treći od kraja",
"Fourth Last" : "Četvrti od kraja",
"Fifth Last" : "Peti od kraja",
"Contacts" : "Kontakti",
"{actor} created address book {addressbook}" : "{actor} je stvorio adresar {addressbook}",
"You created address book {addressbook}" : "Stvorili ste adresar {addressbook}",
"{actor} deleted address book {addressbook}" : "{actor} je izbrisao adresar {addressbook}",
"You deleted address book {addressbook}" : "Izbrisali ste adresar {addressbook}",
"{actor} updated address book {addressbook}" : "{actor} je ažurirao adresar {addressbook}",
"You updated address book {addressbook}" : "Ažurirali ste adresar {addressbook}",
"{actor} shared address book {addressbook} with you" : "{actor} dijeli adresar {addressbook} s vama",
"You shared address book {addressbook} with {user}" : "Dijelite adresar {addressbook} s {user}",
"{actor} shared address book {addressbook} with {user}" : "{actor} dijeli adresar {addressbook} s {user}",
"{actor} unshared address book {addressbook} from you" : "{actor} je prestao dijeliti adresar {addressbook} s vama",
"You unshared address book {addressbook} from {user}" : "Prestali ste dijeliti adresar {addressbook} s {user}",
"{actor} unshared address book {addressbook} from {user}" : "{actor} je prestao dijeliti adresar {addressbook} s {user}",
"{actor} unshared address book {addressbook} from themselves" : "{actor} je prestao dijeliti adresar {addressbook} sa sobom",
"You shared address book {addressbook} with group {group}" : "Dijelite adresar {addressbook} s grupom {group}",
"{actor} shared address book {addressbook} with group {group}" : "{actor} dijeli adresar {addressbook} s grupom {group}",
"You unshared address book {addressbook} from group {group}" : "Prestali ste dijeliti adresar {addressbook} s grupom {group}",
"{actor} unshared address book {addressbook} from group {group}" : "{actor} je prestao dijeliti adresar {addressbook} s grupom {group}",
"{actor} created contact {card} in address book {addressbook}" : "{actor} je stvorio kontakt {card} u adresaru {addressbook}",
"You created contact {card} in address book {addressbook}" : "Stvorili ste kontakt {card} u adresaru {addressbook}",
"{actor} deleted contact {card} from address book {addressbook}" : "{actor} je izbrisao kontakt {card} iz adresara {addressbook}",
"You deleted contact {card} from address book {addressbook}" : "Izbrisali ste kontakt {card} iz adresara {addressbook}",
"{actor} updated contact {card} in address book {addressbook}" : "{actor} je ažurirao kontakt {card} u adresaru {addressbook}",
"You updated contact {card} in address book {addressbook}" : "Ažurirali ste kontakt {card} u adresaru {addressbook}",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "Izmijenjen je <strong>kontakt</strong> ili <strong>adresar</strong>",
"System address book disabled" : "Adresar sustava je onemogućen",
"The system contacts address book has been automatically disabled during upgrade. This means that the address book will no longer be available to users in the contacts app or other clients. The system contacts address book was disabled because the amount of contacts in the address book exceeded the maximum recommended number of contacts. This limit is set to prevent performance issues. You can re-enable the system address book with the following command {command}" : "Adresar sistemskih kontakata automatski je onemogućen tijekom nadogradnje. To znači da adresar više neće biti dostupan korisnicima u aplikaciji Kontakti niti u drugim klijentima. Adresar sistemskih kontakata onemogućen je jer je broj kontakata u adresaru premašio maksimalno preporučeni broj. Ovo ograničenje postavljeno je radi sprječavanja problema s performansama. Adresar sustava možete ponovno omogućiti sljedećom naredbom {command}.",
"Accounts" : "Korisnički računi",
"System address book which holds all accounts" : "Adresar sustava koji sadrži sve račune",
"File is not updatable: %1$s" : "Datoteku nije moguće ažurirati: %1$s",
"Failed to get storage for file" : "Neuspjelo dohvaćanje pohrane za datoteku",
"Could not write to final file, canceled by hook" : "Nije moguće zapisati u završnu datoteku, otkazano putem kuke",
"Could not write file contents" : "Nije moguće zapisati sadržaj datoteke",
"_%n byte_::_%n bytes_" : ["%n bajt","%n bajta","%n bajtova"],
"Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Pogreška pri kopiranju datoteke na odredišnu lokaciju (kopirano: %1$s, očekivana veličina datoteke: %2$s)",
"Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side." : "Očekivana veličina datoteke je %1$s ali je pročitano (s Nextcloud klijenta) i zapisano (u Nextcloud pohranu) %2$s. To može biti problem s mrežom na strani slanja ili problem pri zapisivanju u pohranu na strani poslužitelja.",
"Could not rename part file to final file, canceled by hook" : "Nije moguće preimenovati djelomičnu datoteku u završnu datoteku, otkazano putem kuke",
"Could not rename part file to final file" : "Nije moguće preimenovati djelomičnu datoteku u završnu datoteku",
"Failed to check file size: %1$s" : "Neuspjela provjera veličine datoteke: %1$s",
"Could not open file: %1$s (%2$d), file does seem to exist" : "Nije moguće otvoriti datoteku: %1$s (%2$d), čini se da datoteka postoji",
"Could not open file: %1$s (%2$d), file doesn't seem to exist" : "Nije moguće otvoriti datoteku: %1$s (%2$d), čini se da datoteka ne postoji",
"Encryption not ready: %1$s" : "Šifriranje nije spremno: %1$s",
"Failed to open file: %1$s" : "Neuspjelo otvaranje datoteke: %1$s",
"Failed to unlink: %1$s" : "Neuspjelo uklanjanje veze: %1$s",
"Failed to write file contents: %1$s" : "Neuspjelo zapisivanje sadržaja datoteke: %1$s",
"File not found: %1$s" : "Datoteka nije pronađena: %1$s",
"Invalid target path" : "Nevažeća odredišna putanja",
"System is in maintenance mode." : "Sustav je u načinu održavanja.",
"Upgrade needed" : "Potrebno nadograditi",
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "Vaš %s treba konfigurirati za korištenje HTTPS-a kako bi se mogli upotrebljavati CalDAV i CardDAV s operacijskim sustavom iOS/macOS.",
"Configures a CalDAV account" : "Konfigurira CalDAV račun",
"Configures a CardDAV account" : "Konfigurira CardDAV račun",
"Events" : "Događaji",
"Untitled task" : "Zadatak bez naslova",
"Completed on %s" : "Završeno na %s",
"Due on %s by %s" : "%s treba završiti do %s",
"Due on %s" : "Treba završiti do %s",
"Welcome to Nextcloud Calendar!\n\nThis is a sample event - explore the flexibility of planning with Nextcloud Calendar by making any edits you want!\n\nWith Nextcloud Calendar, you can:\n- Create, edit, and manage events effortlessly.\n- Create multiple calendars and share them with teammates, friends, or family.\n- Check availability and display your busy times to others.\n- Seamlessly integrate with apps and devices via CalDAV.\n- Customize your experience: schedule recurring events, adjust notifications and other settings." : "Dobrodošli u Nextcloud Kalendar!\n\nOvo je primjer događaja istražite fleksibilnost planiranja s Nextcloud Kalendarom tako da napravite bilo kakve izmjene koje želite!\n\nUz Nextcloud Kalendar možete:\n- Jednostavno stvarati, uređivati i upravljati događajima..\n- Stvarati više kalendara i dijeliti ih s kolegama, prijateljima ili obitelji.\n- Provjeravati dostupnost i drugima prikazivati svoja zauzeta razdoblja.\n- Neprimjetno se integrirati s aplikacijama i uređajima putem CalDAV-a.\n- Prilagoditi svoje iskustvo: zakazivati ponavljajuće događaje, prilagođavati obavijesti i druge postavke.",
"Example event - open me!" : "Primjer događaja otvori me!",
"System Address Book" : "Adresar sustava",
"The system address book contains contact information for all users in your instance." : "Adresar sustava sadrži kontaktne podatke za sve korisnike u vašoj instanci.",
"Enable System Address Book" : "Omogući adresar sustava",
"DAV system address book" : "DAV adresar sustava",
"No outstanding DAV system address book sync." : "Nema neriješene sinkronizacije DAV adresara sustava.",
"The DAV system address book sync has not run yet as your instance has more than 1000 users or because an error occurred. Please run it manually by calling \"occ dav:sync-system-addressbook\"." : "Sinkronizacija DAV adresara sustava još nije pokrenuta jer vaša instanca ima više od 1000 korisnika ili je došlo do pogreške. Pokrenite je ručno pozivanjem naredbe „occ dav:sync-system-addressbook”.",
"DAV system address book size" : "Veličina DAV adresara sustava",
"The system address book is disabled" : "Adresar sustava je onemogućen",
"The system address book is enabled, but contains more than the configured limit of %d contacts" : "Adresar sustava je omogućen, ali sadrži više od konfiguriranog ograničenja od %d kontakata",
"The system address book is enabled and contains less than the configured limit of %d contacts" : "Adresar sustava je omogućen i sadrži manje od konfiguriranog ograničenja od %d kontakata",
"WebDAV endpoint" : "WebDAV krajnja točka",
"Could not check that your web server is properly set up to allow file synchronization over WebDAV. Please check manually." : "Nije moguće provjeriti je li vaš mrežni poslužitelj ispravno postavljen za omogućavanje sinkronizacije datoteka putem WebDAV-a. Molimo provjerite ručno.",
"Your web server is not yet properly set up to allow file synchronization, because the WebDAV interface seems to be broken." : "Vaš mrežni poslužitelj nije pravilno podešen za sinkronizaciju podataka jer je sučelje protokola WebDAV neispravno.",
"Your web server is properly set up to allow file synchronization over WebDAV." : "Vaš mrežni poslužitelj je ispravno postavljen za omogućavanje sinkronizacije datoteka putem WebDAV-a.",
"Migrated calendar (%1$s)" : "Migriran kalendar (%1$s)",
"Calendars including events, details and attendees" : "Kalendari uključujući događaje, detalje i sudionike",
"Contacts and groups" : "Kontakti i grupe",
"WebDAV" : "WebDAV",
"Absence saved" : "Odsutnost je spremljena",
"Failed to save your absence settings" : "Neuspjelo spremanje postavki odsutnosti",
"Absence cleared" : "Odsutnost je uklonjena",
"Failed to clear your absence settings" : "Neuspjelo uklanjanje postavki odsutnosti",
"First day" : "Prvi dan",
"Last day (inclusive)" : "Zadnji dan (uključivo)",
"Out of office replacement (optional)" : "Zamjena za odsutnost iz ureda (neobavezno)",
"Name of the replacement" : "Ime zamjene",
"Short absence status" : "Kratki status odsutnosti",
"Long absence Message" : "Duga poruka o odsutnosti",
"Save" : "Spremi",
"Disable absence" : "Onemogući odsutnost",
"Failed to load availability" : "Neuspjelo učitavanje dostupnosti",
"Saved availability" : "Dostupnost je spremljena",
"Failed to save availability" : "Neuspjelo spremanje dostupnosti",
"to" : "do",
"Delete slot" : "Izbriši mjesto",
"No working hours set" : "Radno vrijeme nije postavljeno",
"Add slot" : "Dodaj mjesto",
"Weekdays" : "Dani u tjednu",
"Pick a start time for {dayName}" : "Odaberite početno vrijeme za {dayName}",
"Pick a end time for {dayName}" : "Odaberite završno vrijeme za {dayName}",
"Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Automatski postavi korisnički status na „Ne ometaj” izvan vremena dostupnosti kako bi se utišale sve obavijesti.",
"Cancel" : "Odustani",
"Import" : "Uvezi",
"Error while saving settings" : "Greška pri spremanju postavki",
"Contact reset successfully" : "Kontakt je uspješno resetiran",
"Error while resetting contact" : "Greška pri resetiranju kontakta",
"Contact imported successfully" : "Kontakt je uspješno uvezen",
"Error while importing contact" : "Greška pri uvozu kontakta",
"Import contact" : "Uvezi kontakt",
"Reset to default" : "Vrati na zadanu postavku",
"Import contacts" : "Uvezi kontakte",
"Importing a new .vcf file will delete the existing default contact and replace it with the new one. Do you want to continue?" : "Uvoz nove .vcf datoteke izbrisat će postojeći zadani kontakt i zamijeniti ga novim. Želite li nastaviti?",
"Failed to save example event creation setting" : "Neuspjelo spremanje postavke stvaranja primjer-događaja",
"Failed to upload the example event" : "Neuspjelo učitavanje primjer-događaja",
"Custom example event was saved successfully" : "Prilagođeni primjer događaja uspješno je spremljen",
"Failed to delete the custom example event" : "Neuspjelo brisanje prilagođenog primjer-događaja",
"Custom example event was deleted successfully" : "Prilagođeni primjer događaja uspješno je izbrisan",
"Import calendar event" : "Uvezi događaj u kalendar",
"Uploading a new event will overwrite the existing one." : "Učitavanje novog događaja prebrisat će postojeći.",
"Upload event" : "Učitaj događaj",
"Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "Također instalirajte {calendarappstoreopen}aplikaciju Kalendar{linkclose} ili {calendardocopen}povežite računalo i mobilni uređaj radi sinkroniziranja ↗{linkclose}.",
"Please make sure to properly set up {emailopen}the email server{linkclose}." : "Provjerite jeste li ispravno postavili {emailopen}poslužitelj e-pošte{linkclose}.",
"Calendar server" : "Poslužitelj kalendara",
"Send invitations to attendees" : "Pošaljite pozive sudionicima",
"Automatically generate a birthday calendar" : "Automatski generiraj kalendar rođendana",
"Birthday calendars will be generated by a background job." : "Kalendari rođendana generirat će se u pozadini.",
"Hence they will not be available immediately after enabling but will show up after some time." : "Stoga neće biti dostupni odmah nakon omogućivanja, ali će se pojaviti nakon nekog vremena.",
"Send notifications for events" : "Šalji obavijesti o događajima",
"Notifications are sent via background jobs, so these must occur often enough." : "Obavijesti se šalju putem pozadinskih zadataka koji se moraju dovoljno često izvoditi.",
"Send reminder notifications to calendar sharees as well" : "Šalji podsjetnike i osobama s kojima je kalendar podijeljen",
"Reminders are always sent to organizers and attendees." : "Podsjetnici se uvijek šalju organizatorima i sudionicima.",
"Enable notifications for events via push" : "Omogući slanje obavijesti o događajima putem push obavijesti",
"Example content" : "Primjer sadržaja",
"Example content serves to showcase the features of Nextcloud. Default content is shipped with Nextcloud, and can be replaced by custom content." : "Primjer sadržaja služi za predstavljanje mogućnosti Nextclouda. Zadani sadržaj dolazi uz Nextcloud i može se zamijeniti prilagođenim sadržajem.",
"Availability" : "Raspoloživost",
"If you configure your working hours, other people will see when you are out of office when they book a meeting." : "Ako konfigurirate svoje radno vrijeme, drugi će vidjeti kada ste izvan ureda prilikom zakazivanja sastanka.",
"Absence" : "Odsutnost",
"Configure your next absence period." : "Konfigurirajte svoje sljedeće razdoblje odsutnosti.",
"There was an error updating your attendance status." : "Došlo je do pogreške prilikom ažuriranja statusa prisutnosti.",
"Please contact the organizer directly." : "Izravno se obratite organizatoru.",
"Are you accepting the invitation?" : "Prihvaćate li poziv?",
"Tentative" : "Uvjetno",
"Your attendance was updated successfully." : "Vaša je prisutnost uspješno ažurirana.",
"_In a minute on %1$s for the entire day_::_In %n minutes on %1$s for the entire day_" : ["U %n minutu, dana %1$s tokom cijelog dana","U %n minute, dana %1$s tokom cijelog dana","U %n minuta, dana %1$s tokom cijelog dana"],
"_In a hour on %1$s for the entire day_::_In %n hours on %1$s for the entire day_" : ["U %n sat, dana %1$s tokom cijelog dana","U %n sata, dana %1$s tokom cijelog dana","U %n sati, dana %1$s tokom cijelog dana"],
"_In a day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["U %n dan, dana %1$s tokom cijelog dana","U %n dana, dana %1$s tokom cijelog dana","U %n dana, dana %1$s tokom cijelog dana"],
"_In a week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["U %n tjedana, dana %1$s tokom cijelog dana","U %n tjedna, dana %1$s tokom cijelog dana","U %n tjedana, dana %1$s tokom cijelog dana"],
"_In a month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["U %n mjesec, dana %1$s tokom cijelog dana","U %n mjeseca, dana %1$s tokom cijelog dana","U %n mjeseci, dana %1$s tokom cijelog dana"],
"_In a year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["U %n godini, dana %1$s tokom cijelog dana","U %n godine, dana %1$s tokom cijelog dana","U %n godina, dana %1$s tokom cijelog dana"],
"_In a minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["U %n minutu, dana %1$s između %2$s - %3$s","U %n minute, dana %1$s između %2$s - %3$s","U %n minuta, dana %1$s između %2$s - %3$s"],
"_In a hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["U %n sat, dana %1$s između %2$s - %3$s","U %n sata, dana %1$s između %2$s - %3$s","U %n sati, dana %1$s između %2$s - %3$s"],
"_In a day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["U %n dan, dana %1$s između %2$s - %3$s","U %n dana, dana %1$s između %2$s - %3$s","U %n dana, dana %1$s između %2$s - %3$s"],
"_In a week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["U %n tjedan, dana %1$s između %2$s - %3$s","U %n tjedna, dana %1$s između %2$s - %3$s","U %n tjedana, dana %1$s između %2$s - %3$s"],
"_In a month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["U %n mjesec, dana %1$s između %2$s - %3$s","U %n mjeseca, dana %1$s između %2$s - %3$s","U %n mjeseci, dana %1$s između %2$s - %3$s"],
"_In a year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["U %n godini, dana %1$s između %2$s - %3$s","U %n godine, dana %1$s između %2$s - %3$s","U %n godina, dana %1$s između %2$s - %3$s"],
"_In a minute on %1$s_::_In %n minutes on %1$s_" : ["U %n minuti, dana %1$s","U %n minute, dana %1$s","U %n minuta, dana %1$s"],
"_In a hour on %1$s_::_In %n hours on %1$s_" : ["U %n sat, dana %1$s","U %n sata, dana %1$s","U %n sati, dana %1$s"],
"_In a day on %1$s_::_In %n days on %1$s_" : ["U %n dan, dana %1$s","U %n dana, dana %1$s","U %n dana, dana %1$s"],
"_In a week on %1$s_::_In %n weeks on %1$s_" : ["U %n tjedan, dana %1$s","U %n tjedna, dana %1$s","U %n tjedana, dana %1$s"],
"_In a month on %1$s_::_In %n months on %1$s_" : ["U %n mjesec, dana %1$s","U %n mjeseca, dana %1$s","U %n mjeseci, dana %1$s"],
"_In a year on %1$s_::_In %n years on %1$s_" : ["U %n godini, dana %1$s","U %n godine, dana %1$s","U %n godina, dana %1$s"],
"_In a minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["U %n minutu, dana %1$s onda dana %2$s","U %n minute, dana %1$s onda dana %2$s","U %n minuta, dana %1$s onda dana %2$s"],
"_In a hour on %1$s then on %2$s_::_In %n hours on %1$s then on %2$s_" : ["U %n sat, dana %1$s onda dana %2$s","U %n sata, dana %1$s onda dana %2$s","U %n sati, dana %1$s onda dana %2$s"],
"_In a day on %1$s then on %2$s_::_In %n days on %1$s then on %2$s_" : ["U %n dan, dana %1$s onda dana %2$s","U %n dana, dana %1$s onda dana %2$s","U %n dana, dana %1$s onda dana %2$s"],
"_In a week on %1$s then on %2$s_::_In %n weeks on %1$s then on %2$s_" : ["U %n tjedan, dana %1$s onda dana %2$s","U %n tjedna, dana %1$s onda dana %2$s","U %n tjedana, dana %1$s onda dana %2$s"],
"_In a month on %1$s then on %2$s_::_In %n months on %1$s then on %2$s_" : ["U %n mjesec, dana %1$s onda dana %2$s","U %n mjeseca, dana %1$s onda dana %2$s","U %n mjeseci, dana %1$s onda dana %2$s"],
"_In a year on %1$s then on %2$s_::_In %n years on %1$s then on %2$s_" : ["U %n godini, dana %1$s onda dana %2$s","U %n godine, dana %1$s onda dana %2$s","U %n godina, dana %1$s onda dana %2$s"],
"_In a minute on %1$s then on %2$s and %3$s_::_In %n minutes on %1$s then on %2$s and %3$s_" : ["U %n minutu, dana %1$s onda dana %2$s i %3$s","U %n minute, dana %1$s onda dana %2$s i %3$s","U %n minuta, dana %1$s onda dana %2$s i %3$s"],
"_In a hour on %1$s then on %2$s and %3$s_::_In %n hours on %1$s then on %2$s and %3$s_" : ["U %n sat, dana %1$s onda dana %2$s i %3$s","U %n sata, dana %1$s onda dana %2$s i %3$s","U %n sati, dana %1$s onda dana %2$s i %3$s"],
"_In a day on %1$s then on %2$s and %3$s_::_In %n days on %1$s then on %2$s and %3$s_" : ["U %n dan, dana %1$s onda dana %2$s i %3$s","U %n dana, dana %1$s onda dana %2$s i %3$s","U %n dana, dana %1$s onda dana %2$s i %3$s"],
"_In a week on %1$s then on %2$s and %3$s_::_In %n weeks on %1$s then on %2$s and %3$s_" : ["U %n tjedan, dana %1$s onda dana %2$s i %3$s","U %n tjedna, dana %1$s onda dana %2$s i %3$s","U %n tjedana, dana %1$s onda dana %2$s i %3$s"],
"_In a month on %1$s then on %2$s and %3$s_::_In %n months on %1$s then on %2$s and %3$s_" : ["U %n mjesec, dana %1$s onda dana %2$s i %3$s","U %n mjeseca, dana %1$s onda dana %2$s i %3$s","U %n mjeseci, dana %1$s onda dana %2$s i %3$s"],
"_In a year on %1$s then on %2$s and %3$s_::_In %n years on %1$s then on %2$s and %3$s_" : ["U %n godini, dana %1$s onda dana %2$s i %3$s","U %n godine, dana %1$s onda dana %2$s i %3$s","U %n godina, dana %1$s onda dana %2$s i %3$s"],
"Could not open file: %1$s, file does seem to exist" : "Nije moguće otvoriti datoteku: %1$s, čini se da datoteka postoji",
"Could not open file: %1$s, file doesn't seem to exist" : "Nije moguće otvoriti datoteku: %1$s, čini se da datoteka ne postoji",
"No results." : "Nema rezultata.",
"Start typing." : "Započnite s pisanjem.",
"Time zone:" : "Vremenska zona:"
},"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"
}

View File

@@ -73,7 +73,19 @@ OC.L10N.register(
"Where: %s" : "場所:%s",
"%1$s via %2$s" : "%1$s に %2$s から",
"In the past on %1$s for the entire day" : "過去に%1$sで終日",
"_In %n minute on %1$s for the entire day_::_In %n minutes on %1$s for the entire day_" : ["終日%1$sの%n分"],
"_In %n hour on %1$s for the entire day_::_In %n hours on %1$s for the entire day_" : ["終日%1$sの%n時間"],
"_In %n day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["終日%1$sの%n日"],
"_In %n week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["終日%1$sの%n週間"],
"_In %n month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["終日%1$sの%nヶ月"],
"_In %n year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["終日%1$sの%n年間"],
"In the past on %1$s between %2$s - %3$s" : "過去%1$s、%2$s%3$sの間",
"_In %n minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["%2$s%3$sの間の%1$sの%n分"],
"_In %n hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["%2$s%3$sの間の%1$sの%n時間"],
"_In %n day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["%2$s%3$sの間の%1$sの%n日間"],
"_In %n week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["%2$s%3$sの間の%1$sの%n週間"],
"_In %n month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["%2$s%3$sの間の%1$sの%nヶ月"],
"_In %n year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["%2$s%3$sの間の%1$sの%n年間"],
"Could not generate when statement" : "when文を生成できませんでした",
"Every Day for the entire day" : "毎日、終日",
"Every Day for the entire day until %1$s" : "%1$sまでの終日、毎日",
@@ -111,8 +123,26 @@ OC.L10N.register(
"On specific dates for the entire day until %1$s" : "%1$sまでの特定の日付の終日",
"On specific dates between %1$s - %2$s until %3$s" : "%1$s%2$sの間、%3$sまでの特定の日付",
"In the past on %1$s" : "過去%1$s",
"_In %n minute on %1$s_::_In %n minutes on %1$s_" : ["%1$sの%n分間"],
"_In %n hour on %1$s_::_In %n hours on %1$s_" : ["%1$sの%n時間"],
"_In %n day on %1$s_::_In %n days on %1$s_" : ["%1$sの%n日間"],
"_In %n week on %1$s_::_In %n weeks on %1$s_" : ["%1$sの%n週間"],
"_In %n month on %1$s_::_In %n months on %1$s_" : ["%1$sの%nヶ月"],
"_In %n year on %1$s_::_In %n years on %1$s_" : ["%1$sの%n年間"],
"In the past on %1$s then on %2$s" : "過去%1$s、その後%2$s",
"_In %n minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["過去%1$sの%n分間、その後%2$s"],
"_In %n hour on %1$s then on %2$s_::_In %n hours on %1$s then on %2$s_" : ["過去%1$sの%n時間、その後%2$s"],
"_In %n day on %1$s then on %2$s_::_In %n days on %1$s then on %2$s_" : ["過去%1$sの%n日間、その後%2$s"],
"_In %n week on %1$s then on %2$s_::_In %n weeks on %1$s then on %2$s_" : ["過去%1$sの%n週間、その後%2$s"],
"_In %n month on %1$s then on %2$s_::_In %n months on %1$s then on %2$s_" : ["過去%1$sの%nヶ月、その後%2$s"],
"_In %n year on %1$s then on %2$s_::_In %n years on %1$s then on %2$s_" : ["過去%1$sの%n年間、その後%2$s"],
"In the past on %1$s then on %2$s and %3$s" : "過去%1$s、その後%2$sと%3$s",
"_In %n minute on %1$s then on %2$s and %3$s_::_In %n minutes on %1$s then on %2$s and %3$s_" : ["%1$sの%n分間、その後%2$sと%3$s"],
"_In %n hour on %1$s then on %2$s and %3$s_::_In %n hours on %1$s then on %2$s and %3$s_" : ["%1$sの%n時間、その後%2$sと%3$s"],
"_In %n day on %1$s then on %2$s and %3$s_::_In %n days on %1$s then on %2$s and %3$s_" : ["%1$sの%n日間、その後%2$sと%3$s"],
"_In %n week on %1$s then on %2$s and %3$s_::_In %n weeks on %1$s then on %2$s and %3$s_" : ["%1$sの%n週間、その後%2$sと%3$s"],
"_In %n month on %1$s then on %2$s and %3$s_::_In %n months on %1$s then on %2$s and %3$s_" : ["%1$sの%nヶ月、その後%2$sと%3$s"],
"_In %n year on %1$s then on %2$s and %3$s_::_In %n years on %1$s then on %2$s and %3$s_" : ["%1$sの%n年間、その後%2$sと%3$s"],
"Could not generate next recurrence statement" : "次の再帰ステートメントを生成できませんでした",
"Cancelled: %1$s" : "キャンセル: %1$s",
"\"%1$s\" has been canceled" : "%1$sはキャンセルされました",
@@ -204,6 +234,8 @@ OC.L10N.register(
"Could not rename part file to final file, canceled by hook" : "最終ファイルの名前の変更が出来なかったため、フックによりキャンセルされました",
"Could not rename part file to final file" : "最終ファイルの名前の変更が出来ませんでした",
"Failed to check file size: %1$s" : "ファイルサイズの確認に失敗: %1$s",
"Could not open file: %1$s (%2$d), file does seem to exist" : "ファイルを開けませんでした: %1$s (%2$d)、ファイルは存在するようです",
"Could not open file: %1$s (%2$d), file doesn't seem to exist" : "ファイルを開けませんでした: %1$s (%2$d)、ファイルが存在しないようです",
"Encryption not ready: %1$s" : "暗号化の準備が出来ていません: %1$s",
"Failed to open file: %1$s" : "ファイルを開くのに失敗: %1$s",
"Failed to unlink: %1$s" : "リンクの解除に失敗: %1$s",

View File

@@ -71,7 +71,19 @@
"Where: %s" : "場所:%s",
"%1$s via %2$s" : "%1$s に %2$s から",
"In the past on %1$s for the entire day" : "過去に%1$sで終日",
"_In %n minute on %1$s for the entire day_::_In %n minutes on %1$s for the entire day_" : ["終日%1$sの%n分"],
"_In %n hour on %1$s for the entire day_::_In %n hours on %1$s for the entire day_" : ["終日%1$sの%n時間"],
"_In %n day on %1$s for the entire day_::_In %n days on %1$s for the entire day_" : ["終日%1$sの%n日"],
"_In %n week on %1$s for the entire day_::_In %n weeks on %1$s for the entire day_" : ["終日%1$sの%n週間"],
"_In %n month on %1$s for the entire day_::_In %n months on %1$s for the entire day_" : ["終日%1$sの%nヶ月"],
"_In %n year on %1$s for the entire day_::_In %n years on %1$s for the entire day_" : ["終日%1$sの%n年間"],
"In the past on %1$s between %2$s - %3$s" : "過去%1$s、%2$s%3$sの間",
"_In %n minute on %1$s between %2$s - %3$s_::_In %n minutes on %1$s between %2$s - %3$s_" : ["%2$s%3$sの間の%1$sの%n分"],
"_In %n hour on %1$s between %2$s - %3$s_::_In %n hours on %1$s between %2$s - %3$s_" : ["%2$s%3$sの間の%1$sの%n時間"],
"_In %n day on %1$s between %2$s - %3$s_::_In %n days on %1$s between %2$s - %3$s_" : ["%2$s%3$sの間の%1$sの%n日間"],
"_In %n week on %1$s between %2$s - %3$s_::_In %n weeks on %1$s between %2$s - %3$s_" : ["%2$s%3$sの間の%1$sの%n週間"],
"_In %n month on %1$s between %2$s - %3$s_::_In %n months on %1$s between %2$s - %3$s_" : ["%2$s%3$sの間の%1$sの%nヶ月"],
"_In %n year on %1$s between %2$s - %3$s_::_In %n years on %1$s between %2$s - %3$s_" : ["%2$s%3$sの間の%1$sの%n年間"],
"Could not generate when statement" : "when文を生成できませんでした",
"Every Day for the entire day" : "毎日、終日",
"Every Day for the entire day until %1$s" : "%1$sまでの終日、毎日",
@@ -109,8 +121,26 @@
"On specific dates for the entire day until %1$s" : "%1$sまでの特定の日付の終日",
"On specific dates between %1$s - %2$s until %3$s" : "%1$s%2$sの間、%3$sまでの特定の日付",
"In the past on %1$s" : "過去%1$s",
"_In %n minute on %1$s_::_In %n minutes on %1$s_" : ["%1$sの%n分間"],
"_In %n hour on %1$s_::_In %n hours on %1$s_" : ["%1$sの%n時間"],
"_In %n day on %1$s_::_In %n days on %1$s_" : ["%1$sの%n日間"],
"_In %n week on %1$s_::_In %n weeks on %1$s_" : ["%1$sの%n週間"],
"_In %n month on %1$s_::_In %n months on %1$s_" : ["%1$sの%nヶ月"],
"_In %n year on %1$s_::_In %n years on %1$s_" : ["%1$sの%n年間"],
"In the past on %1$s then on %2$s" : "過去%1$s、その後%2$s",
"_In %n minute on %1$s then on %2$s_::_In %n minutes on %1$s then on %2$s_" : ["過去%1$sの%n分間、その後%2$s"],
"_In %n hour on %1$s then on %2$s_::_In %n hours on %1$s then on %2$s_" : ["過去%1$sの%n時間、その後%2$s"],
"_In %n day on %1$s then on %2$s_::_In %n days on %1$s then on %2$s_" : ["過去%1$sの%n日間、その後%2$s"],
"_In %n week on %1$s then on %2$s_::_In %n weeks on %1$s then on %2$s_" : ["過去%1$sの%n週間、その後%2$s"],
"_In %n month on %1$s then on %2$s_::_In %n months on %1$s then on %2$s_" : ["過去%1$sの%nヶ月、その後%2$s"],
"_In %n year on %1$s then on %2$s_::_In %n years on %1$s then on %2$s_" : ["過去%1$sの%n年間、その後%2$s"],
"In the past on %1$s then on %2$s and %3$s" : "過去%1$s、その後%2$sと%3$s",
"_In %n minute on %1$s then on %2$s and %3$s_::_In %n minutes on %1$s then on %2$s and %3$s_" : ["%1$sの%n分間、その後%2$sと%3$s"],
"_In %n hour on %1$s then on %2$s and %3$s_::_In %n hours on %1$s then on %2$s and %3$s_" : ["%1$sの%n時間、その後%2$sと%3$s"],
"_In %n day on %1$s then on %2$s and %3$s_::_In %n days on %1$s then on %2$s and %3$s_" : ["%1$sの%n日間、その後%2$sと%3$s"],
"_In %n week on %1$s then on %2$s and %3$s_::_In %n weeks on %1$s then on %2$s and %3$s_" : ["%1$sの%n週間、その後%2$sと%3$s"],
"_In %n month on %1$s then on %2$s and %3$s_::_In %n months on %1$s then on %2$s and %3$s_" : ["%1$sの%nヶ月、その後%2$sと%3$s"],
"_In %n year on %1$s then on %2$s and %3$s_::_In %n years on %1$s then on %2$s and %3$s_" : ["%1$sの%n年間、その後%2$sと%3$s"],
"Could not generate next recurrence statement" : "次の再帰ステートメントを生成できませんでした",
"Cancelled: %1$s" : "キャンセル: %1$s",
"\"%1$s\" has been canceled" : "%1$sはキャンセルされました",
@@ -202,6 +232,8 @@
"Could not rename part file to final file, canceled by hook" : "最終ファイルの名前の変更が出来なかったため、フックによりキャンセルされました",
"Could not rename part file to final file" : "最終ファイルの名前の変更が出来ませんでした",
"Failed to check file size: %1$s" : "ファイルサイズの確認に失敗: %1$s",
"Could not open file: %1$s (%2$d), file does seem to exist" : "ファイルを開けませんでした: %1$s (%2$d)、ファイルは存在するようです",
"Could not open file: %1$s (%2$d), file doesn't seem to exist" : "ファイルを開けませんでした: %1$s (%2$d)、ファイルが存在しないようです",
"Encryption not ready: %1$s" : "暗号化の準備が出来ていません: %1$s",
"Failed to open file: %1$s" : "ファイルを開くのに失敗: %1$s",
"Failed to unlink: %1$s" : "リンクの解除に失敗: %1$s",

View File

@@ -41,16 +41,23 @@ OC.L10N.register(
"Enable recovery key" : "Povolit záchranný klíč",
"The recovery key is an additional encryption key used to encrypt files. It is used to recover files from an account if the password is forgotten." : "Záchranný klíč je dodatečný šifrovací klíč sloužící pro šifrování souborů. Slouží k obnovení souborů z účtu, pokud dojde k zapomenutí hesla.",
"Recovery key password" : "Heslo ke klíči pro obnovu",
"Passwords fields do not match" : "Zadaná hesla se neshodují",
"Passwords fields do not match" : "Zadá hesla se neshodují",
"Repeat recovery key password" : "Zopakovat heslo záchranného klíče",
"An error occurred while updating the recovery key settings. Please try again." : "Došlo k chybě při aktualizování nastavení záchranného klíčez. Zkuste to prosím znovu.",
"Change recovery key password" : "Změnit heslo k záchrannému klíči",
"Old recovery key password" : "Staré heslo záchranného klíče",
"New recovery key password" : "Nové heslo k záchrannému klíči",
"Repeat new recovery key password" : "Zopakujte nové heslo záchranného klíče",
"An error occurred while changing the recovery key password. Please try again." : "Došlo k chybě při měnění hesla k záchrannému klíči. Zkuste to znovu.",
"Update private key password" : "Zaktualizovat heslo k soukromému klíči",
"Your private key password no longer matches your log-in password. Set your old private key password to your current log-in password." : "Heslo k vašemu soukromému klíči už neodpovídá vašemu přihlašovacímu heslu. Nastavte své původní heslo k soukromému klíči jako své stávající přihlašovací heslo.",
"If you do not remember your old password you can ask your administrator to recover your files." : "Pokud si nepamatujete své původní heslo, můžete požádat správce o obnovu vašich souborů.",
"Old log-in password" : "Původní přihlašovací heslo",
"Current log-in password" : "Stávající přihlašovací heslo",
"Update" : "Aktualizovat",
"Updating recovery keys. This can take some time…" : "Aktualizující se záchranné klíče. Toto může chvíli trvat…",
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Zapnutí této volby vám umožní znovu získat přístup k vašim zašifrovaným souborům pokud ztratíte heslo",
"Enable password recovery" : "Zapnout obnovu hesla",
"Default encryption module" : "Výchozí šifrovací modul",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikace pro šifrování je zapnuta, ale šifrovací klíče ještě nejsou inicializované. Odhlaste se a znovu se přihlaste",
"Basic encryption module" : "Základní šifrovací modul",

View File

@@ -39,16 +39,23 @@
"Enable recovery key" : "Povolit záchranný klíč",
"The recovery key is an additional encryption key used to encrypt files. It is used to recover files from an account if the password is forgotten." : "Záchranný klíč je dodatečný šifrovací klíč sloužící pro šifrování souborů. Slouží k obnovení souborů z účtu, pokud dojde k zapomenutí hesla.",
"Recovery key password" : "Heslo ke klíči pro obnovu",
"Passwords fields do not match" : "Zadaná hesla se neshodují",
"Passwords fields do not match" : "Zadá hesla se neshodují",
"Repeat recovery key password" : "Zopakovat heslo záchranného klíče",
"An error occurred while updating the recovery key settings. Please try again." : "Došlo k chybě při aktualizování nastavení záchranného klíčez. Zkuste to prosím znovu.",
"Change recovery key password" : "Změnit heslo k záchrannému klíči",
"Old recovery key password" : "Staré heslo záchranného klíče",
"New recovery key password" : "Nové heslo k záchrannému klíči",
"Repeat new recovery key password" : "Zopakujte nové heslo záchranného klíče",
"An error occurred while changing the recovery key password. Please try again." : "Došlo k chybě při měnění hesla k záchrannému klíči. Zkuste to znovu.",
"Update private key password" : "Zaktualizovat heslo k soukromému klíči",
"Your private key password no longer matches your log-in password. Set your old private key password to your current log-in password." : "Heslo k vašemu soukromému klíči už neodpovídá vašemu přihlašovacímu heslu. Nastavte své původní heslo k soukromému klíči jako své stávající přihlašovací heslo.",
"If you do not remember your old password you can ask your administrator to recover your files." : "Pokud si nepamatujete své původní heslo, můžete požádat správce o obnovu vašich souborů.",
"Old log-in password" : "Původní přihlašovací heslo",
"Current log-in password" : "Stávající přihlašovací heslo",
"Update" : "Aktualizovat",
"Updating recovery keys. This can take some time…" : "Aktualizující se záchranné klíče. Toto může chvíli trvat…",
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Zapnutí této volby vám umožní znovu získat přístup k vašim zašifrovaným souborům pokud ztratíte heslo",
"Enable password recovery" : "Zapnout obnovu hesla",
"Default encryption module" : "Výchozí šifrovací modul",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikace pro šifrování je zapnuta, ale šifrovací klíče ještě nejsou inicializované. Odhlaste se a znovu se přihlaste",
"Basic encryption module" : "Základní šifrovací modul",

View File

@@ -15,6 +15,7 @@ OC.L10N.register(
"Could not change the password. Maybe the old password was not correct." : "Ei suutnud muuta salasõna. Võib-olla on vana salasõna valesti sisestatud.",
"Recovery Key disabled" : "Taastevõti on välja lülitatud",
"Recovery Key enabled" : "Taastevõti on sisse lülitatud",
"Could not enable the recovery key, please try again or contact your administrator" : "Taastevõtme ksutuselevõtmine ei õnnestunud, palun proovi hiljem uuesti või võta ühendust serveri haldajaga",
"Could not update the private key password." : "Ei suutnud uuendada privaatvõtme salasõna.",
"The old password was not correct, please try again." : "Vana salasõna polnud õige, palun proovi uuesti.",
"The current log-in password was not correct, please try again." : "Sisselogimise senine salasõna polnud õige, palun proovi uuesti.",
@@ -38,7 +39,7 @@ OC.L10N.register(
"Enable recovery key" : "Luba taastevõtme kasutamine",
"The recovery key is an additional encryption key used to encrypt files. It is used to recover files from an account if the password is forgotten." : "Taastevõti on täiendav krüptovõti, mida kasutatakse failide krüptimisel. Kui peaksid põhilise salasõna unustama, siis saad seda failide taastamisel kasutada. Salvesta ta turvaliselt digitaalsesse salasõnalaekasse või vana kooli seifi.",
"Recovery key password" : "Taastevõtme salasõna",
"Passwords fields do not match" : "Salasõnad ei vasta",
"Passwords fields do not match" : "Salasõnad ei klapi",
"Repeat recovery key password" : "Korda taastevõtme salasõna",
"An error occurred while updating the recovery key settings. Please try again." : "Taastevõtme seadistuste muutmisel tekkis viga. Palun proovi uuesti.",
"Change recovery key password" : "Muuda taastevõtme salasõna",
@@ -54,6 +55,7 @@ OC.L10N.register(
"Update" : "Uuenda",
"Updating recovery keys. This can take some time…" : "Uuendan taastevõtmeid. Selleks võib kuluda natuke aega…",
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Valiku lubamine võimaldab salasõna kaotamise korral taastada ligipääsu krüptitud failidele",
"Enable password recovery" : "Võta salasõnade taastamine kasutusele",
"Default encryption module" : "Vaikimisi krüptimismoodul",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Krüptimisrakendus on kasutusel, kuid krüptovõtmed pole valmendatud. Palun logi välja ning uuesti sisse.",
"Basic encryption module" : "Lihtkrüptimise moodul",

View File

@@ -13,6 +13,7 @@
"Could not change the password. Maybe the old password was not correct." : "Ei suutnud muuta salasõna. Võib-olla on vana salasõna valesti sisestatud.",
"Recovery Key disabled" : "Taastevõti on välja lülitatud",
"Recovery Key enabled" : "Taastevõti on sisse lülitatud",
"Could not enable the recovery key, please try again or contact your administrator" : "Taastevõtme ksutuselevõtmine ei õnnestunud, palun proovi hiljem uuesti või võta ühendust serveri haldajaga",
"Could not update the private key password." : "Ei suutnud uuendada privaatvõtme salasõna.",
"The old password was not correct, please try again." : "Vana salasõna polnud õige, palun proovi uuesti.",
"The current log-in password was not correct, please try again." : "Sisselogimise senine salasõna polnud õige, palun proovi uuesti.",
@@ -36,7 +37,7 @@
"Enable recovery key" : "Luba taastevõtme kasutamine",
"The recovery key is an additional encryption key used to encrypt files. It is used to recover files from an account if the password is forgotten." : "Taastevõti on täiendav krüptovõti, mida kasutatakse failide krüptimisel. Kui peaksid põhilise salasõna unustama, siis saad seda failide taastamisel kasutada. Salvesta ta turvaliselt digitaalsesse salasõnalaekasse või vana kooli seifi.",
"Recovery key password" : "Taastevõtme salasõna",
"Passwords fields do not match" : "Salasõnad ei vasta",
"Passwords fields do not match" : "Salasõnad ei klapi",
"Repeat recovery key password" : "Korda taastevõtme salasõna",
"An error occurred while updating the recovery key settings. Please try again." : "Taastevõtme seadistuste muutmisel tekkis viga. Palun proovi uuesti.",
"Change recovery key password" : "Muuda taastevõtme salasõna",
@@ -52,6 +53,7 @@
"Update" : "Uuenda",
"Updating recovery keys. This can take some time…" : "Uuendan taastevõtmeid. Selleks võib kuluda natuke aega…",
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" : "Valiku lubamine võimaldab salasõna kaotamise korral taastada ligipääsu krüptitud failidele",
"Enable password recovery" : "Võta salasõnade taastamine kasutusele",
"Default encryption module" : "Vaikimisi krüptimismoodul",
"Encryption app is enabled but your keys are not initialized, please log-out and log-in again" : "Krüptimisrakendus on kasutusel, kuid krüptovõtmed pole valmendatud. Palun logi välja ning uuesti sisse.",
"Basic encryption module" : "Lihtkrüptimise moodul",

View File

@@ -35,6 +35,7 @@ OC.L10N.register(
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Non foi posíbel ler o ficheiro, probabelmente tratase dun ficheiro compartido. Pídalle ao propietario do ficheiro que volva compartir o ficheiro con Vde.",
"Default Encryption Module" : "Módulo predeterminado de cifraxe",
"Default encryption module for Nextcloud Server-side Encryption (SSE)" : "Módulo de cifraxe predeterminado para a cifraxe do lado do servidor (SSE) de Nextcloud.",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to\n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "Esta aplicación fornece a implementación de criptografía (predeterminada) para a función de cifraxe do lado do servidor (SSE) de Nextcloud.\n\n\t\t\t**Detalles da cifraxe**\n\t\t\t* **Modo de cifraxe:** AES-256-CTR (predeterminado)\n\t\t\t* **Autenticación:** HMAC-SHA256\n\n\t\t\t**Advertencias importantes**\n\t\t\t* **PERIGO:** Non desactive esta aplicación ata que todos os ficheiros estean descifrados (`occ encryption:decrypt-all`).\n\t\t\t* **ADVERTENCIA**: Para volver ao almacenamento de ficheiros non cifrados após a activación é necesario acceder á liña de ordes. A través da interface web a acción é permanente.\n\n\t\t\t**Notas para ficheiros existentes**\n\t\t\t* De xeito predeterminado, a activación do SSE non cifra os ficheiros existentes; Só se cifrarán os novos ficheiros.\n\t\t\t* Para cifrar todos os ficheiros existentes, empregue a orde `occ encryption:encrypt-all`.\n\n\t\t\t**Antes de comezar**\n\t\t\t* *Lea a documentación:** Antes de activar SSE, cifrar ficheiros existentes ou desactivar SSE, é fundamental\n\t\t\t\tler a documentación para comprender as implicacións e os procedementos axeitados para evitar a perda de datos.",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Ao activar esta opción cífranse todos os ficheiros almacenados no almacenamento principal, senón só se cifran os ficheiros do almacenamento externo.",
"Encrypt the home storage" : "Cifrar o almacenamento persoal",
"Disable recovery key" : "Desactivar a chave de recuperación",

View File

@@ -33,6 +33,7 @@
"Cannot read this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Non foi posíbel ler o ficheiro, probabelmente tratase dun ficheiro compartido. Pídalle ao propietario do ficheiro que volva compartir o ficheiro con Vde.",
"Default Encryption Module" : "Módulo predeterminado de cifraxe",
"Default encryption module for Nextcloud Server-side Encryption (SSE)" : "Módulo de cifraxe predeterminado para a cifraxe do lado do servidor (SSE) de Nextcloud.",
"This app provides the (default) cryptography implementation for Nextcloud's Server-side Encryption (SSE) feature.\n\n\t\t\t**Encryption Details**\n\t\t\t* **Cipher Mode:** AES-256-CTR (default)\n\t\t\t* **Authentication:** HMAC-SHA256\n\n\t\t\t**Important Warnings**\n\t\t\t* **DANGER:** Do not disable this application until all files have been decrypted (`occ encryption:decrypt-all`).\n\t\t\t* **WARNING**: Reverting to non-encrypted file storage after activation requires command-line access. The action is permanent via the Web UI.\"\n\n\t\t\t**Notes for Existing Files**\n\t\t\t* By default, enabling SSE does not encrypt existing files; only new files will be encrypted.\n\t\t\t* To encrypt all existing files, use the command `occ encryption:encrypt-all`.\n\n\t\t\t**Before You Begin**\n\t\t\t* **Read the Documentation:** Before you enable SSE, encrypt existing files, or disable SSE, it is critical to\n\t\t\t\tread the documentation to understand implications and the appropriate procedures to avoid data loss." : "Esta aplicación fornece a implementación de criptografía (predeterminada) para a función de cifraxe do lado do servidor (SSE) de Nextcloud.\n\n\t\t\t**Detalles da cifraxe**\n\t\t\t* **Modo de cifraxe:** AES-256-CTR (predeterminado)\n\t\t\t* **Autenticación:** HMAC-SHA256\n\n\t\t\t**Advertencias importantes**\n\t\t\t* **PERIGO:** Non desactive esta aplicación ata que todos os ficheiros estean descifrados (`occ encryption:decrypt-all`).\n\t\t\t* **ADVERTENCIA**: Para volver ao almacenamento de ficheiros non cifrados após a activación é necesario acceder á liña de ordes. A través da interface web a acción é permanente.\n\n\t\t\t**Notas para ficheiros existentes**\n\t\t\t* De xeito predeterminado, a activación do SSE non cifra os ficheiros existentes; Só se cifrarán os novos ficheiros.\n\t\t\t* Para cifrar todos os ficheiros existentes, empregue a orde `occ encryption:encrypt-all`.\n\n\t\t\t**Antes de comezar**\n\t\t\t* *Lea a documentación:** Antes de activar SSE, cifrar ficheiros existentes ou desactivar SSE, é fundamental\n\t\t\t\tler a documentación para comprender as implicacións e os procedementos axeitados para evitar a perda de datos.",
"Enabling this option encrypts all files stored on the main storage, otherwise only files on external storage will be encrypted" : "Ao activar esta opción cífranse todos os ficheiros almacenados no almacenamento principal, senón só se cifran os ficheiros do almacenamento externo.",
"Encrypt the home storage" : "Cifrar o almacenamento persoal",
"Disable recovery key" : "Desactivar a chave de recuperación",

View File

@@ -8,6 +8,8 @@ OC.L10N.register(
"Federated Share request sent, you will receive an invitation. Check your notifications." : "Poslan je zahtjev za udruženo dijeljenje i primit ćete poziv. Provjerite svoje obavijesti.",
"Couldn't establish a federated share, it looks like the server to federate with is too old (Nextcloud <= 9)." : "Nije moguće uspostaviti udruženo dijeljenje, čini se da je poslužitelj s kojim se udružuje prestar (Nextcloud <= 9).",
"It is not allowed to send federated group shares from this server." : "Nije dopušteno slanje udruženih grupnih dijeljenja s ovog poslužitelja.",
"Sharing %1$s failed, because this item is already shared with the account %2$s" : "Dijeljenje %1$s nije uspjelo jer je ova stavka već podijeljena s računom%2$s",
"Not allowed to create a federated share to the same account" : "Nije dopušteno stvaranje udruženog dijeljenja s istim računom",
"Federated shares require read permissions" : "Udružena dijeljenja zahtjevaju dopuštenja za čitanje",
"File is already shared with %s" : "Datoteka je već dijeljena s %s",
"Sharing %1$s failed, could not find %2$s, maybe the server is currently unreachable or uses a self-signed certificate." : "Dijeljenje %1$s nije uspjelo, nije bilo moguće pronaći %2$s, možda je poslužitelj trenutno nedostupan ili koristi vjerodajnicu koju je sam potpisao.",
@@ -21,21 +23,54 @@ OC.L10N.register(
"Sharing" : "Dijeljenje",
"Federated file sharing" : "Udruženo dijeljenje datoteka",
"Provide federated file sharing across servers" : "Omogućite udruženo dijeljenje datoteka između poslužitelja",
"Confirm data upload to lookup server" : "Potvrdi učitavanje podataka na poslužitelj za pretraživanje",
"When enabled, all account properties (e.g. email address) with scope visibility set to \"published\", will be automatically synced and transmitted to an external system and made available in a public, global address book." : "Kada je omogućeno, sva svojstva računa (npr. adresa e-pošte) čija je vidljivost postavljena na „objavljeno” automatski će se sinkronizirati i prenijeti u vanjski sustav te će biti dostupna u javnom, globalnom imeniku.",
"Enable data upload" : "Omogući učitavanje podataka",
"Disable upload" : "Onemogući učitavanje",
"Confirm querying lookup server" : "Potvrdi upit poslužitelju za pretraživanje",
"When enabled, the search input when creating shares will be sent to an external system that provides a public and global address book." : "Kada je omogućeno, unos za pretraživanje prilikom stvaranja dijeljenja bit će poslan u vanjski sustav koji pruža javni i globalni imenik.",
"This is used to retrieve the federated cloud ID to make federated sharing easier." : "Ovo se koristi za dohvaćanje udruženog ID-a oblaka kako bi se olakšalo udruženo dijeljenje.",
"Moreover, email addresses of users might be sent to that system in order to verify them." : "Osim toga, adrese e-pošte korisnika mogu biti poslane tom sustavu radi njihove provjere.",
"Enable querying" : "Omogući upite",
"Disable querying" : "Onemogući upite",
"Unable to update federated files sharing config" : "Nije moguće ažurirati konfiguraciju dijeljenja datoteka u udruženju",
"Adjust how people can share between servers. This includes shares between people on this server as well if they are using federated sharing." : "Prilagodite način na koji ljudi mogu dijeliti između poslužitelja. To uključuje i dijeljenja između korisnika na ovom poslužitelju ako koriste udruženo dijeljenje.",
"Allow people on this server to send shares to other servers (this option also allows WebDAV access to public shares)" : "Dopustite korisnicima na ovom poslužitelju slanje dijeljenja drugim poslužiteljima (ova opcija također omogućuje WebDAV pristup javnim dijeljenjima)",
"Allow people on this server to receive shares from other servers" : "Dopustite korisnicima na ovom poslužitelju primanje dijeljenja s drugih poslužitelja",
"Allow people on this server to send shares to groups on other servers" : "Dopustite korisnicima na ovom poslužitelju slanje dijeljenja grupama na drugim poslužiteljima",
"Allow people on this server to receive group shares from other servers" : "Dopustite korisnicima na ovom poslužitelju primanje grupnih dijeljenja s drugih poslužitelja",
"The lookup server is only available for global scale." : "Poslužitelj za pretraživanje dostupan je samo na globalnoj razini.",
"Search global and public address book for people" : "Pretraži globalni i javni adresar za osobe",
"Allow people to publish their data to a global and public address book" : "Dopustite osobama objavu svojih podataka u globalnom i javnom adresaru",
"Trusted federation" : "Pouzdano udruženje",
"Automatically accept shares from trusted federated accounts and groups by default" : "Automatski prihvaćaj dijeljenja od pouzdanih udruženih računa i grupa prema zadanim postavkama",
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Dijeli sa mnom putem mog #ID-ja udruženog oblaka Nextclouda, pogledajte {url}",
"Share with me through my #Nextcloud Federated Cloud ID" : "Dijeli sa mnom putem mog #ID-ja udruženog oblaka Nextclouda",
"Share with me via Nextcloud" : "Dijelite sa mnom putem Nextclouda",
"Cloud ID copied" : "ID oblaka kopiran",
"Copy" : "Kopirajte",
"Clipboard not available. Please copy the cloud ID manually." : "Međuspremnik nije dostupan. Molimo ručno kopirajte ID oblaka.",
"Copied!" : "Kopirano!",
"Federated Cloud" : "Udruženi oblak",
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Možete dijeliti s bilo kim tko koristi {productName} poslužitelj ili druge poslužitelje i usluge kompatibilne s Open Cloud Mesh (OCM)! Jednostavno unesite njihov ID udruženog oblaka u dijalog dijeljenja. Izgleda ovako: osoba@oblak.primjer.com",
"Your Federated Cloud ID" : "ID vašeg udruženog oblaka",
"Share it so your friends can share files with you:" : "Dijelite ga kako bi vaši prijatelji mogli dijeliti datoteke s vama:",
"Bluesky" : "Bluesky",
"Facebook" : "Facebook",
"Mastodon" : "Mastodon",
"Add to your website" : "Dodajte na svoje web-mjesto",
"Share with me via {productName}" : "Dijelite sa mnom putem {productName}",
"HTML Code:" : "HTML kod:",
"Cancel" : "Odustani",
"Add remote share" : "Dodaj udaljeno dijeljenje",
"Remote share" : "Udaljeno dijeljenje",
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Želite li dodati udaljeni udjel {name} od {owner} u {remote}?",
"Remote share password" : "Zaporka za udaljeno dijeljenje",
"Incoming share could not be processed" : "Dolazno dijeljenje nije moguće obraditi",
"Cloud ID copied to the clipboard" : "ID oblaka kopiran u međuspremnik",
"Copy to clipboard" : "Kopiraj u međuspremnik",
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Možete dijeliti sa svima koji upotrebljavaju poslužitelj Nextcloud ili druge poslužitelje i usluge kompatibilne s Open Cloud Mesh (OCM)! Samo unesite njihov Federated Cloud ID u dijaloški okvir za dijeljenje. Primjerice: osoba@cloud.example.com"
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Možete dijeliti sa svima koji upotrebljavaju poslužitelj Nextcloud ili druge poslužitelje i usluge kompatibilne s Open Cloud Mesh (OCM)! Samo unesite njihov Federated Cloud ID u dijaloški okvir za dijeljenje. Primjerice: osoba@cloud.example.com",
"X (formerly Twitter)" : "X (bivši Twitter)",
"formerly Twitter" : "bivši Twitter"
},
"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;");

View File

@@ -6,6 +6,8 @@
"Federated Share request sent, you will receive an invitation. Check your notifications." : "Poslan je zahtjev za udruženo dijeljenje i primit ćete poziv. Provjerite svoje obavijesti.",
"Couldn't establish a federated share, it looks like the server to federate with is too old (Nextcloud <= 9)." : "Nije moguće uspostaviti udruženo dijeljenje, čini se da je poslužitelj s kojim se udružuje prestar (Nextcloud <= 9).",
"It is not allowed to send federated group shares from this server." : "Nije dopušteno slanje udruženih grupnih dijeljenja s ovog poslužitelja.",
"Sharing %1$s failed, because this item is already shared with the account %2$s" : "Dijeljenje %1$s nije uspjelo jer je ova stavka već podijeljena s računom%2$s",
"Not allowed to create a federated share to the same account" : "Nije dopušteno stvaranje udruženog dijeljenja s istim računom",
"Federated shares require read permissions" : "Udružena dijeljenja zahtjevaju dopuštenja za čitanje",
"File is already shared with %s" : "Datoteka je već dijeljena s %s",
"Sharing %1$s failed, could not find %2$s, maybe the server is currently unreachable or uses a self-signed certificate." : "Dijeljenje %1$s nije uspjelo, nije bilo moguće pronaći %2$s, možda je poslužitelj trenutno nedostupan ili koristi vjerodajnicu koju je sam potpisao.",
@@ -19,21 +21,54 @@
"Sharing" : "Dijeljenje",
"Federated file sharing" : "Udruženo dijeljenje datoteka",
"Provide federated file sharing across servers" : "Omogućite udruženo dijeljenje datoteka između poslužitelja",
"Confirm data upload to lookup server" : "Potvrdi učitavanje podataka na poslužitelj za pretraživanje",
"When enabled, all account properties (e.g. email address) with scope visibility set to \"published\", will be automatically synced and transmitted to an external system and made available in a public, global address book." : "Kada je omogućeno, sva svojstva računa (npr. adresa e-pošte) čija je vidljivost postavljena na „objavljeno” automatski će se sinkronizirati i prenijeti u vanjski sustav te će biti dostupna u javnom, globalnom imeniku.",
"Enable data upload" : "Omogući učitavanje podataka",
"Disable upload" : "Onemogući učitavanje",
"Confirm querying lookup server" : "Potvrdi upit poslužitelju za pretraživanje",
"When enabled, the search input when creating shares will be sent to an external system that provides a public and global address book." : "Kada je omogućeno, unos za pretraživanje prilikom stvaranja dijeljenja bit će poslan u vanjski sustav koji pruža javni i globalni imenik.",
"This is used to retrieve the federated cloud ID to make federated sharing easier." : "Ovo se koristi za dohvaćanje udruženog ID-a oblaka kako bi se olakšalo udruženo dijeljenje.",
"Moreover, email addresses of users might be sent to that system in order to verify them." : "Osim toga, adrese e-pošte korisnika mogu biti poslane tom sustavu radi njihove provjere.",
"Enable querying" : "Omogući upite",
"Disable querying" : "Onemogući upite",
"Unable to update federated files sharing config" : "Nije moguće ažurirati konfiguraciju dijeljenja datoteka u udruženju",
"Adjust how people can share between servers. This includes shares between people on this server as well if they are using federated sharing." : "Prilagodite način na koji ljudi mogu dijeliti između poslužitelja. To uključuje i dijeljenja između korisnika na ovom poslužitelju ako koriste udruženo dijeljenje.",
"Allow people on this server to send shares to other servers (this option also allows WebDAV access to public shares)" : "Dopustite korisnicima na ovom poslužitelju slanje dijeljenja drugim poslužiteljima (ova opcija također omogućuje WebDAV pristup javnim dijeljenjima)",
"Allow people on this server to receive shares from other servers" : "Dopustite korisnicima na ovom poslužitelju primanje dijeljenja s drugih poslužitelja",
"Allow people on this server to send shares to groups on other servers" : "Dopustite korisnicima na ovom poslužitelju slanje dijeljenja grupama na drugim poslužiteljima",
"Allow people on this server to receive group shares from other servers" : "Dopustite korisnicima na ovom poslužitelju primanje grupnih dijeljenja s drugih poslužitelja",
"The lookup server is only available for global scale." : "Poslužitelj za pretraživanje dostupan je samo na globalnoj razini.",
"Search global and public address book for people" : "Pretraži globalni i javni adresar za osobe",
"Allow people to publish their data to a global and public address book" : "Dopustite osobama objavu svojih podataka u globalnom i javnom adresaru",
"Trusted federation" : "Pouzdano udruženje",
"Automatically accept shares from trusted federated accounts and groups by default" : "Automatski prihvaćaj dijeljenja od pouzdanih udruženih računa i grupa prema zadanim postavkama",
"Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Dijeli sa mnom putem mog #ID-ja udruženog oblaka Nextclouda, pogledajte {url}",
"Share with me through my #Nextcloud Federated Cloud ID" : "Dijeli sa mnom putem mog #ID-ja udruženog oblaka Nextclouda",
"Share with me via Nextcloud" : "Dijelite sa mnom putem Nextclouda",
"Cloud ID copied" : "ID oblaka kopiran",
"Copy" : "Kopirajte",
"Clipboard not available. Please copy the cloud ID manually." : "Međuspremnik nije dostupan. Molimo ručno kopirajte ID oblaka.",
"Copied!" : "Kopirano!",
"Federated Cloud" : "Udruženi oblak",
"You can share with anyone who uses a {productName} server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Možete dijeliti s bilo kim tko koristi {productName} poslužitelj ili druge poslužitelje i usluge kompatibilne s Open Cloud Mesh (OCM)! Jednostavno unesite njihov ID udruženog oblaka u dijalog dijeljenja. Izgleda ovako: osoba@oblak.primjer.com",
"Your Federated Cloud ID" : "ID vašeg udruženog oblaka",
"Share it so your friends can share files with you:" : "Dijelite ga kako bi vaši prijatelji mogli dijeliti datoteke s vama:",
"Bluesky" : "Bluesky",
"Facebook" : "Facebook",
"Mastodon" : "Mastodon",
"Add to your website" : "Dodajte na svoje web-mjesto",
"Share with me via {productName}" : "Dijelite sa mnom putem {productName}",
"HTML Code:" : "HTML kod:",
"Cancel" : "Odustani",
"Add remote share" : "Dodaj udaljeno dijeljenje",
"Remote share" : "Udaljeno dijeljenje",
"Do you want to add the remote share {name} from {owner}@{remote}?" : "Želite li dodati udaljeni udjel {name} od {owner} u {remote}?",
"Remote share password" : "Zaporka za udaljeno dijeljenje",
"Incoming share could not be processed" : "Dolazno dijeljenje nije moguće obraditi",
"Cloud ID copied to the clipboard" : "ID oblaka kopiran u međuspremnik",
"Copy to clipboard" : "Kopiraj u međuspremnik",
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Možete dijeliti sa svima koji upotrebljavaju poslužitelj Nextcloud ili druge poslužitelje i usluge kompatibilne s Open Cloud Mesh (OCM)! Samo unesite njihov Federated Cloud ID u dijaloški okvir za dijeljenje. Primjerice: osoba@cloud.example.com"
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Možete dijeliti sa svima koji upotrebljavaju poslužitelj Nextcloud ili druge poslužitelje i usluge kompatibilne s Open Cloud Mesh (OCM)! Samo unesite njihov Federated Cloud ID u dijaloški okvir za dijeljenje. Primjerice: osoba@cloud.example.com",
"X (formerly Twitter)" : "X (bivši Twitter)",
"formerly Twitter" : "bivši Twitter"
},"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"
}

View File

@@ -11,7 +11,18 @@ OC.L10N.register(
"Federation" : "Federování",
"Federation allows you to connect with other trusted servers to exchange the account directory." : "Federování umožňuje propojit s ostatními servery, kterým věříte a vyměňovat si tak adresář účtů.",
"Federation allows you to connect with other trusted servers to exchange the account directory. For example this will be used to auto-complete external accounts for federated sharing." : "Federování umožňuje propojit s ostatními servery, kterým věříte a vyměňovat si tak adresář uživatelských účtů. Používá se toho například pro automatické doplňování externích účtů při federovaném sdílení.",
"Could not add trusted server. Please try again later." : "Nebylo možné přidat důvěryhodný server. Zkuste to prosím později znovu.",
"Add trusted server" : "Přidat dúvěryhodný server",
"Server url" : "URL serveru",
"Add" : "Přidat",
"Server ok" : "Server v pořádku",
"User list was exchanged at least once successfully with the remote server." : "Seznam uživatelů byl alespoň jednou úspěšně vyměněn se vzdáleným serverem.",
"Server pending" : "Server čekající",
"Waiting for shared secret or initial user list exchange." : "Čeká se na sdílené tajemství nebo úvodní výměnu seznamu uživatelů.",
"Server access revoked" : "Přístup serveru odvolán",
"Server failure" : "Selhání serveru",
"Connection to the remote server failed or the remote server is misconfigured." : "Připojení ke vzdálenému serveru se nezdařilo nebo vzdálený server není správně nastavený.",
"Failed to delete trusted server. Please try again later." : "Nepodařilo se smazat důvěryhodný server. Zkuste to prosím později znovu.",
"Delete" : "Smazat",
"Federation allows you to connect with other trusted servers to exchange the account directory. For example this will be used to auto-complete external accounts for federated sharing. It is not necessary to add a server as trusted server in order to create a federated share." : "Federování umožňuje propojit se s ostatními servery, kterým věříte a vyměňovat si tak adresář uživatelských účtů. Používá se toho například pro automatické dokončování externích účtů při federovaném sdílení. Nicméně pro vytvoření federovaného sdílení jako takového není nezbytné přidávat server jako důvěryhodný.",
"Each server must validate the other. This process may require a few cron cycles." : "Je třeba, aby každý server ověřil ten druhý. Tento proces může vyžadovat několik cyklů plánovače.",

View File

@@ -9,7 +9,18 @@
"Federation" : "Federování",
"Federation allows you to connect with other trusted servers to exchange the account directory." : "Federování umožňuje propojit s ostatními servery, kterým věříte a vyměňovat si tak adresář účtů.",
"Federation allows you to connect with other trusted servers to exchange the account directory. For example this will be used to auto-complete external accounts for federated sharing." : "Federování umožňuje propojit s ostatními servery, kterým věříte a vyměňovat si tak adresář uživatelských účtů. Používá se toho například pro automatické doplňování externích účtů při federovaném sdílení.",
"Could not add trusted server. Please try again later." : "Nebylo možné přidat důvěryhodný server. Zkuste to prosím později znovu.",
"Add trusted server" : "Přidat dúvěryhodný server",
"Server url" : "URL serveru",
"Add" : "Přidat",
"Server ok" : "Server v pořádku",
"User list was exchanged at least once successfully with the remote server." : "Seznam uživatelů byl alespoň jednou úspěšně vyměněn se vzdáleným serverem.",
"Server pending" : "Server čekající",
"Waiting for shared secret or initial user list exchange." : "Čeká se na sdílené tajemství nebo úvodní výměnu seznamu uživatelů.",
"Server access revoked" : "Přístup serveru odvolán",
"Server failure" : "Selhání serveru",
"Connection to the remote server failed or the remote server is misconfigured." : "Připojení ke vzdálenému serveru se nezdařilo nebo vzdálený server není správně nastavený.",
"Failed to delete trusted server. Please try again later." : "Nepodařilo se smazat důvěryhodný server. Zkuste to prosím později znovu.",
"Delete" : "Smazat",
"Federation allows you to connect with other trusted servers to exchange the account directory. For example this will be used to auto-complete external accounts for federated sharing. It is not necessary to add a server as trusted server in order to create a federated share." : "Federování umožňuje propojit se s ostatními servery, kterým věříte a vyměňovat si tak adresář uživatelských účtů. Používá se toho například pro automatické dokončování externích účtů při federovaném sdílení. Nicméně pro vytvoření federovaného sdílení jako takového není nezbytné přidávat server jako důvěryhodný.",
"Each server must validate the other. This process may require a few cron cycles." : "Je třeba, aby každý server ověřil ten druhý. Tento proces může vyžadovat několik cyklů plánovače.",

View File

@@ -0,0 +1,33 @@
OC.L10N.register(
"federation",
{
"Added to the list of trusted servers" : "Dodano na popis pouzdanih poslužitelja",
"No server found with ID: %s" : "Nije pronađen poslužitelj s ID: %s",
"Could not remove server" : "Poslužitelj nije uklonjen",
"Server is already in the list of trusted servers." : "Poslužitelj se već nalazi na popisu pouzdanih poslužitelja.",
"No server to federate with found" : "Nije pronađen nijedan poslužitelj za udruživanje",
"Could not add server" : "Poslužitelj nije dodan",
"Trusted servers" : "Pouzdani poslužitelji",
"Federation" : "Udruženje",
"Federation allows you to connect with other trusted servers to exchange the account directory." : "Udruženje vam omogućuje povezivanje s drugim pouzdanim poslužiteljima i razmjenu korisničkih imenika.",
"Federation allows you to connect with other trusted servers to exchange the account directory. For example this will be used to auto-complete external accounts for federated sharing." : "Udruženje vam omogućuje povezivanje s drugim pouzdanim poslužiteljima i razmjenu korisničkih imenika. Primjerice, može se koristiti za automatsko dovršavanje imena vanjskih korisnika za udruženo dijeljenje.",
"Could not add trusted server. Please try again later." : "Pouzdani poslužitelj nije dodan. Pokušajte ponovno kasnije.",
"Add trusted server" : "Dodaj pouzdani poslužitelj",
"Server url" : "URL poslužitelja",
"Add" : "Dodaj",
"Server ok" : "Poslužitelj OK",
"User list was exchanged at least once successfully with the remote server." : "Popis korisnika je barem jednom uspješno razmijenjen s udaljenim poslužiteljem.",
"Server pending" : "Poslužitelj na čekanju",
"Waiting for shared secret or initial user list exchange." : "Čeka se dijeljena tajna ili početna razmjena popisa korisnika.",
"Server access revoked" : "Pristup poslužitelju opozvan",
"Server failure" : "Neuspjeh poslužitelja",
"Connection to the remote server failed or the remote server is misconfigured." : "Povezivanje s udaljenim poslužiteljem nije uspjelo ili je udaljeni poslužitelj nepravilno konfiguriran.",
"Failed to delete trusted server. Please try again later." : "Neuspjelo brisanje pouzdanog poslužitelja. Pokušajte ponovo kasnije.",
"Delete" : "Izbriši",
"Federation allows you to connect with other trusted servers to exchange the account directory. For example this will be used to auto-complete external accounts for federated sharing. It is not necessary to add a server as trusted server in order to create a federated share." : "Udruženje vam omogućuje povezivanje s drugim pouzdanim poslužiteljima i razmjenu korisničkih imenika. Primjerice, može se upotrijebiti za automatsko dovršavanje imena vanjskih korisnika za udruženo dijeljenje. Za stvaranje udruženog dijeljenja nije potrebno dodati poslužitelj kao pouzdani poslužitelj.",
"Each server must validate the other. This process may require a few cron cycles." : "Svaki poslužitelj mora potvrditi drugog. Ovaj proces može zahtijevati nekoliko cron ciklusa.",
"External documentation for Federated Cloud Sharing" : "Vanjska dokumentacija za udruženo dijeljenje u oblaku",
"+ Add trusted server" : "+ Dodaj pouzdani poslužitelj",
"Trusted server" : "Pouzdan poslužitelj"
},
"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;");

View File

@@ -0,0 +1,31 @@
{ "translations": {
"Added to the list of trusted servers" : "Dodano na popis pouzdanih poslužitelja",
"No server found with ID: %s" : "Nije pronađen poslužitelj s ID: %s",
"Could not remove server" : "Poslužitelj nije uklonjen",
"Server is already in the list of trusted servers." : "Poslužitelj se već nalazi na popisu pouzdanih poslužitelja.",
"No server to federate with found" : "Nije pronađen nijedan poslužitelj za udruživanje",
"Could not add server" : "Poslužitelj nije dodan",
"Trusted servers" : "Pouzdani poslužitelji",
"Federation" : "Udruženje",
"Federation allows you to connect with other trusted servers to exchange the account directory." : "Udruženje vam omogućuje povezivanje s drugim pouzdanim poslužiteljima i razmjenu korisničkih imenika.",
"Federation allows you to connect with other trusted servers to exchange the account directory. For example this will be used to auto-complete external accounts for federated sharing." : "Udruženje vam omogućuje povezivanje s drugim pouzdanim poslužiteljima i razmjenu korisničkih imenika. Primjerice, može se koristiti za automatsko dovršavanje imena vanjskih korisnika za udruženo dijeljenje.",
"Could not add trusted server. Please try again later." : "Pouzdani poslužitelj nije dodan. Pokušajte ponovno kasnije.",
"Add trusted server" : "Dodaj pouzdani poslužitelj",
"Server url" : "URL poslužitelja",
"Add" : "Dodaj",
"Server ok" : "Poslužitelj OK",
"User list was exchanged at least once successfully with the remote server." : "Popis korisnika je barem jednom uspješno razmijenjen s udaljenim poslužiteljem.",
"Server pending" : "Poslužitelj na čekanju",
"Waiting for shared secret or initial user list exchange." : "Čeka se dijeljena tajna ili početna razmjena popisa korisnika.",
"Server access revoked" : "Pristup poslužitelju opozvan",
"Server failure" : "Neuspjeh poslužitelja",
"Connection to the remote server failed or the remote server is misconfigured." : "Povezivanje s udaljenim poslužiteljem nije uspjelo ili je udaljeni poslužitelj nepravilno konfiguriran.",
"Failed to delete trusted server. Please try again later." : "Neuspjelo brisanje pouzdanog poslužitelja. Pokušajte ponovo kasnije.",
"Delete" : "Izbriši",
"Federation allows you to connect with other trusted servers to exchange the account directory. For example this will be used to auto-complete external accounts for federated sharing. It is not necessary to add a server as trusted server in order to create a federated share." : "Udruženje vam omogućuje povezivanje s drugim pouzdanim poslužiteljima i razmjenu korisničkih imenika. Primjerice, može se upotrijebiti za automatsko dovršavanje imena vanjskih korisnika za udruženo dijeljenje. Za stvaranje udruženog dijeljenja nije potrebno dodati poslužitelj kao pouzdani poslužitelj.",
"Each server must validate the other. This process may require a few cron cycles." : "Svaki poslužitelj mora potvrditi drugog. Ovaj proces može zahtijevati nekoliko cron ciklusa.",
"External documentation for Federated Cloud Sharing" : "Vanjska dokumentacija za udruženo dijeljenje u oblaku",
"+ Add trusted server" : "+ Dodaj pouzdani poslužitelj",
"Trusted server" : "Pouzdan poslužitelj"
},"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"
}

View File

@@ -11,7 +11,18 @@ OC.L10N.register(
"Federation" : "連携",
"Federation allows you to connect with other trusted servers to exchange the account directory." : "フェデレーションは、信頼できる他のサーバーと接続し、アカウントリストを交換することを可能にします。",
"Federation allows you to connect with other trusted servers to exchange the account directory. For example this will be used to auto-complete external accounts for federated sharing." : "フェデレーションでは他の信頼済サーバーとアカウントリストをやり取りすること許可します。例えば、フェデレーション共有時に他のサーバーのアカウントIDを自動補完します。",
"Could not add trusted server. Please try again later." : "信頼できるサーバーを追加できませんでした。もう一度試してください。",
"Add trusted server" : "信頼できるサーバーを追加",
"Server url" : "サーバーURL",
"Add" : "追加",
"Server ok" : "サーバーOK",
"User list was exchanged at least once successfully with the remote server." : "ユーザーリストは少なくとも一度、リモートサーバーと正常に交換されました。",
"Server pending" : "サーバー保留中",
"Waiting for shared secret or initial user list exchange." : "共有シークレットまたは初期ユーザーリストの交換を待っています。",
"Server access revoked" : "サーバーアクセスが取り消されました",
"Server failure" : "サーバー障害",
"Connection to the remote server failed or the remote server is misconfigured." : "リモートサーバーへの接続に失敗したか、リモートサーバーの設定に誤りがあります。",
"Failed to delete trusted server. Please try again later." : "信頼済みサーバーの削除に失敗しました。もう一度試してください。",
"Delete" : "削除",
"Federation allows you to connect with other trusted servers to exchange the account directory. For example this will be used to auto-complete external accounts for federated sharing. It is not necessary to add a server as trusted server in order to create a federated share." : "Nextcloud連携では、他の信頼できるサーバーと接続して、アカウントリストをやりとりすることができます。例えば、これにより他のサーバーのアカウントがフェデレーション共有の時に自動的に補完されます。フェデレーション共有を行うときには、信頼できるサーバーとして追加する必要はありません。",
"Each server must validate the other. This process may require a few cron cycles." : "各サーバーは他のサーバーを検証しなければならない。このプロセスには数サイクルのcronが必要です。",

View File

@@ -9,7 +9,18 @@
"Federation" : "連携",
"Federation allows you to connect with other trusted servers to exchange the account directory." : "フェデレーションは、信頼できる他のサーバーと接続し、アカウントリストを交換することを可能にします。",
"Federation allows you to connect with other trusted servers to exchange the account directory. For example this will be used to auto-complete external accounts for federated sharing." : "フェデレーションでは他の信頼済サーバーとアカウントリストをやり取りすること許可します。例えば、フェデレーション共有時に他のサーバーのアカウントIDを自動補完します。",
"Could not add trusted server. Please try again later." : "信頼できるサーバーを追加できませんでした。もう一度試してください。",
"Add trusted server" : "信頼できるサーバーを追加",
"Server url" : "サーバーURL",
"Add" : "追加",
"Server ok" : "サーバーOK",
"User list was exchanged at least once successfully with the remote server." : "ユーザーリストは少なくとも一度、リモートサーバーと正常に交換されました。",
"Server pending" : "サーバー保留中",
"Waiting for shared secret or initial user list exchange." : "共有シークレットまたは初期ユーザーリストの交換を待っています。",
"Server access revoked" : "サーバーアクセスが取り消されました",
"Server failure" : "サーバー障害",
"Connection to the remote server failed or the remote server is misconfigured." : "リモートサーバーへの接続に失敗したか、リモートサーバーの設定に誤りがあります。",
"Failed to delete trusted server. Please try again later." : "信頼済みサーバーの削除に失敗しました。もう一度試してください。",
"Delete" : "削除",
"Federation allows you to connect with other trusted servers to exchange the account directory. For example this will be used to auto-complete external accounts for federated sharing. It is not necessary to add a server as trusted server in order to create a federated share." : "Nextcloud連携では、他の信頼できるサーバーと接続して、アカウントリストをやりとりすることができます。例えば、これにより他のサーバーのアカウントがフェデレーション共有の時に自動的に補完されます。フェデレーション共有を行うときには、信頼できるサーバーとして追加する必要はありません。",
"Each server must validate the other. This process may require a few cron cycles." : "各サーバーは他のサーバーを検証しなければならない。このプロセスには数サイクルのcronが必要です。",

View File

@@ -163,7 +163,10 @@ class OCSAuthAPIController extends OCSController {
}
protected function isValidToken(string $url, string $token): bool {
if ($url === '' || $token === '') {
return false;
}
$storedToken = $this->dbHandler->getToken($url);
return hash_equals($storedToken, $token);
return $storedToken !== '' && hash_equals($storedToken, $token);
}
}

View File

@@ -110,28 +110,24 @@ class OCSAuthAPIControllerTest extends TestCase {
$token = 'token';
/** @var OCSAuthAPIController&MockObject $ocsAuthApi */
$ocsAuthApi = $this->getMockBuilder(OCSAuthAPIController::class)
->setConstructorArgs(
[
'federation',
$this->request,
$this->secureRandom,
$this->jobList,
$this->trustedServers,
$this->dbHandler,
$this->logger,
$this->timeFactory,
$this->throttler
]
)
->onlyMethods(['isValidToken'])
->getMock();
$ocsAuthApi = new OCSAuthAPIController(
'federation',
$this->request,
$this->secureRandom,
$this->jobList,
$this->trustedServers,
$this->dbHandler,
$this->logger,
$this->timeFactory,
$this->throttler,
);
$this->trustedServers
->expects($this->any())
->method('isTrustedServer')->with($url)->willReturn($isTrustedServer);
$ocsAuthApi->expects($this->any())
->method('isValidToken')->with($url, $token)->willReturn($isValidToken);
$this->dbHandler->method('getToken')
->with($url)
->willReturn($isValidToken ? $token : 'not $token');
if ($ok) {
$this->secureRandom->expects($this->once())->method('generate')->with(32)

View File

@@ -333,7 +333,7 @@ OC.L10N.register(
"Open online" : "Otevřít online",
"Rename" : "Přejmenovat",
"Details" : "Podrobnosti",
"Open the details sidebar" : "Otevřít postranní panel detailů",
"Open the details sidebar" : "Otevřít postranní panel podrobností",
"Unfavorite" : "Odebrat z oblíbených",
"View in folder" : "Zobrazit ve složce",
"Type" : "Typ",

View File

@@ -331,7 +331,7 @@
"Open online" : "Otevřít online",
"Rename" : "Přejmenovat",
"Details" : "Podrobnosti",
"Open the details sidebar" : "Otevřít postranní panel detailů",
"Open the details sidebar" : "Otevřít postranní panel podrobností",
"Unfavorite" : "Odebrat z oblíbených",
"View in folder" : "Zobrazit ve složce",
"Type" : "Typ",

View File

@@ -110,6 +110,7 @@ OC.L10N.register(
"Last 30 days" : "30 derniers jours",
"This year ({year})" : "Cette année ({year})",
"Last year ({year})" : "L'année dernière ({year})",
"Custom range" : "Plage personnalisée",
"Custom date range" : "Plage de dates personnalisée",
"Search everywhere" : "Rechercher partout",
"Documents" : "Documents",
@@ -121,6 +122,7 @@ OC.L10N.register(
"Images" : "Images",
"Videos" : "Vidéos",
"Filters" : "Filtres",
"Back to filters" : "Retour aux filtres",
"Appearance" : "Apparence",
"Show hidden files" : "Montrer les fichiers masqués",
"Show file type column" : "Afficher la colonne du type de fichier",
@@ -331,6 +333,7 @@ OC.L10N.register(
"Open online" : "Ouvrir en ligne",
"Rename" : "Renommer",
"Details" : "Détails",
"Open the details sidebar" : "Ouvrir la barre latéral des détails",
"Unfavorite" : "Retirer des favoris",
"View in folder" : "Afficher dans le dossier",
"Type" : "Type",
@@ -340,6 +343,7 @@ OC.L10N.register(
"Templates" : "Modèles",
"New template folder" : "Nouveau modèle de dossier",
"In folder" : "Dans le dossier",
"Pick folder to search in" : "Choisir le dossier pour la recherche",
"Search in all files" : "Rechercher dans tous les fichiers",
"Search in folder: {folder}" : "Rechercher dans le dossier : {folder}",
"One of the dropped files could not be processed" : "L'un des fichiers déposés n'a pas pu être traité",

View File

@@ -108,6 +108,7 @@
"Last 30 days" : "30 derniers jours",
"This year ({year})" : "Cette année ({year})",
"Last year ({year})" : "L'année dernière ({year})",
"Custom range" : "Plage personnalisée",
"Custom date range" : "Plage de dates personnalisée",
"Search everywhere" : "Rechercher partout",
"Documents" : "Documents",
@@ -119,6 +120,7 @@
"Images" : "Images",
"Videos" : "Vidéos",
"Filters" : "Filtres",
"Back to filters" : "Retour aux filtres",
"Appearance" : "Apparence",
"Show hidden files" : "Montrer les fichiers masqués",
"Show file type column" : "Afficher la colonne du type de fichier",
@@ -329,6 +331,7 @@
"Open online" : "Ouvrir en ligne",
"Rename" : "Renommer",
"Details" : "Détails",
"Open the details sidebar" : "Ouvrir la barre latéral des détails",
"Unfavorite" : "Retirer des favoris",
"View in folder" : "Afficher dans le dossier",
"Type" : "Type",
@@ -338,6 +341,7 @@
"Templates" : "Modèles",
"New template folder" : "Nouveau modèle de dossier",
"In folder" : "Dans le dossier",
"Pick folder to search in" : "Choisir le dossier pour la recherche",
"Search in all files" : "Rechercher dans tous les fichiers",
"Search in folder: {folder}" : "Rechercher dans le dossier : {folder}",
"One of the dropped files could not be processed" : "L'un des fichiers déposés n'a pas pu être traité",

View File

@@ -79,6 +79,7 @@ OC.L10N.register(
"Go to the \"{dir}\" directory" : "Vaia ao directorio «{dir}».",
"Current directory path" : "Ruta do directorio actual",
"Share" : "Compartir",
"Reload content" : "Recargar o contido",
"Your have used your space quota and cannot upload files anymore" : "Vde. usou a súa cota de espazo e xa non pode enviar ningún ficheiro más",
"You do not have permission to upload or create files here." : "Non ten permiso para enviar ou crear ficheiros aquí.",
"Drag and drop files here to upload" : "Arrastre e solte os ficheiros aquí para envialos",
@@ -109,6 +110,7 @@ OC.L10N.register(
"Last 30 days" : "Últimos 30 días",
"This year ({year})" : "Este ano ({year})",
"Last year ({year})" : "O ano pasado ({year})",
"Custom range" : "Intervalo personalizado",
"Custom date range" : "Intervalo de datas personalizado",
"Search everywhere" : "Buscar en todos os sitios",
"Documents" : "Documentos",
@@ -120,6 +122,7 @@ OC.L10N.register(
"Images" : "Imaxes",
"Videos" : "Vídeos",
"Filters" : "Filtros",
"Back to filters" : "Volver aos filtros",
"Appearance" : "Aparencia",
"Show hidden files" : "Amosar os ficheiros agochados",
"Show file type column" : "Amosar a columna de tipo de ficheiro",
@@ -242,6 +245,7 @@ OC.L10N.register(
"Error during upload: {message}" : "Produciuse un erro durante o envío: {message}",
"Error during upload, status code {status}" : "Produciuse un erro durante o envío, código de estado {status}",
"Unknown error during upload" : "Produciuse un erro descoñecido durante o envío",
"File list is reloading" : "Estase a cargar de novo o ficheiro",
"Loading current folder" : "Cargando o cartafol actual",
"Retry" : "Volver tentar",
"No files in here" : "Aquí non hai ficheiros",
@@ -329,6 +333,7 @@ OC.L10N.register(
"Open online" : "Abrir en liña",
"Rename" : "Cambiar o nome",
"Details" : "Detalles",
"Open the details sidebar" : "Abrir a barra lateral de detalles",
"Unfavorite" : "Retirar de favoritos",
"View in folder" : "Ver no cartafol",
"Type" : "Escribir",
@@ -338,6 +343,7 @@ OC.L10N.register(
"Templates" : "Modelos",
"New template folder" : "Novo cartafol de modelos",
"In folder" : "No cartafol",
"Pick folder to search in" : "Escolla o cartafol no que buscar",
"Search in all files" : "Buscar en todos os ficheiros",
"Search in folder: {folder}" : "Buscar no cartafol: {folder}",
"One of the dropped files could not be processed" : "Non foi posíbel procesar un dos ficheiros arrastrados",

View File

@@ -77,6 +77,7 @@
"Go to the \"{dir}\" directory" : "Vaia ao directorio «{dir}».",
"Current directory path" : "Ruta do directorio actual",
"Share" : "Compartir",
"Reload content" : "Recargar o contido",
"Your have used your space quota and cannot upload files anymore" : "Vde. usou a súa cota de espazo e xa non pode enviar ningún ficheiro más",
"You do not have permission to upload or create files here." : "Non ten permiso para enviar ou crear ficheiros aquí.",
"Drag and drop files here to upload" : "Arrastre e solte os ficheiros aquí para envialos",
@@ -107,6 +108,7 @@
"Last 30 days" : "Últimos 30 días",
"This year ({year})" : "Este ano ({year})",
"Last year ({year})" : "O ano pasado ({year})",
"Custom range" : "Intervalo personalizado",
"Custom date range" : "Intervalo de datas personalizado",
"Search everywhere" : "Buscar en todos os sitios",
"Documents" : "Documentos",
@@ -118,6 +120,7 @@
"Images" : "Imaxes",
"Videos" : "Vídeos",
"Filters" : "Filtros",
"Back to filters" : "Volver aos filtros",
"Appearance" : "Aparencia",
"Show hidden files" : "Amosar os ficheiros agochados",
"Show file type column" : "Amosar a columna de tipo de ficheiro",
@@ -240,6 +243,7 @@
"Error during upload: {message}" : "Produciuse un erro durante o envío: {message}",
"Error during upload, status code {status}" : "Produciuse un erro durante o envío, código de estado {status}",
"Unknown error during upload" : "Produciuse un erro descoñecido durante o envío",
"File list is reloading" : "Estase a cargar de novo o ficheiro",
"Loading current folder" : "Cargando o cartafol actual",
"Retry" : "Volver tentar",
"No files in here" : "Aquí non hai ficheiros",
@@ -327,6 +331,7 @@
"Open online" : "Abrir en liña",
"Rename" : "Cambiar o nome",
"Details" : "Detalles",
"Open the details sidebar" : "Abrir a barra lateral de detalles",
"Unfavorite" : "Retirar de favoritos",
"View in folder" : "Ver no cartafol",
"Type" : "Escribir",
@@ -336,6 +341,7 @@
"Templates" : "Modelos",
"New template folder" : "Novo cartafol de modelos",
"In folder" : "No cartafol",
"Pick folder to search in" : "Escolla o cartafol no que buscar",
"Search in all files" : "Buscar en todos os ficheiros",
"Search in folder: {folder}" : "Buscar no cartafol: {folder}",
"One of the dropped files could not be processed" : "Non foi posíbel procesar un dos ficheiros arrastrados",

View File

@@ -237,7 +237,7 @@ OC.L10N.register(
"Choose {file}" : "Odaberi {file}",
"Files settings" : "Postavke datoteka",
"Switch to list view" : "Prebacite na prikaz popisa",
"Switch to grid view" : "Prebacite se na prikaz mreže",
"Switch to grid view" : "Prebacite se na prikaz rešetke",
"The file could not be found" : "Datoteka ne postoji",
"Upload was cancelled by user" : "Korisnik je prekinuo prilaganje",
"Not enough free space" : "Nema dovoljno slobodnog prostora",
@@ -432,7 +432,7 @@ OC.L10N.register(
"Navigate to the file below" : "Idi na donju datoteku",
"Navigate to the file on the left (in grid mode)" : "Idi na datoteku ulijevo (u prikazu mreže)",
"Navigate to the file on the right (in grid mode)" : "Idi na datoteku udesno (u prikazu mreže)",
"Toggle the grid view" : "Uključi/isključi prikaz mreže",
"Toggle the grid view" : "Uključi/isključi prikaz rešetke",
"Open the sidebar for a file" : "Otvori bočni izbornik za datoteku",
"You" : "Vi",
"Shared multiple times with different people" : "Podijeljeno više puta s više ljudi",

View File

@@ -235,7 +235,7 @@
"Choose {file}" : "Odaberi {file}",
"Files settings" : "Postavke datoteka",
"Switch to list view" : "Prebacite na prikaz popisa",
"Switch to grid view" : "Prebacite se na prikaz mreže",
"Switch to grid view" : "Prebacite se na prikaz rešetke",
"The file could not be found" : "Datoteka ne postoji",
"Upload was cancelled by user" : "Korisnik je prekinuo prilaganje",
"Not enough free space" : "Nema dovoljno slobodnog prostora",
@@ -430,7 +430,7 @@
"Navigate to the file below" : "Idi na donju datoteku",
"Navigate to the file on the left (in grid mode)" : "Idi na datoteku ulijevo (u prikazu mreže)",
"Navigate to the file on the right (in grid mode)" : "Idi na datoteku udesno (u prikazu mreže)",
"Toggle the grid view" : "Uključi/isključi prikaz mreže",
"Toggle the grid view" : "Uključi/isključi prikaz rešetke",
"Open the sidebar for a file" : "Otvori bočni izbornik za datoteku",
"You" : "Vi",
"Shared multiple times with different people" : "Podijeljeno više puta s više ljudi",

View File

@@ -79,6 +79,7 @@ OC.L10N.register(
"Go to the \"{dir}\" directory" : "\"{dir}\" ディレクトリに移動する",
"Current directory path" : "現在のディレクトリパス",
"Share" : "共有",
"Reload content" : "コンテンツを再読み込み",
"Your have used your space quota and cannot upload files anymore" : "あなたのクォータ容量を使い果たし、ファイルをアップロードできなくなりました。",
"You do not have permission to upload or create files here." : "ここにファイルをアップロードまたは作成する権限がありません。",
"Drag and drop files here to upload" : "ここにファイルをドラッグ&ドロップしてアップロードする",
@@ -109,6 +110,7 @@ OC.L10N.register(
"Last 30 days" : "30日以内",
"This year ({year})" : "今年 ({year})",
"Last year ({year})" : "去年 ({year})",
"Custom range" : "カスタム範囲",
"Custom date range" : "カスタム日付の範囲",
"Search everywhere" : "あらゆる場所を検索",
"Documents" : "ドキュメント",
@@ -120,6 +122,7 @@ OC.L10N.register(
"Images" : "画像",
"Videos" : "動画",
"Filters" : "フィルター",
"Back to filters" : "フィルターに戻る",
"Appearance" : "表示",
"Show hidden files" : "隠しファイルを表示",
"Show file type column" : "ファイルの種類のカラムを表示する",
@@ -128,6 +131,7 @@ OC.L10N.register(
"General" : "一般",
"Sort favorites first" : "お気に入りを最初に並べる",
"Sort folders before files" : "ファイルよりもフォルダを先に並べ替えます",
"Enable folder tree view" : "フォルダーツリー表示を有効にする",
"Default view" : "デフォルト表示",
"All files" : "すべてのファイル",
"Personal files" : "個人ファイル",
@@ -150,7 +154,10 @@ OC.L10N.register(
"Show those shortcuts" : "これらのショートカットを表示する",
"Warnings" : "警告",
"Warn before changing a file extension" : "ファイル拡張子を変更する前に警告する",
"Warn before deleting a file" : "ファイルを削除する前に警告する",
"WebDAV URL" : "WebDAV URL",
"Create an app password" : "アプリパスワードを作成する",
"Required for WebDAV authentication because Two-Factor Authentication is enabled for this account." : "このアカウントでは二要素認証が有効化されているため、WebDAV認証に必要です。",
"How to access files using WebDAV" : "WebDAVを使用してファイルにアクセスする方法",
"Total rows summary" : "総行数のサマリー",
"Toggle selection for all files and folders" : "すべてのファイルとフォルダの選択を切り替える",
@@ -238,6 +245,7 @@ OC.L10N.register(
"Error during upload: {message}" : "アップロード中にエラーが発生しました: {message}",
"Error during upload, status code {status}" : "アップロード中のエラー、ステータスコード {status}",
"Unknown error during upload" : "不明なエラーがアップロード中に発生しました",
"File list is reloading" : "ファイルリストを再読み込み中",
"Loading current folder" : "現在のフォルダの読み込み中",
"Retry" : "リトライ",
"No files in here" : "ファイルがありません",
@@ -325,6 +333,8 @@ OC.L10N.register(
"Open online" : "オンラインで開く",
"Rename" : "名前の変更",
"Details" : "詳細",
"Open the details sidebar" : "詳細サイドバーを開く",
"Unfavorite" : "お気に入りから外す",
"View in folder" : "フォルダー内で表示",
"Type" : "タイプ",
"Created new folder \"{name}\"" : "新規フォルダ \"{name}\" を作成しました",
@@ -333,6 +343,7 @@ OC.L10N.register(
"Templates" : "テンプレート",
"New template folder" : "新しいテンプレートフォルダ",
"In folder" : "フォルダ内",
"Pick folder to search in" : "検索対象のフォルダーを選択してください",
"Search in all files" : "すべてのファイルを検索",
"Search in folder: {folder}" : "フォルダ内を検索: {folder}",
"One of the dropped files could not be processed" : "ドロップされたファイルの1つが処理できませんでした",

View File

@@ -77,6 +77,7 @@
"Go to the \"{dir}\" directory" : "\"{dir}\" ディレクトリに移動する",
"Current directory path" : "現在のディレクトリパス",
"Share" : "共有",
"Reload content" : "コンテンツを再読み込み",
"Your have used your space quota and cannot upload files anymore" : "あなたのクォータ容量を使い果たし、ファイルをアップロードできなくなりました。",
"You do not have permission to upload or create files here." : "ここにファイルをアップロードまたは作成する権限がありません。",
"Drag and drop files here to upload" : "ここにファイルをドラッグ&ドロップしてアップロードする",
@@ -107,6 +108,7 @@
"Last 30 days" : "30日以内",
"This year ({year})" : "今年 ({year})",
"Last year ({year})" : "去年 ({year})",
"Custom range" : "カスタム範囲",
"Custom date range" : "カスタム日付の範囲",
"Search everywhere" : "あらゆる場所を検索",
"Documents" : "ドキュメント",
@@ -118,6 +120,7 @@
"Images" : "画像",
"Videos" : "動画",
"Filters" : "フィルター",
"Back to filters" : "フィルターに戻る",
"Appearance" : "表示",
"Show hidden files" : "隠しファイルを表示",
"Show file type column" : "ファイルの種類のカラムを表示する",
@@ -126,6 +129,7 @@
"General" : "一般",
"Sort favorites first" : "お気に入りを最初に並べる",
"Sort folders before files" : "ファイルよりもフォルダを先に並べ替えます",
"Enable folder tree view" : "フォルダーツリー表示を有効にする",
"Default view" : "デフォルト表示",
"All files" : "すべてのファイル",
"Personal files" : "個人ファイル",
@@ -148,7 +152,10 @@
"Show those shortcuts" : "これらのショートカットを表示する",
"Warnings" : "警告",
"Warn before changing a file extension" : "ファイル拡張子を変更する前に警告する",
"Warn before deleting a file" : "ファイルを削除する前に警告する",
"WebDAV URL" : "WebDAV URL",
"Create an app password" : "アプリパスワードを作成する",
"Required for WebDAV authentication because Two-Factor Authentication is enabled for this account." : "このアカウントでは二要素認証が有効化されているため、WebDAV認証に必要です。",
"How to access files using WebDAV" : "WebDAVを使用してファイルにアクセスする方法",
"Total rows summary" : "総行数のサマリー",
"Toggle selection for all files and folders" : "すべてのファイルとフォルダの選択を切り替える",
@@ -236,6 +243,7 @@
"Error during upload: {message}" : "アップロード中にエラーが発生しました: {message}",
"Error during upload, status code {status}" : "アップロード中のエラー、ステータスコード {status}",
"Unknown error during upload" : "不明なエラーがアップロード中に発生しました",
"File list is reloading" : "ファイルリストを再読み込み中",
"Loading current folder" : "現在のフォルダの読み込み中",
"Retry" : "リトライ",
"No files in here" : "ファイルがありません",
@@ -323,6 +331,8 @@
"Open online" : "オンラインで開く",
"Rename" : "名前の変更",
"Details" : "詳細",
"Open the details sidebar" : "詳細サイドバーを開く",
"Unfavorite" : "お気に入りから外す",
"View in folder" : "フォルダー内で表示",
"Type" : "タイプ",
"Created new folder \"{name}\"" : "新規フォルダ \"{name}\" を作成しました",
@@ -331,6 +341,7 @@
"Templates" : "テンプレート",
"New template folder" : "新しいテンプレートフォルダ",
"In folder" : "フォルダ内",
"Pick folder to search in" : "検索対象のフォルダーを選択してください",
"Search in all files" : "すべてのファイルを検索",
"Search in folder: {folder}" : "フォルダ内を検索: {folder}",
"One of the dropped files could not be processed" : "ドロップされたファイルの1つが処理できませんでした",

View File

@@ -29,7 +29,6 @@
<script lang="ts">
import type { Folder } from '@nextcloud/files'
import type { PropType } from 'vue'
import type { RawLocation } from 'vue-router'
import { showError } from '@nextcloud/dialogs'
import { Permission } from '@nextcloud/files'
@@ -111,7 +110,7 @@ export default defineComponent({
mainContent.addEventListener('drop', this.onContentDrop)
},
beforeDestroy() {
beforeUnmount() {
const mainContent = window.document.getElementById('app-content-vue') as HTMLElement
mainContent.removeEventListener('dragover', this.onDragOver)
mainContent.removeEventListener('dragleave', this.onDragLeave)
@@ -204,16 +203,19 @@ export default defineComponent({
&& upload.source.replace(folder.source, '').split('/').length === 2)
if (lastUpload !== undefined) {
const fileid = String(lastUpload.response!.headers['oc-fileid']).split(/(oc|nc)/, 2)[0]!
logger.debug('Scrolling to last upload in current folder', { lastUpload })
const location: RawLocation = {
path: this.$route.path,
// Keep params but change file id
this.$router.push({
name: this.$route.name!,
params: {
// Keep params but change file id
...this.$route.params,
fileid: String(lastUpload.response!.headers['oc-fileid']),
fileid,
},
}
this.$router.push(location)
query: {
dir: this.$route.query.dir,
},
})
}
this.dragover = false

View File

@@ -52,6 +52,7 @@ OC.L10N.register(
"Enable Path Style" : "Povolit Path Style",
"Legacy (v2) authentication" : "Starší (v2) ověřování",
"Enable multipart copy" : "Povolit kopii o více částech",
"Use presigned S3 url" : "Použít předem podepsanou S3 url",
"SSE-C encryption key" : "klíč šifrování SSE-C",
"WebDAV" : "WebDAV",
"URL" : "URL",
@@ -83,15 +84,20 @@ OC.L10N.register(
"External storage support" : "Podpora pro externí úložiště",
"Adds basic external storage support" : "Přidá základní podporu externí úložiště",
"This application enables administrators to configure connections to external storage providers, such as FTP servers, S3 or SWIFT object stores, other Nextcloud servers, WebDAV servers, and more. Administration can choose which types of storage to enable and can mount these storage locations for an account, a group, or the entire system. Users will see a new folder appear in their root Nextcloud directory, which they can access and use like any other Nextcloud folder. External storage also allows people to share files stored in these external locations. In these cases, the credentials for the owner of the file are used when the recipient requests the file from external storage, thereby ensuring that the recipient can access the shared file.\n\nExternal storage can be configured using the GUI or at the command line. This second option provides the administration with more flexibility for configuring bulk external storage mounts and setting mount priorities. More information is available in the external storage GUI documentation and the external storage Configuration File documentation." : "Tato aplikace umožňuje správcům nastavovat připojení k externím poskytovatelům úložišť, jako jsou servery FTP, úložiště objektů S3 nebo SWIFT, jiné servery Nextcloud, servery WebDAV a další. Správa může vybrat, které typy úložišť povolí, a může tato úložiště připojit pro účet, skupinu nebo celý systém. Uživatelům se v kořenovém adresáři služby Nextcloud objeví nová složka, ke které mohou přistupovat a používat ji jako jakoukoli jinou složku Nextcloudu. Externí úložiště také umožňuje lidem sdílet soubory uložené v těchto externích umístěních. V těchto případech se při žádosti příjemce o soubor z externího úložiště použijí přihlašovací údaje vlastníka souboru, čímž je zajištěno, že příjemce bude mít ke sdílenému souboru přístup.\n\nExterní úložiště lze nastavovat pomocí grafického uživatelského rozhraní nebo příkazového řádku. Tato druhá možnost poskytuje správci větší flexibilitu při konfiguraci hromadného připojování externího úložiště a nastavení priorit připojení. Další informace jsou k dispozici v dokumentaci ke grafickému rozhraní externího úložiště a v dokumentaci k souboru s nastaveními externího úložiště.",
"Edit storage" : "Upravit úložiště",
"Add storage" : "Přidat úložiště",
"Folder name" : "Název složky",
"Authentication" : "Ověření",
"Cancel" : "Zrušit",
"Edit" : "Upravit",
"Create" : "Vytvářet",
"Restrict to" : "Omezit na",
"Storage configuration" : "Nastavení úložiště",
"Never" : "Nikdy",
"Once every direct access" : "Jednou pro každý přímý přístup",
"Always" : "Vždy",
"Mount options" : "Předvolby připojení",
"Check filesystem changes" : "Zkontrolovat změny na souborovém systému",
"Read only" : "Pouze pro čtení",
"Enable previews" : "Zapnout náhledy",
"Enable sharing" : "Povolit sdílení",
@@ -99,11 +105,19 @@ OC.L10N.register(
"Compatibility with Mac NFD encoding (slow)" : "Kompatibilita s Mac NFD kódováním (pomalé)",
"External storages" : "Externí úložiště",
"Status" : "Stav",
"Restricted to" : "Omezeno na",
"Actions" : "Akce",
"Checking …" : "Kontrola …",
"Recheck status" : "Znovu zkontrolovat stav",
"Delete" : "Smazat",
"System provided storage" : "Úložiště poskytované systémem",
"Saved" : "Uloženo",
"Error while saving" : "Chyba při ukládání",
"Saved allowed backends" : "Uložené povolené podpůrné vrstvy",
"Failed to save allowed backends" : "Nepodařilo se uložit povolené podpůrné vrstvy",
"Advanced options for external storage mounts" : "Pokročilé předvolby pro připojení externích úložišť",
"Allow people to mount external storage" : "Povolit lidem připojovat externí úložiště",
"External storage backends people are allowed to mount" : "Externí podpůrné vrstvy úložišť, které si lidé mohou připojovat",
"Error generating key pair" : "Chyba při vytváření páru klíčů",
"Key size" : "Délka klíče",
"Generate keys" : "Vytvořit klíče",
@@ -112,6 +126,16 @@ OC.L10N.register(
"To access the storage, you need to provide the authentication credentials." : "Abyste mohli přistupovat k úložišti, je třeba poskytnout ověřovací přihlašovací údaje.",
"Enter the storage login" : "Zadejte přihlašovací jméno k úložiti",
"Enter the storage password" : "Zadejte heslo k úložišti",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices." : "Externí úložiště umožňuje připojit externí úložné služby a zařízení jako sekundární úložná zařízení Nextcloud.",
"You may also allow people to mount their own external storage services." : "Je také možné umožnit lidem připojovat jejich vlastní externí úložně služby.",
"The cURL support in PHP is not enabled or installed." : "Podpora cURL v PHP není zapnoutá nebo nainstalovaná.",
"The FTP support in PHP is not enabled or installed." : "Podpora FTP v PHP není zapnoutá nebo nainstalovaná.",
"{module} is not installed." : "{module} není nainstalováno",
"Dependant backends" : "Závisející podpůrné vrstvy",
"No external storage configured or you do not have the permission to configure them" : "Není nastavené žádné externí úložiště nebo nemáte oprávnění je nastavovat",
"Add external storage" : "Přidat externí úložiště",
"Global credentials saved" : "Globální přihlašovací údaje uloženy",
"Could not save global credentials" : "Nebylo možné uložit globální přihlašovací údaje",
"Global credentials can be used to authenticate with multiple external storages that have the same credentials." : "Globální přihlašovací údaje je možné použít pro ověření se vůči vícero externím úložištím, která mají stejné přihlašovací údaje.",
"Saving …" : "Ukládání …",
"Save" : "Uložit",
@@ -127,6 +151,7 @@ OC.L10N.register(
"Open in Files" : "Otevřít v Souborech",
"External mount error" : "Chyba vzdáleného úložiště",
"There was an error with this external storage. Do you want to review this mount point config in the settings page?" : "U tohoto externího úložiště došlo k chybě. Chcete si prohlédnout nastavení tohoto přípojného bodu na stránce nastavení?",
"Open settings" : "Otevřít nastavení",
"Ignore" : "Ignorovat",
"List of external storage." : "Seznam externího úložiště.",
"There is no external storage configured. You can configure them in your Personal settings." : "Není nastaveno žádné externí úložiště. Je možné je nastavit v Osobních nastaveních.",
@@ -139,6 +164,8 @@ OC.L10N.register(
"System" : "Systémové",
"Connected" : "Připojeno",
"Error" : "Error",
"Indeterminate" : "Neurčité",
"Incomplete configuration" : "Neúplné nastavení",
"Unauthorized" : "Není pověření",
"Network error" : "Chyba sítě",
"Grant access" : "Udělit přístup",

View File

@@ -50,6 +50,7 @@
"Enable Path Style" : "Povolit Path Style",
"Legacy (v2) authentication" : "Starší (v2) ověřování",
"Enable multipart copy" : "Povolit kopii o více částech",
"Use presigned S3 url" : "Použít předem podepsanou S3 url",
"SSE-C encryption key" : "klíč šifrování SSE-C",
"WebDAV" : "WebDAV",
"URL" : "URL",
@@ -81,15 +82,20 @@
"External storage support" : "Podpora pro externí úložiště",
"Adds basic external storage support" : "Přidá základní podporu externí úložiště",
"This application enables administrators to configure connections to external storage providers, such as FTP servers, S3 or SWIFT object stores, other Nextcloud servers, WebDAV servers, and more. Administration can choose which types of storage to enable and can mount these storage locations for an account, a group, or the entire system. Users will see a new folder appear in their root Nextcloud directory, which they can access and use like any other Nextcloud folder. External storage also allows people to share files stored in these external locations. In these cases, the credentials for the owner of the file are used when the recipient requests the file from external storage, thereby ensuring that the recipient can access the shared file.\n\nExternal storage can be configured using the GUI or at the command line. This second option provides the administration with more flexibility for configuring bulk external storage mounts and setting mount priorities. More information is available in the external storage GUI documentation and the external storage Configuration File documentation." : "Tato aplikace umožňuje správcům nastavovat připojení k externím poskytovatelům úložišť, jako jsou servery FTP, úložiště objektů S3 nebo SWIFT, jiné servery Nextcloud, servery WebDAV a další. Správa může vybrat, které typy úložišť povolí, a může tato úložiště připojit pro účet, skupinu nebo celý systém. Uživatelům se v kořenovém adresáři služby Nextcloud objeví nová složka, ke které mohou přistupovat a používat ji jako jakoukoli jinou složku Nextcloudu. Externí úložiště také umožňuje lidem sdílet soubory uložené v těchto externích umístěních. V těchto případech se při žádosti příjemce o soubor z externího úložiště použijí přihlašovací údaje vlastníka souboru, čímž je zajištěno, že příjemce bude mít ke sdílenému souboru přístup.\n\nExterní úložiště lze nastavovat pomocí grafického uživatelského rozhraní nebo příkazového řádku. Tato druhá možnost poskytuje správci větší flexibilitu při konfiguraci hromadného připojování externího úložiště a nastavení priorit připojení. Další informace jsou k dispozici v dokumentaci ke grafickému rozhraní externího úložiště a v dokumentaci k souboru s nastaveními externího úložiště.",
"Edit storage" : "Upravit úložiště",
"Add storage" : "Přidat úložiště",
"Folder name" : "Název složky",
"Authentication" : "Ověření",
"Cancel" : "Zrušit",
"Edit" : "Upravit",
"Create" : "Vytvářet",
"Restrict to" : "Omezit na",
"Storage configuration" : "Nastavení úložiště",
"Never" : "Nikdy",
"Once every direct access" : "Jednou pro každý přímý přístup",
"Always" : "Vždy",
"Mount options" : "Předvolby připojení",
"Check filesystem changes" : "Zkontrolovat změny na souborovém systému",
"Read only" : "Pouze pro čtení",
"Enable previews" : "Zapnout náhledy",
"Enable sharing" : "Povolit sdílení",
@@ -97,11 +103,19 @@
"Compatibility with Mac NFD encoding (slow)" : "Kompatibilita s Mac NFD kódováním (pomalé)",
"External storages" : "Externí úložiště",
"Status" : "Stav",
"Restricted to" : "Omezeno na",
"Actions" : "Akce",
"Checking …" : "Kontrola …",
"Recheck status" : "Znovu zkontrolovat stav",
"Delete" : "Smazat",
"System provided storage" : "Úložiště poskytované systémem",
"Saved" : "Uloženo",
"Error while saving" : "Chyba při ukládání",
"Saved allowed backends" : "Uložené povolené podpůrné vrstvy",
"Failed to save allowed backends" : "Nepodařilo se uložit povolené podpůrné vrstvy",
"Advanced options for external storage mounts" : "Pokročilé předvolby pro připojení externích úložišť",
"Allow people to mount external storage" : "Povolit lidem připojovat externí úložiště",
"External storage backends people are allowed to mount" : "Externí podpůrné vrstvy úložišť, které si lidé mohou připojovat",
"Error generating key pair" : "Chyba při vytváření páru klíčů",
"Key size" : "Délka klíče",
"Generate keys" : "Vytvořit klíče",
@@ -110,6 +124,16 @@
"To access the storage, you need to provide the authentication credentials." : "Abyste mohli přistupovat k úložišti, je třeba poskytnout ověřovací přihlašovací údaje.",
"Enter the storage login" : "Zadejte přihlašovací jméno k úložiti",
"Enter the storage password" : "Zadejte heslo k úložišti",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices." : "Externí úložiště umožňuje připojit externí úložné služby a zařízení jako sekundární úložná zařízení Nextcloud.",
"You may also allow people to mount their own external storage services." : "Je také možné umožnit lidem připojovat jejich vlastní externí úložně služby.",
"The cURL support in PHP is not enabled or installed." : "Podpora cURL v PHP není zapnoutá nebo nainstalovaná.",
"The FTP support in PHP is not enabled or installed." : "Podpora FTP v PHP není zapnoutá nebo nainstalovaná.",
"{module} is not installed." : "{module} není nainstalováno",
"Dependant backends" : "Závisející podpůrné vrstvy",
"No external storage configured or you do not have the permission to configure them" : "Není nastavené žádné externí úložiště nebo nemáte oprávnění je nastavovat",
"Add external storage" : "Přidat externí úložiště",
"Global credentials saved" : "Globální přihlašovací údaje uloženy",
"Could not save global credentials" : "Nebylo možné uložit globální přihlašovací údaje",
"Global credentials can be used to authenticate with multiple external storages that have the same credentials." : "Globální přihlašovací údaje je možné použít pro ověření se vůči vícero externím úložištím, která mají stejné přihlašovací údaje.",
"Saving …" : "Ukládání …",
"Save" : "Uložit",
@@ -125,6 +149,7 @@
"Open in Files" : "Otevřít v Souborech",
"External mount error" : "Chyba vzdáleného úložiště",
"There was an error with this external storage. Do you want to review this mount point config in the settings page?" : "U tohoto externího úložiště došlo k chybě. Chcete si prohlédnout nastavení tohoto přípojného bodu na stránce nastavení?",
"Open settings" : "Otevřít nastavení",
"Ignore" : "Ignorovat",
"List of external storage." : "Seznam externího úložiště.",
"There is no external storage configured. You can configure them in your Personal settings." : "Není nastaveno žádné externí úložiště. Je možné je nastavit v Osobních nastaveních.",
@@ -137,6 +162,8 @@
"System" : "Systémové",
"Connected" : "Připojeno",
"Error" : "Error",
"Indeterminate" : "Neurčité",
"Incomplete configuration" : "Neúplné nastavení",
"Unauthorized" : "Není pověření",
"Network error" : "Chyba sítě",
"Grant access" : "Udělit přístup",

View File

@@ -1,6 +1,9 @@
OC.L10N.register(
"files_external",
{
"You are not logged in" : "Niste prijavljeni",
"Permission denied" : "Pristup odbijen",
"Forbidden to manage local mounts" : "Zabranjeno upravljanje lokalnim točkama postavljanja",
"Storage with ID \"%d\" not found" : "Pohrana s ID-om „%d” nije pronađena",
"Invalid backend or authentication mechanism class" : "Nevažeća klasa pozadine ili mehanizma autentifikacije",
"Invalid mount point" : "Nevažeća točka postavljanja",
@@ -11,6 +14,7 @@ OC.L10N.register(
"Unsatisfied backend parameters" : "Neispunjeni sigurnosni parametri",
"Unsatisfied authentication mechanism parameters" : "Neispunjeni parametri mehanizma autentifikacije",
"Insufficient data: %s" : "Nedovoljno podataka: %s",
"Storage with ID \"%d\" is not editable by non-admins" : "Pohranu s ID-om „%d” ne mogu uređivati korisnici koji nisu administratori",
"Access key" : "Pristupni ključ",
"Secret key" : "Tajni ključ",
"Builtin" : "Ugrađen",
@@ -26,20 +30,30 @@ OC.L10N.register(
"API key" : "Ključ API-ja",
"Global credentials" : "Globalne vjerodajnice",
"Log-in credentials, save in database" : "Vjerodajnice za prijavu, spremi u bazu podataka",
"Login and password" : "Korisničko ime i lozinka",
"Log-in credentials, save in session" : "Vjerodajnice za prijavu, spremi u sesiju",
"Global credentials, manually entered" : "Globalne vjerodajnice, ručno unesene",
"Manually entered, store in database" : "Ručno uneseno, pohrani u bazu podataka",
"RSA public key" : "Javni ključ RSA",
"Public key" : "Javni ključ",
"RSA private key" : "Privatni ključ RSA",
"Private key" : "Privatni ključ",
"Kerberos default realm, defaults to \"WORKGROUP\"" : "Zadano Kerberos područje, zadano je „WORKGROUP”",
"Kerberos ticket Apache mode" : "Kerberos ticket Apache način rada",
"Kerberos ticket" : "Kerberos ticket",
"S3 Storage" : "S3 pohrana",
"Bucket" : "Bucket",
"Hostname" : "Naziv poslužitelja",
"Port" : "Port",
"Proxy" : "Proxy",
"Region" : "Regija",
"Storage Class" : "Razred pohrane",
"Enable SSL" : "Omogući SSL",
"Enable Path Style" : "Omogući Path Style",
"Legacy (v2) authentication" : "Naslijeđena (v2) autentifikacija",
"Enable multipart copy" : "Omogući višedijelno kopiranje",
"Use presigned S3 url" : "Koristi unaprijed potpisani S3 URL",
"SSE-C encryption key" : "SSE-C enkripcijski ključ",
"WebDAV" : "WebDAV",
"URL" : "URL",
"Remote subfolder" : "Udaljena podmapa",
@@ -56,24 +70,34 @@ OC.L10N.register(
"SMB/CIFS" : "SMB/CIFS",
"Share" : "Dijeli",
"Show hidden files" : "Prikaz skrivenih datoteka",
"Case sensitive file system" : "Razlikuje velika i mala slova u datotečnom sustavu",
"Disabling it will allow to use a case insensitive file system, but comes with a performance penalty" : "Onemogućavanje omogućuje korištenje datotečnog sustava koji ne razlikuje velika i mala slova, ali uz smanjenje performansi",
"Verify ACL access when listing files" : "Provjeri ACL pristup pri pregledu popisa datoteka",
"Check the ACL's of each file or folder inside a directory to filter out items where the account has no read permissions, comes with a performance penalty" : "Provjerava ACL svake datoteke ili mape unutar direktorija kako bi se filtrirale stavke za koje račun nema dopuštenje čitanja, uz smanjenje performansi",
"Timeout" : "Istek vremena",
"SMB/CIFS using OC login" : "SMB/CIFS s prijavom putem OC-a",
"Login as share" : "Prijavi se kao dijeljenje",
"OpenStack Object Storage" : "OpenStack Object Storage",
"Service name" : "Naziv servisa",
"Request timeout (seconds)" : "Istek zahtjeva (u sekundama)",
"External storage" : "Vanjsko spremište za pohranu",
"External storage support" : "Podrška za vanjsku pohranu",
"Adds basic external storage support" : "Dodaje osnovnu podršku za vanjsku pohranu",
"This application enables administrators to configure connections to external storage providers, such as FTP servers, S3 or SWIFT object stores, other Nextcloud servers, WebDAV servers, and more. Administration can choose which types of storage to enable and can mount these storage locations for an account, a group, or the entire system. Users will see a new folder appear in their root Nextcloud directory, which they can access and use like any other Nextcloud folder. External storage also allows people to share files stored in these external locations. In these cases, the credentials for the owner of the file are used when the recipient requests the file from external storage, thereby ensuring that the recipient can access the shared file.\n\nExternal storage can be configured using the GUI or at the command line. This second option provides the administration with more flexibility for configuring bulk external storage mounts and setting mount priorities. More information is available in the external storage GUI documentation and the external storage Configuration File documentation." : "Ova aplikacija omogućuje administratorima konfiguriranje veza s vanjskim pružateljima pohrane, kao što su FTP poslužitelji, S3 ili SWIFT spremišta objekata, drugi Nextcloud poslužitelji, WebDAV poslužitelji i drugi. Administracija može odabrati koje vrste pohrane će omogućiti te može postaviti te lokacije pohrane za pojedini račun, grupu ili cijeli sustav. Korisnicima će se u korijenskom Nextcloud direktoriju pojaviti nova mapa kojoj mogu pristupiti i koristiti je kao i bilo koju drugu Nextcloud mapu. Vanjska pohrana također omogućuje dijeljenje datoteka pohranjenih na tim vanjskim lokacijama. U tim se slučajevima prilikom zahtjeva za datoteku iz vanjske pohrane koriste vjerodajnice vlasnika datoteke, čime se osigurava da primatelj može pristupiti dijeljenoj datoteci.\n\nVanjska pohrana može se konfigurirati putem grafičkog sučelja ili iz naredbenog retka. Ova druga mogućnost administratorima pruža veću fleksibilnost pri konfiguriranju većeg broja vanjskih točaka postavljanja i namještanju prioriteta postavljanja. Više informacija dostupno je u dokumentaciji grafičkog sučelja za vanjsku pohranu te u dokumentaciji konfiguracijske datoteke za vanjsku pohranu.",
"Edit storage" : "Uredi pohranu",
"Add storage" : "Dodaj pohranu",
"Folder name" : "Naziv mape",
"Authentication" : "Autentifikacija",
"Cancel" : "Cancel",
"Cancel" : "Odustani",
"Edit" : "Uredi",
"Create" : "Stvori",
"Restrict to" : "Ograniči na",
"Storage configuration" : "Konfiguracija pohrane",
"Never" : "Nikad",
"Once every direct access" : "Jednom za svaki izravni pristup",
"Always" : "Uvijek",
"Mount options" : "Opcije postavljanja",
"Check filesystem changes" : "Provjeri promjene datotečnog sustava",
"Read only" : "Samo za čitanje",
"Enable previews" : "Omogući pretpregled",
"Enable sharing" : "Omogući dijeljenje",
@@ -81,19 +105,58 @@ OC.L10N.register(
"Compatibility with Mac NFD encoding (slow)" : "Kompatibilnost s kodiranjem Mac NFD (sporo)",
"External storages" : "Vanjsko spremište za pohranu",
"Status" : "Status",
"Restricted to" : "Ograničeno na",
"Actions" : "Radnje",
"Checking …" : "Provjeravam …",
"Recheck status" : "Ponovno provjeri status",
"Delete" : "Izbriši",
"System provided storage" : "Pohrana koju pruža sustav",
"Saved" : "Spremljeno",
"Error while saving" : "Greška u spremanju",
"Saved allowed backends" : "Spremljeni dopušteni pozadinski sustavi",
"Failed to save allowed backends" : "Greška u spremanju dopuštenih pozadinskih sustava",
"Advanced options for external storage mounts" : "Napredne opcije za postavljanje vanjske pohrane",
"Allow people to mount external storage" : "Dopusti korisnicima postavljanje vanjske pohrane",
"External storage backends people are allowed to mount" : "Pozadinski sustavi vanjske pohrane koje korisnici smiju postaviti",
"Error generating key pair" : "Pogreška pri generiranju parova ključeva",
"Key size" : "Veličina ključa",
"Generate keys" : "Generiraj ključeve",
"Confirm" : "Potvrdi",
"Storage credentials" : "Vjerodajnice pohrane",
"To access the storage, you need to provide the authentication credentials." : "Za pristup pohrani potrebno je unijeti vjerodajnice za autentifikaciju.",
"Enter the storage login" : "Unesite korisničko ime pohrane",
"Enter the storage password" : "Unesite lozinku pohrane",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices." : "Vanjska pohrana omogućuje postavljanje vanjskih usluga i uređaja za pohranu kao sekundarnih Nextcloud uređaja za pohranu.",
"You may also allow people to mount their own external storage services." : "Također možete dopustiti korisnicima postavljanje vlastite vanjske usluge pohrane.",
"The cURL support in PHP is not enabled or installed." : "Podrška za cURL u PHP-u nije omogućena ili nije instalirana.",
"The FTP support in PHP is not enabled or installed." : "Podrša za FTP u PHP-u nije omogućena ili nije instalirana.",
"{module} is not installed." : "{module} nije instaliran.",
"Dependant backends" : "Ovisni pozadinski sustavi",
"No external storage configured or you do not have the permission to configure them" : "Nema konfigurirane vanjske pohrane ili nemate dopuštenje za njezino konfiguriranje",
"Add external storage" : "Dodaj vanjsku pohranu",
"Global credentials saved" : "Globalne vjerodajnice spremljene",
"Could not save global credentials" : "Nije moguće spremiti globalne vjerodajnice",
"Global credentials can be used to authenticate with multiple external storages that have the same credentials." : "Globalne vjerodajnice mogu se upotrebljavati za provođenje autentifikacije na više vanjskih pohrana koje imaju iste vjerodajnice.",
"Saving …" : "Spremanje…",
"Save" : "Spremi",
"Unable to update this external storage config. {statusMessage}" : "Nije moguće ažurirati ovu konfiguraciju vanjske pohrane. {statusMessage}",
"New configuration successfully saved" : "Nova konfiguracija uspješno spremljena",
"Enter missing credentials" : "Unesite nedostajuće vjerodajnice",
"Credentials successfully set" : "Vjerodajnice uspješno postavljenje",
"Error while setting credentials: {error}" : "Greška pri postavljanju vjerodajnica: {error}",
"Checking storage …" : "Provjera pohrane …",
"There was an error with this external storage." : "Došlo je do pogreške s ovom vanjskom pohranom.",
"We were unable to check the external storage {basename}" : "Nismo uspjeli provjeriti vanjsku pohranu {basename}",
"Examine this faulty external storage configuration" : "Ispitaj ovu neispravnu konfiguraciju vanjske pohrane",
"Open in Files" : "Otvori u aplikaciji Datoteke",
"External mount error" : "Pogreška vanjskog postavljanja",
"There was an error with this external storage. Do you want to review this mount point config in the settings page?" : "Došlo je do pogreške s ovom vanjskom pohranom. Želite li pregledati konfiguraciju ove točke postavljanja na stranici postavki?",
"Open settings" : "Otvori postavke",
"Ignore" : "Zanemari",
"List of external storage." : "Popis vanjske pohrane.",
"There is no external storage configured. You can configure them in your Personal settings." : "Nema konfigurirane vanjske pohrane. Možete je konfigurirati u osobnim postavkama.",
"There is no external storage configured and you don't have the permission to configure them." : "Nema konfigurirane vanjske pohrane i nemate dopuštenje za njezino konfiguriranje.",
"No external storage" : "Nema vanjske pohrane",
"Storage type" : "Vrsta pohrane",
"Unknown" : "Nepoznata pogreška",
"Scope" : "Opseg",
@@ -101,6 +164,8 @@ OC.L10N.register(
"System" : "Sustav",
"Connected" : "Povezano",
"Error" : "Pogreška",
"Indeterminate" : "Neodređeno",
"Incomplete configuration" : "Nepotpuna konfiguracija",
"Unauthorized" : "Neovlašteno",
"Network error" : "Pogreška mreže",
"Grant access" : "Dodijeli pristup",
@@ -117,17 +182,28 @@ OC.L10N.register(
"The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Podrška za cURL u PHP-u nije omogućena niti instalirana. Nije moguće postaviti %s. Zatražite od svog administratora sustava da je instalira.",
"The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Podrška za FTP u PHP-u nije omogućena niti instalirana. Nije moguće postaviti %s. Zatražite od svog administratora sustava da je instalira.",
"\"%1$s\" is not installed. Mounting of %2$s is not possible. Please ask your system administrator to install it." : "„%1$s” nije instaliran. Nije moguće postaviti %2$s. Zatražite od svog administratora sustava da ga instalira.",
"Checking storage …" : "Provjera pohrane …",
"Type to select account or group." : "Upišite za odabir računa ili grupe.",
"(Group)" : "(Grupa)",
"Check for changes" : "Provjeri za promjene",
"Disconnect" : "Odspoji",
"Unknown backend: {backendName}" : "Nepoznat pozadinski sustav: {backendName}",
"Admin defined" : "Definira administrator",
"Automatic status checking is disabled due to the large number of configured storages, click to check status" : "Automatska provjera statusa onemogućena je zbog velikog broja konfiguriranih pohrana, kliknite za provjeru statusa",
"Are you sure you want to disconnect this external storage? It will make the storage unavailable in Nextcloud and will lead to a deletion of these files and folders on any sync client that is currently connected but will not delete any files and folders on the external storage itself." : "Jeste li sigurni da želite odspojiti ovu vanjsku pohranu? Time će pohrana postati nedostupna u Nextcloudu i uzrokovat će brisanje tih datoteka i mapa na svim sinkronizacijskim klijentima koji su trenutačno povezani, ali neće izbrisati nijednu datoteku ni mapu na samoj vanjskoj pohrani.",
"Delete storage?" : "Želite li izbrisati pohranu?",
"Click to recheck the configuration" : "Kliknite za ponovnu provjeru konfiguracije",
"Saving …" : "Spremanje...",
"Failed to save global credentials" : "Neuspjelo spremanje globalnih vjerodajnica",
"Failed to save global credentials: {message}" : "Neuspjelo spremanje globalnih vjerodajnica: {message}",
"No external storage configured or you don't have the permission to configure them" : "Nema konfigurirane vanjske pohrane ili nemate dopuštenje za konfiguriranje",
"Open documentation" : "Otvori dokumentaciju",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow people to mount their own external storage services." : "Vanjska pohrana omogućuje montiranje vanjskih usluga i uređaja za pohranu kao sekundarnih Nextcloud uređaja za pohranu. Također možete dopustiti korisnicima postavljanje vlastite vanjske usluge pohrane.",
"Configuration" : "Konfiguracija",
"Available for" : "Dostupno za",
"Advanced settings" : "Napredne postavke"
"All people" : "Svi korisnici",
"Advanced settings" : "Napredne postavke",
"Are you sure you want to disconnect this external storage?" : "Jeste li sigurni da želite odspojiti ovu vanjsku pohranu?",
"It will make the storage unavailable in {instanceName} and will lead to a deletion of these files and folders on any sync client that is currently connected but will not delete any files and folders on the external storage itself." : "Time će pohrana postati nedostupna u {instanceName} i dovest će do brisanja tih datoteka i mapa na svim sinkronizacijskim klijentima koji su trenutačno povezani, ali neće izbrisati nijednu datoteku ni mapu na samoj vanjskoj pohrani."
},
"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;");

View File

@@ -1,4 +1,7 @@
{ "translations": {
"You are not logged in" : "Niste prijavljeni",
"Permission denied" : "Pristup odbijen",
"Forbidden to manage local mounts" : "Zabranjeno upravljanje lokalnim točkama postavljanja",
"Storage with ID \"%d\" not found" : "Pohrana s ID-om „%d” nije pronađena",
"Invalid backend or authentication mechanism class" : "Nevažeća klasa pozadine ili mehanizma autentifikacije",
"Invalid mount point" : "Nevažeća točka postavljanja",
@@ -9,6 +12,7 @@
"Unsatisfied backend parameters" : "Neispunjeni sigurnosni parametri",
"Unsatisfied authentication mechanism parameters" : "Neispunjeni parametri mehanizma autentifikacije",
"Insufficient data: %s" : "Nedovoljno podataka: %s",
"Storage with ID \"%d\" is not editable by non-admins" : "Pohranu s ID-om „%d” ne mogu uređivati korisnici koji nisu administratori",
"Access key" : "Pristupni ključ",
"Secret key" : "Tajni ključ",
"Builtin" : "Ugrađen",
@@ -24,20 +28,30 @@
"API key" : "Ključ API-ja",
"Global credentials" : "Globalne vjerodajnice",
"Log-in credentials, save in database" : "Vjerodajnice za prijavu, spremi u bazu podataka",
"Login and password" : "Korisničko ime i lozinka",
"Log-in credentials, save in session" : "Vjerodajnice za prijavu, spremi u sesiju",
"Global credentials, manually entered" : "Globalne vjerodajnice, ručno unesene",
"Manually entered, store in database" : "Ručno uneseno, pohrani u bazu podataka",
"RSA public key" : "Javni ključ RSA",
"Public key" : "Javni ključ",
"RSA private key" : "Privatni ključ RSA",
"Private key" : "Privatni ključ",
"Kerberos default realm, defaults to \"WORKGROUP\"" : "Zadano Kerberos područje, zadano je „WORKGROUP”",
"Kerberos ticket Apache mode" : "Kerberos ticket Apache način rada",
"Kerberos ticket" : "Kerberos ticket",
"S3 Storage" : "S3 pohrana",
"Bucket" : "Bucket",
"Hostname" : "Naziv poslužitelja",
"Port" : "Port",
"Proxy" : "Proxy",
"Region" : "Regija",
"Storage Class" : "Razred pohrane",
"Enable SSL" : "Omogući SSL",
"Enable Path Style" : "Omogući Path Style",
"Legacy (v2) authentication" : "Naslijeđena (v2) autentifikacija",
"Enable multipart copy" : "Omogući višedijelno kopiranje",
"Use presigned S3 url" : "Koristi unaprijed potpisani S3 URL",
"SSE-C encryption key" : "SSE-C enkripcijski ključ",
"WebDAV" : "WebDAV",
"URL" : "URL",
"Remote subfolder" : "Udaljena podmapa",
@@ -54,24 +68,34 @@
"SMB/CIFS" : "SMB/CIFS",
"Share" : "Dijeli",
"Show hidden files" : "Prikaz skrivenih datoteka",
"Case sensitive file system" : "Razlikuje velika i mala slova u datotečnom sustavu",
"Disabling it will allow to use a case insensitive file system, but comes with a performance penalty" : "Onemogućavanje omogućuje korištenje datotečnog sustava koji ne razlikuje velika i mala slova, ali uz smanjenje performansi",
"Verify ACL access when listing files" : "Provjeri ACL pristup pri pregledu popisa datoteka",
"Check the ACL's of each file or folder inside a directory to filter out items where the account has no read permissions, comes with a performance penalty" : "Provjerava ACL svake datoteke ili mape unutar direktorija kako bi se filtrirale stavke za koje račun nema dopuštenje čitanja, uz smanjenje performansi",
"Timeout" : "Istek vremena",
"SMB/CIFS using OC login" : "SMB/CIFS s prijavom putem OC-a",
"Login as share" : "Prijavi se kao dijeljenje",
"OpenStack Object Storage" : "OpenStack Object Storage",
"Service name" : "Naziv servisa",
"Request timeout (seconds)" : "Istek zahtjeva (u sekundama)",
"External storage" : "Vanjsko spremište za pohranu",
"External storage support" : "Podrška za vanjsku pohranu",
"Adds basic external storage support" : "Dodaje osnovnu podršku za vanjsku pohranu",
"This application enables administrators to configure connections to external storage providers, such as FTP servers, S3 or SWIFT object stores, other Nextcloud servers, WebDAV servers, and more. Administration can choose which types of storage to enable and can mount these storage locations for an account, a group, or the entire system. Users will see a new folder appear in their root Nextcloud directory, which they can access and use like any other Nextcloud folder. External storage also allows people to share files stored in these external locations. In these cases, the credentials for the owner of the file are used when the recipient requests the file from external storage, thereby ensuring that the recipient can access the shared file.\n\nExternal storage can be configured using the GUI or at the command line. This second option provides the administration with more flexibility for configuring bulk external storage mounts and setting mount priorities. More information is available in the external storage GUI documentation and the external storage Configuration File documentation." : "Ova aplikacija omogućuje administratorima konfiguriranje veza s vanjskim pružateljima pohrane, kao što su FTP poslužitelji, S3 ili SWIFT spremišta objekata, drugi Nextcloud poslužitelji, WebDAV poslužitelji i drugi. Administracija može odabrati koje vrste pohrane će omogućiti te može postaviti te lokacije pohrane za pojedini račun, grupu ili cijeli sustav. Korisnicima će se u korijenskom Nextcloud direktoriju pojaviti nova mapa kojoj mogu pristupiti i koristiti je kao i bilo koju drugu Nextcloud mapu. Vanjska pohrana također omogućuje dijeljenje datoteka pohranjenih na tim vanjskim lokacijama. U tim se slučajevima prilikom zahtjeva za datoteku iz vanjske pohrane koriste vjerodajnice vlasnika datoteke, čime se osigurava da primatelj može pristupiti dijeljenoj datoteci.\n\nVanjska pohrana može se konfigurirati putem grafičkog sučelja ili iz naredbenog retka. Ova druga mogućnost administratorima pruža veću fleksibilnost pri konfiguriranju većeg broja vanjskih točaka postavljanja i namještanju prioriteta postavljanja. Više informacija dostupno je u dokumentaciji grafičkog sučelja za vanjsku pohranu te u dokumentaciji konfiguracijske datoteke za vanjsku pohranu.",
"Edit storage" : "Uredi pohranu",
"Add storage" : "Dodaj pohranu",
"Folder name" : "Naziv mape",
"Authentication" : "Autentifikacija",
"Cancel" : "Cancel",
"Cancel" : "Odustani",
"Edit" : "Uredi",
"Create" : "Stvori",
"Restrict to" : "Ograniči na",
"Storage configuration" : "Konfiguracija pohrane",
"Never" : "Nikad",
"Once every direct access" : "Jednom za svaki izravni pristup",
"Always" : "Uvijek",
"Mount options" : "Opcije postavljanja",
"Check filesystem changes" : "Provjeri promjene datotečnog sustava",
"Read only" : "Samo za čitanje",
"Enable previews" : "Omogući pretpregled",
"Enable sharing" : "Omogući dijeljenje",
@@ -79,19 +103,58 @@
"Compatibility with Mac NFD encoding (slow)" : "Kompatibilnost s kodiranjem Mac NFD (sporo)",
"External storages" : "Vanjsko spremište za pohranu",
"Status" : "Status",
"Restricted to" : "Ograničeno na",
"Actions" : "Radnje",
"Checking …" : "Provjeravam …",
"Recheck status" : "Ponovno provjeri status",
"Delete" : "Izbriši",
"System provided storage" : "Pohrana koju pruža sustav",
"Saved" : "Spremljeno",
"Error while saving" : "Greška u spremanju",
"Saved allowed backends" : "Spremljeni dopušteni pozadinski sustavi",
"Failed to save allowed backends" : "Greška u spremanju dopuštenih pozadinskih sustava",
"Advanced options for external storage mounts" : "Napredne opcije za postavljanje vanjske pohrane",
"Allow people to mount external storage" : "Dopusti korisnicima postavljanje vanjske pohrane",
"External storage backends people are allowed to mount" : "Pozadinski sustavi vanjske pohrane koje korisnici smiju postaviti",
"Error generating key pair" : "Pogreška pri generiranju parova ključeva",
"Key size" : "Veličina ključa",
"Generate keys" : "Generiraj ključeve",
"Confirm" : "Potvrdi",
"Storage credentials" : "Vjerodajnice pohrane",
"To access the storage, you need to provide the authentication credentials." : "Za pristup pohrani potrebno je unijeti vjerodajnice za autentifikaciju.",
"Enter the storage login" : "Unesite korisničko ime pohrane",
"Enter the storage password" : "Unesite lozinku pohrane",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices." : "Vanjska pohrana omogućuje postavljanje vanjskih usluga i uređaja za pohranu kao sekundarnih Nextcloud uređaja za pohranu.",
"You may also allow people to mount their own external storage services." : "Također možete dopustiti korisnicima postavljanje vlastite vanjske usluge pohrane.",
"The cURL support in PHP is not enabled or installed." : "Podrška za cURL u PHP-u nije omogućena ili nije instalirana.",
"The FTP support in PHP is not enabled or installed." : "Podrša za FTP u PHP-u nije omogućena ili nije instalirana.",
"{module} is not installed." : "{module} nije instaliran.",
"Dependant backends" : "Ovisni pozadinski sustavi",
"No external storage configured or you do not have the permission to configure them" : "Nema konfigurirane vanjske pohrane ili nemate dopuštenje za njezino konfiguriranje",
"Add external storage" : "Dodaj vanjsku pohranu",
"Global credentials saved" : "Globalne vjerodajnice spremljene",
"Could not save global credentials" : "Nije moguće spremiti globalne vjerodajnice",
"Global credentials can be used to authenticate with multiple external storages that have the same credentials." : "Globalne vjerodajnice mogu se upotrebljavati za provođenje autentifikacije na više vanjskih pohrana koje imaju iste vjerodajnice.",
"Saving …" : "Spremanje…",
"Save" : "Spremi",
"Unable to update this external storage config. {statusMessage}" : "Nije moguće ažurirati ovu konfiguraciju vanjske pohrane. {statusMessage}",
"New configuration successfully saved" : "Nova konfiguracija uspješno spremljena",
"Enter missing credentials" : "Unesite nedostajuće vjerodajnice",
"Credentials successfully set" : "Vjerodajnice uspješno postavljenje",
"Error while setting credentials: {error}" : "Greška pri postavljanju vjerodajnica: {error}",
"Checking storage …" : "Provjera pohrane …",
"There was an error with this external storage." : "Došlo je do pogreške s ovom vanjskom pohranom.",
"We were unable to check the external storage {basename}" : "Nismo uspjeli provjeriti vanjsku pohranu {basename}",
"Examine this faulty external storage configuration" : "Ispitaj ovu neispravnu konfiguraciju vanjske pohrane",
"Open in Files" : "Otvori u aplikaciji Datoteke",
"External mount error" : "Pogreška vanjskog postavljanja",
"There was an error with this external storage. Do you want to review this mount point config in the settings page?" : "Došlo je do pogreške s ovom vanjskom pohranom. Želite li pregledati konfiguraciju ove točke postavljanja na stranici postavki?",
"Open settings" : "Otvori postavke",
"Ignore" : "Zanemari",
"List of external storage." : "Popis vanjske pohrane.",
"There is no external storage configured. You can configure them in your Personal settings." : "Nema konfigurirane vanjske pohrane. Možete je konfigurirati u osobnim postavkama.",
"There is no external storage configured and you don't have the permission to configure them." : "Nema konfigurirane vanjske pohrane i nemate dopuštenje za njezino konfiguriranje.",
"No external storage" : "Nema vanjske pohrane",
"Storage type" : "Vrsta pohrane",
"Unknown" : "Nepoznata pogreška",
"Scope" : "Opseg",
@@ -99,6 +162,8 @@
"System" : "Sustav",
"Connected" : "Povezano",
"Error" : "Pogreška",
"Indeterminate" : "Neodređeno",
"Incomplete configuration" : "Nepotpuna konfiguracija",
"Unauthorized" : "Neovlašteno",
"Network error" : "Pogreška mreže",
"Grant access" : "Dodijeli pristup",
@@ -115,17 +180,28 @@
"The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Podrška za cURL u PHP-u nije omogućena niti instalirana. Nije moguće postaviti %s. Zatražite od svog administratora sustava da je instalira.",
"The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "Podrška za FTP u PHP-u nije omogućena niti instalirana. Nije moguće postaviti %s. Zatražite od svog administratora sustava da je instalira.",
"\"%1$s\" is not installed. Mounting of %2$s is not possible. Please ask your system administrator to install it." : "„%1$s” nije instaliran. Nije moguće postaviti %2$s. Zatražite od svog administratora sustava da ga instalira.",
"Checking storage …" : "Provjera pohrane …",
"Type to select account or group." : "Upišite za odabir računa ili grupe.",
"(Group)" : "(Grupa)",
"Check for changes" : "Provjeri za promjene",
"Disconnect" : "Odspoji",
"Unknown backend: {backendName}" : "Nepoznat pozadinski sustav: {backendName}",
"Admin defined" : "Definira administrator",
"Automatic status checking is disabled due to the large number of configured storages, click to check status" : "Automatska provjera statusa onemogućena je zbog velikog broja konfiguriranih pohrana, kliknite za provjeru statusa",
"Are you sure you want to disconnect this external storage? It will make the storage unavailable in Nextcloud and will lead to a deletion of these files and folders on any sync client that is currently connected but will not delete any files and folders on the external storage itself." : "Jeste li sigurni da želite odspojiti ovu vanjsku pohranu? Time će pohrana postati nedostupna u Nextcloudu i uzrokovat će brisanje tih datoteka i mapa na svim sinkronizacijskim klijentima koji su trenutačno povezani, ali neće izbrisati nijednu datoteku ni mapu na samoj vanjskoj pohrani.",
"Delete storage?" : "Želite li izbrisati pohranu?",
"Click to recheck the configuration" : "Kliknite za ponovnu provjeru konfiguracije",
"Saving …" : "Spremanje...",
"Failed to save global credentials" : "Neuspjelo spremanje globalnih vjerodajnica",
"Failed to save global credentials: {message}" : "Neuspjelo spremanje globalnih vjerodajnica: {message}",
"No external storage configured or you don't have the permission to configure them" : "Nema konfigurirane vanjske pohrane ili nemate dopuštenje za konfiguriranje",
"Open documentation" : "Otvori dokumentaciju",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices. You may also allow people to mount their own external storage services." : "Vanjska pohrana omogućuje montiranje vanjskih usluga i uređaja za pohranu kao sekundarnih Nextcloud uređaja za pohranu. Također možete dopustiti korisnicima postavljanje vlastite vanjske usluge pohrane.",
"Configuration" : "Konfiguracija",
"Available for" : "Dostupno za",
"Advanced settings" : "Napredne postavke"
"All people" : "Svi korisnici",
"Advanced settings" : "Napredne postavke",
"Are you sure you want to disconnect this external storage?" : "Jeste li sigurni da želite odspojiti ovu vanjsku pohranu?",
"It will make the storage unavailable in {instanceName} and will lead to a deletion of these files and folders on any sync client that is currently connected but will not delete any files and folders on the external storage itself." : "Time će pohrana postati nedostupna u {instanceName} i dovest će do brisanja tih datoteka i mapa na svim sinkronizacijskim klijentima koji su trenutačno povezani, ali neće izbrisati nijednu datoteku ni mapu na samoj vanjskoj pohrani."
},"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"
}

View File

@@ -41,6 +41,7 @@ OC.L10N.register(
"Kerberos default realm, defaults to \"WORKGROUP\"" : "Kerberosのデフォルトのレルム、デフォルトは「WORKGROUP」です",
"Kerberos ticket Apache mode" : "Kerberosチケット Apache モード",
"Kerberos ticket" : "ケルベロスチケット",
"S3 Storage" : "S3ストレージ",
"Bucket" : "バケット名",
"Hostname" : "ホスト名",
"Port" : "ポート",
@@ -51,6 +52,7 @@ OC.L10N.register(
"Enable Path Style" : "パス形式を有効",
"Legacy (v2) authentication" : "レガシー認証(v2)",
"Enable multipart copy" : "マルチパートコピーの有効化",
"Use presigned S3 url" : "事前署名付き S3 URL を使用する",
"SSE-C encryption key" : "SSE-C暗号化キー",
"WebDAV" : "WebDAV",
"URL" : "URL",
@@ -82,15 +84,20 @@ OC.L10N.register(
"External storage support" : "外部ストレージに対応",
"Adds basic external storage support" : "基本的な外部ストレージの対応を追加",
"This application enables administrators to configure connections to external storage providers, such as FTP servers, S3 or SWIFT object stores, other Nextcloud servers, WebDAV servers, and more. Administration can choose which types of storage to enable and can mount these storage locations for an account, a group, or the entire system. Users will see a new folder appear in their root Nextcloud directory, which they can access and use like any other Nextcloud folder. External storage also allows people to share files stored in these external locations. In these cases, the credentials for the owner of the file are used when the recipient requests the file from external storage, thereby ensuring that the recipient can access the shared file.\n\nExternal storage can be configured using the GUI or at the command line. This second option provides the administration with more flexibility for configuring bulk external storage mounts and setting mount priorities. More information is available in the external storage GUI documentation and the external storage Configuration File documentation." : "このアプリケーションは、管理者がFTPサーバー、S3またはSWIFTオブジェクトストア、他のNextcloudサーバー、WebDAVサーバーなどの外部ストレージプロバイダーへの接続を設定できるようにします。管理者は、有効にするストレージの種類を選択し、これらのストレージの場所をアカウント、グループ、またはシステム全体にマウントできます。ユーザーは、ルートNextcloudディレクトリに新しいフォルダが表示され、他のNextcloudフォルダと同様にアクセスして使用できます。外部ストレージを使用すると、これらの外部位置に保存されているファイルを共有することもできます。これらの場合、受信者が外部ストレージからファイルをリクエストするときに、ファイルの所有者の資格情報が使用され、受信者が共有されたファイルにアクセスできることが保証されます。\n\n外部ストレージはGUIまたはコマンドラインを使用して設定できます。この第二のオプションでは、管理者は大量の外部ストレージのマウントやマウントの優先順位の設定を柔軟に行うことができます。外部ストレージのGUIドキュメントと外部ストレージの構成ファイルのドキュメントには、詳細な情報が記載されています。",
"Edit storage" : "ストレージを編集",
"Add storage" : "ストレージを追加",
"Folder name" : "フォルダー名",
"Authentication" : "認証",
"Cancel" : "キャンセル",
"Edit" : "編集",
"Create" : "作成",
"Restrict to" : "制限する",
"Storage configuration" : "ストレージ設定",
"Never" : "更新無",
"Once every direct access" : "直指定時のみ",
"Always" : "常に",
"Mount options" : "マウントオプション",
"Check filesystem changes" : "ファイルシステムの変更を確認する",
"Read only" : "読み取り専用",
"Enable previews" : "プレビューを有効に",
"Enable sharing" : "共有の有効化",
@@ -98,11 +105,19 @@ OC.L10N.register(
"Compatibility with Mac NFD encoding (slow)" : "Mac NFD エンコード互換 (遅い)",
"External storages" : "外部ストレージ",
"Status" : "ステータス",
"Restricted to" : "制限されている",
"Actions" : "アクション",
"Checking …" : "チェック中…",
"Recheck status" : "ステータスを再確認",
"Delete" : "削除",
"System provided storage" : "システム提供ストレージ",
"Saved" : "保存しました",
"Error while saving" : "保存中にエラーが発生しました",
"Saved allowed backends" : "保存された許可されたバックエンド",
"Failed to save allowed backends" : "許可されたバックエンドの保存に失敗しました",
"Advanced options for external storage mounts" : "外部ストレージマウントの高度なオプション",
"Allow people to mount external storage" : "ユーザーに外部ストレージの接続を許可する",
"External storage backends people are allowed to mount" : "ユーザーがマウントできる外部ストレージバックエンド",
"Error generating key pair" : "キーペアの生成エラー",
"Key size" : "キーのサイズ",
"Generate keys" : "キーを生成",
@@ -111,6 +126,16 @@ OC.L10N.register(
"To access the storage, you need to provide the authentication credentials." : "ストレージにアクセスするには、認証情報を提供する必要があります。",
"Enter the storage login" : "ストレージのログインを入力してください",
"Enter the storage password" : "ストレージのパスワードを入力してください",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices." : "外部ストレージを使用すると、外部のストレージサービスやデバイスをセカンダリのNextcloudストレージデバイスとしてマウントできます。",
"You may also allow people to mount their own external storage services." : "ユーザーが自分の外部ストレージサービスをマウントできるようにすることも可能です。",
"The cURL support in PHP is not enabled or installed." : "PHPでcURLサポートが有効になっていないか、インストールされていません。",
"The FTP support in PHP is not enabled or installed." : "PHPでFTPサポートが有効になっていないか、インストールされていません。",
"{module} is not installed." : "{module} がインストールされていません。",
"Dependant backends" : "依存しているバックエンド",
"No external storage configured or you do not have the permission to configure them" : "外部ストレージが設定されていないか、外部ストレージを設定する権限がありません",
"Add external storage" : "外部ストレージを追加",
"Global credentials saved" : "グローバル認証情報が保存されました",
"Could not save global credentials" : "グローバル資格情報を保存できませんでした",
"Global credentials can be used to authenticate with multiple external storages that have the same credentials." : "グローバル資格情報を使用して、同じ資格情報を持つ複数の外部記憶装置で認証することができます。",
"Saving …" : "保存中 …",
"Save" : "保存",
@@ -126,6 +151,7 @@ OC.L10N.register(
"Open in Files" : "ファイルアプリで開く",
"External mount error" : "外部マウントエラー",
"There was an error with this external storage. Do you want to review this mount point config in the settings page?" : "この外部ストレージでエラーが発生しました。設定ページでこのマウントポイントの設定を見直しますか?",
"Open settings" : "設定を開く",
"Ignore" : "無視する",
"List of external storage." : "外部ストレージの一覧。",
"There is no external storage configured. You can configure them in your Personal settings." : "外部ストレージは設定されていません。個人設定で設定できます。",
@@ -138,6 +164,8 @@ OC.L10N.register(
"System" : "システム",
"Connected" : "接続しました",
"Error" : "エラー",
"Indeterminate" : "不定",
"Incomplete configuration" : "設定が不完全です",
"Unauthorized" : "権限がありません",
"Network error" : "ネットワークエラー",
"Grant access" : "アクセスを許可",

View File

@@ -39,6 +39,7 @@
"Kerberos default realm, defaults to \"WORKGROUP\"" : "Kerberosのデフォルトのレルム、デフォルトは「WORKGROUP」です",
"Kerberos ticket Apache mode" : "Kerberosチケット Apache モード",
"Kerberos ticket" : "ケルベロスチケット",
"S3 Storage" : "S3ストレージ",
"Bucket" : "バケット名",
"Hostname" : "ホスト名",
"Port" : "ポート",
@@ -49,6 +50,7 @@
"Enable Path Style" : "パス形式を有効",
"Legacy (v2) authentication" : "レガシー認証(v2)",
"Enable multipart copy" : "マルチパートコピーの有効化",
"Use presigned S3 url" : "事前署名付き S3 URL を使用する",
"SSE-C encryption key" : "SSE-C暗号化キー",
"WebDAV" : "WebDAV",
"URL" : "URL",
@@ -80,15 +82,20 @@
"External storage support" : "外部ストレージに対応",
"Adds basic external storage support" : "基本的な外部ストレージの対応を追加",
"This application enables administrators to configure connections to external storage providers, such as FTP servers, S3 or SWIFT object stores, other Nextcloud servers, WebDAV servers, and more. Administration can choose which types of storage to enable and can mount these storage locations for an account, a group, or the entire system. Users will see a new folder appear in their root Nextcloud directory, which they can access and use like any other Nextcloud folder. External storage also allows people to share files stored in these external locations. In these cases, the credentials for the owner of the file are used when the recipient requests the file from external storage, thereby ensuring that the recipient can access the shared file.\n\nExternal storage can be configured using the GUI or at the command line. This second option provides the administration with more flexibility for configuring bulk external storage mounts and setting mount priorities. More information is available in the external storage GUI documentation and the external storage Configuration File documentation." : "このアプリケーションは、管理者がFTPサーバー、S3またはSWIFTオブジェクトストア、他のNextcloudサーバー、WebDAVサーバーなどの外部ストレージプロバイダーへの接続を設定できるようにします。管理者は、有効にするストレージの種類を選択し、これらのストレージの場所をアカウント、グループ、またはシステム全体にマウントできます。ユーザーは、ルートNextcloudディレクトリに新しいフォルダが表示され、他のNextcloudフォルダと同様にアクセスして使用できます。外部ストレージを使用すると、これらの外部位置に保存されているファイルを共有することもできます。これらの場合、受信者が外部ストレージからファイルをリクエストするときに、ファイルの所有者の資格情報が使用され、受信者が共有されたファイルにアクセスできることが保証されます。\n\n外部ストレージはGUIまたはコマンドラインを使用して設定できます。この第二のオプションでは、管理者は大量の外部ストレージのマウントやマウントの優先順位の設定を柔軟に行うことができます。外部ストレージのGUIドキュメントと外部ストレージの構成ファイルのドキュメントには、詳細な情報が記載されています。",
"Edit storage" : "ストレージを編集",
"Add storage" : "ストレージを追加",
"Folder name" : "フォルダー名",
"Authentication" : "認証",
"Cancel" : "キャンセル",
"Edit" : "編集",
"Create" : "作成",
"Restrict to" : "制限する",
"Storage configuration" : "ストレージ設定",
"Never" : "更新無",
"Once every direct access" : "直指定時のみ",
"Always" : "常に",
"Mount options" : "マウントオプション",
"Check filesystem changes" : "ファイルシステムの変更を確認する",
"Read only" : "読み取り専用",
"Enable previews" : "プレビューを有効に",
"Enable sharing" : "共有の有効化",
@@ -96,11 +103,19 @@
"Compatibility with Mac NFD encoding (slow)" : "Mac NFD エンコード互換 (遅い)",
"External storages" : "外部ストレージ",
"Status" : "ステータス",
"Restricted to" : "制限されている",
"Actions" : "アクション",
"Checking …" : "チェック中…",
"Recheck status" : "ステータスを再確認",
"Delete" : "削除",
"System provided storage" : "システム提供ストレージ",
"Saved" : "保存しました",
"Error while saving" : "保存中にエラーが発生しました",
"Saved allowed backends" : "保存された許可されたバックエンド",
"Failed to save allowed backends" : "許可されたバックエンドの保存に失敗しました",
"Advanced options for external storage mounts" : "外部ストレージマウントの高度なオプション",
"Allow people to mount external storage" : "ユーザーに外部ストレージの接続を許可する",
"External storage backends people are allowed to mount" : "ユーザーがマウントできる外部ストレージバックエンド",
"Error generating key pair" : "キーペアの生成エラー",
"Key size" : "キーのサイズ",
"Generate keys" : "キーを生成",
@@ -109,6 +124,16 @@
"To access the storage, you need to provide the authentication credentials." : "ストレージにアクセスするには、認証情報を提供する必要があります。",
"Enter the storage login" : "ストレージのログインを入力してください",
"Enter the storage password" : "ストレージのパスワードを入力してください",
"External storage enables you to mount external storage services and devices as secondary Nextcloud storage devices." : "外部ストレージを使用すると、外部のストレージサービスやデバイスをセカンダリのNextcloudストレージデバイスとしてマウントできます。",
"You may also allow people to mount their own external storage services." : "ユーザーが自分の外部ストレージサービスをマウントできるようにすることも可能です。",
"The cURL support in PHP is not enabled or installed." : "PHPでcURLサポートが有効になっていないか、インストールされていません。",
"The FTP support in PHP is not enabled or installed." : "PHPでFTPサポートが有効になっていないか、インストールされていません。",
"{module} is not installed." : "{module} がインストールされていません。",
"Dependant backends" : "依存しているバックエンド",
"No external storage configured or you do not have the permission to configure them" : "外部ストレージが設定されていないか、外部ストレージを設定する権限がありません",
"Add external storage" : "外部ストレージを追加",
"Global credentials saved" : "グローバル認証情報が保存されました",
"Could not save global credentials" : "グローバル資格情報を保存できませんでした",
"Global credentials can be used to authenticate with multiple external storages that have the same credentials." : "グローバル資格情報を使用して、同じ資格情報を持つ複数の外部記憶装置で認証することができます。",
"Saving …" : "保存中 …",
"Save" : "保存",
@@ -124,6 +149,7 @@
"Open in Files" : "ファイルアプリで開く",
"External mount error" : "外部マウントエラー",
"There was an error with this external storage. Do you want to review this mount point config in the settings page?" : "この外部ストレージでエラーが発生しました。設定ページでこのマウントポイントの設定を見直しますか?",
"Open settings" : "設定を開く",
"Ignore" : "無視する",
"List of external storage." : "外部ストレージの一覧。",
"There is no external storage configured. You can configure them in your Personal settings." : "外部ストレージは設定されていません。個人設定で設定できます。",
@@ -136,6 +162,8 @@
"System" : "システム",
"Connected" : "接続しました",
"Error" : "エラー",
"Indeterminate" : "不定",
"Incomplete configuration" : "設定が不完全です",
"Unauthorized" : "権限がありません",
"Network error" : "ネットワークエラー",
"Grant access" : "アクセスを許可",

View File

@@ -164,6 +164,8 @@ OC.L10N.register(
"System" : "System",
"Connected" : "Połączony",
"Error" : "Błąd",
"Indeterminate" : "Nieokreślone",
"Incomplete configuration" : "Niekompletna konfiguracja",
"Unauthorized" : "Nieautoryzowany",
"Network error" : "Błąd sieci",
"Grant access" : "Udziel dostępu",

View File

@@ -162,6 +162,8 @@
"System" : "System",
"Connected" : "Połączony",
"Error" : "Błąd",
"Indeterminate" : "Nieokreślone",
"Incomplete configuration" : "Niekompletna konfiguracja",
"Unauthorized" : "Nieautoryzowany",
"Network error" : "Błąd sieci",
"Grant access" : "Udziel dostępu",

View File

@@ -18,6 +18,7 @@ use OCA\Files_External\Service\UserGlobalStoragesService;
use OCA\Files_External\Service\UserStoragesService;
use OCP\Files\Config\IAuthoritativeMountProvider;
use OCP\Files\Config\IMountProvider;
use OCP\Files\Config\IPartialMountProvider;
use OCP\Files\Mount\IMountPoint;
use OCP\Files\ObjectStore\IObjectStore;
use OCP\Files\Storage\IConstructableStorage;
@@ -26,6 +27,7 @@ use OCP\Files\Storage\IStorageFactory;
use OCP\Files\StorageNotAvailableException;
use OCP\IUser;
use OCP\Server;
use Override;
use Psr\Clock\ClockInterface;
use Psr\Container\ContainerExceptionInterface;
use Psr\Log\LoggerInterface;
@@ -33,7 +35,7 @@ use Psr\Log\LoggerInterface;
/**
* Make the old files_external config work with the new public mount config api
*/
class ConfigAdapter implements IMountProvider, IAuthoritativeMountProvider {
class ConfigAdapter implements IMountProvider, IAuthoritativeMountProvider, IPartialMountProvider {
public function __construct(
private UserStoragesService $userStoragesService,
private UserGlobalStoragesService $userGlobalStoragesService,
@@ -81,8 +83,6 @@ class ConfigAdapter implements IMountProvider, IAuthoritativeMountProvider {
/**
* Construct the storage implementation
*
* @param StorageConfig $storageConfig
*/
private function constructStorage(StorageConfig $storageConfig): IStorage {
$class = $storageConfig->getBackend()->getStorageClass();
@@ -99,17 +99,12 @@ class ConfigAdapter implements IMountProvider, IAuthoritativeMountProvider {
}
/**
* Get all mountpoints applicable for the user
*
* @return IMountPoint[]
* @param list<StorageConfig> $storageConfigs
* @return array
* @throws ContainerExceptionInterface
*/
public function getMountsForUser(IUser $user, IStorageFactory $loader) {
$this->userStoragesService->setUser($user);
$this->userGlobalStoragesService->setUser($user);
$storageConfigs = $this->userGlobalStoragesService->getAllStoragesForUser();
$storages = array_map(function (StorageConfig $storageConfig) use ($user) {
private function getAvailableStorages(array $storageConfigs, IUser $user): array {
$storages = array_map(function (StorageConfig $storageConfig) use ($user): IStorage {
try {
return $this->constructStorageForUser($user, $storageConfig);
} catch (\Exception $e) {
@@ -123,7 +118,7 @@ class ConfigAdapter implements IMountProvider, IAuthoritativeMountProvider {
return $storage->getId();
}, $storages));
$availableStorages = array_map(function (IStorage $storage, StorageConfig $storageConfig): IStorage {
return array_map(function (IStorage $storage, StorageConfig $storageConfig): IStorage {
try {
$availability = $storage->getAvailability();
if (!$availability['available'] && !Availability::shouldRecheck($availability)) {
@@ -137,35 +132,23 @@ class ConfigAdapter implements IMountProvider, IAuthoritativeMountProvider {
}
return $storage;
}, $storages, $storageConfigs);
}
/**
* Get all mountpoints applicable for the user
*
* @return IMountPoint[]
*/
public function getMountsForUser(IUser $user, IStorageFactory $loader): array {
$this->userStoragesService->setUser($user);
$this->userGlobalStoragesService->setUser($user);
$storageConfigs = $this->userGlobalStoragesService->getAllStoragesForUser();
$availableStorages = $this->getAvailableStorages($storageConfigs, $user);
$mounts = array_map(function (StorageConfig $storageConfig, IStorage $storage) use ($user, $loader) {
$storage->setOwner($user->getUID());
if ($storageConfig->getType() === StorageConfig::MOUNT_TYPE_PERSONAL) {
return new PersonalMount(
$this->userStoragesService,
$storageConfig,
$storageConfig->getId(),
new KnownMtime([
'storage' => $storage,
'clock' => $this->clock,
]),
'/' . $user->getUID() . '/files' . $storageConfig->getMountPoint(),
null,
$loader,
$storageConfig->getMountOptions(),
$storageConfig->getId(),
);
} else {
return new SystemMountPoint(
$storageConfig,
$storage,
'/' . $user->getUID() . '/files' . $storageConfig->getMountPoint(),
null,
$loader,
$storageConfig->getMountOptions(),
$storageConfig->getId(),
);
}
$mountpoint = '/' . $user->getUID() . '/files' . $storageConfig->getMountPoint();
return $this->storageConfigToMount($user, $mountpoint, $loader, $storage, $storageConfig);
}, $storageConfigs, $availableStorages);
$this->userStoragesService->resetUser();
@@ -173,4 +156,65 @@ class ConfigAdapter implements IMountProvider, IAuthoritativeMountProvider {
return $mounts;
}
#[Override]
public function getMountsForPath(string $setupPathHint, bool $forChildren, array $mountProviderArgs, IStorageFactory $loader): array {
$user = $mountProviderArgs[0]->mountInfo->getUser();
if (!$forChildren) {
// override path with mount point when fetching without children
$setupPathHint = $mountProviderArgs[0]->mountInfo->getMountPoint();
}
$this->userStoragesService->setUser($user);
$this->userGlobalStoragesService->setUser($user);
$storageConfigs = $this->userGlobalStoragesService->getAllStoragesForUserWithPath($setupPathHint, $forChildren);
$availableStorages = $this->getAvailableStorages($storageConfigs, $user);
$mounts = [];
$i = 0;
foreach ($storageConfigs as $storageConfig) {
$storage = $availableStorages[$i];
$i++;
$mountPoint = '/' . $user->getUID() . '/files' . $storageConfig->getMountPoint();
$mounts[$mountPoint] = $this->storageConfigToMount($user, $mountPoint, $loader, $storage, $storageConfig);
}
$this->userStoragesService->resetUser();
$this->userGlobalStoragesService->resetUser();
return $mounts;
}
private function storageConfigToMount(IUser $user, string $mountPoint, IStorageFactory $loader, IStorage $storage, StorageConfig $storageConfig): IMountPoint {
$storage->setOwner($user->getUID());
if ($storageConfig->getType() === StorageConfig::MOUNT_TYPE_PERSONAL) {
return new PersonalMount(
$this->userStoragesService,
$storageConfig,
$storageConfig->getId(),
new KnownMtime([
'storage' => $storage,
'clock' => $this->clock,
]),
$mountPoint,
null,
$loader,
$storageConfig->getMountOptions(),
$storageConfig->getId()
);
} else {
return new SystemMountPoint(
$storageConfig,
$storage,
$mountPoint,
null,
$loader,
$storageConfig->getMountOptions(),
$storageConfig->getId()
);
}
}
}

View File

@@ -70,7 +70,7 @@ class SFTP extends Common {
$parsedHost = $this->splitHost($parameters['host']);
$this->host = $parsedHost[0];
$this->port = $parsedHost[1];
$this->port = $parameters['port'] ?? $parsedHost[1];
if (!isset($parameters['user'])) {
throw new \UnexpectedValueException('no authentication parameters specified');

View File

@@ -76,10 +76,8 @@ class StorageConfig implements \JsonSerializable {
/**
* Priority
*
* @var int
*/
private $priority;
private int $priority = 100;
/**
* List of users who have access to this storage
@@ -242,7 +240,7 @@ class StorageConfig implements \JsonSerializable {
*
* @return int priority
*/
public function getPriority() {
public function getPriority(): int {
return $this->priority;
}
@@ -251,7 +249,7 @@ class StorageConfig implements \JsonSerializable {
*
* @param int $priority priority
*/
public function setPriority($priority) {
public function setPriority(int $priority): void {
$this->priority = $priority;
}
@@ -260,7 +258,7 @@ class StorageConfig implements \JsonSerializable {
*
* @return list<string> applicable users
*/
public function getApplicableUsers() {
public function getApplicableUsers(): array {
return $this->applicableUsers;
}
@@ -399,9 +397,7 @@ class StorageConfig implements \JsonSerializable {
$result['backend'] = $this->backend->getIdentifier();
$result['authMechanism'] = $this->authMechanism->getIdentifier();
$result['backendOptions'] = $this->backendOptions;
if (!is_null($this->priority)) {
$result['priority'] = $this->priority;
}
$result['priority'] = $this->priority;
if (!empty($this->applicableUsers)) {
$result['applicableUsers'] = $this->applicableUsers;
}

View File

@@ -9,6 +9,7 @@
namespace OCA\Files_External\Service;
use OCP\DB\Exception;
use OCP\DB\QueryBuilder\IParameter;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
use OCP\Security\ICrypto;
@@ -17,7 +18,17 @@ use OCP\Security\ICrypto;
* Stores the mount config in the database
*
* @psalm-type ApplicableConfig = array{type: int, value: string}
* @psalm-type StorageConfigData = array{type: int, priority: int, applicable: list<ApplicableConfig>, config: array, options: array, ...<string, mixed>}
* @psalm-type ExternalMountInfo = array{
* mount_id: int,
* mount_point: string,
* storage_backend: string,
* auth_backend: string,
* priority: int,
* type: self::MOUNT_TYPE_ADMIN|self::MOUNT_TYPE_PERSONAL,
* applicable: list<ApplicableConfig>,
* config: array,
* options: array,
* }
*/
class DBConfigService {
public const MOUNT_TYPE_ADMIN = 1;
@@ -35,6 +46,9 @@ class DBConfigService {
) {
}
/**
* @return ?ExternalMountInfo
*/
public function getMountById(int $mountId): ?array {
$builder = $this->connection->getQueryBuilder();
$query = $builder->select(['mount_id', 'mount_point', 'storage_backend', 'auth_backend', 'priority', 'type'])
@@ -51,57 +65,88 @@ class DBConfigService {
/**
* Get all configured mounts
*
* @return array
* @return list<ExternalMountInfo>
*/
public function getAllMounts() {
public function getAllMounts(): array {
$builder = $this->connection->getQueryBuilder();
$query = $builder->select(['mount_id', 'mount_point', 'storage_backend', 'auth_backend', 'priority', 'type'])
->from('external_mounts');
return $this->getMountsFromQuery($query);
}
public function getMountsForUser($userId, $groupIds) {
$builder = $this->connection->getQueryBuilder();
$query = $builder->select(['m.mount_id', 'mount_point', 'storage_backend', 'auth_backend', 'priority', 'm.type'])
->from('external_mounts', 'm')
->innerJoin('m', 'external_applicable', 'a', $builder->expr()->eq('m.mount_id', 'a.mount_id'))
->where($builder->expr()->orX(
$builder->expr()->andX( // global mounts
$builder->expr()->eq('a.type', $builder->createNamedParameter(self::APPLICABLE_TYPE_GLOBAL, IQueryBuilder::PARAM_INT)),
$builder->expr()->isNull('a.value'),
),
$builder->expr()->andX( // mounts for user
$builder->expr()->eq('a.type', $builder->createNamedParameter(self::APPLICABLE_TYPE_USER, IQueryBuilder::PARAM_INT)),
$builder->expr()->eq('a.value', $builder->createNamedParameter($userId)),
),
$builder->expr()->andX( // mounts for group
$builder->expr()->eq('a.type', $builder->createNamedParameter(self::APPLICABLE_TYPE_GROUP, IQueryBuilder::PARAM_INT)),
$builder->expr()->in('a.value', $builder->createNamedParameter($groupIds, IQueryBuilder::PARAM_STR_ARRAY)),
),
));
public function getMountsForUser(string $userId, array $groupIds): array {
$builder = $this->getSelectQueryBuilder();
$builder = $builder->where($builder->expr()->orX(
$builder->expr()->andX( // global mounts
$builder->expr()->eq('a.type', $builder->createNamedParameter(self::APPLICABLE_TYPE_GLOBAL, IQueryBuilder::PARAM_INT)),
$builder->expr()->isNull('a.value'),
),
$builder->expr()->andX( // mounts for user
$builder->expr()->eq('a.type', $builder->createNamedParameter(self::APPLICABLE_TYPE_USER, IQueryBuilder::PARAM_INT)),
$builder->expr()->eq('a.value', $builder->createNamedParameter($userId)),
),
$builder->expr()->andX( // mounts for group
$builder->expr()->eq('a.type', $builder->createNamedParameter(self::APPLICABLE_TYPE_GROUP, IQueryBuilder::PARAM_INT)),
$builder->expr()->in('a.value', $builder->createNamedParameter($groupIds, IQueryBuilder::PARAM_STR_ARRAY)),
),
));
return $this->getMountsFromQuery($query);
return $this->getMountsFromQuery($builder);
}
/**
* @param list<string> $groupIds
* @return list<StorageConfigData>
* @return list<ExternalMountInfo>
*/
public function getMountsForGroups(array $groupIds): array {
$builder = $this->getSelectQueryBuilder();
$builder = $builder->where($builder->expr()->andX( // mounts for group
$builder->expr()->eq('a.type', $builder->createNamedParameter(self::APPLICABLE_TYPE_GROUP, IQueryBuilder::PARAM_INT)),
$builder->expr()->in('a.value', $builder->createNamedParameter($groupIds, IQueryBuilder::PARAM_STR_ARRAY)),
));
return $this->getMountsFromQuery($builder);
}
private function getSelectQueryBuilder(): IQueryBuilder {
$builder = $this->connection->getQueryBuilder();
$query = $builder->select(['m.mount_id', 'mount_point', 'storage_backend', 'auth_backend', 'priority', 'm.type'])
return $builder->select(['m.mount_id', 'mount_point', 'storage_backend', 'auth_backend', 'priority', 'm.type'])
->from('external_mounts', 'm')
->innerJoin('m', 'external_applicable', 'a', $builder->expr()->eq('m.mount_id', 'a.mount_id'))
->where($builder->expr()->andX( // mounts for group
->innerJoin('m', 'external_applicable', 'a', $builder->expr()->eq('m.mount_id', 'a.mount_id'));
}
/*
* @return list<ExternalMountInfo>
*/
public function getMountsForUserAndPath(string $userId, array $groupIds, string $path, bool $forChildren): array {
$path = str_replace('/' . $userId . '/files', '', $path);
$builder = $this->getSelectQueryBuilder();
$builder->where($builder->expr()->orX(
$builder->expr()->andX( // global mounts
$builder->expr()->eq('a.type', $builder->createNamedParameter(self::APPLICABLE_TYPE_GLOBAL, IQueryBuilder::PARAM_INT)),
$builder->expr()->isNull('a.value'),
$forChildren ? $builder->expr()->like('m.mount_point', $builder->createNamedParameter($this->connection->escapeLikeParameter($path) . '_%', IQueryBuilder::PARAM_STR))
: $builder->expr()->eq('m.mount_point', $builder->createNamedParameter($path, IQueryBuilder::PARAM_STR)),
),
$builder->expr()->andX( // mounts for user
$builder->expr()->eq('a.type', $builder->createNamedParameter(self::APPLICABLE_TYPE_USER, IQueryBuilder::PARAM_INT)),
$builder->expr()->eq('a.value', $builder->createNamedParameter($userId)),
$forChildren ? $builder->expr()->like('m.mount_point', $builder->createNamedParameter($this->connection->escapeLikeParameter($path) . '_%', IQueryBuilder::PARAM_STR))
: $builder->expr()->eq('m.mount_point', $builder->createNamedParameter($path, IQueryBuilder::PARAM_STR)),
),
$builder->expr()->andX( // mounts for group
$builder->expr()->eq('a.type', $builder->createNamedParameter(self::APPLICABLE_TYPE_GROUP, IQueryBuilder::PARAM_INT)),
$builder->expr()->in('a.value', $builder->createNamedParameter($groupIds, IQueryBuilder::PARAM_STR_ARRAY)),
));
$forChildren ? $builder->expr()->like('m.mount_point', $builder->createNamedParameter($this->connection->escapeLikeParameter($path) . '_%', IQueryBuilder::PARAM_STR))
: $builder->expr()->eq('m.mount_point', $builder->createNamedParameter($path, IQueryBuilder::PARAM_STR)),
),
));
return $this->getMountsFromQuery($query);
return $this->getMountsFromQuery($builder);
}
/**
* @return list<StorageConfigData>
* @return list<ExternalMountInfo>
*/
public function getGlobalMounts(): array {
$builder = $this->connection->getQueryBuilder();
@@ -151,9 +196,9 @@ class DBConfigService {
/**
* Get admin defined mounts
*
* @return array
* @return list<ExternalMountInfo>
*/
public function getAdminMounts() {
public function getAdminMounts(): array {
$builder = $this->connection->getQueryBuilder();
$query = $builder->select(['mount_id', 'mount_point', 'storage_backend', 'auth_backend', 'priority', 'type'])
->from('external_mounts')
@@ -161,19 +206,17 @@ class DBConfigService {
return $this->getMountsFromQuery($query);
}
protected function getForQuery(IQueryBuilder $builder, $type, $value) {
$query = $builder->select(['m.mount_id', 'mount_point', 'storage_backend', 'auth_backend', 'priority', 'm.type'])
->from('external_mounts', 'm')
->innerJoin('m', 'external_applicable', 'a', $builder->expr()->eq('m.mount_id', 'a.mount_id'))
->where($builder->expr()->eq('a.type', $builder->createNamedParameter($type, IQueryBuilder::PARAM_INT)));
protected function getForQuery(IQueryBuilder $builder, int $type, ?string $value): IQueryBuilder {
$builder = $this->getSelectQueryBuilder();
$builder = $builder->where($builder->expr()->eq('a.type', $builder->createNamedParameter($type, IQueryBuilder::PARAM_INT)));
if (is_null($value)) {
$query = $query->andWhere($builder->expr()->isNull('a.value'));
$builder = $builder->andWhere($builder->expr()->isNull('a.value'));
} else {
$query = $query->andWhere($builder->expr()->eq('a.value', $builder->createNamedParameter($value)));
$builder = $builder->andWhere($builder->expr()->eq('a.value', $builder->createNamedParameter($value)));
}
return $query;
return $builder;
}
/**
@@ -181,9 +224,9 @@ class DBConfigService {
*
* @param int $type any of the self::APPLICABLE_TYPE_ constants
* @param string|null $value user_id, group_id or null for global mounts
* @return array
* @return list<ExternalMountInfo>
*/
public function getMountsFor($type, $value) {
public function getMountsFor(int $type, ?string $value): array {
$builder = $this->connection->getQueryBuilder();
$query = $this->getForQuery($builder, $type, $value);
@@ -195,9 +238,9 @@ class DBConfigService {
*
* @param int $type any of the self::APPLICABLE_TYPE_ constants
* @param string|null $value user_id, group_id or null for global mounts
* @return array
* @return list<ExternalMountInfo>
*/
public function getAdminMountsFor($type, $value) {
public function getAdminMountsFor(int $type, ?string $value): array {
$builder = $this->connection->getQueryBuilder();
$query = $this->getForQuery($builder, $type, $value);
$query->andWhere($builder->expr()->eq('m.type', $builder->expr()->literal(self::MOUNT_TYPE_ADMIN, IQueryBuilder::PARAM_INT)));
@@ -210,22 +253,20 @@ class DBConfigService {
*
* @param int $type any of the self::APPLICABLE_TYPE_ constants
* @param string[] $values user_ids or group_ids
* @return array
* @return list<ExternalMountInfo>
*/
public function getAdminMountsForMultiple($type, array $values) {
$builder = $this->connection->getQueryBuilder();
$params = array_map(function ($value) use ($builder) {
public function getAdminMountsForMultiple(int $type, array $values): array {
$builder = $this->getSelectQueryBuilder();
$params = array_map(function (string $value) use ($builder): IParameter {
return $builder->createNamedParameter($value, IQueryBuilder::PARAM_STR);
}, $values);
$query = $builder->select(['m.mount_id', 'mount_point', 'storage_backend', 'auth_backend', 'priority', 'm.type'])
->from('external_mounts', 'm')
->innerJoin('m', 'external_applicable', 'a', $builder->expr()->eq('m.mount_id', 'a.mount_id'))
$builder = $builder
->where($builder->expr()->eq('a.type', $builder->createNamedParameter($type, IQueryBuilder::PARAM_INT)))
->andWhere($builder->expr()->in('a.value', $params));
$query->andWhere($builder->expr()->eq('m.type', $builder->expr()->literal(self::MOUNT_TYPE_ADMIN, IQueryBuilder::PARAM_INT)));
$builder->andWhere($builder->expr()->eq('m.type', $builder->expr()->literal(self::MOUNT_TYPE_ADMIN, IQueryBuilder::PARAM_INT)));
return $this->getMountsFromQuery($query);
return $this->getMountsFromQuery($builder);
}
/**
@@ -233,9 +274,9 @@ class DBConfigService {
*
* @param int $type any of the self::APPLICABLE_TYPE_ constants
* @param string|null $value user_id, group_id or null for global mounts
* @return array
* @return list<ExternalMountInfo>
*/
public function getUserMountsFor($type, $value) {
public function getUserMountsFor(int $type, ?string $value): array {
$builder = $this->connection->getQueryBuilder();
$query = $this->getForQuery($builder, $type, $value);
$query->andWhere($builder->expr()->eq('m.type', $builder->expr()->literal(self::MOUNT_TYPE_PERSONAL, IQueryBuilder::PARAM_INT)));
@@ -246,14 +287,10 @@ class DBConfigService {
/**
* Add a mount to the database
*
* @param string $mountPoint
* @param string $storageBackend
* @param string $authBackend
* @param int $priority
* @param int $type self::MOUNT_TYPE_ADMIN or self::MOUNT_TYPE_PERSONAL
* @param self::MOUNT_TYPE_ADMIN|self::MOUNT_TYPE_PERSONAL $type
* @return int the id of the new mount
*/
public function addMount($mountPoint, $storageBackend, $authBackend, $priority, $type) {
public function addMount(string $mountPoint, string $storageBackend, string $authBackend, ?int $priority, int $type): int {
if (!$priority) {
$priority = 100;
}
@@ -272,10 +309,8 @@ class DBConfigService {
/**
* Remove a mount from the database
*
* @param int $mountId
*/
public function removeMount($mountId) {
public function removeMount(int $mountId): void {
$builder = $this->connection->getQueryBuilder();
$query = $builder->delete('external_mounts')
->where($builder->expr()->eq('mount_id', $builder->createNamedParameter($mountId, IQueryBuilder::PARAM_INT)));
@@ -297,11 +332,7 @@ class DBConfigService {
$query->executeStatement();
}
/**
* @param int $mountId
* @param string $newMountPoint
*/
public function setMountPoint($mountId, $newMountPoint) {
public function setMountPoint(int $mountId, string $newMountPoint): void {
$builder = $this->connection->getQueryBuilder();
$query = $builder->update('external_mounts')
@@ -311,11 +342,7 @@ class DBConfigService {
$query->executeStatement();
}
/**
* @param int $mountId
* @param string $newAuthBackend
*/
public function setAuthBackend($mountId, $newAuthBackend) {
public function setAuthBackend(int $mountId, string $newAuthBackend): void {
$builder = $this->connection->getQueryBuilder();
$query = $builder->update('external_mounts')
@@ -325,12 +352,7 @@ class DBConfigService {
$query->executeStatement();
}
/**
* @param int $mountId
* @param string $key
* @param string $value
*/
public function setConfig($mountId, $key, $value) {
public function setConfig(int $mountId, string $key, string $value): void {
if ($key === 'password') {
$value = $this->encryptValue($value);
}
@@ -355,12 +377,7 @@ class DBConfigService {
}
}
/**
* @param int $mountId
* @param string $key
* @param string $value
*/
public function setOption($mountId, $key, $value) {
public function setOption(int $mountId, string $key, string $value): void {
try {
$builder = $this->connection->getQueryBuilder();
$builder->insert('external_options')
@@ -381,7 +398,7 @@ class DBConfigService {
}
}
public function addApplicable($mountId, $type, $value) {
public function addApplicable(int $mountId, int $type, ?string $value): void {
try {
$builder = $this->connection->getQueryBuilder();
$builder->insert('external_applicable')
@@ -397,7 +414,7 @@ class DBConfigService {
}
}
public function removeApplicable($mountId, $type, $value) {
public function removeApplicable(int $mountId, int $type, ?string $value): void {
$builder = $this->connection->getQueryBuilder();
$query = $builder->delete('external_applicable')
->where($builder->expr()->eq('mount_id', $builder->createNamedParameter($mountId, IQueryBuilder::PARAM_INT)))
@@ -413,11 +430,13 @@ class DBConfigService {
}
/**
* @return list<StorageConfigData>
* @return list<ExternalMountInfo>
* @throws Exception
*/
private function getMountsFromQuery(IQueryBuilder $query): array {
$result = $query->executeQuery();
$mounts = $result->fetchAllAssociative();
/** @var \Generator<array{mount_id: int, mount_point: string, storage_backend: string, auth_backend: string, priority: mixed, type: int}> $mounts */
$mounts = $result->iterateAssociative();
$uniqueMounts = [];
foreach ($mounts as $mount) {
$id = $mount['mount_id'];
@@ -427,7 +446,7 @@ class DBConfigService {
}
$uniqueMounts = array_values($uniqueMounts);
$mountIds = array_map(function ($mount) {
$mountIds = array_map(function (array $mount): int {
return $mount['mount_id'];
}, $uniqueMounts);
$mountIds = array_values(array_unique($mountIds));
@@ -436,8 +455,10 @@ class DBConfigService {
$config = $this->getConfigForMounts($mountIds);
$options = $this->getOptionsForMounts($mountIds);
return array_map(function ($mount, $applicable, $config, $options) {
$mount['type'] = (int)$mount['type'];
return array_map(function (array $mount, array $applicable, array $config, array $options): array {
$mountType = (int)$mount['type'];
assert($mountType === self::MOUNT_TYPE_ADMIN || $mountType === self::MOUNT_TYPE_PERSONAL);
$mount['type'] = $mountType;
$mount['priority'] = (int)$mount['priority'];
$mount['applicable'] = $applicable;
$mount['config'] = $config;
@@ -449,7 +470,6 @@ class DBConfigService {
/**
* Get mount options from a table grouped by mount id
*
* @param string $table
* @param string[] $fields
* @param int[] $mountIds
* @return array<int, list<array>> [$mountId => [['field1' => $value1, ...], ...], ...]
@@ -460,9 +480,7 @@ class DBConfigService {
}
$builder = $this->connection->getQueryBuilder();
$fields[] = 'mount_id';
$placeHolders = array_map(function ($id) use ($builder) {
return $builder->createPositionalParameter($id, IQueryBuilder::PARAM_INT);
}, $mountIds);
$placeHolders = array_map(fn ($id) => $builder->createPositionalParameter($id, IQueryBuilder::PARAM_INT), $mountIds);
$query = $builder->select($fields)
->from($table)
->where($builder->expr()->in('mount_id', $placeHolders));
@@ -486,26 +504,28 @@ class DBConfigService {
/**
* @param int[] $mountIds
* @return array<int, list<ApplicableConfig>> [$id => [['type' => $type, 'value' => $value], ...], ...]
* @return array<int, list<array{type: mixed, value: string}>> [$id => [['type' => $type, 'value' => $value], ...], ...]
*/
public function getApplicableForMounts(array $mountIds): array {
return $this->selectForMounts('external_applicable', ['type', 'value'], $mountIds);
/** @var array<int, list<array{type: mixed, value: string}>> $result */
$result = $this->selectForMounts('external_applicable', ['type', 'value'], $mountIds);
return $result;
}
/**
* @param int[] $mountIds
* @return array [$id => ['key1' => $value1, ...], ...]
* @return array<int, array> [$id => ['key1' => $value1, ...], ...]
*/
public function getConfigForMounts($mountIds) {
public function getConfigForMounts(array $mountIds): array {
$mountConfigs = $this->selectForMounts('external_config', ['key', 'value'], $mountIds);
return array_map([$this, 'createKeyValueMap'], $mountConfigs);
}
/**
* @param int[] $mountIds
* @return array [$id => ['key1' => $value1, ...], ...]
* @return array<int, array> [$id => ['key1' => $value1, ...], ...]
*/
public function getOptionsForMounts($mountIds) {
public function getOptionsForMounts(array $mountIds): array {
$mountOptions = $this->selectForMounts('external_options', ['key', 'value'], $mountIds);
$optionsMap = array_map([$this, 'createKeyValueMap'], $mountOptions);
return array_map(function (array $options) {
@@ -516,10 +536,10 @@ class DBConfigService {
}
/**
* @param array $keyValuePairs [['key'=>$key, 'value=>$value], ...]
* @param list<array{key: string, value: string}> $keyValuePairs [['key'=>$key, 'value=>$value], ...]
* @return array ['key1' => $value1, ...]
*/
private function createKeyValueMap(array $keyValuePairs) {
private function createKeyValueMap(array $keyValuePairs): array {
$decryptedPairts = array_map(function ($pair) {
if ($pair['key'] === 'password') {
$pair['value'] = $this->decryptValue($pair['value']);
@@ -536,14 +556,14 @@ class DBConfigService {
return array_combine($keys, $values);
}
private function encryptValue($value) {
private function encryptValue(string $value): string {
return $this->crypto->encrypt($value);
}
private function decryptValue($value) {
private function decryptValue(string $value): string {
try {
return $this->crypto->decrypt($value);
} catch (\Exception $e) {
} catch (\Exception) {
return $value;
}
}

View File

@@ -120,10 +120,9 @@ abstract class StoragesService {
*
* @param int $id storage id
*
* @return StorageConfig
* @throws NotFoundException if the storage with the given id was not found
*/
public function getStorage(int $id) {
public function getStorage(int $id): StorageConfig {
$mount = $this->dbConfig->getMountById($id);
if (!is_array($mount)) {

View File

@@ -58,18 +58,18 @@ class UserGlobalStoragesService extends GlobalStoragesService {
return array_merge($userMounts, $groupMounts, $globalMounts);
}
public function addStorage(StorageConfig $newStorage) {
public function addStorage(StorageConfig $newStorage): never {
throw new \DomainException('UserGlobalStoragesService writing disallowed');
}
public function updateStorage(StorageConfig $updatedStorage) {
public function updateStorage(StorageConfig $updatedStorage): never {
throw new \DomainException('UserGlobalStoragesService writing disallowed');
}
/**
* @param integer $id
*/
public function removeStorage($id) {
public function removeStorage($id): never {
throw new \DomainException('UserGlobalStoragesService writing disallowed');
}
@@ -164,16 +164,33 @@ class UserGlobalStoragesService extends GlobalStoragesService {
}
$groupIds = $this->groupManager->getUserGroupIds($user);
$mounts = $this->dbConfig->getMountsForUser($user->getUID(), $groupIds);
$configs = array_map([$this, 'getStorageConfigFromDBMount'], $mounts);
$configs = array_filter($configs, function ($config) {
return $config instanceof StorageConfig;
});
$configs = array_map($this->getStorageConfigFromDBMount(...), $mounts);
$configs = array_filter($configs, static fn ($config) => $config instanceof StorageConfig);
$keys = array_map(function (StorageConfig $config) {
return $config->getId();
}, $configs);
$keys = array_map(static fn (StorageConfig $config) => $config->getId(), $configs);
$storages = array_combine($keys, $configs);
return array_filter($storages, [$this, 'validateStorage']);
return array_filter($storages, $this->validateStorage(...));
}
/**
* @return StorageConfig[]
*/
public function getAllStoragesForUserWithPath(string $path, bool $forChildren): array {
$user = $this->getUser();
if (is_null($user)) {
return [];
}
$groupIds = $this->groupManager->getUserGroupIds($user);
$mounts = $this->dbConfig->getMountsForUserAndPath($user->getUID(), $groupIds, $path, $forChildren);
$configs = array_map($this->getStorageConfigFromDBMount(...), $mounts);
$configs = array_filter($configs, static fn ($config) => $config instanceof StorageConfig);
$keys = array_map(static fn (StorageConfig $config) => $config->getId(), $configs);
$storages = array_combine($keys, $configs);
return array_filter($storages, $this->validateStorage(...));
}
}

View File

@@ -116,11 +116,11 @@ class UserStoragesService extends StoragesService {
*
* @return int BackendService::VISIBILITY_* constants
*/
public function getVisibilityType() {
public function getVisibilityType(): int {
return BackendService::VISIBILITY_PERSONAL;
}
protected function isApplicable(StorageConfig $config) {
protected function isApplicable(StorageConfig $config): bool {
return ($config->getApplicableUsers() === [$this->getUser()->getUID()]) && $config->getType() === StorageConfig::MOUNT_TYPE_PERSONAL;
}

View File

@@ -0,0 +1,226 @@
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH
* SPDX-FileContributor: Carl Schwan
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files_External\Tests\Config;
use OC\Files\Storage\StorageFactory;
use OCA\Files_External\Config\ConfigAdapter;
use OCA\Files_External\Lib\Auth\AuthMechanism;
use OCA\Files_External\Lib\Auth\NullMechanism;
use OCA\Files_External\Lib\Backend\Backend;
use OCA\Files_External\Lib\Backend\SMB;
use OCA\Files_External\Lib\StorageConfig;
use OCA\Files_External\Service\BackendService;
use OCA\Files_External\Service\UserGlobalStoragesService;
use OCA\Files_External\Service\UserStoragesService;
use OCP\Files\Cache\ICacheEntry;
use OCP\Files\Config\ICachedMountFileInfo;
use OCP\Files\Config\MountProviderArgs;
use OCP\IUser;
use OCP\Server;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\Group;
use PHPUnit\Framework\MockObject\MockObject;
use Psr\Clock\ClockInterface;
use Test\TestCase;
#[Group(name: 'DB')]
class ConfigAdapterTest extends TestCase {
private ConfigAdapter $adapter;
private BackendService&MockObject $backendService;
private IUser&MockObject $user;
private UserStoragesService $userStoragesService;
private UserGlobalStoragesService $userGlobalStoragesService;
private array $storageIds = [];
protected function makeStorageConfig(array $data): StorageConfig {
$storage = new StorageConfig();
if (isset($data['id'])) {
$storage->setId($data['id']);
}
$storage->setMountPoint($data['mountPoint']);
$data['backend'] = $this->backendService->getBackend($data['backendIdentifier']);
if (!isset($data['backend'])) {
throw new \Exception('oops, no backend');
}
$data['authMechanism'] = $this->backendService->getAuthMechanism($data['authMechanismIdentifier']);
if (!isset($data['authMechanism'])) {
throw new \Exception('oops, no auth mechanism');
}
$storage->setId(StorageConfig::MOUNT_TYPE_PERSONAL);
$storage->setApplicableUsers([$this->user->getUID()]);
$storage->setBackend($data['backend']);
$storage->setAuthMechanism($data['authMechanism']);
$storage->setBackendOptions($data['backendOptions']);
$storage->setPriority($data['priority']);
if (isset($data['mountOptions'])) {
$storage->setMountOptions($data['mountOptions']);
}
return $storage;
}
protected function getBackendMock($class = SMB::class, $storageClass = \OCA\Files_External\Lib\Storage\SMB::class) {
$backend = $this->createMock(Backend::class);
$backend->method('getStorageClass')
->willReturn($storageClass);
$backend->method('getIdentifier')
->willReturn('identifier:' . $class);
return $backend;
}
protected function getAuthMechMock($scheme = 'null', $class = NullMechanism::class) {
$authMech = $this->createMock(AuthMechanism::class);
$authMech->method('getScheme')
->willReturn($scheme);
$authMech->method('getIdentifier')
->willReturn('identifier:' . $class);
return $authMech;
}
public function setUp(): void {
// prepare BackendService mock
$this->backendService = $this->createMock(BackendService::class);
$authMechanisms = [
'identifier:\Auth\Mechanism' => $this->getAuthMechMock('null', '\Auth\Mechanism'),
'identifier:\Other\Auth\Mechanism' => $this->getAuthMechMock('null', '\Other\Auth\Mechanism'),
'identifier:\OCA\Files_External\Lib\Auth\NullMechanism' => $this->getAuthMechMock(),
];
$this->backendService->method('getAuthMechanism')
->willReturnCallback(function ($class) use ($authMechanisms) {
if (isset($authMechanisms[$class])) {
return $authMechanisms[$class];
}
return null;
});
$this->backendService->method('getAuthMechanismsByScheme')
->willReturnCallback(function ($schemes) use ($authMechanisms) {
return array_filter($authMechanisms, function ($authMech) use ($schemes) {
return in_array($authMech->getScheme(), $schemes, true);
});
});
$backends = [
'identifier:\OCA\Files_External\Lib\Backend\DAV' => $this->getBackendMock('\OCA\Files_External\Lib\Backend\DAV', '\OC\Files\Storage\DAV'),
'identifier:\OCA\Files_External\Lib\Backend\SMB' => $this->getBackendMock('\OCA\Files_External\Lib\Backend\SMB', '\OCA\Files_External\Lib\Storage\SMB'),
];
$this->backendService->method('getBackend')
->willReturnCallback(function ($backendClass) use ($backends) {
if (isset($backends[$backendClass])) {
return $backends[$backendClass];
}
return null;
});
$this->backendService->method('getAuthMechanisms')
->willReturn($authMechanisms);
$this->backendService->method('getBackends')
->willReturn($backends);
$this->userStoragesService = Server::get(UserStoragesService::class);
$this->userGlobalStoragesService = Server::get(UserGlobalStoragesService::class);
$this->adapter = new ConfigAdapter($this->userStoragesService, $this->userGlobalStoragesService, $this->createMock(ClockInterface::class));
$this->user = $this->createMock(IUser::class);
$this->user->method('getUID')->willReturn('user1');
$this->userStoragesService->setUser($this->user);
$storageConfig = $this->makeStorageConfig([
'mountPoint' => '/mountpoint',
'backendIdentifier' => 'identifier:\OCA\Files_External\Lib\Backend\SMB',
'authMechanismIdentifier' => 'identifier:\Auth\Mechanism',
'backendOptions' => [
'option1' => 'value1',
'option2' => 'value2',
'password' => 'testPassword',
],
'priority' => 15,
'mountOptions' => [
'preview' => false,
]
]);
$this->storageIds[] = $this->userStoragesService->addStorage($storageConfig)->getId();
$storageConfig = $this->makeStorageConfig([
'mountPoint' => '/subfolder/mountpoint',
'backendIdentifier' => 'identifier:\OCA\Files_External\Lib\Backend\SMB',
'authMechanismIdentifier' => 'identifier:\Auth\Mechanism',
'backendOptions' => [
'option1' => 'value1',
'option2' => 'value2',
'password' => 'testPassword',
],
'priority' => 15,
'mountOptions' => [
'preview' => false,
]
]);
$this->storageIds[] = $this->userStoragesService->addStorage($storageConfig)->getId();
$storageConfig = $this->makeStorageConfig([
'mountPoint' => '/subfolder/subfolder/mountpoint',
'backendIdentifier' => 'identifier:\OCA\Files_External\Lib\Backend\SMB',
'authMechanismIdentifier' => 'identifier:\Auth\Mechanism',
'backendOptions' => [
'option1' => 'value1',
'option2' => 'value2',
'password' => 'testPassword',
],
'priority' => 15,
'mountOptions' => [
'preview' => false,
]
]);
$this->storageIds[] = $this->userStoragesService->addStorage($storageConfig)->getId();
}
public function tearDown(): void {
$this->user = $this->createMock(IUser::class);
$this->user->method('getUID')->willReturn('user1');
$this->userStoragesService->setUser($this->user);
foreach ($this->storageIds as $storageId) {
$this->userStoragesService->removeStorage($storageId);
}
}
public static function pathsProvider(): \Generator {
yield ['/user1/files/subfolder', 2];
yield ['/user1/files/subfolder/subfolder', 1];
yield ['/user1/files/nothing', 0];
yield ['/user1/files/mountpoint', 0]; // we only want the children
}
#[DataProvider(methodName: 'pathsProvider')]
public function testPartialMountpointWithChildren(string $path, int $count): void {
$mountFileInfo = $this->createMock(ICachedMountFileInfo::class);
$mountFileInfo->method('getUser')->willReturn($this->user);
$cacheEntry = $this->createMock(ICacheEntry::class);
$result = $this->adapter->getMountsForPath($path, true, [
new MountProviderArgs($mountFileInfo, $cacheEntry),
], $this->createMock(StorageFactory::class));
$this->assertCount($count, $result);
}
public function testPartialMountpointExact(): void {
$mountFileInfo = $this->createMock(ICachedMountFileInfo::class);
$mountFileInfo->method('getUser')->willReturn($this->user);
$mountFileInfo->method('getMountPoint')->willReturn('/user1/files/subfolder/subfolder');
$cacheEntry = $this->createMock(ICacheEntry::class);
$result = $this->adapter->getMountsForPath('/user1/files/subfolder/subfolder', true, [
new MountProviderArgs($mountFileInfo, $cacheEntry),
], $this->createMock(StorageFactory::class));
$this->assertCount(1, $result);
}
}

View File

@@ -40,13 +40,13 @@ use PHPUnit\Framework\MockObject\MockObject;
class CleaningDBConfig extends DBConfigService {
private array $mountIds = [];
public function addMount($mountPoint, $storageBackend, $authBackend, $priority, $type) {
public function addMount($mountPoint, $storageBackend, $authBackend, $priority, $type): int {
$id = parent::addMount($mountPoint, $storageBackend, $authBackend, $priority, $type); // TODO: Change the autogenerated stub
$this->mountIds[] = $id;
return $id;
}
public function clean() {
public function clean(): void {
foreach ($this->mountIds as $id) {
$this->removeMount($id);
}
@@ -205,6 +205,7 @@ abstract class StoragesServiceTestCase extends \Test\TestCase {
if (isset($data['mountOptions'])) {
$storage->setMountOptions($data['mountOptions']);
}
$storage->setPriority(100);
return $storage;
}
@@ -258,6 +259,7 @@ abstract class StoragesServiceTestCase extends \Test\TestCase {
$storage->setBackend($backend);
$storage->setAuthMechanism($authMechanism);
$storage->setBackendOptions($backendOptions);
$storage->setPriority(0);
$newStorage = $this->service->addStorage($storage);
$id = $newStorage->getId();
@@ -399,6 +401,7 @@ abstract class StoragesServiceTestCase extends \Test\TestCase {
$storage->setBackend($backend);
$storage->setAuthMechanism($authMechanism);
$storage->setBackendOptions(['password' => 'testPassword']);
$storage->setPriority(0);
$newStorage = $this->service->addStorage($storage);
@@ -424,6 +427,7 @@ abstract class StoragesServiceTestCase extends \Test\TestCase {
$storage->setBackend($backend);
$storage->setAuthMechanism($authMechanism);
$storage->setBackendOptions(['password' => 'testPassword']);
$storage->setPriority(0);
$newStorage = $this->service->addStorage($storage);
@@ -480,6 +484,7 @@ abstract class StoragesServiceTestCase extends \Test\TestCase {
$storage->setBackend($backend);
$storage->setAuthMechanism($authMechanism);
$storage->setBackendOptions(['password' => 'testPassword']);
$storage->setPriority(0);
$savedStorage = $this->service->addStorage($storage);

View File

@@ -108,6 +108,7 @@ class UserGlobalStoragesServiceTest extends GlobalStoragesServiceTest {
$storage->setBackendOptions(['password' => 'testPassword']);
$storage->setApplicableUsers($applicableUsers);
$storage->setApplicableGroups($applicableGroups);
$storage->setPriority(0);
$newStorage = $this->globalStoragesService->addStorage($storage);

View File

@@ -92,6 +92,7 @@ return array(
'OCA\\Files_Sharing\\Notification\\Notifier' => $baseDir . '/../lib/Notification/Notifier.php',
'OCA\\Files_Sharing\\OpenMetrics\\SharesCountMetric' => $baseDir . '/../lib/OpenMetrics/SharesCountMetric.php',
'OCA\\Files_Sharing\\OrphanHelper' => $baseDir . '/../lib/OrphanHelper.php',
'OCA\\Files_Sharing\\Repair\\CleanupShareTarget' => $baseDir . '/../lib/Repair/CleanupShareTarget.php',
'OCA\\Files_Sharing\\ResponseDefinitions' => $baseDir . '/../lib/ResponseDefinitions.php',
'OCA\\Files_Sharing\\Scanner' => $baseDir . '/../lib/Scanner.php',
'OCA\\Files_Sharing\\Settings\\Personal' => $baseDir . '/../lib/Settings/Personal.php',

View File

@@ -107,6 +107,7 @@ class ComposerStaticInitFiles_Sharing
'OCA\\Files_Sharing\\Notification\\Notifier' => __DIR__ . '/..' . '/../lib/Notification/Notifier.php',
'OCA\\Files_Sharing\\OpenMetrics\\SharesCountMetric' => __DIR__ . '/..' . '/../lib/OpenMetrics/SharesCountMetric.php',
'OCA\\Files_Sharing\\OrphanHelper' => __DIR__ . '/..' . '/../lib/OrphanHelper.php',
'OCA\\Files_Sharing\\Repair\\CleanupShareTarget' => __DIR__ . '/..' . '/../lib/Repair/CleanupShareTarget.php',
'OCA\\Files_Sharing\\ResponseDefinitions' => __DIR__ . '/..' . '/../lib/ResponseDefinitions.php',
'OCA\\Files_Sharing\\Scanner' => __DIR__ . '/..' . '/../lib/Scanner.php',
'OCA\\Files_Sharing\\Settings\\Personal' => __DIR__ . '/..' . '/../lib/Settings/Personal.php',

View File

@@ -0,0 +1,445 @@
OC.L10N.register(
"files_sharing",
{
"File shares" : "Dijeljenja datoteke",
"Downloaded via public link" : "Preuzeto putem javne poveznice",
"Downloaded by {email}" : "Preuzeo {email}",
"{file} downloaded via public link" : "{file} preuzeto putem javne poveznice",
"{email} downloaded {file}" : "{email} preuzeo {file}",
"Shared with group {group}" : "Dijeljeno s grupom {group}",
"Removed share for group {group}" : "Uklonjeno dijeljenje za grupu {group}",
"{actor} shared with group {group}" : "{actor} dijeli s grupom {group}",
"{actor} removed share for group {group}" : "{actor} je uklonio dijeljenje za grupu {group}",
"Share for group {group} expired" : "Isteklo je dijeljenje za grupu {group}",
"You shared {file} with group {group}" : "Dijelite {file} s grupom {group}",
"You removed group {group} from {file}" : "Uklonili ste grupu {group} iz {file}",
"{actor} shared {file} with group {group}" : "{actor} dijeli {file} s grupom {group}",
"{actor} removed group {group} from {file}" : "{actor} je uklonio grupu {group} iz {file}",
"Share for file {file} with group {group} expired" : "Isteklo je dijeljenje datoteke {file} s grupom {group}",
"Shared as public link" : "Dijeljeno kao javna poveznica",
"Removed public link" : "Uklonjena javna poveznica",
"Public link expired" : "Javna poveznica je istekla",
"{actor} shared as public link" : "{actor} dijeli kao javnu poveznicu",
"{actor} removed public link" : "{actor} je uklonio javnu poveznicu",
"Public link of {actor} expired" : "Istekla je javna poveznica {actor}",
"You shared {file} as public link" : "Dijelite {file} kao javnu poveznicu",
"You removed public link for {file}" : "Uklonili ste javnu poveznicu na {file}",
"Public link expired for {file}" : "Istekla je javna poveznica za {file}",
"{actor} shared {file} as public link" : "{actor} dijeli {file} kao javnu poveznicu",
"{actor} removed public link for {file}" : "{actor} je uklonio javnu poveznicu za {file}",
"Public link of {actor} for {file} expired" : "Istekla je javna poveznica {actor} za {file}",
"{user} accepted the remote share" : "{user} je prihvatio udaljeno dijeljenje",
"{user} declined the remote share" : "{user} je odbio udaljeno dijeljenje",
"You received a new remote share {file} from {user}" : "Primili ste novo udaljeno dijeljenje {file} od {user}",
"{user} accepted the remote share of {file}" : "{user} je prihvatio udaljeno dijeljenje {file}",
"{user} declined the remote share of {file}" : "{user} je odbio udaljeno dijeljenje {file}",
"{user} unshared {file} from you" : "{user} je prestao dijeliti {file} s vama",
"Shared with {user}" : "Dijeljeno s {user}",
"Removed share for {user}" : "Uklonjeno dijeljenje za {user}",
"You removed yourself" : "Uklonili ste sami",
"{actor} removed themselves" : "{actor} je sam uklonio",
"{actor} shared with {user}" : "{actor} dijeli s {user}",
"{actor} removed share for {user}" : "{actor} je uklonio dijeljenje za {user}",
"Shared by {actor}" : "Dijeli {actor}",
"{actor} removed share" : "{actor} je uklonio dijeljenje",
"Share for {user} expired" : "Isteklo je dijeljenje za {user}",
"Share expired" : "Dijeljenje je isteklo",
"You shared {file} with {user}" : "Dijelite {file} s {user}",
"You removed {user} from {file}" : "Uklonili ste {user} iz {file}",
"You removed yourself from {file}" : "Uklonili ste sebe iz {file}",
"{actor} removed themselves from {file}" : "{actor} je uklonio sebe iz {file}",
"{actor} shared {file} with {user}" : "{actor} dijeli {file} s {user}",
"{actor} removed {user} from {file}" : "{actor} je uklonio {user} iz {file}",
"{actor} shared {file} with you" : "{actor} dijeli {file} s vama",
"{actor} removed you from the share named {file}" : "{actor} vas je uklonio iz dijeljenja pod nazivom {file}",
"Share for file {file} with {user} expired" : "Isteklo je dijeljenje datoteke {file} s {user}",
"Share for file {file} expired" : "Isteklo je dijeljenje datoteke {file}",
"A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Datoteka ili mapa dijeljena poštom ili javnom poveznicom <strong>je preuzeta</strong>",
"Files have been <strong>uploaded</strong> to a folder shared by mail or by public link" : "Datoteke su <strong>učitane</strong> u mapu dijeljenu e-poštom ili putem javne poveznice.",
"A file or folder was shared from <strong>another server</strong>" : "Datoteka ili mapa dijeli se s <strong>drugog poslužitelja</strong>",
"Sharing" : "Dijeljenje",
"A file or folder has been <strong>shared</strong>" : "Datoteka ili mapa je <strong>dijeljena</strong>",
"Shared link" : "Dijeljena poveznica",
"Wrong share ID, share does not exist" : "Pogrešan ID dijeljenja, dijeljenje ne postoji",
"Could not delete share" : "Dijeljenje nije moguće izbrisati",
"Please specify a file or folder path" : "Navedite put datoteke ili mape",
"Wrong path, file/folder does not exist" : "Pogrešna putanja, datoteka/mapa ne postoji",
"Could not create share" : "Nije moguće stvoriti dijeljenje",
"Please specify a valid account to share with" : "Molimo navedite valjani račun za dijeljenje",
"Group sharing is disabled by the administrator" : "Administrator je onemogućio grupno dijeljenje",
"Please specify a valid group" : "Navedite valjanu grupu",
"Public link sharing is disabled by the administrator" : "Administrator je onemogućio dijeljenje javnih poveznica",
"Please specify a valid email address" : "Molimo navedite valjanu adresu e-pošte",
"Sharing %s sending the password by Nextcloud Talk failed because Nextcloud Talk is not enabled" : "Neuspješno dijeljenje %s slanjem zaporke za Nextcloud Talk jer Nextcloud Talk nije omogućen",
"Sharing %1$s failed because the back end does not allow shares from type %2$s" : "Neuspješno dijeljenje %1$s jer pozadinski servis ne dopušta dijeljenje vrste %2$s",
"Please specify a valid federated account ID" : "Navedite važeći ID udruženog računa",
"Please specify a valid federated group ID" : "Navedite važeći ID udružene grupe",
"You cannot share to a Team if the app is not enabled" : "Ne možete dijeliti s Timom ako aplikacija nije omogućena",
"Please specify a valid team" : "Navedite valjani tim",
"Sharing %s failed because the back end does not support room shares" : "Neuspješno dijeljenje %s jer pozadinski servis ne dopušta dijeljenje između soba",
"Unknown share type" : "Nepoznata vrsta dijeljenja",
"Not a directory" : "Nije imenik",
"Could not lock node" : "Nije moguće zaključati čvorište",
"Public upload is only possible for publicly shared folders" : "Javno otpremanje moguće je samo za javno dijeljene mape",
"Share must at least have READ or CREATE permissions" : "Dijeljenje mora imati barem dopuštenja ČITANJA ili STVARANJA",
"Share must have READ permission if UPDATE or DELETE permission is set" : "Dijeljenje mora imati dopuštenje ČITANJA ako je postavljeno dopuštenje AŽURIRANJA ili BRISANJA",
"Public upload disabled by the administrator" : "Administrator je onemogućio javno otpremanje",
"Could not lock path" : "Put nije moguće zaključati",
"no sharing rights on this item" : "nema dopuštenja za dijeljenje ove stavke",
"You are not allowed to edit incoming shares" : "Nije vam dopušteno uređivanje dolaznih dijeljenja",
"Wrong or no update parameter given" : "Pogrešan parametar ili nije dodan parametar ažuriranja",
"\"Sending the password by Nextcloud Talk\" for sharing a file or folder failed because Nextcloud Talk is not enabled." : "„Slanje zaporke putem aplikacije Nextcloud Talk“ radi dijeljenja datoteke ili mape nije uspjelo jer Nextcloud Talk nije omogućen.",
"Custom share link tokens have been disabled by the administrator" : "Administrator je onemogućio prilagođene tokene poveznica za dijeljenje",
"Tokens must contain at least 1 character and may only contain letters, numbers, or a hyphen" : "Tokeni moraju sadržavati najmanje 1 znak i smiju sadržavati samo slova, brojeve ili crticu",
"Invalid date. Format must be YYYY-MM-DD" : "Nevažeći datum. Oblik mora biti GGGG-MM-DD",
"No sharing rights on this item" : "Nema dopuštenja za dijeljenje ove stavke",
"Invalid share attributes provided: \"%s\"" : "Navedeni su nevažeći atributi dijeljenja: „%s”",
"You are not allowed to send mail notifications" : "Nije vam dopušteno slanje obavijesti e-poštom",
"No mail notification configured for this share type" : "Za ovu vrstu dijeljenja nije konfigurirana obavijest e-poštom",
"Wrong password" : "Pogrešna lozinka",
"Error while sending mail notification" : "Pogreška pri slanju obavijesti e-poštom",
"Failed to generate a unique token" : "Nije uspjelo generiranje jedinstvenog tokena",
"This share does not exist or is no longer available" : "Ovo dijeljenje ne postoji ili više nije dostupno",
"shared by %s" : "dijeli %s",
"Download" : "Preuzmi",
"Add to your %s" : "Dodajte u svoj %s",
"Direct link" : "Izravna poveznica",
"Share API is disabled" : "API za dijeljenje je onemogućen",
"File sharing" : "Dijeljenje datoteka",
"Share will expire tomorrow" : "Dijeljenje istječe sutra",
"Your share of {node} will expire tomorrow" : "Vaše dijeljenje {node} istječe sutra",
"You received {share} as a share by {user}" : "Primili ste {share} kao dijeljenje od {user}",
"You received {share} to group {group} as a share by {user}" : "Primili ste {share} grupi {group} kao dijeljenje od {user}",
"Accept" : "Prihvati",
"Decline" : "Odbij",
"Remember to upload the files to %s" : "Ne zaboravite učitati datoteke u %s",
"We would like to kindly remind you that you have not yet uploaded any files to the shared folder." : "Ljubazno vas podsjećamo da još niste učitali nijednu datoteku u dijeljenu mapu.",
"Open \"%s\"" : "Otvori \"%s\"",
"This application enables people to share files within Nextcloud. If enabled, the admin can choose which groups can share files. The applicable people can then share files and folders with other accounts and groups within Nextcloud. In addition, if the admin enables the share link feature, an external link can be used to share files with other people outside of Nextcloud. Admins can also enforce passwords, expirations dates, and enable server to server sharing via share links, as well as sharing from mobile devices.\nTurning the feature off removes shared files and folders on the server for all share recipients, and also on the sync clients and mobile apps. More information is available in the Nextcloud Documentation." : "Ova aplikacija omogućuje dijeljenje datoteka unutar Nextclouda. Ako je omogućena, administrator može odabrati koje grupe smiju dijeliti datoteke. Ovlaštene osobe tada mogu dijeliti datoteke i mape s drugim računima i grupama unutar Nextclouda. Ako administrator omogući značajku poveznica za dijeljenje, vanjska poveznica može se koristiti za dijeljenje datoteka s osobama izvan Nextclouda. Administratori također mogu nametnuti lozinke i datume isteka, omogućiti dijeljenje s poslužitelja na poslužitelj putem poveznica za dijeljenje te dijeljenje s mobilnih uređaja.\n\nIsključivanjem ove značajke uklanjaju se dijeljene datoteke i mape s poslužitelja za sve primatelje dijeljenja, kao i sa sinkronizacijskih klijenata i mobilnih aplikacija. Više informacija dostupno je u dokumentaciji za Nextcloud.",
"Filter accounts" : "Filtriraj račune",
"you" : "vi",
"The request will expire on {date} at midnight and will be password protected." : "Zahtjev će isteći {date} u ponoć i bit će zaštićen lozinkom.",
"The request will expire on {date} at midnight." : "Zahtjev će isteći {date} u ponoć.",
"The request will be password protected." : "Zahtjev će biti zaštićen lozinkom.",
"When should the request expire?" : "Kada bi zahtjev trebao isteći?",
"Set a submission expiration date" : "Postavite datum isteka za slanje",
"Expiration date" : "Datum isteka",
"Select a date" : "Odaberi datum",
"Your administrator has enforced a {count} days expiration policy." : "Vaš je administrator nametnuo pravilo isteka od {count} dana.",
"What password should be used for the request?" : "Koju lozinku treba koristiti za zahtjev?",
"Set a password" : "Postavi lozinku",
"Password" : "Lozinka",
"Enter a valid password" : "Unesite valjanu lozinku",
"Generate a new password" : "Generiraj novu lozinku",
"Your administrator has enforced a password protection." : "Vaš je administrator nametnuo zaštitu lozinkom.",
"Automatically copying failed, please copy the share link manually" : "Automatsko kopiranje nije uspjelo, molimo ručno kopirajte poveznicu za dijeljenje.",
"Link copied" : "Poveznica je kopirana",
"Email already added" : "Adresa e-pošte je već dodana",
"Invalid email address" : "Nevažeća adresa e-pošte",
"_The following email address is not valid: {emails}_::_The following email addresses are not valid: {emails}_" : ["Sljedeća adresa e-pošte nije valjana: {emails}","Sljedeće adrese e-pošte nisu valjane: {emails}","Sljedeće adrese e-pošte nisu valjane: {emails}"],
"_{count} email address already added_::_{count} email addresses already added_" : ["{count} adresa e-pošte je već dodana","{count} adrese e-pošte su već dodane","{count} adresa e-pošte su već dodane"],
"_{count} email address added_::_{count} email addresses added_" : ["Dodana je {count} adresa e-pošte","Dodano je {count} adrese e-pošte","Dodano je {count} adresa e-pošte"],
"You can now share the link below to allow people to upload files to your directory." : "Sada možete podijeliti donju poveznicu kako bi drugi mogli učitati datoteke u vašu mapu.",
"Share link" : "Dijeli poveznicu",
"Copy" : "Kopirajte",
"Send link via email" : "Šalji poveznicu e-poštom",
"Enter an email address or paste a list" : "Unesite adresu e-pošte ili zalijepite popis",
"Remove email" : "Ukloni e-poštu",
"Select a destination" : "Odaberi odredište",
"Select" : "Odaberi",
"What are you requesting?" : "Što zahtijevate?",
"Request subject" : "Predmet zahtjeva",
"Birthday party photos, History assignment…" : "Fotografije s rođendanske proslave, zadatak iz povijesti…",
"Where should these files go?" : "Gdje bi se ove datoteke trebale spremiti?",
"Upload destination" : "Odredište učitavanja",
"Revert to default" : "Vrati na zadanu postavku",
"The uploaded files are visible only to you unless you choose to share them." : "Učitane datoteke vidljive su samo vama, osim ako ih ne odlučite dijeliti.",
"Add a note" : "Dodaj bilješku",
"Note for recipient" : "Bilješka za primatelja",
"Add a note to help people understand what you are requesting." : "Dodajte bilješku kako biste pomogli drugima da razumiju što zahtijevate.",
"You can add links, date or any other information that will help the recipient understand what you are requesting." : "Možete dodati poveznice, datum ili bilo koju drugu informaciju koja će primatelju pomoći da razumije što zahtijevate.",
"Close" : "Zatvori",
"_Send email and close_::_Send {count} emails and close_" : ["Pošalji e-poruku i zatvori","Pošalji {count} e-poruke i zatvori","Pošalji {count} e-poruka i zatvori"],
"Please select a folder, you cannot share the root directory." : "Molimo odaberite mapu, ne možete dijeliti korijenski direktorij.",
"File request created" : "Zahtjev za datotekama je stvoren",
"_File request created and email sent_::_File request created and {count} emails sent_" : ["Zahtjev za datotekama je stvoren i poslana je e-poruka","Zahtjev za datotekama je stvoren i poslane su {count} e-poruke","Zahtjev za datotekama je stvoren i poslano je {count} e-poruka"],
"Error creating the share: {errorMessage}" : "Pogreška pri stvaranju dijeljenja: {errorMessage}",
"Error creating the share" : "Pogreška pri stvaranju dijeljenja",
"Error sending emails: {errorMessage}" : "Pogreška pri slanju e-poruka: {errorMessage}",
"Error sending emails" : "Pogreška pri slanju e-poruka",
"Create a file request" : "Stvori zahtjev za datotekom",
"Collect files from others even if they do not have an account." : "Prikupljajte datoteke od drugih, čak i ako nemaju račun.",
"To ensure you can receive files, verify you have enough storage available." : "Kako biste mogli primati datoteke, provjerite imate li dovoljno dostupnog prostora za pohranu.",
"File request" : "Zahtjev za datotekom",
"Previous step" : "Prethodni korak",
"Cancel" : "Odustani",
"Cancel the file request creation" : "Otkaži stvaranje zahtjeva za datotekom",
"Close without sending emails" : "Zatvori bez slanja e-poruka",
"Continue" : "Nastavi",
"Error while toggling options" : "Pogreška pri uključivanju ili isključivanju opcija",
"Accept shares from other accounts and groups by default" : "Prema zadanim postavkama prihvati dijeljenja s drugih računa i grupa",
"Choose a default folder for accepted shares" : "Odaberite zadanu mapu za prihvaćena dijeljenja",
"Invalid path selected" : "Odabrana nevažeća putanja",
"Unknown error" : "Nepoznata pogreška",
"Set default folder for accepted shares" : "Postavite zadanu mapu za prihvaćena dijeljenja",
"Reset" : "Resetiraj",
"Reset folder to system default" : "Vrati mapu na zadane postavke sustava",
"Share expiration: {date}" : "Istek dijeljenja: {date}",
"Share Expiration" : "Istek dijeljenja",
"group" : "grupa",
"conversation" : "razgovor",
"remote" : "na daljinu",
"remote group" : "udaljena grupa",
"guest" : "gost",
"by {initiator}" : "objavio je {initiator}",
"Shared with the group {user} by {owner}" : "S grupom {user} dijeli {owner}",
"Shared with the conversation {user} by {owner}" : "S razgovorom {user} dijeli {owner}",
"Shared with {user} by {owner}" : "S {user} dijeli {owner}",
"Open Sharing Details" : "Otvori detalje dijeljenja",
"Added by {initiator}" : "Dodao {initiator}",
"Via “{folder}”" : "Putem „{folder}“",
"Unshare" : "Prestani dijeliti",
"Cannot copy, please copy the link manually" : "Kopiranje nije moguće, ručno kopirajte poveznicu",
"Copy internal link" : "Kopiraj internu poveznicu",
"For people who already have access" : "Za osobe koje već imaju pristup",
"Internal link" : "Interna poveznica",
"{shareWith} by {initiator}" : "{shareWith} od {initiator}",
"Shared via link by {initiator}" : "Dijeli {initiator} putem poveznice",
"File request ({label})" : "Zahtjev za datotekama ({label})",
"Mail share ({label})" : "Dijeljenje poštom ({label})",
"Share link ({label})" : "Poveznica dijeljenja ({label})",
"Mail share" : "Dijeljenje putem e-pošte",
"Share link ({index})" : "Dijeli poveznicu ({index})",
"Create public link" : "Stvori javnu poveznicu",
"Actions for \"{title}\"" : "Radnje za „{title}”",
"Copy public link of \"{title}\"" : "Kopiraj javnu poveznicu za \"{title}\"",
"Error, please enter proper password and/or expiration date" : "Pogreška, unesite točnu zaporku i/ili datum isteka",
"Link share created" : "Poveznica za dijeljenje je stvorena",
"Error while creating the share" : "Pogreška pri stvaranju dijeljenja",
"Your browser does not support copying, please copy the link manually:" : "Vaš preglednik ne podržava kopiranje, molimo kopirajte poveznicu ručno:",
"Successfully copied public link" : "Javna poveznica uspješno kopirana",
"Please enter the following required information before creating the share" : "Unesite sljedeće informacije prije stvaranja dijeljenja",
"Password protection (enforced)" : "Zaštita zaporkom (provedeno)",
"Password protection" : "Zaštita zaporkom",
"Enter a password" : "Unesite zaporku",
"Enable link expiration (enforced)" : "Omogući istek poveznice (obavezno)",
"Enable link expiration" : "Omogući istek poveznice",
"Enter expiration date (enforced)" : "Unesite datum isteka (obavezno)",
"Enter expiration date" : "Unesite datum isteka",
"Create share" : "Stvori dijeljenje",
"Customize link" : "Prilagodi poveznicu",
"Generate QR code" : "Generiraj QR kod",
"Add another link" : "Dodaj drugu poveznicu",
"Create a new share link" : "Stvori novu poveznicu dijeljenja",
"Quick share options, the current selected is \"{selectedOption}\"" : "Brze opcije dijeljenja, trenutačno odabrana je „{selectedOption}”",
"View only" : "Samo za gledanje",
"Can edit" : "Uređivanje moguće",
"Custom permissions" : "Prilagođena dopuštenja",
"Resharing is not allowed" : "Ponovno dijeljenje nije dopušteno",
"Name or email …" : "Ime ili adresa e-pošte …",
"Name, email, or Federated Cloud ID …" : "Naziv, adresa e-pošte ili ID udruženog oblaka ...",
"Searching …" : "Traženje …",
"No elements found." : "Elementi nisu pronađeni.",
"Search everywhere" : "Traži svugdje",
"Guest" : "Gost",
"Group" : "Grupa",
"Email" : "E-pošta",
"Team" : "Tim",
"Talk conversation" : "Razgovori u alatu Talk",
"Deck board" : "Deck ploča",
"ScienceMesh" : "ScienceMesh",
"on {server}" : "na {server}",
"Enter external recipients" : "Unesite vanjske primatelje",
"Search for internal recipients" : "Pretraži interne primatelje",
"Note from" : "Bilješka od",
"Note:" : "Bilješka:",
"File drop" : "Povlačenje datoteke",
"Upload files to {foldername}." : "Učitajte datoteke u {foldername}.",
"By uploading files, you agree to the terms of service." : "Učitavanjem datoteka prihvaćate uvjete korištenja.",
"Successfully uploaded files" : "Datoteke su uspješno učitane.",
"View terms of service" : "Prikaži uvjete pružanja usluge",
"Terms of service" : "Uvjeti pružanja usluge",
"Share with {user}" : "Dijeli s {user}",
"Share with email {email}" : "Dijeli s e-poštom {email}",
"Share with group" : "Dijeli s grupom",
"Share in conversation" : "Dijeli u razgovoru",
"Share with {user} on remote server {server}" : "Dijeli s {user} na udaljenom poslužitelju {server}",
"Share with remote group" : "Dijeli s udaljenom grupom",
"Share with guest" : "Dijeli s gostom",
"Update share" : "Ažuriranje dijeljenja",
"Save share" : "Spremi dijeljenje",
"Read" : "Čitaj",
"Create" : "Stvori",
"Edit" : "Uredi",
"Share" : "Dijeli",
"Delete" : "Izbriši",
"Password field cannot be empty" : "Polje lozinke ne može biti prazno",
"Replace current password" : "Zamijenite trenutnu lozinku",
"Failed to generate a new token" : "Nije uspjelo generiranje novog tokena",
"Allow upload and editing" : "Omogući otpremanje i uređivanje",
"Allow editing" : "Dopusti uređivanje",
"Upload only" : "Samo učitavanje",
"Advanced settings" : "Napredne postavke",
"Share label" : "oznaka za dijeljenje",
"Share link token" : "Token poveznice za dijeljenje",
"Set the public share link token to something easy to remember or generate a new token. It is not recommended to use a guessable token for shares which contain sensitive information." : "Postavite token javne poveznice za dijeljenje na nešto lako pamtljivo ili generirajte novi token. Ne preporučuje se korištenje lako pogodivog tokena za dijeljenja koja sadrže osjetljive informacije.",
"Generating…" : "Generiranje…",
"Generate new token" : "Generiraj novi token",
"Set password" : "Postavi lozinku",
"Password expires {passwordExpirationTime}" : "Lozinka ističe {passwordExpirationTime}",
"Password expired" : "Lozinka istekla",
"Video verification" : "Provjera videozapisa",
"Expiration date (enforced)" : "Datum isteka (provedeno)",
"Set expiration date" : "Postavi datum isteka",
"Hide download" : "Sakrij preuzimanje",
"Allow download and sync" : "Dopusti preuzimanje i sinkronizaciju",
"Note to recipient" : "Obavijest primatelju",
"Enter a note for the share recipient" : "Unesite bilješku za primatelja dijeljenja",
"Show files in grid view" : "Prikaži datoteke u prikazu rešetke",
"Delete share" : "Izbriši dijeljenje",
"Others with access" : "Korisnici s omogućenim pristupom",
"No other accounts with access found" : "Nisu pronađeni drugi računi s pristupom",
"Toggle list of others with access to this directory" : "Uključi/isključi popis korisnika koji smiju pristupiti ovom direktoriju",
"Toggle list of others with access to this file" : "Uključi/isključi popis korisnika koji smiju pristupiti ovoj datoteci",
"Unable to fetch inherited shares" : "Neuspješno dohvaćanje naslijeđenih dijeljenja",
"Link shares" : "Poveznice dijeljenja",
"Shares" : "Dijeljenja",
"Share files within your organization. Recipients who can already view the file can also use this link for easy access." : "Dijelite datoteke unutar svoje organizacije. Primatelji koji već mogu pregledavati datoteku također mogu koristiti ovu poveznicu za jednostavan pristup.",
"Share files with others outside your organization via public links and email addresses. You can also share to {productName} accounts on other instances using their federated cloud ID." : "Dijelite datoteke s drugima izvan svoje organizacije putem javnih poveznica i adresa e-pošte. Također možete dijeliti s računima {productName} na drugim instancama koristeći njihov ID udruženog oblaka.",
"Shares from apps or other sources which are not included in internal or external shares." : "Dijeljenja iz aplikacija ili drugih izvora koja nisu uključena u interna ili vanjska dijeljenja.",
"Type names, teams, federated cloud IDs" : "Upišite nazive, timove ili ID udruženog oblaka",
"Type names or teams" : "Upišite nazive ili timove",
"Type a federated cloud ID" : "Upišite ID udruženog oblaka",
"Type an email" : "Upišite adresu e-pošte",
"Type an email or federated cloud ID" : "Upišite adresu e-pošte ili ID udruženog oblaka",
"Unable to load the shares list" : "Nije moguće učitati popis dijeljenja",
"Expires {relativetime}" : "Istječe {relativetime}",
"this share just expired." : "ovo dijeljenje je upravo isteklo.",
"Shared with you by {owner}" : "S vama podijelio {owner}",
"Internal shares" : "Unutarnja dijeljenja",
"Internal shares explanation" : "Objašnjenje unutarnjih dijeljenja",
"External shares" : "Vanjska dijeljenja",
"External shares explanation" : "Objašnjenje vanjskih dijeljenja",
"Additional shares" : "Dodatna dijeljenja",
"Additional shares explanation" : "Objašnjenje dodatnih dijeljenja",
"Link to a file" : "Poveži s datotekom",
"_Accept share_::_Accept shares_" : ["Prihvati dijeljenje","Prihvati dijeljenja","Prihvati dijeljenja"],
"Open in Files" : "Otvori u aplikaciji Datoteke",
"_Reject share_::_Reject shares_" : ["Odbij dijeljenje","Odbij dijeljenja","Odbij dijeljenja"],
"_Restore share_::_Restore shares_" : ["Vrati dijeljenje","Vrati dijeljenja","Vrati dijeljenja"],
"Shared" : "Dijeljeno",
"Shared by {ownerDisplayName}" : "Dijeljeno s {ownerDisplayName}",
"Shared multiple times with different people" : "Podijeljeno više puta s više ljudi",
"Sharing options" : "Mogućnosti dijeljenja",
"Shared with others" : "Podijeljeno s ostalima",
"You do not have enough permissions to share this file." : "Nemate dovoljno dopuštenja za dijeljenje ove datoteke.",
"People" : "Ljudi",
"Create file request" : "Stvori zahtjev za datotekom",
"Upload files to {foldername}" : "Učitajte datoteke u {foldername}.",
"Public file share" : "Javno dijeljenje datoteke",
"Publicly shared file." : "Javno dijeljena datoteka.",
"No file" : "Nema datoteke",
"The file shared with you will show up here" : "Ovdje će se prikazati datoteka podijeljena s vama",
"Public share" : "Javno dijeljenje",
"Publicly shared files." : "Javno dijeljene datoteke.",
"No files" : "Nema datoteka",
"Files and folders shared with you will show up here" : "Ovdje će se prikazati datoteke i mape dijeljene s vama",
"Overview of shared files." : "Pregled dijeljenih datoteka.",
"No shares" : "Nema dijeljenja",
"Files and folders you shared or have been shared with you will show up here" : "Ovdje će se prikazati datoteke i mape koje ste podijelili ili koje su podijeljene s vama",
"Shared with you" : "Podijeljeno s vama",
"List of files that are shared with you." : "Popis datoteka koje su podijeljene s vama.",
"Nothing shared with you yet" : "Još ništa nije dijeljeno s vama",
"Files and folders others shared with you will show up here" : "Ovdje će se prikazati datoteke i mape koje drugi podijele s vama",
"List of files that you shared with others." : "Popis datoteka koje ste podijelili s drugima.",
"Nothing shared yet" : "Još ništa nije dijeljeno",
"Files and folders you shared will show up here" : "Ovdje će se prikazati datoteke i mape koje ste podijelili",
"Shared by link" : "Podijeljeno putem poveznice",
"List of files that are shared by link." : "Popis datoteka koje su dijeljene putem poveznice.",
"No shared links" : "Nema dijeljenih poveznica",
"Files and folders you shared by link will show up here" : "Ovdje će se prikazati datoteke i mape koje ste podijelili putem poveznice",
"File requests" : "Zahtjevi za datotekama",
"List of file requests." : "Popis zahtjeva za datotekama.",
"No file requests" : "Nema zahtjeva za datotekama",
"File requests you have created will show up here" : "Ovdje će se prikazati zahtjevi za datotekama koje ste stvorili.",
"Deleted shares" : "Izbrisana dijeljenja",
"List of shares you left." : "Popis dijeljenja koja ste napustili.",
"No deleted shares" : "Nema izbrisanih dijeljenja",
"Shares you have left will show up here" : "Ovdje će se prikazati dijeljenja koja ste napustili.",
"Pending shares" : "Dijeljenja na čekanju",
"List of unapproved shares." : "Popis neodobrenih dijeljenja.",
"No pending shares" : "Nema dijeljenja na čekanju",
"Shares you have received but not approved will show up here" : "Ovdje će se prikazati dijeljenja koja ste primili, ali niste odobrili.",
"Error deleting the share: {errorMessage}" : "Pogreška pri brisanju dijeljenja: {errorMessage}",
"Error deleting the share" : "Pogreška pri brisanju dijeljenja",
"Error updating the share: {errorMessage}" : "Pogreška pri ažuriranju dijeljenja: {errorMessage}",
"Error updating the share" : "Pogreška pri ažuriranju dijeljenja",
"File \"{path}\" has been unshared" : "Dijeljenje datoteke „{path}” je uklonjeno",
"Folder \"{path}\" has been unshared" : "Dijeljenje mape „{path}” je uklonjeno",
"Could not update share" : "Nije moguće ažurirati dijeljenje",
"Share saved" : "Dijeljenje je spremljeno",
"Share expiry date saved" : "Datum isteka dijeljenja je spremljen",
"Share hide-download state saved" : "Stanje skrivanja preuzimanja dijeljenja je spremljeno",
"Share label saved" : "Oznaka dijeljenja je spremljena",
"Share note for recipient saved" : "Bilješka za primatelja dijeljenja je spremljena",
"Share password saved" : "Lozinka za dijeljenje je spremljena",
"Share permissions saved" : "Dopuštenja dijeljenja su spremljena",
"To upload files to {folder}, you need to provide your name first." : "Za učitavanje datoteka u {folder} najprije morate unijeti svoje ime.",
"Upload files to {folder}" : "Učitajte datoteke u {folder}.",
"Please confirm your name to upload files to {folder}" : "Molimo potvrdite svoje ime kako biste mogli učitati datoteke u {folder}.",
"{ownerDisplayName} shared a folder with you." : "{ownerDisplayName} dijeli mapu s vama.",
"Names must not be empty." : "Nazivi ne mogu biti prazni.",
"Names must not start with a dot." : "Nazivi ne smiju počinjati s točkom.",
"\"{char}\" is not allowed inside a name." : "\"{char}\" nije dozvoljeno unutar naziva.",
"\"{segment}\" is a reserved name and not allowed." : "\"{segment}\" je rezervirano ime i nije dozvoljeno.",
"\"{extension}\" is not an allowed name." : "\"{extension}\" nije dozvoljeno kao naziv.",
"Names must not end with \"{extension}\"." : "Nazivi ne mogu završavati sa \"{extension}\".",
"Invalid name." : "Nevažeći naziv.",
"Password created successfully" : "Lozinka je uspješno stvorena",
"Error generating password from password policy" : "Pogreška pri generiranju lozinke prema pravilima lozinki",
"Shared with you and the group {group} by {owner}" : "Dijeljeno s vama i grupom {group} vlasnika {owner}",
"Shared with you and {circle} by {owner}" : "Dijeljeno s vama i {circle} od strane {owner}",
"Shared with you and the conversation {conversation} by {owner}" : "Dijeljeno s vama i razgovorom {conversation} vlasnika {owner}",
"Shared with you in a conversation by {owner}" : "{owner} dijeli s vama u razgovoru",
"Share not found" : "Dijeljenje nije pronađeno",
"Back to %s" : "Natrag na %s",
"Add to your Nextcloud" : "Dodaj u svoj Nextcloud",
"Sharing %s failed because the back end does not support ScienceMesh shares" : "Neuspješno dijeljenje %s jer pozadinski servis ne podržava ScienceMesh dijeljenje ",
"Link copied to clipboard" : "Poveznica je kopirana u međuspremnik",
"Copy to clipboard" : "Kopiraj u međuspremnik",
"Copy internal link to clipboard" : "Kopiraj unutarnju poveznicu u međuspremnik",
"Only works for people with access to this folder" : "Samo za korisnike koji smiju pristupiti ovoj mapi",
"Only works for people with access to this file" : "Samo za korisnike koji smiju pristupiti ovoj datoteci",
"Copy public link of \"{title}\" to clipboard" : "Kopiraj javnu poveznicu za \"{title}\" u međuspremnik",
"Name or email …" : "Ime ili adresa e-pošte…",
"Name, email, or Federated Cloud ID …" : "Naziv, adresa e-pošte ili ID udruženog oblaka…",
"Searching …" : "Traženje…",
"Search globally" : "Pretraži globalno",
"Submit name" : "Pošalji naziv",
"To upload files, you need to provide your name first." : "Za učitavanje datoteka najprije morate unijeti svoje ime.",
"Name" : "Naziv",
"Enter your name" : "Unesite svoje ime",
"Share with {userName}" : "Dijeli s {userName}",
"Use this method to share files with individuals or teams within your organization. If the recipient already has access to the share but cannot locate it, you can send them the internal share link for easy access." : "Koristite ovu metodu za dijeljenje datoteka s pojedincima ili timovima unutar svoje organizacije. Ako primatelj već ima pristup dijeljenju, ali ga ne može pronaći, možete mu poslati internu poveznicu za dijeljenje radi lakšeg pristupa.",
"Use this method to share files with individuals or organizations outside your organization. Files and folders can be shared via public share links and email addresses. You can also share to other Nextcloud accounts hosted on different instances using their federated cloud ID." : "Koristite ovu metodu za dijeljenje datoteka s pojedincima ili organizacijama izvan svoje organizacije. Datoteke i mape mogu se dijeliti putem javnih poveznica i adresa e-pošte. Također možete dijeliti s drugim Nextcloud računima na različitim instancama koristeći njihov ID udruženog oblaka.",
"Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "Dijeljenja koja nisu dio internih ili vanjskih dijeljenja. To mogu biti dijeljenja iz aplikacija ili drugih izvora.",
"Share with accounts, teams, federated cloud id" : "Dijeli s računima, timovima i ID-om udruženog oblaka",
"Share with accounts and teams" : "Dijeli s računima i timovima",
"Federated cloud ID" : "ID udruženog oblaka",
"Email, federated cloud id" : "Adresa e-pošte, ID udruženog oblaka",
"Show sharing options" : "Prikaži mogućnosti dijeljenja",
"Filename must not be empty." : "Naziv datoteke ne može biti prazan.",
"Shared by" : "Podijeljeno od",
"Shared with" : "Dijeljeno s",
"Share note" : "Dijeli bilješku",
"Show list view" : "Prikaži u popisu",
"Show grid view" : "Prikaži u rešetki",
"Upload files to %s" : "Otpremi datoteke na %s",
"%s shared a folder with you." : "%s dijeli mapu s vama.",
"Note" : "Bilješka",
"Select or drop files" : "Odaberi ili ispusti datoteke",
"Uploading files" : "Otpremanje datoteka",
"Uploaded files:" : "Otpremljene datoteke:",
"By uploading files, you agree to the %1$sterms of service%2$s." : "Otpremanjem datoteka prihvaćate %1$ uvjete korištenja usluge%2$s."
},
"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;");

View File

@@ -0,0 +1,443 @@
{ "translations": {
"File shares" : "Dijeljenja datoteke",
"Downloaded via public link" : "Preuzeto putem javne poveznice",
"Downloaded by {email}" : "Preuzeo {email}",
"{file} downloaded via public link" : "{file} preuzeto putem javne poveznice",
"{email} downloaded {file}" : "{email} preuzeo {file}",
"Shared with group {group}" : "Dijeljeno s grupom {group}",
"Removed share for group {group}" : "Uklonjeno dijeljenje za grupu {group}",
"{actor} shared with group {group}" : "{actor} dijeli s grupom {group}",
"{actor} removed share for group {group}" : "{actor} je uklonio dijeljenje za grupu {group}",
"Share for group {group} expired" : "Isteklo je dijeljenje za grupu {group}",
"You shared {file} with group {group}" : "Dijelite {file} s grupom {group}",
"You removed group {group} from {file}" : "Uklonili ste grupu {group} iz {file}",
"{actor} shared {file} with group {group}" : "{actor} dijeli {file} s grupom {group}",
"{actor} removed group {group} from {file}" : "{actor} je uklonio grupu {group} iz {file}",
"Share for file {file} with group {group} expired" : "Isteklo je dijeljenje datoteke {file} s grupom {group}",
"Shared as public link" : "Dijeljeno kao javna poveznica",
"Removed public link" : "Uklonjena javna poveznica",
"Public link expired" : "Javna poveznica je istekla",
"{actor} shared as public link" : "{actor} dijeli kao javnu poveznicu",
"{actor} removed public link" : "{actor} je uklonio javnu poveznicu",
"Public link of {actor} expired" : "Istekla je javna poveznica {actor}",
"You shared {file} as public link" : "Dijelite {file} kao javnu poveznicu",
"You removed public link for {file}" : "Uklonili ste javnu poveznicu na {file}",
"Public link expired for {file}" : "Istekla je javna poveznica za {file}",
"{actor} shared {file} as public link" : "{actor} dijeli {file} kao javnu poveznicu",
"{actor} removed public link for {file}" : "{actor} je uklonio javnu poveznicu za {file}",
"Public link of {actor} for {file} expired" : "Istekla je javna poveznica {actor} za {file}",
"{user} accepted the remote share" : "{user} je prihvatio udaljeno dijeljenje",
"{user} declined the remote share" : "{user} je odbio udaljeno dijeljenje",
"You received a new remote share {file} from {user}" : "Primili ste novo udaljeno dijeljenje {file} od {user}",
"{user} accepted the remote share of {file}" : "{user} je prihvatio udaljeno dijeljenje {file}",
"{user} declined the remote share of {file}" : "{user} je odbio udaljeno dijeljenje {file}",
"{user} unshared {file} from you" : "{user} je prestao dijeliti {file} s vama",
"Shared with {user}" : "Dijeljeno s {user}",
"Removed share for {user}" : "Uklonjeno dijeljenje za {user}",
"You removed yourself" : "Uklonili ste sami",
"{actor} removed themselves" : "{actor} je sam uklonio",
"{actor} shared with {user}" : "{actor} dijeli s {user}",
"{actor} removed share for {user}" : "{actor} je uklonio dijeljenje za {user}",
"Shared by {actor}" : "Dijeli {actor}",
"{actor} removed share" : "{actor} je uklonio dijeljenje",
"Share for {user} expired" : "Isteklo je dijeljenje za {user}",
"Share expired" : "Dijeljenje je isteklo",
"You shared {file} with {user}" : "Dijelite {file} s {user}",
"You removed {user} from {file}" : "Uklonili ste {user} iz {file}",
"You removed yourself from {file}" : "Uklonili ste sebe iz {file}",
"{actor} removed themselves from {file}" : "{actor} je uklonio sebe iz {file}",
"{actor} shared {file} with {user}" : "{actor} dijeli {file} s {user}",
"{actor} removed {user} from {file}" : "{actor} je uklonio {user} iz {file}",
"{actor} shared {file} with you" : "{actor} dijeli {file} s vama",
"{actor} removed you from the share named {file}" : "{actor} vas je uklonio iz dijeljenja pod nazivom {file}",
"Share for file {file} with {user} expired" : "Isteklo je dijeljenje datoteke {file} s {user}",
"Share for file {file} expired" : "Isteklo je dijeljenje datoteke {file}",
"A file or folder shared by mail or by public link was <strong>downloaded</strong>" : "Datoteka ili mapa dijeljena poštom ili javnom poveznicom <strong>je preuzeta</strong>",
"Files have been <strong>uploaded</strong> to a folder shared by mail or by public link" : "Datoteke su <strong>učitane</strong> u mapu dijeljenu e-poštom ili putem javne poveznice.",
"A file or folder was shared from <strong>another server</strong>" : "Datoteka ili mapa dijeli se s <strong>drugog poslužitelja</strong>",
"Sharing" : "Dijeljenje",
"A file or folder has been <strong>shared</strong>" : "Datoteka ili mapa je <strong>dijeljena</strong>",
"Shared link" : "Dijeljena poveznica",
"Wrong share ID, share does not exist" : "Pogrešan ID dijeljenja, dijeljenje ne postoji",
"Could not delete share" : "Dijeljenje nije moguće izbrisati",
"Please specify a file or folder path" : "Navedite put datoteke ili mape",
"Wrong path, file/folder does not exist" : "Pogrešna putanja, datoteka/mapa ne postoji",
"Could not create share" : "Nije moguće stvoriti dijeljenje",
"Please specify a valid account to share with" : "Molimo navedite valjani račun za dijeljenje",
"Group sharing is disabled by the administrator" : "Administrator je onemogućio grupno dijeljenje",
"Please specify a valid group" : "Navedite valjanu grupu",
"Public link sharing is disabled by the administrator" : "Administrator je onemogućio dijeljenje javnih poveznica",
"Please specify a valid email address" : "Molimo navedite valjanu adresu e-pošte",
"Sharing %s sending the password by Nextcloud Talk failed because Nextcloud Talk is not enabled" : "Neuspješno dijeljenje %s slanjem zaporke za Nextcloud Talk jer Nextcloud Talk nije omogućen",
"Sharing %1$s failed because the back end does not allow shares from type %2$s" : "Neuspješno dijeljenje %1$s jer pozadinski servis ne dopušta dijeljenje vrste %2$s",
"Please specify a valid federated account ID" : "Navedite važeći ID udruženog računa",
"Please specify a valid federated group ID" : "Navedite važeći ID udružene grupe",
"You cannot share to a Team if the app is not enabled" : "Ne možete dijeliti s Timom ako aplikacija nije omogućena",
"Please specify a valid team" : "Navedite valjani tim",
"Sharing %s failed because the back end does not support room shares" : "Neuspješno dijeljenje %s jer pozadinski servis ne dopušta dijeljenje između soba",
"Unknown share type" : "Nepoznata vrsta dijeljenja",
"Not a directory" : "Nije imenik",
"Could not lock node" : "Nije moguće zaključati čvorište",
"Public upload is only possible for publicly shared folders" : "Javno otpremanje moguće je samo za javno dijeljene mape",
"Share must at least have READ or CREATE permissions" : "Dijeljenje mora imati barem dopuštenja ČITANJA ili STVARANJA",
"Share must have READ permission if UPDATE or DELETE permission is set" : "Dijeljenje mora imati dopuštenje ČITANJA ako je postavljeno dopuštenje AŽURIRANJA ili BRISANJA",
"Public upload disabled by the administrator" : "Administrator je onemogućio javno otpremanje",
"Could not lock path" : "Put nije moguće zaključati",
"no sharing rights on this item" : "nema dopuštenja za dijeljenje ove stavke",
"You are not allowed to edit incoming shares" : "Nije vam dopušteno uređivanje dolaznih dijeljenja",
"Wrong or no update parameter given" : "Pogrešan parametar ili nije dodan parametar ažuriranja",
"\"Sending the password by Nextcloud Talk\" for sharing a file or folder failed because Nextcloud Talk is not enabled." : "„Slanje zaporke putem aplikacije Nextcloud Talk“ radi dijeljenja datoteke ili mape nije uspjelo jer Nextcloud Talk nije omogućen.",
"Custom share link tokens have been disabled by the administrator" : "Administrator je onemogućio prilagođene tokene poveznica za dijeljenje",
"Tokens must contain at least 1 character and may only contain letters, numbers, or a hyphen" : "Tokeni moraju sadržavati najmanje 1 znak i smiju sadržavati samo slova, brojeve ili crticu",
"Invalid date. Format must be YYYY-MM-DD" : "Nevažeći datum. Oblik mora biti GGGG-MM-DD",
"No sharing rights on this item" : "Nema dopuštenja za dijeljenje ove stavke",
"Invalid share attributes provided: \"%s\"" : "Navedeni su nevažeći atributi dijeljenja: „%s”",
"You are not allowed to send mail notifications" : "Nije vam dopušteno slanje obavijesti e-poštom",
"No mail notification configured for this share type" : "Za ovu vrstu dijeljenja nije konfigurirana obavijest e-poštom",
"Wrong password" : "Pogrešna lozinka",
"Error while sending mail notification" : "Pogreška pri slanju obavijesti e-poštom",
"Failed to generate a unique token" : "Nije uspjelo generiranje jedinstvenog tokena",
"This share does not exist or is no longer available" : "Ovo dijeljenje ne postoji ili više nije dostupno",
"shared by %s" : "dijeli %s",
"Download" : "Preuzmi",
"Add to your %s" : "Dodajte u svoj %s",
"Direct link" : "Izravna poveznica",
"Share API is disabled" : "API za dijeljenje je onemogućen",
"File sharing" : "Dijeljenje datoteka",
"Share will expire tomorrow" : "Dijeljenje istječe sutra",
"Your share of {node} will expire tomorrow" : "Vaše dijeljenje {node} istječe sutra",
"You received {share} as a share by {user}" : "Primili ste {share} kao dijeljenje od {user}",
"You received {share} to group {group} as a share by {user}" : "Primili ste {share} grupi {group} kao dijeljenje od {user}",
"Accept" : "Prihvati",
"Decline" : "Odbij",
"Remember to upload the files to %s" : "Ne zaboravite učitati datoteke u %s",
"We would like to kindly remind you that you have not yet uploaded any files to the shared folder." : "Ljubazno vas podsjećamo da još niste učitali nijednu datoteku u dijeljenu mapu.",
"Open \"%s\"" : "Otvori \"%s\"",
"This application enables people to share files within Nextcloud. If enabled, the admin can choose which groups can share files. The applicable people can then share files and folders with other accounts and groups within Nextcloud. In addition, if the admin enables the share link feature, an external link can be used to share files with other people outside of Nextcloud. Admins can also enforce passwords, expirations dates, and enable server to server sharing via share links, as well as sharing from mobile devices.\nTurning the feature off removes shared files and folders on the server for all share recipients, and also on the sync clients and mobile apps. More information is available in the Nextcloud Documentation." : "Ova aplikacija omogućuje dijeljenje datoteka unutar Nextclouda. Ako je omogućena, administrator može odabrati koje grupe smiju dijeliti datoteke. Ovlaštene osobe tada mogu dijeliti datoteke i mape s drugim računima i grupama unutar Nextclouda. Ako administrator omogući značajku poveznica za dijeljenje, vanjska poveznica može se koristiti za dijeljenje datoteka s osobama izvan Nextclouda. Administratori također mogu nametnuti lozinke i datume isteka, omogućiti dijeljenje s poslužitelja na poslužitelj putem poveznica za dijeljenje te dijeljenje s mobilnih uređaja.\n\nIsključivanjem ove značajke uklanjaju se dijeljene datoteke i mape s poslužitelja za sve primatelje dijeljenja, kao i sa sinkronizacijskih klijenata i mobilnih aplikacija. Više informacija dostupno je u dokumentaciji za Nextcloud.",
"Filter accounts" : "Filtriraj račune",
"you" : "vi",
"The request will expire on {date} at midnight and will be password protected." : "Zahtjev će isteći {date} u ponoć i bit će zaštićen lozinkom.",
"The request will expire on {date} at midnight." : "Zahtjev će isteći {date} u ponoć.",
"The request will be password protected." : "Zahtjev će biti zaštićen lozinkom.",
"When should the request expire?" : "Kada bi zahtjev trebao isteći?",
"Set a submission expiration date" : "Postavite datum isteka za slanje",
"Expiration date" : "Datum isteka",
"Select a date" : "Odaberi datum",
"Your administrator has enforced a {count} days expiration policy." : "Vaš je administrator nametnuo pravilo isteka od {count} dana.",
"What password should be used for the request?" : "Koju lozinku treba koristiti za zahtjev?",
"Set a password" : "Postavi lozinku",
"Password" : "Lozinka",
"Enter a valid password" : "Unesite valjanu lozinku",
"Generate a new password" : "Generiraj novu lozinku",
"Your administrator has enforced a password protection." : "Vaš je administrator nametnuo zaštitu lozinkom.",
"Automatically copying failed, please copy the share link manually" : "Automatsko kopiranje nije uspjelo, molimo ručno kopirajte poveznicu za dijeljenje.",
"Link copied" : "Poveznica je kopirana",
"Email already added" : "Adresa e-pošte je već dodana",
"Invalid email address" : "Nevažeća adresa e-pošte",
"_The following email address is not valid: {emails}_::_The following email addresses are not valid: {emails}_" : ["Sljedeća adresa e-pošte nije valjana: {emails}","Sljedeće adrese e-pošte nisu valjane: {emails}","Sljedeće adrese e-pošte nisu valjane: {emails}"],
"_{count} email address already added_::_{count} email addresses already added_" : ["{count} adresa e-pošte je već dodana","{count} adrese e-pošte su već dodane","{count} adresa e-pošte su već dodane"],
"_{count} email address added_::_{count} email addresses added_" : ["Dodana je {count} adresa e-pošte","Dodano je {count} adrese e-pošte","Dodano je {count} adresa e-pošte"],
"You can now share the link below to allow people to upload files to your directory." : "Sada možete podijeliti donju poveznicu kako bi drugi mogli učitati datoteke u vašu mapu.",
"Share link" : "Dijeli poveznicu",
"Copy" : "Kopirajte",
"Send link via email" : "Šalji poveznicu e-poštom",
"Enter an email address or paste a list" : "Unesite adresu e-pošte ili zalijepite popis",
"Remove email" : "Ukloni e-poštu",
"Select a destination" : "Odaberi odredište",
"Select" : "Odaberi",
"What are you requesting?" : "Što zahtijevate?",
"Request subject" : "Predmet zahtjeva",
"Birthday party photos, History assignment…" : "Fotografije s rođendanske proslave, zadatak iz povijesti…",
"Where should these files go?" : "Gdje bi se ove datoteke trebale spremiti?",
"Upload destination" : "Odredište učitavanja",
"Revert to default" : "Vrati na zadanu postavku",
"The uploaded files are visible only to you unless you choose to share them." : "Učitane datoteke vidljive su samo vama, osim ako ih ne odlučite dijeliti.",
"Add a note" : "Dodaj bilješku",
"Note for recipient" : "Bilješka za primatelja",
"Add a note to help people understand what you are requesting." : "Dodajte bilješku kako biste pomogli drugima da razumiju što zahtijevate.",
"You can add links, date or any other information that will help the recipient understand what you are requesting." : "Možete dodati poveznice, datum ili bilo koju drugu informaciju koja će primatelju pomoći da razumije što zahtijevate.",
"Close" : "Zatvori",
"_Send email and close_::_Send {count} emails and close_" : ["Pošalji e-poruku i zatvori","Pošalji {count} e-poruke i zatvori","Pošalji {count} e-poruka i zatvori"],
"Please select a folder, you cannot share the root directory." : "Molimo odaberite mapu, ne možete dijeliti korijenski direktorij.",
"File request created" : "Zahtjev za datotekama je stvoren",
"_File request created and email sent_::_File request created and {count} emails sent_" : ["Zahtjev za datotekama je stvoren i poslana je e-poruka","Zahtjev za datotekama je stvoren i poslane su {count} e-poruke","Zahtjev za datotekama je stvoren i poslano je {count} e-poruka"],
"Error creating the share: {errorMessage}" : "Pogreška pri stvaranju dijeljenja: {errorMessage}",
"Error creating the share" : "Pogreška pri stvaranju dijeljenja",
"Error sending emails: {errorMessage}" : "Pogreška pri slanju e-poruka: {errorMessage}",
"Error sending emails" : "Pogreška pri slanju e-poruka",
"Create a file request" : "Stvori zahtjev za datotekom",
"Collect files from others even if they do not have an account." : "Prikupljajte datoteke od drugih, čak i ako nemaju račun.",
"To ensure you can receive files, verify you have enough storage available." : "Kako biste mogli primati datoteke, provjerite imate li dovoljno dostupnog prostora za pohranu.",
"File request" : "Zahtjev za datotekom",
"Previous step" : "Prethodni korak",
"Cancel" : "Odustani",
"Cancel the file request creation" : "Otkaži stvaranje zahtjeva za datotekom",
"Close without sending emails" : "Zatvori bez slanja e-poruka",
"Continue" : "Nastavi",
"Error while toggling options" : "Pogreška pri uključivanju ili isključivanju opcija",
"Accept shares from other accounts and groups by default" : "Prema zadanim postavkama prihvati dijeljenja s drugih računa i grupa",
"Choose a default folder for accepted shares" : "Odaberite zadanu mapu za prihvaćena dijeljenja",
"Invalid path selected" : "Odabrana nevažeća putanja",
"Unknown error" : "Nepoznata pogreška",
"Set default folder for accepted shares" : "Postavite zadanu mapu za prihvaćena dijeljenja",
"Reset" : "Resetiraj",
"Reset folder to system default" : "Vrati mapu na zadane postavke sustava",
"Share expiration: {date}" : "Istek dijeljenja: {date}",
"Share Expiration" : "Istek dijeljenja",
"group" : "grupa",
"conversation" : "razgovor",
"remote" : "na daljinu",
"remote group" : "udaljena grupa",
"guest" : "gost",
"by {initiator}" : "objavio je {initiator}",
"Shared with the group {user} by {owner}" : "S grupom {user} dijeli {owner}",
"Shared with the conversation {user} by {owner}" : "S razgovorom {user} dijeli {owner}",
"Shared with {user} by {owner}" : "S {user} dijeli {owner}",
"Open Sharing Details" : "Otvori detalje dijeljenja",
"Added by {initiator}" : "Dodao {initiator}",
"Via “{folder}”" : "Putem „{folder}“",
"Unshare" : "Prestani dijeliti",
"Cannot copy, please copy the link manually" : "Kopiranje nije moguće, ručno kopirajte poveznicu",
"Copy internal link" : "Kopiraj internu poveznicu",
"For people who already have access" : "Za osobe koje već imaju pristup",
"Internal link" : "Interna poveznica",
"{shareWith} by {initiator}" : "{shareWith} od {initiator}",
"Shared via link by {initiator}" : "Dijeli {initiator} putem poveznice",
"File request ({label})" : "Zahtjev za datotekama ({label})",
"Mail share ({label})" : "Dijeljenje poštom ({label})",
"Share link ({label})" : "Poveznica dijeljenja ({label})",
"Mail share" : "Dijeljenje putem e-pošte",
"Share link ({index})" : "Dijeli poveznicu ({index})",
"Create public link" : "Stvori javnu poveznicu",
"Actions for \"{title}\"" : "Radnje za „{title}”",
"Copy public link of \"{title}\"" : "Kopiraj javnu poveznicu za \"{title}\"",
"Error, please enter proper password and/or expiration date" : "Pogreška, unesite točnu zaporku i/ili datum isteka",
"Link share created" : "Poveznica za dijeljenje je stvorena",
"Error while creating the share" : "Pogreška pri stvaranju dijeljenja",
"Your browser does not support copying, please copy the link manually:" : "Vaš preglednik ne podržava kopiranje, molimo kopirajte poveznicu ručno:",
"Successfully copied public link" : "Javna poveznica uspješno kopirana",
"Please enter the following required information before creating the share" : "Unesite sljedeće informacije prije stvaranja dijeljenja",
"Password protection (enforced)" : "Zaštita zaporkom (provedeno)",
"Password protection" : "Zaštita zaporkom",
"Enter a password" : "Unesite zaporku",
"Enable link expiration (enforced)" : "Omogući istek poveznice (obavezno)",
"Enable link expiration" : "Omogući istek poveznice",
"Enter expiration date (enforced)" : "Unesite datum isteka (obavezno)",
"Enter expiration date" : "Unesite datum isteka",
"Create share" : "Stvori dijeljenje",
"Customize link" : "Prilagodi poveznicu",
"Generate QR code" : "Generiraj QR kod",
"Add another link" : "Dodaj drugu poveznicu",
"Create a new share link" : "Stvori novu poveznicu dijeljenja",
"Quick share options, the current selected is \"{selectedOption}\"" : "Brze opcije dijeljenja, trenutačno odabrana je „{selectedOption}”",
"View only" : "Samo za gledanje",
"Can edit" : "Uređivanje moguće",
"Custom permissions" : "Prilagođena dopuštenja",
"Resharing is not allowed" : "Ponovno dijeljenje nije dopušteno",
"Name or email …" : "Ime ili adresa e-pošte …",
"Name, email, or Federated Cloud ID …" : "Naziv, adresa e-pošte ili ID udruženog oblaka ...",
"Searching …" : "Traženje …",
"No elements found." : "Elementi nisu pronađeni.",
"Search everywhere" : "Traži svugdje",
"Guest" : "Gost",
"Group" : "Grupa",
"Email" : "E-pošta",
"Team" : "Tim",
"Talk conversation" : "Razgovori u alatu Talk",
"Deck board" : "Deck ploča",
"ScienceMesh" : "ScienceMesh",
"on {server}" : "na {server}",
"Enter external recipients" : "Unesite vanjske primatelje",
"Search for internal recipients" : "Pretraži interne primatelje",
"Note from" : "Bilješka od",
"Note:" : "Bilješka:",
"File drop" : "Povlačenje datoteke",
"Upload files to {foldername}." : "Učitajte datoteke u {foldername}.",
"By uploading files, you agree to the terms of service." : "Učitavanjem datoteka prihvaćate uvjete korištenja.",
"Successfully uploaded files" : "Datoteke su uspješno učitane.",
"View terms of service" : "Prikaži uvjete pružanja usluge",
"Terms of service" : "Uvjeti pružanja usluge",
"Share with {user}" : "Dijeli s {user}",
"Share with email {email}" : "Dijeli s e-poštom {email}",
"Share with group" : "Dijeli s grupom",
"Share in conversation" : "Dijeli u razgovoru",
"Share with {user} on remote server {server}" : "Dijeli s {user} na udaljenom poslužitelju {server}",
"Share with remote group" : "Dijeli s udaljenom grupom",
"Share with guest" : "Dijeli s gostom",
"Update share" : "Ažuriranje dijeljenja",
"Save share" : "Spremi dijeljenje",
"Read" : "Čitaj",
"Create" : "Stvori",
"Edit" : "Uredi",
"Share" : "Dijeli",
"Delete" : "Izbriši",
"Password field cannot be empty" : "Polje lozinke ne može biti prazno",
"Replace current password" : "Zamijenite trenutnu lozinku",
"Failed to generate a new token" : "Nije uspjelo generiranje novog tokena",
"Allow upload and editing" : "Omogući otpremanje i uređivanje",
"Allow editing" : "Dopusti uređivanje",
"Upload only" : "Samo učitavanje",
"Advanced settings" : "Napredne postavke",
"Share label" : "oznaka za dijeljenje",
"Share link token" : "Token poveznice za dijeljenje",
"Set the public share link token to something easy to remember or generate a new token. It is not recommended to use a guessable token for shares which contain sensitive information." : "Postavite token javne poveznice za dijeljenje na nešto lako pamtljivo ili generirajte novi token. Ne preporučuje se korištenje lako pogodivog tokena za dijeljenja koja sadrže osjetljive informacije.",
"Generating…" : "Generiranje…",
"Generate new token" : "Generiraj novi token",
"Set password" : "Postavi lozinku",
"Password expires {passwordExpirationTime}" : "Lozinka ističe {passwordExpirationTime}",
"Password expired" : "Lozinka istekla",
"Video verification" : "Provjera videozapisa",
"Expiration date (enforced)" : "Datum isteka (provedeno)",
"Set expiration date" : "Postavi datum isteka",
"Hide download" : "Sakrij preuzimanje",
"Allow download and sync" : "Dopusti preuzimanje i sinkronizaciju",
"Note to recipient" : "Obavijest primatelju",
"Enter a note for the share recipient" : "Unesite bilješku za primatelja dijeljenja",
"Show files in grid view" : "Prikaži datoteke u prikazu rešetke",
"Delete share" : "Izbriši dijeljenje",
"Others with access" : "Korisnici s omogućenim pristupom",
"No other accounts with access found" : "Nisu pronađeni drugi računi s pristupom",
"Toggle list of others with access to this directory" : "Uključi/isključi popis korisnika koji smiju pristupiti ovom direktoriju",
"Toggle list of others with access to this file" : "Uključi/isključi popis korisnika koji smiju pristupiti ovoj datoteci",
"Unable to fetch inherited shares" : "Neuspješno dohvaćanje naslijeđenih dijeljenja",
"Link shares" : "Poveznice dijeljenja",
"Shares" : "Dijeljenja",
"Share files within your organization. Recipients who can already view the file can also use this link for easy access." : "Dijelite datoteke unutar svoje organizacije. Primatelji koji već mogu pregledavati datoteku također mogu koristiti ovu poveznicu za jednostavan pristup.",
"Share files with others outside your organization via public links and email addresses. You can also share to {productName} accounts on other instances using their federated cloud ID." : "Dijelite datoteke s drugima izvan svoje organizacije putem javnih poveznica i adresa e-pošte. Također možete dijeliti s računima {productName} na drugim instancama koristeći njihov ID udruženog oblaka.",
"Shares from apps or other sources which are not included in internal or external shares." : "Dijeljenja iz aplikacija ili drugih izvora koja nisu uključena u interna ili vanjska dijeljenja.",
"Type names, teams, federated cloud IDs" : "Upišite nazive, timove ili ID udruženog oblaka",
"Type names or teams" : "Upišite nazive ili timove",
"Type a federated cloud ID" : "Upišite ID udruženog oblaka",
"Type an email" : "Upišite adresu e-pošte",
"Type an email or federated cloud ID" : "Upišite adresu e-pošte ili ID udruženog oblaka",
"Unable to load the shares list" : "Nije moguće učitati popis dijeljenja",
"Expires {relativetime}" : "Istječe {relativetime}",
"this share just expired." : "ovo dijeljenje je upravo isteklo.",
"Shared with you by {owner}" : "S vama podijelio {owner}",
"Internal shares" : "Unutarnja dijeljenja",
"Internal shares explanation" : "Objašnjenje unutarnjih dijeljenja",
"External shares" : "Vanjska dijeljenja",
"External shares explanation" : "Objašnjenje vanjskih dijeljenja",
"Additional shares" : "Dodatna dijeljenja",
"Additional shares explanation" : "Objašnjenje dodatnih dijeljenja",
"Link to a file" : "Poveži s datotekom",
"_Accept share_::_Accept shares_" : ["Prihvati dijeljenje","Prihvati dijeljenja","Prihvati dijeljenja"],
"Open in Files" : "Otvori u aplikaciji Datoteke",
"_Reject share_::_Reject shares_" : ["Odbij dijeljenje","Odbij dijeljenja","Odbij dijeljenja"],
"_Restore share_::_Restore shares_" : ["Vrati dijeljenje","Vrati dijeljenja","Vrati dijeljenja"],
"Shared" : "Dijeljeno",
"Shared by {ownerDisplayName}" : "Dijeljeno s {ownerDisplayName}",
"Shared multiple times with different people" : "Podijeljeno više puta s više ljudi",
"Sharing options" : "Mogućnosti dijeljenja",
"Shared with others" : "Podijeljeno s ostalima",
"You do not have enough permissions to share this file." : "Nemate dovoljno dopuštenja za dijeljenje ove datoteke.",
"People" : "Ljudi",
"Create file request" : "Stvori zahtjev za datotekom",
"Upload files to {foldername}" : "Učitajte datoteke u {foldername}.",
"Public file share" : "Javno dijeljenje datoteke",
"Publicly shared file." : "Javno dijeljena datoteka.",
"No file" : "Nema datoteke",
"The file shared with you will show up here" : "Ovdje će se prikazati datoteka podijeljena s vama",
"Public share" : "Javno dijeljenje",
"Publicly shared files." : "Javno dijeljene datoteke.",
"No files" : "Nema datoteka",
"Files and folders shared with you will show up here" : "Ovdje će se prikazati datoteke i mape dijeljene s vama",
"Overview of shared files." : "Pregled dijeljenih datoteka.",
"No shares" : "Nema dijeljenja",
"Files and folders you shared or have been shared with you will show up here" : "Ovdje će se prikazati datoteke i mape koje ste podijelili ili koje su podijeljene s vama",
"Shared with you" : "Podijeljeno s vama",
"List of files that are shared with you." : "Popis datoteka koje su podijeljene s vama.",
"Nothing shared with you yet" : "Još ništa nije dijeljeno s vama",
"Files and folders others shared with you will show up here" : "Ovdje će se prikazati datoteke i mape koje drugi podijele s vama",
"List of files that you shared with others." : "Popis datoteka koje ste podijelili s drugima.",
"Nothing shared yet" : "Još ništa nije dijeljeno",
"Files and folders you shared will show up here" : "Ovdje će se prikazati datoteke i mape koje ste podijelili",
"Shared by link" : "Podijeljeno putem poveznice",
"List of files that are shared by link." : "Popis datoteka koje su dijeljene putem poveznice.",
"No shared links" : "Nema dijeljenih poveznica",
"Files and folders you shared by link will show up here" : "Ovdje će se prikazati datoteke i mape koje ste podijelili putem poveznice",
"File requests" : "Zahtjevi za datotekama",
"List of file requests." : "Popis zahtjeva za datotekama.",
"No file requests" : "Nema zahtjeva za datotekama",
"File requests you have created will show up here" : "Ovdje će se prikazati zahtjevi za datotekama koje ste stvorili.",
"Deleted shares" : "Izbrisana dijeljenja",
"List of shares you left." : "Popis dijeljenja koja ste napustili.",
"No deleted shares" : "Nema izbrisanih dijeljenja",
"Shares you have left will show up here" : "Ovdje će se prikazati dijeljenja koja ste napustili.",
"Pending shares" : "Dijeljenja na čekanju",
"List of unapproved shares." : "Popis neodobrenih dijeljenja.",
"No pending shares" : "Nema dijeljenja na čekanju",
"Shares you have received but not approved will show up here" : "Ovdje će se prikazati dijeljenja koja ste primili, ali niste odobrili.",
"Error deleting the share: {errorMessage}" : "Pogreška pri brisanju dijeljenja: {errorMessage}",
"Error deleting the share" : "Pogreška pri brisanju dijeljenja",
"Error updating the share: {errorMessage}" : "Pogreška pri ažuriranju dijeljenja: {errorMessage}",
"Error updating the share" : "Pogreška pri ažuriranju dijeljenja",
"File \"{path}\" has been unshared" : "Dijeljenje datoteke „{path}” je uklonjeno",
"Folder \"{path}\" has been unshared" : "Dijeljenje mape „{path}” je uklonjeno",
"Could not update share" : "Nije moguće ažurirati dijeljenje",
"Share saved" : "Dijeljenje je spremljeno",
"Share expiry date saved" : "Datum isteka dijeljenja je spremljen",
"Share hide-download state saved" : "Stanje skrivanja preuzimanja dijeljenja je spremljeno",
"Share label saved" : "Oznaka dijeljenja je spremljena",
"Share note for recipient saved" : "Bilješka za primatelja dijeljenja je spremljena",
"Share password saved" : "Lozinka za dijeljenje je spremljena",
"Share permissions saved" : "Dopuštenja dijeljenja su spremljena",
"To upload files to {folder}, you need to provide your name first." : "Za učitavanje datoteka u {folder} najprije morate unijeti svoje ime.",
"Upload files to {folder}" : "Učitajte datoteke u {folder}.",
"Please confirm your name to upload files to {folder}" : "Molimo potvrdite svoje ime kako biste mogli učitati datoteke u {folder}.",
"{ownerDisplayName} shared a folder with you." : "{ownerDisplayName} dijeli mapu s vama.",
"Names must not be empty." : "Nazivi ne mogu biti prazni.",
"Names must not start with a dot." : "Nazivi ne smiju počinjati s točkom.",
"\"{char}\" is not allowed inside a name." : "\"{char}\" nije dozvoljeno unutar naziva.",
"\"{segment}\" is a reserved name and not allowed." : "\"{segment}\" je rezervirano ime i nije dozvoljeno.",
"\"{extension}\" is not an allowed name." : "\"{extension}\" nije dozvoljeno kao naziv.",
"Names must not end with \"{extension}\"." : "Nazivi ne mogu završavati sa \"{extension}\".",
"Invalid name." : "Nevažeći naziv.",
"Password created successfully" : "Lozinka je uspješno stvorena",
"Error generating password from password policy" : "Pogreška pri generiranju lozinke prema pravilima lozinki",
"Shared with you and the group {group} by {owner}" : "Dijeljeno s vama i grupom {group} vlasnika {owner}",
"Shared with you and {circle} by {owner}" : "Dijeljeno s vama i {circle} od strane {owner}",
"Shared with you and the conversation {conversation} by {owner}" : "Dijeljeno s vama i razgovorom {conversation} vlasnika {owner}",
"Shared with you in a conversation by {owner}" : "{owner} dijeli s vama u razgovoru",
"Share not found" : "Dijeljenje nije pronađeno",
"Back to %s" : "Natrag na %s",
"Add to your Nextcloud" : "Dodaj u svoj Nextcloud",
"Sharing %s failed because the back end does not support ScienceMesh shares" : "Neuspješno dijeljenje %s jer pozadinski servis ne podržava ScienceMesh dijeljenje ",
"Link copied to clipboard" : "Poveznica je kopirana u međuspremnik",
"Copy to clipboard" : "Kopiraj u međuspremnik",
"Copy internal link to clipboard" : "Kopiraj unutarnju poveznicu u međuspremnik",
"Only works for people with access to this folder" : "Samo za korisnike koji smiju pristupiti ovoj mapi",
"Only works for people with access to this file" : "Samo za korisnike koji smiju pristupiti ovoj datoteci",
"Copy public link of \"{title}\" to clipboard" : "Kopiraj javnu poveznicu za \"{title}\" u međuspremnik",
"Name or email …" : "Ime ili adresa e-pošte…",
"Name, email, or Federated Cloud ID …" : "Naziv, adresa e-pošte ili ID udruženog oblaka…",
"Searching …" : "Traženje…",
"Search globally" : "Pretraži globalno",
"Submit name" : "Pošalji naziv",
"To upload files, you need to provide your name first." : "Za učitavanje datoteka najprije morate unijeti svoje ime.",
"Name" : "Naziv",
"Enter your name" : "Unesite svoje ime",
"Share with {userName}" : "Dijeli s {userName}",
"Use this method to share files with individuals or teams within your organization. If the recipient already has access to the share but cannot locate it, you can send them the internal share link for easy access." : "Koristite ovu metodu za dijeljenje datoteka s pojedincima ili timovima unutar svoje organizacije. Ako primatelj već ima pristup dijeljenju, ali ga ne može pronaći, možete mu poslati internu poveznicu za dijeljenje radi lakšeg pristupa.",
"Use this method to share files with individuals or organizations outside your organization. Files and folders can be shared via public share links and email addresses. You can also share to other Nextcloud accounts hosted on different instances using their federated cloud ID." : "Koristite ovu metodu za dijeljenje datoteka s pojedincima ili organizacijama izvan svoje organizacije. Datoteke i mape mogu se dijeliti putem javnih poveznica i adresa e-pošte. Također možete dijeliti s drugim Nextcloud računima na različitim instancama koristeći njihov ID udruženog oblaka.",
"Shares that are not part of the internal or external shares. This can be shares from apps or other sources." : "Dijeljenja koja nisu dio internih ili vanjskih dijeljenja. To mogu biti dijeljenja iz aplikacija ili drugih izvora.",
"Share with accounts, teams, federated cloud id" : "Dijeli s računima, timovima i ID-om udruženog oblaka",
"Share with accounts and teams" : "Dijeli s računima i timovima",
"Federated cloud ID" : "ID udruženog oblaka",
"Email, federated cloud id" : "Adresa e-pošte, ID udruženog oblaka",
"Show sharing options" : "Prikaži mogućnosti dijeljenja",
"Filename must not be empty." : "Naziv datoteke ne može biti prazan.",
"Shared by" : "Podijeljeno od",
"Shared with" : "Dijeljeno s",
"Share note" : "Dijeli bilješku",
"Show list view" : "Prikaži u popisu",
"Show grid view" : "Prikaži u rešetki",
"Upload files to %s" : "Otpremi datoteke na %s",
"%s shared a folder with you." : "%s dijeli mapu s vama.",
"Note" : "Bilješka",
"Select or drop files" : "Odaberi ili ispusti datoteke",
"Uploading files" : "Otpremanje datoteka",
"Uploaded files:" : "Otpremljene datoteke:",
"By uploading files, you agree to the %1$sterms of service%2$s." : "Otpremanjem datoteka prihvaćate %1$ uvjete korištenja usluge%2$s."
},"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"
}

View File

@@ -153,6 +153,7 @@ OC.L10N.register(
"Unshare" : "Megosztás visszavonása",
"Cannot copy, please copy the link manually" : "A másolás sikertelen, másolja kézzel a hivatkozást",
"Copy internal link" : "Belső hivatkozás másolása",
"For people who already have access" : "Azok számára, akik már rendelkeznek hozzáféréssel",
"Internal link" : "Belső hivatkozás",
"{shareWith} by {initiator}" : "{shareWith}, {initiator} által",
"Shared via link by {initiator}" : "{initiator} által hivatkozással megosztva",
@@ -216,16 +217,21 @@ OC.L10N.register(
"Enter a note for the share recipient" : "Adjon meg egy megjegyzést a megosztás címzettje számára",
"Delete share" : "Megosztás törlése",
"Others with access" : "Mások, akik hozzáféréssel rendelkeznek",
"No other accounts with access found" : "Nincs más hozzáférési jogosultsággal rendelkező fiók ",
"Toggle list of others with access to this directory" : "A könyvtárhoz hozzáféréssel rendelkezők listája be/ki",
"Toggle list of others with access to this file" : "A fájlhoz hozzáféréssel rendelkezők listája be/ki",
"Unable to fetch inherited shares" : "Nem sikerült lekérni az örökölt megosztásokat",
"Shares" : "Megosztások",
"Type names or teams" : "Írjon be neveket vagy csapatokat",
"Type an email or federated cloud ID" : "Írjon be e-mail-címet vagy föderált felhőazonosítót",
"Unable to load the shares list" : "A megosztások listájának betöltése sikertelen",
"Expires {relativetime}" : "Lejárat: {relativetime}",
"this share just expired." : "ez a megosztás épp most járt le.",
"Shared with you by {owner}" : "{owner} megosztotta Önnel",
"Internal shares" : "Belső megosztások",
"External shares" : "Külső megosztások",
"Additional shares" : "További megosztások",
"Additional shares explanation" : "További megosztások magyarázata",
"Link to a file" : "Hivatkozás egy fájlhoz",
"_Accept share_::_Accept shares_" : ["Megosztás elfogadása","Megosztások elfogadása"],
"Open in Files" : "Megnyitás a Fájlokban",

View File

@@ -151,6 +151,7 @@
"Unshare" : "Megosztás visszavonása",
"Cannot copy, please copy the link manually" : "A másolás sikertelen, másolja kézzel a hivatkozást",
"Copy internal link" : "Belső hivatkozás másolása",
"For people who already have access" : "Azok számára, akik már rendelkeznek hozzáféréssel",
"Internal link" : "Belső hivatkozás",
"{shareWith} by {initiator}" : "{shareWith}, {initiator} által",
"Shared via link by {initiator}" : "{initiator} által hivatkozással megosztva",
@@ -214,16 +215,21 @@
"Enter a note for the share recipient" : "Adjon meg egy megjegyzést a megosztás címzettje számára",
"Delete share" : "Megosztás törlése",
"Others with access" : "Mások, akik hozzáféréssel rendelkeznek",
"No other accounts with access found" : "Nincs más hozzáférési jogosultsággal rendelkező fiók ",
"Toggle list of others with access to this directory" : "A könyvtárhoz hozzáféréssel rendelkezők listája be/ki",
"Toggle list of others with access to this file" : "A fájlhoz hozzáféréssel rendelkezők listája be/ki",
"Unable to fetch inherited shares" : "Nem sikerült lekérni az örökölt megosztásokat",
"Shares" : "Megosztások",
"Type names or teams" : "Írjon be neveket vagy csapatokat",
"Type an email or federated cloud ID" : "Írjon be e-mail-címet vagy föderált felhőazonosítót",
"Unable to load the shares list" : "A megosztások listájának betöltése sikertelen",
"Expires {relativetime}" : "Lejárat: {relativetime}",
"this share just expired." : "ez a megosztás épp most járt le.",
"Shared with you by {owner}" : "{owner} megosztotta Önnel",
"Internal shares" : "Belső megosztások",
"External shares" : "Külső megosztások",
"Additional shares" : "További megosztások",
"Additional shares explanation" : "További megosztások magyarázata",
"Link to a file" : "Hivatkozás egy fájlhoz",
"_Accept share_::_Accept shares_" : ["Megosztás elfogadása","Megosztások elfogadása"],
"Open in Files" : "Megnyitás a Fájlokban",

View File

@@ -0,0 +1,131 @@
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files_Sharing\Repair;
use OC\Files\SetupManager;
use OCA\Files_Sharing\ShareTargetValidator;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\Files\Config\ICachedMountInfo;
use OCP\Files\Config\IUserMountCache;
use OCP\IDBConnection;
use OCP\IUserManager;
use OCP\Migration\IOutput;
use OCP\Migration\IRepairStep;
use OCP\Share\IManager;
use OCP\Share\IProviderFactory;
use OCP\Share\IShare;
class CleanupShareTarget implements IRepairStep {
/** we only care about shares with a user target,
* since the underling group/deck/talk share doesn't get moved
*/
private const USER_SHARE_TYPES = [
IShare::TYPE_USER,
IShare::TYPE_USERGROUP,
IShare::TYPE_DECK_USER,
11 // TYPE_USERROOM
];
public function __construct(
private readonly IDBConnection $connection,
private readonly IManager $shareManager,
private readonly IProviderFactory $shareProviderFactory,
private readonly ShareTargetValidator $shareTargetValidator,
private readonly IUserManager $userManager,
private readonly SetupManager $setupManager,
private readonly IUserMountCache $userMountCache,
) {
}
#[\Override]
public function getName() {
return 'Cleanup share names with false conflicts';
}
#[\Override]
public function run(IOutput $output) {
$count = $this->countProblemShares();
if ($count === 0) {
return;
}
$output->startProgress($count);
$lastUser = '';
$userMounts = [];
foreach ($this->getProblemShares() as $shareInfo) {
$recipient = $this->userManager->getExistingUser($shareInfo['share_with']);
$share = $this->shareProviderFactory
->getProviderForType((int)$shareInfo['share_type'])
->getShareById($shareInfo['id'], $recipient->getUID());
// since we ordered the share by user, we can reuse the last data until we get to the next user
if ($lastUser !== $recipient->getUID()) {
$lastUser = $recipient->getUID();
$this->setupManager->tearDown();
$this->setupManager->setupForUser($recipient);
$mounts = $this->userMountCache->getMountsForUser($recipient);
$mountPoints = array_map(fn (ICachedMountInfo $mount) => $mount->getMountPoint(), $mounts);
$userMounts = array_combine($mountPoints, $mounts);
}
$oldTarget = $share->getTarget();
$newTarget = $this->cleanTarget($oldTarget);
$share->setTarget($newTarget);
$this->shareManager->moveShare($share, $recipient->getUID());
$this->shareTargetValidator->verifyMountPoint(
$recipient,
$share,
$userMounts,
[$share],
);
$oldMountPoint = "/{$recipient->getUID()}/files$oldTarget/";
$newMountPoint = "/{$recipient->getUID()}/files$newTarget/";
$userMounts[$newMountPoint] = $userMounts[$oldMountPoint];
unset($userMounts[$oldMountPoint]);
$output->advance();
}
$output->finishProgress();
$output->info("Fixed $count shares");
}
private function countProblemShares(): int {
$query = $this->connection->getQueryBuilder();
$query->select($query->func()->count('id'))
->from('share')
->where($query->expr()->like('file_target', $query->createNamedParameter('% (_) (_)%')))
->andWhere($query->expr()->in('share_type', $query->createNamedParameter(self::USER_SHARE_TYPES, IQueryBuilder::PARAM_INT_ARRAY), IQueryBuilder::PARAM_INT_ARRAY));
return (int)$query->executeQuery()->fetchOne();
}
/**
* @return \Traversable<array{id: string, share_type: string, share_with: string}>
*/
private function getProblemShares(): \Traversable {
$query = $this->connection->getQueryBuilder();
$query->select('id', 'share_type', 'share_with')
->from('share')
->where($query->expr()->like('file_target', $query->createNamedParameter('% (_) (_)%')))
->andWhere($query->expr()->in('share_type', $query->createNamedParameter(self::USER_SHARE_TYPES, IQueryBuilder::PARAM_INT_ARRAY), IQueryBuilder::PARAM_INT_ARRAY))
->orderBy('share_with')
->addOrderBy('id');
$result = $query->executeQuery();
/** @var \Traversable<array{id: string, share_type: string, share_with: string}> $rows */
$rows = $result->iterateAssociative();
return $rows;
}
private function cleanTarget(string $target): string {
return preg_replace('/( \([2-9]\)){2,}/', '', $target);
}
}

View File

@@ -0,0 +1,115 @@
<?php
/**
* SPDX-FileCopyrightText: 2026
* SPDX-License-Identifier: AGPL-3.0-only
*/
namespace OCA\Files_Sharing\Tests\Repair;
use OC\Migration\NullOutput;
use OCA\Files_Sharing\Repair\CleanupShareTarget;
use OCA\Files_Sharing\Tests\TestCase;
use OCP\Files\NotFoundException;
use OCP\Server;
use OCP\Share\IShare;
use PHPUnit\Framework\Attributes\Group;
/**
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
#[Group(name: 'DB')]
class CleanupShareTargetTest extends TestCase {
public const TEST_FOLDER_NAME = '/folder_share_api_test';
private CleanupShareTarget $cleanupShareTarget;
protected function setUp(): void {
parent::setUp();
$this->cleanupShareTarget = Server::get(CleanupShareTarget::class);
}
private function createUserShare(string $by, string $target = self::TEST_FOLDER_NAME): IShare {
$userFolder = $this->rootFolder->getUserFolder($by);
try {
$node = $userFolder->get(self::TEST_FOLDER_NAME);
} catch (NotFoundException $e) {
$node = $userFolder->newFolder(self::TEST_FOLDER_NAME);
}
$share1 = $this->shareManager->newShare();
$share1->setNode($node)
->setSharedBy($by)
->setSharedWith(self::TEST_FILES_SHARING_API_USER2)
->setShareType(IShare::TYPE_USER)
->setPermissions(31);
$share = $this->shareManager->createShare($share1);
$share->setStatus(IShare::STATUS_ACCEPTED);
$this->shareManager->updateShare($share);
$share->setTarget($target);
$this->shareManager->moveShare($share, self::TEST_FILES_SHARING_API_USER2);
$share = $this->shareManager->getShareById($share->getFullId());
$this->assertEquals($target, $share->getTarget());
return $share;
}
public function testBasicRepair() {
$share = $this->createUserShare(self::TEST_FILES_SHARING_API_USER1, self::TEST_FOLDER_NAME . ' (2) (2) (2) (2)');
$this->cleanupShareTarget->run(new NullOutput());
$share = $this->shareManager->getShareById($share->getFullId());
$this->assertEquals(self::TEST_FOLDER_NAME, $share->getTarget());
}
public function testRepairConflictFile() {
$share = $this->createUserShare(self::TEST_FILES_SHARING_API_USER1, self::TEST_FOLDER_NAME . ' (2) (2) (2) (2)');
$this->loginHelper(self::TEST_FILES_SHARING_API_USER2);
$userFolder2 = $this->rootFolder->getUserFolder(self::TEST_FILES_SHARING_API_USER2);
$folder = $userFolder2->newFolder(self::TEST_FOLDER_NAME);
$this->cleanupShareTarget->run(new NullOutput());
$folder->delete();
$share = $this->shareManager->getShareById($share->getFullId());
$this->assertEquals(self::TEST_FOLDER_NAME . ' (2)', $share->getTarget());
}
public function testRepairConflictShare() {
$share = $this->createUserShare(self::TEST_FILES_SHARING_API_USER1, self::TEST_FOLDER_NAME . ' (2) (2) (2) (2)');
$share2 = $this->createUserShare(self::TEST_FILES_SHARING_API_USER3);
$this->cleanupShareTarget->run(new NullOutput());
$share2 = $this->shareManager->getShareById($share2->getFullId());
$this->assertEquals(self::TEST_FOLDER_NAME, $share2->getTarget());
$share = $this->shareManager->getShareById($share->getFullId());
$this->assertEquals(self::TEST_FOLDER_NAME . ' (2)', $share->getTarget());
}
public function testRepairMultipleConflicting() {
$share = $this->createUserShare(self::TEST_FILES_SHARING_API_USER1, self::TEST_FOLDER_NAME . ' (2) (2) (2) (2)');
$share2 = $this->createUserShare(self::TEST_FILES_SHARING_API_USER3, self::TEST_FOLDER_NAME . ' (2) (2) (2) (2) (2)');
$this->cleanupShareTarget->run(new NullOutput());
$share = $this->shareManager->getShareById($share->getFullId());
$share2 = $this->shareManager->getShareById($share2->getFullId());
// there is no guarantee for what order the 2 shares got repaired by
$targets = [
$share->getTarget(),
$share2->getTarget(),
];
sort($targets);
$this->assertEquals([
self::TEST_FOLDER_NAME,
self::TEST_FOLDER_NAME . ' (2)'
], $targets);
}
}

View File

@@ -7,18 +7,20 @@
*/
namespace OCA\Files_Trashbin\BackgroundJob;
use OC\Files\View;
use OCA\Files_Trashbin\AppInfo\Application;
use OCA\Files_Trashbin\Expiration;
use OCA\Files_Trashbin\Trashbin;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\BackgroundJob\TimedJob;
use OCP\Files\Folder;
use OCP\Files\IRootFolder;
use OCP\Files\ISetupManager;
use OCP\IAppConfig;
use OCP\IUser;
use OCP\IUserManager;
use OCP\Lock\ILockingProvider;
use OCP\Lock\LockedException;
use Override;
use Psr\Log\LoggerInterface;
class ExpireTrash extends TimedJob {
@@ -28,19 +30,21 @@ class ExpireTrash extends TimedJob {
private const USER_BATCH_SIZE = 10;
public function __construct(
private IAppConfig $appConfig,
private IUserManager $userManager,
private Expiration $expiration,
private LoggerInterface $logger,
private ISetupManager $setupManager,
private ILockingProvider $lockingProvider,
private readonly IAppConfig $appConfig,
private readonly IUserManager $userManager,
private readonly Expiration $expiration,
private readonly LoggerInterface $logger,
private readonly ISetupManager $setupManager,
private readonly ILockingProvider $lockingProvider,
private readonly IRootFolder $rootFolder,
ITimeFactory $time,
) {
parent::__construct($time);
$this->setInterval(self::THIRTY_MINUTES);
}
protected function run($argument) {
#[Override]
protected function run($argument): void {
$backgroundJob = $this->appConfig->getValueBool(Application::APP_ID, self::TOGGLE_CONFIG_KEY_NAME, true);
if (!$backgroundJob) {
return;
@@ -64,9 +68,8 @@ class ExpireTrash extends TimedJob {
$count++;
try {
if ($this->setupFS($user)) {
Trashbin::expire($uid);
}
$folder = $this->getTrashRoot($user);
Trashbin::expire($folder, $user);
} catch (\Throwable $e) {
$this->logger->error('Error while expiring trashbin for user ' . $uid, ['exception' => $e]);
} finally {
@@ -82,23 +85,19 @@ class ExpireTrash extends TimedJob {
}
}
/**
* Act on behalf on trash item owner
*/
protected function setupFS(IUser $user): bool {
private function getTrashRoot(IUser $user): Folder {
$this->setupManager->tearDown();
$this->setupManager->setupForUser($user);
// Check if this user has a trashbin directory
$view = new View('/' . $user->getUID());
if (!$view->is_dir('/files_trashbin/files')) {
return false;
$folder = $this->rootFolder->getUserFolder($user->getUID())->getParent()->get('files_trashbin');
if (!$folder instanceof Folder) {
throw new \LogicException("Didn't expect files_trashbin to be a file instead of a folder");
}
return true;
return $folder;
}
private function getNextOffset(): int {
return $this->runMutexOperation(function () {
return $this->runMutexOperation(function (): int {
$this->appConfig->clearCache();
$offset = $this->appConfig->getValueInt(Application::APP_ID, self::OFFSET_CONFIG_KEY_NAME, 0);
@@ -109,13 +108,18 @@ class ExpireTrash extends TimedJob {
}
private function resetOffset() {
private function resetOffset(): void {
$this->runMutexOperation(function (): void {
$this->appConfig->setValueInt(Application::APP_ID, self::OFFSET_CONFIG_KEY_NAME, 0);
});
}
private function runMutexOperation($operation): mixed {
/**
* @template T
* @param callable(): T $operation
* @return T
*/
private function runMutexOperation(callable $operation): mixed {
$acquired = false;
while ($acquired === false) {

View File

@@ -7,29 +7,36 @@
*/
namespace OCA\Files_Trashbin\Command;
use OC\Core\Command\Base;
use OC\Files\SetupManager;
use OC\User\LazyUser;
use OCP\Files\IRootFolder;
use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException;
use OCP\IDBConnection;
use OCP\IUser;
use OCP\IUserBackend;
use OCP\IUserManager;
use OCP\Util;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Exception\InvalidOptionException;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class CleanUp extends Command {
class CleanUp extends Base {
public function __construct(
protected IRootFolder $rootFolder,
protected IUserManager $userManager,
protected IDBConnection $dbConnection,
protected SetupManager $setupManager,
) {
parent::__construct();
}
protected function configure() {
protected function configure(): void {
parent::configure();
$this
->setName('trashbin:cleanup')
->setDescription('Remove deleted files')
@@ -47,17 +54,18 @@ class CleanUp extends Command {
}
protected function execute(InputInterface $input, OutputInterface $output): int {
$users = $input->getArgument('user_id');
$userIds = $input->getArgument('user_id');
$verbose = $input->getOption('verbose');
if (!empty($users) && $input->getOption('all-users')) {
if (!empty($userIds) && $input->getOption('all-users')) {
throw new InvalidOptionException('Either specify a user_id or --all-users');
} elseif (!empty($users)) {
foreach ($users as $user) {
if ($this->userManager->userExists($user)) {
$output->writeln("Remove deleted files of <info>$user</info>");
} elseif (!empty($userIds)) {
foreach ($userIds as $userId) {
$user = $this->userManager->get($userId);
if ($user) {
$output->writeln("Remove deleted files of <info>$userId</info>");
$this->removeDeletedFiles($user, $output, $verbose);
} else {
$output->writeln("<error>Unknown user $user</error>");
$output->writeln("<error>Unknown user $userId</error>");
return 1;
}
}
@@ -72,13 +80,14 @@ class CleanUp extends Command {
$limit = 500;
$offset = 0;
do {
$users = $backend->getUsers('', $limit, $offset);
foreach ($users as $user) {
$output->writeln(" <info>$user</info>");
$userIds = $backend->getUsers('', $limit, $offset);
foreach ($userIds as $userId) {
$output->writeln(" <info>$userId</info>");
$user = new LazyUser($userId, $this->userManager, null, $backend);
$this->removeDeletedFiles($user, $output, $verbose);
}
$offset += $limit;
} while (count($users) >= $limit);
} while (count($userIds) >= $limit);
}
} else {
throw new InvalidOptionException('Either specify a user_id or --all-users');
@@ -87,32 +96,33 @@ class CleanUp extends Command {
}
/**
* remove deleted files for the given user
* Remove deleted files for the given user.
*/
protected function removeDeletedFiles(string $uid, OutputInterface $output, bool $verbose): void {
\OC_Util::tearDownFS();
\OC_Util::setupFS($uid);
$path = '/' . $uid . '/files_trashbin';
if ($this->rootFolder->nodeExists($path)) {
protected function removeDeletedFiles(IUser $user, OutputInterface $output, bool $verbose): void {
$this->setupManager->tearDown();
$this->setupManager->setupForUser($user);
$path = '/' . $user->getUID() . '/files_trashbin';
try {
$node = $this->rootFolder->get($path);
} catch (NotFoundException|NotPermittedException) {
if ($verbose) {
$output->writeln('Deleting <info>' . Util::humanFileSize($node->getSize()) . "</info> in trash for <info>$uid</info>.");
}
$node->delete();
if ($this->rootFolder->nodeExists($path)) {
$output->writeln('<error>Trash folder sill exists after attempting to delete it</error>');
return;
}
$query = $this->dbConnection->getQueryBuilder();
$query->delete('files_trash')
->where($query->expr()->eq('user', $query->createParameter('uid')))
->setParameter('uid', $uid);
$query->executeStatement();
} else {
if ($verbose) {
$output->writeln("No trash found for <info>$uid</info>");
$output->writeln("No trash found for <info>{$user->getUID()}</info>");
}
return;
}
if ($verbose) {
$output->writeln('Deleting <info>' . Util::humanFileSize($node->getSize()) . "</info> in trash for <info>{$user->getUID()}</info>.");
}
$node->delete();
if ($this->rootFolder->nodeExists($path)) {
$output->writeln('<error>Trash folder sill exists after attempting to delete it</error>');
return;
}
$query = $this->dbConnection->getQueryBuilder();
$query->delete('files_trash')
->where($query->expr()->eq('user', $query->createParameter('uid')))
->setParameter('uid', $user->getUID());
$query->executeStatement();
}
}

View File

@@ -8,32 +8,48 @@
namespace OCA\Files_Trashbin\Command;
use OC\Command\FileAccess;
use OC\Files\SetupManager;
use OCA\Files_Trashbin\Trashbin;
use OCP\Command\ICommand;
use OCP\Files\Folder;
use OCP\Files\IRootFolder;
use OCP\IUserManager;
use OCP\Server;
use Override;
use Psr\Log\LoggerInterface;
class Expire implements ICommand {
use FileAccess;
/**
* @param string $user
*/
public function __construct(
private $user,
private readonly string $userId,
) {
}
public function handle() {
#[Override]
public function handle(): void {
// can't use DI because Expire needs to be serializable
$userManager = Server::get(IUserManager::class);
if (!$userManager->userExists($this->user)) {
$user = $userManager->get($this->userId);
if (!$user) {
// User has been deleted already
return;
}
\OC_Util::tearDownFS();
\OC_Util::setupFS($this->user);
Trashbin::expire($this->user);
\OC_Util::tearDownFS();
try {
$setupManager = Server::get(SetupManager::class);
$setupManager->tearDown();
$setupManager->setupForUser($user);
$trashRoot = Server::get(IRootFolder::class)->getUserFolder($user->getUID())->getParent()->get('files_trashbin');
if (!$trashRoot instanceof Folder) {
throw new \LogicException("Didn't expect files_trashbin to be a file instead of a folder");
}
Trashbin::expire($trashRoot, $user);
} catch (\Exception $e) {
Server::get(LoggerInterface::class)->error('Error while expiring trashbin for user ' . $user->getUID(), ['exception' => $e]);
} finally {
$setupManager->tearDown();
}
}
}

View File

@@ -7,33 +7,32 @@
*/
namespace OCA\Files_Trashbin\Command;
use OC\Files\View;
use OC\Core\Command\Base;
use OC\Files\SetupManager;
use OCA\Files_Trashbin\Expiration;
use OCA\Files_Trashbin\Trashbin;
use OCP\Files\Folder;
use OCP\Files\IRootFolder;
use OCP\IUser;
use OCP\IUserManager;
use Psr\Log\LoggerInterface;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Helper\ProgressBar;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class ExpireTrash extends Command {
class ExpireTrash extends Base {
/**
* @param IUserManager|null $userManager
* @param Expiration|null $expiration
*/
public function __construct(
private LoggerInterface $logger,
private ?IUserManager $userManager = null,
private ?Expiration $expiration = null,
private readonly ?IUserManager $userManager,
private readonly ?Expiration $expiration,
private readonly SetupManager $setupManager,
private readonly IRootFolder $rootFolder,
) {
parent::__construct();
}
protected function configure() {
protected function configure(): void {
parent::configure();
$this
->setName('trashbin:expire')
->setDescription('Expires the users trashbin')
@@ -52,15 +51,17 @@ class ExpireTrash extends Command {
return 1;
}
$users = $input->getArgument('user_id');
if (!empty($users)) {
foreach ($users as $user) {
if ($this->userManager->userExists($user)) {
$output->writeln("Remove deleted files of <info>$user</info>");
$userObject = $this->userManager->get($user);
$this->expireTrashForUser($userObject);
$userIds = $input->getArgument('user_id');
if (!empty($userIds)) {
foreach ($userIds as $userId) {
$user = $this->userManager->get($userId);
if ($user) {
$output->writeln("Remove deleted files of <info>$userId</info>");
$this->expireTrashForUser($user, $output);
$output->writeln("<error>Unknown user $userId</error>");
return 1;
} else {
$output->writeln("<error>Unknown user $user</error>");
$output->writeln("<error>Unknown user $userId</error>");
return 1;
}
}
@@ -71,7 +72,7 @@ class ExpireTrash extends Command {
$users = $this->userManager->getSeenUsers();
foreach ($users as $user) {
$p->advance();
$this->expireTrashForUser($user);
$this->expireTrashForUser($user, $output);
}
$p->finish();
$output->writeln('');
@@ -79,33 +80,25 @@ class ExpireTrash extends Command {
return 0;
}
public function expireTrashForUser(IUser $user) {
private function expireTrashForUser(IUser $user, OutputInterface $output): void {
try {
$uid = $user->getUID();
if (!$this->setupFS($uid)) {
return;
}
Trashbin::expire($uid);
$trashRoot = $this->getTrashRoot($user);
Trashbin::expire($trashRoot, $user);
} catch (\Throwable $e) {
$this->logger->error('Error while expiring trashbin for user ' . $user->getUID(), ['exception' => $e]);
$output->writeln('<error>Error while expiring trashbin for user ' . $user->getUID() . '</error>');
throw $e;
} finally {
$this->setupManager->tearDown();
}
}
/**
* Act on behalf on trash item owner
* @param string $user
* @return boolean
*/
protected function setupFS($user) {
\OC_Util::tearDownFS();
\OC_Util::setupFS($user);
private function getTrashRoot(IUser $user): Folder {
$this->setupManager->setupForUser($user);
// Check if this user has a trashbin directory
$view = new View('/' . $user);
if (!$view->is_dir('/files_trashbin/files')) {
return false;
$folder = $this->rootFolder->getUserFolder($user->getUID())->getParent()->get('files_trashbin');
if (!$folder instanceof Folder) {
throw new \LogicException("Didn't expect files_trashbin to be a file instead of a folder");
}
return true;
return $folder;
}
}

View File

@@ -7,6 +7,7 @@
namespace OCA\Files_Trashbin\Command;
use OC\Core\Command\Base;
use OC\Files\SetupManager;
use OCA\Files_Trashbin\Trash\ITrashManager;
use OCA\Files_Trashbin\Trash\TrashItem;
use OCP\Files\IRootFolder;
@@ -14,6 +15,7 @@ use OCP\IDBConnection;
use OCP\IL10N;
use OCP\IUserBackend;
use OCP\IUserManager;
use OCP\IUserSession;
use OCP\L10N\IFactory;
use Symfony\Component\Console\Exception\InvalidOptionException;
use Symfony\Component\Console\Input\InputArgument;
@@ -48,6 +50,8 @@ class RestoreAllFiles extends Base {
protected IUserManager $userManager,
protected IDBConnection $dbConnection,
protected ITrashManager $trashManager,
protected SetupManager $setupManager,
protected IUserSession $userSession,
IFactory $l10nFactory,
) {
parent::__construct();
@@ -140,17 +144,16 @@ class RestoreAllFiles extends Base {
* Restore deleted files for the given user according to the given filters
*/
protected function restoreDeletedFiles(string $uid, int $scope, ?int $since, ?int $until, bool $dryRun, OutputInterface $output): void {
\OC_Util::tearDownFS();
\OC_Util::setupFS($uid);
\OC_User::setUserId($uid);
$user = $this->userManager->get($uid);
if ($user === null) {
if (!$user) {
$output->writeln("<error>Unknown user $uid</error>");
return;
}
$this->setupManager->tearDown();
$this->setupManager->setupForUser($user);
$this->userSession->setUser($user);
$userTrashItems = $this->filterTrashItems(
$this->trashManager->listTrashRoot($user),
$scope,

View File

@@ -10,10 +10,12 @@ namespace OCA\Files_Trashbin\Command;
use OC\Core\Command\Base;
use OCP\Command\IBus;
use OCP\IAppConfig;
use OCP\IConfig;
use OCP\IUser;
use OCP\IUserManager;
use OCP\Util;
use Override;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
@@ -21,14 +23,16 @@ use Symfony\Component\Console\Output\OutputInterface;
class Size extends Base {
public function __construct(
private IConfig $config,
private IUserManager $userManager,
private IBus $commandBus,
private readonly IAppConfig $appConfig,
private readonly IConfig $config,
private readonly IUserManager $userManager,
private readonly IBus $commandBus,
) {
parent::__construct();
}
protected function configure() {
#[Override]
protected function configure(): void {
parent::configure();
$this
->setName('trashbin:size')
@@ -41,6 +45,7 @@ class Size extends Base {
);
}
#[Override]
protected function execute(InputInterface $input, OutputInterface $output): int {
$user = $input->getOption('user');
$size = $input->getArgument('size');
@@ -55,7 +60,7 @@ class Size extends Base {
$this->config->setUserValue($user, 'files_trashbin', 'trashbin_size', (string)$parsedSize);
$this->commandBus->push(new Expire($user));
} else {
$this->config->setAppValue('files_trashbin', 'trashbin_size', (string)$parsedSize);
$this->appConfig->setValueInt('files_trashbin', 'trashbin_size', $parsedSize);
$output->writeln('<info>Warning: changing the default trashbin size will automatically trigger cleanup of existing trashbins,</info>');
$output->writeln('<info>a users trashbin can exceed the configured size until they move a new file to the trashbin.</info>');
}
@@ -66,8 +71,8 @@ class Size extends Base {
return 0;
}
private function printTrashbinSize(InputInterface $input, OutputInterface $output, ?string $user) {
$globalSize = (int)$this->config->getAppValue('files_trashbin', 'trashbin_size', '-1');
private function printTrashbinSize(InputInterface $input, OutputInterface $output, ?string $user): void {
$globalSize = $this->appConfig->getValueInt('files_trashbin', 'trashbin_size', -1);
if ($globalSize < 0) {
$globalHumanSize = 'default (50% of available space)';
} else {

View File

@@ -15,11 +15,18 @@ use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
use OCP\Files\Events\BeforeFileSystemSetupEvent;
use OCP\Files\Events\Node\NodeWrittenEvent;
use OCP\Files\Folder;
use OCP\Files\IRootFolder;
use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException;
use OCP\IUserManager;
use OCP\User\Events\BeforeUserDeletedEvent;
/** @template-implements IEventListener<NodeWrittenEvent|BeforeUserDeletedEvent|BeforeFileSystemSetupEvent> */
class EventListener implements IEventListener {
public function __construct(
private IUserManager $userManager,
private IRootFolder $rootFolder,
private ?string $userId = null,
) {
}
@@ -27,8 +34,19 @@ class EventListener implements IEventListener {
public function handle(Event $event): void {
if ($event instanceof NodeWrittenEvent) {
// Resize trash
if (!empty($this->userId)) {
Trashbin::resizeTrash($this->userId);
if (empty($this->userId)) {
return;
}
try {
/** @var Folder $trashRoot */
$trashRoot = $this->rootFolder->get('/' . $this->userId . '/files_trashbin');
} catch (NotFoundException|NotPermittedException) {
return;
}
$user = $this->userManager->get($this->userId);
if ($user) {
Trashbin::resizeTrash($trashRoot, $user);
}
}

View File

@@ -44,6 +44,7 @@ use OCP\IConfig;
use OCP\IDBConnection;
use OCP\IRequest;
use OCP\IURLGenerator;
use OCP\IUser;
use OCP\IUserManager;
use OCP\Lock\ILockingProvider;
use OCP\Lock\LockedException;
@@ -774,24 +775,19 @@ class Trashbin implements IEventListener {
}
/**
* calculate remaining free space for trash bin
* Calculate remaining free space for trash bin
*
* @param int|float $trashbinSize current size of the trash bin
* @param string $user
* @return int|float available free space for trash bin
*/
private static function calculateFreeSpace(int|float $trashbinSize, string $user): int|float {
$configuredTrashbinSize = static::getConfiguredTrashbinSize($user);
private static function calculateFreeSpace(Folder $userFolder, int|float $trashbinSize, IUser $user): int|float {
$configuredTrashbinSize = static::getConfiguredTrashbinSize($user->getUID());
if ($configuredTrashbinSize > -1) {
return $configuredTrashbinSize - $trashbinSize;
}
$userObject = Server::get(IUserManager::class)->get($user);
if (is_null($userObject)) {
return 0;
}
$softQuota = true;
$quota = $userObject->getQuota();
$quota = $user->getQuota();
if ($quota === null || $quota === 'none') {
$quota = Filesystem::free_space('/');
$softQuota = false;
@@ -810,10 +806,6 @@ class Trashbin implements IEventListener {
// calculate available space for trash bin
// subtract size of files and current trash bin size from quota
if ($softQuota) {
$userFolder = \OC::$server->getUserFolder($user);
if (is_null($userFolder)) {
return 0;
}
$free = $quota - $userFolder->getSize(false); // remaining free space for user
if ($free > 0) {
$availableSpace = ($free * self::DEFAULTMAXSIZE / 100) - $trashbinSize; // how much space can be used for versions
@@ -828,38 +820,34 @@ class Trashbin implements IEventListener {
}
/**
* resize trash bin if necessary after a new file was added to Nextcloud
*
* @param string $user user id
* Resize trash bin if necessary after a new file was added to Nextcloud
*/
public static function resizeTrash($user) {
$size = self::getTrashbinSize($user);
public static function resizeTrash(Folder $trashRoot, IUser $user): void {
$trashBinSize = $trashRoot->getSize();
$freeSpace = self::calculateFreeSpace($size, $user);
$freeSpace = self::calculateFreeSpace($trashRoot->getParent(), $trashBinSize, $user);
if ($freeSpace < 0) {
self::scheduleExpire($user);
self::scheduleExpire($user->getUID());
}
}
/**
* clean up the trash bin
*
* @param string $user
* Clean up the trash bin
*/
public static function expire($user) {
$trashBinSize = self::getTrashbinSize($user);
$availableSpace = self::calculateFreeSpace($trashBinSize, $user);
public static function expire(Folder $trashRoot, IUser $user): void {
$trashBinSize = $trashRoot->getSize();
$availableSpace = self::calculateFreeSpace($trashRoot->getParent(), $trashBinSize, $user);
$dirContent = Helper::getTrashFiles('/', $user, 'mtime');
$dirContent = Helper::getTrashFiles('/', $user->getUID(), 'mtime');
// delete all files older then $retention_obligation
[$delSize, $count] = self::deleteExpiredFiles($dirContent, $user);
[$delSize, $count] = self::deleteExpiredFiles($dirContent, $user->getUID());
$availableSpace += $delSize;
// delete files from trash until we meet the trash bin size limit again
self::deleteFiles(array_slice($dirContent, $count), $user, $availableSpace);
self::deleteFiles(array_slice($dirContent, $count), $user->getUID(), $availableSpace);
}
/**

View File

@@ -14,6 +14,7 @@ use OCA\Files_Trashbin\BackgroundJob\ExpireTrash;
use OCA\Files_Trashbin\Expiration;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\BackgroundJob\IJobList;
use OCP\Files\IRootFolder;
use OCP\Files\ISetupManager;
use OCP\IAppConfig;
use OCP\IUserManager;
@@ -31,6 +32,7 @@ class ExpireTrashTest extends TestCase {
private ITimeFactory&MockObject $time;
private ISetupManager&MockObject $setupManager;
private ILockingProvider&MockObject $lockingProvider;
private IRootFolder&MockObject $rootFolder;
protected function setUp(): void {
parent::setUp();
@@ -42,6 +44,7 @@ class ExpireTrashTest extends TestCase {
$this->logger = $this->createMock(LoggerInterface::class);
$this->setupManager = $this->createMock(ISetupManager::class);
$this->lockingProvider = $this->createMock(ILockingProvider::class);
$this->rootFolder = $this->createMock(IRootFolder::class);
$this->time = $this->createMock(ITimeFactory::class);
$this->time->method('getTime')
@@ -68,6 +71,7 @@ class ExpireTrashTest extends TestCase {
$this->logger,
$this->setupManager,
$this->lockingProvider,
$this->rootFolder,
$this->time,
);
$job->start($this->jobList);
@@ -87,6 +91,7 @@ class ExpireTrashTest extends TestCase {
$this->logger,
$this->setupManager,
$this->lockingProvider,
$this->rootFolder,
$this->time,
);
$job->start($this->jobList);

View File

@@ -8,9 +8,12 @@ declare(strict_types=1);
*/
namespace OCA\Files_Trashbin\Tests\Command;
use OC\Files\SetupManager;
use OCA\Files_Trashbin\Command\CleanUp;
use OCP\Files\IRootFolder;
use OCP\Files\NotFoundException;
use OCP\IDBConnection;
use OCP\IUser;
use OCP\IUserManager;
use OCP\Server;
use OCP\UserInterface;
@@ -34,16 +37,22 @@ class CleanUpTest extends TestCase {
protected IDBConnection $dbConnection;
protected CleanUp $cleanup;
protected string $trashTable = 'files_trash';
protected string $user0 = 'user0';
protected IUser&MockObject $user0;
protected SetupManager&MockObject $setupManager;
protected function setUp(): void {
parent::setUp();
$this->user0 = $this->createMock(IUser::class);
$this->user0->method('getUID')->willReturn('user0');
$this->rootFolder = $this->createMock(IRootFolder::class);
$this->userManager = $this->createMock(IUserManager::class);
$this->dbConnection = Server::get(IDBConnection::class);
$this->setupManager = $this->createMock(SetupManager::class);
$this->cleanup = new CleanUp($this->rootFolder, $this->userManager, $this->dbConnection);
$this->cleanup = new CleanUp($this->rootFolder, $this->userManager, $this->dbConnection, $this->setupManager);
}
/**
@@ -74,17 +83,20 @@ class CleanUpTest extends TestCase {
$this->initTable();
$this->rootFolder
->method('nodeExists')
->with('/' . $this->user0 . '/files_trashbin')
->willReturnOnConsecutiveCalls($nodeExists, false);
->with('/' . $this->user0->getUID() . '/files_trashbin')
->willReturn(false);
if ($nodeExists) {
$this->rootFolder
->method('get')
->with('/' . $this->user0 . '/files_trashbin')
->with('/' . $this->user0->getUID() . '/files_trashbin')
->willReturn($this->rootFolder);
$this->rootFolder
->method('delete');
} else {
$this->rootFolder->expects($this->never())->method('get');
$this->rootFolder
->method('get')
->with('/' . $this->user0->getUID() . '/files_trashbin')
->willThrowException(new NotFoundException());
$this->rootFolder->expects($this->never())->method('delete');
}
self::invokePrivate($this->cleanup, 'removeDeletedFiles', [$this->user0, new NullOutput(), false]);
@@ -129,15 +141,19 @@ class CleanUpTest extends TestCase {
$userIds = ['user1', 'user2', 'user3'];
$instance = $this->getMockBuilder(CleanUp::class)
->onlyMethods(['removeDeletedFiles'])
->setConstructorArgs([$this->rootFolder, $this->userManager, $this->dbConnection])
->setConstructorArgs([$this->rootFolder, $this->userManager, $this->dbConnection, $this->setupManager])
->getMock();
$instance->expects($this->exactly(count($userIds)))
->method('removeDeletedFiles')
->willReturnCallback(function ($user) use ($userIds): void {
$this->assertTrue(in_array($user, $userIds));
->willReturnCallback(function (IUser $user) use ($userIds): void {
$this->assertTrue(in_array($user->getUID(), $userIds));
});
$this->userManager->expects($this->exactly(count($userIds)))
->method('userExists')->willReturn(true);
->method('get')->willReturnCallback(function (string $userId): IUser {
$user = $this->createMock(IUser::class);
$user->method('getUID')->willReturn($userId);
return $user;
});
$inputInterface = $this->createMock(\Symfony\Component\Console\Input\InputInterface::class);
$inputInterface->method('getArgument')
->with('user_id')
@@ -159,7 +175,7 @@ class CleanUpTest extends TestCase {
$backendUsers = ['user1', 'user2'];
$instance = $this->getMockBuilder(CleanUp::class)
->onlyMethods(['removeDeletedFiles'])
->setConstructorArgs([$this->rootFolder, $this->userManager, $this->dbConnection])
->setConstructorArgs([$this->rootFolder, $this->userManager, $this->dbConnection, $this->setupManager])
->getMock();
$backend = $this->createMock(UserInterface::class);
$backend->method('getUsers')
@@ -167,8 +183,8 @@ class CleanUpTest extends TestCase {
->willReturn($backendUsers);
$instance->expects($this->exactly(count($backendUsers)))
->method('removeDeletedFiles')
->willReturnCallback(function ($user) use ($backendUsers): void {
$this->assertTrue(in_array($user, $backendUsers));
->willReturnCallback(function (IUser $user) use ($backendUsers): void {
$this->assertTrue(in_array($user->getUID(), $backendUsers));
});
$inputInterface = $this->createMock(InputInterface::class);
$inputInterface->method('getArgument')

View File

@@ -6,6 +6,7 @@
*/
namespace OCA\Files_Trashbin\Tests\Command;
use OC\Files\SetupManager;
use OCA\Files_Trashbin\Command\ExpireTrash;
use OCA\Files_Trashbin\Expiration;
use OCA\Files_Trashbin\Helper;
@@ -16,9 +17,9 @@ use OCP\IConfig;
use OCP\IUser;
use OCP\IUserManager;
use OCP\Server;
use PHPUnit\Framework\Attributes\DataProvider;
use PHPUnit\Framework\Attributes\Group;
use PHPUnit\Framework\MockObject\MockObject;
use Psr\Log\LoggerInterface;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Test\TestCase;
@@ -38,7 +39,6 @@ class ExpireTrashTest extends TestCase {
private IUser $user;
private ITimeFactory&MockObject $timeFactory;
protected function setUp(): void {
parent::setUp();
@@ -66,7 +66,7 @@ class ExpireTrashTest extends TestCase {
parent::tearDown();
}
#[\PHPUnit\Framework\Attributes\DataProvider(methodName: 'retentionObligationProvider')]
#[DataProvider(methodName: 'retentionObligationProvider')]
public function testRetentionObligation(string $obligation, string $quota, int $elapsed, int $fileSize, bool $shouldExpire): void {
$this->config->setSystemValues(['trashbin_retention_obligation' => $obligation]);
$this->expiration->setRetentionObligation($obligation);
@@ -99,9 +99,10 @@ class ExpireTrashTest extends TestCase {
->willReturn([$userId]);
$command = new ExpireTrash(
Server::get(LoggerInterface::class),
Server::get(IUserManager::class),
$this->expiration
$this->expiration,
Server::get(SetupManager::class),
Server::get(IRootFolder::class),
);
$this->invokePrivate($command, 'execute', [$inputInterface, $outputInterface]);

View File

@@ -1,6 +1,7 @@
OC.L10N.register(
"lookup_server_connector",
{
"Lookup Server Connector" : "Konektor poslužitelja za prevođenje"
"Lookup Server Connector" : "Konektor poslužitelja za prevođenje",
"Sync public account information with the lookup server" : "Sinkroniziraj javne podatke o računu s poslužiteljem za pretraživanje"
},
"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;");

View File

@@ -1,4 +1,5 @@
{ "translations": {
"Lookup Server Connector" : "Konektor poslužitelja za prevođenje"
"Lookup Server Connector" : "Konektor poslužitelja za prevođenje",
"Sync public account information with the lookup server" : "Sinkroniziraj javne podatke o računu s poslužiteljem za pretraživanje"
},"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"
}

View File

@@ -8,10 +8,12 @@ OC.L10N.register(
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2アプリは、他のWebサービスからOAuth2互換の認証に接続し、管理者が認証の流れを設定できるようにするものです。",
"Secret key" : "シークレットキー",
"Delete" : "削除",
"An unknown error occurred." : "不明なエラーが発生しました。",
"OAuth 2.0 clients" : "OAuth 2.0クライアント",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0により {instanceName} へのアクセス要求を外部サービスに許可します。",
"Name" : "名前",
"Redirection URI" : "リダイレクトURI",
"Client identifier" : "クライアント識別子",
"Delete client" : "クライアントを削除",
"Make sure you store the secret key, it cannot be recovered." : "秘密鍵は復元できないので、必ず保管してください。",
"Add client" : "クライアントの追加",

View File

@@ -6,10 +6,12 @@
"The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2アプリは、他のWebサービスからOAuth2互換の認証に接続し、管理者が認証の流れを設定できるようにするものです。",
"Secret key" : "シークレットキー",
"Delete" : "削除",
"An unknown error occurred." : "不明なエラーが発生しました。",
"OAuth 2.0 clients" : "OAuth 2.0クライアント",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0により {instanceName} へのアクセス要求を外部サービスに許可します。",
"Name" : "名前",
"Redirection URI" : "リダイレクトURI",
"Client identifier" : "クライアント識別子",
"Delete client" : "クライアントを削除",
"Make sure you store the secret key, it cannot be recovered." : "秘密鍵は復元できないので、必ず保管してください。",
"Add client" : "クライアントの追加",

View File

@@ -34,6 +34,7 @@ OC.L10N.register(
"Settings" : "Nastavení",
"Could not remove app." : "Aplikaci se nedaří odebrat.",
"Could not update app." : "Aplikaci se nedaří aktualizovat.",
"One time login" : "Jednorázové přihlášení",
"QR Code login" : "Přihlášení QR kódem",
"Wrong password" : "Nesprávné heslo",
"Unable to change personal password" : "Osobní heslo se nedaří změnit",
@@ -816,9 +817,11 @@ OC.L10N.register(
"The following devices are configured for your account:" : "U svého účtu máte nastavená následující zařízení:",
"Your browser does not support WebAuthn." : "Vámi používaný prohlížeč nepodporuje WebAuthn.",
"Email sent successfully" : "E-mail úspěšně odeslán",
"Failed to send email" : "Odeslání e-mailu selhalo",
"Failed to save email settings" : "Selhalo uložení nastavení e-mailu",
"Failed to send email" : "Odeslání e-mailu se nezdařilo",
"Failed to save email settings" : "Uložení nastavení e-mailu se nezdařilo",
"It is important to set up this server to be able to send emails, like for password reset and notifications." : "Je důležité tento server nastavit, aby mohly být odesílány e-maily, jako jsou např. ty pro resetování hesla a s upozorněními.",
"The server configuration is read-only so the mail settings cannot be changed using the web interface." : "Nastavení serveru jsou pouze pro čtení takže nastavení pro e-mail není možné měnit pomocí webového rozhraní.",
"Mail delivery is disabled by instance config \"{config}\"." : "Doručování e-mailů je vypnuto nastavením instance „{config}“.",
"Send mode" : "Režim odesílání",
"Encryption" : "Šifrování",
"Sendmail mode" : "Režim sendmail",

View File

@@ -32,6 +32,7 @@
"Settings" : "Nastavení",
"Could not remove app." : "Aplikaci se nedaří odebrat.",
"Could not update app." : "Aplikaci se nedaří aktualizovat.",
"One time login" : "Jednorázové přihlášení",
"QR Code login" : "Přihlášení QR kódem",
"Wrong password" : "Nesprávné heslo",
"Unable to change personal password" : "Osobní heslo se nedaří změnit",
@@ -814,9 +815,11 @@
"The following devices are configured for your account:" : "U svého účtu máte nastavená následující zařízení:",
"Your browser does not support WebAuthn." : "Vámi používaný prohlížeč nepodporuje WebAuthn.",
"Email sent successfully" : "E-mail úspěšně odeslán",
"Failed to send email" : "Odeslání e-mailu selhalo",
"Failed to save email settings" : "Selhalo uložení nastavení e-mailu",
"Failed to send email" : "Odeslání e-mailu se nezdařilo",
"Failed to save email settings" : "Uložení nastavení e-mailu se nezdařilo",
"It is important to set up this server to be able to send emails, like for password reset and notifications." : "Je důležité tento server nastavit, aby mohly být odesílány e-maily, jako jsou např. ty pro resetování hesla a s upozorněními.",
"The server configuration is read-only so the mail settings cannot be changed using the web interface." : "Nastavení serveru jsou pouze pro čtení takže nastavení pro e-mail není možné měnit pomocí webového rozhraní.",
"Mail delivery is disabled by instance config \"{config}\"." : "Doručování e-mailů je vypnuto nastavením instance „{config}“.",
"Send mode" : "Režim odesílání",
"Encryption" : "Šifrování",
"Sendmail mode" : "Režim sendmail",

View File

@@ -106,6 +106,7 @@ OC.L10N.register(
"Personal info" : "Isiklik info",
"Mobile & desktop" : "Mobiil ja töölaud",
"Artificial Intelligence" : "Tehisintellekt",
"None / STARTTLS" : "Puudub / STARTTLS",
"Email server" : "E-kirjade server",
"Mail Providers" : "E-posti teenusepakkujad",
"Mail provider enables sending emails directly through the user's personal email account. At present, this functionality is limited to calendar invitations. It requires Nextcloud Mail 4.1 and an email account in Nextcloud Mail that matches the user's email address in Nextcloud." : "Lisaks järgnevale üldisele valikule on võimalik ka isikliku e-postiikonto kasutamine. Hetkel toimib see võimalus vaid Nextcloudi kalendrikutsete puhul ning eelduseks on Nextcloud Mail 4.1 või suurem ning seal seadistatud e-postikonto vastab kasutaja e-postiaadressile Nextcloudi profiilis.",
@@ -275,6 +276,8 @@ OC.L10N.register(
"Shares with guessable tokens may be accessed easily" : "Ligipääs ennustatava tunnusloaga jaosmeediale on väga lihtne",
"Limit sharing based on groups" : "Piira jagamist gruppide alusel",
"Allow sharing for everyone (default)" : "Luba jagamine kõikidele (vaikimisi)",
"Exclude some groups" : "Välista mõned grupid",
"Allow some groups" : "Luba mõned grupid",
"Groups allowed to share" : "Grupid, millel on jagamine lubatud",
"Groups excluded from sharing" : "Jagamisest välistatud grupid",
"Not allowed groups will still be able to receive shares, but not to initiate them." : "Mittelubatud gruppide liikmed saavad vastu võtta jagamisi, kuid ise jagamisi algatada ei saa.",
@@ -697,7 +700,12 @@ OC.L10N.register(
"No devices configured." : "Ühtegi seadet pole seadistatud.",
"The following devices are configured for your account:" : "Järgmised seadmed on seadistatud kasutama sinu kontot:",
"Your browser does not support WebAuthn." : "Sinu veebibrauseril puudub WebAuthni tugi.",
"Email sent successfully" : "E-kirja saatmine õnnestus",
"Failed to send email" : "E-kirja saatmine ei õnnestunud",
"Failed to save email settings" : "E-posti seadistuste salvestamine ei õnnestunud",
"It is important to set up this server to be able to send emails, like for password reset and notifications." : "On oluline, et e-kirjade saatmise võimekus on seadistatud. Seda kasutatakse näiteks salasõnade lähtestamiseks ja teavituste saatmiseks.",
"The server configuration is read-only so the mail settings cannot be changed using the web interface." : "Serveri seadistused on vaid lugemisolekus ja neid ei saa veebiliidesest muuta.",
"Mail delivery is disabled by instance config \"{config}\"." : "E-kirjade edastamine on keelatud serveri seadistuse „{config}“ alusel.",
"Send mode" : "Saatmise viis",
"Encryption" : "Krüpteerimine",
"Sendmail mode" : "Sendmaili režiim",
@@ -709,6 +717,8 @@ OC.L10N.register(
"Port" : "Port",
"Authentication" : "Autentimine",
"Authentication required" : "Autentimine on vajalik",
"Sending test email…" : "Saadan testkirja…",
"Send test email" : "Saada testkiri",
"Saving…" : "Salvestan...",
"Save settings" : "Salvesta seadistused",
"Please double check the {linkStartInstallationGuides}installation guides{linkEnd}, and check for any errors or warnings in the {linkStartLog}log{linkEnd}." : "Palun vaata uuesti {linkStartInstallationGuides}paigaldusjuhendit{linkEnd} ning kontrolli {linkStartLog}logides{linkEnd} leiduvaid vigu ja hoiatusi.",

View File

@@ -104,6 +104,7 @@
"Personal info" : "Isiklik info",
"Mobile & desktop" : "Mobiil ja töölaud",
"Artificial Intelligence" : "Tehisintellekt",
"None / STARTTLS" : "Puudub / STARTTLS",
"Email server" : "E-kirjade server",
"Mail Providers" : "E-posti teenusepakkujad",
"Mail provider enables sending emails directly through the user's personal email account. At present, this functionality is limited to calendar invitations. It requires Nextcloud Mail 4.1 and an email account in Nextcloud Mail that matches the user's email address in Nextcloud." : "Lisaks järgnevale üldisele valikule on võimalik ka isikliku e-postiikonto kasutamine. Hetkel toimib see võimalus vaid Nextcloudi kalendrikutsete puhul ning eelduseks on Nextcloud Mail 4.1 või suurem ning seal seadistatud e-postikonto vastab kasutaja e-postiaadressile Nextcloudi profiilis.",
@@ -273,6 +274,8 @@
"Shares with guessable tokens may be accessed easily" : "Ligipääs ennustatava tunnusloaga jaosmeediale on väga lihtne",
"Limit sharing based on groups" : "Piira jagamist gruppide alusel",
"Allow sharing for everyone (default)" : "Luba jagamine kõikidele (vaikimisi)",
"Exclude some groups" : "Välista mõned grupid",
"Allow some groups" : "Luba mõned grupid",
"Groups allowed to share" : "Grupid, millel on jagamine lubatud",
"Groups excluded from sharing" : "Jagamisest välistatud grupid",
"Not allowed groups will still be able to receive shares, but not to initiate them." : "Mittelubatud gruppide liikmed saavad vastu võtta jagamisi, kuid ise jagamisi algatada ei saa.",
@@ -695,7 +698,12 @@
"No devices configured." : "Ühtegi seadet pole seadistatud.",
"The following devices are configured for your account:" : "Järgmised seadmed on seadistatud kasutama sinu kontot:",
"Your browser does not support WebAuthn." : "Sinu veebibrauseril puudub WebAuthni tugi.",
"Email sent successfully" : "E-kirja saatmine õnnestus",
"Failed to send email" : "E-kirja saatmine ei õnnestunud",
"Failed to save email settings" : "E-posti seadistuste salvestamine ei õnnestunud",
"It is important to set up this server to be able to send emails, like for password reset and notifications." : "On oluline, et e-kirjade saatmise võimekus on seadistatud. Seda kasutatakse näiteks salasõnade lähtestamiseks ja teavituste saatmiseks.",
"The server configuration is read-only so the mail settings cannot be changed using the web interface." : "Serveri seadistused on vaid lugemisolekus ja neid ei saa veebiliidesest muuta.",
"Mail delivery is disabled by instance config \"{config}\"." : "E-kirjade edastamine on keelatud serveri seadistuse „{config}“ alusel.",
"Send mode" : "Saatmise viis",
"Encryption" : "Krüpteerimine",
"Sendmail mode" : "Sendmaili režiim",
@@ -707,6 +715,8 @@
"Port" : "Port",
"Authentication" : "Autentimine",
"Authentication required" : "Autentimine on vajalik",
"Sending test email…" : "Saadan testkirja…",
"Send test email" : "Saada testkiri",
"Saving…" : "Salvestan...",
"Save settings" : "Salvesta seadistused",
"Please double check the {linkStartInstallationGuides}installation guides{linkEnd}, and check for any errors or warnings in the {linkStartLog}log{linkEnd}." : "Palun vaata uuesti {linkStartInstallationGuides}paigaldusjuhendit{linkEnd} ning kontrolli {linkStartLog}logides{linkEnd} leiduvaid vigu ja hoiatusi.",

View File

@@ -34,6 +34,8 @@ OC.L10N.register(
"Settings" : "Paramètres",
"Could not remove app." : "Impossible de supprimer l'app.",
"Could not update app." : "Impossible de mettre à jour l'app.",
"One time login" : "Authentification unique",
"QR Code login" : "Connexion par QR code",
"Wrong password" : "Mot de passe incorrect",
"Unable to change personal password" : "Impossible de changer le mot de passe personnel",
"Saved" : "Sauvegardé",
@@ -794,6 +796,9 @@ OC.L10N.register(
"No devices configured." : "Aucun périphérique paramétré.",
"The following devices are configured for your account:" : "Les périphériques suivants sont paramétrés pour votre compte :",
"Your browser does not support WebAuthn." : "Votre navigateur ne prend pas en charge WebAuthn.",
"Email sent successfully" : "E-mail envoyé avec succès",
"Failed to send email" : "Échec de l'envoi de l'e-mail",
"Failed to save email settings" : "Impossible d'enregistrer les paramètres de messagerie",
"It is important to set up this server to be able to send emails, like for password reset and notifications." : "Il est important dindiquer un serveur afin de pouvoir envoyer des e-mails en cas de perte de mot de passe et pour dautres notifications.",
"Send mode" : "Mode denvoi",
"Encryption" : "Chiffrement",
@@ -806,6 +811,8 @@ OC.L10N.register(
"Port" : "Port",
"Authentication" : "Authentification",
"Authentication required" : "Authentification requise",
"Sending test email…" : "Envoi d'un e-mail test...",
"Send test email" : "Envoyer un e-mail de test",
"Saving…" : "Enregistrement…",
"Save settings" : "Enregistrer les paramètres",
"Please double check the {linkStartInstallationGuides}installation guides{linkEnd}, and check for any errors or warnings in the {linkStartLog}log{linkEnd}." : "Veuillez vérifier attentivement les {linkStartInstallationGuides} guides d'installation{linkEnd} et rechercher les éventuelles erreurs ou avertissements dans {linkStartLog}le fichier de log{linkEnd}.",

View File

@@ -32,6 +32,8 @@
"Settings" : "Paramètres",
"Could not remove app." : "Impossible de supprimer l'app.",
"Could not update app." : "Impossible de mettre à jour l'app.",
"One time login" : "Authentification unique",
"QR Code login" : "Connexion par QR code",
"Wrong password" : "Mot de passe incorrect",
"Unable to change personal password" : "Impossible de changer le mot de passe personnel",
"Saved" : "Sauvegardé",
@@ -792,6 +794,9 @@
"No devices configured." : "Aucun périphérique paramétré.",
"The following devices are configured for your account:" : "Les périphériques suivants sont paramétrés pour votre compte :",
"Your browser does not support WebAuthn." : "Votre navigateur ne prend pas en charge WebAuthn.",
"Email sent successfully" : "E-mail envoyé avec succès",
"Failed to send email" : "Échec de l'envoi de l'e-mail",
"Failed to save email settings" : "Impossible d'enregistrer les paramètres de messagerie",
"It is important to set up this server to be able to send emails, like for password reset and notifications." : "Il est important dindiquer un serveur afin de pouvoir envoyer des e-mails en cas de perte de mot de passe et pour dautres notifications.",
"Send mode" : "Mode denvoi",
"Encryption" : "Chiffrement",
@@ -804,6 +809,8 @@
"Port" : "Port",
"Authentication" : "Authentification",
"Authentication required" : "Authentification requise",
"Sending test email…" : "Envoi d'un e-mail test...",
"Send test email" : "Envoyer un e-mail de test",
"Saving…" : "Enregistrement…",
"Save settings" : "Enregistrer les paramètres",
"Please double check the {linkStartInstallationGuides}installation guides{linkEnd}, and check for any errors or warnings in the {linkStartLog}log{linkEnd}." : "Veuillez vérifier attentivement les {linkStartInstallationGuides} guides d'installation{linkEnd} et rechercher les éventuelles erreurs ou avertissements dans {linkStartLog}le fichier de log{linkEnd}.",

View File

@@ -106,6 +106,7 @@ OC.L10N.register(
"Personal info" : "Información persoal",
"Mobile & desktop" : "Móbil e escritorio",
"Artificial Intelligence" : "Intelixencia artificial",
"None / STARTTLS" : "Ningún / STARTTLS",
"Email server" : "Servidor de correo",
"Mail Providers" : "Provedores de correo",
"Mail provider enables sending emails directly through the user's personal email account. At present, this functionality is limited to calendar invitations. It requires Nextcloud Mail 4.1 and an email account in Nextcloud Mail that matches the user's email address in Nextcloud." : "O provedor de correo permite enviar correos-e directamente a través da conta de correo persoal do usuario. Actualmente, esta funcionalidade está limitada aos convites de calendario. Require Nextcloud Mail 4.1 e unha conta de correo en Nextcloud Mail que coincida co enderezo de correo electrónico do usuario en Nextcloud.",
@@ -381,6 +382,8 @@ OC.L10N.register(
"Shares with guessable tokens may be accessed easily" : "Pódese acceder doadamente ás comparticións con testemuños adiviñábeis",
"Limit sharing based on groups" : "Limitar a compartición en función dos grupos",
"Allow sharing for everyone (default)" : "Permitir compartir para todo o mundo (predeterminado)",
"Exclude some groups" : "Excluír algúns grupos",
"Allow some groups" : "Permitir algúns grupos",
"Groups allowed to share" : "Grupos permitidos para compartir",
"Groups excluded from sharing" : "Grupos excluídos da compartición",
"Not allowed groups will still be able to receive shares, but not to initiate them." : "Os grupos non permitidos aínda poderán recibir compartición, mais non inicialas.",
@@ -813,7 +816,12 @@ OC.L10N.register(
"No devices configured." : "Non hai dispositivos configurados.",
"The following devices are configured for your account:" : "Os seguintes dispositivos están configurados para a súa conta:",
"Your browser does not support WebAuthn." : "O seu navegador non é compatíbel co WebAuthn.",
"Email sent successfully" : "Correo enviado satisfactoriamente",
"Failed to send email" : "Produciuse un fallo ao enviar o correo",
"Failed to save email settings" : "Produciuse un fallo ao gardar os axustes do correo",
"It is important to set up this server to be able to send emails, like for password reset and notifications." : "É importante configurar este servidor para que poida enviar correos, por exemplo para cambios de contrasinais e notificacións.",
"The server configuration is read-only so the mail settings cannot be changed using the web interface." : "A configuración do servidor é de só lectura, polo que non é posíbel cambiar os axustes do correo empregando a interface web.",
"Mail delivery is disabled by instance config \"{config}\"." : "A entrega de correo está desactivada pola configuración da instancia «{config}».",
"Send mode" : "Modo de envío",
"Encryption" : "Cifraxe",
"Sendmail mode" : "Modo do Sendmail",
@@ -825,6 +833,8 @@ OC.L10N.register(
"Port" : "Porto",
"Authentication" : "Autenticación",
"Authentication required" : "Precísase da autenticación",
"Sending test email…" : "Enviando o correo de proba…",
"Send test email" : "Enviar correo de proba…",
"Saving…" : "Gardando…",
"Save settings" : "Gardar os axustes",
"Please double check the {linkStartInstallationGuides}installation guides{linkEnd}, and check for any errors or warnings in the {linkStartLog}log{linkEnd}." : "Volva verificar as {linkStartInstallationGuides}guías de instalación{linkEnd}, e comprobe que non haxa erros ou advertencias no {linkStartLog}rexistro{linkEnd}.",

View File

@@ -104,6 +104,7 @@
"Personal info" : "Información persoal",
"Mobile & desktop" : "Móbil e escritorio",
"Artificial Intelligence" : "Intelixencia artificial",
"None / STARTTLS" : "Ningún / STARTTLS",
"Email server" : "Servidor de correo",
"Mail Providers" : "Provedores de correo",
"Mail provider enables sending emails directly through the user's personal email account. At present, this functionality is limited to calendar invitations. It requires Nextcloud Mail 4.1 and an email account in Nextcloud Mail that matches the user's email address in Nextcloud." : "O provedor de correo permite enviar correos-e directamente a través da conta de correo persoal do usuario. Actualmente, esta funcionalidade está limitada aos convites de calendario. Require Nextcloud Mail 4.1 e unha conta de correo en Nextcloud Mail que coincida co enderezo de correo electrónico do usuario en Nextcloud.",
@@ -379,6 +380,8 @@
"Shares with guessable tokens may be accessed easily" : "Pódese acceder doadamente ás comparticións con testemuños adiviñábeis",
"Limit sharing based on groups" : "Limitar a compartición en función dos grupos",
"Allow sharing for everyone (default)" : "Permitir compartir para todo o mundo (predeterminado)",
"Exclude some groups" : "Excluír algúns grupos",
"Allow some groups" : "Permitir algúns grupos",
"Groups allowed to share" : "Grupos permitidos para compartir",
"Groups excluded from sharing" : "Grupos excluídos da compartición",
"Not allowed groups will still be able to receive shares, but not to initiate them." : "Os grupos non permitidos aínda poderán recibir compartición, mais non inicialas.",
@@ -811,7 +814,12 @@
"No devices configured." : "Non hai dispositivos configurados.",
"The following devices are configured for your account:" : "Os seguintes dispositivos están configurados para a súa conta:",
"Your browser does not support WebAuthn." : "O seu navegador non é compatíbel co WebAuthn.",
"Email sent successfully" : "Correo enviado satisfactoriamente",
"Failed to send email" : "Produciuse un fallo ao enviar o correo",
"Failed to save email settings" : "Produciuse un fallo ao gardar os axustes do correo",
"It is important to set up this server to be able to send emails, like for password reset and notifications." : "É importante configurar este servidor para que poida enviar correos, por exemplo para cambios de contrasinais e notificacións.",
"The server configuration is read-only so the mail settings cannot be changed using the web interface." : "A configuración do servidor é de só lectura, polo que non é posíbel cambiar os axustes do correo empregando a interface web.",
"Mail delivery is disabled by instance config \"{config}\"." : "A entrega de correo está desactivada pola configuración da instancia «{config}».",
"Send mode" : "Modo de envío",
"Encryption" : "Cifraxe",
"Sendmail mode" : "Modo do Sendmail",
@@ -823,6 +831,8 @@
"Port" : "Porto",
"Authentication" : "Autenticación",
"Authentication required" : "Precísase da autenticación",
"Sending test email…" : "Enviando o correo de proba…",
"Send test email" : "Enviar correo de proba…",
"Saving…" : "Gardando…",
"Save settings" : "Gardar os axustes",
"Please double check the {linkStartInstallationGuides}installation guides{linkEnd}, and check for any errors or warnings in the {linkStartLog}log{linkEnd}." : "Volva verificar as {linkStartInstallationGuides}guías de instalación{linkEnd}, e comprobe que non haxa erros ou advertencias no {linkStartLog}rexistro{linkEnd}.",

View File

@@ -256,6 +256,7 @@ OC.L10N.register(
"Other languages" : "Drugi jezici",
"Password change is disabled because the master key is disabled" : "Onemogućeno je mijenjanje zaporke jer je onemogućen glavni ključ",
"New account" : "Novi račun",
"Display name" : "Ime za prikaz",
"Email" : "E-pošta",
"Quota" : "Kvota",
"Language" : "Jezik",
@@ -277,6 +278,7 @@ OC.L10N.register(
"Welcome mail sent!" : "Poslana poruka dobrodošlice!",
"Done" : "Gotovo",
"Edit" : "Uredi",
"Visibility" : "Vidljivost",
"Show storage path" : "Prikaži put pohrane",
"Show last login" : "Prikaži posljednju prijavu",
"Sorting" : "Razvrstavanje",
@@ -307,6 +309,7 @@ OC.L10N.register(
"Authentication required" : "Potrebna autentifikacija",
"Saving…" : "Spremanje...",
"Security & setup warnings" : "Upozorenja o sigurnosti i postavljanju",
"Try again" : "Pokušajte ponovno",
"All checks passed." : "Sve su provjere uspješno dovršene.",
"There are some errors regarding your setup." : "Postoje neke pogreške u vezi s vašim postavom.",
"There are some warnings regarding your setup." : "Postoje neka upozorenja u vezi s vašim postavom.",
@@ -322,7 +325,10 @@ OC.L10N.register(
"Headline" : "Naslov",
"Organisation" : "Organizacija",
"Phone number" : "Broj telefona",
"Pronouns" : "Zamjenice",
"Role" : "Uloga",
"X (formerly Twitter)" : "X (prije Twitter)",
"Bluesky" : "Bluesky",
"Website" : "Web-mjesto",
"Profile visibility" : "Vidljivost profila",
"Locale" : "Lokacija",

View File

@@ -254,6 +254,7 @@
"Other languages" : "Drugi jezici",
"Password change is disabled because the master key is disabled" : "Onemogućeno je mijenjanje zaporke jer je onemogućen glavni ključ",
"New account" : "Novi račun",
"Display name" : "Ime za prikaz",
"Email" : "E-pošta",
"Quota" : "Kvota",
"Language" : "Jezik",
@@ -275,6 +276,7 @@
"Welcome mail sent!" : "Poslana poruka dobrodošlice!",
"Done" : "Gotovo",
"Edit" : "Uredi",
"Visibility" : "Vidljivost",
"Show storage path" : "Prikaži put pohrane",
"Show last login" : "Prikaži posljednju prijavu",
"Sorting" : "Razvrstavanje",
@@ -305,6 +307,7 @@
"Authentication required" : "Potrebna autentifikacija",
"Saving…" : "Spremanje...",
"Security & setup warnings" : "Upozorenja o sigurnosti i postavljanju",
"Try again" : "Pokušajte ponovno",
"All checks passed." : "Sve su provjere uspješno dovršene.",
"There are some errors regarding your setup." : "Postoje neke pogreške u vezi s vašim postavom.",
"There are some warnings regarding your setup." : "Postoje neka upozorenja u vezi s vašim postavom.",
@@ -320,7 +323,10 @@
"Headline" : "Naslov",
"Organisation" : "Organizacija",
"Phone number" : "Broj telefona",
"Pronouns" : "Zamjenice",
"Role" : "Uloga",
"X (formerly Twitter)" : "X (prije Twitter)",
"Bluesky" : "Bluesky",
"Website" : "Web-mjesto",
"Profile visibility" : "Vidljivost profila",
"Locale" : "Lokacija",

View File

@@ -69,6 +69,7 @@ class AppSettingsController extends Controller {
private CategoryFetcher $categoryFetcher,
private AppFetcher $appFetcher,
private IFactory $l10nFactory,
private IGroupManager $groupManager,
private BundleFetcher $bundleFetcher,
private Installer $installer,
private IURLGenerator $urlGenerator,
@@ -94,6 +95,13 @@ class AppSettingsController extends Controller {
$this->initialState->provideInitialState('appstoreBundles', $this->getBundles());
$this->initialState->provideInitialState('appstoreUpdateCount', count($this->getAppsWithUpdates()));
$groups = array_map(static fn (IGroup $group): array => [
'id' => $group->getGID(),
'name' => $group->getDisplayName(),
], $this->groupManager->search('', 5));
$this->initialState->provideInitialState('usersSettings', [ 'systemGroups' => $groups]);
if ($this->appManager->isEnabledForAnyone('app_api')) {
try {
Server::get(ExAppsPageService::class)->provideAppApiState($this->initialState);

View File

@@ -21,6 +21,8 @@ use OCP\AppFramework\Services\IInitialState;
use OCP\Files\AppData\IAppDataFactory;
use OCP\Http\Client\IClientService;
use OCP\IConfig;
use OCP\IGroup;
use OCP\IGroupManager;
use OCP\IL10N;
use OCP\INavigationManager;
use OCP\IRequest;
@@ -45,6 +47,7 @@ class AppSettingsControllerTest extends TestCase {
private CategoryFetcher&MockObject $categoryFetcher;
private AppFetcher&MockObject $appFetcher;
private IFactory&MockObject $l10nFactory;
private IGroupManager&MockObject $groupManager;
private BundleFetcher&MockObject $bundleFetcher;
private Installer&MockObject $installer;
private IURLGenerator&MockObject $urlGenerator;
@@ -70,6 +73,7 @@ class AppSettingsControllerTest extends TestCase {
$this->categoryFetcher = $this->createMock(CategoryFetcher::class);
$this->appFetcher = $this->createMock(AppFetcher::class);
$this->l10nFactory = $this->createMock(IFactory::class);
$this->groupManager = $this->createMock(IGroupManager::class);
$this->bundleFetcher = $this->createMock(BundleFetcher::class);
$this->installer = $this->createMock(Installer::class);
$this->urlGenerator = $this->createMock(IURLGenerator::class);
@@ -89,6 +93,7 @@ class AppSettingsControllerTest extends TestCase {
$this->categoryFetcher,
$this->appFetcher,
$this->l10nFactory,
$this->groupManager,
$this->bundleFetcher,
$this->installer,
$this->urlGenerator,
@@ -168,9 +173,16 @@ class AppSettingsControllerTest extends TestCase {
->expects($this->once())
->method('setActiveEntry')
->with('core_apps');
$this->groupManager->expects($this->once())
->method('search')
->with($this->equalTo(''), $this->equalTo(5))
->willReturn([
$this->createMock(IGroup::class),
$this->createMock(IGroup::class),
]);
$this->initialState
->expects($this->exactly(3))
->expects($this->exactly(4))
->method('provideInitialState');
$policy = new ContentSecurityPolicy();
@@ -201,9 +213,16 @@ class AppSettingsControllerTest extends TestCase {
->expects($this->once())
->method('setActiveEntry')
->with('core_apps');
$this->groupManager->expects($this->once())
->method('search')
->with($this->equalTo(''), $this->equalTo(5))
->willReturn([
$this->createMock(IGroup::class),
$this->createMock(IGroup::class),
]);
$this->initialState
->expects($this->exactly(3))
->expects($this->exactly(4))
->method('provideInitialState');
$policy = new ContentSecurityPolicy();

View File

@@ -14,11 +14,17 @@ OC.L10N.register(
"Password to access {file} was sent to {email}" : "Zaporka za pristupanje {file} poslana je {email}",
"Password to access {file} was sent to you" : "Poslana vam je zaporka za pristupanje {file}",
"Share by mail" : "Dijelite poštom",
"Sharing %1$s failed, because this item is already shared with the account %2$s" : "Dijeljenje %1$s nije uspjelo jer je ova stavka već podijeljena s računom%2$s",
"We cannot send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Ne možemo vam poslati automatski generiranu zaporku. U osobnim postavkama postavite valjanu adresu e-pošte i pokušajte ponovo.",
"Failed to send share by email" : "Slanje dijeljenja putem e-pošte nije uspjelo",
"%1$s shared %2$s with you" : "%1$s dijeli %2$s s vama",
"Note:" : "Napomena:",
"Open %s" : "Otvori %s",
"%1$s via %2$s" : "%1$s putem %2$s",
"It is protected with the following password:" : "Zaštićeno je sljedećom zaporkom:",
"%1$s shared %2$s with you and wants to add:" : "%1$s dijeli »%2$s« s vama i želi dodati:",
"%1$s shared %2$s with you and wants to add" : "%1$s dijeli »%2$s« s vama i želi dodati",
"%s added a note to a file shared with you" : "%s je dodao bilješku datoteci koju dijeli s vama",
"This is the password:" : "Ovo je zaporka:",
"You can choose a different password at any time in the share dialog." : "U dijaloškom okviru za dijeljenje možete u bilo kojem trenutku odabrati drugu zaporku.",
"Could not find share" : "Nije moguće pronaći dijeljenje",

View File

@@ -12,11 +12,17 @@
"Password to access {file} was sent to {email}" : "Zaporka za pristupanje {file} poslana je {email}",
"Password to access {file} was sent to you" : "Poslana vam je zaporka za pristupanje {file}",
"Share by mail" : "Dijelite poštom",
"Sharing %1$s failed, because this item is already shared with the account %2$s" : "Dijeljenje %1$s nije uspjelo jer je ova stavka već podijeljena s računom%2$s",
"We cannot send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "Ne možemo vam poslati automatski generiranu zaporku. U osobnim postavkama postavite valjanu adresu e-pošte i pokušajte ponovo.",
"Failed to send share by email" : "Slanje dijeljenja putem e-pošte nije uspjelo",
"%1$s shared %2$s with you" : "%1$s dijeli %2$s s vama",
"Note:" : "Napomena:",
"Open %s" : "Otvori %s",
"%1$s via %2$s" : "%1$s putem %2$s",
"It is protected with the following password:" : "Zaštićeno je sljedećom zaporkom:",
"%1$s shared %2$s with you and wants to add:" : "%1$s dijeli »%2$s« s vama i želi dodati:",
"%1$s shared %2$s with you and wants to add" : "%1$s dijeli »%2$s« s vama i želi dodati",
"%s added a note to a file shared with you" : "%s je dodao bilješku datoteci koju dijeli s vama",
"This is the password:" : "Ovo je zaporka:",
"You can choose a different password at any time in the share dialog." : "U dijaloškom okviru za dijeljenje možete u bilo kojem trenutku odabrati drugu zaporku.",
"Could not find share" : "Nije moguće pronaći dijeljenje",

View File

@@ -56,6 +56,7 @@ OC.L10N.register(
"Failed to delete tag" : "Błąd usuwania etykiety",
"Create or edit tags" : "Utwórz lub edytuj etykietę:",
"Search for a tag to edit" : "Wyszukaj etykietę do edycji",
"Collaborative tags …" : "Tagi współdzielone …",
"No tags to select" : "Brak etykiet do zaznaczenia",
"Tag name" : "Nazwa etykiety",
"Tag level" : "Poziom etykiety",
@@ -86,6 +87,7 @@ OC.L10N.register(
"Failed to load tags" : "Nie udało się załadować etykiet",
"Failed to select tag" : "Nie udało się wybrać tagu",
"System admin disabled tag creation. You can only use existing ones." : "Administrator systemu wyłączył tworzenie tagów. Można używać tylko istniejących tagów.",
"Loading collaborative tags …" : "Wczytywanie tagów współdzielonych …",
"Search or create collaborative tags" : "Wyszukaj lub utwórz wspólne tagi",
"No tags to select, type to create a new tag" : "Brak tagów do wyboru, wpisz, aby utworzyć nowy tag",
"Unable to update setting" : "Nie udało się zaktualizować ustawienia",

View File

@@ -54,6 +54,7 @@
"Failed to delete tag" : "Błąd usuwania etykiety",
"Create or edit tags" : "Utwórz lub edytuj etykietę:",
"Search for a tag to edit" : "Wyszukaj etykietę do edycji",
"Collaborative tags …" : "Tagi współdzielone …",
"No tags to select" : "Brak etykiet do zaznaczenia",
"Tag name" : "Nazwa etykiety",
"Tag level" : "Poziom etykiety",
@@ -84,6 +85,7 @@
"Failed to load tags" : "Nie udało się załadować etykiet",
"Failed to select tag" : "Nie udało się wybrać tagu",
"System admin disabled tag creation. You can only use existing ones." : "Administrator systemu wyłączył tworzenie tagów. Można używać tylko istniejących tagów.",
"Loading collaborative tags …" : "Wczytywanie tagów współdzielonych …",
"Search or create collaborative tags" : "Wyszukaj lub utwórz wspólne tagi",
"No tags to select, type to create a new tag" : "Brak tagów do wyboru, wpisz, aby utworzyć nowy tag",
"Unable to update setting" : "Nie udało się zaktualizować ustawienia",

View File

@@ -12,11 +12,13 @@ OC.L10N.register(
"An error occurred while generating your backup codes" : "Wystąpił błąd podczas generowania kodów zapasowych.",
"Backup codes have been generated. {used} of {total} codes have been used." : "Wygenerowano kody zapasowe. Użyto {used} z {total} kodów.",
"These are your backup codes. Please save and/or print them as you will not be able to read the codes again later." : "To są kody zapasowe. Zapisz je i/lub wydrukuj, ponieważ nie będziesz mógł ich później odczytać.",
"List of backup codes" : "Lista kodów zapasowych",
"Regenerate backup codes" : "Ponownie generuj kody zapasowe",
"Print backup codes" : "Drukuj kody zapasowe",
"Save backup codes" : "Zapisz kody zapasowe",
"If you regenerate backup codes, you automatically invalidate old codes." : "Jeśli generujesz kody zapasowe ponownie, automatycznie unieważniasz stare kody.",
"{name} backup codes" : "Kody kopii zapasowej {name}",
"Unable to open a new tab for printing" : "Nie można otworzyć nowej zakładki dla wydruku",
"Use one of the backup codes you saved when setting up two-factor authentication." : "Użyj jednego z kodów zapasowych zapisanych podczas konfigurowania uwierzytelniania dwuskładnikowego.",
"Submit" : "Wyślij"
},

View File

@@ -10,11 +10,13 @@
"An error occurred while generating your backup codes" : "Wystąpił błąd podczas generowania kodów zapasowych.",
"Backup codes have been generated. {used} of {total} codes have been used." : "Wygenerowano kody zapasowe. Użyto {used} z {total} kodów.",
"These are your backup codes. Please save and/or print them as you will not be able to read the codes again later." : "To są kody zapasowe. Zapisz je i/lub wydrukuj, ponieważ nie będziesz mógł ich później odczytać.",
"List of backup codes" : "Lista kodów zapasowych",
"Regenerate backup codes" : "Ponownie generuj kody zapasowe",
"Print backup codes" : "Drukuj kody zapasowe",
"Save backup codes" : "Zapisz kody zapasowe",
"If you regenerate backup codes, you automatically invalidate old codes." : "Jeśli generujesz kody zapasowe ponownie, automatycznie unieważniasz stare kody.",
"{name} backup codes" : "Kody kopii zapasowej {name}",
"Unable to open a new tab for printing" : "Nie można otworzyć nowej zakładki dla wydruku",
"Use one of the backup codes you saved when setting up two-factor authentication." : "Użyj jednego z kodów zapasowych zapisanych podczas konfigurowania uwierzytelniania dwuskładnikowego.",
"Submit" : "Wyślij"
},"pluralForm" :"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);"

View File

@@ -3,16 +3,33 @@ OC.L10N.register(
{
"Channel updated" : "Kanal je ažuriran",
"Web updater is disabled" : "Web alat za ažuriranje je onemogućen",
"Configuration is read-only" : "Konfiguracija je samo za čitanje",
"App updated" : "Aplikacija je ažurirana",
"See what's new" : "Pogledajte novosti",
"{app} updated to version {version}" : "{app} je ažurirana na verziju {version}",
"Update notifications" : "Ažuriraj obavijesti",
"The update server could not be reached since %d days to check for new updates." : "Nije moguće doći do poslužitelja za ažuriranje već %d dana radi provjeravanja za nova ažuriranja.",
"Please check the Nextcloud and server log files for errors." : "Provjerite zapise Nextclouda i poslužitelja za moguće pogreške.",
"Update to {serverAndVersion} is available." : "Dostupno je ažuriranje na {serverAndVersion}.",
"Update for {app} to version %s is available." : "Dostupno je ažuriranje za {app} na inačicu %s.",
"Update notification" : "Ažuriraj obavijest",
"Displays update notifications for Nextcloud, app updates, and provides the SSO for the updater." : "Prikazuje obavijesti o ažuriranjima za Nextcloud i aplikacije te pruža SSO za alat za ažuriranje.",
"Give feedback" : "Pošalji povratne informacije",
"Get started" : "Započnite",
"No changelog available" : "Nema dostupnog zapisa promjena",
"What's new in {app} {version}" : "Što je novo u {app} {version}",
"A new version is available: <strong>{newVersionString}</strong>" : "Dostupna je nova inačica: <strong>{newVersionString}</strong>",
"Note that after a new release the update only shows up after the first minor release or later. We roll out new versions spread out over time and sometimes skip a version when issues are found. Learn more about updates and release channels at {link}" : "Imajte na umu da se nakon novog izdanja ažuriranje prikazuje tek nakon prvog manjeg izdanja ili kasnije. Nova izdanja uvodimo postupno tijekom vremena i ponekad preskočimo verziju kada se otkriju problemi. Saznajte više o ažuriranjima i kanalima izdanja na {link}",
"Checked on {lastCheckedDate} - Open changelog" : "Provjereno {lastCheckedDate} Otvori zapis promjena",
"Checking apps for compatible versions" : "Provjera aplikacija za kompatibilne verzije",
"Please make sure your config.php does not set <samp>appstoreenabled</samp> to false." : "Provjerite da vaš config.php nije postavio <samp>appstoreenabled</samp> na vrijednost „netočno”.",
"Could not connect to the App Store or no updates have been returned at all. Search manually for updates or make sure your server has access to the internet and can connect to the App Store." : "Neuspješno povezivanje s trgovinom aplikacijama App Store ili je vraćena obavijest da nema ažuriranja. Ručno potražite ažuriranja ili provjerite ima li vaš poslužitelj pristup internetu i može li se povezati s trgovinom aplikacijama App Store.",
"<strong>All</strong> apps have a compatible version for this {productName} version available." : "<strong>Sve</strong> aplikacije imaju dostupnu kompatibilnu verziju za ovu verziju {productName}.",
"_<strong>%n</strong> app has no compatible version for this {productName} version available._::_<strong>%n</strong> apps have no compatible version for this {productName} version available._" : ["<strong>%n</strong> aplikacija nema dostupnu kompatibilnu verziju za ovu verziju {productName}.","<strong>%n</strong> aplikacije nema dostupnu kompatibilnu verziju za ovu verziju {productName}.","<strong>%n</strong> aplikacije nema dostupnu kompatibilnu verziju za ovu verziju {productName}."],
"Enterprise" : "Enterprise",
"For enterprise use. Provides always the latest patch level, but will not update to the next major release immediately." : "Za poslovnu primjenu. Uvijek pruža najnoviju razinu zakrpa, ali se ne ažurira odmah na sljedeće glavno izdanje.",
"That update happens once {vendor} has done additional hardening and testing for large-scale and mission-critical deployments." : "To ažuriranje provodi se tek nakon što {vendor} provede dodatno učvršćivanje i testiranje za velika i kritična okruženja.",
"This channel is only available to customers and provides the {enterprise} package." : "Ovaj je kanal dostupan samo korisnicima i pruža paket {enterprise}.",
"Stable" : "Stabilna",
"The most recent stable version. It is suited for regular use and will always update to the latest major version." : "Najnovija stabilna inačica. Primjerena je za redovitu uporabu i uvijek će se ažurirati na najnoviju glavnu inačicu.",
"Beta" : "Beta",
@@ -22,19 +39,29 @@ OC.L10N.register(
"Apps missing compatible version" : "Aplikacije koje nemaju kompatibilnu inačicu",
"View in store" : "Pogledajte u trgovini",
"Apps with compatible version" : "Aplikacije koje imaju kompatibilnu inačicu",
"Please note that the web updater is not recommended with more than 100 accounts! Please use the command line updater instead!" : "Imajte na umu da se web-alat za ažuriranje ne preporučuje za više od 100 računa! Umjesto toga koristite alat za ažuriranje iz naredbenog retka!",
"Open updater" : "Otvori alat za ažuriranje",
"Download now" : "Preuzmi sada",
"Web updater is disabled. Please use the command line updater or the appropriate update mechanism for your installation method (e.g. Docker pull) to update." : "Web-alat za ažuriranje je onemogućen. Za ažuriranje koristite alat iz naredbenog retka ili odgovarajući mehanizam ažuriranja za vašu metodu instalacije (npr. Docker pull).",
"What's new?" : "Što je novog?",
"View changelog" : "Prikaži zapis promjena",
"The update check is not yet finished. Please refresh the page." : "Provjera za ažuriranja još nije završena. Osvježite stranicu.",
"Your version is up to date." : "Vaša je inačica ažurirana.",
"A non-default update server is in use to be checked for updates:" : "Koristi se poslužitelj za ažuriranje koji nije zadan:",
"Update channel" : "Kanal ažuriranja",
"Changing the update channel also affects the apps management page. E.g. after switching to the beta channel, beta app updates will be offered to you in the apps management page." : "Promjena kanala ažuriranja također utječe na stranicu za upravljanje aplikacijama. Primjerice, nakon prelaska na beta kanal, na stranici za upravljanje aplikacijama bit će vam ponuđena beta ažuriranja aplikacija.",
"Current update channel:" : "Trenutačni kanal ažuriranja:",
"You can always update to a newer version. But you can never downgrade to a more stable version." : "Uvijek možete ažurirati na noviju inačicu. Ali nikad se ne možete vratiti na stabilniju inačicu.",
"Notify members of the following groups about available updates:" : "Obavijestite članove sljedećih grupa o dostupnim ažuriranjima:",
"No groups" : "Nema grupa",
"Only notifications for app updates are available." : "Dostupne su samo obavijesti o ažuriranjima aplikacija.",
"The selected update channel makes dedicated notifications for the server obsolete." : "Odabrani kanal za ažuriranje čini namjenske obavijesti za pojedini poslužitelj zastarjelim.",
"The selected update channel does not support updates of the server." : "Odabrani kanal za ažuriranje ne podržava ažuriranja poslužitelja.",
"Changelog for app {app}" : "Zapis promjena za aplikaciju {app}",
"What's new in {app} version {version}" : "Što je novo u aplikaciji {app} verzije {version}",
"{version} is available. Get more information on how to update." : "{version} je dostupna. Saznajte više informacija o ažuriranju.",
"<strong>All</strong> apps have a compatible version for this Nextcloud version available." : "<strong>Sve</strong> aplikacije imaju dostupnu kompatibilnu verziju za ovu verziju Nextclouda.",
"_<strong>%n</strong> app has no compatible version for this Nextcloud version available._::_<strong>%n</strong> apps have no compatible version for this Nextcloud version available._" : ["<strong>%n</strong> aplikacija nema dostupnu kompatibilnu verziju za ovu verziju Nextclouda.","<strong>%n</strong> aplikacije nemaju dostupnu kompatibilnu verziju za ovu verziju Nextclouda.","<strong>%n</strong> aplikacije nemaju dostupnu kompatibilnu verziju za ovu verziju Nextclouda."],
"For enterprise use. Provides always the latest patch level, but will not update to the next major release immediately. That update happens once Nextcloud GmbH has done additional hardening and testing for large-scale and mission-critical deployments. This channel is only available to customers and provides the Nextcloud Enterprise package." : "Samo za poslovnu primjenu. Uvijek obuhvaća najnoviju razinu zakrpe, ali neće se odmah ažurirati na sljedeće veliko izdanje ili verziju. Ažuriranje se izvršava nakon dodatnih ispitivanja i provjera koje provodi Nextcloud GmbH kako bi osigurao primjereno skaliranje u kritičnim primjenama. Ovaj je kanal dostupan samo kupcima i sadrži paket Nextcloud Enterprise."
},
"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;");

View File

@@ -1,16 +1,33 @@
{ "translations": {
"Channel updated" : "Kanal je ažuriran",
"Web updater is disabled" : "Web alat za ažuriranje je onemogućen",
"Configuration is read-only" : "Konfiguracija je samo za čitanje",
"App updated" : "Aplikacija je ažurirana",
"See what's new" : "Pogledajte novosti",
"{app} updated to version {version}" : "{app} je ažurirana na verziju {version}",
"Update notifications" : "Ažuriraj obavijesti",
"The update server could not be reached since %d days to check for new updates." : "Nije moguće doći do poslužitelja za ažuriranje već %d dana radi provjeravanja za nova ažuriranja.",
"Please check the Nextcloud and server log files for errors." : "Provjerite zapise Nextclouda i poslužitelja za moguće pogreške.",
"Update to {serverAndVersion} is available." : "Dostupno je ažuriranje na {serverAndVersion}.",
"Update for {app} to version %s is available." : "Dostupno je ažuriranje za {app} na inačicu %s.",
"Update notification" : "Ažuriraj obavijest",
"Displays update notifications for Nextcloud, app updates, and provides the SSO for the updater." : "Prikazuje obavijesti o ažuriranjima za Nextcloud i aplikacije te pruža SSO za alat za ažuriranje.",
"Give feedback" : "Pošalji povratne informacije",
"Get started" : "Započnite",
"No changelog available" : "Nema dostupnog zapisa promjena",
"What's new in {app} {version}" : "Što je novo u {app} {version}",
"A new version is available: <strong>{newVersionString}</strong>" : "Dostupna je nova inačica: <strong>{newVersionString}</strong>",
"Note that after a new release the update only shows up after the first minor release or later. We roll out new versions spread out over time and sometimes skip a version when issues are found. Learn more about updates and release channels at {link}" : "Imajte na umu da se nakon novog izdanja ažuriranje prikazuje tek nakon prvog manjeg izdanja ili kasnije. Nova izdanja uvodimo postupno tijekom vremena i ponekad preskočimo verziju kada se otkriju problemi. Saznajte više o ažuriranjima i kanalima izdanja na {link}",
"Checked on {lastCheckedDate} - Open changelog" : "Provjereno {lastCheckedDate} Otvori zapis promjena",
"Checking apps for compatible versions" : "Provjera aplikacija za kompatibilne verzije",
"Please make sure your config.php does not set <samp>appstoreenabled</samp> to false." : "Provjerite da vaš config.php nije postavio <samp>appstoreenabled</samp> na vrijednost „netočno”.",
"Could not connect to the App Store or no updates have been returned at all. Search manually for updates or make sure your server has access to the internet and can connect to the App Store." : "Neuspješno povezivanje s trgovinom aplikacijama App Store ili je vraćena obavijest da nema ažuriranja. Ručno potražite ažuriranja ili provjerite ima li vaš poslužitelj pristup internetu i može li se povezati s trgovinom aplikacijama App Store.",
"<strong>All</strong> apps have a compatible version for this {productName} version available." : "<strong>Sve</strong> aplikacije imaju dostupnu kompatibilnu verziju za ovu verziju {productName}.",
"_<strong>%n</strong> app has no compatible version for this {productName} version available._::_<strong>%n</strong> apps have no compatible version for this {productName} version available._" : ["<strong>%n</strong> aplikacija nema dostupnu kompatibilnu verziju za ovu verziju {productName}.","<strong>%n</strong> aplikacije nema dostupnu kompatibilnu verziju za ovu verziju {productName}.","<strong>%n</strong> aplikacije nema dostupnu kompatibilnu verziju za ovu verziju {productName}."],
"Enterprise" : "Enterprise",
"For enterprise use. Provides always the latest patch level, but will not update to the next major release immediately." : "Za poslovnu primjenu. Uvijek pruža najnoviju razinu zakrpa, ali se ne ažurira odmah na sljedeće glavno izdanje.",
"That update happens once {vendor} has done additional hardening and testing for large-scale and mission-critical deployments." : "To ažuriranje provodi se tek nakon što {vendor} provede dodatno učvršćivanje i testiranje za velika i kritična okruženja.",
"This channel is only available to customers and provides the {enterprise} package." : "Ovaj je kanal dostupan samo korisnicima i pruža paket {enterprise}.",
"Stable" : "Stabilna",
"The most recent stable version. It is suited for regular use and will always update to the latest major version." : "Najnovija stabilna inačica. Primjerena je za redovitu uporabu i uvijek će se ažurirati na najnoviju glavnu inačicu.",
"Beta" : "Beta",
@@ -20,19 +37,29 @@
"Apps missing compatible version" : "Aplikacije koje nemaju kompatibilnu inačicu",
"View in store" : "Pogledajte u trgovini",
"Apps with compatible version" : "Aplikacije koje imaju kompatibilnu inačicu",
"Please note that the web updater is not recommended with more than 100 accounts! Please use the command line updater instead!" : "Imajte na umu da se web-alat za ažuriranje ne preporučuje za više od 100 računa! Umjesto toga koristite alat za ažuriranje iz naredbenog retka!",
"Open updater" : "Otvori alat za ažuriranje",
"Download now" : "Preuzmi sada",
"Web updater is disabled. Please use the command line updater or the appropriate update mechanism for your installation method (e.g. Docker pull) to update." : "Web-alat za ažuriranje je onemogućen. Za ažuriranje koristite alat iz naredbenog retka ili odgovarajući mehanizam ažuriranja za vašu metodu instalacije (npr. Docker pull).",
"What's new?" : "Što je novog?",
"View changelog" : "Prikaži zapis promjena",
"The update check is not yet finished. Please refresh the page." : "Provjera za ažuriranja još nije završena. Osvježite stranicu.",
"Your version is up to date." : "Vaša je inačica ažurirana.",
"A non-default update server is in use to be checked for updates:" : "Koristi se poslužitelj za ažuriranje koji nije zadan:",
"Update channel" : "Kanal ažuriranja",
"Changing the update channel also affects the apps management page. E.g. after switching to the beta channel, beta app updates will be offered to you in the apps management page." : "Promjena kanala ažuriranja također utječe na stranicu za upravljanje aplikacijama. Primjerice, nakon prelaska na beta kanal, na stranici za upravljanje aplikacijama bit će vam ponuđena beta ažuriranja aplikacija.",
"Current update channel:" : "Trenutačni kanal ažuriranja:",
"You can always update to a newer version. But you can never downgrade to a more stable version." : "Uvijek možete ažurirati na noviju inačicu. Ali nikad se ne možete vratiti na stabilniju inačicu.",
"Notify members of the following groups about available updates:" : "Obavijestite članove sljedećih grupa o dostupnim ažuriranjima:",
"No groups" : "Nema grupa",
"Only notifications for app updates are available." : "Dostupne su samo obavijesti o ažuriranjima aplikacija.",
"The selected update channel makes dedicated notifications for the server obsolete." : "Odabrani kanal za ažuriranje čini namjenske obavijesti za pojedini poslužitelj zastarjelim.",
"The selected update channel does not support updates of the server." : "Odabrani kanal za ažuriranje ne podržava ažuriranja poslužitelja.",
"Changelog for app {app}" : "Zapis promjena za aplikaciju {app}",
"What's new in {app} version {version}" : "Što je novo u aplikaciji {app} verzije {version}",
"{version} is available. Get more information on how to update." : "{version} je dostupna. Saznajte više informacija o ažuriranju.",
"<strong>All</strong> apps have a compatible version for this Nextcloud version available." : "<strong>Sve</strong> aplikacije imaju dostupnu kompatibilnu verziju za ovu verziju Nextclouda.",
"_<strong>%n</strong> app has no compatible version for this Nextcloud version available._::_<strong>%n</strong> apps have no compatible version for this Nextcloud version available._" : ["<strong>%n</strong> aplikacija nema dostupnu kompatibilnu verziju za ovu verziju Nextclouda.","<strong>%n</strong> aplikacije nemaju dostupnu kompatibilnu verziju za ovu verziju Nextclouda.","<strong>%n</strong> aplikacije nemaju dostupnu kompatibilnu verziju za ovu verziju Nextclouda."],
"For enterprise use. Provides always the latest patch level, but will not update to the next major release immediately. That update happens once Nextcloud GmbH has done additional hardening and testing for large-scale and mission-critical deployments. This channel is only available to customers and provides the Nextcloud Enterprise package." : "Samo za poslovnu primjenu. Uvijek obuhvaća najnoviju razinu zakrpe, ali neće se odmah ažurirati na sljedeće veliko izdanje ili verziju. Ažuriranje se izvršava nakon dodatnih ispitivanja i provjera koje provodi Nextcloud GmbH kako bi osigurao primjereno skaliranje u kritičnim primjenama. Ovaj je kanal dostupan samo kupcima i sadrži paket Nextcloud Enterprise."
},"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;"
}

View File

@@ -3,6 +3,7 @@ OC.L10N.register(
{
"Channel updated" : "Zaktualizowano kanał",
"Web updater is disabled" : "Aktualizator sieciowy jest wyłączony",
"Configuration is read-only" : "Konfiguracja jest tylko do odczytu",
"App updated" : "Aplikacja została zaktualizowana",
"See what's new" : "Zobacz co nowego",
"{app} updated to version {version}" : "{app} zaktualizowana do wersji {version}",

View File

@@ -1,6 +1,7 @@
{ "translations": {
"Channel updated" : "Zaktualizowano kanał",
"Web updater is disabled" : "Aktualizator sieciowy jest wyłączony",
"Configuration is read-only" : "Konfiguracja jest tylko do odczytu",
"App updated" : "Aplikacja została zaktualizowana",
"See what's new" : "Zobacz co nowego",
"{app} updated to version {version}" : "{app} zaktualizowana do wersji {version}",

Some files were not shown because too many files have changed in this diff Show More