summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/accessibility/l10n/ca.js7
-rw-r--r--apps/accessibility/l10n/ca.json7
-rw-r--r--apps/accessibility/l10n/vi.js4
-rw-r--r--apps/accessibility/l10n/vi.json4
-rw-r--r--apps/dav/l10n/tr.js2
-rw-r--r--apps/dav/l10n/tr.json2
-rw-r--r--apps/encryption/l10n/tr.js4
-rw-r--r--apps/encryption/l10n/tr.json4
-rw-r--r--apps/federatedfilesharing/l10n/de.js2
-rw-r--r--apps/federatedfilesharing/l10n/de.json2
-rw-r--r--apps/files/l10n/ru.js2
-rw-r--r--apps/files/l10n/ru.json2
-rw-r--r--apps/files/l10n/tr.js2
-rw-r--r--apps/files/l10n/tr.json2
-rw-r--r--apps/files_external/l10n/tr.js6
-rw-r--r--apps/files_external/l10n/tr.json6
-rw-r--r--apps/files_external/lib/Lib/Storage/SMB.php65
-rw-r--r--apps/files_sharing/l10n/eu.js1
-rw-r--r--apps/files_sharing/l10n/eu.json1
-rw-r--r--apps/files_sharing/l10n/tr.js6
-rw-r--r--apps/files_sharing/l10n/tr.json6
-rw-r--r--apps/files_sharing/lib/External/Scanner.php2
-rw-r--r--apps/files_sharing/lib/Scanner.php2
-rw-r--r--apps/files_trashbin/l10n/tr.js2
-rw-r--r--apps/files_trashbin/l10n/tr.json2
-rw-r--r--apps/oauth2/l10n/tr.js4
-rw-r--r--apps/oauth2/l10n/tr.json4
-rw-r--r--apps/settings/l10n/bg.js1
-rw-r--r--apps/settings/l10n/bg.json1
-rw-r--r--apps/settings/l10n/de.js2
-rw-r--r--apps/settings/l10n/de.json2
-rw-r--r--apps/settings/l10n/eu.js1
-rw-r--r--apps/settings/l10n/eu.json1
-rw-r--r--apps/settings/l10n/ru.js2
-rw-r--r--apps/settings/l10n/ru.json2
-rw-r--r--apps/settings/l10n/sk.js52
-rw-r--r--apps/settings/l10n/sk.json52
-rw-r--r--apps/settings/l10n/vi.js1
-rw-r--r--apps/settings/l10n/vi.json1
-rw-r--r--apps/theming/l10n/vi.js21
-rw-r--r--apps/theming/l10n/vi.json21
-rw-r--r--apps/user_ldap/l10n/de.js2
-rw-r--r--apps/user_ldap/l10n/de.json2
-rw-r--r--apps/user_ldap/l10n/tr.js4
-rw-r--r--apps/user_ldap/l10n/tr.json4
-rw-r--r--core/l10n/de.js6
-rw-r--r--core/l10n/de.json6
-rw-r--r--core/l10n/de_DE.js8
-rw-r--r--core/l10n/de_DE.json8
-rw-r--r--core/l10n/tr.js26
-rw-r--r--core/l10n/tr.json26
-rw-r--r--lib/composer/composer/autoload_classmap.php1
-rw-r--r--lib/composer/composer/autoload_static.php1
-rw-r--r--lib/l10n/sk.js20
-rw-r--r--lib/l10n/sk.json20
-rw-r--r--lib/l10n/tr.js6
-rw-r--r--lib/l10n/tr.json6
-rw-r--r--lib/private/Files/Cache/Scanner.php37
-rw-r--r--lib/private/Files/ObjectStore/NoopScanner.php2
-rw-r--r--lib/private/Files/Storage/Common.php18
-rw-r--r--lib/private/Files/Storage/Local.php1
-rw-r--r--lib/private/Files/Storage/Storage.php18
-rw-r--r--lib/private/Files/Storage/Wrapper/Availability.php11
-rw-r--r--lib/private/Files/Storage/Wrapper/Encoding.php4
-rw-r--r--lib/private/Files/Storage/Wrapper/Encryption.php69
-rw-r--r--lib/private/Files/Storage/Wrapper/Jail.php4
-rw-r--r--lib/private/Files/Storage/Wrapper/PermissionsMask.php9
-rw-r--r--lib/private/Files/Storage/Wrapper/Wrapper.php4
-rw-r--r--lib/private/Preview/BackgroundCleanupJob.php94
-rw-r--r--lib/private/Preview/Storage/Root.php71
-rw-r--r--lib/private/Server.php4
-rw-r--r--package-lock.json60
-rw-r--r--package.json2
-rw-r--r--tests/lib/Preview/BackgroundCleanupJobTest.php96
74 files changed, 750 insertions, 213 deletions
diff --git a/apps/accessibility/l10n/ca.js b/apps/accessibility/l10n/ca.js
index d190106127e..2627ed62e10 100644
--- a/apps/accessibility/l10n/ca.js
+++ b/apps/accessibility/l10n/ca.js
@@ -2,20 +2,27 @@ OC.L10N.register(
"accessibility",
{
"Dark theme" : "Tema fosc",
+ "Enable dark theme" : "Activa tema fosc",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Un tema fosc que ajuda els ulls reduint la lluminositat i la brillantor generals. Com que encara es troba en desenvolupament, agrairem que informeu de les errades que hi pugueu trobar.",
"High contrast mode" : "Mode de contrast alt",
+ "Enable high contrast mode" : "Activa mode contrast alt",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Un mode de contrast alt per facilitar la navegació. La qualitat visual es reduirà però s'incrementarà la claredat.",
"Dyslexia font" : "Tipus de lletra per a la dislèxia",
+ "Enable dyslexia font" : "Activa tipus de lletra per dislèxia",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic és un tipus de lletra gratuït dissenyat per mitigar alguns dels errors de lectura habituals causats per la dislèxia.",
"Accessibility" : "Accessibilitat",
"Accessibility options for nextcloud" : "Paràmetres d'accessibilitat de Nextcloud",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "Proporciona diversos paràmetres d'accessibilitat per facilitar-vos l'ús de Nextcloud",
+ "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "L’accés universal és molt important per a nosaltres. Seguim els estàndards web i comprovem que tot es pugui fer servir també sense el ratolí i amb programes d’assistència, com ara els lectors de pantalla. Volem complir les {guidelines} Directrius d’accessibilitat al contingut web {linked} 2.1 a nivell AA, amb el tema d’alt contrast fins i tot a nivell AAA.",
+ "If you find any issues, don’t hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Si trobeu cap problema, no dubteu en informar-ne {issuetracker} el nostre seguidor d'ncidències {linkend}. I si voleu implicar-vos, uniu-vos a {designteam} el nostre equip de disseny {linkend}!",
"High contrast theme" : "Tema de contrast alt",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Un tema de contrast alt per facilitar la navegació. La qualitat visual es reduirà però s'incrementarà la claredat.",
"Dark theme (beta)" : "Tema fosc (beta)",
"Web Content Accessibility Guidelines" : "Pautes d'accessibilitat de continguts web",
"our issue tracker" : "el nostre seguidor d'incidències",
"our design team" : "el nostre equip de disseny",
+ "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines} 2.1 on AA level, with the high contrast theme even on AAA level." : "L’accés universal és molt important per a nosaltres. Seguim els estàndards web i comprovem que tot es pugui fer servir també sense el ratolí i amb programes d’assistència, com ara els lectors de pantalla. Volem complir les {guidelines} 2.1 a nivell AA, amb un tema d’alt contrast fins i tot a nivell AAA.",
+ "If you find any issues, don’t hesitate to report them on {issuetracker}. And if you want to get involved, come join {designteam}!" : "Si trobeu cap problema, no dubteu en informar-ne a {issuetracker}. I si voleu implicar-vos, uniu-vos a {designteam}!",
"Enable" : "Activa"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/accessibility/l10n/ca.json b/apps/accessibility/l10n/ca.json
index 29e77705b69..d1976c27560 100644
--- a/apps/accessibility/l10n/ca.json
+++ b/apps/accessibility/l10n/ca.json
@@ -1,19 +1,26 @@
{ "translations": {
"Dark theme" : "Tema fosc",
+ "Enable dark theme" : "Activa tema fosc",
"A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "Un tema fosc que ajuda els ulls reduint la lluminositat i la brillantor generals. Com que encara es troba en desenvolupament, agrairem que informeu de les errades que hi pugueu trobar.",
"High contrast mode" : "Mode de contrast alt",
+ "Enable high contrast mode" : "Activa mode contrast alt",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Un mode de contrast alt per facilitar la navegació. La qualitat visual es reduirà però s'incrementarà la claredat.",
"Dyslexia font" : "Tipus de lletra per a la dislèxia",
+ "Enable dyslexia font" : "Activa tipus de lletra per dislèxia",
"OpenDyslexic is a free typeface/font designed to mitigate some of the common reading errors caused by dyslexia." : "OpenDyslexic és un tipus de lletra gratuït dissenyat per mitigar alguns dels errors de lectura habituals causats per la dislèxia.",
"Accessibility" : "Accessibilitat",
"Accessibility options for nextcloud" : "Paràmetres d'accessibilitat de Nextcloud",
"Provides multiple accessibilities options to ease your use of Nextcloud" : "Proporciona diversos paràmetres d'accessibilitat per facilitar-vos l'ús de Nextcloud",
+ "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "L’accés universal és molt important per a nosaltres. Seguim els estàndards web i comprovem que tot es pugui fer servir també sense el ratolí i amb programes d’assistència, com ara els lectors de pantalla. Volem complir les {guidelines} Directrius d’accessibilitat al contingut web {linked} 2.1 a nivell AA, amb el tema d’alt contrast fins i tot a nivell AAA.",
+ "If you find any issues, don’t hesitate to report them on {issuetracker}our issue tracker{linkend}. And if you want to get involved, come join {designteam}our design team{linkend}!" : "Si trobeu cap problema, no dubteu en informar-ne {issuetracker} el nostre seguidor d'ncidències {linkend}. I si voleu implicar-vos, uniu-vos a {designteam} el nostre equip de disseny {linkend}!",
"High contrast theme" : "Tema de contrast alt",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Un tema de contrast alt per facilitar la navegació. La qualitat visual es reduirà però s'incrementarà la claredat.",
"Dark theme (beta)" : "Tema fosc (beta)",
"Web Content Accessibility Guidelines" : "Pautes d'accessibilitat de continguts web",
"our issue tracker" : "el nostre seguidor d'incidències",
"our design team" : "el nostre equip de disseny",
+ "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines} 2.1 on AA level, with the high contrast theme even on AAA level." : "L’accés universal és molt important per a nosaltres. Seguim els estàndards web i comprovem que tot es pugui fer servir també sense el ratolí i amb programes d’assistència, com ara els lectors de pantalla. Volem complir les {guidelines} 2.1 a nivell AA, amb un tema d’alt contrast fins i tot a nivell AAA.",
+ "If you find any issues, don’t hesitate to report them on {issuetracker}. And if you want to get involved, come join {designteam}!" : "Si trobeu cap problema, no dubteu en informar-ne a {issuetracker}. I si voleu implicar-vos, uniu-vos a {designteam}!",
"Enable" : "Activa"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/accessibility/l10n/vi.js b/apps/accessibility/l10n/vi.js
index b9652905887..0ea03bd6b98 100644
--- a/apps/accessibility/l10n/vi.js
+++ b/apps/accessibility/l10n/vi.js
@@ -18,10 +18,10 @@ OC.L10N.register(
"High contrast theme" : "Chủ đề tương phản cao",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Một chủ đề tương phản cao để dễ dàng điều hướng của bạn. Chất lượng hình ảnh sẽ giảm nhưng độ rõ sẽ được tăng lên.",
"Dark theme (beta)" : "Chủ đề tối (beta)",
- "Web Content Accessibility Guidelines" : "Nguyên Tắc Truy Cập Cho Nội Dung Mạng",
+ "Web Content Accessibility Guidelines" : "Nguyên Tắc Truy Cập Cho Nội Dung Web",
"our issue tracker" : "hệ thống theo dõi vấn đề của chúng tôi",
"our design team" : "đội ngũ thiết kế của chúng tôi",
- "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines} 2.1 on AA level, with the high contrast theme even on AAA level." : "Truy cập đa dạng là rất quan trọng với chúng tôi. Chúng tôi tuân theo các tiêu chuẩn mạng và kiểm tra để khiến mọi thứ đều có thể sử dụng được ngay cả khi không có chuột, và hỗ trợ những phần mềm hỗ trợ như đọc màn hình. Chúng tôi hướng đến sự tương thích với {guidelines} 2.1 ở cấp độ AA, với chế độ tương phản cao là AAA",
+ "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines} 2.1 on AA level, with the high contrast theme even on AAA level." : "Truy cập đa dạng là rất quan trọng với chúng tôi. Chúng tôi tuân theo các tiêu chuẩn mạng và kiểm tra để khiến mọi thứ đều có thể sử dụng được ngay cả khi không có chuột, và phần mềm hỗ trợ như đọc màn hình. Chúng tôi hướng đến sự tương thích với {guidelines} 2.1 ở cấp độ AA, với chế độ tương phản cao là AAA",
"If you find any issues, don’t hesitate to report them on {issuetracker}. And if you want to get involved, come join {designteam}!" : "Nếu bạn tìm được bất cứ vấn đền gì, đừng ngần ngại để báo cáo chúng trên {issuetracker}. Và nếu bạn muốn can thiệp, hãy gia nhập {designteam}!",
"Enable" : "Kích hoạt"
},
diff --git a/apps/accessibility/l10n/vi.json b/apps/accessibility/l10n/vi.json
index cbda190b23d..bdbb6886d99 100644
--- a/apps/accessibility/l10n/vi.json
+++ b/apps/accessibility/l10n/vi.json
@@ -16,10 +16,10 @@
"High contrast theme" : "Chủ đề tương phản cao",
"A high contrast theme to ease your navigation. Visual quality will be reduced but clarity will be increased." : "Một chủ đề tương phản cao để dễ dàng điều hướng của bạn. Chất lượng hình ảnh sẽ giảm nhưng độ rõ sẽ được tăng lên.",
"Dark theme (beta)" : "Chủ đề tối (beta)",
- "Web Content Accessibility Guidelines" : "Nguyên Tắc Truy Cập Cho Nội Dung Mạng",
+ "Web Content Accessibility Guidelines" : "Nguyên Tắc Truy Cập Cho Nội Dung Web",
"our issue tracker" : "hệ thống theo dõi vấn đề của chúng tôi",
"our design team" : "đội ngũ thiết kế của chúng tôi",
- "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines} 2.1 on AA level, with the high contrast theme even on AAA level." : "Truy cập đa dạng là rất quan trọng với chúng tôi. Chúng tôi tuân theo các tiêu chuẩn mạng và kiểm tra để khiến mọi thứ đều có thể sử dụng được ngay cả khi không có chuột, và hỗ trợ những phần mềm hỗ trợ như đọc màn hình. Chúng tôi hướng đến sự tương thích với {guidelines} 2.1 ở cấp độ AA, với chế độ tương phản cao là AAA",
+ "Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines} 2.1 on AA level, with the high contrast theme even on AAA level." : "Truy cập đa dạng là rất quan trọng với chúng tôi. Chúng tôi tuân theo các tiêu chuẩn mạng và kiểm tra để khiến mọi thứ đều có thể sử dụng được ngay cả khi không có chuột, và phần mềm hỗ trợ như đọc màn hình. Chúng tôi hướng đến sự tương thích với {guidelines} 2.1 ở cấp độ AA, với chế độ tương phản cao là AAA",
"If you find any issues, don’t hesitate to report them on {issuetracker}. And if you want to get involved, come join {designteam}!" : "Nếu bạn tìm được bất cứ vấn đền gì, đừng ngần ngại để báo cáo chúng trên {issuetracker}. Và nếu bạn muốn can thiệp, hãy gia nhập {designteam}!",
"Enable" : "Kích hoạt"
},"pluralForm" :"nplurals=1; plural=0;"
diff --git a/apps/dav/l10n/tr.js b/apps/dav/l10n/tr.js
index cc9a08d2594..f3fac50baea 100644
--- a/apps/dav/l10n/tr.js
+++ b/apps/dav/l10n/tr.js
@@ -49,7 +49,7 @@ OC.L10N.register(
"Date:" : "Tarih:",
"Where:" : "Yer:",
"Description:" : "Açıklama:",
- "Untitled event" : "Adsız etkinlik",
+ "Untitled event" : "Başlıksız etkinlik",
"_%n year_::_%n years_" : ["%n yıl","%n yıl"],
"_%n month_::_%n months_" : ["%n ay","%n ay"],
"_%n day_::_%n days_" : ["%n gün","%n gün"],
diff --git a/apps/dav/l10n/tr.json b/apps/dav/l10n/tr.json
index a72a46bc796..c4276df3307 100644
--- a/apps/dav/l10n/tr.json
+++ b/apps/dav/l10n/tr.json
@@ -47,7 +47,7 @@
"Date:" : "Tarih:",
"Where:" : "Yer:",
"Description:" : "Açıklama:",
- "Untitled event" : "Adsız etkinlik",
+ "Untitled event" : "Başlıksız etkinlik",
"_%n year_::_%n years_" : ["%n yıl","%n yıl"],
"_%n month_::_%n months_" : ["%n ay","%n ay"],
"_%n day_::_%n days_" : ["%n gün","%n gün"],
diff --git a/apps/encryption/l10n/tr.js b/apps/encryption/l10n/tr.js
index b310db17d07..8dbf789fe59 100644
--- a/apps/encryption/l10n/tr.js
+++ b/apps/encryption/l10n/tr.js
@@ -16,7 +16,7 @@ OC.L10N.register(
"Could not change the password. Maybe the old password was not correct." : "Parola değiştirilemedi. Eski parolanızı doğru yazmamış olabilirsiniz.",
"Recovery Key disabled" : "Geri Yükleme Anahtarı devre dışı",
"Recovery Key enabled" : "Geri Yükleme Anahtarı etkin",
- "Could not enable the recovery key, please try again or contact your administrator" : "Geri yükleme anahtarı etkinleştirilemedi, yeniden deneyin ya da sistem yöneticisi ile görüşün",
+ "Could not enable the recovery key, please try again or contact your administrator" : "Geri yükleme anahtarı etkinleştirilemedi, yeniden deneyin ya da BT yöneticisi ile görüşün",
"Could not update the private key password." : "Özel anahtar parolası güncellenemedi",
"The old password was not correct, please try again." : "Eski parola doğru değil, lütfen yeniden deneyin.",
"The current log-in password was not correct, please try again." : "Geçerli oturum açma parolası doğru değil, lütfen yeniden deneyin.",
@@ -53,7 +53,7 @@ OC.L10N.register(
"Basic encryption module" : "Temel şifreleme modülü",
"Your private key password no longer matches your log-in password." : "Özel anahtar parolanız artık oturum açma parolanız ile eşleşmiyor.",
"Set your old private key password to your current log-in password:" : "Eski özel anahtar parolanızı, geçerli oturum açma parolanız olarak ayarlayın:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Eski parolanızı hatırlamıyorsanız, yöneticinizden dosyalarınızı kurtarmasını isteyebilirsiniz.",
+ " If you don't remember your old password you can ask your administrator to recover your files." : "Eski parolanızı hatırlamıyorsanız, BT yöneticinizden dosyalarınızı kurtarmasını isteyebilirsiniz.",
"Old log-in password" : "Eski oturum açma parolası",
"Current log-in password" : "Geçerli oturum açma parolası",
"Update Private Key Password" : "Özel Anahtar Parolasını Güncelle",
diff --git a/apps/encryption/l10n/tr.json b/apps/encryption/l10n/tr.json
index 8f163f2bfbe..8fb56e3ed6d 100644
--- a/apps/encryption/l10n/tr.json
+++ b/apps/encryption/l10n/tr.json
@@ -14,7 +14,7 @@
"Could not change the password. Maybe the old password was not correct." : "Parola değiştirilemedi. Eski parolanızı doğru yazmamış olabilirsiniz.",
"Recovery Key disabled" : "Geri Yükleme Anahtarı devre dışı",
"Recovery Key enabled" : "Geri Yükleme Anahtarı etkin",
- "Could not enable the recovery key, please try again or contact your administrator" : "Geri yükleme anahtarı etkinleştirilemedi, yeniden deneyin ya da sistem yöneticisi ile görüşün",
+ "Could not enable the recovery key, please try again or contact your administrator" : "Geri yükleme anahtarı etkinleştirilemedi, yeniden deneyin ya da BT yöneticisi ile görüşün",
"Could not update the private key password." : "Özel anahtar parolası güncellenemedi",
"The old password was not correct, please try again." : "Eski parola doğru değil, lütfen yeniden deneyin.",
"The current log-in password was not correct, please try again." : "Geçerli oturum açma parolası doğru değil, lütfen yeniden deneyin.",
@@ -51,7 +51,7 @@
"Basic encryption module" : "Temel şifreleme modülü",
"Your private key password no longer matches your log-in password." : "Özel anahtar parolanız artık oturum açma parolanız ile eşleşmiyor.",
"Set your old private key password to your current log-in password:" : "Eski özel anahtar parolanızı, geçerli oturum açma parolanız olarak ayarlayın:",
- " If you don't remember your old password you can ask your administrator to recover your files." : "Eski parolanızı hatırlamıyorsanız, yöneticinizden dosyalarınızı kurtarmasını isteyebilirsiniz.",
+ " If you don't remember your old password you can ask your administrator to recover your files." : "Eski parolanızı hatırlamıyorsanız, BT yöneticinizden dosyalarınızı kurtarmasını isteyebilirsiniz.",
"Old log-in password" : "Eski oturum açma parolası",
"Current log-in password" : "Geçerli oturum açma parolası",
"Update Private Key Password" : "Özel Anahtar Parolasını Güncelle",
diff --git a/apps/federatedfilesharing/l10n/de.js b/apps/federatedfilesharing/l10n/de.js
index 8f4e2a186c1..1bc18f52f7f 100644
--- a/apps/federatedfilesharing/l10n/de.js
+++ b/apps/federatedfilesharing/l10n/de.js
@@ -10,7 +10,7 @@ OC.L10N.register(
"Copied!" : "Kopiert!",
"Not supported!" : "Nicht unterstützt!",
"Press ⌘-C to copy." : "⌘-C zum Kopieren drücken.",
- "Press Ctrl-C to copy." : "Ctrl-C zum Kopieren drücken.",
+ "Press Ctrl-C to copy." : "Strg-C zum Kopieren drücken.",
"Invalid Federated Cloud ID" : "Ungültige Federated-Cloud-ID",
"Server to server sharing is not enabled on this server" : "Das Server-zu-Server-Teilen ist auf diesem Server nicht aktiviert",
"Couldn't establish a federated share." : "Federated-Share konnte nicht aufgebaut werden",
diff --git a/apps/federatedfilesharing/l10n/de.json b/apps/federatedfilesharing/l10n/de.json
index 26a05ed8b08..af50880e6fd 100644
--- a/apps/federatedfilesharing/l10n/de.json
+++ b/apps/federatedfilesharing/l10n/de.json
@@ -8,7 +8,7 @@
"Copied!" : "Kopiert!",
"Not supported!" : "Nicht unterstützt!",
"Press ⌘-C to copy." : "⌘-C zum Kopieren drücken.",
- "Press Ctrl-C to copy." : "Ctrl-C zum Kopieren drücken.",
+ "Press Ctrl-C to copy." : "Strg-C zum Kopieren drücken.",
"Invalid Federated Cloud ID" : "Ungültige Federated-Cloud-ID",
"Server to server sharing is not enabled on this server" : "Das Server-zu-Server-Teilen ist auf diesem Server nicht aktiviert",
"Couldn't establish a federated share." : "Federated-Share konnte nicht aufgebaut werden",
diff --git a/apps/files/l10n/ru.js b/apps/files/l10n/ru.js
index 7b91cc6eca0..6f27cf80cc4 100644
--- a/apps/files/l10n/ru.js
+++ b/apps/files/l10n/ru.js
@@ -31,7 +31,7 @@ OC.L10N.register(
"Actions" : "Действия",
"Rename" : "Переименовать",
"Copy" : "Копировать",
- "Choose target folder" : "Выберите каталога назначения",
+ "Choose target folder" : "Выбор папки назначения",
"Open" : "Открыть",
"Delete file" : "Удалить файл",
"Delete folder" : "Удалить каталог",
diff --git a/apps/files/l10n/ru.json b/apps/files/l10n/ru.json
index cc5848625ba..26063638d85 100644
--- a/apps/files/l10n/ru.json
+++ b/apps/files/l10n/ru.json
@@ -29,7 +29,7 @@
"Actions" : "Действия",
"Rename" : "Переименовать",
"Copy" : "Копировать",
- "Choose target folder" : "Выберите каталога назначения",
+ "Choose target folder" : "Выбор папки назначения",
"Open" : "Открыть",
"Delete file" : "Удалить файл",
"Delete folder" : "Удалить каталог",
diff --git a/apps/files/l10n/tr.js b/apps/files/l10n/tr.js
index 389b7939f3b..c026a69c0a5 100644
--- a/apps/files/l10n/tr.js
+++ b/apps/files/l10n/tr.js
@@ -44,7 +44,7 @@ OC.L10N.register(
"Pending" : "Bekliyor",
"Unable to determine date" : "Tarih belirlenemedi",
"This operation is forbidden" : "Bu işleme izin verilmiyor",
- "This directory is unavailable, please check the logs or contact the administrator" : "Bu klasör yazılabilir değil. Lütfen günlük kayıtlarına bakın ya da yönetici ile görüşün",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Bu klasör yazılabilir değil. Lütfen günlük kayıtlarına bakın ya da BT yöneticiniz ile görüşün",
"Could not move \"{file}\", target exists" : "\"{file}\" taşınamadı, hedef zaten var",
"Could not move \"{file}\"" : "\"{file}\" taşınamadı",
"copy" : "kopya",
diff --git a/apps/files/l10n/tr.json b/apps/files/l10n/tr.json
index 15182ef5ca4..79719ed303c 100644
--- a/apps/files/l10n/tr.json
+++ b/apps/files/l10n/tr.json
@@ -42,7 +42,7 @@
"Pending" : "Bekliyor",
"Unable to determine date" : "Tarih belirlenemedi",
"This operation is forbidden" : "Bu işleme izin verilmiyor",
- "This directory is unavailable, please check the logs or contact the administrator" : "Bu klasör yazılabilir değil. Lütfen günlük kayıtlarına bakın ya da yönetici ile görüşün",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Bu klasör yazılabilir değil. Lütfen günlük kayıtlarına bakın ya da BT yöneticiniz ile görüşün",
"Could not move \"{file}\", target exists" : "\"{file}\" taşınamadı, hedef zaten var",
"Could not move \"{file}\"" : "\"{file}\" taşınamadı",
"copy" : "kopya",
diff --git a/apps/files_external/l10n/tr.js b/apps/files_external/l10n/tr.js
index e3c473a48fa..18bf1bdf431 100644
--- a/apps/files_external/l10n/tr.js
+++ b/apps/files_external/l10n/tr.js
@@ -111,9 +111,9 @@ OC.L10N.register(
"OpenStack Object Storage" : "OpenStack Nesne Depolama",
"Service name" : "Hizmet adı",
"Request timeout (seconds)" : "İstek zaman aşımı (saniye)",
- "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHP cURL desteği kurulmamış ya da etkinleştirilmemiş. %s bağlanamaz. Lütfen kurulum için sistem yöneticinizle görüşün.",
- "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHP FTP desteği kuurlmamış ya da etkinleştirilmemiş. %s bağlanamaz. Lütfen kurulum için sistem yöneticinizle görüşün.",
- "\"%1$s\" is not installed. Mounting of %2$s is not possible. Please ask your system administrator to install it." : "\"%1$s\" kurulmamış. %2$s\" bağlanamaz. Lütfen kurulum için sistem yöneticinizle görüşün.",
+ "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHP cURL desteği kurulmamış ya da etkinleştirilmemiş. %s bağlanamaz. Lütfen kurması için BT yöneticinizle görüşün.",
+ "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHP FTP desteği kuurlmamış ya da etkinleştirilmemiş. %s bağlanamaz. Lütfen kurması için BT yöneticinizle görüşün.",
+ "\"%1$s\" is not installed. Mounting of %2$s is not possible. Please ask your system administrator to install it." : "\"%1$s\" kurulmamış. %2$s\" bağlanamaz. Lütfen kurulum için BT yöneticinizle görüşün.",
"External storage support" : "Dış depolama desteği",
"Adds basic external storage support" : "Temel dış depolama desteği ekler",
"This application enables administrators to configure connections to external storage providers, such as FTP servers, S3 or SWIFT object stores, other Nextcloud servers, WebDAV servers, and more. Administrators can choose which types of storage to enable and can mount these storage locations for a user, a group, or the entire system. Users will see a new folder appear in their root Nextcloud directory, which they can access and use like any other Nextcloud folder. External storage also allows users to share files stored in these external locations. In these cases, the credentials for the owner of the file are used when the recipient requests the file from external storage, thereby ensuring that the recipient can access the shared file.\n\nExternal storage can be configured using the GUI or at the command line. This second option provides the advanced user with more flexibility for configuring bulk external storage mounts and setting mount priorities. More information is available in the external storage GUI documentation and the external storage Configuration File documentation." : "Bu uygulama yöneticilerin FTP sunucular, S3 ya da SWIFT nesne mağazaları, diğer Nextcloud sunucuları ve WebDAV sunucuları gibi çeşitli dış depolama hizmeti sağlayıcıları ile bağlantı kurmasını sağlar. Yöneticiler etkinleştirmek istedikleri depolama türünü seçebilir ve bu depolama konumlarını belirli bir kullanıcı, bir grup ya da tüm sistem için ekleyebilir. Kullanıcılar bağlanan depolamayı kök Nextcloud klasörü altında yeni bir klasör olarak görebilir ve diğer Nextcloud klasörleri gibi erişebilir. Dış depolama, bu konumlarda depolanan dosyaların kullanıcılar tarafından paylaşılmasına da izin verir. Bu durumda alıcıların dış dosyaya erişebileceğinden emin olmak için yapılan dosya erişimi isteklerinde, dosya sahibinin kimlik doğrulama bilgileri kullanılır.\n\nDış depolama yapılandırması grafik arayüzden ya da komut satırından yapılabilir. Komut satırı seçeneğinde, uzman kullanıcılar için toplu dış depolama bağlama ve bağlama noktası öncelikleri gibi esnek yapılandırma seçenekleri bulunur. Ayrıntılı bilgi almak için dış depolama grafik arayüzü belgeleri ile dış depolama yapılandırma dosyası belgelerine bakabilirsiniz.",
diff --git a/apps/files_external/l10n/tr.json b/apps/files_external/l10n/tr.json
index 3bf1240e564..0dbc5a4364d 100644
--- a/apps/files_external/l10n/tr.json
+++ b/apps/files_external/l10n/tr.json
@@ -109,9 +109,9 @@
"OpenStack Object Storage" : "OpenStack Nesne Depolama",
"Service name" : "Hizmet adı",
"Request timeout (seconds)" : "İstek zaman aşımı (saniye)",
- "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHP cURL desteği kurulmamış ya da etkinleştirilmemiş. %s bağlanamaz. Lütfen kurulum için sistem yöneticinizle görüşün.",
- "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHP FTP desteği kuurlmamış ya da etkinleştirilmemiş. %s bağlanamaz. Lütfen kurulum için sistem yöneticinizle görüşün.",
- "\"%1$s\" is not installed. Mounting of %2$s is not possible. Please ask your system administrator to install it." : "\"%1$s\" kurulmamış. %2$s\" bağlanamaz. Lütfen kurulum için sistem yöneticinizle görüşün.",
+ "The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHP cURL desteği kurulmamış ya da etkinleştirilmemiş. %s bağlanamaz. Lütfen kurması için BT yöneticinizle görüşün.",
+ "The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "PHP FTP desteği kuurlmamış ya da etkinleştirilmemiş. %s bağlanamaz. Lütfen kurması için BT yöneticinizle görüşün.",
+ "\"%1$s\" is not installed. Mounting of %2$s is not possible. Please ask your system administrator to install it." : "\"%1$s\" kurulmamış. %2$s\" bağlanamaz. Lütfen kurulum için BT yöneticinizle görüşün.",
"External storage support" : "Dış depolama desteği",
"Adds basic external storage support" : "Temel dış depolama desteği ekler",
"This application enables administrators to configure connections to external storage providers, such as FTP servers, S3 or SWIFT object stores, other Nextcloud servers, WebDAV servers, and more. Administrators can choose which types of storage to enable and can mount these storage locations for a user, a group, or the entire system. Users will see a new folder appear in their root Nextcloud directory, which they can access and use like any other Nextcloud folder. External storage also allows users to share files stored in these external locations. In these cases, the credentials for the owner of the file are used when the recipient requests the file from external storage, thereby ensuring that the recipient can access the shared file.\n\nExternal storage can be configured using the GUI or at the command line. This second option provides the advanced user with more flexibility for configuring bulk external storage mounts and setting mount priorities. More information is available in the external storage GUI documentation and the external storage Configuration File documentation." : "Bu uygulama yöneticilerin FTP sunucular, S3 ya da SWIFT nesne mağazaları, diğer Nextcloud sunucuları ve WebDAV sunucuları gibi çeşitli dış depolama hizmeti sağlayıcıları ile bağlantı kurmasını sağlar. Yöneticiler etkinleştirmek istedikleri depolama türünü seçebilir ve bu depolama konumlarını belirli bir kullanıcı, bir grup ya da tüm sistem için ekleyebilir. Kullanıcılar bağlanan depolamayı kök Nextcloud klasörü altında yeni bir klasör olarak görebilir ve diğer Nextcloud klasörleri gibi erişebilir. Dış depolama, bu konumlarda depolanan dosyaların kullanıcılar tarafından paylaşılmasına da izin verir. Bu durumda alıcıların dış dosyaya erişebileceğinden emin olmak için yapılan dosya erişimi isteklerinde, dosya sahibinin kimlik doğrulama bilgileri kullanılır.\n\nDış depolama yapılandırması grafik arayüzden ya da komut satırından yapılabilir. Komut satırı seçeneğinde, uzman kullanıcılar için toplu dış depolama bağlama ve bağlama noktası öncelikleri gibi esnek yapılandırma seçenekleri bulunur. Ayrıntılı bilgi almak için dış depolama grafik arayüzü belgeleri ile dış depolama yapılandırma dosyası belgelerine bakabilirsiniz.",
diff --git a/apps/files_external/lib/Lib/Storage/SMB.php b/apps/files_external/lib/Lib/Storage/SMB.php
index d010fb54840..3ff8179c7b4 100644
--- a/apps/files_external/lib/Lib/Storage/SMB.php
+++ b/apps/files_external/lib/Lib/Storage/SMB.php
@@ -55,6 +55,7 @@ use OC\Cache\CappedMemoryCache;
use OC\Files\Filesystem;
use OC\Files\Storage\Common;
use OCA\Files_External\Lib\Notify\SMBNotifyHandler;
+use OCP\Constants;
use OCP\Files\Notify\IChange;
use OCP\Files\Notify\IRenameChange;
use OCP\Files\Storage\INotifyStorage;
@@ -97,7 +98,7 @@ class SMB extends Common implements INotifyStorage {
if (isset($params['auth'])) {
$auth = $params['auth'];
} elseif (isset($params['user']) && isset($params['password']) && isset($params['share'])) {
- list($workgroup, $user) = $this->splitUser($params['user']);
+ [$workgroup, $user] = $this->splitUser($params['user']);
$auth = new BasicAuth($user, $workgroup, $params['password']);
} else {
throw new \Exception('Invalid configuration, no credentials provided');
@@ -206,14 +207,15 @@ class SMB extends Common implements INotifyStorage {
* @return \Icewind\SMB\IFileInfo[]
* @throws StorageNotAvailableException
*/
- protected function getFolderContents($path) {
+ protected function getFolderContents($path): iterable {
try {
$path = ltrim($this->buildPath($path), '/');
$files = $this->share->dir($path);
foreach ($files as $file) {
$this->statCache[$path . '/' . $file->getName()] = $file;
}
- return array_filter($files, function (IFileInfo $file) {
+
+ foreach ($files as $file) {
try {
// the isHidden check is done before checking the config boolean to ensure that the metadata is always fetch
// so we trigger the below exceptions where applicable
@@ -221,15 +223,15 @@ class SMB extends Common implements INotifyStorage {
if ($hide) {
$this->logger->debug('hiding hidden file ' . $file->getName());
}
- return !$hide;
+ if (!$hide) {
+ yield $file;
+ }
} catch (ForbiddenException $e) {
$this->logger->logException($e, ['level' => ILogger::DEBUG, 'message' => 'Hiding forbidden entry ' . $file->getName()]);
- return false;
} catch (NotFoundException $e) {
$this->logger->logException($e, ['level' => ILogger::DEBUG, 'message' => 'Hiding not found entry ' . $file->getName()]);
- return false;
}
- });
+ }
} catch (ConnectException $e) {
$this->logger->logException($e, ['message' => 'Error while getting folder content']);
throw new StorageNotAvailableException($e->getMessage(), $e->getCode(), $e);
@@ -508,6 +510,46 @@ class SMB extends Common implements INotifyStorage {
}
}
+ public function getMetaData($path) {
+ $fileInfo = $this->getFileInfo($path);
+ if (!$fileInfo) {
+ return null;
+ }
+
+ return $this->getMetaDataFromFileInfo($fileInfo);
+ }
+
+ private function getMetaDataFromFileInfo(IFileInfo $fileInfo) {
+ $permissions = Constants::PERMISSION_READ + Constants::PERMISSION_SHARE;
+
+ if (!$fileInfo->isReadOnly()) {
+ $permissions += Constants::PERMISSION_DELETE;
+ $permissions += Constants::PERMISSION_UPDATE;
+ if ($fileInfo->isDirectory()) {
+ $permissions += Constants::PERMISSION_CREATE;
+ }
+ }
+
+ $data = [];
+ if ($fileInfo->isDirectory()) {
+ $data['mimetype'] = 'httpd/unix-directory';
+ } else {
+ $data['mimetype'] = \OC::$server->getMimeTypeDetector()->detectPath($fileInfo->getPath());
+ }
+ $data['mtime'] = $fileInfo->getMTime();
+ if ($fileInfo->isDirectory()) {
+ $data['size'] = -1; //unknown
+ } else {
+ $data['size'] = $fileInfo->getSize();
+ }
+ $data['etag'] = $this->getETag($fileInfo->getPath());
+ $data['storage_mtime'] = $data['mtime'];
+ $data['permissions'] = $permissions;
+ $data['name'] = $fileInfo->getName();
+
+ return $data;
+ }
+
public function opendir($path) {
try {
$files = $this->getFolderContents($path);
@@ -519,10 +561,17 @@ class SMB extends Common implements INotifyStorage {
$names = array_map(function ($info) {
/** @var \Icewind\SMB\IFileInfo $info */
return $info->getName();
- }, $files);
+ }, iterator_to_array($files));
return IteratorDirectory::wrap($names);
}
+ public function getDirectoryContent($directory): \Traversable {
+ $files = $this->getFolderContents($directory);
+ foreach ($files as $file) {
+ yield $this->getMetaDataFromFileInfo($file);
+ }
+ }
+
public function filetype($path) {
try {
return $this->getFileInfo($path)->isDirectory() ? 'dir' : 'file';
diff --git a/apps/files_sharing/l10n/eu.js b/apps/files_sharing/l10n/eu.js
index f630bbac3ed..eb6daf99d02 100644
--- a/apps/files_sharing/l10n/eu.js
+++ b/apps/files_sharing/l10n/eu.js
@@ -26,6 +26,7 @@ OC.L10N.register(
"Something happened. Unable to accept the share." : "Zerbait gertatu da. Ezin izan da partekatzea onartu.",
"Reject share" : "Ukatu partekatzea",
"Something happened. Unable to reject the share." : "Zerbait gertatu da. Ezin izan da partekatzea ukatu.",
+ "Waiting…" : "Itxaroten...",
"error" : "errorea",
"finished" : "amaitua",
"This will stop your current uploads." : "Honek zure uneko igoerak geldituko ditu.",
diff --git a/apps/files_sharing/l10n/eu.json b/apps/files_sharing/l10n/eu.json
index 1c72867ada3..4012e4b6828 100644
--- a/apps/files_sharing/l10n/eu.json
+++ b/apps/files_sharing/l10n/eu.json
@@ -24,6 +24,7 @@
"Something happened. Unable to accept the share." : "Zerbait gertatu da. Ezin izan da partekatzea onartu.",
"Reject share" : "Ukatu partekatzea",
"Something happened. Unable to reject the share." : "Zerbait gertatu da. Ezin izan da partekatzea ukatu.",
+ "Waiting…" : "Itxaroten...",
"error" : "errorea",
"finished" : "amaitua",
"This will stop your current uploads." : "Honek zure uneko igoerak geldituko ditu.",
diff --git a/apps/files_sharing/l10n/tr.js b/apps/files_sharing/l10n/tr.js
index 15d83c57487..fd2ea0d460e 100644
--- a/apps/files_sharing/l10n/tr.js
+++ b/apps/files_sharing/l10n/tr.js
@@ -104,10 +104,10 @@ OC.L10N.register(
"Could not create share" : "Paylaşılamadı",
"invalid permissions" : "izinler geçersiz",
"Please specify a valid user" : "Lütfen geçerli bir kullanıcı belirtin",
- "Group sharing is disabled by the administrator" : "Grup paylaşımı yönetici tarafından devre dışı bırakılmış",
+ "Group sharing is disabled by the administrator" : "Grup paylaşımı BT yöneticisi tarafından devre dışı bırakılmış",
"Please specify a valid group" : "Lütfen geçerli bir grup belirtin",
- "Public link sharing is disabled by the administrator" : "Herkese açık bağlantı paylaşımı yönetici tarafından devre dışı bırakılmış",
- "Public upload disabled by the administrator" : "Herkese açık yükleme yönetici tarafından devre dışı bırakılmış",
+ "Public link sharing is disabled by the administrator" : "Herkese açık bağlantı paylaşımı BT yöneticisi tarafından devre dışı bırakılmış",
+ "Public upload disabled by the administrator" : "Herkese açık yükleme BT yöneticisi tarafından devre dışı bırakılmış",
"Public upload is only possible for publicly shared folders" : "Herkese açık yükleme ancak herkese açık paylaşılmış klasörlere yapılabilir",
"Sharing %s sending the password by Nextcloud Talk failed because Nextcloud Talk is not enabled" : "Nextcloud Sohbet etkinleştirilmemiş olduğundan, Nextcloud Sohbet ile parola gönderilerek %s paylaşılamadı",
"Invalid date, date format must be YYYY-MM-DD" : "Tarih geçersiz. Tarih biçimi YYYY-AA-GG olmalıdır",
diff --git a/apps/files_sharing/l10n/tr.json b/apps/files_sharing/l10n/tr.json
index 5829cab5adb..b49cb71e480 100644
--- a/apps/files_sharing/l10n/tr.json
+++ b/apps/files_sharing/l10n/tr.json
@@ -102,10 +102,10 @@
"Could not create share" : "Paylaşılamadı",
"invalid permissions" : "izinler geçersiz",
"Please specify a valid user" : "Lütfen geçerli bir kullanıcı belirtin",
- "Group sharing is disabled by the administrator" : "Grup paylaşımı yönetici tarafından devre dışı bırakılmış",
+ "Group sharing is disabled by the administrator" : "Grup paylaşımı BT yöneticisi tarafından devre dışı bırakılmış",
"Please specify a valid group" : "Lütfen geçerli bir grup belirtin",
- "Public link sharing is disabled by the administrator" : "Herkese açık bağlantı paylaşımı yönetici tarafından devre dışı bırakılmış",
- "Public upload disabled by the administrator" : "Herkese açık yükleme yönetici tarafından devre dışı bırakılmış",
+ "Public link sharing is disabled by the administrator" : "Herkese açık bağlantı paylaşımı BT yöneticisi tarafından devre dışı bırakılmış",
+ "Public upload disabled by the administrator" : "Herkese açık yükleme BT yöneticisi tarafından devre dışı bırakılmış",
"Public upload is only possible for publicly shared folders" : "Herkese açık yükleme ancak herkese açık paylaşılmış klasörlere yapılabilir",
"Sharing %s sending the password by Nextcloud Talk failed because Nextcloud Talk is not enabled" : "Nextcloud Sohbet etkinleştirilmemiş olduğundan, Nextcloud Sohbet ile parola gönderilerek %s paylaşılamadı",
"Invalid date, date format must be YYYY-MM-DD" : "Tarih geçersiz. Tarih biçimi YYYY-AA-GG olmalıdır",
diff --git a/apps/files_sharing/lib/External/Scanner.php b/apps/files_sharing/lib/External/Scanner.php
index 8962bb68c07..ebe0361c989 100644
--- a/apps/files_sharing/lib/External/Scanner.php
+++ b/apps/files_sharing/lib/External/Scanner.php
@@ -57,7 +57,7 @@ class Scanner extends \OC\Files\Cache\Scanner {
* @param bool $lock set to false to disable getting an additional read lock during scanning
* @return array an array of metadata of the scanned file
*/
- public function scanFile($file, $reuseExisting = 0, $parentId = -1, $cacheData = null, $lock = true) {
+ public function scanFile($file, $reuseExisting = 0, $parentId = -1, $cacheData = null, $lock = true, $data = null) {
try {
return parent::scanFile($file, $reuseExisting);
} catch (ForbiddenException $e) {
diff --git a/apps/files_sharing/lib/Scanner.php b/apps/files_sharing/lib/Scanner.php
index 7115b602aed..36a412800e5 100644
--- a/apps/files_sharing/lib/Scanner.php
+++ b/apps/files_sharing/lib/Scanner.php
@@ -71,7 +71,7 @@ class Scanner extends \OC\Files\Cache\Scanner {
}
}
- public function scanFile($file, $reuseExisting = 0, $parentId = -1, $cacheData = null, $lock = true) {
+ public function scanFile($file, $reuseExisting = 0, $parentId = -1, $cacheData = null, $lock = true, $data = null) {
$sourceScanner = $this->getSourceScanner();
if ($sourceScanner instanceof NoopScanner) {
return [];
diff --git a/apps/files_trashbin/l10n/tr.js b/apps/files_trashbin/l10n/tr.js
index 38f5d790ac7..648387aac6e 100644
--- a/apps/files_trashbin/l10n/tr.js
+++ b/apps/files_trashbin/l10n/tr.js
@@ -13,7 +13,7 @@ OC.L10N.register(
"Error while emptying trashbin" : "Çöp kutusu boşaltılırken sorun çıktı",
"Error while removing files from trashbin" : "Dosyalar çöp kutusundan silinirken sorun çıktı",
"This operation is forbidden" : "Bu işlem yapılamaz",
- "This directory is unavailable, please check the logs or contact the administrator" : "Bu dizine yazılamıyor, lütfen günlüğü denetleyin ya da yönetici ile görüşün",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Bu klasör kullanılamıyor. Lütfen günlüğü denetleyin ya da BT yöneticiniz ile görüşün",
"No deleted files" : "Silinmiş bir dosya yok",
"You will be able to recover deleted files from here" : "Silinmiş dosyalarınızı buradan geri yükleyebilirsiniz",
"No entries found in this folder" : "Bu klasörde herhangi bir kayıt yok",
diff --git a/apps/files_trashbin/l10n/tr.json b/apps/files_trashbin/l10n/tr.json
index e741533a686..b55467c93a5 100644
--- a/apps/files_trashbin/l10n/tr.json
+++ b/apps/files_trashbin/l10n/tr.json
@@ -11,7 +11,7 @@
"Error while emptying trashbin" : "Çöp kutusu boşaltılırken sorun çıktı",
"Error while removing files from trashbin" : "Dosyalar çöp kutusundan silinirken sorun çıktı",
"This operation is forbidden" : "Bu işlem yapılamaz",
- "This directory is unavailable, please check the logs or contact the administrator" : "Bu dizine yazılamıyor, lütfen günlüğü denetleyin ya da yönetici ile görüşün",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Bu klasör kullanılamıyor. Lütfen günlüğü denetleyin ya da BT yöneticiniz ile görüşün",
"No deleted files" : "Silinmiş bir dosya yok",
"You will be able to recover deleted files from here" : "Silinmiş dosyalarınızı buradan geri yükleyebilirsiniz",
"No entries found in this folder" : "Bu klasörde herhangi bir kayıt yok",
diff --git a/apps/oauth2/l10n/tr.js b/apps/oauth2/l10n/tr.js
index cfa787f93ed..07d4df520fa 100644
--- a/apps/oauth2/l10n/tr.js
+++ b/apps/oauth2/l10n/tr.js
@@ -1,11 +1,11 @@
OC.L10N.register(
"oauth2",
{
- "Your client is not authorized to connect. Please inform the administrator of your client." : "İstemcinizin bağlanma izni yok. Lütfen sistem yöneticinize istemciniz ile ilgili bilgi verin.",
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "İstemcinizin bağlanma izni yok. Lütfen BT yöneticinize istemciniz ile ilgili bilgi verin.",
"Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Yönlendirme adresi https://websitem.com/yol gibi tam bir adres olmalıdır",
"OAuth 2.0" : "OAuth 2.0",
"Allows OAuth2 compatible authentication from other web applications." : "Diğer web uygulamaları için OAuth2 uyumlu kimlik doğrulaması sağlar.",
- "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 uygulaması, yöneticilerin iç kimlik doğrulama iş akışını yapılandırabilmesini ve diğer web uygulamaları için OAuth2 uyumlu kimlik doğrulaması kullanılabilmesini sağlar.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 uygulaması, BT yöneticilerinin iç kimlik doğrulama iş akışını yapılandırabilmesini ve diğer web uygulamaları için OAuth2 uyumlu kimlik doğrulaması kullanılabilmesini sağlar.",
"OAuth 2.0 clients" : "OAuth 2.0 istemcileri",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 dış hizmetlerin {instanceName} için erişim isteğinde bulunmasını sağlar.",
"Name" : "Ad",
diff --git a/apps/oauth2/l10n/tr.json b/apps/oauth2/l10n/tr.json
index f2066fcae1d..ad3fd051a6f 100644
--- a/apps/oauth2/l10n/tr.json
+++ b/apps/oauth2/l10n/tr.json
@@ -1,9 +1,9 @@
{ "translations": {
- "Your client is not authorized to connect. Please inform the administrator of your client." : "İstemcinizin bağlanma izni yok. Lütfen sistem yöneticinize istemciniz ile ilgili bilgi verin.",
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "İstemcinizin bağlanma izni yok. Lütfen BT yöneticinize istemciniz ile ilgili bilgi verin.",
"Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "Yönlendirme adresi https://websitem.com/yol gibi tam bir adres olmalıdır",
"OAuth 2.0" : "OAuth 2.0",
"Allows OAuth2 compatible authentication from other web applications." : "Diğer web uygulamaları için OAuth2 uyumlu kimlik doğrulaması sağlar.",
- "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 uygulaması, yöneticilerin iç kimlik doğrulama iş akışını yapılandırabilmesini ve diğer web uygulamaları için OAuth2 uyumlu kimlik doğrulaması kullanılabilmesini sağlar.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2 uygulaması, BT yöneticilerinin iç kimlik doğrulama iş akışını yapılandırabilmesini ve diğer web uygulamaları için OAuth2 uyumlu kimlik doğrulaması kullanılabilmesini sağlar.",
"OAuth 2.0 clients" : "OAuth 2.0 istemcileri",
"OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 dış hizmetlerin {instanceName} için erişim isteğinde bulunmasını sağlar.",
"Name" : "Ad",
diff --git a/apps/settings/l10n/bg.js b/apps/settings/l10n/bg.js
index 6552f1b4a19..c6ecda398df 100644
--- a/apps/settings/l10n/bg.js
+++ b/apps/settings/l10n/bg.js
@@ -208,6 +208,7 @@ OC.L10N.register(
"Enable encryption" : "Включване на криптиране",
"Select default encryption module:" : "Избор на модул за криптиране по подразбиране:",
"Start migration" : "Начало на миграцията",
+ "Background jobs" : "Фонови процеси",
"Last job execution ran %s. Something seems wrong." : "За последно cron задача е стартирала %s. Изглежда, че има проблем.",
"Last job ran %s." : "За последно cron задача е стартирала %s.",
"Execute one task with each page loaded" : "Изпълнява една задача с всяка заредена страница.",
diff --git a/apps/settings/l10n/bg.json b/apps/settings/l10n/bg.json
index d90f0708c20..c955daff101 100644
--- a/apps/settings/l10n/bg.json
+++ b/apps/settings/l10n/bg.json
@@ -206,6 +206,7 @@
"Enable encryption" : "Включване на криптиране",
"Select default encryption module:" : "Избор на модул за криптиране по подразбиране:",
"Start migration" : "Начало на миграцията",
+ "Background jobs" : "Фонови процеси",
"Last job execution ran %s. Something seems wrong." : "За последно cron задача е стартирала %s. Изглежда, че има проблем.",
"Last job ran %s." : "За последно cron задача е стартирала %s.",
"Execute one task with each page loaded" : "Изпълнява една задача с всяка заредена страница.",
diff --git a/apps/settings/l10n/de.js b/apps/settings/l10n/de.js
index 1fad1bd92a8..7236623a9a5 100644
--- a/apps/settings/l10n/de.js
+++ b/apps/settings/l10n/de.js
@@ -336,7 +336,7 @@ OC.L10N.register(
"Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Wird die Verschlüsselung einmal aktiviert, so werden alle ab diesem Zeitpunkt hochgeladene Dateien verschlüsselt. Sie kann nur wieder deaktiviert werden, wenn das Verschlüsselungsmodul dies unterstützt und alle Voraussetzungen (wie das Setzen eines Wiederherstellungsschlüssels) im Vorhinein erfüllt wurden.",
"Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases." : "Verschlüsselung alleine garantiert nicht die Systemsicherheit. Bitte lese in der Dokumentation nach, wie die Verschlüsselungs-app funktioniert und welche Anwendungsfälle unterstützt werden.",
"Be aware that encryption always increases the file size." : "Bedenke, dass durch die Verschlüsselung die Dateigröße zunimmt. ",
- "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Es ist immer gut, regelmäßig Sicherungskopien von Deinen Daten zu erstellen. Falls Du die Verschlüsselung nutzt, sollte auch eine Sicherung der Verschlüsselungsschlüssel zusammen mit Deinen Daten durchgeführt werden.",
+ "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Es ist immer gut, regelmäßig Sicherungen von Deinen Daten zu erstellen. Falls Du die Verschlüsselung nutzt, sollte auch eine Sicherung der Verschlüsselungsschlüssel zusammen mit Deinen Daten durchgeführt werden.",
"This is the final warning: Do you really want to enable encryption?" : "Dies ist die letzte Warnung: Möchtest Du die Verschlüsselung wirklich aktivieren?",
"Enable encryption" : "Verschlüsselung aktivieren",
"No encryption module loaded, please enable an encryption module in the app menu." : "Es wurde kein Verschlüsselungs-Modul geladen, bitte ein Verschlüsselungs-Modul im Anwendungs-Menü aktivieren.",
diff --git a/apps/settings/l10n/de.json b/apps/settings/l10n/de.json
index 01cb644d3a2..f11c29c61fd 100644
--- a/apps/settings/l10n/de.json
+++ b/apps/settings/l10n/de.json
@@ -334,7 +334,7 @@
"Once encryption is enabled, all files uploaded to the server from that point forward will be encrypted at rest on the server. It will only be possible to disable encryption at a later date if the active encryption module supports that function, and all pre-conditions (e.g. setting a recover key) are met." : "Wird die Verschlüsselung einmal aktiviert, so werden alle ab diesem Zeitpunkt hochgeladene Dateien verschlüsselt. Sie kann nur wieder deaktiviert werden, wenn das Verschlüsselungsmodul dies unterstützt und alle Voraussetzungen (wie das Setzen eines Wiederherstellungsschlüssels) im Vorhinein erfüllt wurden.",
"Encryption alone does not guarantee security of the system. Please see documentation for more information about how the encryption app works, and the supported use cases." : "Verschlüsselung alleine garantiert nicht die Systemsicherheit. Bitte lese in der Dokumentation nach, wie die Verschlüsselungs-app funktioniert und welche Anwendungsfälle unterstützt werden.",
"Be aware that encryption always increases the file size." : "Bedenke, dass durch die Verschlüsselung die Dateigröße zunimmt. ",
- "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Es ist immer gut, regelmäßig Sicherungskopien von Deinen Daten zu erstellen. Falls Du die Verschlüsselung nutzt, sollte auch eine Sicherung der Verschlüsselungsschlüssel zusammen mit Deinen Daten durchgeführt werden.",
+ "It is always good to create regular backups of your data, in case of encryption make sure to backup the encryption keys along with your data." : "Es ist immer gut, regelmäßig Sicherungen von Deinen Daten zu erstellen. Falls Du die Verschlüsselung nutzt, sollte auch eine Sicherung der Verschlüsselungsschlüssel zusammen mit Deinen Daten durchgeführt werden.",
"This is the final warning: Do you really want to enable encryption?" : "Dies ist die letzte Warnung: Möchtest Du die Verschlüsselung wirklich aktivieren?",
"Enable encryption" : "Verschlüsselung aktivieren",
"No encryption module loaded, please enable an encryption module in the app menu." : "Es wurde kein Verschlüsselungs-Modul geladen, bitte ein Verschlüsselungs-Modul im Anwendungs-Menü aktivieren.",
diff --git a/apps/settings/l10n/eu.js b/apps/settings/l10n/eu.js
index d015e019afb..a81e01b650d 100644
--- a/apps/settings/l10n/eu.js
+++ b/apps/settings/l10n/eu.js
@@ -47,6 +47,7 @@ OC.L10N.register(
"{actor} changed your password" : "{actor}-(e)k zure pasahitza aldatu du",
"You changed your password" : "Zuk zure pasahitza aldatu duzu",
"Your password was reset by an administrator" : "Administratzaile batek zure pasahitza berrezarri du",
+ "Your password was reset" : "Zure pasahitza berezarri da",
"{actor} changed your email address" : "{actor}-(e)k zure e-posta helbidea aldatu du",
"You changed your email address" : "Zuk zure e-posta helbidea aldatu duzu",
"Your email address was changed by an administrator" : "Administratzaile batek zure e-posta helbidea berrezarri du",
diff --git a/apps/settings/l10n/eu.json b/apps/settings/l10n/eu.json
index bb281445ff7..a86717fe944 100644
--- a/apps/settings/l10n/eu.json
+++ b/apps/settings/l10n/eu.json
@@ -45,6 +45,7 @@
"{actor} changed your password" : "{actor}-(e)k zure pasahitza aldatu du",
"You changed your password" : "Zuk zure pasahitza aldatu duzu",
"Your password was reset by an administrator" : "Administratzaile batek zure pasahitza berrezarri du",
+ "Your password was reset" : "Zure pasahitza berezarri da",
"{actor} changed your email address" : "{actor}-(e)k zure e-posta helbidea aldatu du",
"You changed your email address" : "Zuk zure e-posta helbidea aldatu duzu",
"Your email address was changed by an administrator" : "Administratzaile batek zure e-posta helbidea berrezarri du",
diff --git a/apps/settings/l10n/ru.js b/apps/settings/l10n/ru.js
index 432e76e3428..fb142072674 100644
--- a/apps/settings/l10n/ru.js
+++ b/apps/settings/l10n/ru.js
@@ -47,6 +47,7 @@ OC.L10N.register(
"{actor} changed your password" : "{actor} сменил(а) ваш пароль",
"You changed your password" : "Вы изменили свой пароль",
"Your password was reset by an administrator" : "Ваш пароль был сброшен администратором",
+ "Your password was reset" : "Ваш пароль был сброшен",
"{actor} changed your email address" : "{actor} изменил(а) ваш адрес электронной почты",
"You changed your email address" : "Вы изменили свой адрес электронной почты",
"Your email address was changed by an administrator" : "Ваш адрес электронной почты был изменён администратором",
@@ -88,6 +89,7 @@ OC.L10N.register(
"%1$s changed your password on %2$s." : "%1$s сменил(а) ваш пароль для сервера %2$s.",
"Your password on %s was changed." : "Ваш пароль на сервере %s был изменён",
"Your password on %s was reset by an administrator." : "Ваш пароль на сервере %s был сброшен администратором.",
+ "Your password on %s was reset." : "Ваш пароль на сервере %s был сброшен.",
"Password for %1$s changed on %2$s" : "Пароль %1$s изменён на сервере %2$s",
"Password changed for %s" : "Изменён пароль %s",
"If you did not request this, please contact an administrator." : "Если вы не запрашивали это действие, свяжитесь с администратором.",
diff --git a/apps/settings/l10n/ru.json b/apps/settings/l10n/ru.json
index 95c9da2457c..c995b73a69a 100644
--- a/apps/settings/l10n/ru.json
+++ b/apps/settings/l10n/ru.json
@@ -45,6 +45,7 @@
"{actor} changed your password" : "{actor} сменил(а) ваш пароль",
"You changed your password" : "Вы изменили свой пароль",
"Your password was reset by an administrator" : "Ваш пароль был сброшен администратором",
+ "Your password was reset" : "Ваш пароль был сброшен",
"{actor} changed your email address" : "{actor} изменил(а) ваш адрес электронной почты",
"You changed your email address" : "Вы изменили свой адрес электронной почты",
"Your email address was changed by an administrator" : "Ваш адрес электронной почты был изменён администратором",
@@ -86,6 +87,7 @@
"%1$s changed your password on %2$s." : "%1$s сменил(а) ваш пароль для сервера %2$s.",
"Your password on %s was changed." : "Ваш пароль на сервере %s был изменён",
"Your password on %s was reset by an administrator." : "Ваш пароль на сервере %s был сброшен администратором.",
+ "Your password on %s was reset." : "Ваш пароль на сервере %s был сброшен.",
"Password for %1$s changed on %2$s" : "Пароль %1$s изменён на сервере %2$s",
"Password changed for %s" : "Изменён пароль %s",
"If you did not request this, please contact an administrator." : "Если вы не запрашивали это действие, свяжитесь с администратором.",
diff --git a/apps/settings/l10n/sk.js b/apps/settings/l10n/sk.js
index a41fad77d53..3bcafefb3cc 100644
--- a/apps/settings/l10n/sk.js
+++ b/apps/settings/l10n/sk.js
@@ -364,8 +364,60 @@ OC.L10N.register(
"New password" : "Nové heslo",
"Change password" : "Zmeniť heslo",
"Use a second factor besides your password to increase security for your account." : "Pre zlepšenie zabezpečenia vášho účtu použite okrem hesla aj druhý faktor.",
+ "Afrikaans" : "Afrikánčina",
+ "Albanian" : "albánčina",
+ "Arabic" : "Arabčina",
+ "Azerbaijani" : "Azerbajdžansky",
+ "Basque" : "Baskičtina",
+ "Belarusian" : "Bieloruština",
+ "Bengali" : "Bengálčina",
+ "Bulgarian" : "Bulharčina",
+ "Catalan" : "Catalan",
+ "Cherokee" : "Čerokézčina",
+ "Chinese" : "Chinese",
+ "Croatian" : "Chorvátčina",
"Czech" : "Česká republika",
+ "Danish" : "Dánčina",
+ "Dutch" : "holandčina",
+ "English" : "Angličtina",
+ "Esperanto" : "Esperanto",
+ "Estonian" : "Estónčina",
+ "Finnish" : "Fínčina",
+ "French" : "Francúzština",
+ "Galician" : "Galicijčina",
+ "German" : "Nemčina",
+ "Greek" : "Gréčtina",
+ "Hebrew" : "Hebrejčina",
+ "Hindi" : "Hindčina",
+ "Hungarian" : "Maďarčina",
+ "Icelandic" : "Isandčina",
+ "Indonesian" : "Indonézština",
+ "Italian" : "taliančina",
+ "Japanese" : "japončina",
+ "Kannada" : "kanadčina",
+ "Korean" : "korejčina",
+ "Latvian" : "lotyščina",
+ "Lithuanian" : "litovčina",
+ "Macedonian" : "macedónčina",
+ "Malay" : "malajčina",
+ "Malayalam" : "malajálamčina",
+ "Maltese" : "maltčina",
+ "Polish" : "poľština",
+ "Portuguese" : "portugalčina",
+ "Romanian" : "rumunčina",
+ "Russian" : "ruština",
+ "Serbian (Latin)" : "srbština (latin)",
+ "Slovenian" : "slovinčina",
+ "Spanish" : "španielčina",
+ "Swahili" : "svahilčina",
+ "Swedish" : "švédština",
+ "Tamil" : "tamilčina",
+ "Telugu" : "telugčina",
+ "Thai" : "thajčina",
"Tonga" : "Tonga",
+ "Turkish" : "turečtina",
+ "Ukrainian" : "ukrajinčina",
+ "Vietnamese" : "vietnamčina",
"Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Oficiálne aplikácie sú vyvíjané komunitou. Poskytujú centrálnu funkcionalitu a sú pripravené pre produkčné nasadenie.",
"Official" : "Oficiálny",
"The backend does not support changing the display name" : "Backend nepodporuje zmenu zobrazovaného názvu",
diff --git a/apps/settings/l10n/sk.json b/apps/settings/l10n/sk.json
index f585fadff00..85f25e78ba1 100644
--- a/apps/settings/l10n/sk.json
+++ b/apps/settings/l10n/sk.json
@@ -362,8 +362,60 @@
"New password" : "Nové heslo",
"Change password" : "Zmeniť heslo",
"Use a second factor besides your password to increase security for your account." : "Pre zlepšenie zabezpečenia vášho účtu použite okrem hesla aj druhý faktor.",
+ "Afrikaans" : "Afrikánčina",
+ "Albanian" : "albánčina",
+ "Arabic" : "Arabčina",
+ "Azerbaijani" : "Azerbajdžansky",
+ "Basque" : "Baskičtina",
+ "Belarusian" : "Bieloruština",
+ "Bengali" : "Bengálčina",
+ "Bulgarian" : "Bulharčina",
+ "Catalan" : "Catalan",
+ "Cherokee" : "Čerokézčina",
+ "Chinese" : "Chinese",
+ "Croatian" : "Chorvátčina",
"Czech" : "Česká republika",
+ "Danish" : "Dánčina",
+ "Dutch" : "holandčina",
+ "English" : "Angličtina",
+ "Esperanto" : "Esperanto",
+ "Estonian" : "Estónčina",
+ "Finnish" : "Fínčina",
+ "French" : "Francúzština",
+ "Galician" : "Galicijčina",
+ "German" : "Nemčina",
+ "Greek" : "Gréčtina",
+ "Hebrew" : "Hebrejčina",
+ "Hindi" : "Hindčina",
+ "Hungarian" : "Maďarčina",
+ "Icelandic" : "Isandčina",
+ "Indonesian" : "Indonézština",
+ "Italian" : "taliančina",
+ "Japanese" : "japončina",
+ "Kannada" : "kanadčina",
+ "Korean" : "korejčina",
+ "Latvian" : "lotyščina",
+ "Lithuanian" : "litovčina",
+ "Macedonian" : "macedónčina",
+ "Malay" : "malajčina",
+ "Malayalam" : "malajálamčina",
+ "Maltese" : "maltčina",
+ "Polish" : "poľština",
+ "Portuguese" : "portugalčina",
+ "Romanian" : "rumunčina",
+ "Russian" : "ruština",
+ "Serbian (Latin)" : "srbština (latin)",
+ "Slovenian" : "slovinčina",
+ "Spanish" : "španielčina",
+ "Swahili" : "svahilčina",
+ "Swedish" : "švédština",
+ "Tamil" : "tamilčina",
+ "Telugu" : "telugčina",
+ "Thai" : "thajčina",
"Tonga" : "Tonga",
+ "Turkish" : "turečtina",
+ "Ukrainian" : "ukrajinčina",
+ "Vietnamese" : "vietnamčina",
"Official apps are developed by and within the community. They offer central functionality and are ready for production use." : "Oficiálne aplikácie sú vyvíjané komunitou. Poskytujú centrálnu funkcionalitu a sú pripravené pre produkčné nasadenie.",
"Official" : "Oficiálny",
"The backend does not support changing the display name" : "Backend nepodporuje zmenu zobrazovaného názvu",
diff --git a/apps/settings/l10n/vi.js b/apps/settings/l10n/vi.js
index 24f3d453700..377e633fc46 100644
--- a/apps/settings/l10n/vi.js
+++ b/apps/settings/l10n/vi.js
@@ -240,6 +240,7 @@ OC.L10N.register(
"Forum" : "Diễn đàn",
"None" : "Không gì cả",
"Login" : "Đăng nhập",
+ "Open documentation" : "Mở tài liệu",
"Encryption" : "Mã hóa",
"Authentication required" : "Cần phải được xác thực",
"Server address" : "Địa chỉ máy chủ",
diff --git a/apps/settings/l10n/vi.json b/apps/settings/l10n/vi.json
index 94120357a3c..4b0e82cc782 100644
--- a/apps/settings/l10n/vi.json
+++ b/apps/settings/l10n/vi.json
@@ -238,6 +238,7 @@
"Forum" : "Diễn đàn",
"None" : "Không gì cả",
"Login" : "Đăng nhập",
+ "Open documentation" : "Mở tài liệu",
"Encryption" : "Mã hóa",
"Authentication required" : "Cần phải được xác thực",
"Server address" : "Địa chỉ máy chủ",
diff --git a/apps/theming/l10n/vi.js b/apps/theming/l10n/vi.js
index 06467c619a3..6f4eacd1a48 100644
--- a/apps/theming/l10n/vi.js
+++ b/apps/theming/l10n/vi.js
@@ -5,8 +5,14 @@ OC.L10N.register(
"Saved" : "Đã lưu",
"Admin" : "Quản trị hệ thống",
"a safe home for all your data" : "Một ngôi nhà an toàn cho toàn bộ dữ liệu của bạn",
+ "Name cannot be empty" : "Tên không thể bị bỏ trống",
"The given name is too long" : "Tên quá dài",
"The given web address is too long" : "Địa chỉ web quá dài",
+ "The given web address is not a valid URL" : "Địa chỉ web được cấp không phải là một đường dân URL khả dụng",
+ "The given legal notice address is too long" : "Địa chỉ thông cáo pháp lý được cấp quá dài",
+ "The given legal notice address is not a valid URL" : "Địa chỉ thông cáo pháp lý được cấp không phải là một đường dẫn URL khả dụng",
+ "The given privacy policy address is too long" : "Địa chỉ chính sách riêng tư quá dài",
+ "The given privacy policy address is not a valid URL" : "Địa chỉ chính sách riêng tư được cấp không phải là một đường dẫn URL khả dụng",
"The given slogan is too long" : "Khẩu hiệu quá dài",
"The given color is invalid" : "Màu đã chọn không hợp lệ",
"The file was uploaded" : "Tập tin đã được tải lên",
@@ -19,11 +25,17 @@ OC.L10N.register(
"A PHP extension stopped the file upload" : "Một chức năng mở rộng của PHP đã dừng tải tệp lên",
"No file uploaded" : "Không có tệp nào được tải lên",
"Unsupported image type" : "Loại hình ảnh không được hỗ trợ",
+ "You are already using a custom theme. Theming app settings might be overwritten by that." : "Bạn đang sử dụng 1 chủ đề riêng. Các thiết lập của ứng dụng Chủ đề có thể bị ghi đè bởi nó.",
"Theming" : "Điều chỉnh giao diện",
+ "Legal notice" : "Thông cáo pháp lý",
"Privacy policy" : "Chính sách riêng tư",
+ "Adjust the Nextcloud theme" : "Tinh chỉnh chủ đề Nextcloud",
+ "Open documentation" : "Mở tài liệu",
"Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Điều chỉnh giao diện cho phép bạn có thể dễ dàng tùy biến bố cục trình bày của hệ thống. Khi thực hiện nó sẽ hiện hữu đối với tất cả người dùng",
"Name" : "Tên",
"Reset to default" : "Đặt lại về mặc định",
+ "Web link" : "Liên kết web",
+ "https://…" : "https://…",
"Slogan" : "Khẩu hiệu",
"Color" : "Màu sắc",
"Logo" : "Logo",
@@ -31,6 +43,13 @@ OC.L10N.register(
"Login image" : "Hình ảnh trang đăng nhập",
"Upload new login background" : "Tải lên ảnh nền trang đăng nhập mới",
"Remove background image" : "Xóa bỏ ảnh nền",
- "Advanced options" : "Tùy chọn nâng cao"
+ "Advanced options" : "Tùy chọn nâng cao",
+ "Legal notice link" : "Liên kết Thông cáo pháp lý",
+ "Privacy policy link" : "Liên kết Chính sách riêng tư",
+ "Header logo" : "Logo đầu trang",
+ "Upload new header logo" : "Tải lên logo đầu trang mới",
+ "Favicon" : "Favicon",
+ "Upload new favicon" : "Tải lên bộ Favicon mới",
+ "Install the Imagemagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Cài đặt phần mở rộng PHP Imagemagick với hỗ trợ cho hình ảnh SVG để tự động tạo bộ favicon dựa trên màu và logo được tải lên"
},
"nplurals=1; plural=0;");
diff --git a/apps/theming/l10n/vi.json b/apps/theming/l10n/vi.json
index ed775dcc5a0..e7814ec7275 100644
--- a/apps/theming/l10n/vi.json
+++ b/apps/theming/l10n/vi.json
@@ -3,8 +3,14 @@
"Saved" : "Đã lưu",
"Admin" : "Quản trị hệ thống",
"a safe home for all your data" : "Một ngôi nhà an toàn cho toàn bộ dữ liệu của bạn",
+ "Name cannot be empty" : "Tên không thể bị bỏ trống",
"The given name is too long" : "Tên quá dài",
"The given web address is too long" : "Địa chỉ web quá dài",
+ "The given web address is not a valid URL" : "Địa chỉ web được cấp không phải là một đường dân URL khả dụng",
+ "The given legal notice address is too long" : "Địa chỉ thông cáo pháp lý được cấp quá dài",
+ "The given legal notice address is not a valid URL" : "Địa chỉ thông cáo pháp lý được cấp không phải là một đường dẫn URL khả dụng",
+ "The given privacy policy address is too long" : "Địa chỉ chính sách riêng tư quá dài",
+ "The given privacy policy address is not a valid URL" : "Địa chỉ chính sách riêng tư được cấp không phải là một đường dẫn URL khả dụng",
"The given slogan is too long" : "Khẩu hiệu quá dài",
"The given color is invalid" : "Màu đã chọn không hợp lệ",
"The file was uploaded" : "Tập tin đã được tải lên",
@@ -17,11 +23,17 @@
"A PHP extension stopped the file upload" : "Một chức năng mở rộng của PHP đã dừng tải tệp lên",
"No file uploaded" : "Không có tệp nào được tải lên",
"Unsupported image type" : "Loại hình ảnh không được hỗ trợ",
+ "You are already using a custom theme. Theming app settings might be overwritten by that." : "Bạn đang sử dụng 1 chủ đề riêng. Các thiết lập của ứng dụng Chủ đề có thể bị ghi đè bởi nó.",
"Theming" : "Điều chỉnh giao diện",
+ "Legal notice" : "Thông cáo pháp lý",
"Privacy policy" : "Chính sách riêng tư",
+ "Adjust the Nextcloud theme" : "Tinh chỉnh chủ đề Nextcloud",
+ "Open documentation" : "Mở tài liệu",
"Theming makes it possible to easily customize the look and feel of your instance and supported clients. This will be visible for all users." : "Điều chỉnh giao diện cho phép bạn có thể dễ dàng tùy biến bố cục trình bày của hệ thống. Khi thực hiện nó sẽ hiện hữu đối với tất cả người dùng",
"Name" : "Tên",
"Reset to default" : "Đặt lại về mặc định",
+ "Web link" : "Liên kết web",
+ "https://…" : "https://…",
"Slogan" : "Khẩu hiệu",
"Color" : "Màu sắc",
"Logo" : "Logo",
@@ -29,6 +41,13 @@
"Login image" : "Hình ảnh trang đăng nhập",
"Upload new login background" : "Tải lên ảnh nền trang đăng nhập mới",
"Remove background image" : "Xóa bỏ ảnh nền",
- "Advanced options" : "Tùy chọn nâng cao"
+ "Advanced options" : "Tùy chọn nâng cao",
+ "Legal notice link" : "Liên kết Thông cáo pháp lý",
+ "Privacy policy link" : "Liên kết Chính sách riêng tư",
+ "Header logo" : "Logo đầu trang",
+ "Upload new header logo" : "Tải lên logo đầu trang mới",
+ "Favicon" : "Favicon",
+ "Upload new favicon" : "Tải lên bộ Favicon mới",
+ "Install the Imagemagick PHP extension with support for SVG images to automatically generate favicons based on the uploaded logo and color." : "Cài đặt phần mở rộng PHP Imagemagick với hỗ trợ cho hình ảnh SVG để tự động tạo bộ favicon dựa trên màu và logo được tải lên"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/user_ldap/l10n/de.js b/apps/user_ldap/l10n/de.js
index 88670f43cea..5dfec269399 100644
--- a/apps/user_ldap/l10n/de.js
+++ b/apps/user_ldap/l10n/de.js
@@ -164,7 +164,7 @@ OC.L10N.register(
"Paging chunksize" : "Seitenstücke (Paging chunksize)",
"Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Abschnittslänge von seitenweise angezeigten LDAP-Suchen, die bei Suchen wie etwa Benutzer- und Gruppen-Auflistungen ausufernd viele Ergebnisse liefern können (die Einstellung „0“ deaktiviert seitenweise angezeigte LDAP-Suchen in diesen Situationen).",
"Enable LDAP password changes per user" : "LDAP-Passwortänderungen pro Benutzer aktivieren",
- "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "LDAP-Nutzern die Änderung ihrer Passwörter erlauben und Super-Administratoren sowie Gruppen-Administratoren die Passwortänderung ihrer LDAP-Nutzer erlauben. \nDies funktioniert nur, wenn die Zugriffsrichtlinien auf dem LDAP-Server entsprechend konfiguriert sind. Da Passwörter im Klartext an den LDAP-Server gesendet werden, muss die Transportverschlüsselung verwendet werden und das Passwort-Hashing auf dem LDAP-Server sollte konfiguriert werden.",
+ "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "LDAP-Nutzern die Änderung ihrer Passwörter erlauben und Super-Administratoren sowie Gruppen-Administratoren die Passwortänderung ihrer LDAP-Nutzer erlauben. Dies funktioniert nur, wenn die Zugriffsrichtlinien auf dem LDAP-Server entsprechend konfiguriert sind. Da Passwörter im Klartext an den LDAP-Server gesendet werden, muss die Transportverschlüsselung verwendet werden und das Passwort-Hashing auf dem LDAP-Server sollte konfiguriert werden.",
"(New password is sent as plain text to LDAP)" : "(Das neue Passwort wurde als einfacher Text an LDAP gesendet)",
"Default password policy DN" : "Standard Passwort-Regeln DN",
"The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "Die DN einer Standard-Passwort-Policy, welche für den Umgang mit ablaufenden Passwörtern verwendet wird. Dies funktioniert nur wenn Passwort-Änderungen pro Benutzer via LDAP und OpenLDAP aktiviert sind. Leer lassen, um die Passwortablaufbehandlung zu deaktivieren.",
diff --git a/apps/user_ldap/l10n/de.json b/apps/user_ldap/l10n/de.json
index c1fb02a6a6f..234c07f605c 100644
--- a/apps/user_ldap/l10n/de.json
+++ b/apps/user_ldap/l10n/de.json
@@ -162,7 +162,7 @@
"Paging chunksize" : "Seitenstücke (Paging chunksize)",
"Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Abschnittslänge von seitenweise angezeigten LDAP-Suchen, die bei Suchen wie etwa Benutzer- und Gruppen-Auflistungen ausufernd viele Ergebnisse liefern können (die Einstellung „0“ deaktiviert seitenweise angezeigte LDAP-Suchen in diesen Situationen).",
"Enable LDAP password changes per user" : "LDAP-Passwortänderungen pro Benutzer aktivieren",
- "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "LDAP-Nutzern die Änderung ihrer Passwörter erlauben und Super-Administratoren sowie Gruppen-Administratoren die Passwortänderung ihrer LDAP-Nutzer erlauben. \nDies funktioniert nur, wenn die Zugriffsrichtlinien auf dem LDAP-Server entsprechend konfiguriert sind. Da Passwörter im Klartext an den LDAP-Server gesendet werden, muss die Transportverschlüsselung verwendet werden und das Passwort-Hashing auf dem LDAP-Server sollte konfiguriert werden.",
+ "Allow LDAP users to change their password and allow Super Administrators and Group Administrators to change the password of their LDAP users. Only works when access control policies are configured accordingly on the LDAP server. As passwords are sent in plaintext to the LDAP server, transport encryption must be used and password hashing should be configured on the LDAP server." : "LDAP-Nutzern die Änderung ihrer Passwörter erlauben und Super-Administratoren sowie Gruppen-Administratoren die Passwortänderung ihrer LDAP-Nutzer erlauben. Dies funktioniert nur, wenn die Zugriffsrichtlinien auf dem LDAP-Server entsprechend konfiguriert sind. Da Passwörter im Klartext an den LDAP-Server gesendet werden, muss die Transportverschlüsselung verwendet werden und das Passwort-Hashing auf dem LDAP-Server sollte konfiguriert werden.",
"(New password is sent as plain text to LDAP)" : "(Das neue Passwort wurde als einfacher Text an LDAP gesendet)",
"Default password policy DN" : "Standard Passwort-Regeln DN",
"The DN of a default password policy that will be used for password expiry handling. Works only when LDAP password changes per user are enabled and is only supported by OpenLDAP. Leave empty to disable password expiry handling." : "Die DN einer Standard-Passwort-Policy, welche für den Umgang mit ablaufenden Passwörtern verwendet wird. Dies funktioniert nur wenn Passwort-Änderungen pro Benutzer via LDAP und OpenLDAP aktiviert sind. Leer lassen, um die Passwortablaufbehandlung zu deaktivieren.",
diff --git a/apps/user_ldap/l10n/tr.js b/apps/user_ldap/l10n/tr.js
index 09a547cb4d0..f88ad52d416 100644
--- a/apps/user_ldap/l10n/tr.js
+++ b/apps/user_ldap/l10n/tr.js
@@ -66,7 +66,7 @@ OC.L10N.register(
"Could not find the desired feature" : "İstenilen özellik bulunamadı",
"Invalid Host" : "Sunucu Geçersiz",
"LDAP user and group backend" : "LDAP kullanıcı ve grup arka yüzü",
- "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Bu uygulama yöneticilerin Nextcloud sunucusu ile bir LDAP temelli kullanıcı dizini arasında bağlantı kurmasını sağlar.",
+ "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Bu uygulama BT yöneticilerinin Nextcloud sunucusu ile bir LDAP temelli kullanıcı dizini arasında bağlantı kurmasını sağlar.",
"This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Bu uygulama, yöneticilerin kimlik doğrulamak, kullanıcı ve grup oluşturmak ve kullanıcı öznitelikleri atamak için Nextcloud sunucusu ile LDAP temelli bir kullanıcı dizini arasında bağlantı kurmasını sağlar. Yöneticiler LDAP arayüzünden bu uygulamayı birden fazla LDAP dizini ya da Aktif Dizine bağlanacak şekilde yapılandırabilir. Kullanıcı kotası, e-posta, avatar görselleri, grup üyelikleri gibi kullanıcı öznitelikleri uygun sorgu ve süzgeçler kullanılarak dizin üzerinden Nextcloud üzerine çekilebilir.\n\nKullanıcılar Nextcloud oturumunu açmak için LDAP ya da AD kimlik doğrulama bilgilerini kullanır ve LDAP ya da AD sunucusunun vereceği onay ve izinlere göre erişim iznine sahip olur. Nextcloud üzerinde LDAP ya da AD parolaları depolanmaz. Bunun yerine bir kullanıcının kimliğini doğrulamak için kimlik doğrulama bilgileri kullanılır ve Nextcloud Kullanıcı Kodu için bir oturum kullanır. Ayrıntılı bilgi almak için LDAP Kullanıcı ve Grup Arka Yüzü belgelerine bakabilirsiniz.",
"Test Configuration" : "Yapılandırmayı Sına",
"Help" : "Yardım",
@@ -129,7 +129,7 @@ OC.L10N.register(
"Groups" : "Gruplar",
"Expert" : "Uzman",
"Advanced" : "Gelişmiş",
- "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Uyarı:</b> PHP LDAP modülü kurulmamış, arka uç çalışmayacak. Lütfen kurulumu için sistem yöneticinizle görüşün.",
+ "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Uyarı:</b> PHP LDAP modülü kurulmamış, arka uç çalışmayacak. Lütfen kurması için BT yöneticinizle görüşün.",
"Connection Settings" : "Bağlantı Ayarları",
"Configuration Active" : "Yapılandırma Etkin",
"When unchecked, this configuration will be skipped." : "Bu seçenek işaretli değilse, bu yapılandırma atlanır.",
diff --git a/apps/user_ldap/l10n/tr.json b/apps/user_ldap/l10n/tr.json
index aa4a72a6a9d..0838c876afb 100644
--- a/apps/user_ldap/l10n/tr.json
+++ b/apps/user_ldap/l10n/tr.json
@@ -64,7 +64,7 @@
"Could not find the desired feature" : "İstenilen özellik bulunamadı",
"Invalid Host" : "Sunucu Geçersiz",
"LDAP user and group backend" : "LDAP kullanıcı ve grup arka yüzü",
- "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Bu uygulama yöneticilerin Nextcloud sunucusu ile bir LDAP temelli kullanıcı dizini arasında bağlantı kurmasını sağlar.",
+ "This application enables administrators to connect Nextcloud to an LDAP-based user directory." : "Bu uygulama BT yöneticilerinin Nextcloud sunucusu ile bir LDAP temelli kullanıcı dizini arasında bağlantı kurmasını sağlar.",
"This application enables administrators to connect Nextcloud to an LDAP-based user directory for authentication and provisioning users, groups and user attributes. Admins can configure this application to connect to one or more LDAP directories or Active Directories via an LDAP interface. Attributes such as user quota, email, avatar pictures, group memberships and more can be pulled into Nextcloud from a directory with the appropriate queries and filters.\n\nA user logs into Nextcloud with their LDAP or AD credentials, and is granted access based on an authentication request handled by the LDAP or AD server. Nextcloud does not store LDAP or AD passwords, rather these credentials are used to authenticate a user and then Nextcloud uses a session for the user ID. More information is available in the LDAP User and Group Backend documentation." : "Bu uygulama, yöneticilerin kimlik doğrulamak, kullanıcı ve grup oluşturmak ve kullanıcı öznitelikleri atamak için Nextcloud sunucusu ile LDAP temelli bir kullanıcı dizini arasında bağlantı kurmasını sağlar. Yöneticiler LDAP arayüzünden bu uygulamayı birden fazla LDAP dizini ya da Aktif Dizine bağlanacak şekilde yapılandırabilir. Kullanıcı kotası, e-posta, avatar görselleri, grup üyelikleri gibi kullanıcı öznitelikleri uygun sorgu ve süzgeçler kullanılarak dizin üzerinden Nextcloud üzerine çekilebilir.\n\nKullanıcılar Nextcloud oturumunu açmak için LDAP ya da AD kimlik doğrulama bilgilerini kullanır ve LDAP ya da AD sunucusunun vereceği onay ve izinlere göre erişim iznine sahip olur. Nextcloud üzerinde LDAP ya da AD parolaları depolanmaz. Bunun yerine bir kullanıcının kimliğini doğrulamak için kimlik doğrulama bilgileri kullanılır ve Nextcloud Kullanıcı Kodu için bir oturum kullanır. Ayrıntılı bilgi almak için LDAP Kullanıcı ve Grup Arka Yüzü belgelerine bakabilirsiniz.",
"Test Configuration" : "Yapılandırmayı Sına",
"Help" : "Yardım",
@@ -127,7 +127,7 @@
"Groups" : "Gruplar",
"Expert" : "Uzman",
"Advanced" : "Gelişmiş",
- "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Uyarı:</b> PHP LDAP modülü kurulmamış, arka uç çalışmayacak. Lütfen kurulumu için sistem yöneticinizle görüşün.",
+ "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Uyarı:</b> PHP LDAP modülü kurulmamış, arka uç çalışmayacak. Lütfen kurması için BT yöneticinizle görüşün.",
"Connection Settings" : "Bağlantı Ayarları",
"Configuration Active" : "Yapılandırma Etkin",
"When unchecked, this configuration will be skipped." : "Bu seçenek işaretli değilse, bu yapılandırma atlanır.",
diff --git a/core/l10n/de.js b/core/l10n/de.js
index 401d7d4770c..b67d5bd9acd 100644
--- a/core/l10n/de.js
+++ b/core/l10n/de.js
@@ -157,9 +157,9 @@ OC.L10N.register(
"I know what I'm doing" : "Ich weiß, was ich mache",
"Resetting password" : "Setze Passwort zurück",
"Recommended apps" : "Empfohlene Apps",
- "Loading apps …" : "Lade Apps…",
- "Could not fetch list of apps from the app store." : "Listte der Apps kann nicht vom App-Store abgerufen werden",
- "Installing apps …" : "Installiere Apps…",
+ "Loading apps …" : "Lade Apps …",
+ "Could not fetch list of apps from the app store." : "Liste der Apps kann nicht vom App Store abgerufen werden.",
+ "Installing apps …" : "Installiere Apps …",
"Nextcloud {app}" : "Nextcloud {app}",
"App download or installation failed" : "Herunterladen oder Installieren der App fehlgeschlagen",
"Can't install this app because it is not compatible" : "App kann nicht installiert werden, da sie inkompatibel ist",
diff --git a/core/l10n/de.json b/core/l10n/de.json
index 792f3704d19..1d9b50d2709 100644
--- a/core/l10n/de.json
+++ b/core/l10n/de.json
@@ -155,9 +155,9 @@
"I know what I'm doing" : "Ich weiß, was ich mache",
"Resetting password" : "Setze Passwort zurück",
"Recommended apps" : "Empfohlene Apps",
- "Loading apps …" : "Lade Apps…",
- "Could not fetch list of apps from the app store." : "Listte der Apps kann nicht vom App-Store abgerufen werden",
- "Installing apps …" : "Installiere Apps…",
+ "Loading apps …" : "Lade Apps …",
+ "Could not fetch list of apps from the app store." : "Liste der Apps kann nicht vom App Store abgerufen werden.",
+ "Installing apps …" : "Installiere Apps …",
"Nextcloud {app}" : "Nextcloud {app}",
"App download or installation failed" : "Herunterladen oder Installieren der App fehlgeschlagen",
"Can't install this app because it is not compatible" : "App kann nicht installiert werden, da sie inkompatibel ist",
diff --git a/core/l10n/de_DE.js b/core/l10n/de_DE.js
index 8930073d355..099a7785431 100644
--- a/core/l10n/de_DE.js
+++ b/core/l10n/de_DE.js
@@ -157,9 +157,9 @@ OC.L10N.register(
"I know what I'm doing" : "Ich weiß, was ich mache",
"Resetting password" : "Setze Passwort zurück",
"Recommended apps" : "Empfohlene Apps",
- "Loading apps …" : "Lade Apps…",
- "Could not fetch list of apps from the app store." : "Listte der Apps kann nicht vom App-Store abgerufen werden",
- "Installing apps …" : "Installiere Apps…",
+ "Loading apps …" : "Lade Apps …",
+ "Could not fetch list of apps from the app store." : "Liste der Apps kann nicht vom App Store abgerufen werden",
+ "Installing apps …" : "Installiere Apps …",
"Nextcloud {app}" : "Nextcloud {app}",
"App download or installation failed" : "Herunterladen oder Installieren der App fehlgeschlagen",
"Can't install this app because it is not compatible" : "App kann nicht installiert werden, da sie inkompatibel ist",
@@ -295,7 +295,7 @@ OC.L10N.register(
"It looks like you are trying to reinstall your Nextcloud. However the file CAN_INSTALL is missing from your config directory. Please create the file CAN_INSTALL in your config folder to continue." : "Es sieht so aus, als ob Sie Nextcloud erneut installieren möchten. Es fehlt jedoch die Datei CAN_INSTALL in ihrem Konfigurationsordner. Bitte erstellen sie die Datei CAN_INSTALL im Konfigurationsordner um fortzufahren.",
"Could not remove CAN_INSTALL from the config folder. Please remove this file manually." : "CAN_INSTALL kann nicht aus dem Konfigurationsordner gelöscht werden. Bitte entfernen Sie die Datei manuell.",
"This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Diese Anwendung benötigt JavaScript zum ordnungsgemäßen Betrieb. Bitte {linkstart}aktivieren Sie JavaScript{linkend} und laden Sie die Seite neu.",
- "Get your own free account" : "Holen Sie sich ihr eigenes kostenloses Konto",
+ "Get your own free account" : "Holen Sie sich Ihr eigenes kostenloses Konto",
"Skip to main content" : "Zum Hauptinhalt springen",
"Skip to navigation of app" : "Zum Navigationsbereich der App springen",
"More apps" : "Weitere Apps",
diff --git a/core/l10n/de_DE.json b/core/l10n/de_DE.json
index 4b32a33b923..0306df7cc34 100644
--- a/core/l10n/de_DE.json
+++ b/core/l10n/de_DE.json
@@ -155,9 +155,9 @@
"I know what I'm doing" : "Ich weiß, was ich mache",
"Resetting password" : "Setze Passwort zurück",
"Recommended apps" : "Empfohlene Apps",
- "Loading apps …" : "Lade Apps…",
- "Could not fetch list of apps from the app store." : "Listte der Apps kann nicht vom App-Store abgerufen werden",
- "Installing apps …" : "Installiere Apps…",
+ "Loading apps …" : "Lade Apps …",
+ "Could not fetch list of apps from the app store." : "Liste der Apps kann nicht vom App Store abgerufen werden",
+ "Installing apps …" : "Installiere Apps …",
"Nextcloud {app}" : "Nextcloud {app}",
"App download or installation failed" : "Herunterladen oder Installieren der App fehlgeschlagen",
"Can't install this app because it is not compatible" : "App kann nicht installiert werden, da sie inkompatibel ist",
@@ -293,7 +293,7 @@
"It looks like you are trying to reinstall your Nextcloud. However the file CAN_INSTALL is missing from your config directory. Please create the file CAN_INSTALL in your config folder to continue." : "Es sieht so aus, als ob Sie Nextcloud erneut installieren möchten. Es fehlt jedoch die Datei CAN_INSTALL in ihrem Konfigurationsordner. Bitte erstellen sie die Datei CAN_INSTALL im Konfigurationsordner um fortzufahren.",
"Could not remove CAN_INSTALL from the config folder. Please remove this file manually." : "CAN_INSTALL kann nicht aus dem Konfigurationsordner gelöscht werden. Bitte entfernen Sie die Datei manuell.",
"This application requires JavaScript for correct operation. Please {linkstart}enable JavaScript{linkend} and reload the page." : "Diese Anwendung benötigt JavaScript zum ordnungsgemäßen Betrieb. Bitte {linkstart}aktivieren Sie JavaScript{linkend} und laden Sie die Seite neu.",
- "Get your own free account" : "Holen Sie sich ihr eigenes kostenloses Konto",
+ "Get your own free account" : "Holen Sie sich Ihr eigenes kostenloses Konto",
"Skip to main content" : "Zum Hauptinhalt springen",
"Skip to navigation of app" : "Zum Navigationsbereich der App springen",
"More apps" : "Weitere Apps",
diff --git a/core/l10n/tr.js b/core/l10n/tr.js
index 667e7459cb6..94b904d84dd 100644
--- a/core/l10n/tr.js
+++ b/core/l10n/tr.js
@@ -135,9 +135,9 @@ OC.L10N.register(
"Log in" : "Oturum Aç",
"Logging in …" : "Oturum açılıyor …",
"Server side authentication failed!" : "Kimlik sunucu tarafında doğrulanamadı!",
- "Please contact your administrator." : "Lütfen sistem yöneticiniz ile görüşün.",
+ "Please contact your administrator." : "Lütfen BT yöneticiniz ile görüşün.",
"An internal error occurred." : "İçeride bir sorun çıktı.",
- "Please try again or contact your administrator." : "Lütfen yeniden deneyin ya da yöneticinizle görüşün.",
+ "Please try again or contact your administrator." : "Lütfen yeniden deneyin ya da BT yöneticinizle görüşün.",
"Username or email" : "Kullanıcı adı ya da e-posta",
"Password" : "Parola",
"Wrong username or password." : "Kullanıcı adı ya da parola hatalı.",
@@ -147,13 +147,13 @@ OC.L10N.register(
"Passwordless authentication is not supported in your browser." : "Parolasız kimlik doğrulama özelliği web tarayıcınız tarafından desteklenmiyor.",
"Passwordless authentication is only available over a secure connection." : "Parolasız kimlik doğrulama özelliği yalnız güvenli bir bağlantı üzerinden kullanılabilir.",
"Reset password" : "Parolayı sıfırla",
- "A password reset message has been sent to the e-mail address of this account. If you do not receive it, check your spam/junk folders or ask your local administrator for help." : "Bu hesabın e-posta adresine bir parola sıfırlama iletisi gönderildi. Bir e-posta almazsanız gelen kutunuzdaki spam/gereksiz klasörlerine bakın ya da yardım almak için sistem yöneticinizle görüşün.",
- "If it is not there ask your local administrator." : "E-postayı göremiyorsanız yerel sistem yöneticinizle görüşün.",
- "Couldn't send reset email. Please contact your administrator." : "Sıfırlama e-postası gönderilemedi. Lütfen yöneticiniz ile görüşün.",
- "Password can not be changed. Please contact your administrator." : "Parola değiştirilemedi. Lütfen yöneticiniz ile görüşün.",
+ "A password reset message has been sent to the e-mail address of this account. If you do not receive it, check your spam/junk folders or ask your local administrator for help." : "Bu hesabın e-posta adresine bir parola sıfırlama iletisi gönderildi. Bir e-posta almazsanız gelen kutunuzdaki spam/gereksiz klasörlerine bakın ya da yardım almak için BT yöneticinizle görüşün.",
+ "If it is not there ask your local administrator." : "E-postayı göremiyorsanız yerel BT yöneticinizle görüşün.",
+ "Couldn't send reset email. Please contact your administrator." : "Sıfırlama e-postası gönderilemedi. Lütfen BT yöneticiniz ile görüşün.",
+ "Password can not be changed. Please contact your administrator." : "Parola değiştirilemedi. Lütfen BT yöneticiniz ile görüşün.",
"Back to login" : "Oturum açmaya geri dön",
"New password" : "Yeni parola",
- "Your files are encrypted. There will be no way to get your data back after your password is reset. If you are not sure what to do, please contact your administrator before you continue. Do you really want to continue?" : "Dosyalarınız şifrelendi. Parolanız sıfırlandıktan sonra verilerinizi geri almanın herhangi bir yolu olmayacak. Ne yapacağınızı bilmiyorsanız ilerlemeden önce sistem yöneticiniz ile görüşün. İlerlemek istediğinizden emin misiniz? ",
+ "Your files are encrypted. There will be no way to get your data back after your password is reset. If you are not sure what to do, please contact your administrator before you continue. Do you really want to continue?" : "Dosyalarınız şifrelendi. Parolanız sıfırlandıktan sonra verilerinizi geri almanın herhangi bir yolu olmayacak. Ne yapacağınızı bilmiyorsanız ilerlemeden önce BT yöneticiniz ile görüşün. İlerlemek istediğinizden emin misiniz? ",
"I know what I'm doing" : "Ne yaptığımı biliyorum",
"Resetting password" : "Parola sıfırlanıyor",
"Recommended apps" : "Önerilen uygulamalar",
@@ -253,7 +253,7 @@ OC.L10N.register(
"Error" : "Hata",
"Internal Server Error" : "Sunucu İçinde Sorun",
"The server was unable to complete your request." : "Sunucu isteğinizi yerine getiremedi.",
- "If this happens again, please send the technical details below to the server administrator." : "Bu sorun sürerse lütfen aşağıdaki teknik ayrıntıları sunucu yöneticisine iletin.",
+ "If this happens again, please send the technical details below to the server administrator." : "Bu sorun sürerse lütfen aşağıdaki teknik ayrıntıları BT yöneticinize iletin.",
"More details can be found in the server log." : "Sunucu günlüğünden ayrıntılı bilgi alabilirsiniz.",
"Technical details" : "Teknik ayrıntılar",
"Remote Address: %s" : "Uzak Adres: %s",
@@ -332,7 +332,7 @@ OC.L10N.register(
"Enhanced security is enforced for your account. Choose which provider to set up:" : "Hesabınız için gelişmiş güvenlik kullanımı dayatılmış. Kuracağınız hizmet sağlayıcıyı seçin:",
"Error while validating your second factor" : "İkinci aşama doğrulanırken sorun çıktı",
"Access through untrusted domain" : "Güvenilmeyen etki alanı üzerinden erişim",
- "Please contact your administrator. If you are an administrator, edit the \"trusted_domains\" setting in config/config.php like the example in config.sample.php." : "Lütfen yöneticiniz ile görüşün. Yöneticisi siz iseniz, config/config.php dosyası içerisindeki \"trusted_domain\" ayarını config/config.sample.php dosyasındaki gibi düzenleyin.",
+ "Please contact your administrator. If you are an administrator, edit the \"trusted_domains\" setting in config/config.php like the example in config.sample.php." : "Lütfen BT yöneticiniz ile görüşün. Yöneticisi siz iseniz, config/config.php dosyası içerisindeki \"trusted_domain\" ayarını config/config.sample.php dosyasındaki gibi düzenleyin.",
"Further information how to configure this can be found in the %1$sdocumentation%2$s." : "Bu ayar ile ilgili ayrıntılı bilgi almak için %1$sbelgelere%2$s bakabilirsiniz.",
"App update required" : "Uygulamanın güncellenmesi gerekli",
"%1$s will be updated to version %2$s" : "%1$s, %2$s sürümüne güncellenecek",
@@ -351,11 +351,11 @@ OC.L10N.register(
"Maintenance mode" : "Bakım kipi",
"This %s instance is currently in maintenance mode, which may take a while." : "Bu %s kopyası şu anda bakım kipinde, bu işlem biraz zaman alabilir.",
"This page will refresh itself when the instance is available again." : "Sistem yeniden kullanılabilir olduğunda bu sayfa kendiliğinden yenilenecek",
- "Contact your system administrator if this message persists or appeared unexpectedly." : "Bu ileti görüntülenmeye devam ediyor ya da beklenmedik şekilde ortaya çıkıyorsa sistem yöneticinizle görüşün.",
- "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Bu kullanıcı için bir e-posta adresi olmadığından sıfırlama e-postası gönderilemedi. Lütfen yöneticiniz ile görüşün.",
+ "Contact your system administrator if this message persists or appeared unexpectedly." : "Bu ileti görüntülenmeye devam ediyor ya da beklenmedik şekilde ortaya çıkıyorsa BT yöneticinizle görüşün.",
+ "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Bu kullanıcı için bir e-posta adresi olmadığından sıfırlama e-postası gönderilemedi. Lütfen BT yöneticiniz ile görüşün.",
"Couldn't send reset email. Please make sure your username is correct." : "Sıfırlama e-postası gönderilemedi. Lütfen kullanıcı adınızın doğru olduğundan emin olun.",
- "We have send a password reset e-mail to the e-mail address known to us for this account. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Bu hesabın kayıtlı e-posta adresine bir parola sıfırlama bağlantısı gönderildi. Makul bir süre içinde bir e-posta almazsanız gelen kutunuzdaki spam/gereksiz klasörlerine bakın.<br>E-postayı göremiyorsanız yerel sistem yöneticinizle görüşün.",
- "Your files are encrypted. There will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Dosyalarınız şifrelenmiş. Parola sıfırlama işleminden sonra verilerinize erişemeyeceksiniz.<br />Ne yapacağınızdan emin değilseniz, ilerlemeden önce sistem yöneticiniz ile görüşün.<br />Gerçekten devam etmek istiyor musunuz?",
+ "We have send a password reset e-mail to the e-mail address known to us for this account. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Bu hesabın kayıtlı e-posta adresine bir parola sıfırlama bağlantısı gönderildi. Makul bir süre içinde bir e-posta almazsanız gelen kutunuzdaki spam/gereksiz klasörlerine bakın.<br>E-postayı göremiyorsanız yerel BT yöneticinizle görüşün.",
+ "Your files are encrypted. There will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Dosyalarınız şifrelenmiş. Parola sıfırlama işleminden sonra verilerinize erişemeyeceksiniz.<br />Ne yapacağınızdan emin değilseniz, ilerlemeden önce BT yöneticiniz ile görüşün.<br />Gerçekten devam etmek istiyor musunuz?",
"Sending email …" : "E-posta gönderiliyor …",
"You are currently running PHP 5.6. The current major version of Nextcloud is the last that is supported on PHP 5.6. It is recommended to upgrade the PHP version to 7.0+ to be able to upgrade to Nextcloud 14." : "PHP 5.6 sürümünü kullanıyorsunuz. Geçerli Nextcloud ana sürümü PHP 5.6 sürümünü destekleyen son sürüm olacak. Nextcloud 14 sürümünü kullanabilmek için PHP sürümünü 7.0 ve üzerine yükseltmeniz önerilir.",
"Accessing site insecurely via HTTP. You are strongly adviced to set up your server to require HTTPS instead, as described in the <a href=\"{docUrl}\">security tips ↗</a>." : "Siteye HTTP üzerinden güvenli olmayan bağlantı ile erişiliyor. Sunucunuzu <a href=\"{docUrl}\">güvenlik ipuçlarında ↗</a> anlatıldığı şekilde HTTPS kullanılacak şekilde yapılandırmanız önemle önerilir.",
diff --git a/core/l10n/tr.json b/core/l10n/tr.json
index a1043ff029c..fe44565753b 100644
--- a/core/l10n/tr.json
+++ b/core/l10n/tr.json
@@ -133,9 +133,9 @@
"Log in" : "Oturum Aç",
"Logging in …" : "Oturum açılıyor …",
"Server side authentication failed!" : "Kimlik sunucu tarafında doğrulanamadı!",
- "Please contact your administrator." : "Lütfen sistem yöneticiniz ile görüşün.",
+ "Please contact your administrator." : "Lütfen BT yöneticiniz ile görüşün.",
"An internal error occurred." : "İçeride bir sorun çıktı.",
- "Please try again or contact your administrator." : "Lütfen yeniden deneyin ya da yöneticinizle görüşün.",
+ "Please try again or contact your administrator." : "Lütfen yeniden deneyin ya da BT yöneticinizle görüşün.",
"Username or email" : "Kullanıcı adı ya da e-posta",
"Password" : "Parola",
"Wrong username or password." : "Kullanıcı adı ya da parola hatalı.",
@@ -145,13 +145,13 @@
"Passwordless authentication is not supported in your browser." : "Parolasız kimlik doğrulama özelliği web tarayıcınız tarafından desteklenmiyor.",
"Passwordless authentication is only available over a secure connection." : "Parolasız kimlik doğrulama özelliği yalnız güvenli bir bağlantı üzerinden kullanılabilir.",
"Reset password" : "Parolayı sıfırla",
- "A password reset message has been sent to the e-mail address of this account. If you do not receive it, check your spam/junk folders or ask your local administrator for help." : "Bu hesabın e-posta adresine bir parola sıfırlama iletisi gönderildi. Bir e-posta almazsanız gelen kutunuzdaki spam/gereksiz klasörlerine bakın ya da yardım almak için sistem yöneticinizle görüşün.",
- "If it is not there ask your local administrator." : "E-postayı göremiyorsanız yerel sistem yöneticinizle görüşün.",
- "Couldn't send reset email. Please contact your administrator." : "Sıfırlama e-postası gönderilemedi. Lütfen yöneticiniz ile görüşün.",
- "Password can not be changed. Please contact your administrator." : "Parola değiştirilemedi. Lütfen yöneticiniz ile görüşün.",
+ "A password reset message has been sent to the e-mail address of this account. If you do not receive it, check your spam/junk folders or ask your local administrator for help." : "Bu hesabın e-posta adresine bir parola sıfırlama iletisi gönderildi. Bir e-posta almazsanız gelen kutunuzdaki spam/gereksiz klasörlerine bakın ya da yardım almak için BT yöneticinizle görüşün.",
+ "If it is not there ask your local administrator." : "E-postayı göremiyorsanız yerel BT yöneticinizle görüşün.",
+ "Couldn't send reset email. Please contact your administrator." : "Sıfırlama e-postası gönderilemedi. Lütfen BT yöneticiniz ile görüşün.",
+ "Password can not be changed. Please contact your administrator." : "Parola değiştirilemedi. Lütfen BT yöneticiniz ile görüşün.",
"Back to login" : "Oturum açmaya geri dön",
"New password" : "Yeni parola",
- "Your files are encrypted. There will be no way to get your data back after your password is reset. If you are not sure what to do, please contact your administrator before you continue. Do you really want to continue?" : "Dosyalarınız şifrelendi. Parolanız sıfırlandıktan sonra verilerinizi geri almanın herhangi bir yolu olmayacak. Ne yapacağınızı bilmiyorsanız ilerlemeden önce sistem yöneticiniz ile görüşün. İlerlemek istediğinizden emin misiniz? ",
+ "Your files are encrypted. There will be no way to get your data back after your password is reset. If you are not sure what to do, please contact your administrator before you continue. Do you really want to continue?" : "Dosyalarınız şifrelendi. Parolanız sıfırlandıktan sonra verilerinizi geri almanın herhangi bir yolu olmayacak. Ne yapacağınızı bilmiyorsanız ilerlemeden önce BT yöneticiniz ile görüşün. İlerlemek istediğinizden emin misiniz? ",
"I know what I'm doing" : "Ne yaptığımı biliyorum",
"Resetting password" : "Parola sıfırlanıyor",
"Recommended apps" : "Önerilen uygulamalar",
@@ -251,7 +251,7 @@
"Error" : "Hata",
"Internal Server Error" : "Sunucu İçinde Sorun",
"The server was unable to complete your request." : "Sunucu isteğinizi yerine getiremedi.",
- "If this happens again, please send the technical details below to the server administrator." : "Bu sorun sürerse lütfen aşağıdaki teknik ayrıntıları sunucu yöneticisine iletin.",
+ "If this happens again, please send the technical details below to the server administrator." : "Bu sorun sürerse lütfen aşağıdaki teknik ayrıntıları BT yöneticinize iletin.",
"More details can be found in the server log." : "Sunucu günlüğünden ayrıntılı bilgi alabilirsiniz.",
"Technical details" : "Teknik ayrıntılar",
"Remote Address: %s" : "Uzak Adres: %s",
@@ -330,7 +330,7 @@
"Enhanced security is enforced for your account. Choose which provider to set up:" : "Hesabınız için gelişmiş güvenlik kullanımı dayatılmış. Kuracağınız hizmet sağlayıcıyı seçin:",
"Error while validating your second factor" : "İkinci aşama doğrulanırken sorun çıktı",
"Access through untrusted domain" : "Güvenilmeyen etki alanı üzerinden erişim",
- "Please contact your administrator. If you are an administrator, edit the \"trusted_domains\" setting in config/config.php like the example in config.sample.php." : "Lütfen yöneticiniz ile görüşün. Yöneticisi siz iseniz, config/config.php dosyası içerisindeki \"trusted_domain\" ayarını config/config.sample.php dosyasındaki gibi düzenleyin.",
+ "Please contact your administrator. If you are an administrator, edit the \"trusted_domains\" setting in config/config.php like the example in config.sample.php." : "Lütfen BT yöneticiniz ile görüşün. Yöneticisi siz iseniz, config/config.php dosyası içerisindeki \"trusted_domain\" ayarını config/config.sample.php dosyasındaki gibi düzenleyin.",
"Further information how to configure this can be found in the %1$sdocumentation%2$s." : "Bu ayar ile ilgili ayrıntılı bilgi almak için %1$sbelgelere%2$s bakabilirsiniz.",
"App update required" : "Uygulamanın güncellenmesi gerekli",
"%1$s will be updated to version %2$s" : "%1$s, %2$s sürümüne güncellenecek",
@@ -349,11 +349,11 @@
"Maintenance mode" : "Bakım kipi",
"This %s instance is currently in maintenance mode, which may take a while." : "Bu %s kopyası şu anda bakım kipinde, bu işlem biraz zaman alabilir.",
"This page will refresh itself when the instance is available again." : "Sistem yeniden kullanılabilir olduğunda bu sayfa kendiliğinden yenilenecek",
- "Contact your system administrator if this message persists or appeared unexpectedly." : "Bu ileti görüntülenmeye devam ediyor ya da beklenmedik şekilde ortaya çıkıyorsa sistem yöneticinizle görüşün.",
- "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Bu kullanıcı için bir e-posta adresi olmadığından sıfırlama e-postası gönderilemedi. Lütfen yöneticiniz ile görüşün.",
+ "Contact your system administrator if this message persists or appeared unexpectedly." : "Bu ileti görüntülenmeye devam ediyor ya da beklenmedik şekilde ortaya çıkıyorsa BT yöneticinizle görüşün.",
+ "Could not send reset email because there is no email address for this username. Please contact your administrator." : "Bu kullanıcı için bir e-posta adresi olmadığından sıfırlama e-postası gönderilemedi. Lütfen BT yöneticiniz ile görüşün.",
"Couldn't send reset email. Please make sure your username is correct." : "Sıfırlama e-postası gönderilemedi. Lütfen kullanıcı adınızın doğru olduğundan emin olun.",
- "We have send a password reset e-mail to the e-mail address known to us for this account. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Bu hesabın kayıtlı e-posta adresine bir parola sıfırlama bağlantısı gönderildi. Makul bir süre içinde bir e-posta almazsanız gelen kutunuzdaki spam/gereksiz klasörlerine bakın.<br>E-postayı göremiyorsanız yerel sistem yöneticinizle görüşün.",
- "Your files are encrypted. There will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Dosyalarınız şifrelenmiş. Parola sıfırlama işleminden sonra verilerinize erişemeyeceksiniz.<br />Ne yapacağınızdan emin değilseniz, ilerlemeden önce sistem yöneticiniz ile görüşün.<br />Gerçekten devam etmek istiyor musunuz?",
+ "We have send a password reset e-mail to the e-mail address known to us for this account. If you do not receive it within a reasonable amount of time, check your spam/junk folders.<br>If it is not there ask your local administrator." : "Bu hesabın kayıtlı e-posta adresine bir parola sıfırlama bağlantısı gönderildi. Makul bir süre içinde bir e-posta almazsanız gelen kutunuzdaki spam/gereksiz klasörlerine bakın.<br>E-postayı göremiyorsanız yerel BT yöneticinizle görüşün.",
+ "Your files are encrypted. There will be no way to get your data back after your password is reset.<br />If you are not sure what to do, please contact your administrator before you continue. <br />Do you really want to continue?" : "Dosyalarınız şifrelenmiş. Parola sıfırlama işleminden sonra verilerinize erişemeyeceksiniz.<br />Ne yapacağınızdan emin değilseniz, ilerlemeden önce BT yöneticiniz ile görüşün.<br />Gerçekten devam etmek istiyor musunuz?",
"Sending email …" : "E-posta gönderiliyor …",
"You are currently running PHP 5.6. The current major version of Nextcloud is the last that is supported on PHP 5.6. It is recommended to upgrade the PHP version to 7.0+ to be able to upgrade to Nextcloud 14." : "PHP 5.6 sürümünü kullanıyorsunuz. Geçerli Nextcloud ana sürümü PHP 5.6 sürümünü destekleyen son sürüm olacak. Nextcloud 14 sürümünü kullanabilmek için PHP sürümünü 7.0 ve üzerine yükseltmeniz önerilir.",
"Accessing site insecurely via HTTP. You are strongly adviced to set up your server to require HTTPS instead, as described in the <a href=\"{docUrl}\">security tips ↗</a>." : "Siteye HTTP üzerinden güvenli olmayan bağlantı ile erişiliyor. Sunucunuzu <a href=\"{docUrl}\">güvenlik ipuçlarında ↗</a> anlatıldığı şekilde HTTPS kullanılacak şekilde yapılandırmanız önemle önerilir.",
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php
index 01dcecb0e47..53ffecddd3b 100644
--- a/lib/composer/composer/autoload_classmap.php
+++ b/lib/composer/composer/autoload_classmap.php
@@ -1153,6 +1153,7 @@ return array(
'OC\\Preview\\ProviderV2' => $baseDir . '/lib/private/Preview/ProviderV2.php',
'OC\\Preview\\SVG' => $baseDir . '/lib/private/Preview/SVG.php',
'OC\\Preview\\StarOffice' => $baseDir . '/lib/private/Preview/StarOffice.php',
+ 'OC\\Preview\\Storage\\Root' => $baseDir . '/lib/private/Preview/Storage/Root.php',
'OC\\Preview\\TIFF' => $baseDir . '/lib/private/Preview/TIFF.php',
'OC\\Preview\\TXT' => $baseDir . '/lib/private/Preview/TXT.php',
'OC\\Preview\\Watcher' => $baseDir . '/lib/private/Preview/Watcher.php',
diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php
index 7a9bd5652d6..45ab02ded2b 100644
--- a/lib/composer/composer/autoload_static.php
+++ b/lib/composer/composer/autoload_static.php
@@ -1182,6 +1182,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\Preview\\ProviderV2' => __DIR__ . '/../../..' . '/lib/private/Preview/ProviderV2.php',
'OC\\Preview\\SVG' => __DIR__ . '/../../..' . '/lib/private/Preview/SVG.php',
'OC\\Preview\\StarOffice' => __DIR__ . '/../../..' . '/lib/private/Preview/StarOffice.php',
+ 'OC\\Preview\\Storage\\Root' => __DIR__ . '/../../..' . '/lib/private/Preview/Storage/Root.php',
'OC\\Preview\\TIFF' => __DIR__ . '/../../..' . '/lib/private/Preview/TIFF.php',
'OC\\Preview\\TXT' => __DIR__ . '/../../..' . '/lib/private/Preview/TXT.php',
'OC\\Preview\\Watcher' => __DIR__ . '/../../..' . '/lib/private/Preview/Watcher.php',
diff --git a/lib/l10n/sk.js b/lib/l10n/sk.js
index 89e11413403..3d2c52027f3 100644
--- a/lib/l10n/sk.js
+++ b/lib/l10n/sk.js
@@ -5,7 +5,9 @@ OC.L10N.register(
"This can usually be fixed by giving the webserver write access to the config directory" : "To je zvyčajne možné opraviť tým, že udelíte webovému serveru oprávnenie na zápis do priečinka s konfiguráciou.",
"Or, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it." : "Alebo, ak preferujete ponechať súbor config.php iba na čítanie, nastavte v ňom parameter \"config_is_read_only\" na true.",
"See %s" : "Pozri %s",
+ "This can usually be fixed by giving the webserver write access to the config directory." : "Toto sa zvyčajne dá opraviť poskytnutím práva webového servera na zápis do priečinka s nastaveniami.",
"Or, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it. See %s" : "Alebo, ak preferujete ponechať súbor config.php iba na čítanie, nastavte v ňom parameter \"config_is_read_only\" na true. Viď %s",
+ "The files of the app %1$s were not replaced correctly. Make sure it is a version compatible with the server." : "Súbory aplikácie %1$s neboli správne nahradené. Uistite sa, že to je verzia kompatibilná so serverom.",
"Sample configuration detected" : "Detekovaná bola vzorová konfigurácia",
"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" : "Zistilo sa, že konfigurácia bola skopírovaná zo vzorových súborov. Takáto konfigurácia nie je podporovaná a môže poškodiť vašu inštaláciu. Prečítajte si dokumentáciu pred vykonaním zmien v config.php",
"%1$s and %2$s" : "%1$s a %2$s",
@@ -15,6 +17,7 @@ OC.L10N.register(
"Education Edition" : "Edícia pre výuku",
"Enterprise bundle" : "Enterprise balíček",
"Groupware bundle" : "Balíček groupware",
+ "Hub bundle" : "Sada pre centrum aktivity (hub)",
"Social sharing bundle" : "Balíček sociálneho zdieľania",
"PHP %s or higher is required." : "Požadovaná verzia PHP %s alebo vyššia.",
"PHP with a version lower than %s is required." : "PHP je vyžadované vo vyššej verzii ako %s.",
@@ -27,7 +30,20 @@ OC.L10N.register(
"Following platforms are supported: %s" : "Podporované sú nasledovné systémy: %s",
"Server version %s or higher is required." : "Je vyžadovaná verzia servera %s alebo vyššia.",
"Server version %s or lower is required." : "Je vyžadovaná verzia servera %s alebo nižšia.",
+ "Logged in user must be an admin or sub admin" : "Prihlásený používateľ musí byť správcom alebo správcom pre čiastkovú oblasť.",
"Logged in user must be an admin" : "Prihlásený používateľ musí byť správca",
+ "Wiping of device %s has started" : "Začalo sa mazanie zariadenia %s",
+ "Wiping of device »%s« has started" : "Začalo sa mazanie zariadenia „%s“",
+ "»%s« started remote wipe" : "„%s“ začalo mazanie na diaľku",
+ "Device or application »%s« has started the remote wipe process. You will receive another email once the process has finished" : "Zariadenie alebo aplikácia „%s“ začal proces mazania na diaľku. Po dokončení procesu dostanete ďalší e-mail",
+ "Wiping of device %s has finished" : "Mazanie zariadenia %s bolo dokončené.",
+ "Wiping of device »%s« has finished" : "Mazanie zariadenia „%s“ bolo dokončené.",
+ "»%s« finished remote wipe" : "„%s“ dokončilo mazanie na diaľku ",
+ "Device or application »%s« has finished the remote wipe process." : "Zariadenie alebo aplikácia „%s“ dokončilo(a) proces mazania na diaľku.",
+ "Remote wipe started" : "Začalo mazanie na diaľku",
+ "A remote wipe was started on device %s" : "Na zariadeni %s začalo mazanie na diaľku",
+ "Remote wipe finished" : "Mazanie na diaľku bolo dokončené",
+ "The remote wipe on %s has finished" : "Mazanie na diaľku na %s bolo dokončené",
"Authentication" : "Autentifikácia",
"Unknown filetype" : "Neznámy typ súboru",
"Invalid image" : "Chybný obrázok",
@@ -51,6 +67,7 @@ OC.L10N.register(
"_%n minute ago_::_%n minutes ago_" : ["pred %n minútou","pred %n minútami","pred %n minútami","pred %n minútami"],
"in a few seconds" : "o pár sekúnd",
"seconds ago" : "pred sekundami",
+ "Empty file" : "Prázdny súbor",
"Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Modul s ID: %s neexistuje. Povoľte ho prosím vo vašom nastavení aplikácií alebo kontaktujte správcu.",
"File name is a reserved word" : "Názov súboru je rezervované slovo.",
"File name contains at least one invalid character" : "Názov súboru obsahuje nepovolené znaky.",
@@ -72,6 +89,7 @@ OC.L10N.register(
"%s enter the database username." : "Zadajte používateľské meno %s databázy.",
"%s enter the database name." : "Zadajte názov databázy pre %s databázy.",
"%s you may not use dots in the database name" : "V názve databázy %s nemôžete používať bodky",
+ "MySQL username and/or password not valid" : "Neplatné užívateľské meno a/alebo heslo do MySQL",
"You need to enter details of an existing account." : "Musíte zadať údaje existujúceho účtu.",
"Oracle connection could not be established" : "Nie je možné pripojiť sa k Oracle",
"Oracle username and/or password not valid" : "Používateľské meno a/alebo heslo pre Oracle databázu je neplatné",
@@ -152,6 +170,7 @@ OC.L10N.register(
"A valid username must be provided" : "Musíte zadať platné používateľské meno",
"Username contains whitespace at the beginning or at the end" : "Meno používateľa obsahuje na začiatku, alebo na konci medzeru",
"Username must not consist of dots only" : "Používateľské meno sa nesmie skladať len z bodiek",
+ "Username is invalid because files already exist for this user" : "Používateľské meno je neplatné, pretože pre tohto používateľa už existujú súbory",
"A valid password must be provided" : "Musíte zadať platné heslo",
"The username is already being used" : "Meno používateľa je už použité",
"Could not create user" : "Nepodarilo sa vytvoriť používateľa",
@@ -168,6 +187,7 @@ OC.L10N.register(
"Cannot write into \"config\" directory" : "Nie je možné zapisovať do priečinka \"config\"",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "To je zvyčajne možné opraviť tým, že udelíte webovému serveru oprávnenie na zápis do adresára s konfiguráciou. Viď %s",
"Cannot write into \"apps\" directory" : "Nie je možné zapisovať do priečinka \"apps\"",
+ "This can usually be fixed by giving the webserver write access to the apps directory or disabling the appstore in the config file." : "Toto sa zvyčajne dá opraviť poskytnutím práva webového servera na zápis do priečinka s aplikáciami alebo vypnutím katalógu s aplikáciami v súbore s nastaveniami.",
"Cannot create \"data\" directory" : "Nie je možné vytvoriť priečinok \"data\"",
"This can usually be fixed by giving the webserver write access to the root directory. See %s" : "To je zvyčajne možné opraviť tým, že udelíte webovému serveru oprávnenie na zápis do koreňového adresára. Viď %s",
"Permissions can usually be fixed by giving the webserver write access to the root directory. See %s." : "Oprávnenia je zvyčajne možné opraviť tým, že udelíte webovému serveru oprávnenie na zápis do koreňového priečinka. Viď %s.",
diff --git a/lib/l10n/sk.json b/lib/l10n/sk.json
index a713be37469..c5c6138a5cf 100644
--- a/lib/l10n/sk.json
+++ b/lib/l10n/sk.json
@@ -3,7 +3,9 @@
"This can usually be fixed by giving the webserver write access to the config directory" : "To je zvyčajne možné opraviť tým, že udelíte webovému serveru oprávnenie na zápis do priečinka s konfiguráciou.",
"Or, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it." : "Alebo, ak preferujete ponechať súbor config.php iba na čítanie, nastavte v ňom parameter \"config_is_read_only\" na true.",
"See %s" : "Pozri %s",
+ "This can usually be fixed by giving the webserver write access to the config directory." : "Toto sa zvyčajne dá opraviť poskytnutím práva webového servera na zápis do priečinka s nastaveniami.",
"Or, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it. See %s" : "Alebo, ak preferujete ponechať súbor config.php iba na čítanie, nastavte v ňom parameter \"config_is_read_only\" na true. Viď %s",
+ "The files of the app %1$s were not replaced correctly. Make sure it is a version compatible with the server." : "Súbory aplikácie %1$s neboli správne nahradené. Uistite sa, že to je verzia kompatibilná so serverom.",
"Sample configuration detected" : "Detekovaná bola vzorová konfigurácia",
"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" : "Zistilo sa, že konfigurácia bola skopírovaná zo vzorových súborov. Takáto konfigurácia nie je podporovaná a môže poškodiť vašu inštaláciu. Prečítajte si dokumentáciu pred vykonaním zmien v config.php",
"%1$s and %2$s" : "%1$s a %2$s",
@@ -13,6 +15,7 @@
"Education Edition" : "Edícia pre výuku",
"Enterprise bundle" : "Enterprise balíček",
"Groupware bundle" : "Balíček groupware",
+ "Hub bundle" : "Sada pre centrum aktivity (hub)",
"Social sharing bundle" : "Balíček sociálneho zdieľania",
"PHP %s or higher is required." : "Požadovaná verzia PHP %s alebo vyššia.",
"PHP with a version lower than %s is required." : "PHP je vyžadované vo vyššej verzii ako %s.",
@@ -25,7 +28,20 @@
"Following platforms are supported: %s" : "Podporované sú nasledovné systémy: %s",
"Server version %s or higher is required." : "Je vyžadovaná verzia servera %s alebo vyššia.",
"Server version %s or lower is required." : "Je vyžadovaná verzia servera %s alebo nižšia.",
+ "Logged in user must be an admin or sub admin" : "Prihlásený používateľ musí byť správcom alebo správcom pre čiastkovú oblasť.",
"Logged in user must be an admin" : "Prihlásený používateľ musí byť správca",
+ "Wiping of device %s has started" : "Začalo sa mazanie zariadenia %s",
+ "Wiping of device »%s« has started" : "Začalo sa mazanie zariadenia „%s“",
+ "»%s« started remote wipe" : "„%s“ začalo mazanie na diaľku",
+ "Device or application »%s« has started the remote wipe process. You will receive another email once the process has finished" : "Zariadenie alebo aplikácia „%s“ začal proces mazania na diaľku. Po dokončení procesu dostanete ďalší e-mail",
+ "Wiping of device %s has finished" : "Mazanie zariadenia %s bolo dokončené.",
+ "Wiping of device »%s« has finished" : "Mazanie zariadenia „%s“ bolo dokončené.",
+ "»%s« finished remote wipe" : "„%s“ dokončilo mazanie na diaľku ",
+ "Device or application »%s« has finished the remote wipe process." : "Zariadenie alebo aplikácia „%s“ dokončilo(a) proces mazania na diaľku.",
+ "Remote wipe started" : "Začalo mazanie na diaľku",
+ "A remote wipe was started on device %s" : "Na zariadeni %s začalo mazanie na diaľku",
+ "Remote wipe finished" : "Mazanie na diaľku bolo dokončené",
+ "The remote wipe on %s has finished" : "Mazanie na diaľku na %s bolo dokončené",
"Authentication" : "Autentifikácia",
"Unknown filetype" : "Neznámy typ súboru",
"Invalid image" : "Chybný obrázok",
@@ -49,6 +65,7 @@
"_%n minute ago_::_%n minutes ago_" : ["pred %n minútou","pred %n minútami","pred %n minútami","pred %n minútami"],
"in a few seconds" : "o pár sekúnd",
"seconds ago" : "pred sekundami",
+ "Empty file" : "Prázdny súbor",
"Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Modul s ID: %s neexistuje. Povoľte ho prosím vo vašom nastavení aplikácií alebo kontaktujte správcu.",
"File name is a reserved word" : "Názov súboru je rezervované slovo.",
"File name contains at least one invalid character" : "Názov súboru obsahuje nepovolené znaky.",
@@ -70,6 +87,7 @@
"%s enter the database username." : "Zadajte používateľské meno %s databázy.",
"%s enter the database name." : "Zadajte názov databázy pre %s databázy.",
"%s you may not use dots in the database name" : "V názve databázy %s nemôžete používať bodky",
+ "MySQL username and/or password not valid" : "Neplatné užívateľské meno a/alebo heslo do MySQL",
"You need to enter details of an existing account." : "Musíte zadať údaje existujúceho účtu.",
"Oracle connection could not be established" : "Nie je možné pripojiť sa k Oracle",
"Oracle username and/or password not valid" : "Používateľské meno a/alebo heslo pre Oracle databázu je neplatné",
@@ -150,6 +168,7 @@
"A valid username must be provided" : "Musíte zadať platné používateľské meno",
"Username contains whitespace at the beginning or at the end" : "Meno používateľa obsahuje na začiatku, alebo na konci medzeru",
"Username must not consist of dots only" : "Používateľské meno sa nesmie skladať len z bodiek",
+ "Username is invalid because files already exist for this user" : "Používateľské meno je neplatné, pretože pre tohto používateľa už existujú súbory",
"A valid password must be provided" : "Musíte zadať platné heslo",
"The username is already being used" : "Meno používateľa je už použité",
"Could not create user" : "Nepodarilo sa vytvoriť používateľa",
@@ -166,6 +185,7 @@
"Cannot write into \"config\" directory" : "Nie je možné zapisovať do priečinka \"config\"",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "To je zvyčajne možné opraviť tým, že udelíte webovému serveru oprávnenie na zápis do adresára s konfiguráciou. Viď %s",
"Cannot write into \"apps\" directory" : "Nie je možné zapisovať do priečinka \"apps\"",
+ "This can usually be fixed by giving the webserver write access to the apps directory or disabling the appstore in the config file." : "Toto sa zvyčajne dá opraviť poskytnutím práva webového servera na zápis do priečinka s aplikáciami alebo vypnutím katalógu s aplikáciami v súbore s nastaveniami.",
"Cannot create \"data\" directory" : "Nie je možné vytvoriť priečinok \"data\"",
"This can usually be fixed by giving the webserver write access to the root directory. See %s" : "To je zvyčajne možné opraviť tým, že udelíte webovému serveru oprávnenie na zápis do koreňového adresára. Viď %s",
"Permissions can usually be fixed by giving the webserver write access to the root directory. See %s." : "Oprávnenia je zvyčajne možné opraviť tým, že udelíte webovému serveru oprávnenie na zápis do koreňového priečinka. Viď %s.",
diff --git a/lib/l10n/tr.js b/lib/l10n/tr.js
index 720619dfbaf..d4d67b685aa 100644
--- a/lib/l10n/tr.js
+++ b/lib/l10n/tr.js
@@ -68,7 +68,7 @@ OC.L10N.register(
"in a few seconds" : "bir kaç saniye içinde",
"seconds ago" : "saniyeler önce",
"Empty file" : "Dosya boş",
- "Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "%s kodlu modül bulunamadı. Lütfen uygulamalarınız içinden modülü etkinleştirin ya da sistem yöneticinizle görüşün.",
+ "Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "%s kodlu modül bulunamadı. Lütfen uygulamalarınız içinden modülü etkinleştirin ya da BT yöneticinizle görüşün.",
"File name is a reserved word" : "Bu dosya adı sistem kullanıma ayrılmıştır",
"File name contains at least one invalid character" : "Dosya adında en az bir geçersiz karakter var",
"File name is too long" : "Dosya adı çok uzun",
@@ -193,7 +193,7 @@ OC.L10N.register(
"Permissions can usually be fixed by giving the webserver write access to the root directory. See %s." : "İzinler genellikle, web sunucusuna kök klasöre yazma izni verilerek düzeltilebilir. %s bölümüne bakın.",
"Setting locale to %s failed" : "Dil %s olarak ayarlanamadı",
"Please install one of these locales on your system and restart your webserver." : "Lütfen bu dillerden birini sisteminize kurun ve web sunucunuzu yeniden başlatın.",
- "Please ask your server administrator to install the module." : "Lütfen modülü kurması için sunucu yöneticinizle görüşün.",
+ "Please ask your server administrator to install the module." : "Lütfen modülü kurması için BT yöneticinizle görüşün.",
"PHP module %s not installed." : "PHP %s modülü kurulmamış.",
"PHP setting \"%s\" is not set to \"%s\"." : "\"%s\" PHP ayarı \"%s\" olarak ayarlanmamış.",
"Adjusting this setting in php.ini will make Nextcloud run again" : "php.ini dosyasında bu ayar yapıldığında Nextcloud yeniden çalışır",
@@ -204,7 +204,7 @@ OC.L10N.register(
"PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP girintili doc bloklarını ayıklamak üzere yapılandırılmış gibi görünüyor. Bu durum bazı çekirdek uygulamalarına erişilmesini engelleyecek.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Bu sorun genellikle Zend OPcache ya da eAccelerator gibi bir ön bellek/hızlandırıcı nedeniyle ortaya çıkar.",
"PHP modules have been installed, but they are still listed as missing?" : "PHP modülleri kurulmuş, ancak hala eksik olarak mı görünüyor?",
- "Please ask your server administrator to restart the web server." : "Lütfen web sunucusunu yeniden başlatması için sunucu yöneticinizle görüşün.",
+ "Please ask your server administrator to restart the web server." : "Lütfen web sunucusunu yeniden başlatması için BT yöneticinizle görüşün.",
"PostgreSQL >= 9 required" : "PostgreSQL >= 9 gerekli",
"Please upgrade your database version" : "Lütfen veritabanı sürümünüzü yükseltin",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Lütfen izinleri 0770 olarak ayarlayarak diğer kullanıcıların klasörü görebilmesini sağlayın.",
diff --git a/lib/l10n/tr.json b/lib/l10n/tr.json
index 7c6e61e23aa..974e53980b1 100644
--- a/lib/l10n/tr.json
+++ b/lib/l10n/tr.json
@@ -66,7 +66,7 @@
"in a few seconds" : "bir kaç saniye içinde",
"seconds ago" : "saniyeler önce",
"Empty file" : "Dosya boş",
- "Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "%s kodlu modül bulunamadı. Lütfen uygulamalarınız içinden modülü etkinleştirin ya da sistem yöneticinizle görüşün.",
+ "Module with ID: %s does not exist. Please enable it in your apps settings or contact your administrator." : "%s kodlu modül bulunamadı. Lütfen uygulamalarınız içinden modülü etkinleştirin ya da BT yöneticinizle görüşün.",
"File name is a reserved word" : "Bu dosya adı sistem kullanıma ayrılmıştır",
"File name contains at least one invalid character" : "Dosya adında en az bir geçersiz karakter var",
"File name is too long" : "Dosya adı çok uzun",
@@ -191,7 +191,7 @@
"Permissions can usually be fixed by giving the webserver write access to the root directory. See %s." : "İzinler genellikle, web sunucusuna kök klasöre yazma izni verilerek düzeltilebilir. %s bölümüne bakın.",
"Setting locale to %s failed" : "Dil %s olarak ayarlanamadı",
"Please install one of these locales on your system and restart your webserver." : "Lütfen bu dillerden birini sisteminize kurun ve web sunucunuzu yeniden başlatın.",
- "Please ask your server administrator to install the module." : "Lütfen modülü kurması için sunucu yöneticinizle görüşün.",
+ "Please ask your server administrator to install the module." : "Lütfen modülü kurması için BT yöneticinizle görüşün.",
"PHP module %s not installed." : "PHP %s modülü kurulmamış.",
"PHP setting \"%s\" is not set to \"%s\"." : "\"%s\" PHP ayarı \"%s\" olarak ayarlanmamış.",
"Adjusting this setting in php.ini will make Nextcloud run again" : "php.ini dosyasında bu ayar yapıldığında Nextcloud yeniden çalışır",
@@ -202,7 +202,7 @@
"PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP girintili doc bloklarını ayıklamak üzere yapılandırılmış gibi görünüyor. Bu durum bazı çekirdek uygulamalarına erişilmesini engelleyecek.",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Bu sorun genellikle Zend OPcache ya da eAccelerator gibi bir ön bellek/hızlandırıcı nedeniyle ortaya çıkar.",
"PHP modules have been installed, but they are still listed as missing?" : "PHP modülleri kurulmuş, ancak hala eksik olarak mı görünüyor?",
- "Please ask your server administrator to restart the web server." : "Lütfen web sunucusunu yeniden başlatması için sunucu yöneticinizle görüşün.",
+ "Please ask your server administrator to restart the web server." : "Lütfen web sunucusunu yeniden başlatması için BT yöneticinizle görüşün.",
"PostgreSQL >= 9 required" : "PostgreSQL >= 9 gerekli",
"Please upgrade your database version" : "Lütfen veritabanı sürümünüzü yükseltin",
"Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Lütfen izinleri 0770 olarak ayarlayarak diğer kullanıcıların klasörü görebilmesini sağlayın.",
diff --git a/lib/private/Files/Cache/Scanner.php b/lib/private/Files/Cache/Scanner.php
index 2a5a6536697..f895948574b 100644
--- a/lib/private/Files/Cache/Scanner.php
+++ b/lib/private/Files/Cache/Scanner.php
@@ -126,11 +126,11 @@ class Scanner extends BasicEmitter implements IScanner {
* @param int $parentId
* @param array|null|false $cacheData existing data in the cache for the file to be scanned
* @param bool $lock set to false to disable getting an additional read lock during scanning
+ * @param null $data the metadata for the file, as returned by the storage
* @return array an array of metadata of the scanned file
- * @throws \OC\ServerNotAvailableException
* @throws \OCP\Lock\LockedException
*/
- public function scanFile($file, $reuseExisting = 0, $parentId = -1, $cacheData = null, $lock = true) {
+ public function scanFile($file, $reuseExisting = 0, $parentId = -1, $cacheData = null, $lock = true, $data = null) {
if ($file !== '') {
try {
$this->storage->verifyPath(dirname($file), basename($file));
@@ -149,7 +149,7 @@ class Scanner extends BasicEmitter implements IScanner {
}
try {
- $data = $this->getData($file);
+ $data = $data ?? $this->getData($file);
} catch (ForbiddenException $e) {
if ($lock) {
if ($this->storage->instanceOfStorage('\OCP\Files\Storage\ILockingStorage')) {
@@ -367,26 +367,6 @@ class Scanner extends BasicEmitter implements IScanner {
}
/**
- * Get the children from the storage
- *
- * @param string $folder
- * @return string[]
- */
- protected function getNewChildren($folder) {
- $children = [];
- if ($dh = $this->storage->opendir($folder)) {
- if (is_resource($dh)) {
- while (($file = readdir($dh)) !== false) {
- if (!Filesystem::isIgnoredDir($file)) {
- $children[] = trim(\OC\Files\Filesystem::normalizePath($file), '/');
- }
- }
- }
- }
- return $children;
- }
-
- /**
* scan all the files and folders in a folder
*
* @param string $path
@@ -425,7 +405,7 @@ class Scanner extends BasicEmitter implements IScanner {
private function handleChildren($path, $recursive, $reuse, $folderId, $lock, &$size) {
// we put this in it's own function so it cleans up the memory before we start recursing
$existingChildren = $this->getExistingChildren($folderId);
- $newChildren = $this->getNewChildren($path);
+ $newChildren = iterator_to_array($this->storage->getDirectoryContent($path));
if ($this->useTransactions) {
\OC::$server->getDatabaseConnection()->beginTransaction();
@@ -433,11 +413,14 @@ class Scanner extends BasicEmitter implements IScanner {
$exceptionOccurred = false;
$childQueue = [];
- foreach ($newChildren as $file) {
+ $newChildNames = [];
+ foreach ($newChildren as $fileMeta) {
+ $file = $fileMeta['name'];
+ $newChildNames[] = $file;
$child = $path ? $path . '/' . $file : $file;
try {
$existingData = isset($existingChildren[$file]) ? $existingChildren[$file] : false;
- $data = $this->scanFile($child, $reuse, $folderId, $existingData, $lock);
+ $data = $this->scanFile($child, $reuse, $folderId, $existingData, $lock, $fileMeta);
if ($data) {
if ($data['mimetype'] === 'httpd/unix-directory' and $recursive === self::SCAN_RECURSIVE) {
$childQueue[$child] = $data['fileid'];
@@ -471,7 +454,7 @@ class Scanner extends BasicEmitter implements IScanner {
throw $e;
}
}
- $removedChildren = \array_diff(array_keys($existingChildren), $newChildren);
+ $removedChildren = \array_diff(array_keys($existingChildren), $newChildNames);
foreach ($removedChildren as $childName) {
$child = $path ? $path . '/' . $childName : $childName;
$this->removeFromCache($child);
diff --git a/lib/private/Files/ObjectStore/NoopScanner.php b/lib/private/Files/ObjectStore/NoopScanner.php
index 57a94aba294..25b52416efd 100644
--- a/lib/private/Files/ObjectStore/NoopScanner.php
+++ b/lib/private/Files/ObjectStore/NoopScanner.php
@@ -44,7 +44,7 @@ class NoopScanner extends Scanner {
* @param array|null $cacheData existing data in the cache for the file to be scanned
* @return array an array of metadata of the scanned file
*/
- public function scanFile($file, $reuseExisting = 0, $parentId = -1, $cacheData = null, $lock = true) {
+ public function scanFile($file, $reuseExisting = 0, $parentId = -1, $cacheData = null, $lock = true, $data = null) {
return [];
}
diff --git a/lib/private/Files/Storage/Common.php b/lib/private/Files/Storage/Common.php
index bb672f3a0ea..86252f5c3dd 100644
--- a/lib/private/Files/Storage/Common.php
+++ b/lib/private/Files/Storage/Common.php
@@ -234,7 +234,7 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
} else {
$source = $this->fopen($path1, 'r');
$target = $this->fopen($path2, 'w');
- list(, $result) = \OC_Helper::streamCopy($source, $target);
+ [, $result] = \OC_Helper::streamCopy($source, $target);
if (!$result) {
\OC::$server->getLogger()->warning("Failed to write data while copying $path1 to $path2");
}
@@ -626,7 +626,7 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
// are not the same as the original one.Once this is fixed we also
// need to adjust the encryption wrapper.
$target = $this->fopen($targetInternalPath, 'w');
- list(, $result) = \OC_Helper::streamCopy($source, $target);
+ [, $result] = \OC_Helper::streamCopy($source, $target);
if ($result and $preserveMtime) {
$this->touch($targetInternalPath, $sourceStorage->filemtime($sourceInternalPath));
}
@@ -719,6 +719,7 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
$data['etag'] = $this->getETag($path);
$data['storage_mtime'] = $data['mtime'];
$data['permissions'] = $permissions;
+ $data['name'] = basename($path);
return $data;
}
@@ -867,4 +868,17 @@ abstract class Common implements Storage, ILockingStorage, IWriteStreamStorage {
}
return $count;
}
+
+ public function getDirectoryContent($directory): \Traversable {
+ $dh = $this->opendir($directory);
+ if (is_resource($dh)) {
+ $basePath = rtrim($directory, '/');
+ while (($file = readdir($dh)) !== false) {
+ if (!Filesystem::isIgnoredDir($file)) {
+ $childPath = $basePath . '/' . trim($file, '/');
+ yield $this->getMetaData($childPath);
+ }
+ }
+ }
+ }
}
diff --git a/lib/private/Files/Storage/Local.php b/lib/private/Files/Storage/Local.php
index 89b318b4770..2019c67bede 100644
--- a/lib/private/Files/Storage/Local.php
+++ b/lib/private/Files/Storage/Local.php
@@ -196,6 +196,7 @@ class Local extends \OC\Files\Storage\Common {
$data['etag'] = $this->calculateEtag($path, $stat);
$data['storage_mtime'] = $data['mtime'];
$data['permissions'] = $permissions;
+ $data['name'] = basename($path);
return $data;
}
diff --git a/lib/private/Files/Storage/Storage.php b/lib/private/Files/Storage/Storage.php
index 7e5a0cef4d7..76dab07b6a7 100644
--- a/lib/private/Files/Storage/Storage.php
+++ b/lib/private/Files/Storage/Storage.php
@@ -119,4 +119,22 @@ interface Storage extends \OCP\Files\Storage {
* @throws \OCP\Lock\LockedException
*/
public function changeLock($path, $type, ILockingProvider $provider);
+
+ /**
+ * Get the contents of a directory with metadata
+ *
+ * @param string $directory
+ * @return \Traversable an iterator, containing file metadata
+ *
+ * The metadata array will contain the following fields
+ *
+ * - name
+ * - mimetype
+ * - mtime
+ * - size
+ * - etag
+ * - storage_mtime
+ * - permissions
+ */
+ public function getDirectoryContent($directory): \Traversable;
}
diff --git a/lib/private/Files/Storage/Wrapper/Availability.php b/lib/private/Files/Storage/Wrapper/Availability.php
index 300ba7e7f7c..ea210128e8f 100644
--- a/lib/private/Files/Storage/Wrapper/Availability.php
+++ b/lib/private/Files/Storage/Wrapper/Availability.php
@@ -461,4 +461,15 @@ class Availability extends Wrapper {
$this->getStorageCache()->setAvailability(false, $delay);
throw $e;
}
+
+
+
+ public function getDirectoryContent($directory): \Traversable {
+ $this->checkAvailability();
+ try {
+ return parent::getDirectoryContent($directory);
+ } catch (StorageNotAvailableException $e) {
+ $this->setUnavailable($e);
+ }
+ }
}
diff --git a/lib/private/Files/Storage/Wrapper/Encoding.php b/lib/private/Files/Storage/Wrapper/Encoding.php
index d1e0622808b..4e81588de80 100644
--- a/lib/private/Files/Storage/Wrapper/Encoding.php
+++ b/lib/private/Files/Storage/Wrapper/Encoding.php
@@ -534,4 +534,8 @@ class Encoding extends Wrapper {
public function getMetaData($path) {
return $this->storage->getMetaData($this->findPathToUse($path));
}
+
+ public function getDirectoryContent($directory): \Traversable {
+ return $this->storage->getDirectoryContent($this->findPathToUse($directory));
+ }
}
diff --git a/lib/private/Files/Storage/Wrapper/Encryption.php b/lib/private/Files/Storage/Wrapper/Encryption.php
index 1ea2664877b..897624ff6ae 100644
--- a/lib/private/Files/Storage/Wrapper/Encryption.php
+++ b/lib/private/Files/Storage/Wrapper/Encryption.php
@@ -105,17 +105,17 @@ class Encryption extends Wrapper {
* @param ArrayCache $arrayCache
*/
public function __construct(
- $parameters,
- IManager $encryptionManager = null,
- Util $util = null,
- ILogger $logger = null,
- IFile $fileHelper = null,
- $uid = null,
- IStorage $keyStorage = null,
- Update $update = null,
- Manager $mountManager = null,
- ArrayCache $arrayCache = null
- ) {
+ $parameters,
+ IManager $encryptionManager = null,
+ Util $util = null,
+ ILogger $logger = null,
+ IFile $fileHelper = null,
+ $uid = null,
+ IStorage $keyStorage = null,
+ Update $update = null,
+ Manager $mountManager = null,
+ ArrayCache $arrayCache = null
+ ) {
$this->mountPoint = $parameters['mountPoint'];
$this->mount = $parameters['mount'];
$this->encryptionManager = $encryptionManager;
@@ -169,15 +169,7 @@ class Encryption extends Wrapper {
return $this->storage->filesize($path);
}
- /**
- * @param string $path
- * @return array
- */
- public function getMetaData($path) {
- $data = $this->storage->getMetaData($path);
- if (is_null($data)) {
- return null;
- }
+ private function modifyMetaData(string $path, array $data): array {
$fullPath = $this->getFullPath($path);
$info = $this->getCache()->get($path);
@@ -199,6 +191,25 @@ class Encryption extends Wrapper {
}
/**
+ * @param string $path
+ * @return array
+ */
+ public function getMetaData($path) {
+ $data = $this->storage->getMetaData($path);
+ if (is_null($data)) {
+ return null;
+ }
+ return $this->modifyMetaData($path, $data);
+ }
+
+ public function getDirectoryContent($directory): \Traversable {
+ $parent = rtrim($directory, '/');
+ foreach ($this->getWrapperStorage()->getDirectoryContent($directory) as $data) {
+ yield $this->modifyMetaData($parent . '/' . $data['name'], $data);
+ }
+ }
+
+ /**
* see http://php.net/manual/en/function.file_get_contents.php
*
* @param string $path
@@ -493,7 +504,7 @@ class Encryption extends Wrapper {
try {
$result = $this->fixUnencryptedSize($path, $size, $unencryptedSize);
} catch (\Exception $e) {
- $this->logger->error('Couldn\'t re-calculate unencrypted size for '. $path);
+ $this->logger->error('Couldn\'t re-calculate unencrypted size for ' . $path);
$this->logger->logException($e);
}
unset($this->fixUnencryptedSizeOf[$this->getFullPath($path)]);
@@ -546,7 +557,7 @@ class Encryption extends Wrapper {
// next highest is end of chunks, one subtracted is last one
// we have to read the last chunk, we can't just calculate it (because of padding etc)
- $lastChunkNr = ceil($size/ $blockSize)-1;
+ $lastChunkNr = ceil($size / $blockSize) - 1;
// calculate last chunk position
$lastChunkPos = ($lastChunkNr * $blockSize);
// try to fseek to the last chunk, if it fails we have to read the whole file
@@ -554,16 +565,16 @@ class Encryption extends Wrapper {
$newUnencryptedSize += $lastChunkNr * $unencryptedBlockSize;
}
- $lastChunkContentEncrypted='';
+ $lastChunkContentEncrypted = '';
$count = $blockSize;
while ($count > 0) {
- $data=fread($stream, $blockSize);
- $count=strlen($data);
+ $data = fread($stream, $blockSize);
+ $count = strlen($data);
$lastChunkContentEncrypted .= $data;
if (strlen($lastChunkContentEncrypted) > $blockSize) {
$newUnencryptedSize += $unencryptedBlockSize;
- $lastChunkContentEncrypted=substr($lastChunkContentEncrypted, $blockSize);
+ $lastChunkContentEncrypted = substr($lastChunkContentEncrypted, $blockSize);
}
}
@@ -743,7 +754,7 @@ class Encryption extends Wrapper {
try {
$source = $sourceStorage->fopen($sourceInternalPath, 'r');
$target = $this->fopen($targetInternalPath, 'w');
- list(, $result) = \OC_Helper::streamCopy($source, $target);
+ [, $result] = \OC_Helper::streamCopy($source, $target);
fclose($source);
fclose($target);
} catch (\Exception $e) {
@@ -889,7 +900,7 @@ class Encryption extends Wrapper {
$header = substr($header, 0, $endAt + strlen(Util::HEADER_END));
// +1 to not start with an ':' which would result in empty element at the beginning
- $exploded = explode(':', substr($header, strlen(Util::HEADER_START)+1));
+ $exploded = explode(':', substr($header, strlen(Util::HEADER_START) + 1));
$element = array_shift($exploded);
while ($element !== Util::HEADER_END) {
@@ -1023,7 +1034,7 @@ class Encryption extends Wrapper {
public function writeStream(string $path, $stream, int $size = null): int {
// always fall back to fopen
$target = $this->fopen($path, 'w');
- list($count, $result) = \OC_Helper::streamCopy($stream, $target);
+ [$count, $result] = \OC_Helper::streamCopy($stream, $target);
fclose($target);
return $count;
}
diff --git a/lib/private/Files/Storage/Wrapper/Jail.php b/lib/private/Files/Storage/Wrapper/Jail.php
index 93380baac5e..929a4942562 100644
--- a/lib/private/Files/Storage/Wrapper/Jail.php
+++ b/lib/private/Files/Storage/Wrapper/Jail.php
@@ -539,4 +539,8 @@ class Jail extends Wrapper {
return $count;
}
}
+
+ public function getDirectoryContent($directory): \Traversable {
+ return $this->getWrapperStorage()->getDirectoryContent($this->getJailedPath($directory));
+ }
}
diff --git a/lib/private/Files/Storage/Wrapper/PermissionsMask.php b/lib/private/Files/Storage/Wrapper/PermissionsMask.php
index c2cea31bd5a..6b453b4380a 100644
--- a/lib/private/Files/Storage/Wrapper/PermissionsMask.php
+++ b/lib/private/Files/Storage/Wrapper/PermissionsMask.php
@@ -157,4 +157,13 @@ class PermissionsMask extends Wrapper {
}
return parent::getScanner($path, $storage);
}
+
+ public function getDirectoryContent($directory): \Traversable {
+ foreach ($this->getWrapperStorage()->getDirectoryContent($directory) as $data) {
+ $data['scan_permissions'] = isset($data['scan_permissions']) ? $data['scan_permissions'] : $data['permissions'];
+ $data['permissions'] &= $this->mask;
+
+ yield $data;
+ }
+ }
}
diff --git a/lib/private/Files/Storage/Wrapper/Wrapper.php b/lib/private/Files/Storage/Wrapper/Wrapper.php
index d67af5cb22e..4584bebe076 100644
--- a/lib/private/Files/Storage/Wrapper/Wrapper.php
+++ b/lib/private/Files/Storage/Wrapper/Wrapper.php
@@ -637,4 +637,8 @@ class Wrapper implements \OC\Files\Storage\Storage, ILockingStorage, IWriteStrea
return $count;
}
}
+
+ public function getDirectoryContent($directory): \Traversable {
+ return $this->getWrapperStorage()->getDirectoryContent($directory);
+ }
}
diff --git a/lib/private/Preview/BackgroundCleanupJob.php b/lib/private/Preview/BackgroundCleanupJob.php
index 15bb6bd7188..e0546c4a11c 100644
--- a/lib/private/Preview/BackgroundCleanupJob.php
+++ b/lib/private/Preview/BackgroundCleanupJob.php
@@ -27,8 +27,9 @@ declare(strict_types=1);
namespace OC\Preview;
use OC\BackgroundJob\TimedJob;
-use OC\Files\AppData\Factory;
+use OC\Preview\Storage\Root;
use OCP\DB\QueryBuilder\IQueryBuilder;
+use OCP\Files\IMimeTypeLoader;
use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException;
use OCP\IDBConnection;
@@ -38,28 +39,47 @@ class BackgroundCleanupJob extends TimedJob {
/** @var IDBConnection */
private $connection;
- /** @var Factory */
- private $appDataFactory;
+ /** @var Root */
+ private $previewFolder;
/** @var bool */
private $isCLI;
+ /** @var IMimeTypeLoader */
+ private $mimeTypeLoader;
+
public function __construct(IDBConnection $connection,
- Factory $appDataFactory,
+ Root $previewFolder,
+ IMimeTypeLoader $mimeTypeLoader,
bool $isCLI) {
// Run at most once an hour
$this->setInterval(3600);
$this->connection = $connection;
- $this->appDataFactory = $appDataFactory;
+ $this->previewFolder = $previewFolder;
$this->isCLI = $isCLI;
+ $this->mimeTypeLoader = $mimeTypeLoader;
}
public function run($argument) {
- $previews = $this->appDataFactory->get('preview');
+ foreach ($this->getDeletedFiles() as $fileId) {
+ try {
+ $preview = $this->previewFolder->getFolder((string)$fileId);
+ $preview->delete();
+ } catch (NotFoundException $e) {
+ // continue
+ } catch (NotPermittedException $e) {
+ // continue
+ }
+ }
+ }
- $previewFodlerId = $previews->getId();
+ private function getDeletedFiles(): \Iterator {
+ yield from $this->getOldPreviewLocations();
+ yield from $this->getNewPreviewLocations();
+ }
+ private function getOldPreviewLocations(): \Iterator {
$qb = $this->connection->getQueryBuilder();
$qb->select('a.name')
->from('filecache', 'a')
@@ -69,7 +89,9 @@ class BackgroundCleanupJob extends TimedJob {
->where(
$qb->expr()->isNull('b.fileid')
)->andWhere(
- $qb->expr()->eq('a.parent', $qb->createNamedParameter($previewFodlerId))
+ $qb->expr()->eq('a.parent', $qb->createNamedParameter($this->previewFolder->getId()))
+ )->andWhere(
+ $qb->expr()->like('a.name', $qb->createNamedParameter('__%'))
);
if (!$this->isCLI) {
@@ -79,14 +101,54 @@ class BackgroundCleanupJob extends TimedJob {
$cursor = $qb->execute();
while ($row = $cursor->fetch()) {
- try {
- $preview = $previews->getFolder($row['name']);
- $preview->delete();
- } catch (NotFoundException $e) {
- // continue
- } catch (NotPermittedException $e) {
- // continue
- }
+ yield $row['name'];
+ }
+
+ $cursor->closeCursor();
+ }
+
+ private function getNewPreviewLocations(): \Iterator {
+ $qb = $this->connection->getQueryBuilder();
+ $qb->select('path', 'mimetype')
+ ->from('filecache')
+ ->where($qb->expr()->eq('fileid', $qb->createNamedParameter($this->previewFolder->getId())));
+ $cursor = $qb->execute();
+ $data = $cursor->fetch();
+ $cursor->closeCursor();
+
+ if ($data === null) {
+ return [];
+ }
+
+ /*
+ * This lovely like is the result of the way the new previews are stored
+ * We take the md5 of the name (fileid) and split the first 7 chars. That way
+ * there are not a gazillion files in the root of the preview appdata.
+ */
+ $like = $this->connection->escapeLikeParameter($data['path']) . '/_/_/_/_/_/_/_/%';
+
+ $qb = $this->connection->getQueryBuilder();
+ $qb->select('a.name')
+ ->from('filecache', 'a')
+ ->leftJoin('a', 'filecache', 'b', $qb->expr()->eq(
+ $qb->expr()->castColumn('a.name', IQueryBuilder::PARAM_INT), 'b.fileid'
+ ))
+ ->where(
+ $qb->expr()->andX(
+ $qb->expr()->isNull('b.fileid'),
+ $qb->expr()->like('a.path', $qb->createNamedParameter($like)),
+ $qb->expr()->eq('a.mimetype', $qb->createNamedParameter($this->mimeTypeLoader->getId('httpd/unix-directory')))
+ )
+ );
+
+ if (!$this->isCLI) {
+ $qb->setMaxResults(10);
+ }
+
+ $cursor = $qb->execute();
+
+ while ($row = $cursor->fetch()) {
+ yield $row['name'];
}
$cursor->closeCursor();
diff --git a/lib/private/Preview/Storage/Root.php b/lib/private/Preview/Storage/Root.php
new file mode 100644
index 00000000000..0e9d92a44c2
--- /dev/null
+++ b/lib/private/Preview/Storage/Root.php
@@ -0,0 +1,71 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * @copyright Copyright (c) 2020, Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @author Roeland Jago Douma <roeland@famdouma.nl>
+ *
+ * @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\Preview\Storage;
+
+use OC\Files\AppData\AppData;
+use OC\SystemConfig;
+use OCP\Files\IRootFolder;
+use OCP\Files\NotFoundException;
+use OCP\Files\SimpleFS\ISimpleFolder;
+
+class Root extends AppData {
+ public function __construct(IRootFolder $rootFolder, SystemConfig $systemConfig) {
+ parent::__construct($rootFolder, $systemConfig, 'preview');
+ }
+
+
+ public function getFolder(string $name): ISimpleFolder {
+ $internalFolder = $this->getInternalFolder($name);
+
+ try {
+ return parent::getFolder($internalFolder);
+ } catch (NotFoundException $e) {
+ /*
+ * The new folder structure is not found.
+ * Lets try the old one
+ */
+ }
+
+ return parent::getFolder($name);
+ }
+
+ public function newFolder(string $name): ISimpleFolder {
+ $internalFolder = $this->getInternalFolder($name);
+ return parent::newFolder($internalFolder);
+ }
+
+ /*
+ * Do not allow directory listing on this special root
+ * since it gets to big and time consuming
+ */
+ public function getDirectoryListing(): array {
+ return [];
+ }
+
+ private function getInternalFolder(string $name): string {
+ return implode('/', str_split(substr(md5($name), 0, 7))) . '/' . $name;
+ }
+}
diff --git a/lib/private/Server.php b/lib/private/Server.php
index cf4f8cc097b..4fe89e3098e 100644
--- a/lib/private/Server.php
+++ b/lib/private/Server.php
@@ -281,7 +281,7 @@ class Server extends ServerContainer implements IServerContainer {
return new PreviewManager(
$c->getConfig(),
$c->getRootFolder(),
- $c->getAppDataDir('preview'),
+ new \OC\Preview\Storage\Root($c->getRootFolder(), $c->getSystemConfig(), 'preview'),
$c->getEventDispatcher(),
$c->getGeneratorHelper(),
$c->getSession()->get('user_id')
@@ -291,7 +291,7 @@ class Server extends ServerContainer implements IServerContainer {
$this->registerService(\OC\Preview\Watcher::class, function (Server $c) {
return new \OC\Preview\Watcher(
- $c->getAppDataDir('preview')
+ new \OC\Preview\Storage\Root($c->getRootFolder(), $c->getSystemConfig(), 'preview')
);
});
diff --git a/package-lock.json b/package-lock.json
index 06c714807da..220b5e38636 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -7966,6 +7966,12 @@
"mimic-fn": "^2.1.0"
}
},
+ "opencollective-postinstall": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz",
+ "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==",
+ "dev": true
+ },
"opener": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/opener/-/opener-1.4.3.tgz",
@@ -9894,22 +9900,58 @@
"dev": true
},
"style-loader": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.1.3.tgz",
- "integrity": "sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw==",
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.1.4.tgz",
+ "integrity": "sha512-SbBHRD8fwK3pX+4UDF4ETxUF0+rCvk29LWTTI7Rt0cgsDjAj3SWM76ByTe6u2+4IlJ/WwluB7wuslWETCoPQdg==",
"dev": true,
"requires": {
- "loader-utils": "^1.2.3",
- "schema-utils": "^2.6.4"
+ "loader-utils": "^2.0.0",
+ "schema-utils": "^2.6.5"
},
"dependencies": {
+ "ajv": {
+ "version": "6.12.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.1.tgz",
+ "integrity": "sha512-AUh2mDlJDAnzSRaKkMHopTD1GKwC1ApUq8oCzdjAOM5tavncgqWU+JoRu5Y3iYY0Q/euiU+1LWp0/O/QY8CcHw==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "opencollective-postinstall": "^2.0.2",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "dev": true
+ },
+ "fast-deep-equal": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
+ "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==",
+ "dev": true
+ },
+ "loader-utils": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
+ "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ }
+ },
"schema-utils": {
- "version": "2.6.4",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.4.tgz",
- "integrity": "sha512-VNjcaUxVnEeun6B2fiiUDjXXBtD4ZSH7pdbfIu1pOFwgptDPLMo/z9jr4sUfsjFVPqDCEin/F7IYlq7/E6yDbQ==",
+ "version": "2.6.6",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz",
+ "integrity": "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==",
"dev": true,
"requires": {
- "ajv": "^6.10.2",
+ "ajv": "^6.12.0",
"ajv-keywords": "^3.4.1"
}
}
diff --git a/package.json b/package.json
index 6068e717c3a..cc7df5fead8 100644
--- a/package.json
+++ b/package.json
@@ -112,7 +112,7 @@
"sass-loader": "^8.0.2",
"sinon": "^9.0.2",
"sinon-chai": "^3.5.0",
- "style-loader": "^1.1.3",
+ "style-loader": "^1.1.4",
"url-loader": "^4.1.0",
"vue-loader": "^15.9.1",
"vue-template-compiler": "^2.6.11",
diff --git a/tests/lib/Preview/BackgroundCleanupJobTest.php b/tests/lib/Preview/BackgroundCleanupJobTest.php
index db2bf09b6e5..cd9f6ef0399 100644
--- a/tests/lib/Preview/BackgroundCleanupJobTest.php
+++ b/tests/lib/Preview/BackgroundCleanupJobTest.php
@@ -22,10 +22,13 @@
namespace Test\Preview;
-use OC\Files\AppData\Factory;
use OC\Preview\BackgroundCleanupJob;
+use OC\Preview\Storage\Root;
use OC\PreviewManager;
+use OCP\Files\File;
+use OCP\Files\IMimeTypeLoader;
use OCP\Files\IRootFolder;
+use OCP\Files\NotFoundException;
use OCP\IDBConnection;
use Test\Traits\MountProviderTrait;
use Test\Traits\UserTrait;
@@ -47,9 +50,6 @@ class BackgroundCleanupJobTest extends \Test\TestCase {
/** @var bool */
private $trashEnabled;
- /** @var Factory */
- private $appDataFactory;
-
/** @var IDBConnection */
private $connection;
@@ -59,6 +59,9 @@ class BackgroundCleanupJobTest extends \Test\TestCase {
/** @var IRootFolder */
private $rootFolder;
+ /** @var IMimeTypeLoader */
+ private $mimeTypeLoader;
+
protected function setUp(): void {
parent::setUp();
@@ -76,13 +79,10 @@ class BackgroundCleanupJobTest extends \Test\TestCase {
$this->trashEnabled = $appManager->isEnabledForUser('files_trashbin', $this->userId);
$appManager->disableApp('files_trashbin');
- $this->appDataFactory = new Factory(
- \OC::$server->getRootFolder(),
- \OC::$server->getSystemConfig()
- );
$this->connection = \OC::$server->getDatabaseConnection();
$this->previewManager = \OC::$server->getPreviewManager();
$this->rootFolder = \OC::$server->getRootFolder();
+ $this->mimeTypeLoader = \OC::$server->getMimeTypeLoader();
}
protected function tearDown(): void {
@@ -96,6 +96,13 @@ class BackgroundCleanupJobTest extends \Test\TestCase {
parent::tearDown();
}
+ private function getRoot(): Root {
+ return new Root(
+ \OC::$server->getRootFolder(),
+ \OC::$server->getSystemConfig()
+ );
+ }
+
private function setup11Previews(): array {
$userFolder = $this->rootFolder->getUserFolder($this->userId);
@@ -110,52 +117,89 @@ class BackgroundCleanupJobTest extends \Test\TestCase {
return $files;
}
+ private function countPreviews(Root $previewRoot, array $fileIds): int {
+ $i = 0;
+
+ foreach ($fileIds as $fileId) {
+ try {
+ $previewRoot->getFolder((string)$fileId);
+ } catch (NotFoundException $e) {
+ continue;
+ }
+
+ $i++;
+ }
+
+ return $i;
+ }
+
public function testCleanupSystemCron() {
$files = $this->setup11Previews();
+ $fileIds = array_map(function (File $f) {
+ return $f->getId();
+ }, $files);
- $preview = $this->appDataFactory->get('preview');
-
- $previews = $preview->getDirectoryListing();
- $this->assertCount(11, $previews);
+ $root = $this->getRoot();
- $job = new BackgroundCleanupJob($this->connection, $this->appDataFactory, true);
+ $this->assertSame(11, $this->countPreviews($root, $fileIds));
+ $job = new BackgroundCleanupJob($this->connection, $root, $this->mimeTypeLoader, true);
$job->run([]);
foreach ($files as $file) {
$file->delete();
}
- $this->assertCount(11, $previews);
+ $root = $this->getRoot();
+ $this->assertSame(11, $this->countPreviews($root, $fileIds));
$job->run([]);
- $previews = $preview->getDirectoryListing();
- $this->assertCount(0, $previews);
+ $root = $this->getRoot();
+ $this->assertSame(0, $this->countPreviews($root, $fileIds));
}
public function testCleanupAjax() {
$files = $this->setup11Previews();
+ $fileIds = array_map(function (File $f) {
+ return $f->getId();
+ }, $files);
- $preview = $this->appDataFactory->get('preview');
-
- $previews = $preview->getDirectoryListing();
- $this->assertCount(11, $previews);
+ $root = $this->getRoot();
- $job = new BackgroundCleanupJob($this->connection, $this->appDataFactory, false);
+ $this->assertSame(11, $this->countPreviews($root, $fileIds));
+ $job = new BackgroundCleanupJob($this->connection, $root, $this->mimeTypeLoader, false);
$job->run([]);
foreach ($files as $file) {
$file->delete();
}
- $this->assertCount(11, $previews);
+ $root = $this->getRoot();
+ $this->assertSame(11, $this->countPreviews($root, $fileIds));
$job->run([]);
- $previews = $preview->getDirectoryListing();
- $this->assertCount(1, $previews);
+ $root = $this->getRoot();
+ $this->assertSame(1, $this->countPreviews($root, $fileIds));
+ $job->run([]);
+
+ $root = $this->getRoot();
+ $this->assertSame(0, $this->countPreviews($root, $fileIds));
+ }
+
+ public function testOldPreviews() {
+ $appdata = \OC::$server->getAppDataDir('preview');
+
+ $f1 = $appdata->newFolder('123456781');
+ $f1->newFile('foo.jpg', 'foo');
+ $f2 = $appdata->newFolder('123456782');
+ $f2->newFile('foo.jpg', 'foo');
+
+ $appdata = \OC::$server->getAppDataDir('preview');
+ $this->assertSame(2, count($appdata->getDirectoryListing()));
+ $job = new BackgroundCleanupJob($this->connection, $this->getRoot(), $this->mimeTypeLoader, true);
$job->run([]);
- $previews = $preview->getDirectoryListing();
- $this->assertCount(0, $previews);
+ $appdata = \OC::$server->getAppDataDir('preview');
+ $this->assertSame(0, count($appdata->getDirectoryListing()));
}
}