aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/cloud_federation_api/l10n/sv.js8
-rw-r--r--apps/cloud_federation_api/l10n/sv.json6
-rw-r--r--apps/comments/l10n/sr.js2
-rw-r--r--apps/comments/l10n/sr.json2
-rw-r--r--apps/contactsinteraction/l10n/cs.js2
-rw-r--r--apps/contactsinteraction/l10n/cs.json2
-rw-r--r--apps/contactsinteraction/l10n/sr.js9
-rw-r--r--apps/contactsinteraction/l10n/sr.json7
-rw-r--r--apps/dashboard/l10n/sr.js31
-rw-r--r--apps/dashboard/l10n/sr.json29
-rw-r--r--apps/dashboard/l10n/sv.js3
-rw-r--r--apps/dashboard/l10n/sv.json3
-rw-r--r--apps/dav/l10n/sr.js84
-rw-r--r--apps/dav/l10n/sr.json84
-rw-r--r--apps/dav/l10n/sv.js14
-rw-r--r--apps/dav/l10n/sv.json14
-rw-r--r--apps/federatedfilesharing/l10n/sr.js1
-rw-r--r--apps/federatedfilesharing/l10n/sr.json1
-rw-r--r--apps/federatedfilesharing/l10n/sv.js8
-rw-r--r--apps/federatedfilesharing/l10n/sv.json8
-rw-r--r--apps/federation/l10n/cs.js4
-rw-r--r--apps/federation/l10n/cs.json4
-rw-r--r--apps/federation/l10n/sv.js1
-rw-r--r--apps/federation/l10n/sv.json1
-rw-r--r--apps/files/l10n/he.js1
-rw-r--r--apps/files/l10n/he.json1
-rw-r--r--apps/files/l10n/sr.js31
-rw-r--r--apps/files/l10n/sr.json31
-rw-r--r--apps/files_external/l10n/sv.js2
-rw-r--r--apps/files_external/l10n/sv.json2
-rw-r--r--apps/files_trashbin/l10n/cs.js10
-rw-r--r--apps/files_trashbin/l10n/cs.json10
-rw-r--r--apps/files_versions/l10n/cs.js6
-rw-r--r--apps/files_versions/l10n/cs.json6
-rw-r--r--apps/settings/l10n/sr.js1
-rw-r--r--apps/settings/l10n/sr.json1
-rw-r--r--apps/systemtags/l10n/gl.js2
-rw-r--r--apps/systemtags/l10n/gl.json2
-rw-r--r--apps/theming/l10n/he.js1
-rw-r--r--apps/theming/l10n/he.json1
-rw-r--r--apps/theming/l10n/sr.js5
-rw-r--r--apps/theming/l10n/sr.json5
-rw-r--r--build/integration/composer.lock78
-rw-r--r--core/Command/Db/Migrations/GenerateCommand.php2
-rw-r--r--core/Controller/ClientFlowLoginV2Controller.php2
-rw-r--r--core/Controller/TranslationApiController.php66
-rw-r--r--core/l10n/de.js1
-rw-r--r--core/l10n/de.json1
-rw-r--r--core/l10n/he.js1
-rw-r--r--core/l10n/he.json1
-rw-r--r--core/l10n/pt_PT.js14
-rw-r--r--core/l10n/pt_PT.json14
-rw-r--r--core/l10n/sl.js6
-rw-r--r--core/l10n/sl.json6
-rw-r--r--core/routes.php2
-rw-r--r--lib/composer/composer/autoload_classmap.php6
-rw-r--r--lib/composer/composer/autoload_static.php6
-rw-r--r--lib/l10n/he.js1
-rw-r--r--lib/l10n/he.json1
-rw-r--r--lib/l10n/pt_PT.js1
-rw-r--r--lib/l10n/pt_PT.json1
-rw-r--r--lib/l10n/sr.js1
-rw-r--r--lib/l10n/sr.json1
-rw-r--r--lib/private/AppFramework/Bootstrap/RegistrationContext.php25
-rw-r--r--lib/private/Server.php4
-rw-r--r--lib/private/SystemTag/SystemTagManager.php8
-rw-r--r--lib/private/Translation/TranslationManager.php120
-rw-r--r--lib/public/AppFramework/Bootstrap/IRegistrationContext.php11
-rw-r--r--lib/public/Translation/IDetectLanguageProvider.php39
-rw-r--r--lib/public/Translation/ITranslationManager.php60
-rw-r--r--lib/public/Translation/ITranslationProvider.php50
-rw-r--r--lib/public/Translation/LanguageTuple.php69
-rw-r--r--package-lock.json2
-rw-r--r--package.json2
-rw-r--r--tests/lib/SystemTag/SystemTagManagerTest.php13
-rw-r--r--webpack.common.js2
76 files changed, 975 insertions, 88 deletions
diff --git a/apps/cloud_federation_api/l10n/sv.js b/apps/cloud_federation_api/l10n/sv.js
new file mode 100644
index 00000000000..e0bef8449b6
--- /dev/null
+++ b/apps/cloud_federation_api/l10n/sv.js
@@ -0,0 +1,8 @@
+OC.L10N.register(
+ "cloud_federation_api",
+ {
+ "Cloud Federation API" : "Moln-federations API",
+ "Enable clouds to communicate with each other and exchange data" : "Tillåter olika moln att kommunicera med varandra samt utbyta data",
+ "The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "Moln-federations API:et tillåter olika Nextcloud-instanser att kommunicera med varandra samt utbyta data."
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/apps/cloud_federation_api/l10n/sv.json b/apps/cloud_federation_api/l10n/sv.json
new file mode 100644
index 00000000000..c2e408362f4
--- /dev/null
+++ b/apps/cloud_federation_api/l10n/sv.json
@@ -0,0 +1,6 @@
+{ "translations": {
+ "Cloud Federation API" : "Moln-federations API",
+ "Enable clouds to communicate with each other and exchange data" : "Tillåter olika moln att kommunicera med varandra samt utbyta data",
+ "The Cloud Federation API enables various Nextcloud instances to communicate with each other and to exchange data." : "Moln-federations API:et tillåter olika Nextcloud-instanser att kommunicera med varandra samt utbyta data."
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/apps/comments/l10n/sr.js b/apps/comments/l10n/sr.js
index 15883ebb3e2..5259fe7f9b7 100644
--- a/apps/comments/l10n/sr.js
+++ b/apps/comments/l10n/sr.js
@@ -9,6 +9,8 @@ OC.L10N.register(
"%1$s commented on %2$s" : "%1$s коментарисао на %2$s",
"{author} commented on {file}" : "{author} коментарисао на {file}",
"<strong>Comments</strong> for files" : "<strong>Коментари</strong> на фајлове",
+ "You were mentioned on \"{file}\", in a comment by a user that has since been deleted" : "Поменути сте за „{file}”, у коментару корисника које је од тада обрисан",
+ "{user} mentioned you in a comment on \"{file}\"" : "{user} вас је поменуо у коментару за „{file}",
"Files app plugin to add comments to files" : "Додатак апликацији за фајлове да додајете коментаре на фајлове",
"Edit comment" : "Измени коментар",
"Delete comment" : "Обриши коментар",
diff --git a/apps/comments/l10n/sr.json b/apps/comments/l10n/sr.json
index 25d53fd513a..234aaad6a49 100644
--- a/apps/comments/l10n/sr.json
+++ b/apps/comments/l10n/sr.json
@@ -7,6 +7,8 @@
"%1$s commented on %2$s" : "%1$s коментарисао на %2$s",
"{author} commented on {file}" : "{author} коментарисао на {file}",
"<strong>Comments</strong> for files" : "<strong>Коментари</strong> на фајлове",
+ "You were mentioned on \"{file}\", in a comment by a user that has since been deleted" : "Поменути сте за „{file}”, у коментару корисника које је од тада обрисан",
+ "{user} mentioned you in a comment on \"{file}\"" : "{user} вас је поменуо у коментару за „{file}",
"Files app plugin to add comments to files" : "Додатак апликацији за фајлове да додајете коментаре на фајлове",
"Edit comment" : "Измени коментар",
"Delete comment" : "Обриши коментар",
diff --git a/apps/contactsinteraction/l10n/cs.js b/apps/contactsinteraction/l10n/cs.js
index e865b8cfe36..aa5670b02d1 100644
--- a/apps/contactsinteraction/l10n/cs.js
+++ b/apps/contactsinteraction/l10n/cs.js
@@ -2,7 +2,7 @@ OC.L10N.register(
"contactsinteraction",
{
"Recently contacted" : "Nedávno kontaktovaní",
- "Contacts Interaction" : "Napojení na Kontakty",
+ "Contacts Interaction" : "Interakce s kontakty",
"Manages interaction between users and contacts" : "Spravuje interakci mezi uživateli a kontakty",
"Collect data about user and contacts interactions and provide an address book for the data" : "Shromažďuje data o interakcích mezi uživatelem a kontakty a poskytuje pro tato data adresář kontaktů"
},
diff --git a/apps/contactsinteraction/l10n/cs.json b/apps/contactsinteraction/l10n/cs.json
index d690a444677..84be15748c9 100644
--- a/apps/contactsinteraction/l10n/cs.json
+++ b/apps/contactsinteraction/l10n/cs.json
@@ -1,6 +1,6 @@
{ "translations": {
"Recently contacted" : "Nedávno kontaktovaní",
- "Contacts Interaction" : "Napojení na Kontakty",
+ "Contacts Interaction" : "Interakce s kontakty",
"Manages interaction between users and contacts" : "Spravuje interakci mezi uživateli a kontakty",
"Collect data about user and contacts interactions and provide an address book for the data" : "Shromažďuje data o interakcích mezi uživatelem a kontakty a poskytuje pro tato data adresář kontaktů"
},"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;"
diff --git a/apps/contactsinteraction/l10n/sr.js b/apps/contactsinteraction/l10n/sr.js
new file mode 100644
index 00000000000..41112b6d537
--- /dev/null
+++ b/apps/contactsinteraction/l10n/sr.js
@@ -0,0 +1,9 @@
+OC.L10N.register(
+ "contactsinteraction",
+ {
+ "Recently contacted" : "Недавно контактирани",
+ "Contacts Interaction" : "Интеракција контаката",
+ "Manages interaction between users and contacts" : "Управља интеракцијом између корисника и контаката",
+ "Collect data about user and contacts interactions and provide an address book for the data" : "Прикупља податке о интеракцији корисника и контаката и обезбеђује адресар за податке"
+},
+"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/contactsinteraction/l10n/sr.json b/apps/contactsinteraction/l10n/sr.json
new file mode 100644
index 00000000000..06ef072b40b
--- /dev/null
+++ b/apps/contactsinteraction/l10n/sr.json
@@ -0,0 +1,7 @@
+{ "translations": {
+ "Recently contacted" : "Недавно контактирани",
+ "Contacts Interaction" : "Интеракција контаката",
+ "Manages interaction between users and contacts" : "Управља интеракцијом између корисника и контаката",
+ "Collect data about user and contacts interactions and provide an address book for the data" : "Прикупља податке о интеракцији корисника и контаката и обезбеђује адресар за податке"
+},"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);"
+} \ No newline at end of file
diff --git a/apps/dashboard/l10n/sr.js b/apps/dashboard/l10n/sr.js
new file mode 100644
index 00000000000..bdadf698bf0
--- /dev/null
+++ b/apps/dashboard/l10n/sr.js
@@ -0,0 +1,31 @@
+OC.L10N.register(
+ "dashboard",
+ {
+ "Dashboard" : "Контролна табла",
+ "Dashboard app" : "Апликација контролне табле",
+ "Start your day informed\n\nThe Nextcloud Dashboard is your starting point of the day, giving you an\noverview of your upcoming appointments, urgent emails, chat messages,\nincoming tickets, latest tweets and much more! Users can add the widgets\nthey like and change the background to their liking." : "Започните свој дан информацијама\n\nNextcloud Контролна табла је почетна тачка вашег дана, она вам даје\nпреглед наредних састанака, хитних и-мејлова, чет порука,\nпридошлих тикета, најновијих твитова и још пуно тога! Корисници\nмогу да додају виџете који им се свиђају и да по жељи измене\n позадину.",
+ "Customize" : "Прилагођавање",
+ "Edit widgets" : "Уређивање виџета",
+ "Get more widgets from the App Store" : "Преузмите још виџета из Продавнице апликација",
+ "Weather service" : "Метео сервис",
+ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Ради чувања ваше приватности, временске податке са метеоролошког сервиса у ваше име захтева Nextcloud сервер, тако да се метеоролошком сервису не шаљу лични подаци.",
+ "Weather data from Met.no" : "Метеоролошки подаци са Met.no",
+ "geocoding with Nominatim" : "геокодирање са Nominatim",
+ "elevation data from OpenTopoData" : "висински подаци са OpenTopoData",
+ "Weather" : "Време",
+ "Status" : "Статус",
+ "Good morning" : "Добро јутро",
+ "Good morning, {name}" : "Добро јутро, {name}",
+ "Good afternoon" : "Добар дан",
+ "Good afternoon, {name}" : "Добар дан, {name}",
+ "Good evening" : "Добро вече",
+ "Good evening, {name}" : "Добро вече, {name}",
+ "Hello" : "Здраво",
+ "Hello, {name}" : "Здраво, {name}",
+ "Change background image" : "Промените слику позадине",
+ "Pick from Files" : "Изаберите из Фајлова",
+ "Default images" : "Подразумеване слике",
+ "Plain background" : "Проста позадина",
+ "Insert from {productName}" : "Уметни из {productName}"
+},
+"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/dashboard/l10n/sr.json b/apps/dashboard/l10n/sr.json
new file mode 100644
index 00000000000..d1394eaf03d
--- /dev/null
+++ b/apps/dashboard/l10n/sr.json
@@ -0,0 +1,29 @@
+{ "translations": {
+ "Dashboard" : "Контролна табла",
+ "Dashboard app" : "Апликација контролне табле",
+ "Start your day informed\n\nThe Nextcloud Dashboard is your starting point of the day, giving you an\noverview of your upcoming appointments, urgent emails, chat messages,\nincoming tickets, latest tweets and much more! Users can add the widgets\nthey like and change the background to their liking." : "Започните свој дан информацијама\n\nNextcloud Контролна табла је почетна тачка вашег дана, она вам даје\nпреглед наредних састанака, хитних и-мејлова, чет порука,\nпридошлих тикета, најновијих твитова и још пуно тога! Корисници\nмогу да додају виџете који им се свиђају и да по жељи измене\n позадину.",
+ "Customize" : "Прилагођавање",
+ "Edit widgets" : "Уређивање виџета",
+ "Get more widgets from the App Store" : "Преузмите још виџета из Продавнице апликација",
+ "Weather service" : "Метео сервис",
+ "For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "Ради чувања ваше приватности, временске податке са метеоролошког сервиса у ваше име захтева Nextcloud сервер, тако да се метеоролошком сервису не шаљу лични подаци.",
+ "Weather data from Met.no" : "Метеоролошки подаци са Met.no",
+ "geocoding with Nominatim" : "геокодирање са Nominatim",
+ "elevation data from OpenTopoData" : "висински подаци са OpenTopoData",
+ "Weather" : "Време",
+ "Status" : "Статус",
+ "Good morning" : "Добро јутро",
+ "Good morning, {name}" : "Добро јутро, {name}",
+ "Good afternoon" : "Добар дан",
+ "Good afternoon, {name}" : "Добар дан, {name}",
+ "Good evening" : "Добро вече",
+ "Good evening, {name}" : "Добро вече, {name}",
+ "Hello" : "Здраво",
+ "Hello, {name}" : "Здраво, {name}",
+ "Change background image" : "Промените слику позадине",
+ "Pick from Files" : "Изаберите из Фајлова",
+ "Default images" : "Подразумеване слике",
+ "Plain background" : "Проста позадина",
+ "Insert from {productName}" : "Уметни из {productName}"
+},"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);"
+} \ No newline at end of file
diff --git a/apps/dashboard/l10n/sv.js b/apps/dashboard/l10n/sv.js
index 7c91826ddab..36f71e76a22 100644
--- a/apps/dashboard/l10n/sv.js
+++ b/apps/dashboard/l10n/sv.js
@@ -3,8 +3,9 @@ OC.L10N.register(
{
"Dashboard" : "Dashboard",
"Dashboard app" : "Dashboard app",
+ "Start your day informed\n\nThe Nextcloud Dashboard is your starting point of the day, giving you an\noverview of your upcoming appointments, urgent emails, chat messages,\nincoming tickets, latest tweets and much more! Users can add the widgets\nthey like and change the background to their liking." : "Påbörja din dag informerad\n\nNextcloud Dashboard är din startpunkt på dagen som ger dig en\növerblick av dina kommande bokningar, brådskande e-post och chattmeddelanden,\ninkommande ärenden, senaste tweets och mycket mer! Användare kan lägga till widgetar\nde gillar och anpassa bakgrunden efter deras tycke.",
"Customize" : "Anpassa",
- "Edit widgets" : "Redigera gränssnittskomponenter",
+ "Edit widgets" : "Ändra widgetar",
"Get more widgets from the App Store" : "Hämta fler widgetar från Appstore",
"Weather service" : "Vädertjänst",
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "För din integritet skull hämtas väderdata av din Nextcloud-server på dina vägnar så att vädertjänsten inte får någon personlig information.",
diff --git a/apps/dashboard/l10n/sv.json b/apps/dashboard/l10n/sv.json
index cb28ed73b87..52078a10823 100644
--- a/apps/dashboard/l10n/sv.json
+++ b/apps/dashboard/l10n/sv.json
@@ -1,8 +1,9 @@
{ "translations": {
"Dashboard" : "Dashboard",
"Dashboard app" : "Dashboard app",
+ "Start your day informed\n\nThe Nextcloud Dashboard is your starting point of the day, giving you an\noverview of your upcoming appointments, urgent emails, chat messages,\nincoming tickets, latest tweets and much more! Users can add the widgets\nthey like and change the background to their liking." : "Påbörja din dag informerad\n\nNextcloud Dashboard är din startpunkt på dagen som ger dig en\növerblick av dina kommande bokningar, brådskande e-post och chattmeddelanden,\ninkommande ärenden, senaste tweets och mycket mer! Användare kan lägga till widgetar\nde gillar och anpassa bakgrunden efter deras tycke.",
"Customize" : "Anpassa",
- "Edit widgets" : "Redigera gränssnittskomponenter",
+ "Edit widgets" : "Ändra widgetar",
"Get more widgets from the App Store" : "Hämta fler widgetar från Appstore",
"Weather service" : "Vädertjänst",
"For your privacy, the weather data is requested by your Nextcloud server on your behalf so the weather service receives no personal information." : "För din integritet skull hämtas väderdata av din Nextcloud-server på dina vägnar så att vädertjänsten inte får någon personlig information.",
diff --git a/apps/dav/l10n/sr.js b/apps/dav/l10n/sr.js
index 4cd28fe4b5b..785cbb369f3 100644
--- a/apps/dav/l10n/sr.js
+++ b/apps/dav/l10n/sr.js
@@ -2,6 +2,7 @@ OC.L10N.register(
"dav",
{
"Calendar" : "Календар",
+ "To-dos" : "Обавезе",
"Personal" : "Лично",
"{actor} created calendar {calendar}" : "{actor} направи календар {calendar}",
"You created calendar {calendar}" : "Направили сте календар {calendar}",
@@ -9,6 +10,8 @@ OC.L10N.register(
"You deleted calendar {calendar}" : "Обрисали сте календар {calendar}",
"{actor} updated calendar {calendar}" : "{actor} ажурира календар {calendar}",
"You updated calendar {calendar}" : "Ажурирали сте календар {calendar}",
+ "{actor} restored calendar {calendar}" : "{actor} је обновио календар {calendar}",
+ "You restored calendar {calendar}" : "Обновили сте календар {calendar}",
"You shared calendar {calendar} as public link" : "Поделили сте календар {calendar} као јавну везу",
"You removed public link for calendar {calendar}" : "Уклонили сте јавну везу за календар {calendar}",
"{actor} shared calendar {calendar} with you" : "{actor} подели календар {calendar} са вама",
@@ -29,9 +32,27 @@ OC.L10N.register(
"You deleted event {event} from calendar {calendar}" : "Обрисали сте догађај {event} из календара {calendar}",
"{actor} updated event {event} in calendar {calendar}" : "{actor} је ажурирао догађај {event} у календару {calendar}",
"You updated event {event} in calendar {calendar}" : "Ажурирали сте догађај {event} у календару {calendar}",
+ "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} је преместио догађај {event} из календара {sourceCalendar} у календар {targetCalendar}",
+ "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Преместили сте догађај {event} из календара {sourceCalendar} у календар {targetCalendar}",
+ "{actor} restored event {event} of calendar {calendar}" : "{actor} је обновио догађај {event} календара {calendar}",
+ "You restored event {event} of calendar {calendar}" : "Обновили сте догађај {event} календара {calendar}",
"Busy" : "Заузет/а",
+ "{actor} created to-do {todo} in list {calendar}" : "{actor} је креирао обавезу {todo} у листи {calendar}",
+ "You created to-do {todo} in list {calendar}" : "Креирали сте обавезу {todo} у листи {calendar}",
+ "{actor} deleted to-do {todo} from list {calendar}" : "{actor} је обрисао обавезу {todo} из листе {calendar}",
+ "You deleted to-do {todo} from list {calendar}" : "обрисали сте обавезу {todo} из листе {calendar}",
+ "{actor} updated to-do {todo} in list {calendar}" : "{actor} је ажурирао обавезу {todo} у листи {calendar}",
+ "You updated to-do {todo} in list {calendar}" : "Ажурирали сте обавезу {todo} у листи {calendar}",
+ "{actor} solved to-do {todo} in list {calendar}" : "{actor} је извршио обавезу {todo} у листи {calendar}",
+ "You solved to-do {todo} in list {calendar}" : "Извршили сте обавезу {todo} у листи {calendar}",
+ "{actor} reopened to-do {todo} in list {calendar}" : "{actor} је поново отворио обавезу {todo} у листи {calendar}",
+ "You reopened to-do {todo} in list {calendar}" : "Поново сте отворили обавезу {todo} у листи {calendar}",
+ "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} је преместио обавезу {todo} из листе {sourceCalendar} у листу {targetCalendar}",
+ "You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Преместили сте обавезу {todo} из листе {sourceCalendar} у листу {targetCalendar}",
+ "Calendar, contacts and tasks" : "Календар, контакти и задаци",
"A <strong>calendar</strong> was modified" : "<strong>Календар</strong> је измењен",
"A calendar <strong>event</strong> was modified" : "<strong>Догађај</strong> из календара је измењен",
+ "A calendar <strong>to-do</strong> was modified" : "Календар <strong>обавеза</strong> је измењен",
"Contact birthdays" : "Рођендани контаката",
"Death of %s" : " %s смрт",
"Calendar:" : "Календар:",
@@ -50,6 +71,12 @@ OC.L10N.register(
"Description: %s" : "Опис: %s",
"Where: %s" : "Место: %s",
"%1$s via %2$s" : "%1$s преко %2$s",
+ "Cancelled: %1$s" : "Отказано: %1$s",
+ "\"%1$s\" has been canceled" : "„%1$s” је отказано",
+ "Re: %1$s" : "Одг: %1$s",
+ "%1$s has responded to your invitation" : "%1$s је одговорио на вашу позивницу",
+ "Invitation: %1$s" : "Позивница: %1$s",
+ "%1$s would like to invite you to \"%2$s\"" : "%1$s жели да вас позове на „%2$s",
"Organizer:" : "Организатор:",
"Attendees:" : "Присутни:",
"Title:" : "Наслов:",
@@ -61,6 +88,48 @@ OC.L10N.register(
"More options …" : "Још опција…",
"More options at %s" : "Још опција на %s",
"Contacts" : "Контакти",
+ "{actor} created address book {addressbook}" : "{actor} је креирао адресар {addressbook}",
+ "You created address book {addressbook}" : "Креирали сте адресар {addressbook}",
+ "{actor} deleted address book {addressbook}" : "{actor} је обрисао адресар {addressbook}",
+ "You deleted address book {addressbook}" : "Обрисали сте адресар {addressbook}",
+ "{actor} updated address book {addressbook}" : "{actor} је ажурирао адресар {addressbook}",
+ "You updated address book {addressbook}" : "Ажурирали сте адресар {addressbook}",
+ "{actor} shared address book {addressbook} with you" : "{actor} је са вама поделио адресар {addressbook}",
+ "You shared address book {addressbook} with {user}" : "Поделили сте адресар {addressbook} са {user}",
+ "{actor} shared address book {addressbook} with {user}" : "{actor} је поделио адресар {addressbook} са {user}",
+ "{actor} unshared address book {addressbook} from you" : "{actor} је уклонио дељење адресара {addressbook} са вама",
+ "You unshared address book {addressbook} from {user}" : "Уклонили сте дељење адресара {addressbook} са {user}",
+ "{actor} unshared address book {addressbook} from {user}" : "{actor} је уклонио дељење адресара {addressbook} са {user}",
+ "{actor} unshared address book {addressbook} from themselves" : "{actor} више не дели адресар {addressbook} са собом",
+ "You shared address book {addressbook} with group {group}" : "Поделили сте адресар {addressbook} са групом {group}",
+ "{actor} shared address book {addressbook} with group {group}" : "{actor} је поделио адресар {addressbook} са групом {group}",
+ "You unshared address book {addressbook} from group {group}" : "Уклонили сте дељење адресара {addressbook} са групом {group}",
+ "{actor} unshared address book {addressbook} from group {group}" : "{actor} је уклонио дељење адресара {addressbook} са групом {group}",
+ "{actor} created contact {card} in address book {addressbook}" : "{actor} је креирао контакт {card} у адресару {addressbook}",
+ "You created contact {card} in address book {addressbook}" : "Креирали сте контакт {card} у адресару {addressbook}",
+ "{actor} deleted contact {card} from address book {addressbook}" : "{actor} је обрисао контакт {card} из адресара {addressbook}",
+ "You deleted contact {card} from address book {addressbook}" : "Обрисали сте контакт {card} из адресара {addressbook}",
+ "{actor} updated contact {card} in address book {addressbook}" : "{actor} је ажурирао контакт {card} у адресару {addressbook}",
+ "You updated contact {card} in address book {addressbook}" : "Ажурирали сте контакт {card} у адресару {addressbook}",
+ "A <strong>contact</strong> or <strong>address book</strong> was modified" : "Измењен је <strong>контакт</strong> или <strong>адресар</strong>",
+ "File is not updatable: %1$s" : "Фајл не може да се ажурира: %1$s",
+ "Could not write to final file, canceled by hook" : "Не може да се упише у крајњи фајл, отказала је кука",
+ "Could not write file contents" : "Не може да се упише садржај фајла",
+ "_%n byte_::_%n bytes_" : ["%n бајт","%n бајта","%n бајтова"],
+ "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Грешка приликом копирања фајла на циљну локацију (копирано: %1$s, очекивана величина фајла: %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." : "Очекивала се величина фајла %1$s, али је (од Nextcloud клијента) прочитано и уписано (у Nextcloud складиште) %2$s. Или може бити мрежни проблем на страни која шаље, или проблем код уписа у складиште на серверу.",
+ "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" : "Фајл не може да се отвори",
+ "Encryption not ready: %1$s" : "Шифрирање није спремно: %1$s",
+ "Failed to open file: %1$s" : "Фајл не може да се отвори: %1$s",
+ "Failed to unlink: %1$s" : "Није успело уклањање линка: %1$s",
+ "Invalid chunk name" : "Неисправни назив комада",
+ "Could not rename part file assembled from chunks" : "Име делимичног фајла састављеног од комада не може да се промени",
+ "Failed to write file contents: %1$s" : "Није успело уписивање садржаја фајла: %1$s",
+ "File not found: %1$s" : "Фајл не може да се пронађе: %1$s",
+ "System is in maintenance mode." : "Систем је у режиму одржавања.",
"Upgrade needed" : "Потребна надградња",
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "%s мора да буде подешен да користи HTTPS да бисте користи CalDAV и CardDAV са iOS/macOS-ом.",
"Configures a CalDAV account" : "Подешава CalDAV налог",
@@ -71,9 +140,18 @@ OC.L10N.register(
"Completed on %s" : "Завршено %s",
"Due on %s by %s" : "Рок је %s од стране %s",
"Due on %s" : "Рок је %s",
+ "Migrated calendar (%1$s)" : "Мигрирани календар (%1$s)",
+ "Calendars including events, details and attendees" : "Календари који укључују догађаје, детаље и учеснике",
+ "Contacts and groups" : "Контакти и групе",
"WebDAV" : "ВебДАВ",
"WebDAV endpoint" : "WebDAV крајња тачка",
+ "Availability" : "Доступност",
+ "If you configure your working hours, other users will see when you are out of office when they book a meeting." : "Ако подесите своје радне сате, када буду заказивали састанак, остали корисници ће видети када сте ван канцеларије.",
+ "Time zone:" : "Временска зона:",
"to" : "за",
+ "Delete slot" : "Обриши прорез",
+ "No working hours set" : "Нису подешени радни сати",
+ "Add slot" : "Додај прорез",
"Monday" : "Понедељак",
"Tuesday" : "Уторак",
"Wednesday" : "Среда",
@@ -81,7 +159,11 @@ OC.L10N.register(
"Friday" : "Петак",
"Saturday" : "Субота",
"Sunday" : "Недеља",
+ "Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Аутоматски поставља статус кориниска на „Не узнемиравај” како би се ван доступности пригушила сва обавештења.",
"Save" : "Сачувај",
+ "Failed to load availability" : "Доступност није могла да се учита",
+ "Saved availability" : "Доступност је сачувана",
+ "Failed to save availability" : "Није успело снимање доступности ",
"Calendar server" : "Календар сервера",
"Send invitations to attendees" : "Пошаљи позивницу учесницима",
"Automatically generate a birthday calendar" : "Аутоматски изгенериши календар рођендана",
@@ -89,6 +171,8 @@ OC.L10N.register(
"Hence they will not be available immediately after enabling but will show up after some time." : "Зато можда неће бити видљиви баш одмах по укључивању, али ће се појавити после неког времена.",
"Send notifications for events" : "Шаљи обавештења о догађајима",
"Notifications are sent via background jobs, so these must occur often enough." : "Обавештења се шаљу кроз послове у позадини, па би требало да су постављени да се често извршавају.",
+ "Send reminder notifications to calendar sharees as well" : "Пошаљи подсетнике и корисницима којима је календар подељен",
+ "Reminders are always sent to organizers and attendees." : "Подсетници се увек шаљу организаторима и учесницима.",
"Enable notifications for events via push" : "Укључи обавештења за догађаје преко гурања догађаја",
"Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "Такође инсталирајте {calendarappstoreopen}Календар апликацију{linkclose}, или {calendardocopen}повежите Ваш рачунар & мобилни за синхронизацију ↗{linkclose}.",
"Please make sure to properly set up {emailopen}the email server{linkclose}." : "Постарајте се да правилно подесите {emailopen}сервер е-поште{linkclose}.",
diff --git a/apps/dav/l10n/sr.json b/apps/dav/l10n/sr.json
index da5759d5335..9fc2778eb24 100644
--- a/apps/dav/l10n/sr.json
+++ b/apps/dav/l10n/sr.json
@@ -1,5 +1,6 @@
{ "translations": {
"Calendar" : "Календар",
+ "To-dos" : "Обавезе",
"Personal" : "Лично",
"{actor} created calendar {calendar}" : "{actor} направи календар {calendar}",
"You created calendar {calendar}" : "Направили сте календар {calendar}",
@@ -7,6 +8,8 @@
"You deleted calendar {calendar}" : "Обрисали сте календар {calendar}",
"{actor} updated calendar {calendar}" : "{actor} ажурира календар {calendar}",
"You updated calendar {calendar}" : "Ажурирали сте календар {calendar}",
+ "{actor} restored calendar {calendar}" : "{actor} је обновио календар {calendar}",
+ "You restored calendar {calendar}" : "Обновили сте календар {calendar}",
"You shared calendar {calendar} as public link" : "Поделили сте календар {calendar} као јавну везу",
"You removed public link for calendar {calendar}" : "Уклонили сте јавну везу за календар {calendar}",
"{actor} shared calendar {calendar} with you" : "{actor} подели календар {calendar} са вама",
@@ -27,9 +30,27 @@
"You deleted event {event} from calendar {calendar}" : "Обрисали сте догађај {event} из календара {calendar}",
"{actor} updated event {event} in calendar {calendar}" : "{actor} је ажурирао догађај {event} у календару {calendar}",
"You updated event {event} in calendar {calendar}" : "Ажурирали сте догађај {event} у календару {calendar}",
+ "{actor} moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "{actor} је преместио догађај {event} из календара {sourceCalendar} у календар {targetCalendar}",
+ "You moved event {event} from calendar {sourceCalendar} to calendar {targetCalendar}" : "Преместили сте догађај {event} из календара {sourceCalendar} у календар {targetCalendar}",
+ "{actor} restored event {event} of calendar {calendar}" : "{actor} је обновио догађај {event} календара {calendar}",
+ "You restored event {event} of calendar {calendar}" : "Обновили сте догађај {event} календара {calendar}",
"Busy" : "Заузет/а",
+ "{actor} created to-do {todo} in list {calendar}" : "{actor} је креирао обавезу {todo} у листи {calendar}",
+ "You created to-do {todo} in list {calendar}" : "Креирали сте обавезу {todo} у листи {calendar}",
+ "{actor} deleted to-do {todo} from list {calendar}" : "{actor} је обрисао обавезу {todo} из листе {calendar}",
+ "You deleted to-do {todo} from list {calendar}" : "обрисали сте обавезу {todo} из листе {calendar}",
+ "{actor} updated to-do {todo} in list {calendar}" : "{actor} је ажурирао обавезу {todo} у листи {calendar}",
+ "You updated to-do {todo} in list {calendar}" : "Ажурирали сте обавезу {todo} у листи {calendar}",
+ "{actor} solved to-do {todo} in list {calendar}" : "{actor} је извршио обавезу {todo} у листи {calendar}",
+ "You solved to-do {todo} in list {calendar}" : "Извршили сте обавезу {todo} у листи {calendar}",
+ "{actor} reopened to-do {todo} in list {calendar}" : "{actor} је поново отворио обавезу {todo} у листи {calendar}",
+ "You reopened to-do {todo} in list {calendar}" : "Поново сте отворили обавезу {todo} у листи {calendar}",
+ "{actor} moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "{actor} је преместио обавезу {todo} из листе {sourceCalendar} у листу {targetCalendar}",
+ "You moved to-do {todo} from list {sourceCalendar} to list {targetCalendar}" : "Преместили сте обавезу {todo} из листе {sourceCalendar} у листу {targetCalendar}",
+ "Calendar, contacts and tasks" : "Календар, контакти и задаци",
"A <strong>calendar</strong> was modified" : "<strong>Календар</strong> је измењен",
"A calendar <strong>event</strong> was modified" : "<strong>Догађај</strong> из календара је измењен",
+ "A calendar <strong>to-do</strong> was modified" : "Календар <strong>обавеза</strong> је измењен",
"Contact birthdays" : "Рођендани контаката",
"Death of %s" : " %s смрт",
"Calendar:" : "Календар:",
@@ -48,6 +69,12 @@
"Description: %s" : "Опис: %s",
"Where: %s" : "Место: %s",
"%1$s via %2$s" : "%1$s преко %2$s",
+ "Cancelled: %1$s" : "Отказано: %1$s",
+ "\"%1$s\" has been canceled" : "„%1$s” је отказано",
+ "Re: %1$s" : "Одг: %1$s",
+ "%1$s has responded to your invitation" : "%1$s је одговорио на вашу позивницу",
+ "Invitation: %1$s" : "Позивница: %1$s",
+ "%1$s would like to invite you to \"%2$s\"" : "%1$s жели да вас позове на „%2$s",
"Organizer:" : "Организатор:",
"Attendees:" : "Присутни:",
"Title:" : "Наслов:",
@@ -59,6 +86,48 @@
"More options …" : "Још опција…",
"More options at %s" : "Још опција на %s",
"Contacts" : "Контакти",
+ "{actor} created address book {addressbook}" : "{actor} је креирао адресар {addressbook}",
+ "You created address book {addressbook}" : "Креирали сте адресар {addressbook}",
+ "{actor} deleted address book {addressbook}" : "{actor} је обрисао адресар {addressbook}",
+ "You deleted address book {addressbook}" : "Обрисали сте адресар {addressbook}",
+ "{actor} updated address book {addressbook}" : "{actor} је ажурирао адресар {addressbook}",
+ "You updated address book {addressbook}" : "Ажурирали сте адресар {addressbook}",
+ "{actor} shared address book {addressbook} with you" : "{actor} је са вама поделио адресар {addressbook}",
+ "You shared address book {addressbook} with {user}" : "Поделили сте адресар {addressbook} са {user}",
+ "{actor} shared address book {addressbook} with {user}" : "{actor} је поделио адресар {addressbook} са {user}",
+ "{actor} unshared address book {addressbook} from you" : "{actor} је уклонио дељење адресара {addressbook} са вама",
+ "You unshared address book {addressbook} from {user}" : "Уклонили сте дељење адресара {addressbook} са {user}",
+ "{actor} unshared address book {addressbook} from {user}" : "{actor} је уклонио дељење адресара {addressbook} са {user}",
+ "{actor} unshared address book {addressbook} from themselves" : "{actor} више не дели адресар {addressbook} са собом",
+ "You shared address book {addressbook} with group {group}" : "Поделили сте адресар {addressbook} са групом {group}",
+ "{actor} shared address book {addressbook} with group {group}" : "{actor} је поделио адресар {addressbook} са групом {group}",
+ "You unshared address book {addressbook} from group {group}" : "Уклонили сте дељење адресара {addressbook} са групом {group}",
+ "{actor} unshared address book {addressbook} from group {group}" : "{actor} је уклонио дељење адресара {addressbook} са групом {group}",
+ "{actor} created contact {card} in address book {addressbook}" : "{actor} је креирао контакт {card} у адресару {addressbook}",
+ "You created contact {card} in address book {addressbook}" : "Креирали сте контакт {card} у адресару {addressbook}",
+ "{actor} deleted contact {card} from address book {addressbook}" : "{actor} је обрисао контакт {card} из адресара {addressbook}",
+ "You deleted contact {card} from address book {addressbook}" : "Обрисали сте контакт {card} из адресара {addressbook}",
+ "{actor} updated contact {card} in address book {addressbook}" : "{actor} је ажурирао контакт {card} у адресару {addressbook}",
+ "You updated contact {card} in address book {addressbook}" : "Ажурирали сте контакт {card} у адресару {addressbook}",
+ "A <strong>contact</strong> or <strong>address book</strong> was modified" : "Измењен је <strong>контакт</strong> или <strong>адресар</strong>",
+ "File is not updatable: %1$s" : "Фајл не може да се ажурира: %1$s",
+ "Could not write to final file, canceled by hook" : "Не може да се упише у крајњи фајл, отказала је кука",
+ "Could not write file contents" : "Не може да се упише садржај фајла",
+ "_%n byte_::_%n bytes_" : ["%n бајт","%n бајта","%n бајтова"],
+ "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Грешка приликом копирања фајла на циљну локацију (копирано: %1$s, очекивана величина фајла: %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." : "Очекивала се величина фајла %1$s, али је (од Nextcloud клијента) прочитано и уписано (у Nextcloud складиште) %2$s. Или може бити мрежни проблем на страни која шаље, или проблем код уписа у складиште на серверу.",
+ "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" : "Фајл не може да се отвори",
+ "Encryption not ready: %1$s" : "Шифрирање није спремно: %1$s",
+ "Failed to open file: %1$s" : "Фајл не може да се отвори: %1$s",
+ "Failed to unlink: %1$s" : "Није успело уклањање линка: %1$s",
+ "Invalid chunk name" : "Неисправни назив комада",
+ "Could not rename part file assembled from chunks" : "Име делимичног фајла састављеног од комада не може да се промени",
+ "Failed to write file contents: %1$s" : "Није успело уписивање садржаја фајла: %1$s",
+ "File not found: %1$s" : "Фајл не може да се пронађе: %1$s",
+ "System is in maintenance mode." : "Систем је у режиму одржавања.",
"Upgrade needed" : "Потребна надградња",
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "%s мора да буде подешен да користи HTTPS да бисте користи CalDAV и CardDAV са iOS/macOS-ом.",
"Configures a CalDAV account" : "Подешава CalDAV налог",
@@ -69,9 +138,18 @@
"Completed on %s" : "Завршено %s",
"Due on %s by %s" : "Рок је %s од стране %s",
"Due on %s" : "Рок је %s",
+ "Migrated calendar (%1$s)" : "Мигрирани календар (%1$s)",
+ "Calendars including events, details and attendees" : "Календари који укључују догађаје, детаље и учеснике",
+ "Contacts and groups" : "Контакти и групе",
"WebDAV" : "ВебДАВ",
"WebDAV endpoint" : "WebDAV крајња тачка",
+ "Availability" : "Доступност",
+ "If you configure your working hours, other users will see when you are out of office when they book a meeting." : "Ако подесите своје радне сате, када буду заказивали састанак, остали корисници ће видети када сте ван канцеларије.",
+ "Time zone:" : "Временска зона:",
"to" : "за",
+ "Delete slot" : "Обриши прорез",
+ "No working hours set" : "Нису подешени радни сати",
+ "Add slot" : "Додај прорез",
"Monday" : "Понедељак",
"Tuesday" : "Уторак",
"Wednesday" : "Среда",
@@ -79,7 +157,11 @@
"Friday" : "Петак",
"Saturday" : "Субота",
"Sunday" : "Недеља",
+ "Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Аутоматски поставља статус кориниска на „Не узнемиравај” како би се ван доступности пригушила сва обавештења.",
"Save" : "Сачувај",
+ "Failed to load availability" : "Доступност није могла да се учита",
+ "Saved availability" : "Доступност је сачувана",
+ "Failed to save availability" : "Није успело снимање доступности ",
"Calendar server" : "Календар сервера",
"Send invitations to attendees" : "Пошаљи позивницу учесницима",
"Automatically generate a birthday calendar" : "Аутоматски изгенериши календар рођендана",
@@ -87,6 +169,8 @@
"Hence they will not be available immediately after enabling but will show up after some time." : "Зато можда неће бити видљиви баш одмах по укључивању, али ће се појавити после неког времена.",
"Send notifications for events" : "Шаљи обавештења о догађајима",
"Notifications are sent via background jobs, so these must occur often enough." : "Обавештења се шаљу кроз послове у позадини, па би требало да су постављени да се често извршавају.",
+ "Send reminder notifications to calendar sharees as well" : "Пошаљи подсетнике и корисницима којима је календар подељен",
+ "Reminders are always sent to organizers and attendees." : "Подсетници се увек шаљу организаторима и учесницима.",
"Enable notifications for events via push" : "Укључи обавештења за догађаје преко гурања догађаја",
"Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "Такође инсталирајте {calendarappstoreopen}Календар апликацију{linkclose}, или {calendardocopen}повежите Ваш рачунар & мобилни за синхронизацију ↗{linkclose}.",
"Please make sure to properly set up {emailopen}the email server{linkclose}." : "Постарајте се да правилно подесите {emailopen}сервер е-поште{linkclose}.",
diff --git a/apps/dav/l10n/sv.js b/apps/dav/l10n/sv.js
index a837d8cb1a8..71c4c10517e 100644
--- a/apps/dav/l10n/sv.js
+++ b/apps/dav/l10n/sv.js
@@ -72,8 +72,11 @@ OC.L10N.register(
"Where: %s" : "Var: %s",
"%1$s via %2$s" : "%1$s via %2$s",
"Cancelled: %1$s" : "Avbruten: %1$s",
+ "\"%1$s\" has been canceled" : "\"%1$s\" har avbrutits",
"Re: %1$s" : "Sv: %1$s",
+ "%1$s has responded to your invitation" : "%1$s har svarat på din inbjudan",
"Invitation: %1$s" : "Inbjudan: %1$s",
+ "%1$s would like to invite you to \"%2$s\"" : "%1$s skulle vilja bjuda in dig till \"%2$s\"",
"Organizer:" : "Arrangör:",
"Attendees:" : "Deltagare:",
"Title:" : "Titel:",
@@ -110,8 +113,12 @@ OC.L10N.register(
"You updated contact {card} in address book {addressbook}" : "Du uppdaterade kontakten {card} i adressboken {addressbook}",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "En <strong>kontakt</strong> eller <strong>adressbok</strong> ändrades",
"File is not updatable: %1$s" : "Fil kan inte uppdateras: %1$s",
+ "Could not write to final file, canceled by hook" : "Kunde ej skriva till den slutgiltiga filen, avbröts av en kopplad åtgärd",
"Could not write file contents" : "Kunde inte skriva filens innehåll",
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
+ "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Fel vid kopiering av fil till målplats (kopierade: %1$s, förväntad filstorlek: %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." : "Förväntad filstorlek på %1$s men läste (från Nextcloud-klienten) och skrev (till Nextcloud-lagringen) %2$s. Kan antingen vara ett nätverksproblem på sändnings-sidan eller problem med att skriva till lagringen på server-sidan.",
+ "Could not rename part file to final file, canceled by hook" : "Kunde inte byta namn på filfragment till slutgiltigt filnamn, avbröts av en kopplad åtgärd.",
"Could not rename part file to final file" : "Kunde inte ändra namn från temporära filen till slutliga filen",
"Failed to check file size: %1$s" : "Kunde inte kontrollera filstorleken: %1$s",
"Could not open file" : "Kunde inte öppna fil",
@@ -144,6 +151,7 @@ OC.L10N.register(
"to" : "till",
"Delete slot" : "Radera lucka",
"No working hours set" : "Inga arbetstimmar satta",
+ "Add slot" : "Lägg till lucka",
"Monday" : "Måndag",
"Tuesday" : "Tisdag",
"Wednesday" : "Onsdag",
@@ -151,7 +159,11 @@ OC.L10N.register(
"Friday" : "Fredag",
"Saturday" : "Lördag",
"Sunday" : "Söndag",
+ "Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Sätt automatiskt användarstatus till \"Stör ej\" utanför tillgängliga tider för att tysta alla notifikationer.",
"Save" : "Spara",
+ "Failed to load availability" : "Misslyckades med att ladda tidsluckor",
+ "Saved availability" : "Sparade tidslucka",
+ "Failed to save availability" : "Misslyckades med att spara tidslucka",
"Calendar server" : "Kalenderserver",
"Send invitations to attendees" : "Skicka inbjudan till deltagare",
"Automatically generate a birthday calendar" : "Generera en födelsedagskalender automatiskt",
@@ -159,6 +171,8 @@ OC.L10N.register(
"Hence they will not be available immediately after enabling but will show up after some time." : "Därför kommer de inte vara tillgängliga direkt efter aktivering men kommer dyka upp efter en tid.",
"Send notifications for events" : "Skicka aviseringar för händelser",
"Notifications are sent via background jobs, so these must occur often enough." : "Aviseringar skickas genom bakgrundsjobb, så dessa måste ske tillräckligt ofta.",
+ "Send reminder notifications to calendar sharees as well" : "Skicka även påminnelser till kalenderdeltagare",
+ "Reminders are always sent to organizers and attendees." : "Påminnelser skickas alltid till arrangörer och deltagare.",
"Enable notifications for events via push" : "Aktivera aviseringar för händelser via push",
"Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "Installera även {calendarappstoreopen}Kalender-app{linkclose}, eller {calendardocopen}anslut din dator & mobil för synkronisering ↗{linkclose}.",
"Please make sure to properly set up {emailopen}the email server{linkclose}." : "Verifiera och säkerställ inställningar för {emailopen}e-postserver{linkclose}.",
diff --git a/apps/dav/l10n/sv.json b/apps/dav/l10n/sv.json
index 91744d989fb..65664c4f6a2 100644
--- a/apps/dav/l10n/sv.json
+++ b/apps/dav/l10n/sv.json
@@ -70,8 +70,11 @@
"Where: %s" : "Var: %s",
"%1$s via %2$s" : "%1$s via %2$s",
"Cancelled: %1$s" : "Avbruten: %1$s",
+ "\"%1$s\" has been canceled" : "\"%1$s\" har avbrutits",
"Re: %1$s" : "Sv: %1$s",
+ "%1$s has responded to your invitation" : "%1$s har svarat på din inbjudan",
"Invitation: %1$s" : "Inbjudan: %1$s",
+ "%1$s would like to invite you to \"%2$s\"" : "%1$s skulle vilja bjuda in dig till \"%2$s\"",
"Organizer:" : "Arrangör:",
"Attendees:" : "Deltagare:",
"Title:" : "Titel:",
@@ -108,8 +111,12 @@
"You updated contact {card} in address book {addressbook}" : "Du uppdaterade kontakten {card} i adressboken {addressbook}",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "En <strong>kontakt</strong> eller <strong>adressbok</strong> ändrades",
"File is not updatable: %1$s" : "Fil kan inte uppdateras: %1$s",
+ "Could not write to final file, canceled by hook" : "Kunde ej skriva till den slutgiltiga filen, avbröts av en kopplad åtgärd",
"Could not write file contents" : "Kunde inte skriva filens innehåll",
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
+ "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Fel vid kopiering av fil till målplats (kopierade: %1$s, förväntad filstorlek: %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." : "Förväntad filstorlek på %1$s men läste (från Nextcloud-klienten) och skrev (till Nextcloud-lagringen) %2$s. Kan antingen vara ett nätverksproblem på sändnings-sidan eller problem med att skriva till lagringen på server-sidan.",
+ "Could not rename part file to final file, canceled by hook" : "Kunde inte byta namn på filfragment till slutgiltigt filnamn, avbröts av en kopplad åtgärd.",
"Could not rename part file to final file" : "Kunde inte ändra namn från temporära filen till slutliga filen",
"Failed to check file size: %1$s" : "Kunde inte kontrollera filstorleken: %1$s",
"Could not open file" : "Kunde inte öppna fil",
@@ -142,6 +149,7 @@
"to" : "till",
"Delete slot" : "Radera lucka",
"No working hours set" : "Inga arbetstimmar satta",
+ "Add slot" : "Lägg till lucka",
"Monday" : "Måndag",
"Tuesday" : "Tisdag",
"Wednesday" : "Onsdag",
@@ -149,7 +157,11 @@
"Friday" : "Fredag",
"Saturday" : "Lördag",
"Sunday" : "Söndag",
+ "Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications." : "Sätt automatiskt användarstatus till \"Stör ej\" utanför tillgängliga tider för att tysta alla notifikationer.",
"Save" : "Spara",
+ "Failed to load availability" : "Misslyckades med att ladda tidsluckor",
+ "Saved availability" : "Sparade tidslucka",
+ "Failed to save availability" : "Misslyckades med att spara tidslucka",
"Calendar server" : "Kalenderserver",
"Send invitations to attendees" : "Skicka inbjudan till deltagare",
"Automatically generate a birthday calendar" : "Generera en födelsedagskalender automatiskt",
@@ -157,6 +169,8 @@
"Hence they will not be available immediately after enabling but will show up after some time." : "Därför kommer de inte vara tillgängliga direkt efter aktivering men kommer dyka upp efter en tid.",
"Send notifications for events" : "Skicka aviseringar för händelser",
"Notifications are sent via background jobs, so these must occur often enough." : "Aviseringar skickas genom bakgrundsjobb, så dessa måste ske tillräckligt ofta.",
+ "Send reminder notifications to calendar sharees as well" : "Skicka även påminnelser till kalenderdeltagare",
+ "Reminders are always sent to organizers and attendees." : "Påminnelser skickas alltid till arrangörer och deltagare.",
"Enable notifications for events via push" : "Aktivera aviseringar för händelser via push",
"Also install the {calendarappstoreopen}Calendar app{linkclose}, or {calendardocopen}connect your desktop & mobile for syncing ↗{linkclose}." : "Installera även {calendarappstoreopen}Kalender-app{linkclose}, eller {calendardocopen}anslut din dator & mobil för synkronisering ↗{linkclose}.",
"Please make sure to properly set up {emailopen}the email server{linkclose}." : "Verifiera och säkerställ inställningar för {emailopen}e-postserver{linkclose}.",
diff --git a/apps/federatedfilesharing/l10n/sr.js b/apps/federatedfilesharing/l10n/sr.js
index 385580fc25e..5f0750cfa37 100644
--- a/apps/federatedfilesharing/l10n/sr.js
+++ b/apps/federatedfilesharing/l10n/sr.js
@@ -43,6 +43,7 @@ OC.L10N.register(
"HTML Code:" : "ХТМЛ кôд:",
"Share with me through my #Nextcloud Federated Cloud ID" : "Дели са мном преко мог #Некстклауд Здруженог облака",
"Copy to clipboard" : "Копирај у оставу",
+ "Clipboard is not available" : "Клипборд није доступан",
"Copied!" : "Копирано!",
"Copy" : "Копирај",
"Not supported!" : "Није подржано!",
diff --git a/apps/federatedfilesharing/l10n/sr.json b/apps/federatedfilesharing/l10n/sr.json
index cba3f81cf9d..ef2a107956a 100644
--- a/apps/federatedfilesharing/l10n/sr.json
+++ b/apps/federatedfilesharing/l10n/sr.json
@@ -41,6 +41,7 @@
"HTML Code:" : "ХТМЛ кôд:",
"Share with me through my #Nextcloud Federated Cloud ID" : "Дели са мном преко мог #Некстклауд Здруженог облака",
"Copy to clipboard" : "Копирај у оставу",
+ "Clipboard is not available" : "Клипборд није доступан",
"Copied!" : "Копирано!",
"Copy" : "Копирај",
"Not supported!" : "Није подржано!",
diff --git a/apps/federatedfilesharing/l10n/sv.js b/apps/federatedfilesharing/l10n/sv.js
index 06fac4efb97..439988d48c6 100644
--- a/apps/federatedfilesharing/l10n/sv.js
+++ b/apps/federatedfilesharing/l10n/sv.js
@@ -15,6 +15,7 @@ OC.L10N.register(
"It is not allowed to send federated group shares from this server." : "Det är inte tillåtet att skicka federerade gruppdelningar från den här servern.",
"Sharing %1$s failed, because this item is already shared with user %2$s" : "Delning av %1$s misslyckades eftersom detta redan är delat med användaren %2$s",
"Not allowed to create a federated share with the same user" : "Inte tillåtet att skapa en federerad delning med samma användare",
+ "Federated shares require read permissions" : "Federerade delningar kräver läsbehörighet",
"File is already shared with %s" : "Filen är redan delad med %s",
"Sharing %1$s failed, could not find %2$s, maybe the server is currently unreachable or uses a self-signed certificate." : "Delning %1$s misslyckades. Kunde inte hitta %2$s, kanske är servern inte tillgänglig eller så används ett självsignerat certifikat.",
"Could not find share" : "Kunde inte hitta delning",
@@ -27,20 +28,27 @@ OC.L10N.register(
"Sharing" : "Dela",
"Federated file sharing" : "Federerad fildelning",
"Provide federated file sharing across servers" : "Erbjuder federerad fildelning mellan servrar",
+ "Adjust how people can share between servers. This includes shares between users on this server as well if they are using federated sharing." : "Anpassa hur användare kan dela mellan servrar. Detta inkluderar även delningar mellan användare på denna server ifall de använder federerad delning.",
+ "Allow users on this server to send shares to other servers (this option also allows WebDAV access to public shares)" : "Tillåt användare på denna server att skicka delningar till andra servrar (denna inställning ger också WebDAV-tillgång till offentliga delningar)",
"Allow users on this server to receive shares from other servers" : "Tillåt användare på denna servern att ta emot utdelningar från andra servrar",
"Allow users on this server to send shares to groups on other servers" : "Tillåt användare på denna server att skicka delningar till grupper på andra servrar",
"Allow users on this server to receive group shares from other servers" : "Tillåt användare på denna servern att ta emot gruppdelningar från andra servrar",
"Search global and public address book for users" : "Sök global och offentlig adressbok för användare",
"Allow users to publish their data to a global and public address book" : "Tillåt användare att publicera deras data till en global och publik adressbok",
+ "Unable to update federated files sharing config" : "Kunde inte uppdatera konfigurationen för federerad fildelning",
"Federated Cloud" : "Federerat moln",
"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" : "Du kan dela med alla som använder en Nextcloud-server eller andra Open Cloud Mesh (OCM) -kompatibla servrar och tjänster! Anger bara sitt federerade moln-ID i delningsrutan. Det ser ut som person@cloud.example.com",
"Your Federated Cloud ID:" : "Ditt federerade moln-ID:",
"Share it so your friends can share files with you:" : "Dela det så att dina vänner kan dela filer med dig:",
+ "Facebook" : "Facebook",
"Twitter" : "Twitter",
+ "Diaspora" : "Diaspora",
"Add to your website" : "Lägg till på din hemsida",
"Share with me via Nextcloud" : "Dela med mig via Nextcloud",
"HTML Code:" : "HTML Kod:",
+ "Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Dela med mig genom mitt #Nextcloud federerade moln-ID, se {url}",
"Share with me through my #Nextcloud Federated Cloud ID" : "Dela med mig genom mitt #Nextcloud federerade moln-ID",
+ "Cloud ID copied to the clipboard" : "Moln-ID kopierades till urklippet",
"Copy to clipboard" : "Kopiera till urklipp",
"Clipboard is not available" : "Urklipp är inte tillgängligt",
"Copied!" : "Kopierad!",
diff --git a/apps/federatedfilesharing/l10n/sv.json b/apps/federatedfilesharing/l10n/sv.json
index ac2e3dbb4eb..a7ad8d959ab 100644
--- a/apps/federatedfilesharing/l10n/sv.json
+++ b/apps/federatedfilesharing/l10n/sv.json
@@ -13,6 +13,7 @@
"It is not allowed to send federated group shares from this server." : "Det är inte tillåtet att skicka federerade gruppdelningar från den här servern.",
"Sharing %1$s failed, because this item is already shared with user %2$s" : "Delning av %1$s misslyckades eftersom detta redan är delat med användaren %2$s",
"Not allowed to create a federated share with the same user" : "Inte tillåtet att skapa en federerad delning med samma användare",
+ "Federated shares require read permissions" : "Federerade delningar kräver läsbehörighet",
"File is already shared with %s" : "Filen är redan delad med %s",
"Sharing %1$s failed, could not find %2$s, maybe the server is currently unreachable or uses a self-signed certificate." : "Delning %1$s misslyckades. Kunde inte hitta %2$s, kanske är servern inte tillgänglig eller så används ett självsignerat certifikat.",
"Could not find share" : "Kunde inte hitta delning",
@@ -25,20 +26,27 @@
"Sharing" : "Dela",
"Federated file sharing" : "Federerad fildelning",
"Provide federated file sharing across servers" : "Erbjuder federerad fildelning mellan servrar",
+ "Adjust how people can share between servers. This includes shares between users on this server as well if they are using federated sharing." : "Anpassa hur användare kan dela mellan servrar. Detta inkluderar även delningar mellan användare på denna server ifall de använder federerad delning.",
+ "Allow users on this server to send shares to other servers (this option also allows WebDAV access to public shares)" : "Tillåt användare på denna server att skicka delningar till andra servrar (denna inställning ger också WebDAV-tillgång till offentliga delningar)",
"Allow users on this server to receive shares from other servers" : "Tillåt användare på denna servern att ta emot utdelningar från andra servrar",
"Allow users on this server to send shares to groups on other servers" : "Tillåt användare på denna server att skicka delningar till grupper på andra servrar",
"Allow users on this server to receive group shares from other servers" : "Tillåt användare på denna servern att ta emot gruppdelningar från andra servrar",
"Search global and public address book for users" : "Sök global och offentlig adressbok för användare",
"Allow users to publish their data to a global and public address book" : "Tillåt användare att publicera deras data till en global och publik adressbok",
+ "Unable to update federated files sharing config" : "Kunde inte uppdatera konfigurationen för federerad fildelning",
"Federated Cloud" : "Federerat moln",
"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" : "Du kan dela med alla som använder en Nextcloud-server eller andra Open Cloud Mesh (OCM) -kompatibla servrar och tjänster! Anger bara sitt federerade moln-ID i delningsrutan. Det ser ut som person@cloud.example.com",
"Your Federated Cloud ID:" : "Ditt federerade moln-ID:",
"Share it so your friends can share files with you:" : "Dela det så att dina vänner kan dela filer med dig:",
+ "Facebook" : "Facebook",
"Twitter" : "Twitter",
+ "Diaspora" : "Diaspora",
"Add to your website" : "Lägg till på din hemsida",
"Share with me via Nextcloud" : "Dela med mig via Nextcloud",
"HTML Code:" : "HTML Kod:",
+ "Share with me through my #Nextcloud Federated Cloud ID, see {url}" : "Dela med mig genom mitt #Nextcloud federerade moln-ID, se {url}",
"Share with me through my #Nextcloud Federated Cloud ID" : "Dela med mig genom mitt #Nextcloud federerade moln-ID",
+ "Cloud ID copied to the clipboard" : "Moln-ID kopierades till urklippet",
"Copy to clipboard" : "Kopiera till urklipp",
"Clipboard is not available" : "Urklipp är inte tillgängligt",
"Copied!" : "Kopierad!",
diff --git a/apps/federation/l10n/cs.js b/apps/federation/l10n/cs.js
index 77b6699a4bd..c3676c7bd5b 100644
--- a/apps/federation/l10n/cs.js
+++ b/apps/federation/l10n/cs.js
@@ -8,8 +8,8 @@ OC.L10N.register(
"Trusted servers" : "Důvěryhodné servery",
"Federation" : "Federování",
"Federation allows you to connect with other trusted servers to exchange the user directory." : "Federování umožňuje propojit s ostatními servery, kterým věříte a vyměňovat si tak adresář uživatelů.",
- "Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Federování umožňuje propojit s ostatními servery, kterým věříte a vyměňovat si tak adresář uživatelů. Používá se to např. pro automatické doplňování uživatelů při federovaném sdílení.",
- "Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing. It is not necessary to add a server as trusted server in order to create a federated share." : "Federování vám umožní se spojovat s dalšími důvěryhodnými servery a sdílet tak uživatelské účty. Například bude toto využito při automatickém dokončování externích uživatelů pro federované sdílení. K vytvoření federovaného sdílení není nezbytné přidávat server jako důvěryhodný.",
+ "Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users 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 uživatelů při federovaném sdílení.",
+ "Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users 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 uživatelů 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ý.",
"+ Add trusted server" : "+ Přidat důvěryhodný server",
"Trusted server" : "Důvěryhodný server",
"Add" : "Přidat"
diff --git a/apps/federation/l10n/cs.json b/apps/federation/l10n/cs.json
index 097b128075d..470d2376d8f 100644
--- a/apps/federation/l10n/cs.json
+++ b/apps/federation/l10n/cs.json
@@ -6,8 +6,8 @@
"Trusted servers" : "Důvěryhodné servery",
"Federation" : "Federování",
"Federation allows you to connect with other trusted servers to exchange the user directory." : "Federování umožňuje propojit s ostatními servery, kterým věříte a vyměňovat si tak adresář uživatelů.",
- "Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Federování umožňuje propojit s ostatními servery, kterým věříte a vyměňovat si tak adresář uživatelů. Používá se to např. pro automatické doplňování uživatelů při federovaném sdílení.",
- "Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing. It is not necessary to add a server as trusted server in order to create a federated share." : "Federování vám umožní se spojovat s dalšími důvěryhodnými servery a sdílet tak uživatelské účty. Například bude toto využito při automatickém dokončování externích uživatelů pro federované sdílení. K vytvoření federovaného sdílení není nezbytné přidávat server jako důvěryhodný.",
+ "Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users 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 uživatelů při federovaném sdílení.",
+ "Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users 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 uživatelů 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ý.",
"+ Add trusted server" : "+ Přidat důvěryhodný server",
"Trusted server" : "Důvěryhodný server",
"Add" : "Přidat"
diff --git a/apps/federation/l10n/sv.js b/apps/federation/l10n/sv.js
index dca2b3e79d0..3820ace7380 100644
--- a/apps/federation/l10n/sv.js
+++ b/apps/federation/l10n/sv.js
@@ -9,6 +9,7 @@ OC.L10N.register(
"Federation" : "Federation",
"Federation allows you to connect with other trusted servers to exchange the user directory." : "Federation låter dig ansluta med andra betrodda servrar för att utbyta användarkatalogen.",
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Federation låter dig ansluta till andra betrodda servrar för att utbyta användarinformation. Till exempel kommer detta användas för att auto-komplettera externa användare för federerad delning.",
+ "Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing. It is not necessary to add a server as trusted server in order to create a federated share." : "Federation låter dig ansluta till andra betrodda servrar för att utbyta användarinformation. Till exempel kommer detta användas för att auto-komplettera externa användare för federerad delning. Det är inte nödvändigt att lägga till en server som betrodd för att skapa en federerad delning.",
"+ Add trusted server" : "+ Lägg till betrodd server",
"Trusted server" : "Betrodd server",
"Add" : "Lägg till"
diff --git a/apps/federation/l10n/sv.json b/apps/federation/l10n/sv.json
index e3265e71d57..5b953a07628 100644
--- a/apps/federation/l10n/sv.json
+++ b/apps/federation/l10n/sv.json
@@ -7,6 +7,7 @@
"Federation" : "Federation",
"Federation allows you to connect with other trusted servers to exchange the user directory." : "Federation låter dig ansluta med andra betrodda servrar för att utbyta användarkatalogen.",
"Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "Federation låter dig ansluta till andra betrodda servrar för att utbyta användarinformation. Till exempel kommer detta användas för att auto-komplettera externa användare för federerad delning.",
+ "Federation allows you to connect with other trusted servers to exchange the user directory. For example this will be used to auto-complete external users for federated sharing. It is not necessary to add a server as trusted server in order to create a federated share." : "Federation låter dig ansluta till andra betrodda servrar för att utbyta användarinformation. Till exempel kommer detta användas för att auto-komplettera externa användare för federerad delning. Det är inte nödvändigt att lägga till en server som betrodd för att skapa en federerad delning.",
"+ Add trusted server" : "+ Lägg till betrodd server",
"Trusted server" : "Betrodd server",
"Add" : "Lägg till"
diff --git a/apps/files/l10n/he.js b/apps/files/l10n/he.js
index 8a50076eedf..d10792693a1 100644
--- a/apps/files/l10n/he.js
+++ b/apps/files/l10n/he.js
@@ -154,6 +154,7 @@ OC.L10N.register(
"Invalid path selected" : "הנתיב שנבחר שגוי",
"Unknown error" : "שגיאה בלתי ידועה",
"Ownership transfer request sent" : "נשלחה בקשת העברת בעלות",
+ "Files settings" : "הגדרות לקבצים",
"Show hidden files" : "הצגת קבצים נסתרים",
"Crop image previews" : "חיתוך תצוגות מקדימות של תמונות",
"Additional settings" : "הגדרות נוספות",
diff --git a/apps/files/l10n/he.json b/apps/files/l10n/he.json
index a1dc395547c..589e6fa320b 100644
--- a/apps/files/l10n/he.json
+++ b/apps/files/l10n/he.json
@@ -152,6 +152,7 @@
"Invalid path selected" : "הנתיב שנבחר שגוי",
"Unknown error" : "שגיאה בלתי ידועה",
"Ownership transfer request sent" : "נשלחה בקשת העברת בעלות",
+ "Files settings" : "הגדרות לקבצים",
"Show hidden files" : "הצגת קבצים נסתרים",
"Crop image previews" : "חיתוך תצוגות מקדימות של תמונות",
"Additional settings" : "הגדרות נוספות",
diff --git a/apps/files/l10n/sr.js b/apps/files/l10n/sr.js
index 164046ea208..df4fdfab238 100644
--- a/apps/files/l10n/sr.js
+++ b/apps/files/l10n/sr.js
@@ -89,11 +89,16 @@ OC.L10N.register(
"\"/\" is not allowed inside a file name." : "„/“ није дозвољен каракетер у имену фајла.",
"\"{name}\" is not an allowed filetype" : "„{name}“ није дозвољени тип фајла",
"Storage of {owner} is full, files cannot be updated or synced anymore!" : "Складиште власника {owner} је пуно, више није могуће отпремање или синхронизација фајлова!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Групни фолдер „{mountPoint}” је пун, фајлови више не могу да се ажурирају или синхронизују!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Спаљно складиште „{mountPoint}” је пуно, фајлови више не могу да се ажурирају или синхронизују!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Ваше складиште је пуно, фајлови випе не могу да се ажурирају или синхронизују!",
"Storage of {owner} is almost full ({usedSpacePercent}%)." : "Складиште корисника {owner} је скоро пуно ({usedSpacePercent}%).",
"Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Групна фасцикла „{mountPoint}“ је скоро пуна ({usedSpacePercent}%).",
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Спољашње складиште „{mountPoint}“ је скоро пуно ({usedSpacePercent}%).",
"Your storage is almost full ({usedSpacePercent}%)." : "Ваше складиште је скоро пуно ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["се подудара са „{filter}”","се подударају са „{filter}","се подудара са „{filter}"],
"View in folder" : "Види у фасцикли",
+ "Direct link was copied (only works for users who have access to this file/folder)" : "Копиран је директан линк (функционише само за кориснике који имају приступ овом фајлу/фолдеру)",
"Path" : "Путања",
"_%n byte_::_%n bytes_" : ["%n бајт","%n бајта","%n бајтова"],
"Favorited" : "Омиљено",
@@ -134,7 +139,13 @@ OC.L10N.register(
"{user} deleted an encrypted file in {file}" : "{user} је обрисао шифровани фајл {file}",
"You restored {file}" : "Повратили сте {file}",
"{user} restored {file}" : "{user} је повратио {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Променили сте име фајла {oldfile} (скривено) на {newfile} (скривено)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Променили сте име фајла {oldfile} (скривено) на {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Променили сте име фајла {oldfile} на {newfile} (скривено)",
"You renamed {oldfile} to {newfile}" : "Преименовали сте {oldfile} на {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} је променио име фајла {oldfile} (скривено) на {newfile} (скривено)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} је променио име фајла {oldfile} (скривено) на {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} је променио име фајла {oldfile} на {newfile} (скривено)",
"{user} renamed {oldfile} to {newfile}" : "{user} је преименовао {oldfile} на {newfile}",
"You moved {oldfile} to {newfile}" : "Померили сте {oldfile} на {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} је померио {oldfile} на {newfile}",
@@ -155,6 +166,10 @@ OC.L10N.register(
"The ownership transfer of {path} from {user} has completed." : "Пренос власништва {path} на корисника {user} завршен.",
"in %s" : "за %s",
"File Management" : "Управљање фајловима",
+ "Storage informations" : "Информације о складишту`",
+ "{usedQuotaByte} used" : "{usedQuotaByte} искоришћено",
+ "{relative}% used" : "{relative}% искоришћено",
+ "Could not refresh storage stats" : "Статистике складишта нису могле да се освеже",
"Transfer ownership of a file or folder" : "Пренеси власништво фајла или фасцикле",
"Choose file or folder to transfer" : "Одаберите фајл или фасциклу за пренос",
"Change" : "Измени",
@@ -166,15 +181,30 @@ OC.L10N.register(
"Invalid path selected" : "Одабрана неисправна путања",
"Unknown error" : "Непозната грешка",
"Ownership transfer request sent" : "Послат захтев за пренос власништва",
+ "Cannot transfer ownership of a file or folder you do not own" : "Не можете да пренесете власништво над фајлом или фолдером који не поседујете",
+ "Open the files app settings" : "Отвори подешавања апликације фајлови",
+ "Files settings" : "Подешавања фајлова",
"Show hidden files" : "Прикажи скривене фајлове",
+ "Crop image previews" : "Опсецање прегледа слика",
"Additional settings" : "Додатне поставке",
"WebDAV" : "ВебДАВ",
"Copy to clipboard" : "Копирај у оставу",
"Use this address to access your Files via WebDAV" : "Користи ову адресу да приступате Вашим фајловима преко ВебДАВа",
+ "Clipboard is not available" : "Клипборд није доступан",
+ "WebDAV URL copied to clipboard" : "WebDAV URL је копиран у клипборд",
"Unable to change the favourite state of the file" : "Неуспела промена стања омиљености фајла",
"Error while loading the file data" : "Грешка при учитавању података фајла",
+ "Pick a template for {name}" : "Изаберите шаблон за {name}",
"Cancel" : "Поништи",
"Create" : "Направи",
+ "Create a new file with the selected template" : "Креирање новог фајла по изабраном шаблону",
+ "Creating file" : "Креирање фајла",
+ "Blank" : "Празно",
+ "Unable to create new file from template" : "Из шаблона није могао да се креира нови фајл",
+ "Set up templates folder" : "Постављање фолдера са шаблонима",
+ "Templates" : "Шаблони",
+ "Unable to initialize the templates directory" : "Фолдер са шаблонима није могао да се иницијализује",
+ "Toggle %1$s sublist" : "Укљ./искљ. %1$s подлисте",
"Toggle grid view" : "Укључи/искључи приказ мреже",
"No files in here" : "Овде нема фајлова",
"Upload some content or sync with your devices!" : "Отпремите неки садржај или синхронизујте са вашим уређајима!",
@@ -201,6 +231,7 @@ OC.L10N.register(
"Unlimited" : "Неограничено",
"Cannot transfer ownership of a file or folder you don't own" : "Не можете пренети власништво фајла или фасцикле које нису Ваше",
"%s used" : "%s искоришћено",
+ "%s%%" : "%s%%",
"%1$s of %2$s used" : "Заузето %1$s од %2$s",
"Settings" : "Поставке"
},
diff --git a/apps/files/l10n/sr.json b/apps/files/l10n/sr.json
index a78f0edc6f8..564aae711c7 100644
--- a/apps/files/l10n/sr.json
+++ b/apps/files/l10n/sr.json
@@ -87,11 +87,16 @@
"\"/\" is not allowed inside a file name." : "„/“ није дозвољен каракетер у имену фајла.",
"\"{name}\" is not an allowed filetype" : "„{name}“ није дозвољени тип фајла",
"Storage of {owner} is full, files cannot be updated or synced anymore!" : "Складиште власника {owner} је пуно, више није могуће отпремање или синхронизација фајлова!",
+ "Group folder \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Групни фолдер „{mountPoint}” је пун, фајлови више не могу да се ажурирају или синхронизују!",
+ "External storage \"{mountPoint}\" is full, files cannot be updated or synced anymore!" : "Спаљно складиште „{mountPoint}” је пуно, фајлови више не могу да се ажурирају или синхронизују!",
+ "Your storage is full, files cannot be updated or synced anymore!" : "Ваше складиште је пуно, фајлови випе не могу да се ажурирају или синхронизују!",
"Storage of {owner} is almost full ({usedSpacePercent}%)." : "Складиште корисника {owner} је скоро пуно ({usedSpacePercent}%).",
"Group folder \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Групна фасцикла „{mountPoint}“ је скоро пуна ({usedSpacePercent}%).",
"External storage \"{mountPoint}\" is almost full ({usedSpacePercent}%)." : "Спољашње складиште „{mountPoint}“ је скоро пуно ({usedSpacePercent}%).",
"Your storage is almost full ({usedSpacePercent}%)." : "Ваше складиште је скоро пуно ({usedSpacePercent}%).",
+ "_matches \"{filter}\"_::_match \"{filter}\"_" : ["се подудара са „{filter}”","се подударају са „{filter}","се подудара са „{filter}"],
"View in folder" : "Види у фасцикли",
+ "Direct link was copied (only works for users who have access to this file/folder)" : "Копиран је директан линк (функционише само за кориснике који имају приступ овом фајлу/фолдеру)",
"Path" : "Путања",
"_%n byte_::_%n bytes_" : ["%n бајт","%n бајта","%n бајтова"],
"Favorited" : "Омиљено",
@@ -132,7 +137,13 @@
"{user} deleted an encrypted file in {file}" : "{user} је обрисао шифровани фајл {file}",
"You restored {file}" : "Повратили сте {file}",
"{user} restored {file}" : "{user} је повратио {file}",
+ "You renamed {oldfile} (hidden) to {newfile} (hidden)" : "Променили сте име фајла {oldfile} (скривено) на {newfile} (скривено)",
+ "You renamed {oldfile} (hidden) to {newfile}" : "Променили сте име фајла {oldfile} (скривено) на {newfile}",
+ "You renamed {oldfile} to {newfile} (hidden)" : "Променили сте име фајла {oldfile} на {newfile} (скривено)",
"You renamed {oldfile} to {newfile}" : "Преименовали сте {oldfile} на {newfile}",
+ "{user} renamed {oldfile} (hidden) to {newfile} (hidden)" : "{user} је променио име фајла {oldfile} (скривено) на {newfile} (скривено)",
+ "{user} renamed {oldfile} (hidden) to {newfile}" : "{user} је променио име фајла {oldfile} (скривено) на {newfile}",
+ "{user} renamed {oldfile} to {newfile} (hidden)" : "{user} је променио име фајла {oldfile} на {newfile} (скривено)",
"{user} renamed {oldfile} to {newfile}" : "{user} је преименовао {oldfile} на {newfile}",
"You moved {oldfile} to {newfile}" : "Померили сте {oldfile} на {newfile}",
"{user} moved {oldfile} to {newfile}" : "{user} је померио {oldfile} на {newfile}",
@@ -153,6 +164,10 @@
"The ownership transfer of {path} from {user} has completed." : "Пренос власништва {path} на корисника {user} завршен.",
"in %s" : "за %s",
"File Management" : "Управљање фајловима",
+ "Storage informations" : "Информације о складишту`",
+ "{usedQuotaByte} used" : "{usedQuotaByte} искоришћено",
+ "{relative}% used" : "{relative}% искоришћено",
+ "Could not refresh storage stats" : "Статистике складишта нису могле да се освеже",
"Transfer ownership of a file or folder" : "Пренеси власништво фајла или фасцикле",
"Choose file or folder to transfer" : "Одаберите фајл или фасциклу за пренос",
"Change" : "Измени",
@@ -164,15 +179,30 @@
"Invalid path selected" : "Одабрана неисправна путања",
"Unknown error" : "Непозната грешка",
"Ownership transfer request sent" : "Послат захтев за пренос власништва",
+ "Cannot transfer ownership of a file or folder you do not own" : "Не можете да пренесете власништво над фајлом или фолдером који не поседујете",
+ "Open the files app settings" : "Отвори подешавања апликације фајлови",
+ "Files settings" : "Подешавања фајлова",
"Show hidden files" : "Прикажи скривене фајлове",
+ "Crop image previews" : "Опсецање прегледа слика",
"Additional settings" : "Додатне поставке",
"WebDAV" : "ВебДАВ",
"Copy to clipboard" : "Копирај у оставу",
"Use this address to access your Files via WebDAV" : "Користи ову адресу да приступате Вашим фајловима преко ВебДАВа",
+ "Clipboard is not available" : "Клипборд није доступан",
+ "WebDAV URL copied to clipboard" : "WebDAV URL је копиран у клипборд",
"Unable to change the favourite state of the file" : "Неуспела промена стања омиљености фајла",
"Error while loading the file data" : "Грешка при учитавању података фајла",
+ "Pick a template for {name}" : "Изаберите шаблон за {name}",
"Cancel" : "Поништи",
"Create" : "Направи",
+ "Create a new file with the selected template" : "Креирање новог фајла по изабраном шаблону",
+ "Creating file" : "Креирање фајла",
+ "Blank" : "Празно",
+ "Unable to create new file from template" : "Из шаблона није могао да се креира нови фајл",
+ "Set up templates folder" : "Постављање фолдера са шаблонима",
+ "Templates" : "Шаблони",
+ "Unable to initialize the templates directory" : "Фолдер са шаблонима није могао да се иницијализује",
+ "Toggle %1$s sublist" : "Укљ./искљ. %1$s подлисте",
"Toggle grid view" : "Укључи/искључи приказ мреже",
"No files in here" : "Овде нема фајлова",
"Upload some content or sync with your devices!" : "Отпремите неки садржај или синхронизујте са вашим уређајима!",
@@ -199,6 +229,7 @@
"Unlimited" : "Неограничено",
"Cannot transfer ownership of a file or folder you don't own" : "Не можете пренети власништво фајла или фасцикле које нису Ваше",
"%s used" : "%s искоришћено",
+ "%s%%" : "%s%%",
"%1$s of %2$s used" : "Заузето %1$s од %2$s",
"Settings" : "Поставке"
},"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);"
diff --git a/apps/files_external/l10n/sv.js b/apps/files_external/l10n/sv.js
index 68b79ebdafc..d365ace7594 100644
--- a/apps/files_external/l10n/sv.js
+++ b/apps/files_external/l10n/sv.js
@@ -82,6 +82,8 @@ OC.L10N.register(
"Public key" : "Offentlig nyckel",
"RSA private key" : "RSA privat nyckel",
"Private key" : "Privat nyckel",
+ "Kerberos default realm, defaults to \"WORKGROUP\"" : "Kerberos standardområde sätts som standard till \"WORKGROUP\"",
+ "Kerberos ticket Apache mode" : "Kerberos-biljett Apache-läge",
"Kerberos ticket" : "Kerberos-biljett",
"Amazon S3" : "Amazon S3",
"Bucket" : "Bucket",
diff --git a/apps/files_external/l10n/sv.json b/apps/files_external/l10n/sv.json
index 6e8eb532da7..51aebc06a2f 100644
--- a/apps/files_external/l10n/sv.json
+++ b/apps/files_external/l10n/sv.json
@@ -80,6 +80,8 @@
"Public key" : "Offentlig nyckel",
"RSA private key" : "RSA privat nyckel",
"Private key" : "Privat nyckel",
+ "Kerberos default realm, defaults to \"WORKGROUP\"" : "Kerberos standardområde sätts som standard till \"WORKGROUP\"",
+ "Kerberos ticket Apache mode" : "Kerberos-biljett Apache-läge",
"Kerberos ticket" : "Kerberos-biljett",
"Amazon S3" : "Amazon S3",
"Bucket" : "Bucket",
diff --git a/apps/files_trashbin/l10n/cs.js b/apps/files_trashbin/l10n/cs.js
index 793b14e7cf5..d077fc1f795 100644
--- a/apps/files_trashbin/l10n/cs.js
+++ b/apps/files_trashbin/l10n/cs.js
@@ -3,9 +3,9 @@ OC.L10N.register(
{
"Deleted files" : "Smazané soubory",
"restored" : "obnoveno",
- "Deleted files and folders in the trash bin (may expire during export if you are low on storage space)" : "Smazané soubory a složky v koši (v průběhu exportu může jejich platnost skončit, pokud začne docházet místo na úložišti)",
- "This application enables users to restore files that were deleted from the system." : "Tato aplikace umožňuje uživatelům obnovovat soubory, které byly ze systému smazány.",
- "This application enables users to restore files that were deleted from the system. It displays a list of deleted files in the web interface, and has options to restore those deleted files back to the users file directories or remove them permanently from the system. Restoring a file also restores related file versions, if the versions application is enabled. When a file is deleted from a share, it can be restored in the same manner, though it is no longer shared. By default, these files remain in the trash bin for 30 days.\nTo prevent a user from running out of disk space, the Deleted files app will not utilize more than 50% of the currently available free quota for deleted files. If the deleted files exceed this limit, the app deletes the oldest files until it gets below this limit. More information is available in the Deleted Files documentation." : "Tato aplikace uživatelům umožňuje obnovovat soubory, které byly ze systému vymazány. Zobrazí seznam smazaných souborů ve webovém rozhraní a má volby pro obnovení těchto smazaných souborů zpět do složek se soubory uživatelů nebo jejich odebrání natrvalo. Obnovení souboru také obnoví související verze souboru, pokud je zapnutá aplikace verzování. Když je soubor smazán ze sdílení, je možné ho obnovit stejným způsobem, ačkoli už není sdílený. Ve výchozím stavu, tyto soubory jsou ponechávány v koši po dobu 30 dnů.\nAby uživatelé nezaplnili celý disk, aplikace Smazané soubory nevyužije více než 50% kvóty pro smazané soubory. Pokud smazané soubory přesahují tento limit, aplikace smaže nejstarší soubory, dokud se nedostane pod limit. Více informací je k dispozici v dokumentaci ke Smazané soubory.",
+ "Deleted files and folders in the trash bin (may expire during export if you are low on storage space)" : "Smazané soubory a složky v Koši (v průběhu exportu může jejich platnost skončit, pokud začne docházet místo na úložišti)",
+ "This application enables users to restore files that were deleted from the system." : "Tato aplikace umožňuje uživatelům obnovovat soubory, které byly ze systému vymazány.",
+ "This application enables users to restore files that were deleted from the system. It displays a list of deleted files in the web interface, and has options to restore those deleted files back to the users file directories or remove them permanently from the system. Restoring a file also restores related file versions, if the versions application is enabled. When a file is deleted from a share, it can be restored in the same manner, though it is no longer shared. By default, these files remain in the trash bin for 30 days.\nTo prevent a user from running out of disk space, the Deleted files app will not utilize more than 50% of the currently available free quota for deleted files. If the deleted files exceed this limit, the app deletes the oldest files until it gets below this limit. More information is available in the Deleted Files documentation." : "Tato aplikace umožňuje uživatelům obnovovat soubory, které byly ze systému vymazány. Ve webovém rozhraní zobrazuje seznam smazaných souborů a má volby pro obnovení těchto souborů zpět do složek se soubory uživatelů nebo jejich trvalé odebrání. Obnovení souboru také obnoví jeho související verze (pokud je zapnutá aplikace pro správu verzí). Když je soubor smazán ze sdílení, je možné ho obnovit stejným způsobem, ačkoli už nebude sdílený. Ve výchozím stavu, tyto soubory jsou ponechávány v koši po dobu 30 dnů.\nAby uživatelé nezaplnili celý disk, aplikace Smazané soubory pro ně nevyužije více než 50% kvóty. Pokud smazané soubory přesahují tento limit, aplikace maže nejstarší soubory, dokud se nedostane pod limit. Další informace jsou k dispozici v dokumentaci ke Smazané soubory.",
"Restore" : "Obnovit",
"Delete permanently" : "Trvale odstranit",
"Error while restoring file from trash bin" : "Chyba při obnovování souboru z Koše",
@@ -14,9 +14,9 @@ OC.L10N.register(
"Error while emptying trash bin" : "Chyba při vyprazdňování Koše",
"Error while removing files from trash bin" : "Chyba při odebírání souborů z Koše",
"This operation is forbidden" : "Tato operace je zakázána",
- "This directory is unavailable, please check the logs or contact the administrator" : "Tento adresář není dostupný, zkontrolujte záznamy událostí nebo se obraťte na správce",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Tento adresář není dostupný – zkontrolujte záznamy událostí nebo se obraťte na správce",
"No deleted files" : "Žádné smazané soubory",
- "You will be able to recover deleted files from here" : "Odtud budete moci obnovovat odstraněné soubory",
+ "You will be able to recover deleted files from here" : "Odtud budete moci obnovovat smazané soubory",
"No entries found in this folder" : "V této složce nebylo nic nalezeno",
"Select all" : "Vybrat vše",
"Name" : "Název",
diff --git a/apps/files_trashbin/l10n/cs.json b/apps/files_trashbin/l10n/cs.json
index 0c5bd4aae03..5495273ee19 100644
--- a/apps/files_trashbin/l10n/cs.json
+++ b/apps/files_trashbin/l10n/cs.json
@@ -1,9 +1,9 @@
{ "translations": {
"Deleted files" : "Smazané soubory",
"restored" : "obnoveno",
- "Deleted files and folders in the trash bin (may expire during export if you are low on storage space)" : "Smazané soubory a složky v koši (v průběhu exportu může jejich platnost skončit, pokud začne docházet místo na úložišti)",
- "This application enables users to restore files that were deleted from the system." : "Tato aplikace umožňuje uživatelům obnovovat soubory, které byly ze systému smazány.",
- "This application enables users to restore files that were deleted from the system. It displays a list of deleted files in the web interface, and has options to restore those deleted files back to the users file directories or remove them permanently from the system. Restoring a file also restores related file versions, if the versions application is enabled. When a file is deleted from a share, it can be restored in the same manner, though it is no longer shared. By default, these files remain in the trash bin for 30 days.\nTo prevent a user from running out of disk space, the Deleted files app will not utilize more than 50% of the currently available free quota for deleted files. If the deleted files exceed this limit, the app deletes the oldest files until it gets below this limit. More information is available in the Deleted Files documentation." : "Tato aplikace uživatelům umožňuje obnovovat soubory, které byly ze systému vymazány. Zobrazí seznam smazaných souborů ve webovém rozhraní a má volby pro obnovení těchto smazaných souborů zpět do složek se soubory uživatelů nebo jejich odebrání natrvalo. Obnovení souboru také obnoví související verze souboru, pokud je zapnutá aplikace verzování. Když je soubor smazán ze sdílení, je možné ho obnovit stejným způsobem, ačkoli už není sdílený. Ve výchozím stavu, tyto soubory jsou ponechávány v koši po dobu 30 dnů.\nAby uživatelé nezaplnili celý disk, aplikace Smazané soubory nevyužije více než 50% kvóty pro smazané soubory. Pokud smazané soubory přesahují tento limit, aplikace smaže nejstarší soubory, dokud se nedostane pod limit. Více informací je k dispozici v dokumentaci ke Smazané soubory.",
+ "Deleted files and folders in the trash bin (may expire during export if you are low on storage space)" : "Smazané soubory a složky v Koši (v průběhu exportu může jejich platnost skončit, pokud začne docházet místo na úložišti)",
+ "This application enables users to restore files that were deleted from the system." : "Tato aplikace umožňuje uživatelům obnovovat soubory, které byly ze systému vymazány.",
+ "This application enables users to restore files that were deleted from the system. It displays a list of deleted files in the web interface, and has options to restore those deleted files back to the users file directories or remove them permanently from the system. Restoring a file also restores related file versions, if the versions application is enabled. When a file is deleted from a share, it can be restored in the same manner, though it is no longer shared. By default, these files remain in the trash bin for 30 days.\nTo prevent a user from running out of disk space, the Deleted files app will not utilize more than 50% of the currently available free quota for deleted files. If the deleted files exceed this limit, the app deletes the oldest files until it gets below this limit. More information is available in the Deleted Files documentation." : "Tato aplikace umožňuje uživatelům obnovovat soubory, které byly ze systému vymazány. Ve webovém rozhraní zobrazuje seznam smazaných souborů a má volby pro obnovení těchto souborů zpět do složek se soubory uživatelů nebo jejich trvalé odebrání. Obnovení souboru také obnoví jeho související verze (pokud je zapnutá aplikace pro správu verzí). Když je soubor smazán ze sdílení, je možné ho obnovit stejným způsobem, ačkoli už nebude sdílený. Ve výchozím stavu, tyto soubory jsou ponechávány v koši po dobu 30 dnů.\nAby uživatelé nezaplnili celý disk, aplikace Smazané soubory pro ně nevyužije více než 50% kvóty. Pokud smazané soubory přesahují tento limit, aplikace maže nejstarší soubory, dokud se nedostane pod limit. Další informace jsou k dispozici v dokumentaci ke Smazané soubory.",
"Restore" : "Obnovit",
"Delete permanently" : "Trvale odstranit",
"Error while restoring file from trash bin" : "Chyba při obnovování souboru z Koše",
@@ -12,9 +12,9 @@
"Error while emptying trash bin" : "Chyba při vyprazdňování Koše",
"Error while removing files from trash bin" : "Chyba při odebírání souborů z Koše",
"This operation is forbidden" : "Tato operace je zakázána",
- "This directory is unavailable, please check the logs or contact the administrator" : "Tento adresář není dostupný, zkontrolujte záznamy událostí nebo se obraťte na správce",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Tento adresář není dostupný – zkontrolujte záznamy událostí nebo se obraťte na správce",
"No deleted files" : "Žádné smazané soubory",
- "You will be able to recover deleted files from here" : "Odtud budete moci obnovovat odstraněné soubory",
+ "You will be able to recover deleted files from here" : "Odtud budete moci obnovovat smazané soubory",
"No entries found in this folder" : "V této složce nebylo nic nalezeno",
"Select all" : "Vybrat vše",
"Name" : "Název",
diff --git a/apps/files_versions/l10n/cs.js b/apps/files_versions/l10n/cs.js
index 4dcb36ed7c4..886e907b8ab 100644
--- a/apps/files_versions/l10n/cs.js
+++ b/apps/files_versions/l10n/cs.js
@@ -2,8 +2,8 @@ OC.L10N.register(
"files_versions",
{
"Versions" : "Verze",
- "This application automatically maintains older versions of files that are changed." : "Tato aplikace automaticky uchovává starší verze souborů, které se mění.",
- "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Tato aplikace automaticky uchovává starší verze souborů, které se mění. Když je zapnutá, je ve složce každého uživatele vytvořena skrytá složka pro verze a do ní jsou ukládány staré verze souborů. Uživatel se (prostřednictvím webového rozhraní) kdykoli může vrátit ke starším verzím s tím, že sám nahrazovaný nejnovější soubor se tak stane verzí. Aplikace automaticky spravuje složku s verzemi tak, aby bylo zajištěno, že uživatel kvůli starým verzím nevyčerpá přidělenou kvótu.\n\t\tKrom konců platností verzí, aplikace Verze zajišťuje, že nikdy nepoužije více než 50% volného prostoru, který má uživatel k dispozici. Pokud uložené verze přesáhnou tento limit, aplikace smaže ty nejstarší, aby se do tohoto limitu vešla. Podrobnosti naleznete v dokumentaci k aplikaci Verze.",
+ "This application automatically maintains older versions of files that are changed." : "Tato aplikace automaticky uchovává starší verze souborů, které se změnily.",
+ "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Tato aplikace automaticky uchovává starší verze souborů, které se změnily. Když je zapnutá, je ve složce každého uživatele vytvořena skrytá složka pro verze a do ní jsou ukládány staré verze souborů. Uživatel se (prostřednictvím webového rozhraní) kdykoli může vrátit ke starší verzi s tím, že sám nahrazovaný nejnovější soubor se tak stane verzí. Aplikace automaticky spravuje složku s verzemi tak, aby bylo zajištěno, že uživatel kvůli starým verzím nevyčerpá přidělenou kvótu.\n\t\tKrom konců platností verzí, aplikace Verze zajišťuje, že nikdy nepoužije více než 50% právě dostupného volného prostoru, který má uživatel k dispozici. Pokud uložené verze přesáhnou tento limit, aplikace smaže ty nejstarší, aby se do tohoto limitu vešla. Podrobnosti naleznete v dokumentaci k aplikaci Verze.",
"Name this version" : "Nazvat tuto verzi",
"Edit version name" : "Upravit název verze",
"Restore version" : "Obnovit verzi",
@@ -19,7 +19,7 @@ OC.L10N.register(
"Could not set version name" : "Nedaří se nastavit název verze",
"Could not delete version" : "Nedaří se smazat verzi",
"${version.label} restored" : "${version.label} obnoveno",
- "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user’s directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user doesn’t run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user’s currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Tato aplikace automaticky uchovává starší verze souborů, které se mění. Když je zapnutá, je ve složce každého uživatele vytvořena skrytá složka pro verze a do ní jsou ukládány staré verze souborů. Uživatel se (prostřednictvím webového rozhraní) kdykoli může vrátit ke starším verzím s tím, že sám nahrazovaný nejnovější soubor se tak stane verzí. Aplikace automaticky spravuje složku s verzemi tak, aby bylo zajištěno, že uživatel kvůli starým verzím nevyčerpá přidělenou kvótu.\n\t\tKrom konců platností verzí, aplikace Verze zajišťuje, že nikdy nepoužije více než 50% volného prostoru, který má uživatel k dispozici. Pokud uložené verze přesáhnou tento limit, aplikace smaže ty nejstarší, aby se do tohoto limitu vešla. Podrobnosti naleznete v dokumentaci k aplikaci Verze.",
+ "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user’s directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user doesn’t run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user’s currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Tato aplikace automaticky uchovává starší verze souborů, které se změnily. Když je zapnutá, je ve složce každého uživatele vytvořena skrytá složka pro verze a do ní jsou ukládány staré verze souborů. Uživatel se (prostřednictvím webového rozhraní) kdykoli může vrátit ke starší verzi s tím, že sám nahrazovaný nejnovější soubor se tak stane verzí. Aplikace automaticky spravuje složku s verzemi tak, aby bylo zajištěno, že uživatel kvůli starým verzím nevyčerpá přidělenou kvótu.\n\t\tKrom konců platností verzí, aplikace Verze zajišťuje, že nikdy nepoužije více než 50% právě dostupného volného prostoru, který má uživatel k dispozici. Pokud uložené verze přesáhnou tento limit, aplikace smaže ty nejstarší, aby se do tohoto limitu vešla. Podrobnosti naleznete v dokumentaci k aplikaci Verze.",
"Failed to revert {file} to revision {timestamp}." : "Nepodařilo se vrátit {file} do stavu k {timestamp}.",
"_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtů","%n bajty"],
"Restore" : "Obnovit",
diff --git a/apps/files_versions/l10n/cs.json b/apps/files_versions/l10n/cs.json
index 20f54c6173b..2fabd66ddb2 100644
--- a/apps/files_versions/l10n/cs.json
+++ b/apps/files_versions/l10n/cs.json
@@ -1,7 +1,7 @@
{ "translations": {
"Versions" : "Verze",
- "This application automatically maintains older versions of files that are changed." : "Tato aplikace automaticky uchovává starší verze souborů, které se mění.",
- "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Tato aplikace automaticky uchovává starší verze souborů, které se mění. Když je zapnutá, je ve složce každého uživatele vytvořena skrytá složka pro verze a do ní jsou ukládány staré verze souborů. Uživatel se (prostřednictvím webového rozhraní) kdykoli může vrátit ke starším verzím s tím, že sám nahrazovaný nejnovější soubor se tak stane verzí. Aplikace automaticky spravuje složku s verzemi tak, aby bylo zajištěno, že uživatel kvůli starým verzím nevyčerpá přidělenou kvótu.\n\t\tKrom konců platností verzí, aplikace Verze zajišťuje, že nikdy nepoužije více než 50% volného prostoru, který má uživatel k dispozici. Pokud uložené verze přesáhnou tento limit, aplikace smaže ty nejstarší, aby se do tohoto limitu vešla. Podrobnosti naleznete v dokumentaci k aplikaci Verze.",
+ "This application automatically maintains older versions of files that are changed." : "Tato aplikace automaticky uchovává starší verze souborů, které se změnily.",
+ "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user's directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user does not run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user's currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Tato aplikace automaticky uchovává starší verze souborů, které se změnily. Když je zapnutá, je ve složce každého uživatele vytvořena skrytá složka pro verze a do ní jsou ukládány staré verze souborů. Uživatel se (prostřednictvím webového rozhraní) kdykoli může vrátit ke starší verzi s tím, že sám nahrazovaný nejnovější soubor se tak stane verzí. Aplikace automaticky spravuje složku s verzemi tak, aby bylo zajištěno, že uživatel kvůli starým verzím nevyčerpá přidělenou kvótu.\n\t\tKrom konců platností verzí, aplikace Verze zajišťuje, že nikdy nepoužije více než 50% právě dostupného volného prostoru, který má uživatel k dispozici. Pokud uložené verze přesáhnou tento limit, aplikace smaže ty nejstarší, aby se do tohoto limitu vešla. Podrobnosti naleznete v dokumentaci k aplikaci Verze.",
"Name this version" : "Nazvat tuto verzi",
"Edit version name" : "Upravit název verze",
"Restore version" : "Obnovit verzi",
@@ -17,7 +17,7 @@
"Could not set version name" : "Nedaří se nastavit název verze",
"Could not delete version" : "Nedaří se smazat verzi",
"${version.label} restored" : "${version.label} obnoveno",
- "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user’s directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user doesn’t run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user’s currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Tato aplikace automaticky uchovává starší verze souborů, které se mění. Když je zapnutá, je ve složce každého uživatele vytvořena skrytá složka pro verze a do ní jsou ukládány staré verze souborů. Uživatel se (prostřednictvím webového rozhraní) kdykoli může vrátit ke starším verzím s tím, že sám nahrazovaný nejnovější soubor se tak stane verzí. Aplikace automaticky spravuje složku s verzemi tak, aby bylo zajištěno, že uživatel kvůli starým verzím nevyčerpá přidělenou kvótu.\n\t\tKrom konců platností verzí, aplikace Verze zajišťuje, že nikdy nepoužije více než 50% volného prostoru, který má uživatel k dispozici. Pokud uložené verze přesáhnou tento limit, aplikace smaže ty nejstarší, aby se do tohoto limitu vešla. Podrobnosti naleznete v dokumentaci k aplikaci Verze.",
+ "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user’s directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user doesn’t run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user’s currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Tato aplikace automaticky uchovává starší verze souborů, které se změnily. Když je zapnutá, je ve složce každého uživatele vytvořena skrytá složka pro verze a do ní jsou ukládány staré verze souborů. Uživatel se (prostřednictvím webového rozhraní) kdykoli může vrátit ke starší verzi s tím, že sám nahrazovaný nejnovější soubor se tak stane verzí. Aplikace automaticky spravuje složku s verzemi tak, aby bylo zajištěno, že uživatel kvůli starým verzím nevyčerpá přidělenou kvótu.\n\t\tKrom konců platností verzí, aplikace Verze zajišťuje, že nikdy nepoužije více než 50% právě dostupného volného prostoru, který má uživatel k dispozici. Pokud uložené verze přesáhnou tento limit, aplikace smaže ty nejstarší, aby se do tohoto limitu vešla. Podrobnosti naleznete v dokumentaci k aplikaci Verze.",
"Failed to revert {file} to revision {timestamp}." : "Nepodařilo se vrátit {file} do stavu k {timestamp}.",
"_%n byte_::_%n bytes_" : ["%n bajt","%n bajty","%n bajtů","%n bajty"],
"Restore" : "Obnovit",
diff --git a/apps/settings/l10n/sr.js b/apps/settings/l10n/sr.js
index 652f74bb786..5e4a74f71cb 100644
--- a/apps/settings/l10n/sr.js
+++ b/apps/settings/l10n/sr.js
@@ -98,6 +98,7 @@ OC.L10N.register(
"Overview" : "Преглед",
"Basic settings" : "Основне поставке",
"Sharing" : "Дељење",
+ "Availability" : "Доступност",
"Calendar" : "Календар",
"Personal info" : "Лични подаци",
"Mobile & desktop" : "Мобилни и десктоп",
diff --git a/apps/settings/l10n/sr.json b/apps/settings/l10n/sr.json
index 49ad73b2ce9..2548e3fff2f 100644
--- a/apps/settings/l10n/sr.json
+++ b/apps/settings/l10n/sr.json
@@ -96,6 +96,7 @@
"Overview" : "Преглед",
"Basic settings" : "Основне поставке",
"Sharing" : "Дељење",
+ "Availability" : "Доступност",
"Calendar" : "Календар",
"Personal info" : "Лични подаци",
"Mobile & desktop" : "Мобилни и десктоп",
diff --git a/apps/systemtags/l10n/gl.js b/apps/systemtags/l10n/gl.js
index efc405123be..6e26fc899d5 100644
--- a/apps/systemtags/l10n/gl.js
+++ b/apps/systemtags/l10n/gl.js
@@ -43,6 +43,8 @@ OC.L10N.register(
"%s (invisible)" : "%s (invisíbel)",
"<strong>System tags</strong> for a file have been modified" : "Modificáronse as <strong>etiquetas de sistemas</strong> dun ficheio",
"Tags" : "Etiquetas",
+ "All tagged %s …" : "Todo etiquetado %s ...",
+ "tagged %s" : "etiquetado %s",
"Collaborative tags" : "Etiquetas colaborativas",
"Collaborative tagging functionality which shares tags among users." : "Funcionalidade de etiquetado colaborativo que comparte as etiquetas entre usuarios.",
"Collaborative tagging functionality which shares tags among users. Great for teams.\n\t(If you are a provider with a multi-tenancy installation, it is advised to deactivate this app as tags are shared.)" : "Funcionalidade de etiquetado colaborativo que comparte as etiquetas entre usuarios. Moi axeitado para equipos.\n(Se vostede é un provedor cunha instalación de varias instalacións, recoméndase desactivar esta aplicación xa que as etiquetas compártense).",
diff --git a/apps/systemtags/l10n/gl.json b/apps/systemtags/l10n/gl.json
index be6d9445c27..e90bbc81264 100644
--- a/apps/systemtags/l10n/gl.json
+++ b/apps/systemtags/l10n/gl.json
@@ -41,6 +41,8 @@
"%s (invisible)" : "%s (invisíbel)",
"<strong>System tags</strong> for a file have been modified" : "Modificáronse as <strong>etiquetas de sistemas</strong> dun ficheio",
"Tags" : "Etiquetas",
+ "All tagged %s …" : "Todo etiquetado %s ...",
+ "tagged %s" : "etiquetado %s",
"Collaborative tags" : "Etiquetas colaborativas",
"Collaborative tagging functionality which shares tags among users." : "Funcionalidade de etiquetado colaborativo que comparte as etiquetas entre usuarios.",
"Collaborative tagging functionality which shares tags among users. Great for teams.\n\t(If you are a provider with a multi-tenancy installation, it is advised to deactivate this app as tags are shared.)" : "Funcionalidade de etiquetado colaborativo que comparte as etiquetas entre usuarios. Moi axeitado para equipos.\n(Se vostede é un provedor cunha instalación de varias instalacións, recoméndase desactivar esta aplicación xa que as etiquetas compártense).",
diff --git a/apps/theming/l10n/he.js b/apps/theming/l10n/he.js
index 818e10706e5..bc20c9c3e08 100644
--- a/apps/theming/l10n/he.js
+++ b/apps/theming/l10n/he.js
@@ -22,6 +22,7 @@ OC.L10N.register(
"No file uploaded" : "לא הועלה קובץ",
"You are already using a custom theme. Theming app settings might be overwritten by that." : "כבר נעשה שימוש בערכת עיצוב מותאמת אישית. יכול להיות שהגדרות יישומון ערכות העיצוב יידרסו.",
"Theming" : "ערכות נושא",
+ "Appearance and accessibility" : "תצוגה ונגישות",
"Dark theme" : "ערכת עיצוב כהה",
"Enable dark theme" : "הפעלת ערכת עיצוב כהה",
"Dyslexia font" : "גופן דיסלקציה",
diff --git a/apps/theming/l10n/he.json b/apps/theming/l10n/he.json
index 601410e9e85..be71f8d4a30 100644
--- a/apps/theming/l10n/he.json
+++ b/apps/theming/l10n/he.json
@@ -20,6 +20,7 @@
"No file uploaded" : "לא הועלה קובץ",
"You are already using a custom theme. Theming app settings might be overwritten by that." : "כבר נעשה שימוש בערכת עיצוב מותאמת אישית. יכול להיות שהגדרות יישומון ערכות העיצוב יידרסו.",
"Theming" : "ערכות נושא",
+ "Appearance and accessibility" : "תצוגה ונגישות",
"Dark theme" : "ערכת עיצוב כהה",
"Enable dark theme" : "הפעלת ערכת עיצוב כהה",
"Dyslexia font" : "גופן דיסלקציה",
diff --git a/apps/theming/l10n/sr.js b/apps/theming/l10n/sr.js
index 42aed853125..b78cf69a3bf 100644
--- a/apps/theming/l10n/sr.js
+++ b/apps/theming/l10n/sr.js
@@ -61,6 +61,9 @@ OC.L10N.register(
"https://…" : "https://…",
"Login image" : "Пријавна слика",
"Upload new login background" : "Отпремите нову позадину за пријавни екран",
- "Install the Imagemagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Инсталирајте „Imagemagick“ ПХП екстензију са подршком за СВГ слике, да аутоматски направи иконе од отпремљеног логоа и боје."
+ "Install the Imagemagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Инсталирајте „Imagemagick“ ПХП екстензију са подршком за СВГ слике, да аутоматски направи иконе од отпремљеног логоа и боје.",
+ "Pick from Files" : "Изаберите из Фајлова",
+ "Plain background" : "Проста позадина",
+ "Insert from {productName}" : "Уметни из {productName}"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/apps/theming/l10n/sr.json b/apps/theming/l10n/sr.json
index 96fe9d9f06b..06007517e0b 100644
--- a/apps/theming/l10n/sr.json
+++ b/apps/theming/l10n/sr.json
@@ -59,6 +59,9 @@
"https://…" : "https://…",
"Login image" : "Пријавна слика",
"Upload new login background" : "Отпремите нову позадину за пријавни екран",
- "Install the Imagemagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Инсталирајте „Imagemagick“ ПХП екстензију са подршком за СВГ слике, да аутоматски направи иконе од отпремљеног логоа и боје."
+ "Install the Imagemagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Инсталирајте „Imagemagick“ ПХП екстензију са подршком за СВГ слике, да аутоматски направи иконе од отпремљеног логоа и боје.",
+ "Pick from Files" : "Изаберите из Фајлова",
+ "Plain background" : "Проста позадина",
+ "Insert from {productName}" : "Уметни из {productName}"
},"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);"
} \ No newline at end of file
diff --git a/build/integration/composer.lock b/build/integration/composer.lock
index 5be496a7919..8efe10e76c7 100644
--- a/build/integration/composer.lock
+++ b/build/integration/composer.lock
@@ -923,23 +923,23 @@
},
{
"name": "phpunit/php-code-coverage",
- "version": "9.2.23",
+ "version": "9.2.25",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c"
+ "reference": "0e2b40518197a8c0d4b08bc34dfff1c99c508954"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c",
- "reference": "9f1f0f9a2fbb680b26d1cf9b61b6eac43a6e4e9c",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/0e2b40518197a8c0d4b08bc34dfff1c99c508954",
+ "reference": "0e2b40518197a8c0d4b08bc34dfff1c99c508954",
"shasum": ""
},
"require": {
"ext-dom": "*",
"ext-libxml": "*",
"ext-xmlwriter": "*",
- "nikic/php-parser": "^4.14",
+ "nikic/php-parser": "^4.15",
"php": ">=7.3",
"phpunit/php-file-iterator": "^3.0.3",
"phpunit/php-text-template": "^2.0.2",
@@ -988,7 +988,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
- "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.23"
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.25"
},
"funding": [
{
@@ -996,7 +996,7 @@
"type": "github"
}
],
- "time": "2022-12-28T12:41:10+00:00"
+ "time": "2023-02-25T05:32:00+00:00"
},
{
"name": "phpunit/php-file-iterator",
@@ -1241,16 +1241,16 @@
},
{
"name": "phpunit/phpunit",
- "version": "9.5.28",
+ "version": "9.6.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "954ca3113a03bf780d22f07bf055d883ee04b65e"
+ "reference": "9125ee085b6d95e78277dc07aa1f46f9e0607b8d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/954ca3113a03bf780d22f07bf055d883ee04b65e",
- "reference": "954ca3113a03bf780d22f07bf055d883ee04b65e",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9125ee085b6d95e78277dc07aa1f46f9e0607b8d",
+ "reference": "9125ee085b6d95e78277dc07aa1f46f9e0607b8d",
"shasum": ""
},
"require": {
@@ -1292,7 +1292,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "9.5-dev"
+ "dev-master": "9.6-dev"
}
},
"autoload": {
@@ -1323,7 +1323,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
- "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.28"
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.4"
},
"funding": [
{
@@ -1339,7 +1339,7 @@
"type": "tidelift"
}
],
- "time": "2023-01-14T12:32:24+00:00"
+ "time": "2023-02-27T13:06:37+00:00"
},
{
"name": "psr/container",
@@ -2504,16 +2504,16 @@
},
{
"name": "sebastian/environment",
- "version": "5.1.4",
+ "version": "5.1.5",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
- "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7"
+ "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7",
- "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
+ "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
"shasum": ""
},
"require": {
@@ -2555,7 +2555,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/environment/issues",
- "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4"
+ "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5"
},
"funding": [
{
@@ -2563,7 +2563,7 @@
"type": "github"
}
],
- "time": "2022-04-03T09:37:03+00:00"
+ "time": "2023-02-03T06:03:51+00:00"
},
{
"name": "sebastian/exporter",
@@ -2877,16 +2877,16 @@
},
{
"name": "sebastian/recursion-context",
- "version": "4.0.4",
+ "version": "4.0.5",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/recursion-context.git",
- "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172"
+ "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172",
- "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1",
+ "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1",
"shasum": ""
},
"require": {
@@ -2925,10 +2925,10 @@
}
],
"description": "Provides functionality to recursively process PHP variables",
- "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "homepage": "https://github.com/sebastianbergmann/recursion-context",
"support": {
"issues": "https://github.com/sebastianbergmann/recursion-context/issues",
- "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4"
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5"
},
"funding": [
{
@@ -2936,7 +2936,7 @@
"type": "github"
}
],
- "time": "2020-10-26T13:17:30+00:00"
+ "time": "2023-02-03T06:07:39+00:00"
},
{
"name": "sebastian/resource-operations",
@@ -2995,16 +2995,16 @@
},
{
"name": "sebastian/type",
- "version": "3.2.0",
+ "version": "3.2.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/type.git",
- "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e"
+ "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e",
- "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
+ "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
"shasum": ""
},
"require": {
@@ -3039,7 +3039,7 @@
"homepage": "https://github.com/sebastianbergmann/type",
"support": {
"issues": "https://github.com/sebastianbergmann/type/issues",
- "source": "https://github.com/sebastianbergmann/type/tree/3.2.0"
+ "source": "https://github.com/sebastianbergmann/type/tree/3.2.1"
},
"funding": [
{
@@ -3047,7 +3047,7 @@
"type": "github"
}
],
- "time": "2022-09-12T14:47:03+00:00"
+ "time": "2023-02-03T06:13:03+00:00"
},
{
"name": "sebastian/version",
@@ -3438,16 +3438,16 @@
},
{
"name": "symfony/event-dispatcher",
- "version": "v5.4.9",
+ "version": "v5.4.19",
"source": {
"type": "git",
"url": "https://github.com/symfony/event-dispatcher.git",
- "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc"
+ "reference": "abf49cc084c087d94b4cb939c3f3672971784e0c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc",
- "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/abf49cc084c087d94b4cb939c3f3672971784e0c",
+ "reference": "abf49cc084c087d94b4cb939c3f3672971784e0c",
"shasum": ""
},
"require": {
@@ -3503,7 +3503,7 @@
"description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.9"
+ "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.19"
},
"funding": [
{
@@ -3519,7 +3519,7 @@
"type": "tidelift"
}
],
- "time": "2022-05-05T16:45:39+00:00"
+ "time": "2023-01-01T08:32:19+00:00"
},
{
"name": "symfony/event-dispatcher-contracts",
diff --git a/core/Command/Db/Migrations/GenerateCommand.php b/core/Command/Db/Migrations/GenerateCommand.php
index aa93adaebb4..dc9eb267938 100644
--- a/core/Command/Db/Migrations/GenerateCommand.php
+++ b/core/Command/Db/Migrations/GenerateCommand.php
@@ -99,7 +99,7 @@ class {{classname}} extends SimpleMigrationStep {
/**
* @param IOutput $output
* @param Closure(): ISchemaWrapper $schemaClosure
-g * @param array $options
+ * @param array $options
*/
public function postSchemaChange(IOutput $output, Closure $schemaClosure, array $options): void {
}
diff --git a/core/Controller/ClientFlowLoginV2Controller.php b/core/Controller/ClientFlowLoginV2Controller.php
index 613829787b4..ef16cfbd04b 100644
--- a/core/Controller/ClientFlowLoginV2Controller.php
+++ b/core/Controller/ClientFlowLoginV2Controller.php
@@ -187,7 +187,7 @@ class ClientFlowLoginV2Controller extends Controller {
*/
public function apptokenRedirect(?string $stateToken, string $user, string $password) {
if ($stateToken === null) {
- return $this->loginTokenForbiddenResponse();
+ return $this->stateTokenMissingResponse();
}
if (!$this->isValidStateToken($stateToken)) {
diff --git a/core/Controller/TranslationApiController.php b/core/Controller/TranslationApiController.php
new file mode 100644
index 00000000000..4927b7a2be5
--- /dev/null
+++ b/core/Controller/TranslationApiController.php
@@ -0,0 +1,66 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright Copyright (c) 2022 Julius Härtl <jus@bitgrid.net>
+ *
+ * @author Julius Härtl <jus@bitgrid.net>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+namespace OC\Core\Controller;
+
+use InvalidArgumentException;
+use OCP\AppFramework\Http;
+use OCP\AppFramework\Http\DataResponse;
+use OCP\IRequest;
+use OCP\PreConditionNotMetException;
+use OCP\Translation\ITranslationManager;
+use RuntimeException;
+
+class TranslationApiController extends \OCP\AppFramework\OCSController {
+ private ITranslationManager $translationManager;
+
+ public function __construct($appName, IRequest $request, ITranslationManager $translationManager) {
+ parent::__construct($appName, $request);
+
+ $this->translationManager = $translationManager;
+ }
+
+ public function languages(): DataResponse {
+ return new DataResponse([
+ 'languages' => $this->translationManager->getLanguages(),
+ 'languageDetection' => $this->translationManager->canDetectLanguage(),
+ ]);
+ }
+
+ public function translate(string $text, ?string $fromLanguage, string $toLanguage): DataResponse {
+ try {
+ return new DataResponse([
+ 'text' => $this->translationManager->translate($text, $fromLanguage, $toLanguage)
+ ]);
+ } catch (PreConditionNotMetException) {
+ return new DataResponse(['message' => 'No translation provider available'], Http::STATUS_PRECONDITION_FAILED);
+ } catch (InvalidArgumentException) {
+ return new DataResponse(['message' => 'Could not detect language', Http::STATUS_NOT_FOUND]);
+ } catch (RuntimeException) {
+ return new DataResponse(['message' => 'Unable to translate', Http::STATUS_INTERNAL_SERVER_ERROR]);
+ }
+ }
+}
diff --git a/core/l10n/de.js b/core/l10n/de.js
index c9282d21606..d91f84f3cd7 100644
--- a/core/l10n/de.js
+++ b/core/l10n/de.js
@@ -256,7 +256,6 @@ OC.L10N.register(
"Show list view" : "Listenansicht anzeigen",
"Show grid view" : "Rasteransicht anzeigen",
"Pending" : "Ausstehend",
- "Home" : "Benötigt keine Übersetzung. Hier wird nur die formelle Übersetzung verwendet (de_DE).",
"Copy to {folder}" : "Kopieren nach {folder}",
"Move to {folder}" : "Verschieben nach {folder}",
"Saving …" : "Speichern …",
diff --git a/core/l10n/de.json b/core/l10n/de.json
index 96e9a2d339b..9e82ccb1805 100644
--- a/core/l10n/de.json
+++ b/core/l10n/de.json
@@ -254,7 +254,6 @@
"Show list view" : "Listenansicht anzeigen",
"Show grid view" : "Rasteransicht anzeigen",
"Pending" : "Ausstehend",
- "Home" : "Benötigt keine Übersetzung. Hier wird nur die formelle Übersetzung verwendet (de_DE).",
"Copy to {folder}" : "Kopieren nach {folder}",
"Move to {folder}" : "Verschieben nach {folder}",
"Saving …" : "Speichern …",
diff --git a/core/l10n/he.js b/core/l10n/he.js
index b42485907a9..afb66c04ab0 100644
--- a/core/l10n/he.js
+++ b/core/l10n/he.js
@@ -106,6 +106,7 @@ OC.L10N.register(
"Please try again or contact your administrator." : "יש לנסות שוב ליצור קשר עם המנהל שלך.",
"Account name or email" : "שם משתמש או דואר אלקטרוני",
"Password" : "ססמה",
+ "Log in to {productName}" : "כניסה ל[productName]",
"Wrong username or password." : "שם המשתמש או הססמה שגויים.",
"User disabled" : "משתמש מושבת",
"We have detected multiple invalid login attempts from your IP. Therefore your next login is throttled up to 30 seconds." : "זיהינו מספר ניסיונות כניסה שגויים מכתובת ה־IP שלך. לכן, ניסיון הכניסה הבא יתאפשר עבורך רק בעוד 30 שניות.",
diff --git a/core/l10n/he.json b/core/l10n/he.json
index 3cdab0604cf..def092221d7 100644
--- a/core/l10n/he.json
+++ b/core/l10n/he.json
@@ -104,6 +104,7 @@
"Please try again or contact your administrator." : "יש לנסות שוב ליצור קשר עם המנהל שלך.",
"Account name or email" : "שם משתמש או דואר אלקטרוני",
"Password" : "ססמה",
+ "Log in to {productName}" : "כניסה ל[productName]",
"Wrong username or password." : "שם המשתמש או הססמה שגויים.",
"User disabled" : "משתמש מושבת",
"We have detected multiple invalid login attempts from your IP. Therefore your next login is throttled up to 30 seconds." : "זיהינו מספר ניסיונות כניסה שגויים מכתובת ה־IP שלך. לכן, ניסיון הכניסה הבא יתאפשר עבורך רק בעוד 30 שניות.",
diff --git a/core/l10n/pt_PT.js b/core/l10n/pt_PT.js
index 2437d074964..a44f8939522 100644
--- a/core/l10n/pt_PT.js
+++ b/core/l10n/pt_PT.js
@@ -25,11 +25,15 @@ OC.L10N.register(
"State token does not match" : "O token de estado não corresponde",
"Invalid app password" : "Palavra-passe de aplicação inválida",
"Could not complete login" : "Não foi possível fazer login",
+ "State token missing" : "O token da sessão está em falta",
"Your login token is invalid or has expired" : "O seu token de login é inválido ou expirou",
+ "This community release of Nextcloud is unsupported and push notifications are limited." : "A versão comunitária da Nextcloud não tem suporte e as notificações a pedido são limitadas.",
"Login" : "Iniciar sessão",
+ "Please try again" : "Por favor tente novamente",
"Password reset is disabled" : "A reposição da senha está desativada",
"Could not reset password because the token is expired" : "Não foi possível redefinir a palavra-passe porque o token expirou",
"Could not reset password because the token is invalid" : "Não foi possível redefinir a palavra-passe porque o token é inválido",
+ "Password is too long. Maximum allowed length is 469 characters." : "A senha é muito longa. O comprimento máximo permitido é de 469 caracteres.",
"%s password reset" : "%s reposição de palavra-passe",
"Password reset" : "Reposição da senha",
"Click the following button to reset your password. If you have not requested the password reset, then ignore this email." : "Clique no seguinte botão para repor a sua senha. Se não solicitou a reposição da senha, ignore este e-mail.",
@@ -143,12 +147,21 @@ OC.L10N.register(
"Edit Profile" : "Editar perfil",
"You have not added any info yet" : "Ainda não adicionou qualquer informação ",
"Reset search" : "Redefinir pesquisa",
+ "Start search" : "Inicie a pesquisa",
"Search for {name} only" : "Pesquisar apenas por {name}",
"No results for {query}" : "Nenhum resultado para {query}",
+ "Press enter to start searching" : "Pressione ENTER para iniciar a pesquisa",
"Start typing to search" : "Digitar para pesquisar",
"Loading more results …" : "A carregar mais resultados...",
"Load more results" : "Mostrar mais resultados...",
"Search" : "Procurar",
+ "An error occurred while searching for {type}" : "Ocorreu um erro enquanto pesquisava por {type}",
+ "This browser is not supported" : "O seu navegador não é suportado.",
+ "Your browser is not supported. Please upgrade to a newer version or a supported one." : "A versão do seu navegador não é suportada. Por favor atualize para uma versão mais recente ou para uma que seja suportada.",
+ "Continue with this unsupported browser" : "Continuar com uma versão não suportada do navegador",
+ "Supported versions" : "Versões suportadas",
+ "{name} version {version} and above" : "{name} versão {version} e superior",
+ "Open settings menu" : "Abrir o menu das configurações",
"Settings menu" : "Menu de configurações",
"Search {types} …" : "Pesquisar {types}...",
"Settings" : "Definições",
@@ -239,6 +252,7 @@ OC.L10N.register(
"The profile does not exist." : "O perfil não existe.",
"Back to %s" : "Voltar a %s",
"Page not found" : "Página não encontrada",
+ "The page could not be found on the server." : "Esta página não foi encontrada no servidor.",
"Too many requests" : "Muitos pedidos",
"Error" : "Erro",
"Previous" : "Anterior",
diff --git a/core/l10n/pt_PT.json b/core/l10n/pt_PT.json
index 217eed6f83f..a1a48dcea05 100644
--- a/core/l10n/pt_PT.json
+++ b/core/l10n/pt_PT.json
@@ -23,11 +23,15 @@
"State token does not match" : "O token de estado não corresponde",
"Invalid app password" : "Palavra-passe de aplicação inválida",
"Could not complete login" : "Não foi possível fazer login",
+ "State token missing" : "O token da sessão está em falta",
"Your login token is invalid or has expired" : "O seu token de login é inválido ou expirou",
+ "This community release of Nextcloud is unsupported and push notifications are limited." : "A versão comunitária da Nextcloud não tem suporte e as notificações a pedido são limitadas.",
"Login" : "Iniciar sessão",
+ "Please try again" : "Por favor tente novamente",
"Password reset is disabled" : "A reposição da senha está desativada",
"Could not reset password because the token is expired" : "Não foi possível redefinir a palavra-passe porque o token expirou",
"Could not reset password because the token is invalid" : "Não foi possível redefinir a palavra-passe porque o token é inválido",
+ "Password is too long. Maximum allowed length is 469 characters." : "A senha é muito longa. O comprimento máximo permitido é de 469 caracteres.",
"%s password reset" : "%s reposição de palavra-passe",
"Password reset" : "Reposição da senha",
"Click the following button to reset your password. If you have not requested the password reset, then ignore this email." : "Clique no seguinte botão para repor a sua senha. Se não solicitou a reposição da senha, ignore este e-mail.",
@@ -141,12 +145,21 @@
"Edit Profile" : "Editar perfil",
"You have not added any info yet" : "Ainda não adicionou qualquer informação ",
"Reset search" : "Redefinir pesquisa",
+ "Start search" : "Inicie a pesquisa",
"Search for {name} only" : "Pesquisar apenas por {name}",
"No results for {query}" : "Nenhum resultado para {query}",
+ "Press enter to start searching" : "Pressione ENTER para iniciar a pesquisa",
"Start typing to search" : "Digitar para pesquisar",
"Loading more results …" : "A carregar mais resultados...",
"Load more results" : "Mostrar mais resultados...",
"Search" : "Procurar",
+ "An error occurred while searching for {type}" : "Ocorreu um erro enquanto pesquisava por {type}",
+ "This browser is not supported" : "O seu navegador não é suportado.",
+ "Your browser is not supported. Please upgrade to a newer version or a supported one." : "A versão do seu navegador não é suportada. Por favor atualize para uma versão mais recente ou para uma que seja suportada.",
+ "Continue with this unsupported browser" : "Continuar com uma versão não suportada do navegador",
+ "Supported versions" : "Versões suportadas",
+ "{name} version {version} and above" : "{name} versão {version} e superior",
+ "Open settings menu" : "Abrir o menu das configurações",
"Settings menu" : "Menu de configurações",
"Search {types} …" : "Pesquisar {types}...",
"Settings" : "Definições",
@@ -237,6 +250,7 @@
"The profile does not exist." : "O perfil não existe.",
"Back to %s" : "Voltar a %s",
"Page not found" : "Página não encontrada",
+ "The page could not be found on the server." : "Esta página não foi encontrada no servidor.",
"Too many requests" : "Muitos pedidos",
"Error" : "Erro",
"Previous" : "Anterior",
diff --git a/core/l10n/sl.js b/core/l10n/sl.js
index 18d170e2a3c..883b5b0319d 100644
--- a/core/l10n/sl.js
+++ b/core/l10n/sl.js
@@ -353,9 +353,9 @@ OC.L10N.register(
"Skip to main content" : "Preskoči na glavno vsebino",
"Skip to navigation of app" : "Preskoči na program za krmarjenje",
"Get your own free account" : "Pridobite brezplačni račun",
- "%s homepage" : "Spletna stran osebe %s",
+ "%s homepage" : "Spletna stran %s",
"Confirm your password" : "Potrdite geslo",
- "%s's homepage" : "%s domača stran",
+ "%s's homepage" : "Spletna stran osebe %s",
"Connect to your account" : "Povežite z računom",
"Please log in before granting %1$s access to your %2$s account." : "Pred %1$s odobritvijo dostopa %2$s do računa se je treba prijaviti.",
"If you are not trying to set up a new device or app, someone is trying to trick you into granting them access to your data. In this case do not proceed and instead contact your system administrator." : "Če ne poskušate dodati naprave ali programa, vas poskuša nekdo pretentati v odobritev dostopa do vaših podatkov. Če se vam zdi, da je tako, ne nadaljujte s potrjevanjem, ampak stopite v stik s skrbnikom sistema.",
@@ -363,7 +363,7 @@ OC.L10N.register(
"Grant access" : "Odobri dostop",
"Alternative log in using app token" : "Alternativni način prijave z uporabo programskega žetona",
"Account access" : "Dostop do računa",
- "Currently logged in as %1$s (%2$s)." : "Trenutno prijavljen kot %1$s (%2$s)",
+ "Currently logged in as %1$s (%2$s)." : "Dejavna je prijava %1$s (%2$s)",
"You are about to grant %1$s access to your %2$s account." : "Računu %1$s boste omogočili dostop do vašega računa %2$s.",
"Account connected" : "Račun je povezan",
"Your client should now be connected!" : "Odjemalec naj bi bil sedaj povezan!",
diff --git a/core/l10n/sl.json b/core/l10n/sl.json
index 8ebf502c0ec..f2fa0294621 100644
--- a/core/l10n/sl.json
+++ b/core/l10n/sl.json
@@ -351,9 +351,9 @@
"Skip to main content" : "Preskoči na glavno vsebino",
"Skip to navigation of app" : "Preskoči na program za krmarjenje",
"Get your own free account" : "Pridobite brezplačni račun",
- "%s homepage" : "Spletna stran osebe %s",
+ "%s homepage" : "Spletna stran %s",
"Confirm your password" : "Potrdite geslo",
- "%s's homepage" : "%s domača stran",
+ "%s's homepage" : "Spletna stran osebe %s",
"Connect to your account" : "Povežite z računom",
"Please log in before granting %1$s access to your %2$s account." : "Pred %1$s odobritvijo dostopa %2$s do računa se je treba prijaviti.",
"If you are not trying to set up a new device or app, someone is trying to trick you into granting them access to your data. In this case do not proceed and instead contact your system administrator." : "Če ne poskušate dodati naprave ali programa, vas poskuša nekdo pretentati v odobritev dostopa do vaših podatkov. Če se vam zdi, da je tako, ne nadaljujte s potrjevanjem, ampak stopite v stik s skrbnikom sistema.",
@@ -361,7 +361,7 @@
"Grant access" : "Odobri dostop",
"Alternative log in using app token" : "Alternativni način prijave z uporabo programskega žetona",
"Account access" : "Dostop do računa",
- "Currently logged in as %1$s (%2$s)." : "Trenutno prijavljen kot %1$s (%2$s)",
+ "Currently logged in as %1$s (%2$s)." : "Dejavna je prijava %1$s (%2$s)",
"You are about to grant %1$s access to your %2$s account." : "Računu %1$s boste omogočili dostop do vašega računa %2$s.",
"Account connected" : "Račun je povezan",
"Your client should now be connected!" : "Odjemalec naj bi bil sedaj povezan!",
diff --git a/core/routes.php b/core/routes.php
index dcf8e4024af..0f9729e54eb 100644
--- a/core/routes.php
+++ b/core/routes.php
@@ -143,6 +143,8 @@ $application->registerRoutes($this, [
['root' => '/search', 'name' => 'UnifiedSearch#getProviders', 'url' => '/providers', 'verb' => 'GET'],
['root' => '/search', 'name' => 'UnifiedSearch#search', 'url' => '/providers/{providerId}/search', 'verb' => 'GET'],
+ ['root' => '/translation', 'name' => 'TranslationApi#languages', 'url' => '/languages', 'verb' => 'GET'],
+ ['root' => '/translation', 'name' => 'TranslationApi#translate', 'url' => '/translate', 'verb' => 'POST'],
],
]);
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php
index fcb65afd36e..080bde60715 100644
--- a/lib/composer/composer/autoload_classmap.php
+++ b/lib/composer/composer/autoload_classmap.php
@@ -590,6 +590,10 @@ return array(
'OCP\\Talk\\IConversationOptions' => $baseDir . '/lib/public/Talk/IConversationOptions.php',
'OCP\\Talk\\ITalkBackend' => $baseDir . '/lib/public/Talk/ITalkBackend.php',
'OCP\\Template' => $baseDir . '/lib/public/Template.php',
+ 'OCP\\Translation\\IDetectLanguageProvider' => $baseDir . '/lib/public/Translation/IDetectLanguageProvider.php',
+ 'OCP\\Translation\\ITranslationManager' => $baseDir . '/lib/public/Translation/ITranslationManager.php',
+ 'OCP\\Translation\\ITranslationProvider' => $baseDir . '/lib/public/Translation/ITranslationProvider.php',
+ 'OCP\\Translation\\LanguageTuple' => $baseDir . '/lib/public/Translation/LanguageTuple.php',
'OCP\\UserInterface' => $baseDir . '/lib/public/UserInterface.php',
'OCP\\UserMigration\\IExportDestination' => $baseDir . '/lib/public/UserMigration/IExportDestination.php',
'OCP\\UserMigration\\IImportSource' => $baseDir . '/lib/public/UserMigration/IImportSource.php',
@@ -1005,6 +1009,7 @@ return array(
'OC\\Core\\Controller\\ReferenceController' => $baseDir . '/core/Controller/ReferenceController.php',
'OC\\Core\\Controller\\SearchController' => $baseDir . '/core/Controller/SearchController.php',
'OC\\Core\\Controller\\SetupController' => $baseDir . '/core/Controller/SetupController.php',
+ 'OC\\Core\\Controller\\TranslationApiController' => $baseDir . '/core/Controller/TranslationApiController.php',
'OC\\Core\\Controller\\TwoFactorChallengeController' => $baseDir . '/core/Controller/TwoFactorChallengeController.php',
'OC\\Core\\Controller\\UnifiedSearchController' => $baseDir . '/core/Controller/UnifiedSearchController.php',
'OC\\Core\\Controller\\UnsupportedBrowserController' => $baseDir . '/core/Controller/UnsupportedBrowserController.php',
@@ -1598,6 +1603,7 @@ return array(
'OC\\Template\\ResourceLocator' => $baseDir . '/lib/private/Template/ResourceLocator.php',
'OC\\Template\\ResourceNotFoundException' => $baseDir . '/lib/private/Template/ResourceNotFoundException.php',
'OC\\Template\\TemplateFileLocator' => $baseDir . '/lib/private/Template/TemplateFileLocator.php',
+ 'OC\\Translation\\TranslationManager' => $baseDir . '/lib/private/Translation/TranslationManager.php',
'OC\\URLGenerator' => $baseDir . '/lib/private/URLGenerator.php',
'OC\\Updater' => $baseDir . '/lib/private/Updater.php',
'OC\\Updater\\ChangesCheck' => $baseDir . '/lib/private/Updater/ChangesCheck.php',
diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php
index 708f35048f4..2ec47c2b842 100644
--- a/lib/composer/composer/autoload_static.php
+++ b/lib/composer/composer/autoload_static.php
@@ -623,6 +623,10 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OCP\\Talk\\IConversationOptions' => __DIR__ . '/../../..' . '/lib/public/Talk/IConversationOptions.php',
'OCP\\Talk\\ITalkBackend' => __DIR__ . '/../../..' . '/lib/public/Talk/ITalkBackend.php',
'OCP\\Template' => __DIR__ . '/../../..' . '/lib/public/Template.php',
+ 'OCP\\Translation\\IDetectLanguageProvider' => __DIR__ . '/../../..' . '/lib/public/Translation/IDetectLanguageProvider.php',
+ 'OCP\\Translation\\ITranslationManager' => __DIR__ . '/../../..' . '/lib/public/Translation/ITranslationManager.php',
+ 'OCP\\Translation\\ITranslationProvider' => __DIR__ . '/../../..' . '/lib/public/Translation/ITranslationProvider.php',
+ 'OCP\\Translation\\LanguageTuple' => __DIR__ . '/../../..' . '/lib/public/Translation/LanguageTuple.php',
'OCP\\UserInterface' => __DIR__ . '/../../..' . '/lib/public/UserInterface.php',
'OCP\\UserMigration\\IExportDestination' => __DIR__ . '/../../..' . '/lib/public/UserMigration/IExportDestination.php',
'OCP\\UserMigration\\IImportSource' => __DIR__ . '/../../..' . '/lib/public/UserMigration/IImportSource.php',
@@ -1038,6 +1042,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OC\\Core\\Controller\\ReferenceController' => __DIR__ . '/../../..' . '/core/Controller/ReferenceController.php',
'OC\\Core\\Controller\\SearchController' => __DIR__ . '/../../..' . '/core/Controller/SearchController.php',
'OC\\Core\\Controller\\SetupController' => __DIR__ . '/../../..' . '/core/Controller/SetupController.php',
+ 'OC\\Core\\Controller\\TranslationApiController' => __DIR__ . '/../../..' . '/core/Controller/TranslationApiController.php',
'OC\\Core\\Controller\\TwoFactorChallengeController' => __DIR__ . '/../../..' . '/core/Controller/TwoFactorChallengeController.php',
'OC\\Core\\Controller\\UnifiedSearchController' => __DIR__ . '/../../..' . '/core/Controller/UnifiedSearchController.php',
'OC\\Core\\Controller\\UnsupportedBrowserController' => __DIR__ . '/../../..' . '/core/Controller/UnsupportedBrowserController.php',
@@ -1631,6 +1636,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OC\\Template\\ResourceLocator' => __DIR__ . '/../../..' . '/lib/private/Template/ResourceLocator.php',
'OC\\Template\\ResourceNotFoundException' => __DIR__ . '/../../..' . '/lib/private/Template/ResourceNotFoundException.php',
'OC\\Template\\TemplateFileLocator' => __DIR__ . '/../../..' . '/lib/private/Template/TemplateFileLocator.php',
+ 'OC\\Translation\\TranslationManager' => __DIR__ . '/../../..' . '/lib/private/Translation/TranslationManager.php',
'OC\\URLGenerator' => __DIR__ . '/../../..' . '/lib/private/URLGenerator.php',
'OC\\Updater' => __DIR__ . '/../../..' . '/lib/private/Updater.php',
'OC\\Updater\\ChangesCheck' => __DIR__ . '/../../..' . '/lib/private/Updater/ChangesCheck.php',
diff --git a/lib/l10n/he.js b/lib/l10n/he.js
index 751bb439af2..0083a0b8137 100644
--- a/lib/l10n/he.js
+++ b/lib/l10n/he.js
@@ -58,6 +58,7 @@ OC.L10N.register(
"__language_name__" : "עברית",
"This is an automatically sent email, please do not reply." : "זו הודעת דוא״ל שנשלחה אוטומטית, נא לא להגיב.",
"Help" : "עזרה",
+ "Appearance and accessibility" : "תצוגה ונגישות",
"Apps" : "יישומים",
"Settings" : "הגדרות",
"Log out" : "התנתק",
diff --git a/lib/l10n/he.json b/lib/l10n/he.json
index bd9564b4afb..00669ae4a65 100644
--- a/lib/l10n/he.json
+++ b/lib/l10n/he.json
@@ -56,6 +56,7 @@
"__language_name__" : "עברית",
"This is an automatically sent email, please do not reply." : "זו הודעת דוא״ל שנשלחה אוטומטית, נא לא להגיב.",
"Help" : "עזרה",
+ "Appearance and accessibility" : "תצוגה ונגישות",
"Apps" : "יישומים",
"Settings" : "הגדרות",
"Log out" : "התנתק",
diff --git a/lib/l10n/pt_PT.js b/lib/l10n/pt_PT.js
index c78eb54f2a8..6feac8ba683 100644
--- a/lib/l10n/pt_PT.js
+++ b/lib/l10n/pt_PT.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"See %s" : "Ver %s",
"Sample configuration detected" : "Detetado exemplo de configuração",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Foi detectado que a configuração de amostra foi copiada. Isso pode danificar a sua instalação e não é suportado. Por favor, leia a documentação antes de realizar mudanças no config.php",
+ "The page could not be found on the server." : "Esta página não foi encontrada no servidor.",
"Email verification" : "Verificação de e-mail",
"Click the following button to confirm your email." : "Clique no botão a seguir para confirmar o seu e-mail.",
"Click the following link to confirm your email." : "Clique na hiperligação a seguir para confirmar o seu e-mail.",
diff --git a/lib/l10n/pt_PT.json b/lib/l10n/pt_PT.json
index 7e2cb2e11c4..5cef4e2deb8 100644
--- a/lib/l10n/pt_PT.json
+++ b/lib/l10n/pt_PT.json
@@ -3,6 +3,7 @@
"See %s" : "Ver %s",
"Sample configuration detected" : "Detetado exemplo de configuração",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Foi detectado que a configuração de amostra foi copiada. Isso pode danificar a sua instalação e não é suportado. Por favor, leia a documentação antes de realizar mudanças no config.php",
+ "The page could not be found on the server." : "Esta página não foi encontrada no servidor.",
"Email verification" : "Verificação de e-mail",
"Click the following button to confirm your email." : "Clique no botão a seguir para confirmar o seu e-mail.",
"Click the following link to confirm your email." : "Clique na hiperligação a seguir para confirmar o seu e-mail.",
diff --git a/lib/l10n/sr.js b/lib/l10n/sr.js
index 4a226286275..29516259b42 100644
--- a/lib/l10n/sr.js
+++ b/lib/l10n/sr.js
@@ -70,6 +70,7 @@ OC.L10N.register(
"Empty file" : "Празан фајл",
"Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Модул са идентификацијом: %s не постоји. Омогућите га у подешавањима апликација или контактирајте администратора.",
"File already exists" : "Фајл већ постоји",
+ "Templates" : "Шаблони",
"File name is a reserved word" : "Назив фајла је резервисана реч",
"File name contains at least one invalid character" : "Назив фајла садржи бар један недозвољен знак",
"File name is too long" : "Назив фајла је предугачак",
diff --git a/lib/l10n/sr.json b/lib/l10n/sr.json
index 46daac88650..d68b75389fc 100644
--- a/lib/l10n/sr.json
+++ b/lib/l10n/sr.json
@@ -68,6 +68,7 @@
"Empty file" : "Празан фајл",
"Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Модул са идентификацијом: %s не постоји. Омогућите га у подешавањима апликација или контактирајте администратора.",
"File already exists" : "Фајл већ постоји",
+ "Templates" : "Шаблони",
"File name is a reserved word" : "Назив фајла је резервисана реч",
"File name contains at least one invalid character" : "Назив фајла садржи бар један недозвољен знак",
"File name is too long" : "Назив фајла је предугачак",
diff --git a/lib/private/AppFramework/Bootstrap/RegistrationContext.php b/lib/private/AppFramework/Bootstrap/RegistrationContext.php
index a78a895d029..9a6c298419a 100644
--- a/lib/private/AppFramework/Bootstrap/RegistrationContext.php
+++ b/lib/private/AppFramework/Bootstrap/RegistrationContext.php
@@ -34,6 +34,7 @@ use OCP\Calendar\Resource\IBackend as IResourceBackend;
use OCP\Calendar\Room\IBackend as IRoomBackend;
use OCP\Collaboration\Reference\IReferenceProvider;
use OCP\Talk\ITalkBackend;
+use OCP\Translation\ITranslationProvider;
use RuntimeException;
use function array_shift;
use OC\Support\CrashReport\Registry;
@@ -113,6 +114,9 @@ class RegistrationContext {
/** @var ServiceRegistration<ICustomTemplateProvider>[] */
private $templateProviders = [];
+ /** @var ServiceRegistration<ITranslationProvider>[] */
+ private $translationProviders = [];
+
/** @var ServiceRegistration<INotifier>[] */
private $notifierServices = [];
@@ -125,6 +129,9 @@ class RegistrationContext {
/** @var ServiceRegistration<IReferenceProvider>[] */
private array $referenceProviders = [];
+
+
+
/** @var ParameterRegistration[] */
private $sensitiveMethods = [];
@@ -252,6 +259,13 @@ class RegistrationContext {
);
}
+ public function registerTranslationProvider(string $providerClass): void {
+ $this->context->registerTranslationProvider(
+ $this->appId,
+ $providerClass
+ );
+ }
+
public function registerNotifierService(string $notifierClass): void {
$this->context->registerNotifierService(
$this->appId,
@@ -404,6 +418,10 @@ class RegistrationContext {
$this->templateProviders[] = new ServiceRegistration($appId, $class);
}
+ public function registerTranslationProvider(string $appId, string $class): void {
+ $this->translationProviders[] = new ServiceRegistration($appId, $class);
+ }
+
public function registerNotifierService(string $appId, string $class): void {
$this->notifierServices[] = new ServiceRegistration($appId, $class);
}
@@ -675,6 +693,13 @@ class RegistrationContext {
}
/**
+ * @return ServiceRegistration<ITranslationProvider>[]
+ */
+ public function getTranslationProviders(): array {
+ return $this->translationProviders;
+ }
+
+ /**
* @return ServiceRegistration<INotifier>[]
*/
public function getNotifierServices(): array {
diff --git a/lib/private/Server.php b/lib/private/Server.php
index 35f63686457..fbb86711b41 100644
--- a/lib/private/Server.php
+++ b/lib/private/Server.php
@@ -152,6 +152,7 @@ use OC\SystemTag\ManagerFactory as SystemTagManagerFactory;
use OC\Tagging\TagMapper;
use OC\Talk\Broker;
use OC\Template\JSCombiner;
+use OC\Translation\TranslationManager;
use OC\User\DisplayNameCache;
use OC\User\Listeners\BeforeUserDeletedListener;
use OC\User\Listeners\UserChangedListener;
@@ -247,6 +248,7 @@ use OCP\Share\IShareHelper;
use OCP\SystemTag\ISystemTagManager;
use OCP\SystemTag\ISystemTagObjectMapper;
use OCP\Talk\IBroker;
+use OCP\Translation\ITranslationManager;
use OCP\User\Events\BeforePasswordUpdatedEvent;
use OCP\User\Events\BeforeUserDeletedEvent;
use OCP\User\Events\BeforeUserLoggedInEvent;
@@ -1453,6 +1455,8 @@ class Server extends ServerContainer implements IServerContainer {
$this->registerAlias(\OCP\Share\IPublicShareTemplateFactory::class, \OC\Share20\PublicShareTemplateFactory::class);
+ $this->registerAlias(ITranslationManager::class, TranslationManager::class);
+
$this->connectDispatcher();
}
diff --git a/lib/private/SystemTag/SystemTagManager.php b/lib/private/SystemTag/SystemTagManager.php
index 4524aeaf7bc..79c5adcf450 100644
--- a/lib/private/SystemTag/SystemTagManager.php
+++ b/lib/private/SystemTag/SystemTagManager.php
@@ -193,10 +193,12 @@ class SystemTagManager implements ISystemTagManager {
* {@inheritdoc}
*/
public function createTag(string $tagName, bool $userVisible, bool $userAssignable): ISystemTag {
+ // Length of name column is 64
+ $truncatedTagName = substr($tagName, 0, 64);
$query = $this->connection->getQueryBuilder();
$query->insert(self::TAG_TABLE)
->values([
- 'name' => $query->createNamedParameter($tagName),
+ 'name' => $query->createNamedParameter($truncatedTagName),
'visibility' => $query->createNamedParameter($userVisible ? 1 : 0),
'editable' => $query->createNamedParameter($userAssignable ? 1 : 0),
]);
@@ -205,7 +207,7 @@ class SystemTagManager implements ISystemTagManager {
$query->execute();
} catch (UniqueConstraintViolationException $e) {
throw new TagAlreadyExistsException(
- 'Tag ("' . $tagName . '", '. $userVisible . ', ' . $userAssignable . ') already exists',
+ 'Tag ("' . $truncatedTagName . '", '. $userVisible . ', ' . $userAssignable . ') already exists',
0,
$e
);
@@ -215,7 +217,7 @@ class SystemTagManager implements ISystemTagManager {
$tag = new SystemTag(
(string)$tagId,
- $tagName,
+ $truncatedTagName,
$userVisible,
$userAssignable
);
diff --git a/lib/private/Translation/TranslationManager.php b/lib/private/Translation/TranslationManager.php
new file mode 100644
index 00000000000..ec829e83255
--- /dev/null
+++ b/lib/private/Translation/TranslationManager.php
@@ -0,0 +1,120 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright Copyright (c) 2023 Julius Härtl <jus@bitgrid.net>
+ *
+ * @author Julius Härtl <jus@bitgrid.net>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+namespace OC\Translation;
+
+use InvalidArgumentException;
+use OC\AppFramework\Bootstrap\Coordinator;
+use OCP\IServerContainer;
+use OCP\PreConditionNotMetException;
+use OCP\Translation\IDetectLanguageProvider;
+use OCP\Translation\ITranslationManager;
+use OCP\Translation\ITranslationProvider;
+use Psr\Container\ContainerExceptionInterface;
+use Psr\Container\NotFoundExceptionInterface;
+use Psr\Log\LoggerInterface;
+use RuntimeException;
+use Throwable;
+
+class TranslationManager implements ITranslationManager {
+ /** @var ?ITranslationProvider[] */
+ private ?array $providers = null;
+
+ public function __construct(
+ private IServerContainer $serverContainer,
+ private Coordinator $coordinator,
+ private LoggerInterface $logger,
+ ) {
+ }
+
+ public function getLanguages(): array {
+ $languages = [];
+ foreach ($this->getProviders() as $provider) {
+ $languages = array_merge($languages, $provider->getAvailableLanguages());
+ }
+ return $languages;
+ }
+
+ public function translate(string $text, ?string $fromLanguage, string $toLanguage): string {
+ if (!$this->hasProviders()) {
+ throw new PreConditionNotMetException('No translation providers available');
+ }
+
+ foreach ($this->getProviders() as $provider) {
+ if ($fromLanguage === null && $provider instanceof IDetectLanguageProvider) {
+ $fromLanguage = $provider->detectLanguage($text);
+ }
+
+ if ($fromLanguage === null) {
+ throw new InvalidArgumentException('Could not detect language');
+ }
+
+ try {
+ return $provider->translate($fromLanguage, $toLanguage, $text);
+ } catch (RuntimeException $e) {
+ $this->logger->warning("Failed to translate from {$fromLanguage} to {$toLanguage}", ['exception' => $e]);
+ }
+ }
+
+ throw new RuntimeException('Could not translate text');
+ }
+
+ public function getProviders(): array {
+ $context = $this->coordinator->getRegistrationContext();
+
+ if ($this->providers !== null) {
+ return $this->providers;
+ }
+
+ $this->providers = [];
+ foreach ($context->getTranslationProviders() as $providerRegistration) {
+ $class = $providerRegistration->getService();
+ try {
+ $this->providers[$class] = $this->serverContainer->get($class);
+ } catch (NotFoundExceptionInterface|ContainerExceptionInterface|Throwable $e) {
+ $this->logger->error('Failed to load translation provider ' . $class, [
+ 'exception' => $e
+ ]);
+ }
+ }
+
+ return $this->providers;
+ }
+
+ public function hasProviders(): bool {
+ $context = $this->coordinator->getRegistrationContext();
+ return !empty($context->getTranslationProviders());
+ }
+
+ public function canDetectLanguage(): bool {
+ foreach ($this->getProviders() as $provider) {
+ if ($provider instanceof IDetectLanguageProvider) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/lib/public/AppFramework/Bootstrap/IRegistrationContext.php b/lib/public/AppFramework/Bootstrap/IRegistrationContext.php
index 6350169510f..f83f30c0f1c 100644
--- a/lib/public/AppFramework/Bootstrap/IRegistrationContext.php
+++ b/lib/public/AppFramework/Bootstrap/IRegistrationContext.php
@@ -39,6 +39,7 @@ use OCP\Files\Template\ICustomTemplateProvider;
use OCP\IContainer;
use OCP\Notification\INotifier;
use OCP\Preview\IProviderV2;
+use OCP\Translation\ITranslationProvider;
/**
* The context object passed to IBootstrap::register
@@ -218,6 +219,16 @@ interface IRegistrationContext {
public function registerTemplateProvider(string $providerClass): void;
/**
+ * Register a custom translation provider class that can provide translation
+ * between languages through the OCP\Translation APIs
+ *
+ * @param string $providerClass
+ * @psalm-param class-string<ITranslationProvider> $providerClass
+ * @since 21.0.0
+ */
+ public function registerTranslationProvider(string $providerClass): void;
+
+ /**
* Register an INotifier class
*
* @param string $notifierClass
diff --git a/lib/public/Translation/IDetectLanguageProvider.php b/lib/public/Translation/IDetectLanguageProvider.php
new file mode 100644
index 00000000000..f6db4f7d9c1
--- /dev/null
+++ b/lib/public/Translation/IDetectLanguageProvider.php
@@ -0,0 +1,39 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright Copyright (c) 2023 Julius Härtl <jus@bitgrid.net>
+ *
+ * @author Julius Härtl <jus@bitgrid.net>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+namespace OCP\Translation;
+
+/**
+ * @since 26.0.0
+ */
+interface IDetectLanguageProvider {
+ /**
+ * Try to detect the language of a given string
+ *
+ * @since 26.0.0
+ */
+ public function detectLanguage(string $text): ?string;
+}
diff --git a/lib/public/Translation/ITranslationManager.php b/lib/public/Translation/ITranslationManager.php
new file mode 100644
index 00000000000..c6b67462152
--- /dev/null
+++ b/lib/public/Translation/ITranslationManager.php
@@ -0,0 +1,60 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright Copyright (c) 2023 Julius Härtl <jus@bitgrid.net>
+ *
+ * @author Julius Härtl <jus@bitgrid.net>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+namespace OCP\Translation;
+
+use InvalidArgumentException;
+use OCP\PreConditionNotMetException;
+use RuntimeException;
+
+/**
+ * @since 26.0.0
+ */
+interface ITranslationManager {
+ /**
+ * @since 26.0.0
+ */
+ public function hasProviders(): bool;
+
+ /**
+ * @since 26.0.0
+ */
+ public function canDetectLanguage(): bool;
+
+ /**
+ * @since 26.0.0
+ * @return LanguageTuple[]
+ */
+ public function getLanguages(): array;
+
+ /**
+ * @since 26.0.0
+ * @throws PreConditionNotMetException If no provider was registered but this method was still called
+ * @throws InvalidArgumentException If no matching provider was found that can detect a language
+ * @throws RuntimeException If the translation failed for other reasons
+ */
+ public function translate(string $text, ?string $fromLanguage, string $toLanguage): string;
+}
diff --git a/lib/public/Translation/ITranslationProvider.php b/lib/public/Translation/ITranslationProvider.php
new file mode 100644
index 00000000000..ac77ba2230e
--- /dev/null
+++ b/lib/public/Translation/ITranslationProvider.php
@@ -0,0 +1,50 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright Copyright (c) 2022 Julius Härtl <jus@bitgrid.net>
+ *
+ * @author Julius Härtl <jus@bitgrid.net>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+namespace OCP\Translation;
+
+use RuntimeException;
+
+/**
+ * @since 26.0.0
+ */
+interface ITranslationProvider {
+ /**
+ * @since 26.0.0
+ */
+ public function getName(): string;
+
+ /**
+ * @since 26.0.0
+ */
+ public function getAvailableLanguages(): array;
+
+ /**
+ * @since 26.0.0
+ * @throws RuntimeException If the text could not be translated
+ */
+ public function translate(?string $fromLanguage, string $toLanguage, string $text): string;
+}
diff --git a/lib/public/Translation/LanguageTuple.php b/lib/public/Translation/LanguageTuple.php
new file mode 100644
index 00000000000..9defb17e4b6
--- /dev/null
+++ b/lib/public/Translation/LanguageTuple.php
@@ -0,0 +1,69 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright Copyright (c) 2023 Julius Härtl <jus@bitgrid.net>
+ *
+ * @author Julius Härtl <jus@bitgrid.net>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+namespace OCP\Translation;
+
+use JsonSerializable;
+
+/**
+ * @since 26.0.0
+ */
+class LanguageTuple implements JsonSerializable {
+ /**
+ * @since 26.0.0
+ */
+ public function __construct(
+ private string $from,
+ private string $fromLabel,
+ private string $to,
+ private string $toLabel
+ ) {
+ }
+
+ /**
+ * @since 26.0.0
+ */
+ public function jsonSerialize(): array {
+ return [
+ 'from' => $this->from,
+ 'fromLabel' => $this->fromLabel,
+ 'to' => $this->to,
+ 'toLabel' => $this->toLabel,
+ ];
+ }
+
+ /**
+ * @since 26.0.0
+ */
+ public static function fromArray(array $data): LanguageTuple {
+ return new self(
+ $data['from'],
+ $data['fromLabel'],
+ $data['to'],
+ $data['toLabel'],
+ );
+ }
+}
diff --git a/package-lock.json b/package-lock.json
index 1c0c60cd10a..6165a4973f0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -35,7 +35,6 @@
"backbone": "^1.4.1",
"blueimp-md5": "^2.19.0",
"browserslist-useragent-regexp": "^3.0.2",
- "buffer": "^6.0.3",
"camelcase": "^6.3.0",
"clipboard": "^2.0.11",
"colord": "^2.9.3",
@@ -66,7 +65,6 @@
"regenerator-runtime": "^0.13.9",
"select2": "3.5.1",
"snap.js": "^2.0.9",
- "stream-browserify": "^3.0.0",
"strengthify": "github:nextcloud/strengthify#0.5.9",
"throttle-debounce": "^5.0.0",
"underscore": "1.13.4",
diff --git a/package.json b/package.json
index 128c237f81c..ebfde06c94e 100644
--- a/package.json
+++ b/package.json
@@ -60,7 +60,6 @@
"backbone": "^1.4.1",
"blueimp-md5": "^2.19.0",
"browserslist-useragent-regexp": "^3.0.2",
- "buffer": "^6.0.3",
"camelcase": "^6.3.0",
"clipboard": "^2.0.11",
"colord": "^2.9.3",
@@ -91,7 +90,6 @@
"regenerator-runtime": "^0.13.9",
"select2": "3.5.1",
"snap.js": "^2.0.9",
- "stream-browserify": "^3.0.0",
"strengthify": "github:nextcloud/strengthify#0.5.9",
"throttle-debounce": "^5.0.0",
"underscore": "1.13.4",
diff --git a/tests/lib/SystemTag/SystemTagManagerTest.php b/tests/lib/SystemTag/SystemTagManagerTest.php
index ef0546dbd88..e261a68aaf7 100644
--- a/tests/lib/SystemTag/SystemTagManagerTest.php
+++ b/tests/lib/SystemTag/SystemTagManagerTest.php
@@ -259,6 +259,11 @@ class SystemTagManagerTest extends TestCase {
$this->tagManager->createTag($name, $userVisible, $userAssignable);
}
+ public function testCreateOverlongName() {
+ $tag = $this->tagManager->createTag('Zona circundante do Palácio Nacional da Ajuda (Jardim das Damas, Salão de Física, Torre Sineira, Paço Velho e Jardim Botânico)', true, true);
+ $this->assertSame('Zona circundante do Palácio Nacional da Ajuda (Jardim das Damas', $tag->getName()); // 63 characters but 64 bytes due to "á"
+ }
+
/**
* @dataProvider oneTagMultipleFlagsProvider
*/
@@ -281,14 +286,14 @@ class SystemTagManagerTest extends TestCase {
$this->assertSameTag($tag2, $tagList[$tag2->getId()]);
}
-
+
public function testGetNonExistingTag() {
$this->expectException(\OCP\SystemTag\TagNotFoundException::class);
$this->tagManager->getTag('nonexist', false, false);
}
-
+
public function testGetNonExistingTagsById() {
$this->expectException(\OCP\SystemTag\TagNotFoundException::class);
@@ -296,7 +301,7 @@ class SystemTagManagerTest extends TestCase {
$this->tagManager->getTagsByIds([$tag1->getId(), 100, 101]);
}
-
+
public function testGetInvalidTagIdFormat() {
$this->expectException(\InvalidArgumentException::class);
@@ -391,7 +396,7 @@ class SystemTagManagerTest extends TestCase {
$this->assertEmpty($this->tagManager->getAllTags());
}
-
+
public function testDeleteNonExistingTag() {
$this->expectException(\OCP\SystemTag\TagNotFoundException::class);
diff --git a/webpack.common.js b/webpack.common.js
index 201f3f9ed7d..b76763a136e 100644
--- a/webpack.common.js
+++ b/webpack.common.js
@@ -175,9 +175,7 @@ module.exports = {
extensions: ['*', '.ts', '.js', '.vue'],
symlinks: true,
fallback: {
- buffer: require.resolve('buffer'),
fs: false,
- stream: require.resolve('stream-browserify'),
},
},
}