summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/files/appinfo/remote.php6
-rw-r--r--apps/files/css/files.css4
-rw-r--r--apps/files/l10n/gl.php2
-rw-r--r--apps/files/l10n/ja.php5
-rw-r--r--apps/files_encryption/l10n/ja.php1
-rwxr-xr-xapps/files_encryption/tests/webdav.php8
-rw-r--r--apps/files_external/l10n/gl.php4
-rw-r--r--apps/files_external/l10n/ja.php4
-rw-r--r--apps/files_external/lib/webdav.php6
-rw-r--r--apps/files_sharing/app/sharing.php25
-rw-r--r--apps/files_sharing/appinfo/app.php3
-rw-r--r--apps/files_sharing/appinfo/routes.php15
-rw-r--r--apps/files_sharing/controller/adminsettingscontroller.php60
-rw-r--r--apps/files_sharing/css/settings-admin.css33
-rw-r--r--apps/files_sharing/http/mailtemplateresponse.php55
-rw-r--r--apps/files_sharing/js/app.js4
-rw-r--r--apps/files_sharing/js/settings-admin.js78
-rw-r--r--apps/files_sharing/js/share.js239
-rw-r--r--apps/files_sharing/js/sharedfilelist.js43
-rw-r--r--apps/files_sharing/l10n/ast.php4
-rw-r--r--apps/files_sharing/l10n/de.php1
-rw-r--r--apps/files_sharing/l10n/de_DE.php1
-rw-r--r--apps/files_sharing/l10n/el.php1
-rw-r--r--apps/files_sharing/l10n/en_GB.php1
-rw-r--r--apps/files_sharing/l10n/es.php1
-rw-r--r--apps/files_sharing/l10n/fi_FI.php1
-rw-r--r--apps/files_sharing/l10n/fr.php1
-rw-r--r--apps/files_sharing/l10n/gl.php1
-rw-r--r--apps/files_sharing/l10n/it.php5
-rw-r--r--apps/files_sharing/l10n/ja.php1
-rw-r--r--apps/files_sharing/l10n/nb_NO.php1
-rw-r--r--apps/files_sharing/l10n/pl.php1
-rw-r--r--apps/files_sharing/l10n/pt_BR.php1
-rw-r--r--apps/files_sharing/l10n/pt_PT.php1
-rw-r--r--apps/files_sharing/l10n/sv.php1
-rw-r--r--apps/files_sharing/l10n/tr.php1
-rw-r--r--apps/files_sharing/lib/api.php1
-rw-r--r--apps/files_sharing/lib/connector/publicauth.php2
-rw-r--r--apps/files_sharing/lib/mailtemplate.php126
-rw-r--r--apps/files_sharing/publicwebdav.php6
-rw-r--r--apps/files_sharing/settings-admin.php21
-rw-r--r--apps/files_sharing/templates/settings-admin.php41
-rw-r--r--apps/files_sharing/tests/js/appSpec.js4
-rw-r--r--apps/files_sharing/tests/js/shareSpec.js450
-rw-r--r--apps/files_sharing/tests/js/sharedfilelistSpec.js10
-rw-r--r--apps/files_trashbin/appinfo/update.php3
-rw-r--r--apps/files_trashbin/lib/trashbin.php4
-rw-r--r--apps/files_versions/appinfo/database.xml35
-rw-r--r--apps/files_versions/appinfo/update.php12
-rw-r--r--apps/files_versions/appinfo/version2
-rw-r--r--apps/files_versions/lib/versions.php72
-rw-r--r--apps/user_ldap/l10n/ast.php1
-rw-r--r--apps/user_ldap/l10n/de.php1
-rw-r--r--apps/user_ldap/l10n/de_DE.php1
-rw-r--r--apps/user_ldap/l10n/fi_FI.php2
-rw-r--r--apps/user_ldap/l10n/gl.php3
-rw-r--r--apps/user_ldap/l10n/it.php1
-rw-r--r--apps/user_ldap/l10n/ja.php17
-rw-r--r--apps/user_ldap/l10n/tr.php1
-rw-r--r--apps/user_webdavauth/l10n/ar.php3
-rw-r--r--apps/user_webdavauth/l10n/ast.php1
-rw-r--r--apps/user_webdavauth/l10n/bg_BG.php3
-rw-r--r--apps/user_webdavauth/l10n/bn_BD.php6
-rw-r--r--apps/user_webdavauth/l10n/bs.php5
-rw-r--r--apps/user_webdavauth/l10n/ca.php1
-rw-r--r--apps/user_webdavauth/l10n/cs_CZ.php1
-rw-r--r--apps/user_webdavauth/l10n/cy_GB.php5
-rw-r--r--apps/user_webdavauth/l10n/da.php1
-rw-r--r--apps/user_webdavauth/l10n/de.php2
-rw-r--r--apps/user_webdavauth/l10n/de_AT.php5
-rw-r--r--apps/user_webdavauth/l10n/de_CH.php1
-rw-r--r--apps/user_webdavauth/l10n/de_DE.php2
-rw-r--r--apps/user_webdavauth/l10n/el.php1
-rw-r--r--apps/user_webdavauth/l10n/en_GB.php1
-rw-r--r--apps/user_webdavauth/l10n/eo.php3
-rw-r--r--apps/user_webdavauth/l10n/es.php1
-rw-r--r--apps/user_webdavauth/l10n/es_AR.php1
-rw-r--r--apps/user_webdavauth/l10n/es_MX.php1
-rw-r--r--apps/user_webdavauth/l10n/et_EE.php1
-rw-r--r--apps/user_webdavauth/l10n/eu.php1
-rw-r--r--apps/user_webdavauth/l10n/eu_ES.php5
-rw-r--r--apps/user_webdavauth/l10n/fa.php3
-rw-r--r--apps/user_webdavauth/l10n/fi_FI.php2
-rw-r--r--apps/user_webdavauth/l10n/fr.php1
-rw-r--r--apps/user_webdavauth/l10n/gl.php2
-rw-r--r--apps/user_webdavauth/l10n/he.php3
-rw-r--r--apps/user_webdavauth/l10n/hi.php5
-rw-r--r--apps/user_webdavauth/l10n/hr.php5
-rw-r--r--apps/user_webdavauth/l10n/hu_HU.php1
-rw-r--r--apps/user_webdavauth/l10n/hy.php5
-rw-r--r--apps/user_webdavauth/l10n/ia.php5
-rw-r--r--apps/user_webdavauth/l10n/id.php1
-rw-r--r--apps/user_webdavauth/l10n/is.php3
-rw-r--r--apps/user_webdavauth/l10n/it.php2
-rw-r--r--apps/user_webdavauth/l10n/ja.php3
-rw-r--r--apps/user_webdavauth/l10n/ka_GE.php3
-rw-r--r--apps/user_webdavauth/l10n/km.php1
-rw-r--r--apps/user_webdavauth/l10n/ko.php1
-rw-r--r--apps/user_webdavauth/l10n/ku_IQ.php5
-rw-r--r--apps/user_webdavauth/l10n/lb.php5
-rw-r--r--apps/user_webdavauth/l10n/lt_LT.php1
-rw-r--r--apps/user_webdavauth/l10n/lv.php3
-rw-r--r--apps/user_webdavauth/l10n/mk.php2
-rw-r--r--apps/user_webdavauth/l10n/ms_MY.php1
-rw-r--r--apps/user_webdavauth/l10n/nb_NO.php1
-rw-r--r--apps/user_webdavauth/l10n/nl.php1
-rw-r--r--apps/user_webdavauth/l10n/nn_NO.php1
-rw-r--r--apps/user_webdavauth/l10n/oc.php5
-rw-r--r--apps/user_webdavauth/l10n/pl.php1
-rw-r--r--apps/user_webdavauth/l10n/pt_BR.php1
-rw-r--r--apps/user_webdavauth/l10n/pt_PT.php1
-rw-r--r--apps/user_webdavauth/l10n/ro.php3
-rw-r--r--apps/user_webdavauth/l10n/ru.php1
-rw-r--r--apps/user_webdavauth/l10n/si_LK.php6
-rw-r--r--apps/user_webdavauth/l10n/sk.php5
-rw-r--r--apps/user_webdavauth/l10n/sk_SK.php1
-rw-r--r--apps/user_webdavauth/l10n/sl.php1
-rw-r--r--apps/user_webdavauth/l10n/sq.php5
-rw-r--r--apps/user_webdavauth/l10n/sr.php3
-rw-r--r--apps/user_webdavauth/l10n/sr@latin.php5
-rw-r--r--apps/user_webdavauth/l10n/sv.php1
-rw-r--r--apps/user_webdavauth/l10n/ta_LK.php6
-rw-r--r--apps/user_webdavauth/l10n/te.php5
-rw-r--r--apps/user_webdavauth/l10n/th_TH.php3
-rw-r--r--apps/user_webdavauth/l10n/tr.php2
-rw-r--r--apps/user_webdavauth/l10n/ug.php3
-rw-r--r--apps/user_webdavauth/l10n/uk.php1
-rw-r--r--apps/user_webdavauth/l10n/ur_PK.php5
-rw-r--r--apps/user_webdavauth/l10n/vi.php1
-rw-r--r--apps/user_webdavauth/l10n/zh_CN.php1
-rw-r--r--apps/user_webdavauth/l10n/zh_HK.php1
-rw-r--r--apps/user_webdavauth/l10n/zh_TW.php1
132 files changed, 1327 insertions, 293 deletions
diff --git a/apps/files/appinfo/remote.php b/apps/files/appinfo/remote.php
index c1baee4f1ef..92c76183876 100644
--- a/apps/files/appinfo/remote.php
+++ b/apps/files/appinfo/remote.php
@@ -36,9 +36,9 @@ $server->setBaseUri($baseuri);
// Load plugins
$defaults = new OC_Defaults();
-$server->addPlugin(new Sabre_DAV_Auth_Plugin($authBackend, $defaults->getName()));
-$server->addPlugin(new Sabre_DAV_Locks_Plugin($lockBackend));
-$server->addPlugin(new Sabre_DAV_Browser_Plugin(false));
+$server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend, $defaults->getName()));
+$server->addPlugin(new \Sabre\DAV\Locks\Plugin($lockBackend));
+$server->addPlugin(new \Sabre\DAV\Browser\Plugin(false)); // Show something in the Browser, but no upload
$server->addPlugin(new OC_Connector_Sabre_FilesPlugin());
$server->addPlugin(new OC_Connector_Sabre_MaintenancePlugin());
$server->addPlugin(new OC_Connector_Sabre_ExceptionLoggerPlugin('webdav'));
diff --git a/apps/files/css/files.css b/apps/files/css/files.css
index 501a216043c..36dd6e78ed7 100644
--- a/apps/files/css/files.css
+++ b/apps/files/css/files.css
@@ -87,10 +87,6 @@
#filestable tbody tr { background-color:#fff; height:51px; }
-.app-files #app-content {
- position: relative;
-}
-
/* fit app list view heights */
.app-files #app-content>.viewcontainer {
height: 100%;
diff --git a/apps/files/l10n/gl.php b/apps/files/l10n/gl.php
index 0c717258fe6..866d8a366fa 100644
--- a/apps/files/l10n/gl.php
+++ b/apps/files/l10n/gl.php
@@ -82,7 +82,7 @@ $TRANSLATIONS = array(
"You don’t have permission to upload or create files here" => "Non ten permisos para enviar ou crear ficheiros aquí.",
"Nothing in here. Upload something!" => "Aquí non hai nada. Envíe algo.",
"Download" => "Descargar",
-"Upload too large" => "Envío demasiado grande",
+"Upload too large" => "Envío grande de máis",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Os ficheiros que tenta enviar exceden do tamaño máximo permitido neste servidor",
"Files are being scanned, please wait." => "Estanse analizando os ficheiros. Agarde.",
"Currently scanning" => "Análise actual"
diff --git a/apps/files/l10n/ja.php b/apps/files/l10n/ja.php
index 8a7683dee20..fe1a9aeb864 100644
--- a/apps/files/l10n/ja.php
+++ b/apps/files/l10n/ja.php
@@ -5,7 +5,7 @@ $TRANSLATIONS = array(
"File name cannot be empty." => "ファイル名を空にすることはできません。",
"\"%s\" is an invalid file name." => "\"%s\" は無効なファイル名です。",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "無効な名前、'\\', '/', '<', '>', ':', '\"', '|', '?', '*' は使用できません。",
-"The target folder has been moved or deleted." => "目標のフォルダは移動されたか、削除されました。",
+"The target folder has been moved or deleted." => "対象のフォルダーは移動されたか、削除されました。",
"The name %s is already used in the folder %s. Please choose a different name." => "%s はフォルダー %s ですでに使われています。別の名前を選択してください。",
"Not a valid source" => "有効なソースではありません",
"Server is not allowed to open URLs, please check the server configuration" => "サーバーは、URLを開くことは許されません。サーバーの設定をチェックしてください。",
@@ -84,6 +84,7 @@ $TRANSLATIONS = array(
"Download" => "ダウンロード",
"Upload too large" => "アップロードには大きすぎます。",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "アップロードしようとしているファイルは、サーバーで規定された最大サイズを超えています。",
-"Files are being scanned, please wait." => "ファイルをスキャンしています、しばらくお待ちください。"
+"Files are being scanned, please wait." => "ファイルをスキャンしています、しばらくお待ちください。",
+"Currently scanning" => "現在スキャン中"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/files_encryption/l10n/ja.php b/apps/files_encryption/l10n/ja.php
index fa1d4c3da40..81de8419c20 100644
--- a/apps/files_encryption/l10n/ja.php
+++ b/apps/files_encryption/l10n/ja.php
@@ -11,6 +11,7 @@ $TRANSLATIONS = array(
"Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." => "セッション中に暗号化アプリを再度有効にされたため、暗号化アプリが初期化されていません。暗号化アプリを初期化するため、ログアウトしてログインしなおしてください。",
"Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." => "プライベートキーが有効ではありません!パスワードが%sの外部で変更された(例: 共同ディレクトリ)と思われます。個人設定でプライベートキーのパスワードを更新して、暗号化ファイルへのアクセスを回復することができます。",
"Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." => "このファイルを復号化できません、共有ファイルの可能性があります。ファイルの所有者にお願いして、ファイルを共有しなおしてもらってください。",
+"Unknown error. Please check your system settings or contact your administrator" => "不明なエラーです。システム設定を確認するか、管理者に問い合わせてください。",
"Missing requirements." => "必要要件が満たされていません。",
"Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." => "必ず、PHP 5.3.3もしくはそれ以上をインストールし、同時にOpenSSLのPHP拡張を有効にした上でOpenSSLも同様にインストール、適切に設定してください。現時点では暗号化アプリは無効になっています。",
"Following users are not set up for encryption:" => "以下のユーザーは、暗号化設定がされていません:",
diff --git a/apps/files_encryption/tests/webdav.php b/apps/files_encryption/tests/webdav.php
index f299116ff23..84db54ff30b 100755
--- a/apps/files_encryption/tests/webdav.php
+++ b/apps/files_encryption/tests/webdav.php
@@ -238,14 +238,14 @@ class Test_Encryption_Webdav extends \PHPUnit_Framework_TestCase {
$objectTree->init($publicDir, $view);
// Fire up server
- $server = new Sabre_DAV_Server($publicDir);
+ $server = new \Sabre\DAV\Server($publicDir);
$server->httpRequest = $requestBackend;
$server->setBaseUri('/remote.php/webdav/');
// Load plugins
- $server->addPlugin(new Sabre_DAV_Auth_Plugin($authBackend, 'ownCloud'));
- $server->addPlugin(new Sabre_DAV_Locks_Plugin($lockBackend));
- $server->addPlugin(new Sabre_DAV_Browser_Plugin(false)); // Show something in the Browser, but no upload
+ $server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend, 'ownCloud'));
+ $server->addPlugin(new \Sabre\DAV\Locks\Plugin($lockBackend));
+ $server->addPlugin(new \Sabre\DAV\Browser\Plugin(false)); // Show something in the Browser, but no upload
$server->addPlugin(new OC_Connector_Sabre_QuotaPlugin($view));
$server->addPlugin(new OC_Connector_Sabre_MaintenancePlugin());
$server->debugExceptions = true;
diff --git a/apps/files_external/l10n/gl.php b/apps/files_external/l10n/gl.php
index 248afb5f6a7..e143fd3a881 100644
--- a/apps/files_external/l10n/gl.php
+++ b/apps/files_external/l10n/gl.php
@@ -64,7 +64,7 @@ $TRANSLATIONS = array(
"Delete" => "Eliminar",
"Enable User External Storage" => "Activar o almacenamento externo do usuario",
"Allow users to mount the following external storage" => "Permitirlle aos usuarios montar o seguinte almacenamento externo",
-"SSL root certificates" => "Certificados SSL root",
-"Import Root Certificate" => "Importar o certificado root"
+"SSL root certificates" => "Certificados raíz SSL",
+"Import Root Certificate" => "Importar o certificado raíz"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/files_external/l10n/ja.php b/apps/files_external/l10n/ja.php
index b70dd2a09a4..6dce541abaf 100644
--- a/apps/files_external/l10n/ja.php
+++ b/apps/files_external/l10n/ja.php
@@ -38,7 +38,7 @@ $TRANSLATIONS = array(
"Username as share" => "共有名",
"URL" => "URL",
"Secure https://" => "セキュア https://",
-"Remote subfolder" => "リモートサブフォルダ",
+"Remote subfolder" => "リモートサブフォルダー",
"Access granted" => "アクセスは許可されました",
"Error configuring Dropbox storage" => "Dropboxストレージの設定エラー",
"Grant access" => "アクセスを許可",
@@ -63,7 +63,7 @@ $TRANSLATIONS = array(
"Users" => "ユーザー",
"Delete" => "削除",
"Enable User External Storage" => "ユーザーの外部ストレージを有効にする",
-"Allow users to mount the following external storage" => "ユーザに以下の外部ストレージのマウントを許可する",
+"Allow users to mount the following external storage" => "ユーザーに以下の外部ストレージのマウントを許可する",
"SSL root certificates" => "SSLルート証明書",
"Import Root Certificate" => "ルート証明書をインポート"
);
diff --git a/apps/files_external/lib/webdav.php b/apps/files_external/lib/webdav.php
index dc98dcfb808..3ea2db0656d 100644
--- a/apps/files_external/lib/webdav.php
+++ b/apps/files_external/lib/webdav.php
@@ -17,7 +17,7 @@ class DAV extends \OC\Files\Storage\Common {
private $certPath;
private $ready;
/**
- * @var \Sabre_DAV_Client
+ * @var \Sabre\DAV\Client
*/
private $client;
@@ -71,7 +71,7 @@ class DAV extends \OC\Files\Storage\Common {
'password' => $this->password,
);
- $this->client = new \Sabre_DAV_Client($settings);
+ $this->client = new \Sabre\DAV\Client($settings);
if ($this->secure === true && $this->certPath) {
$this->client->addTrustedCertificates($this->certPath);
@@ -252,7 +252,7 @@ class DAV extends \OC\Files\Storage\Common {
if ($this->file_exists($path)) {
try {
$this->client->proppatch($this->encodePath($path), array('{DAV:}lastmodified' => $mtime));
- } catch (\Sabre_DAV_Exception_NotImplemented $e) {
+ } catch (\Sabre\DAV\Exception\NotImplemented $e) {
return false;
}
} else {
diff --git a/apps/files_sharing/app/sharing.php b/apps/files_sharing/app/sharing.php
new file mode 100644
index 00000000000..427269755b9
--- /dev/null
+++ b/apps/files_sharing/app/sharing.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace OCA\Files_Sharing\App;
+
+use \OCP\AppFramework\App;
+use \OCA\Files_Sharing\Controller\AdminSettingsController;
+
+class Sharing extends App {
+
+ public function __construct(array $urlParams=array()){
+ parent::__construct('files_sharing', $urlParams);
+
+ $container = $this->getContainer();
+
+ /**
+ * Controllers
+ */
+ $container->registerService('AdminSettingsController', function($c) {
+ return new AdminSettingsController(
+ $c->query('AppName'),
+ $c->query('Request')
+ );
+ });
+ }
+}
diff --git a/apps/files_sharing/appinfo/app.php b/apps/files_sharing/appinfo/app.php
index 21b2646c5ea..81f91b60d30 100644
--- a/apps/files_sharing/appinfo/app.php
+++ b/apps/files_sharing/appinfo/app.php
@@ -21,6 +21,9 @@ OCP\Util::addScript('files_sharing', 'share');
\OC_Hook::connect('OC_Filesystem', 'post_rename', '\OC\Files\Cache\Shared_Updater', 'renameHook');
\OC_Hook::connect('OC_Appconfig', 'post_set_value', '\OCA\Files\Share\Maintainer', 'configChangeHook');
+// Register settings scripts for mail template editing
+OCP\App::registerAdmin('files_sharing', 'settings-admin');
+
OC_FileProxy::register(new OCA\Files\Share\Proxy());
\OCA\Files\App::getNavigationManager()->add(
diff --git a/apps/files_sharing/appinfo/routes.php b/apps/files_sharing/appinfo/routes.php
index 7c2834dc9c2..5b6286e2bfb 100644
--- a/apps/files_sharing/appinfo/routes.php
+++ b/apps/files_sharing/appinfo/routes.php
@@ -5,6 +5,21 @@ $this->create('core_ajax_public_preview', '/publicpreview')->action(
require_once __DIR__ . '/../ajax/publicpreview.php';
});
+use \OCA\Files_Sharing\App\Sharing;
+
+$app = new Sharing();
+
+$app->registerRoutes($this, array('routes' => array(
+
+ // mailTemplate settings
+ array('name' => 'admin_settings#render', 'url' => '/settings/mailtemplate', 'verb' => 'GET'),
+
+ array('name' => 'admin_settings#update', 'url' => '/settings/mailtemplate', 'verb' => 'POST'),
+
+ array('name' => 'admin_settings#reset', 'url' => '/settings/mailtemplate', 'verb' => 'DELETE')
+
+)));
+
// OCS API
//TODO: SET: mail notification, waiting for PR #4689 to be accepted
diff --git a/apps/files_sharing/controller/adminsettingscontroller.php b/apps/files_sharing/controller/adminsettingscontroller.php
new file mode 100644
index 00000000000..fed3147a99c
--- /dev/null
+++ b/apps/files_sharing/controller/adminsettingscontroller.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace OCA\Files_Sharing\Controller;
+
+use \OCP\AppFramework\ApiController;
+use \OCP\IRequest;
+use \OCP\AppFramework\Http\JSONResponse;
+
+class AdminSettingsController extends ApiController {
+
+ public function __construct($appName, IRequest $request) {
+ parent::__construct($appName, $request);
+ }
+
+ /**
+ * @param string $theme
+ * @param string $template
+ * @return \OCA\Files_Sharing\Http\MailTemplateResponse
+ */
+ public function render( $theme, $template ) {
+ try {
+ $template = new \OCA\Files_Sharing\MailTemplate( $theme, $template );
+ return $template->getResponse();
+ } catch (\Exception $ex) {
+ return new JSONResponse(array('message' => $ex->getMessage()), $ex->getCode());
+ }
+ }
+
+ /**
+ * @param string $theme
+ * @param string $template
+ * @param string $content
+ * @return JSONResponse
+ */
+ public function update( $theme, $template, $content ) {
+ try {
+ $template = new \OCA\Files_Sharing\MailTemplate( $theme, $template );
+ $template->setContent( $content );
+ return new JSONResponse();
+ } catch (\Exception $ex) {
+ return new JSONResponse(array('message' => $ex->getMessage()), $ex->getCode());
+ }
+ }
+
+ /**
+ * @param string $theme
+ * @param string $template
+ * @return JSONResponse
+ */
+ public function reset( $theme, $template ) {
+ try {
+ $template = new \OCA\Files_Sharing\MailTemplate( $theme, $template );
+ $template->reset();
+ return new JSONResponse();
+ } catch (\Exception $ex) {
+ return new JSONResponse(array('message' => $ex->getMessage()), $ex->getCode());
+ }
+ }
+
+}
diff --git a/apps/files_sharing/css/settings-admin.css b/apps/files_sharing/css/settings-admin.css
new file mode 100644
index 00000000000..7ee71963436
--- /dev/null
+++ b/apps/files_sharing/css/settings-admin.css
@@ -0,0 +1,33 @@
+#mailTemplateSettings .actions div {
+ display: inline-block;
+}
+
+#mailTemplateSettings div label {
+ display: block
+}
+
+#mailTemplateSettings textarea {
+ box-sizing: border-box;
+ width: 100%;
+ height: 150px;
+}
+
+#mailTemplateSettings .templateEditor + .actions {
+ height:28px;
+}
+
+
+#mailTemplateSettings .actions .reset {
+ margin: 0;
+}
+
+#mailTemplateSettings .actions .save {
+ float: right;
+ margin: 0;
+}
+
+#mailTemplateSettings #mts-msg {
+ float: right;
+ margin: 1px 5px;
+ padding:3px;
+}
diff --git a/apps/files_sharing/http/mailtemplateresponse.php b/apps/files_sharing/http/mailtemplateresponse.php
new file mode 100644
index 00000000000..98a2dfcc94e
--- /dev/null
+++ b/apps/files_sharing/http/mailtemplateresponse.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * ownCloud - App Framework
+ *
+ * @author Jörn Dreyer
+ * @copyright 2014 Jörn Dreyer <jfd@owncloud.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library 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 library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\Files_Sharing\Http;
+
+/**
+ * Prompts the user to download the a file
+ */
+class MailTemplateResponse extends \OCP\AppFramework\Http\Response {
+
+ private $filename;
+ private $contentType;
+
+ /**
+ * Creates a response that prompts the user to download the file
+ * @param string $filename the name that the downloaded file should have
+ * @param string $contentType the mimetype that the downloaded file should have
+ */
+ public function __construct($filename, $contentType = 'text/php') {
+ $this->filename = $filename;
+ $this->contentType = $contentType;
+
+ $this->addHeader('Content-Disposition', 'attachment; filename="' . $filename . '"');
+ $this->addHeader('Content-Type', $contentType);
+ }
+
+ /**
+ * Returns the raw template content
+ * @return string the file
+ */
+ public function render(){
+ return file_get_contents($this->filename);
+ }
+
+}
diff --git a/apps/files_sharing/js/app.js b/apps/files_sharing/js/app.js
index 3764328a5d0..800873cd638 100644
--- a/apps/files_sharing/js/app.js
+++ b/apps/files_sharing/js/app.js
@@ -8,7 +8,9 @@
*
*/
-OCA.Sharing = {};
+if (!OCA.Sharing) {
+ OCA.Sharing = {};
+}
OCA.Sharing.App = {
_inFileList: null,
diff --git a/apps/files_sharing/js/settings-admin.js b/apps/files_sharing/js/settings-admin.js
new file mode 100644
index 00000000000..fa9b236ea98
--- /dev/null
+++ b/apps/files_sharing/js/settings-admin.js
@@ -0,0 +1,78 @@
+$(document).ready(function() {
+
+ var loadTemplate = function (theme, template) {
+ $.get(
+ OC.generateUrl('apps/files_sharing/settings/mailtemplate'),
+ { theme: theme, template: template }
+ ).done(function( result ) {
+ $( '#mailTemplateSettings textarea' ).val(result);
+ }).fail(function( result ) {
+ OC.dialogs.alert(result.message, t('files_sharing', 'Could not load template'));
+ });
+ };
+
+ // load default template
+ var theme = $( '#mts-theme' ).val();
+ var template = $( '#mts-template' ).val();
+ loadTemplate(theme, template);
+
+ $( '#mts-template' ).change(
+ function() {
+ var theme = $( '#mts-theme' ).val();
+ var template = $( this ).val();
+ loadTemplate(theme, template);
+ }
+ );
+
+ $( '#mts-theme' ).change(
+ function() {
+ var theme = $( this ).val();
+ var template = $( '#mts-template' ).val();
+ loadTemplate(theme, template);
+ }
+ );
+
+ $( '#mailTemplateSettings .actions' ).on('click', '.save',
+ function() {
+ var theme = $( '#mts-theme' ).val();
+ var template = $( '#mts-template' ).val();
+ var content = $( '#mailTemplateSettings textarea' ).val();
+ OC.msg.startSaving('#mts-msg');
+ $.post(
+ OC.generateUrl('apps/files_sharing/settings/mailtemplate'),
+ { theme: theme, template: template, content: content }
+ ).done(function() {
+ var data = { status:'success', data:{message:t('files_sharing', 'Saved')} };
+ OC.msg.finishedSaving('#mts-msg', data);
+ }).fail(function(result) {
+ var data = { status: 'error', data:{message:result.responseJSON.message} };
+ OC.msg.finishedSaving('#mts-msg', data);
+ });
+ }
+ );
+
+ $( '#mailTemplateSettings .actions' ).on('click', '.reset',
+ function() {
+ var theme = $( '#mts-theme' ).val();
+ var template = $( '#mts-template' ).val();
+ OC.msg.startSaving('#mts-msg');
+ $.ajax({
+ type: "DELETE",
+ url: OC.generateUrl('apps/files_sharing/settings/mailtemplate'),
+ data: { theme: theme, template: template }
+ }).done(function() {
+ var data = { status:'success', data:{message:t('files_sharing', 'Reset')} };
+ OC.msg.finishedSaving('#mts-msg', data);
+
+ // load default template
+ var theme = $( '#mts-theme' ).val();
+ var template = $( '#mts-template' ).val();
+ loadTemplate(theme, template);
+ }).fail(function(result) {
+ var data = { status: 'error', data:{message:result.responseJSON.message} };
+ OC.msg.finishedSaving('#mts-msg', data);
+ });
+ }
+ );
+
+});
diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js
index 5a42604c866..d63a590fb8e 100644
--- a/apps/files_sharing/js/share.js
+++ b/apps/files_sharing/js/share.js
@@ -8,103 +8,166 @@
*
*/
-$(document).ready(function() {
- if (!_.isUndefined(OC.Share) && !_.isUndefined(OCA.Files)) {
- // TODO: make a separate class for this or a hook or jQuery event ?
- if (OCA.Files.FileList) {
- var oldCreateRow = OCA.Files.FileList.prototype._createRow;
- OCA.Files.FileList.prototype._createRow = function(fileData) {
- var tr = oldCreateRow.apply(this, arguments);
- if (fileData.shareOwner) {
- tr.attr('data-share-owner', fileData.shareOwner);
- // user should always be able to rename a mount point
- if (fileData.isShareMountPoint) {
- tr.attr('data-permissions', fileData.permissions | OC.PERMISSION_UPDATE);
- tr.attr('data-reshare-permissions', fileData.permissions);
+(function() {
+ if (!OCA.Sharing) {
+ OCA.Sharing = {};
+ }
+ OCA.Sharing.Util = {
+ initialize: function(fileActions) {
+ if (OCA.Files.FileList) {
+ var oldCreateRow = OCA.Files.FileList.prototype._createRow;
+ OCA.Files.FileList.prototype._createRow = function(fileData) {
+ var tr = oldCreateRow.apply(this, arguments);
+ if (fileData.shareOwner) {
+ tr.attr('data-share-owner', fileData.shareOwner);
+ // user should always be able to rename a mount point
+ if (fileData.isShareMountPoint) {
+ tr.attr('data-permissions', fileData.permissions | OC.PERMISSION_UPDATE);
+ tr.attr('data-reshare-permissions', fileData.permissions);
+ }
}
- }
- return tr;
- };
- }
+ if (fileData.recipientsDisplayName) {
+ tr.attr('data-share-recipients', fileData.recipientsDisplayName);
+ }
+ return tr;
+ };
- // use delegate to catch the case with multiple file lists
- $('#content').delegate('#fileList', 'fileActionsReady',function(ev){
- // if no share action exists because the admin disabled sharing for this user
- // we create a share notification action to inform the user about files
- // shared with him otherwise we just update the existing share action.
- var fileList = ev.fileList;
- var $fileList = $(this);
- $fileList.find('[data-share-owner]').each(function() {
- var $tr = $(this);
- var $action;
- var owner;
- var message;
- var permissions = $tr.data('permissions');
- if(permissions & OC.PERMISSION_SHARE) {
- $action = $tr.find('[data-Action="Share"]');
- $action.addClass('permanent');
- owner = $tr.closest('tr').attr('data-share-owner');
- message = ' ' + t('files_sharing', 'Shared by {owner}', {owner: owner});
- $action.find('span').text(message);
- } else {
- var shareNotification = '<a class="action action-share-notification permanent"' +
- ' data-action="Share-Notification" href="#" original-title="">' +
- ' <img class="svg" src="' + OC.imagePath('core', 'actions/share') + '"></img>';
- $tr.find('.fileactions').append(function() {
- var owner = $(this).closest('tr').attr('data-share-owner');
- var shareBy = t('files_sharing', 'Shared by {owner}', {owner: owner});
- var $result = $(shareNotification + '<span> ' + shareBy + '</span></span>');
- $result.on('click', function() {
- return false;
- });
- return $result;
- });
+ var oldRenderRow = OCA.Files.FileList.prototype._renderRow;
+ OCA.Files.FileList.prototype._renderRow = function(fileData) {
+ var $tr = oldRenderRow.apply(this, arguments);
+ // if the statuses are loaded already, use them for the icon
+ // (needed when scrolling to the next page)
+ var shareStatus = OC.Share.statuses[fileData.id];
+ if (fileData.shareOwner || fileData.recipientsDisplayName || shareStatus) {
+ var permissions = $tr.data('permissions');
+ var hasLink = !!(shareStatus && shareStatus.link);
+ if (permissions & OC.PERMISSION_SHARE) {
+ OC.Share.markFileAsShared($tr, true, hasLink);
+ } else {
+ // if no share action exists because the admin disabled sharing for this user
+ // we create a share notification action to inform the user about files
+ // shared with him otherwise we just update the existing share action.
+ // TODO: make this work like/with OC.Share.markFileAsShared()
+ var shareNotification = '<a class="action action-share-notification permanent"' +
+ ' data-action="Share-Notification" href="#" original-title="">' +
+ ' <img class="svg" src="' + OC.imagePath('core', 'actions/share') + '"></img>';
+ $tr.find('.fileactions').append(function() {
+ var shareBy = t('files_sharing', 'Shared by {owner}', {owner: fileData.shareOwner});
+ var $result = $(shareNotification + '<span> ' + shareBy + '</span></span>');
+ $result.on('click', function() {
+ return false;
+ });
+ return $result;
+ });
+ }
+ }
+ return $tr;
+ };
+ }
+
+ // use delegate to catch the case with multiple file lists
+ $('#content').delegate('#fileList', 'fileActionsReady',function(ev){
+ var fileList = ev.fileList;
+ if (!OCA.Sharing.sharesLoaded){
+ OC.Share.loadIcons('file', fileList);
+ // assume that we got all shares, so switching directories
+ // will not invalidate that list
+ OCA.Sharing.sharesLoaded = true;
+ }
+ else{
+ // this will update the icons for all the currently visible elements
+ // additionally added elements when scrolling down will be
+ // updated in the _renderRow override
+ OC.Share.updateIcons('file', fileList);
}
});
- if (!OCA.Sharing.sharesLoaded){
- OC.Share.loadIcons('file', fileList);
- // assume that we got all shares, so switching directories
- // will not invalidate that list
- OCA.Sharing.sharesLoaded = true;
- }
- else{
- OC.Share.updateIcons('file', fileList);
- }
- });
-
- OCA.Files.fileActions.register(
- 'all',
- 'Share',
- OC.PERMISSION_SHARE,
- OC.imagePath('core', 'actions/share'),
- function(filename, context) {
+ fileActions.register(
+ 'all',
+ 'Share',
+ OC.PERMISSION_SHARE,
+ OC.imagePath('core', 'actions/share'),
+ function(filename, context) {
- var $tr = context.$file;
- var itemType = 'file';
- if ($tr.data('type') === 'dir') {
- itemType = 'folder';
- }
- var possiblePermissions = $tr.data('reshare-permissions');
- if (_.isUndefined(possiblePermissions)) {
- possiblePermissions = $tr.data('permissions');
- }
+ var $tr = context.$file;
+ var itemType = 'file';
+ if ($tr.data('type') === 'dir') {
+ itemType = 'folder';
+ }
+ var possiblePermissions = $tr.data('reshare-permissions');
+ if (_.isUndefined(possiblePermissions)) {
+ possiblePermissions = $tr.data('permissions');
+ }
- var appendTo = $tr.find('td.filename');
- // Check if drop down is already visible for a different file
- if (OC.Share.droppedDown) {
- if ($tr.data('id') !== $('#dropdown').attr('data-item-source')) {
- OC.Share.hideDropDown(function () {
- $tr.addClass('mouseOver');
- OC.Share.showDropDown(itemType, $tr.data('id'), appendTo, true, possiblePermissions, filename);
- });
+ var appendTo = $tr.find('td.filename');
+ // Check if drop down is already visible for a different file
+ if (OC.Share.droppedDown) {
+ if ($tr.data('id') !== $('#dropdown').attr('data-item-source')) {
+ OC.Share.hideDropDown(function () {
+ $tr.addClass('mouseOver');
+ OC.Share.showDropDown(itemType, $tr.data('id'), appendTo, true, possiblePermissions, filename);
+ });
+ } else {
+ OC.Share.hideDropDown();
+ }
} else {
- OC.Share.hideDropDown();
+ $tr.addClass('mouseOver');
+ OC.Share.showDropDown(itemType, $tr.data('id'), appendTo, true, possiblePermissions, filename);
}
- } else {
- $tr.addClass('mouseOver');
- OC.Share.showDropDown(itemType, $tr.data('id'), appendTo, true, possiblePermissions, filename);
+ $('#dropdown').on('sharesChanged', function(ev) {
+ // files app current cannot show recipients on load, so we don't update the
+ // icon when changed for consistency
+ if (context.fileList.$el.closest('#app-content-files').length) {
+ return;
+ }
+ var recipients = _.pluck(ev.shares[OC.Share.SHARE_TYPE_USER], 'share_with_displayname');
+ var groupRecipients = _.pluck(ev.shares[OC.Share.SHARE_TYPE_GROUP], 'share_with_displayname');
+ recipients = recipients.concat(groupRecipients);
+ // note: we only update the data attribute because updateIcon()
+ // is called automatically after this event
+ if (recipients.length) {
+ $tr.attr('data-share-recipients', OCA.Sharing.Util.formatRecipients(recipients));
+ }
+ else {
+ $tr.removeAttr('data-share-recipients');
+ }
+ });
+ });
+ },
+
+ /**
+ * Formats a recipients array to be displayed.
+ * The first four recipients will be shown and the
+ * other ones will be shown as "+x" where "x" is the number of
+ * remaining recipients.
+ *
+ * @param recipients recipients array
+ * @param count optional total recipients count (in case the array was shortened)
+ * @return formatted recipients display text
+ */
+ formatRecipients: function(recipients, count) {
+ var maxRecipients = 4;
+ var text;
+ if (!_.isNumber(count)) {
+ count = recipients.length;
+ }
+ // TODO: use natural sort
+ recipients = _.first(recipients, maxRecipients).sort();
+ text = recipients.join(', ');
+ if (count > maxRecipients) {
+ text += ', +' + (count - maxRecipients);
}
- });
+ return text;
+ }
+ };
+})();
+
+$(document).ready(function() {
+ // FIXME: HACK: do not init when running unit tests, need a better way
+ if (!window.TESTING) {
+ if (!_.isUndefined(OC.Share) && !_.isUndefined(OCA.Files)) {
+ OCA.Sharing.Util.initialize(OCA.Files.fileActions);
+ }
}
});
+
diff --git a/apps/files_sharing/js/sharedfilelist.js b/apps/files_sharing/js/sharedfilelist.js
index ef1034ecfdc..97fabf87131 100644
--- a/apps/files_sharing/js/sharedfilelist.js
+++ b/apps/files_sharing/js/sharedfilelist.js
@@ -38,6 +38,13 @@
}
},
+ _renderRow: function() {
+ // HACK: needed to call the overridden _renderRow
+ // this is because at the time this class is created
+ // the overriding hasn't been done yet...
+ return OCA.Files.FileList.prototype._renderRow.apply(this, arguments);
+ },
+
_createRow: function(fileData) {
// TODO: hook earlier and render the whole row here
var $tr = OCA.Files.FileList.prototype._createRow.apply(this, arguments);
@@ -46,7 +53,7 @@
$tr.find('td.filename input:checkbox').remove();
$tr.attr('data-share-id', _.pluck(fileData.shares, 'id').join(','));
if (this._sharedWithUser) {
- $tr.attr('data-share-owner', fileData.shares[0].ownerDisplayName);
+ $tr.attr('data-share-owner', fileData.shareOwner);
}
return $tr;
},
@@ -159,7 +166,7 @@
stime: share.stime * 1000,
};
if (self._sharedWithUser) {
- file.share.ownerDisplayName = share.displayname_owner;
+ file.shareOwner = share.displayname_owner;
file.name = OC.basename(share.file_target);
file.path = OC.dirname(share.file_target);
file.permissions = share.permissions;
@@ -179,15 +186,15 @@
// inside the same file object (by file id).
.reduce(function(memo, file) {
var data = memo[file.id];
- var counterPart = file.share.ownerDisplayName || file.share.targetDisplayName;
+ var recipient = file.share.targetDisplayName;
if (!data) {
data = memo[file.id] = file;
data.shares = [file.share];
// using a hash to make them unique,
// this is only a list to be displayed
- data.counterParts = {};
+ data.recipients = {};
// counter is cheaper than calling _.keys().length
- data.counterPartsCount = 0;
+ data.recipientsCount = 0;
data.mtime = file.share.stime;
}
else {
@@ -198,12 +205,14 @@
data.shares.push(file.share);
}
- if (file.share.type === OC.Share.SHARE_TYPE_LINK) {
- data.hasLinkShare = true;
- } else if (counterPart && data.counterPartsCount < 10) {
+ if (recipient) {
// limit counterparts for output
- data.counterParts[counterPart] = true;
- data.counterPartsCount++;
+ if (data.recipientsCount < 4) {
+ // only store the first ones, they will be the only ones
+ // displayed
+ data.recipients[recipient] = true;
+ }
+ data.recipientsCount++;
}
delete file.share;
@@ -213,14 +222,14 @@
.values()
// Clean up
.each(function(data) {
- // convert the counterParts map to a flat
+ // convert the recipients map to a flat
// array of sorted names
- data.counterParts = _.chain(data.counterParts).keys().sort().value();
- if (data.hasLinkShare) {
- data.counterParts.unshift(t('files_sharing', 'link'));
- delete data.hasLinkShare;
- }
- delete data.counterPartsCount;
+ data.recipients = _.keys(data.recipients);
+ data.recipientsDisplayName = OCA.Sharing.Util.formatRecipients(
+ data.recipients,
+ data.recipientsCount
+ );
+ delete data.recipientsCount;
})
// Sort by expected sort comparator
.sortBy(this._sortComparator)
diff --git a/apps/files_sharing/l10n/ast.php b/apps/files_sharing/l10n/ast.php
index 1ea54279523..112f6de9e3d 100644
--- a/apps/files_sharing/l10n/ast.php
+++ b/apps/files_sharing/l10n/ast.php
@@ -1,5 +1,9 @@
<?php
$TRANSLATIONS = array(
+"Shared with you" => "Compartío contigo",
+"Shared with others" => "Compartío con otros",
+"No files have been shared with you yet." => "Entá nun se compartieron ficheros contigo.",
+"You haven't shared any files yet." => "Entá nun compartiesti dengún ficheru.",
"Shared by {owner}" => "Compartíu por {owner}",
"Shared by" => "Compartíu por",
"This share is password-protected" => "Esta compartición tien contraseña protexida",
diff --git a/apps/files_sharing/l10n/de.php b/apps/files_sharing/l10n/de.php
index d47a29d5790..dde53b44ac5 100644
--- a/apps/files_sharing/l10n/de.php
+++ b/apps/files_sharing/l10n/de.php
@@ -6,7 +6,6 @@ $TRANSLATIONS = array(
"You haven't shared any files yet." => "Du hast bis jetzt keine Dateien mit anderen geteilt.",
"Shared by {owner}" => "Geteilt von {owner}",
"Shared by" => "Geteilt von ",
-"link" => "Link",
"This share is password-protected" => "Diese Freigabe ist durch ein Passwort geschützt",
"The password is wrong. Try again." => "Bitte überprüfe Dein Passwort und versuche es erneut.",
"Password" => "Passwort",
diff --git a/apps/files_sharing/l10n/de_DE.php b/apps/files_sharing/l10n/de_DE.php
index b702ce1bec4..7b86917a7a0 100644
--- a/apps/files_sharing/l10n/de_DE.php
+++ b/apps/files_sharing/l10n/de_DE.php
@@ -6,7 +6,6 @@ $TRANSLATIONS = array(
"You haven't shared any files yet." => "Sie haben bis jetzt keine Dateien mit anderen geteilt.",
"Shared by {owner}" => "Geteilt von {owner}",
"Shared by" => "Geteilt von",
-"link" => "Link",
"This share is password-protected" => "Diese Freigabe ist durch ein Passwort geschützt",
"The password is wrong. Try again." => "Das Passwort ist falsch. Bitte versuchen Sie es erneut.",
"Password" => "Passwort",
diff --git a/apps/files_sharing/l10n/el.php b/apps/files_sharing/l10n/el.php
index abc23d460d4..ee95d3e255e 100644
--- a/apps/files_sharing/l10n/el.php
+++ b/apps/files_sharing/l10n/el.php
@@ -6,7 +6,6 @@ $TRANSLATIONS = array(
"You haven't shared any files yet." => "Δεν έχετε διαμοιραστεί κανένα αρχείο ακόμα.",
"Shared by {owner}" => "Διαμοιράστηκε από τον {owner}",
"Shared by" => "Διαμοιράστηκε από",
-"link" => "σύνδεσμος",
"This share is password-protected" => "Αυτός ο κοινόχρηστος φάκελος προστατεύεται με κωδικό",
"The password is wrong. Try again." => "Εσφαλμένος κωδικός πρόσβασης. Προσπαθήστε ξανά.",
"Password" => "Κωδικός πρόσβασης",
diff --git a/apps/files_sharing/l10n/en_GB.php b/apps/files_sharing/l10n/en_GB.php
index 966c6a5e814..96f4e34893b 100644
--- a/apps/files_sharing/l10n/en_GB.php
+++ b/apps/files_sharing/l10n/en_GB.php
@@ -6,7 +6,6 @@ $TRANSLATIONS = array(
"You haven't shared any files yet." => "You haven't shared any files yet.",
"Shared by {owner}" => "Shared by {owner}",
"Shared by" => "Shared by",
-"link" => "link",
"This share is password-protected" => "This share is password-protected",
"The password is wrong. Try again." => "The password is wrong. Try again.",
"Password" => "Password",
diff --git a/apps/files_sharing/l10n/es.php b/apps/files_sharing/l10n/es.php
index aecbe010ae3..dbe2a5fce83 100644
--- a/apps/files_sharing/l10n/es.php
+++ b/apps/files_sharing/l10n/es.php
@@ -6,7 +6,6 @@ $TRANSLATIONS = array(
"You haven't shared any files yet." => "Aún no has compartido ningún archivo.",
"Shared by {owner}" => "Compartido por {owner}",
"Shared by" => "Compartido por",
-"link" => "enlace",
"This share is password-protected" => "Este elemento compartido esta protegido por contraseña",
"The password is wrong. Try again." => "La contraseña introducida es errónea. Inténtelo de nuevo.",
"Password" => "Contraseña",
diff --git a/apps/files_sharing/l10n/fi_FI.php b/apps/files_sharing/l10n/fi_FI.php
index 1a79a2eb0a8..6c9b3e61476 100644
--- a/apps/files_sharing/l10n/fi_FI.php
+++ b/apps/files_sharing/l10n/fi_FI.php
@@ -6,7 +6,6 @@ $TRANSLATIONS = array(
"You haven't shared any files yet." => "Et ole jakanut yhtäkään tiedostoa vielä.",
"Shared by {owner}" => "Jakanut {owner}",
"Shared by" => "Jakanut",
-"link" => "linkki",
"This share is password-protected" => "Tämä jako on suojattu salasanalla",
"The password is wrong. Try again." => "Väärä salasana. Yritä uudelleen.",
"Password" => "Salasana",
diff --git a/apps/files_sharing/l10n/fr.php b/apps/files_sharing/l10n/fr.php
index 60fd05b2401..1a661225584 100644
--- a/apps/files_sharing/l10n/fr.php
+++ b/apps/files_sharing/l10n/fr.php
@@ -6,7 +6,6 @@ $TRANSLATIONS = array(
"You haven't shared any files yet." => "Vous ne partagez pas de fichier pour l'instant",
"Shared by {owner}" => "Partagé par {owner}",
"Shared by" => "Partagé par",
-"link" => "lien",
"This share is password-protected" => "Ce partage est protégé par un mot de passe",
"The password is wrong. Try again." => "Le mot de passe est incorrect. Veuillez réessayer.",
"Password" => "Mot de passe",
diff --git a/apps/files_sharing/l10n/gl.php b/apps/files_sharing/l10n/gl.php
index 3ebb8ccb932..aaebe2c0b7e 100644
--- a/apps/files_sharing/l10n/gl.php
+++ b/apps/files_sharing/l10n/gl.php
@@ -6,7 +6,6 @@ $TRANSLATIONS = array(
"You haven't shared any files yet." => "Aínda non compartiu ningún ficheiro.",
"Shared by {owner}" => "Compartido por {owner}",
"Shared by" => "Compartido por",
-"link" => "ligazón",
"This share is password-protected" => "Esta compartición está protexida con contrasinal",
"The password is wrong. Try again." => "O contrasinal é incorrecto. Ténteo de novo.",
"Password" => "Contrasinal",
diff --git a/apps/files_sharing/l10n/it.php b/apps/files_sharing/l10n/it.php
index 30d37b82848..f69b4d4468c 100644
--- a/apps/files_sharing/l10n/it.php
+++ b/apps/files_sharing/l10n/it.php
@@ -1,11 +1,16 @@
<?php
$TRANSLATIONS = array(
+"Shared with you" => "Condiviso con te",
+"Shared with others" => "Condiviso con altri",
+"No files have been shared with you yet." => "Non è stato ancora condiviso alcun file con te.",
+"You haven't shared any files yet." => "Non hai ancora condiviso alcun file.",
"Shared by {owner}" => "Condiviso da {owner}",
"Shared by" => "Condiviso da",
"This share is password-protected" => "Questa condivione è protetta da password",
"The password is wrong. Try again." => "La password è errata. Prova ancora.",
"Password" => "Password",
"Name" => "Nome",
+"Share time" => "Tempo di condivisione",
"Sorry, this link doesn’t seem to work anymore." => "Spiacenti, questo collegamento sembra non essere più attivo.",
"Reasons might be:" => "I motivi potrebbero essere:",
"the item was removed" => "l'elemento è stato rimosso",
diff --git a/apps/files_sharing/l10n/ja.php b/apps/files_sharing/l10n/ja.php
index 8bdca1ef249..0478202014e 100644
--- a/apps/files_sharing/l10n/ja.php
+++ b/apps/files_sharing/l10n/ja.php
@@ -6,7 +6,6 @@ $TRANSLATIONS = array(
"You haven't shared any files yet." => "まだ共有を行なっているファイルはありません。",
"Shared by {owner}" => "{owner} と共有中",
"Shared by" => "共有者:",
-"link" => "リンク",
"This share is password-protected" => "この共有はパスワードで保護されています",
"The password is wrong. Try again." => "パスワードが間違っています。再試行してください。",
"Password" => "パスワード",
diff --git a/apps/files_sharing/l10n/nb_NO.php b/apps/files_sharing/l10n/nb_NO.php
index b2d5b8d65be..3a30d8166b4 100644
--- a/apps/files_sharing/l10n/nb_NO.php
+++ b/apps/files_sharing/l10n/nb_NO.php
@@ -6,7 +6,6 @@ $TRANSLATIONS = array(
"You haven't shared any files yet." => "Du har ikke delt noen filer ennå.",
"Shared by {owner}" => "Delt av {owner}",
"Shared by" => "Delt av",
-"link" => "lenke",
"This share is password-protected" => "Denne delingen er passordbeskyttet",
"The password is wrong. Try again." => "Passordet er feil. Prøv på nytt.",
"Password" => "Passord",
diff --git a/apps/files_sharing/l10n/pl.php b/apps/files_sharing/l10n/pl.php
index ea691e33270..e319170fa9f 100644
--- a/apps/files_sharing/l10n/pl.php
+++ b/apps/files_sharing/l10n/pl.php
@@ -6,7 +6,6 @@ $TRANSLATIONS = array(
"You haven't shared any files yet." => "Nie współdzielisz jeszcze żadnych plików.",
"Shared by {owner}" => "Udostępnione przez {owner}",
"Shared by" => "Udostępniane przez",
-"link" => "link",
"This share is password-protected" => "Udział ten jest chroniony hasłem",
"The password is wrong. Try again." => "To hasło jest niewłaściwe. Spróbuj ponownie.",
"Password" => "Hasło",
diff --git a/apps/files_sharing/l10n/pt_BR.php b/apps/files_sharing/l10n/pt_BR.php
index eae8c6d720b..7dd503a5b9d 100644
--- a/apps/files_sharing/l10n/pt_BR.php
+++ b/apps/files_sharing/l10n/pt_BR.php
@@ -6,7 +6,6 @@ $TRANSLATIONS = array(
"You haven't shared any files yet." => "Você ainda não compartilhou nenhum arquivo.",
"Shared by {owner}" => "Compartilhado por {owner}",
"Shared by" => "Compartilhada por",
-"link" => "link",
"This share is password-protected" => "Este compartilhamento esta protegido por senha",
"The password is wrong. Try again." => "Senha incorreta. Tente novamente.",
"Password" => "Senha",
diff --git a/apps/files_sharing/l10n/pt_PT.php b/apps/files_sharing/l10n/pt_PT.php
index 561119dca96..03c57847d85 100644
--- a/apps/files_sharing/l10n/pt_PT.php
+++ b/apps/files_sharing/l10n/pt_PT.php
@@ -4,7 +4,6 @@ $TRANSLATIONS = array(
"Shared with others" => "Partilhado com outros",
"Shared by {owner}" => "Partilhado por {owner}",
"Shared by" => "Partilhado por",
-"link" => "ligação",
"This share is password-protected" => "Esta partilha está protegida por palavra-chave",
"The password is wrong. Try again." => "Password errada, por favor tente de novo",
"Password" => "Palavra-passe",
diff --git a/apps/files_sharing/l10n/sv.php b/apps/files_sharing/l10n/sv.php
index abf7780c242..e5fbd7a90af 100644
--- a/apps/files_sharing/l10n/sv.php
+++ b/apps/files_sharing/l10n/sv.php
@@ -6,7 +6,6 @@ $TRANSLATIONS = array(
"You haven't shared any files yet." => "Du har inte delat några filer ännu.",
"Shared by {owner}" => "Delad av {owner}",
"Shared by" => "Delad av",
-"link" => "länk",
"This share is password-protected" => "Den här delningen är lösenordsskyddad",
"The password is wrong. Try again." => "Lösenordet är fel. Försök igen.",
"Password" => "Lösenord",
diff --git a/apps/files_sharing/l10n/tr.php b/apps/files_sharing/l10n/tr.php
index d32cd07d0c5..061d2bb7b2e 100644
--- a/apps/files_sharing/l10n/tr.php
+++ b/apps/files_sharing/l10n/tr.php
@@ -6,7 +6,6 @@ $TRANSLATIONS = array(
"You haven't shared any files yet." => "Henüz hiçbir dosya paylaşmadınız.",
"Shared by {owner}" => "{owner} tarafından paylaşılmış",
"Shared by" => "Paylaşan",
-"link" => "bağlantı",
"This share is password-protected" => "Bu paylaşım parola korumalı",
"The password is wrong. Try again." => "Parola hatalı. Yeniden deneyin.",
"Password" => "Parola",
diff --git a/apps/files_sharing/lib/api.php b/apps/files_sharing/lib/api.php
index 4dddbec26b1..956a8774150 100644
--- a/apps/files_sharing/lib/api.php
+++ b/apps/files_sharing/lib/api.php
@@ -337,6 +337,7 @@ class Api {
return self::updatePublicUpload($share, $params);
}
} catch (\Exception $e) {
+
return new \OC_OCS_Result(null, 400, $e->getMessage());
}
diff --git a/apps/files_sharing/lib/connector/publicauth.php b/apps/files_sharing/lib/connector/publicauth.php
index 0831129ce79..ec7b68ba69c 100644
--- a/apps/files_sharing/lib/connector/publicauth.php
+++ b/apps/files_sharing/lib/connector/publicauth.php
@@ -9,7 +9,7 @@
namespace OCA\Files_Sharing\Connector;
-class PublicAuth extends \Sabre_DAV_Auth_Backend_AbstractBasic {
+class PublicAuth extends \Sabre\DAV\Auth\Backend\AbstractBasic {
/**
* @var \OCP\IConfig
diff --git a/apps/files_sharing/lib/mailtemplate.php b/apps/files_sharing/lib/mailtemplate.php
new file mode 100644
index 00000000000..ca1b0234ccf
--- /dev/null
+++ b/apps/files_sharing/lib/mailtemplate.php
@@ -0,0 +1,126 @@
+<?php
+
+namespace OCA\Files_Sharing;
+
+use \OCP\Files\NotPermittedException;
+use \OC\AppFramework\Middleware\Security\SecurityException;
+use OCA\Files_Sharing\Http\MailTemplateResponse;
+
+class MailTemplate extends \OC_Template {
+
+ private $path;
+ private $theme;
+ private $editableThemes;
+ private $editableTemplates;
+
+ public function __construct($theme, $path) {
+ $this->theme = $theme;
+ $this->path = $path;
+
+ //determine valid theme names
+ $this->editableThemes = self::getEditableThemes();
+ //for now hard code the valid mail template paths
+ $this->editableTemplates = self::getEditableTemplates();
+ }
+
+ /**
+ *
+ * @return \OCA\Files_Sharing\Http\MailTemplateResponse
+ */
+ public function getResponse() {
+ if($this->isEditable()) {
+ list($app, $filename) = explode('/templates/', $this->path, 2);
+ $name = substr($filename, 0, -4);
+ list($path, $template) = $this->findTemplate($this->theme, $app, $name, '');
+ return new MailTemplateResponse($template);
+ }
+ throw new SecurityException('Template not editable.', 403);
+ }
+
+ public function renderContent() {
+ if($this->isEditable()) {
+ list($app, $filename) = explode('/templates/', $this->path, 2);
+ $name = substr($filename, 0, -4);
+ list($path, $template) = $this->findTemplate($this->theme, $app, $name, '');
+ \OC_Response::sendFile($template);
+ } else {
+ throw new SecurityException('Template not editable.', 403);
+ }
+ }
+
+ public function isEditable() {
+ if ($this->editableThemes[$this->theme]
+ && $this->editableTemplates[$this->path]
+ ) {
+ return true;
+ }
+ return false;
+ }
+
+ public function setContent($data) {
+ if($this->isEditable()) {
+ //save default templates in default folder to overwrite core template
+ $absolutePath = \OC::$SERVERROOT.'/themes/'.$this->theme.'/'.$this->path;
+ $parent = dirname($absolutePath);
+ if ( ! is_dir($parent) ) {
+ if ( ! mkdir(dirname($absolutePath), 0777, true) ){
+ throw new \Exception('Could not create directory.', 500);
+ }
+ }
+ if ( $this->theme !== 'default' && is_file($absolutePath) ) {
+ if ( ! copy($absolutePath, $absolutePath.'.bak') ){
+ throw new \Exception('Could not overwrite template.', 500);
+ }
+ }
+ //overwrite theme templates? versioning?
+ return file_put_contents($absolutePath, $data);
+ }
+ throw new SecurityException('Template not editable.', 403);
+ }
+
+ public function reset(){
+ if($this->isEditable()) {
+ $absolutePath = \OC::$SERVERROOT.'/themes/'.$this->theme.'/'.$this->path;
+ if ($this->theme === 'default') {
+ //templates can simply be deleted in the themes folder
+ if (unlink($absolutePath)) {
+ return true;
+ }
+ } else {
+ //if a bak file exists overwrite the template with it
+ if (is_file($absolutePath.'.bak')) {
+ if (rename($absolutePath.'.bak', $absolutePath)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+ throw new NotPermittedException('Template not editable.', 403);
+ }
+
+ public static function getEditableThemes() {
+ $themes = array(
+ 'default' => true
+ );
+ if ($handle = opendir(\OC::$SERVERROOT.'/themes')) {
+ while (false !== ($entry = readdir($handle))) {
+ if ($entry != '.' && $entry != '..' && $entry != 'default') {
+ if (is_dir(\OC::$SERVERROOT.'/themes/'.$entry)) {
+ $themes[$entry] = true;
+ }
+ }
+ }
+ closedir($handle);
+ }
+ return $themes;
+ }
+
+ public static function getEditableTemplates() {
+ return array(
+ 'core/templates/mail.php' => true,
+ 'core/templates/altmail.php' => true,
+ 'core/lostpassword/templates/email.php' => true,
+ );
+ }
+}
diff --git a/apps/files_sharing/publicwebdav.php b/apps/files_sharing/publicwebdav.php
index 954c3a3144d..df2c04cf45c 100644
--- a/apps/files_sharing/publicwebdav.php
+++ b/apps/files_sharing/publicwebdav.php
@@ -26,9 +26,9 @@ $server->setBaseUri($baseuri);
// Load plugins
$defaults = new OC_Defaults();
-$server->addPlugin(new Sabre_DAV_Auth_Plugin($authBackend, $defaults->getName()));
-$server->addPlugin(new Sabre_DAV_Locks_Plugin($lockBackend));
-$server->addPlugin(new Sabre_DAV_Browser_Plugin(false)); // Show something in the Browser, but no upload
+$server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend, $defaults->getName()));
+$server->addPlugin(new \Sabre\DAV\Locks\Plugin($lockBackend));
+$server->addPlugin(new \Sabre\DAV\Browser\Plugin(false)); // Show something in the Browser, but no upload
$server->addPlugin(new OC_Connector_Sabre_FilesPlugin());
$server->addPlugin(new OC_Connector_Sabre_MaintenancePlugin());
$server->addPlugin(new OC_Connector_Sabre_ExceptionLoggerPlugin('webdav'));
diff --git a/apps/files_sharing/settings-admin.php b/apps/files_sharing/settings-admin.php
new file mode 100644
index 00000000000..8f15e272312
--- /dev/null
+++ b/apps/files_sharing/settings-admin.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Copyright (c) 2011 Robin Appelman <icewind@owncloud.com>
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+
+\OC_Util::checkAdminUser();
+
+\OCP\Util::addStyle('files_sharing', 'settings-admin');
+\OCP\Util::addScript('files_sharing', 'settings-admin');
+
+$themes = \OCA\Files_Sharing\MailTemplate::getEditableThemes();
+$editableTemplates = \OCA\Files_Sharing\MailTemplate::getEditableTemplates();
+
+$tmpl = new OCP\Template('files_sharing', 'settings-admin');
+$tmpl->assign('themes', $themes);
+$tmpl->assign('editableTemplates', $editableTemplates);
+
+return $tmpl->fetchPage();
diff --git a/apps/files_sharing/templates/settings-admin.php b/apps/files_sharing/templates/settings-admin.php
new file mode 100644
index 00000000000..4021be871cd
--- /dev/null
+++ b/apps/files_sharing/templates/settings-admin.php
@@ -0,0 +1,41 @@
+<div class="section" id="mailTemplateSettings" >
+
+ <h2><?php p($l->t('Mail templates'));?></h2>
+
+ <div class="actions">
+
+ <div>
+ <label for="mts-theme"><?php p($l->t('Theme'));?></label>
+ <select id="mts-theme">
+ <?php foreach($_['themes'] as $theme => $editable): ?>
+ <option><?php p($theme); ?></option>
+ <?php endforeach; ?>
+ </select>
+ </div>
+
+ <div>
+ <label for="mts-template"><?php p($l->t('Template'));?></label>
+ <select id="mts-template">
+ <?php foreach($_['editableTemplates'] as $template => $editable): ?>
+ <option><?php p($template); ?></option>
+ <?php endforeach; ?>
+ </select>
+ </div>
+
+ </div>
+
+ <div class="templateEditor">
+ <textarea></textarea>
+ </div>
+
+ <div class="actions">
+
+ <button class="reset"><?php p($l->t('Reset'));?></button>
+
+ <button class="save"><?php p($l->t('Save'));?></button>
+
+ <span id="mts-msg" class="msg"></span>
+
+ </div>
+
+</div>
diff --git a/apps/files_sharing/tests/js/appSpec.js b/apps/files_sharing/tests/js/appSpec.js
index 3a1b495a16b..9c46b7caf1b 100644
--- a/apps/files_sharing/tests/js/appSpec.js
+++ b/apps/files_sharing/tests/js/appSpec.js
@@ -122,9 +122,7 @@ describe('OCA.Sharing.App tests', function() {
type: 'dir',
path: '/somewhere/inside/subdir',
counterParts: ['user2'],
- shares: [{
- ownerDisplayName: 'user2'
- }]
+ shareOwner: 'user2'
}]);
fileListIn.findFileEl('testdir').find('td a.name').click();
diff --git a/apps/files_sharing/tests/js/shareSpec.js b/apps/files_sharing/tests/js/shareSpec.js
new file mode 100644
index 00000000000..455addaccc0
--- /dev/null
+++ b/apps/files_sharing/tests/js/shareSpec.js
@@ -0,0 +1,450 @@
+/*
+ * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>
+ *
+ * This file is licensed under the Affero General Public License version 3
+ * or later.
+ *
+ * See the COPYING-README file.
+ *
+ */
+
+describe('OCA.Sharing.Util tests', function() {
+ var oldFileListPrototype;
+ var fileList;
+ var testFiles;
+
+ function getImageUrl($el) {
+ // might be slightly different cross-browser
+ var url = $el.css('background-image');
+ var r = url.match(/url\(['"]?([^'")]*)['"]?\)/);
+ if (!r) {
+ return url;
+ }
+ return r[1];
+ }
+
+ beforeEach(function() {
+ // back up prototype, as it will be extended by
+ // the sharing code
+ oldFileListPrototype = _.extend({}, OCA.Files.FileList.prototype);
+
+ var $content = $('<div id="content"></div>');
+ $('#testArea').append($content);
+ // dummy file list
+ var $div = $(
+ '<div>' +
+ '<table id="filestable">' +
+ '<thead></thead>' +
+ '<tbody id="fileList"></tbody>' +
+ '</table>' +
+ '</div>');
+ $('#content').append($div);
+
+ var fileActions = new OCA.Files.FileActions();
+ OCA.Sharing.Util.initialize(fileActions);
+ fileList = new OCA.Files.FileList(
+ $div, {
+ fileActions : fileActions
+ }
+ );
+
+ testFiles = [{
+ id: 1,
+ type: 'file',
+ name: 'One.txt',
+ path: '/subdir',
+ mimetype: 'text/plain',
+ size: 12,
+ permissions: OC.PERMISSION_ALL,
+ etag: 'abc',
+ shareOwner: 'User One',
+ isShareMountPoint: false
+ }];
+
+ OCA.Sharing.sharesLoaded = true;
+ OC.Share.statuses = {
+ 1: {link: false, path: '/subdir'}
+ };
+ });
+ afterEach(function() {
+ OCA.Files.FileList.prototype = oldFileListPrototype;
+ delete OCA.Sharing.sharesLoaded;
+ delete OC.Share.droppedDown;
+ OC.Share.statuses = {};
+ OC.Share.currentShares = {};
+ });
+
+ describe('Sharing data in table row', function() {
+ // TODO: test data-permissions, data-share-owner, etc
+ });
+ describe('Share action icon', function() {
+ it('do not shows share text when not shared', function() {
+ var $action, $tr;
+ OC.Share.statuses = {};
+ fileList.setFiles([{
+ id: 1,
+ type: 'dir',
+ name: 'One',
+ path: '/subdir',
+ mimetype: 'text/plain',
+ size: 12,
+ permissions: OC.PERMISSION_ALL,
+ etag: 'abc'
+ }]);
+ $tr = fileList.$el.find('tbody tr:first');
+ $action = $tr.find('.action-share');
+ expect($action.hasClass('permanent')).toEqual(false);
+ expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg');
+ expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder.svg');
+ expect($action.find('img').length).toEqual(1);
+ });
+ it('shows simple share text with share icon', function() {
+ var $action, $tr;
+ fileList.setFiles([{
+ id: 1,
+ type: 'dir',
+ name: 'One',
+ path: '/subdir',
+ mimetype: 'text/plain',
+ size: 12,
+ permissions: OC.PERMISSION_ALL,
+ etag: 'abc'
+ }]);
+ $tr = fileList.$el.find('tbody tr:first');
+ $action = $tr.find('.action-share');
+ expect($action.hasClass('permanent')).toEqual(true);
+ expect($action.find('>span').text()).toEqual('Shared');
+ expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg');
+ expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder-shared.svg');
+ expect($action.find('img').length).toEqual(1);
+ });
+ it('shows simple share text with public icon when shared with link', function() {
+ var $action, $tr;
+ OC.Share.statuses = {1: {link: true, path: '/subdir'}};
+ fileList.setFiles([{
+ id: 1,
+ type: 'dir',
+ name: 'One',
+ path: '/subdir',
+ mimetype: 'text/plain',
+ size: 12,
+ permissions: OC.PERMISSION_ALL,
+ etag: 'abc'
+ }]);
+ $tr = fileList.$el.find('tbody tr:first');
+ $action = $tr.find('.action-share');
+ expect($action.hasClass('permanent')).toEqual(true);
+ expect($action.find('>span').text()).toEqual('Shared');
+ expect(OC.basename($action.find('img').attr('src'))).toEqual('public.svg');
+ expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder-public.svg');
+ expect($action.find('img').length).toEqual(1);
+ });
+ it('shows owner name when owner is available', function() {
+ var $action, $tr;
+ fileList.setFiles([{
+ id: 1,
+ type: 'dir',
+ name: 'One.txt',
+ path: '/subdir',
+ mimetype: 'text/plain',
+ size: 12,
+ permissions: OC.PERMISSION_ALL,
+ shareOwner: 'User One',
+ etag: 'abc'
+ }]);
+ $tr = fileList.$el.find('tbody tr:first');
+ $action = $tr.find('.action-share');
+ expect($action.hasClass('permanent')).toEqual(true);
+ expect($action.find('>span').text()).toEqual('Shared by User One');
+ expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg');
+ expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder-shared.svg');
+ });
+ it('shows recipients when recipients are available', function() {
+ var $action, $tr;
+ fileList.setFiles([{
+ id: 1,
+ type: 'dir',
+ name: 'One.txt',
+ path: '/subdir',
+ mimetype: 'text/plain',
+ size: 12,
+ permissions: OC.PERMISSION_ALL,
+ recipientsDisplayName: 'User One, User Two',
+ etag: 'abc'
+ }]);
+ $tr = fileList.$el.find('tbody tr:first');
+ $action = $tr.find('.action-share');
+ expect($action.hasClass('permanent')).toEqual(true);
+ expect($action.find('>span').text()).toEqual('Shared with User One, User Two');
+ expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg');
+ expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder-shared.svg');
+ expect($action.find('img').length).toEqual(1);
+ });
+ it('shows static share text when file shared with user that has no share permission', function() {
+ var $action, $tr;
+ fileList.setFiles([{
+ id: 1,
+ type: 'dir',
+ name: 'One',
+ path: '/subdir',
+ mimetype: 'text/plain',
+ size: 12,
+ permissions: OC.PERMISSION_CREATE,
+ etag: 'abc',
+ shareOwner: 'User One'
+ }]);
+ $tr = fileList.$el.find('tbody tr:first');
+ expect($tr.find('.action-share').length).toEqual(0);
+ $action = $tr.find('.action-share-notification');
+ expect($action.hasClass('permanent')).toEqual(true);
+ expect($action.find('>span').text().trim()).toEqual('Shared by User One');
+ expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg');
+ expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder-shared.svg');
+ expect($action.find('img').length).toEqual(1);
+ });
+ });
+ describe('Share action', function() {
+ var showDropDownStub;
+
+ function makeDummyShareItem(displayName) {
+ return {
+ share_with_displayname: displayName
+ };
+ }
+
+ beforeEach(function() {
+ showDropDownStub = sinon.stub(OC.Share, 'showDropDown', function() {
+ $('#testArea').append($('<div id="dropdown"></div>'));
+ });
+ });
+ afterEach(function() {
+ showDropDownStub.restore();
+ });
+ it('adds share icon after sharing a non-shared file', function() {
+ var $action, $tr;
+ OC.Share.statuses = {};
+ fileList.setFiles([{
+ id: 1,
+ type: 'file',
+ name: 'One.txt',
+ path: '/subdir',
+ mimetype: 'text/plain',
+ size: 12,
+ permissions: OC.PERMISSION_ALL,
+ etag: 'abc'
+ }]);
+ $action = fileList.$el.find('tbody tr:first .action-share');
+ $tr = fileList.$el.find('tr:first');
+
+ expect($action.hasClass('permanent')).toEqual(false);
+
+ $tr.find('.action-share').click();
+
+ expect(showDropDownStub.calledOnce).toEqual(true);
+
+ // simulate what the dropdown does
+ var shares = {};
+ OC.Share.itemShares[OC.Share.SHARE_TYPE_USER] = ['user1', 'user2'];
+ OC.Share.itemShares[OC.Share.SHARE_TYPE_GROUP] = ['group1', 'group2'];
+ shares[OC.Share.SHARE_TYPE_USER] = _.map(['User One', 'User Two'], makeDummyShareItem);
+ shares[OC.Share.SHARE_TYPE_GROUP] = _.map(['Group One', 'Group Two'], makeDummyShareItem);
+ $('#dropdown').trigger(new $.Event('sharesChanged', {shares: shares}));
+
+ expect($tr.attr('data-share-recipients')).toEqual('Group One, Group Two, User One, User Two');
+
+ OC.Share.updateIcon('file', 1);
+ expect($action.hasClass('permanent')).toEqual(true);
+ expect($action.find('>span').text()).toEqual('Shared with Group One, Group Two, User One, User Two');
+ expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg');
+ });
+ it('updates share icon after updating shares of a file', function() {
+ var $action, $tr;
+ OC.Share.statuses = {1: {link: false, path: '/subdir'}};
+ fileList.setFiles([{
+ id: 1,
+ type: 'file',
+ name: 'One.txt',
+ path: '/subdir',
+ mimetype: 'text/plain',
+ size: 12,
+ permissions: OC.PERMISSION_ALL,
+ etag: 'abc'
+ }]);
+ $action = fileList.$el.find('tbody tr:first .action-share');
+ $tr = fileList.$el.find('tr:first');
+
+ expect($action.hasClass('permanent')).toEqual(true);
+
+ $tr.find('.action-share').click();
+
+ expect(showDropDownStub.calledOnce).toEqual(true);
+
+ // simulate what the dropdown does
+ var shares = {};
+ OC.Share.itemShares[OC.Share.SHARE_TYPE_USER] = ['user1', 'user2', 'user3'];
+ shares[OC.Share.SHARE_TYPE_USER] = _.map(['User One', 'User Two', 'User Three'], makeDummyShareItem);
+ $('#dropdown').trigger(new $.Event('sharesChanged', {shares: shares}));
+
+ expect($tr.attr('data-share-recipients')).toEqual('User One, User Three, User Two');
+
+ OC.Share.updateIcon('file', 1);
+
+ expect($action.hasClass('permanent')).toEqual(true);
+ expect($action.find('>span').text()).toEqual('Shared with User One, User Three, User Two');
+ expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg');
+ });
+ it('removes share icon after removing all shares from a file', function() {
+ var $action, $tr;
+ OC.Share.statuses = {1: {link: false, path: '/subdir'}};
+ fileList.setFiles([{
+ id: 1,
+ type: 'file',
+ name: 'One.txt',
+ path: '/subdir',
+ mimetype: 'text/plain',
+ size: 12,
+ permissions: OC.PERMISSION_ALL,
+ etag: 'abc',
+ recipients: 'User One, User Two'
+ }]);
+ $action = fileList.$el.find('tbody tr:first .action-share');
+ $tr = fileList.$el.find('tr:first');
+
+ expect($action.hasClass('permanent')).toEqual(true);
+
+ $tr.find('.action-share').click();
+
+ expect(showDropDownStub.calledOnce).toEqual(true);
+
+ // simulate what the dropdown does
+ OC.Share.itemShares = {};
+ $('#dropdown').trigger(new $.Event('sharesChanged', {shares: {}}));
+
+ expect($tr.attr('data-share-recipients')).not.toBeDefined();
+
+ OC.Share.updateIcon('file', 1);
+ expect($action.hasClass('permanent')).toEqual(false);
+ });
+ it('keep share text after updating reshare', function() {
+ var $action, $tr;
+ OC.Share.statuses = {1: {link: false, path: '/subdir'}};
+ fileList.setFiles([{
+ id: 1,
+ type: 'file',
+ name: 'One.txt',
+ path: '/subdir',
+ mimetype: 'text/plain',
+ size: 12,
+ permissions: OC.PERMISSION_ALL,
+ etag: 'abc',
+ shareOwner: 'User One'
+ }]);
+ $action = fileList.$el.find('tbody tr:first .action-share');
+ $tr = fileList.$el.find('tr:first');
+
+ expect($action.hasClass('permanent')).toEqual(true);
+
+ $tr.find('.action-share').click();
+
+ expect(showDropDownStub.calledOnce).toEqual(true);
+
+ // simulate what the dropdown does
+ var shares = {};
+ OC.Share.itemShares[OC.Share.SHARE_TYPE_USER] = ['user2'];
+ shares[OC.Share.SHARE_TYPE_USER] = _.map(['User Two'], makeDummyShareItem);
+ $('#dropdown').trigger(new $.Event('sharesChanged', {shares: shares}));
+
+ expect($tr.attr('data-share-recipients')).toEqual('User Two');
+
+ OC.Share.updateIcon('file', 1);
+
+ expect($action.hasClass('permanent')).toEqual(true);
+ expect($action.find('>span').text()).toEqual('Shared by User One');
+ expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg');
+ });
+ it('keep share text after unsharing reshare', function() {
+ var $action, $tr;
+ OC.Share.statuses = {1: {link: false, path: '/subdir'}};
+ fileList.setFiles([{
+ id: 1,
+ type: 'file',
+ name: 'One.txt',
+ path: '/subdir',
+ mimetype: 'text/plain',
+ size: 12,
+ permissions: OC.PERMISSION_ALL,
+ etag: 'abc',
+ shareOwner: 'User One',
+ recipients: 'User Two'
+ }]);
+ $action = fileList.$el.find('tbody tr:first .action-share');
+ $tr = fileList.$el.find('tr:first');
+
+ expect($action.hasClass('permanent')).toEqual(true);
+
+ $tr.find('.action-share').click();
+
+ expect(showDropDownStub.calledOnce).toEqual(true);
+
+ // simulate what the dropdown does
+ OC.Share.itemShares = {};
+ $('#dropdown').trigger(new $.Event('sharesChanged', {shares: {}}));
+
+ expect($tr.attr('data-share-recipients')).not.toBeDefined();
+
+ OC.Share.updateIcon('file', 1);
+
+ expect($action.hasClass('permanent')).toEqual(true);
+ expect($action.find('>span').text()).toEqual('Shared by User One');
+ expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg');
+ });
+ });
+ describe('formatRecipients', function() {
+ it('returns a single recipient when one passed', function() {
+ expect(OCA.Sharing.Util.formatRecipients(['User one']))
+ .toEqual('User one');
+ });
+ it('returns two recipients when two passed', function() {
+ expect(OCA.Sharing.Util.formatRecipients(['User one', 'User two']))
+ .toEqual('User one, User two');
+ });
+ it('returns four recipients with plus when five passed', function() {
+ var recipients = [
+ 'User one',
+ 'User two',
+ 'User three',
+ 'User four',
+ 'User five'
+ ];
+ expect(OCA.Sharing.Util.formatRecipients(recipients))
+ .toEqual('User four, User one, User three, User two, +1');
+ });
+ it('returns four recipients with plus when ten passed', function() {
+ var recipients = [
+ 'User one',
+ 'User two',
+ 'User three',
+ 'User four',
+ 'User five',
+ 'User six',
+ 'User seven',
+ 'User eight',
+ 'User nine',
+ 'User ten'
+ ];
+ expect(OCA.Sharing.Util.formatRecipients(recipients))
+ .toEqual('User four, User one, User three, User two, +6');
+ });
+ it('returns four recipients with plus when four passed with counter', function() {
+ var recipients = [
+ 'User one',
+ 'User two',
+ 'User three',
+ 'User four'
+ ];
+ expect(OCA.Sharing.Util.formatRecipients(recipients, 10))
+ .toEqual('User four, User one, User three, User two, +6');
+ });
+ });
+
+});
diff --git a/apps/files_sharing/tests/js/sharedfilelistSpec.js b/apps/files_sharing/tests/js/sharedfilelistSpec.js
index 7aec8322a44..f53e79e277f 100644
--- a/apps/files_sharing/tests/js/sharedfilelistSpec.js
+++ b/apps/files_sharing/tests/js/sharedfilelistSpec.js
@@ -9,7 +9,8 @@
*/
describe('OCA.Sharing.FileList tests', function() {
- var testFiles, alertStub, notificationStub, fileList;
+ var testFiles, alertStub, notificationStub, fileList, fileActions;
+ var oldFileListPrototype;
beforeEach(function() {
alertStub = sinon.stub(OC.dialogs, 'alert');
@@ -45,10 +46,17 @@ describe('OCA.Sharing.FileList tests', function() {
'<div id="emptycontent">Empty content message</div>' +
'</div>'
);
+ // back up prototype, as it will be extended by
+ // the sharing code
+ oldFileListPrototype = _.extend({}, OCA.Files.FileList.prototype);
+ fileActions = new OCA.Files.FileActions();
+ OCA.Sharing.Util.initialize(fileActions);
});
afterEach(function() {
+ OCA.Files.FileList.prototype = oldFileListPrototype;
testFiles = undefined;
fileList = undefined;
+ fileActions = undefined;
notificationStub.restore();
alertStub.restore();
diff --git a/apps/files_trashbin/appinfo/update.php b/apps/files_trashbin/appinfo/update.php
index ca7b87a8681..191d3cf25d9 100644
--- a/apps/files_trashbin/appinfo/update.php
+++ b/apps/files_trashbin/appinfo/update.php
@@ -5,6 +5,5 @@ $installedVersion=OCP\Config::getAppValue('files_trashbin', 'installed_version')
if (version_compare($installedVersion, '0.6', '<')) {
//size of the trash bin could be incorrect, remove it for all users to
//enforce a recalculation during next usage.
- $query = \OC_DB::prepare('DELETE FROM `*PREFIX*files_trashsize`');
- $result = $query->execute();
+ \OC_DB::dropTable('files_trashsize');
}
diff --git a/apps/files_trashbin/lib/trashbin.php b/apps/files_trashbin/lib/trashbin.php
index fb23b516208..a8e66b06bbd 100644
--- a/apps/files_trashbin/lib/trashbin.php
+++ b/apps/files_trashbin/lib/trashbin.php
@@ -905,12 +905,12 @@ class Trashbin {
* get current size of trash bin from a given user
*
* @param string $user user who owns the trash bin
- * @return mixed trash bin size or false if no trash bin size is stored
+ * @return integer trash bin size
*/
private static function getTrashbinSize($user) {
$view = new \OC\Files\View('/' . $user);
$fileInfo = $view->getFileInfo('/files_trashbin');
- return $fileInfo['size'];
+ return isset($fileInfo['size']) ? $fileInfo['size'] : 0;
}
/**
diff --git a/apps/files_versions/appinfo/database.xml b/apps/files_versions/appinfo/database.xml
deleted file mode 100644
index d3854776980..00000000000
--- a/apps/files_versions/appinfo/database.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<database>
-
- <name>*dbname*</name>
- <create>true</create>
- <overwrite>false</overwrite>
-
- <charset>utf8</charset>
-
- <table>
-
- <name>*dbprefix*files_versions</name>
-
- <declaration>
-
- <field>
- <name>user</name>
- <type>text</type>
- <default></default>
- <notnull>true</notnull>
- <length>64</length>
- </field>
- <field>
- <name>size</name>
- <type>text</type>
- <default></default>
- <notnull>true</notnull>
- <length>50</length>
- </field>
-
- </declaration>
-
- </table>
-
-</database>
diff --git a/apps/files_versions/appinfo/update.php b/apps/files_versions/appinfo/update.php
index 52a4850758a..fdc6b1e5f1b 100644
--- a/apps/files_versions/appinfo/update.php
+++ b/apps/files_versions/appinfo/update.php
@@ -2,14 +2,6 @@
$installedVersion=OCP\Config::getAppValue('files_versions', 'installed_version');
// move versions to new directory
-if (version_compare($installedVersion, '1.0.2', '<')) {
- $users = \OCP\User::getUsers();
- $datadir = \OCP\Config::getSystemValue('datadirectory').'/';
- foreach ($users as $user) {
- $oldPath = $datadir.$user.'/versions';
- $newPath = $datadir.$user.'/files_versions';
- if(is_dir($oldPath)) {
- rename($oldPath, $newPath);
- }
- }
+if (version_compare($installedVersion, '1.0.4', '<')) {
+ \OC_DB::dropTable("files_versions");
}
diff --git a/apps/files_versions/appinfo/version b/apps/files_versions/appinfo/version
index e4c0d46e55f..ee90284c27f 100644
--- a/apps/files_versions/appinfo/version
+++ b/apps/files_versions/appinfo/version
@@ -1 +1 @@
-1.0.3 \ No newline at end of file
+1.0.4
diff --git a/apps/files_versions/lib/versions.php b/apps/files_versions/lib/versions.php
index 56e1dfc2e24..15d0e032ea0 100644
--- a/apps/files_versions/lib/versions.php
+++ b/apps/files_versions/lib/versions.php
@@ -54,31 +54,12 @@ class Storage {
* get current size of all versions from a given user
*
* @param string $user user who owns the versions
- * @return mixed versions size or false if no versions size is stored
+ * @return int versions size
*/
private static function getVersionsSize($user) {
- $query = \OC_DB::prepare('SELECT `size` FROM `*PREFIX*files_versions` WHERE `user`=?');
- $result = $query->execute(array($user))->fetchAll();
-
- if ($result) {
- return $result[0]['size'];
- }
- return false;
- }
-
- /**
- * write to the database how much space is in use for versions
- *
- * @param string $user owner of the versions
- * @param int $size size of the versions
- */
- private static function setVersionsSize($user, $size) {
- if ( self::getVersionsSize($user) === false) {
- $query = \OC_DB::prepare('INSERT INTO `*PREFIX*files_versions` (`size`, `user`) VALUES (?, ?)');
- }else {
- $query = \OC_DB::prepare('UPDATE `*PREFIX*files_versions` SET `size`=? WHERE `user`=?');
- }
- $query->execute(array($size, $user));
+ $view = new \OC\Files\View('/' . $user);
+ $fileInfo = $view->getFileInfo('/files_versions');
+ return isset($fileInfo['size']) ? $fileInfo['size'] : 0;
}
/**
@@ -115,16 +96,13 @@ class Storage {
self::createMissingDirectories($filename, $users_view);
$versionsSize = self::getVersionsSize($uid);
- if ( $versionsSize === false || $versionsSize < 0 ) {
- $versionsSize = self::calculateSize($uid);
- }
// assumption: we need filesize($filename) for the new version +
// some more free space for the modified file which might be
// 1.5 times as large as the current version -> 2.5
$neededSpace = $files_view->filesize($filename) * 2.5;
- $versionsSize = self::expire($filename, $versionsSize, $neededSpace);
+ self::expire($filename, $versionsSize, $neededSpace);
// disable proxy to prevent multiple fopen calls
$proxyStatus = \OC_FileProxy::$enabled;
@@ -138,10 +116,6 @@ class Storage {
// reset proxy state
\OC_FileProxy::$enabled = $proxyStatus;
-
- $versionsSize += $users_view->filesize('files'.$filename);
-
- self::setVersionsSize($uid, $versionsSize);
}
}
@@ -173,17 +147,11 @@ class Storage {
$abs_path = $versions_fileview->getLocalFile($filename . '.v');
$versions = self::getVersions($uid, $filename);
if (!empty($versions)) {
- $versionsSize = self::getVersionsSize($uid);
- if ($versionsSize === false || $versionsSize < 0) {
- $versionsSize = self::calculateSize($uid);
- }
foreach ($versions as $v) {
\OC_Hook::emit('\OCP\Versions', 'preDelete', array('path' => $abs_path . $v['version']));
unlink($abs_path . $v['version']);
\OC_Hook::emit('\OCP\Versions', 'delete', array('path' => $abs_path . $v['version']));
- $versionsSize -= $v['size'];
}
- self::setVersionsSize($uid, $versionsSize);
}
}
unset(self::$deletedFiles[$path]);
@@ -345,33 +313,6 @@ class Storage {
}
/**
- * get the size of all stored versions from a given user
- * @param string $uid id from the user
- * @return int size of versions
- */
- private static function calculateSize($uid) {
- if (\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED) == 'true') {
- $view = new \OC\Files\View('/' . $uid . '/files_versions');
-
- $size = 0;
-
- $dirContent = $view->getDirectoryContent('/');
-
- while (!empty($dirContent)) {
- $path = reset($dirContent);
- if ($path['type'] === 'dir') {
- $dirContent = array_merge($dirContent, $view->getDirectoryContent(substr($path['path'], strlen('files_versions'))));
- } else {
- $size += $view->filesize(substr($path['path'], strlen('files_versions')));
- }
- unset($dirContent[key($dirContent)]);
- }
-
- return $size;
- }
- }
-
- /**
* returns all stored file versions from a given user
* @param string $uid id of the user
* @return array with contains two arrays 'all' which contains all versions sorted by age and 'by_file' which contains all versions sorted by filename
@@ -500,9 +441,6 @@ class Storage {
// make sure that we have the current size of the version history
if ( $versionsSize === null ) {
$versionsSize = self::getVersionsSize($uid);
- if ( $versionsSize === false || $versionsSize < 0 ) {
- $versionsSize = self::calculateSize($uid);
- }
}
// calculate available space for version history
diff --git a/apps/user_ldap/l10n/ast.php b/apps/user_ldap/l10n/ast.php
index 620454a9561..bdb11a457e8 100644
--- a/apps/user_ldap/l10n/ast.php
+++ b/apps/user_ldap/l10n/ast.php
@@ -19,6 +19,7 @@ $TRANSLATIONS = array(
"Select attributes" => "Esbillar atributos",
"Connection test succeeded" => "Test de conexón esitosu",
"Connection test failed" => "Falló'l test de conexón",
+"Confirm Deletion" => "Confirmar desaniciu",
"_%s group found_::_%s groups found_" => array("%s grupu alcontráu","%s grupos alcontraos"),
"_%s user found_::_%s users found_" => array("%s usuariu alcontráu","%s usuarios alcontraos"),
"Could not find the desired feature" => "Nun pudo alcontrase la carauterística deseyada",
diff --git a/apps/user_ldap/l10n/de.php b/apps/user_ldap/l10n/de.php
index a9f554535d1..26562b91c67 100644
--- a/apps/user_ldap/l10n/de.php
+++ b/apps/user_ldap/l10n/de.php
@@ -12,6 +12,7 @@ $TRANSLATIONS = array(
"Deletion failed" => "Löschen fehlgeschlagen",
"Take over settings from recent server configuration?" => "Einstellungen von letzter Konfiguration übernehmen?",
"Keep settings?" => "Einstellungen beibehalten?",
+"{nthServer}. Server" => "{nthServer}. - Server",
"Cannot add server configuration" => "Das Hinzufügen der Serverkonfiguration schlug fehl",
"mappings cleared" => "Zuordnungen gelöscht",
"Success" => "Erfolgreich",
diff --git a/apps/user_ldap/l10n/de_DE.php b/apps/user_ldap/l10n/de_DE.php
index 4d3f01af42b..4e859e853cd 100644
--- a/apps/user_ldap/l10n/de_DE.php
+++ b/apps/user_ldap/l10n/de_DE.php
@@ -12,6 +12,7 @@ $TRANSLATIONS = array(
"Deletion failed" => "Löschen fehlgeschlagen",
"Take over settings from recent server configuration?" => "Einstellungen von letzter Konfiguration übernehmen?",
"Keep settings?" => "Einstellungen beibehalten?",
+"{nthServer}. Server" => "{nthServer}. - Server",
"Cannot add server configuration" => "Das Hinzufügen der Serverkonfiguration schlug fehl",
"mappings cleared" => "Zuordnungen gelöscht",
"Success" => "Erfolg",
diff --git a/apps/user_ldap/l10n/fi_FI.php b/apps/user_ldap/l10n/fi_FI.php
index f558fa78977..2fedc2a9460 100644
--- a/apps/user_ldap/l10n/fi_FI.php
+++ b/apps/user_ldap/l10n/fi_FI.php
@@ -3,6 +3,7 @@ $TRANSLATIONS = array(
"Failed to delete the server configuration" => "Palvelinmäärityksen poistaminen epäonnistui",
"The configuration is valid and the connection could be established!" => "Määritys on kelvollinen ja yhteys kyettiin muodostamaan!",
"Deletion failed" => "Poisto epäonnistui",
+"Take over settings from recent server configuration?" => "Otetaanko asetukset viimeisimmistä palvelinmäärityksistä?",
"Keep settings?" => "Säilytetäänkö asetukset?",
"Cannot add server configuration" => "Palvelinasetusten lisäys epäonnistui",
"Success" => "Onnistui!",
@@ -42,6 +43,7 @@ $TRANSLATIONS = array(
"Back" => "Takaisin",
"Continue" => "Jatka",
"Advanced" => "Lisäasetukset",
+"<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." => "<b>Varoitus:</b> PHP:n LDAP-moduulia ei ole asennettu, taustaosa ei toimi. Pyydä järjestelmän ylläpitäjää asentamaan se.",
"Connection Settings" => "Yhteysasetukset",
"Backup (Replica) Port" => "Varmuuskopioinnin (replikoinnin) portti",
"Disable Main Server" => "Poista pääpalvelin käytöstä",
diff --git a/apps/user_ldap/l10n/gl.php b/apps/user_ldap/l10n/gl.php
index aacd17b72b5..6906ea5e751 100644
--- a/apps/user_ldap/l10n/gl.php
+++ b/apps/user_ldap/l10n/gl.php
@@ -12,6 +12,7 @@ $TRANSLATIONS = array(
"Deletion failed" => "Produciuse un fallo ao eliminar",
"Take over settings from recent server configuration?" => "Tomar os recentes axustes de configuración do servidor?",
"Keep settings?" => "Manter os axustes?",
+"{nthServer}. Server" => "{nthServer}. Servidor",
"Cannot add server configuration" => "Non é posíbel engadir a configuración do servidor",
"mappings cleared" => "limpadas as asignacións",
"Success" => "Correcto",
@@ -119,7 +120,7 @@ $TRANSLATIONS = array(
"UUID Attribute for Users:" => "Atributo do UUID para usuarios:",
"UUID Attribute for Groups:" => "Atributo do UUID para grupos:",
"Username-LDAP User Mapping" => "Asignación do usuario ao «nome de usuario LDAP»",
-"Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." => "Os nomes de usuario empreganse para almacenar e asignar (meta) datos. Coa fin de identificar con precisión e recoñecer aos usuarios, cada usuario LDAP terá un nome de usuario interno. Isto require unha asignación de ownCloud nome de usuario a usuario LDAP. O nome de usuario creado asignase ao UUID do usuario LDAP. Ademais o DN almacenase na caché, para así reducir a interacción do LDAP, mais non se utiliza para a identificación. Se o DN cambia, os cambios poden ser atopados polo ownCloud. O nome interno no ownCloud utilizase en todo o ownCloud. A limpeza das asignacións deixará rastros en todas partes. A limpeza das asignacións non é sensíbel á configuración, afecta a todas as configuracións de LDAP! Non limpar nunca as asignacións nun entorno de produción. Limpar as asignacións só en fases de proba ou experimentais.",
+"Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." => "Os nomes de usuario empréganse para almacenar e asignar (meta) datos. Coa fin de identificar con precisión e recoñecer aos usuarios, cada usuario LDAP terá un nome de usuario interno. Isto require unha asignación de ownCloud nome de usuario a usuario LDAP. O nome de usuario creado asignase ao UUID do usuario LDAP. Ademais o DN almacenase na caché, para así reducir a interacción do LDAP, mais non se utiliza para a identificación. Se o DN cambia, os cambios poden ser atopados polo ownCloud. O nome interno no ownCloud utilizase en todo o ownCloud. A limpeza das asignacións deixará rastros en todas partes. A limpeza das asignacións non é sensíbel á configuración, afecta a todas as configuracións de LDAP! Non limpar nunca as asignacións nun entorno de produción. Limpar as asignacións só en fases de proba ou experimentais.",
"Clear Username-LDAP User Mapping" => "Limpar a asignación do usuario ao «nome de usuario LDAP»",
"Clear Groupname-LDAP Group Mapping" => "Limpar a asignación do grupo ao «nome de grupo LDAP»"
);
diff --git a/apps/user_ldap/l10n/it.php b/apps/user_ldap/l10n/it.php
index fea2d66fa6f..8750c8d7f69 100644
--- a/apps/user_ldap/l10n/it.php
+++ b/apps/user_ldap/l10n/it.php
@@ -12,6 +12,7 @@ $TRANSLATIONS = array(
"Deletion failed" => "Eliminazione non riuscita",
"Take over settings from recent server configuration?" => "Vuoi recuperare le impostazioni dalla configurazione recente del server?",
"Keep settings?" => "Vuoi mantenere le impostazioni?",
+"{nthServer}. Server" => "{nthServer}. server",
"Cannot add server configuration" => "Impossibile aggiungere la configurazione del server",
"mappings cleared" => "associazioni cancellate",
"Success" => "Riuscito",
diff --git a/apps/user_ldap/l10n/ja.php b/apps/user_ldap/l10n/ja.php
index eb85c055eff..135ffece2db 100644
--- a/apps/user_ldap/l10n/ja.php
+++ b/apps/user_ldap/l10n/ja.php
@@ -12,10 +12,12 @@ $TRANSLATIONS = array(
"Deletion failed" => "削除に失敗しました",
"Take over settings from recent server configuration?" => "最近のサーバー設定から設定を引き継ぎますか?",
"Keep settings?" => "設定を保持しますか?",
+"{nthServer}. Server" => "{nthServer}. サーバー",
"Cannot add server configuration" => "サーバー設定を追加できません",
"mappings cleared" => "マッピングをクリアしました",
"Success" => "成功",
"Error" => "エラー",
+"Please specify the port" => "ポートを指定してください",
"Configuration OK" => "設定OK",
"Configuration incorrect" => "設定に誤りがあります",
"Configuration incomplete" => "設定が不完全です",
@@ -30,6 +32,9 @@ $TRANSLATIONS = array(
"_%s user found_::_%s users found_" => array("%s ユーザーが見つかりました"),
"Invalid Host" => "無効なホスト",
"Could not find the desired feature" => "望ましい機能は見つかりませんでした",
+"Server" => "サーバー",
+"User Filter" => "ユーザーフィルター",
+"Login Filter" => "ログインフィルター",
"Group Filter" => "グループフィルタ",
"Save" => "保存",
"Test Configuration" => "設定をテスト",
@@ -43,10 +48,12 @@ $TRANSLATIONS = array(
"groups found" => "グループが見つかりました",
"Users login with this attribute:" => "この属性でユーザーログイン:",
"LDAP Username:" => "LDAP ユーザー名:",
-"LDAP Email Address:" => "LDAP メールアドレス:",
+"LDAP Email Address:" => "LDAPメールアドレス:",
"Other Attributes:" => "他の属性:",
"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" => "ログイン実行時に適用するフィルタを定義します。%%uid にはログイン操作におけるユーザー名が入ります。例: \"uid=%%uid\"",
+"1. Server" => "1. Server",
"Add Server Configuration" => "サーバー設定を追加",
+"Delete Configuration" => "設定を削除",
"Host" => "ホスト",
"You can omit the protocol, except you require SSL. Then start with ldaps://" => "SSL通信しない場合には、プロトコル名を省略することができます。そうでない場合には、ldaps:// から始めてください。",
"Port" => "ポート",
@@ -56,7 +63,7 @@ $TRANSLATIONS = array(
"For anonymous access, leave DN and Password empty." => "匿名アクセスの場合は、DNとパスワードを空にしてください。",
"One Base DN per line" => "1行に1つのベースDN",
"You can specify Base DN for users and groups in the Advanced tab" => "拡張タブでユーザーとグループのベースDNを指定することができます。",
-"Limit %s access to users meeting these criteria:" => "この基準を満たすユーザに対し %s へのアクセスを制限:",
+"Limit %s access to users meeting these criteria:" => "この基準を満たすユーザーに対し %s へのアクセスを制限:",
"The filter specifies which LDAP users shall have access to the %s instance." => "フィルタは、どのLDAPユーザーが %s にアクセスするかを指定します。",
"users found" => "ユーザーが見つかりました",
"Back" => "戻る",
@@ -72,7 +79,7 @@ $TRANSLATIONS = array(
"Backup (Replica) Port" => "バックアップ(レプリカ)ポート",
"Disable Main Server" => "メインサーバーを無効にする",
"Only connect to the replica server." => "レプリカサーバーにのみ接続します。",
-"Case insensitive LDAP server (Windows)" => "大文字と小文字を区別しない LDAP サーバ (Windows)",
+"Case insensitive LDAP server (Windows)" => "大文字と小文字を区別しないLDAPサーバー (Windows)",
"Turn off SSL certificate validation." => "SSL証明書の確認を無効にする。",
"Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." => "推奨されません、テストにおいてのみ使用してください!このオプションでのみ接続が動作する場合は、LDAP サーバーのSSL証明書を %s サーバーにインポートしてください。",
"Cache Time-To-Live" => "キャッシュのTTL",
@@ -85,7 +92,7 @@ $TRANSLATIONS = array(
"User Search Attributes" => "ユーザー検索属性",
"Optional; one attribute per line" => "オプション:1行に1属性",
"Group Display Name Field" => "グループ表示名のフィールド",
-"The LDAP attribute to use to generate the groups's display name." => "ユーザのグループ表示名の生成に利用するLDAP属性",
+"The LDAP attribute to use to generate the groups's display name." => "ユーザーのグループ表示名の生成に利用するLDAP属性",
"Base Group Tree" => "ベースグループツリー",
"One Group Base DN per line" => "1行に1つのグループベースDN",
"Group Search Attributes" => "グループ検索属性",
@@ -106,7 +113,7 @@ $TRANSLATIONS = array(
"Internal Username Attribute:" => "内部ユーザー名属性:",
"Override UUID detection" => "UUID検出を再定義する",
"By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." => "デフォルトでは、UUID 属性は自動的に検出されます。UUID属性は、LDAPユーザーとLDAPグループを間違いなく識別するために利用されます。また、もしこれを指定しない場合は、内部ユーザー名はUUIDに基づいて作成されます。この設定は再定義することができ、あなたの選択した属性を用いることができます。選択した属性がユーザーとグループの両方に対して適用でき、かつユニークであることを確認してください。空であればデフォルトの振る舞いとなります。変更は、新しくマッピング(追加)されたLDAPユーザーとLDAPグループに対してのみ有効となります。",
-"UUID Attribute for Users:" => "ユーザーの UUID 属性:",
+"UUID Attribute for Users:" => "ユーザーのUUID属性:",
"UUID Attribute for Groups:" => "グループの UUID 属性:",
"Username-LDAP User Mapping" => "ユーザー名とLDAPユーザのマッピング",
"Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." => "ユーザー名は(メタ)データの保存と割り当てに使用されます。ユーザーを正確に識別して認識するために、個々のLDAPユーザは内部ユーザ名を持っています。これは、ユーザー名からLDAPユーザーへのマッピングが必要であることを意味しています。この生成されたユーザ名は、LDAPユーザのUUIDにマッピングされます。加えて、DNがLDAPとのインタラクションを削減するためにキャッシュされますが、識別には利用されません。DNが変わった場合は、変更が検出されます。内部ユーザ名は全体に亘って利用されます。マッピングをクリアすると、いたるところに使われないままの物が残るでしょう。マッピングのクリアは設定に敏感ではありませんが、全てのLDAPの設定に影響を与えます!本番の環境では決してマッピングをクリアしないでください。テストもしくは実験の段階でのみマッピングのクリアを行なってください。",
diff --git a/apps/user_ldap/l10n/tr.php b/apps/user_ldap/l10n/tr.php
index c70947f5479..e5d855751cc 100644
--- a/apps/user_ldap/l10n/tr.php
+++ b/apps/user_ldap/l10n/tr.php
@@ -12,6 +12,7 @@ $TRANSLATIONS = array(
"Deletion failed" => "Silme başarısız oldu",
"Take over settings from recent server configuration?" => "Ayarlar son sunucu yapılandırmalarından devralınsın mı?",
"Keep settings?" => "Ayarlar korunsun mu?",
+"{nthServer}. Server" => "{nthServer}. Sunucu",
"Cannot add server configuration" => "Sunucu yapılandırması eklenemedi",
"mappings cleared" => "eşleştirmeler temizlendi",
"Success" => "Başarılı",
diff --git a/apps/user_webdavauth/l10n/ar.php b/apps/user_webdavauth/l10n/ar.php
index bdb335fadb4..fd26e9acd18 100644
--- a/apps/user_webdavauth/l10n/ar.php
+++ b/apps/user_webdavauth/l10n/ar.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
-"WebDAV Authentication" => "تأكد شخصية ال WebDAV"
+"WebDAV Authentication" => "تأكد شخصية ال WebDAV",
+"Save" => "حفظ"
);
$PLURAL_FORMS = "nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;";
diff --git a/apps/user_webdavauth/l10n/ast.php b/apps/user_webdavauth/l10n/ast.php
index dba7bcd08dc..7f87e130a9a 100644
--- a/apps/user_webdavauth/l10n/ast.php
+++ b/apps/user_webdavauth/l10n/ast.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "Autenticación per aciu de WevDAV",
+"Save" => "Guardar",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Les credenciales d'usuariu van unviase a esta direición. Esti complementu verifica la rempuesta y va interpretar los códigos de rempuesta HTTP 401 y 403 como credenciales inválides y toles otres rempuestes como credenciales válides."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/bg_BG.php b/apps/user_webdavauth/l10n/bg_BG.php
index 14e6b280fd2..639bc9ebf6d 100644
--- a/apps/user_webdavauth/l10n/bg_BG.php
+++ b/apps/user_webdavauth/l10n/bg_BG.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
-"WebDAV Authentication" => "WebDAV идентификация"
+"WebDAV Authentication" => "WebDAV идентификация",
+"Save" => "Запис"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/bn_BD.php b/apps/user_webdavauth/l10n/bn_BD.php
index 5366552efae..354df7c32d9 100644
--- a/apps/user_webdavauth/l10n/bn_BD.php
+++ b/apps/user_webdavauth/l10n/bn_BD.php
@@ -1,3 +1,5 @@
-<?php $TRANSLATIONS = array(
-"URL: http://" => "URL:http://"
+<?php
+$TRANSLATIONS = array(
+"Save" => "সংরক্ষণ"
);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/bs.php b/apps/user_webdavauth/l10n/bs.php
new file mode 100644
index 00000000000..2624f90daa8
--- /dev/null
+++ b/apps/user_webdavauth/l10n/bs.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"Save" => "Spasi"
+);
+$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/user_webdavauth/l10n/ca.php b/apps/user_webdavauth/l10n/ca.php
index 7684db85630..ed64e5896a8 100644
--- a/apps/user_webdavauth/l10n/ca.php
+++ b/apps/user_webdavauth/l10n/ca.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "Autenticació WebDAV",
+"Save" => "Desa",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Les credencials d'usuari s'enviaran a aquesta adreça. Aquest connector comprova la resposta i interpreta els codis d'estat 401 i 403 com a credencials no vàlides, i qualsevol altra resposta com a credencials vàlides."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/cs_CZ.php b/apps/user_webdavauth/l10n/cs_CZ.php
index 94ebf5c396c..bbc118d8404 100644
--- a/apps/user_webdavauth/l10n/cs_CZ.php
+++ b/apps/user_webdavauth/l10n/cs_CZ.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "Ověření WebDAV",
+"Save" => "Uložit",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Uživatelské přihlašovací údaje budou odeslány na tuto adresu. Tento plugin zkontroluje odpověď serveru a interpretuje návratový kód HTTP 401 a 403 jako neplatné přihlašovací údaje a jakýkoli jiný jako platné přihlašovací údaje."
);
$PLURAL_FORMS = "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;";
diff --git a/apps/user_webdavauth/l10n/cy_GB.php b/apps/user_webdavauth/l10n/cy_GB.php
new file mode 100644
index 00000000000..765f844a90c
--- /dev/null
+++ b/apps/user_webdavauth/l10n/cy_GB.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"Save" => "Cadw"
+);
+$PLURAL_FORMS = "nplurals=4; plural=(n==1) ? 0 : (n==2) ? 1 : (n != 8 && n != 11) ? 2 : 3;";
diff --git a/apps/user_webdavauth/l10n/da.php b/apps/user_webdavauth/l10n/da.php
index 66b74d389ba..219cac8b699 100644
--- a/apps/user_webdavauth/l10n/da.php
+++ b/apps/user_webdavauth/l10n/da.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "WebDAV-godkendelse",
+"Save" => "Gem",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Bruger oplysningerne vil blive sendt til denne adresse. Plugin'et registrerer responsen og fortolker HTTP-statuskode 401 og 403 som ugyldige oplysninger, men alle andre besvarelser som gyldige oplysninger."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/de.php b/apps/user_webdavauth/l10n/de.php
index bd856046b2b..86b2da8d9ef 100644
--- a/apps/user_webdavauth/l10n/de.php
+++ b/apps/user_webdavauth/l10n/de.php
@@ -1,6 +1,8 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "WebDAV Authentifikation",
+"Address:" => "Adresse:",
+"Save" => "Speichern",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Die Benutzerdaten werden an diese Adresse gesendet. Dieses Plugin prüft die Antwort und wird die HTTP-Statuscodes 401 und 403 als ungültige Daten interpretieren und alle anderen Antworten als gültige Daten."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/de_AT.php b/apps/user_webdavauth/l10n/de_AT.php
new file mode 100644
index 00000000000..60e8abdbf26
--- /dev/null
+++ b/apps/user_webdavauth/l10n/de_AT.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"Save" => "Speichern"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/de_CH.php b/apps/user_webdavauth/l10n/de_CH.php
index 3215c9d28cc..1683c56e4da 100644
--- a/apps/user_webdavauth/l10n/de_CH.php
+++ b/apps/user_webdavauth/l10n/de_CH.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "WebDAV-Authentifizierung",
+"Save" => "Speichern",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Die Benutzerdaten werden an diese Adresse gesendet. Dieses Plugin prüft die Antwort und wird die HTTP-Statuscodes 401 und 403 als ungültige Daten interpretieren und alle anderen Antworten als gültige Daten."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/de_DE.php b/apps/user_webdavauth/l10n/de_DE.php
index 3215c9d28cc..5888529624d 100644
--- a/apps/user_webdavauth/l10n/de_DE.php
+++ b/apps/user_webdavauth/l10n/de_DE.php
@@ -1,6 +1,8 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "WebDAV-Authentifizierung",
+"Address:" => "Adresse:",
+"Save" => "Speichern",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Die Benutzerdaten werden an diese Adresse gesendet. Dieses Plugin prüft die Antwort und wird die HTTP-Statuscodes 401 und 403 als ungültige Daten interpretieren und alle anderen Antworten als gültige Daten."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/el.php b/apps/user_webdavauth/l10n/el.php
index 993d6e23896..0a9be9f8559 100644
--- a/apps/user_webdavauth/l10n/el.php
+++ b/apps/user_webdavauth/l10n/el.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "Πιστοποίηση μέσω WebDAV ",
+"Save" => "Αποθήκευση",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Τα διαπιστευτήρια του χρήστη θα σταλούν σε αυτή την διεύθυνση. Αυτό το πρόσθετο ελέγχει την απόκριση και θα ερμηνεύσει τους κωδικούς κατάστασης HTTP 401 και 402 ως μη έγκυρα διαπιστευτήρια και όλες τις άλλες αποκρίσεις ως έγκυρα διαπιστευτήρια."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/en_GB.php b/apps/user_webdavauth/l10n/en_GB.php
index ea05dc0a0e0..345c0c28998 100644
--- a/apps/user_webdavauth/l10n/en_GB.php
+++ b/apps/user_webdavauth/l10n/en_GB.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "WebDAV Authentication",
+"Save" => "Save",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/eo.php b/apps/user_webdavauth/l10n/eo.php
index ddcac32ca1b..b5d824fdc99 100644
--- a/apps/user_webdavauth/l10n/eo.php
+++ b/apps/user_webdavauth/l10n/eo.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
-"WebDAV Authentication" => "WebDAV-aŭtentigo"
+"WebDAV Authentication" => "WebDAV-aŭtentigo",
+"Save" => "Konservi"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/es.php b/apps/user_webdavauth/l10n/es.php
index 19a92fb233a..360724f8986 100644
--- a/apps/user_webdavauth/l10n/es.php
+++ b/apps/user_webdavauth/l10n/es.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "Autenticación mediante WevDAV",
+"Save" => "Guardar",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Las credenciales de usuario se enviarán a esta dirección. Este complemento verifica la respuesta e interpretará los códigos de respuesta HTTP 401 y 403 como credenciales inválidas y todas las otras respuestas como credenciales válidas."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/es_AR.php b/apps/user_webdavauth/l10n/es_AR.php
index f0fc97b1a46..38164f9fba4 100644
--- a/apps/user_webdavauth/l10n/es_AR.php
+++ b/apps/user_webdavauth/l10n/es_AR.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "Autenticación de WebDAV",
+"Save" => "Guardar",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Las credenciales del usuario serán enviadas a esta dirección. Este plug-in verificará la respuesta e interpretará los códigos de estado HTTP 401 y 403 como credenciales inválidas y cualquier otra respuesta como válida."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/es_MX.php b/apps/user_webdavauth/l10n/es_MX.php
index 19a92fb233a..360724f8986 100644
--- a/apps/user_webdavauth/l10n/es_MX.php
+++ b/apps/user_webdavauth/l10n/es_MX.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "Autenticación mediante WevDAV",
+"Save" => "Guardar",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Las credenciales de usuario se enviarán a esta dirección. Este complemento verifica la respuesta e interpretará los códigos de respuesta HTTP 401 y 403 como credenciales inválidas y todas las otras respuestas como credenciales válidas."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/et_EE.php b/apps/user_webdavauth/l10n/et_EE.php
index 4f34761e609..961375692d9 100644
--- a/apps/user_webdavauth/l10n/et_EE.php
+++ b/apps/user_webdavauth/l10n/et_EE.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "WebDAV autentimine",
+"Save" => "Salvesta",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud saadab kasutajatunnused sellel aadressil. See vidin kontrollib vastust ning tuvastab ning tõlgendab HTTP olekukoodid 401 ja 403 valedeks andmeteks ning kõik teised vastused korrektseteks andmeteks."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/eu.php b/apps/user_webdavauth/l10n/eu.php
index d1ef3c4e99c..8a083701ce6 100644
--- a/apps/user_webdavauth/l10n/eu.php
+++ b/apps/user_webdavauth/l10n/eu.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "WebDAV Autentikazioa",
+"Save" => "Gorde",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Erabiltzailearen kredentzialak helbide honetara bidaliko dira. Plugin honek erantzuna aztertu eta HTTP 401 eta 403 egoera-kodeak kredentzial ez-egokitzat hartuko ditu, eta beste edozein erantzun, aldiz, kredentzial egokitzat."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/eu_ES.php b/apps/user_webdavauth/l10n/eu_ES.php
new file mode 100644
index 00000000000..a1d57a93b52
--- /dev/null
+++ b/apps/user_webdavauth/l10n/eu_ES.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"Save" => "Gorde"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/fa.php b/apps/user_webdavauth/l10n/fa.php
index ad061226d43..0bf8b6f6733 100644
--- a/apps/user_webdavauth/l10n/fa.php
+++ b/apps/user_webdavauth/l10n/fa.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
-"WebDAV Authentication" => "اعتبار سنجی WebDAV "
+"WebDAV Authentication" => "اعتبار سنجی WebDAV ",
+"Save" => "ذخیره"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/fi_FI.php b/apps/user_webdavauth/l10n/fi_FI.php
index 4ebf870822f..7209a889f1b 100644
--- a/apps/user_webdavauth/l10n/fi_FI.php
+++ b/apps/user_webdavauth/l10n/fi_FI.php
@@ -1,6 +1,8 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "WebDAV-todennus",
+"Address:" => "Osoite:",
+"Save" => "Tallenna",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Käyttäjätiedot lähetetään tähän osoitteeseen. Liitännäinen tarkistaa vastauksen, ja tulkitsee HTTP-tilakoodit 401 ja 403 vääriksi käyttäjätiedoiksi. Kaikki muut vastaukset tulkitaan kelvollisiksi käyttäjätiedoiksi."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/fr.php b/apps/user_webdavauth/l10n/fr.php
index cc6dd6a6692..2f838a503b3 100644
--- a/apps/user_webdavauth/l10n/fr.php
+++ b/apps/user_webdavauth/l10n/fr.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "Authentification WebDAV",
+"Save" => "Sauvegarder",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Les informations de connexion de l'utilisateur seront envoyées à cette adresse. Ce module analyse le code de la réponse HTTP et considère les codes 401 et 403 comme une authentification invalide et tout autre valeur comme une authentification valide."
);
$PLURAL_FORMS = "nplurals=2; plural=(n > 1);";
diff --git a/apps/user_webdavauth/l10n/gl.php b/apps/user_webdavauth/l10n/gl.php
index 29635cffa21..93ea1773cb1 100644
--- a/apps/user_webdavauth/l10n/gl.php
+++ b/apps/user_webdavauth/l10n/gl.php
@@ -1,6 +1,8 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "Autenticación WebDAV",
+"Address:" => "Enderezo:",
+"Save" => "Gardar",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "As credenciais do usuario serán enviadas a este enderezo. Este engadido comproba a resposta e interpretará os códigos de estado 401 e 403 como credenciais incorrectas, e todas as outras respostas como credenciais correctas."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/he.php b/apps/user_webdavauth/l10n/he.php
index d11fce81a36..4b037cc537f 100644
--- a/apps/user_webdavauth/l10n/he.php
+++ b/apps/user_webdavauth/l10n/he.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
-"WebDAV Authentication" => "הזדהות מול WebDAV"
+"WebDAV Authentication" => "הזדהות מול WebDAV",
+"Save" => "שמירה"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/hi.php b/apps/user_webdavauth/l10n/hi.php
new file mode 100644
index 00000000000..d373ff080cb
--- /dev/null
+++ b/apps/user_webdavauth/l10n/hi.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"Save" => "सहेजें"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/hr.php b/apps/user_webdavauth/l10n/hr.php
new file mode 100644
index 00000000000..5df22b34400
--- /dev/null
+++ b/apps/user_webdavauth/l10n/hr.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"Save" => "Snimi"
+);
+$PLURAL_FORMS = "nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;";
diff --git a/apps/user_webdavauth/l10n/hu_HU.php b/apps/user_webdavauth/l10n/hu_HU.php
index cd77eadaa1f..97bab9a583f 100644
--- a/apps/user_webdavauth/l10n/hu_HU.php
+++ b/apps/user_webdavauth/l10n/hu_HU.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "WebDAV hitelesítés",
+"Save" => "Mentés",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "A felhasználói hitelesítő adatai el lesznek küldve erre a címre. Ez a bővítőmodul leellenőrzi a választ és ha a HTTP hibakód nem 401 vagy 403 azaz érvénytelen a hitelesítő adat, akkor minden más válasz érvényes lesz."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/hy.php b/apps/user_webdavauth/l10n/hy.php
new file mode 100644
index 00000000000..3f79bc37ffa
--- /dev/null
+++ b/apps/user_webdavauth/l10n/hy.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"Save" => "Պահպանել"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/ia.php b/apps/user_webdavauth/l10n/ia.php
new file mode 100644
index 00000000000..413d8990659
--- /dev/null
+++ b/apps/user_webdavauth/l10n/ia.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"Save" => "Salveguardar"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/id.php b/apps/user_webdavauth/l10n/id.php
index 1e4ed72bd99..25d5d6cac02 100644
--- a/apps/user_webdavauth/l10n/id.php
+++ b/apps/user_webdavauth/l10n/id.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "Otentikasi WebDAV",
+"Save" => "Simpan",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Kredensial pengguna akan dikirim ke alamat ini. Pengaya ini memeriksa respon dan akan menafsirkan kode status HTTP 401 dan 403 sebagai kredensial yang tidak valid, dan semua tanggapan lain akan dianggap sebagai kredensial yang valid."
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/is.php b/apps/user_webdavauth/l10n/is.php
index 4fcab076542..c583862c311 100644
--- a/apps/user_webdavauth/l10n/is.php
+++ b/apps/user_webdavauth/l10n/is.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
-"WebDAV Authentication" => "WebDAV Auðkenni"
+"WebDAV Authentication" => "WebDAV Auðkenni",
+"Save" => "Vista"
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/it.php b/apps/user_webdavauth/l10n/it.php
index 044aac46bf5..f068209d3fc 100644
--- a/apps/user_webdavauth/l10n/it.php
+++ b/apps/user_webdavauth/l10n/it.php
@@ -1,6 +1,8 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "Autenticazione WebDAV",
+"Address:" => "Indirizzo:",
+"Save" => "Salva",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Le credenziali dell'utente saranno inviate a questo indirizzo. Questa estensione controlla la risposta e interpreterà i codici di stato HTTP 401 e 403 come credenziali non valide, e tutte le altre risposte come credenziali valide."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/ja.php b/apps/user_webdavauth/l10n/ja.php
index c45e63c7809..74c66e85312 100644
--- a/apps/user_webdavauth/l10n/ja.php
+++ b/apps/user_webdavauth/l10n/ja.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "WebDAV 認証",
-"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ユーザーの権限情報をこのアドレスに送信します。このプラグインは応答をチェックし、HTTP状態コードが 401 と 403 の場合は無効な資格情報とし、他の応答はすべて有効な資格情報として処理します。"
+"Save" => "保存",
+"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ユーザー資格情報をこのアドレスに送信します。このプラグインは応答をチェックし、HTTP状態コードが 401 と 403 の場合は無効な資格情報とし、他の応答はすべて有効な資格情報として処理します。"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/ka_GE.php b/apps/user_webdavauth/l10n/ka_GE.php
index c2aa956072c..e5deb0ea67d 100644
--- a/apps/user_webdavauth/l10n/ka_GE.php
+++ b/apps/user_webdavauth/l10n/ka_GE.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
-"WebDAV Authentication" => "WebDAV აუთენთიფიკაცია"
+"WebDAV Authentication" => "WebDAV აუთენთიფიკაცია",
+"Save" => "შენახვა"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/km.php b/apps/user_webdavauth/l10n/km.php
index dce8e5e9bb7..eee76d08214 100644
--- a/apps/user_webdavauth/l10n/km.php
+++ b/apps/user_webdavauth/l10n/km.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "ការ​ផ្ទៀង​ផ្ទាត់​ភាព​ត្រឹម​ត្រូវ WebDAV",
+"Save" => "រក្សាទុក",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "អត្តសញ្ញាណ​អ្នក​ប្រើ​នឹង​ត្រូវ​ផ្ញើ​ទៅ​អាសយដ្ឋាន​នេះ។ កម្មវិធី​បន្ថែម​នេះ​ពិនិត្យ​ចម្លើយ​តប ហើយ​នឹង​បក​ស្រាយ​កូដ​ស្ថានភាព HTTP ដូច​ជា 401 និង 403 ថា​ជា​អត្តសញ្ញាណ​មិន​ត្រឹម​ត្រូវ ហើយ​និង​ចម្លើយ​តប​ផ្សេងៗ​ថា​ត្រឹម​ត្រូវ។"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/ko.php b/apps/user_webdavauth/l10n/ko.php
index e586e759f92..68a113025b2 100644
--- a/apps/user_webdavauth/l10n/ko.php
+++ b/apps/user_webdavauth/l10n/ko.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "WebDAV 인증",
+"Save" => "저장",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud에서 이 URL로 사용자 인증 정보를 보냅니다. 이 플러그인은 응답을 확인하여 HTTP 상태 코드 401이나 403이 돌아온 경우에 잘못된 인증 정보로 간주합니다. 다른 모든 상태 코드는 올바른 인증 정보로 간주합니다."
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/ku_IQ.php b/apps/user_webdavauth/l10n/ku_IQ.php
new file mode 100644
index 00000000000..4e2be8ad0d6
--- /dev/null
+++ b/apps/user_webdavauth/l10n/ku_IQ.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"Save" => "پاشکه‌وتکردن"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/lb.php b/apps/user_webdavauth/l10n/lb.php
new file mode 100644
index 00000000000..053c7e747d5
--- /dev/null
+++ b/apps/user_webdavauth/l10n/lb.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"Save" => "Späicheren"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/lt_LT.php b/apps/user_webdavauth/l10n/lt_LT.php
index 02ed14dba7d..29e0b7821d6 100644
--- a/apps/user_webdavauth/l10n/lt_LT.php
+++ b/apps/user_webdavauth/l10n/lt_LT.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "WebDAV autentikacija",
+"Save" => "Išsaugoti",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Naudotojo duomenys bus nusiųsti šiuo adresu. Šis įskiepis patikrins gautą atsakymą ir interpretuos HTTP būsenos kodą 401 ir 403 kaip negaliojančius duomenis, ir visus kitus gautus atsakymus kaip galiojančius duomenis. "
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/user_webdavauth/l10n/lv.php b/apps/user_webdavauth/l10n/lv.php
index 7ce96285881..a55bb24ee8d 100644
--- a/apps/user_webdavauth/l10n/lv.php
+++ b/apps/user_webdavauth/l10n/lv.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
-"WebDAV Authentication" => "WebDAV autentifikācija"
+"WebDAV Authentication" => "WebDAV autentifikācija",
+"Save" => "Saglabāt"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);";
diff --git a/apps/user_webdavauth/l10n/mk.php b/apps/user_webdavauth/l10n/mk.php
index 6ebe36423b2..2146b817452 100644
--- a/apps/user_webdavauth/l10n/mk.php
+++ b/apps/user_webdavauth/l10n/mk.php
@@ -1,5 +1,5 @@
<?php
$TRANSLATIONS = array(
-"Address: " => "Адреса:"
+"Save" => "Сними"
);
$PLURAL_FORMS = "nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;";
diff --git a/apps/user_webdavauth/l10n/ms_MY.php b/apps/user_webdavauth/l10n/ms_MY.php
index c157045e585..5142c1d0f4a 100644
--- a/apps/user_webdavauth/l10n/ms_MY.php
+++ b/apps/user_webdavauth/l10n/ms_MY.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "Pengesahan ",
+"Save" => "Simpan",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Butiran pengguna akan dihantar ke alamat ini. Plugin ini memeriksa maklum balas dan akan mentafsir kod status HTTP 401 dan 403 sebagai butiran tidak sah, dan semua maklum balas lain sebagai butiran yang sah."
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/nb_NO.php b/apps/user_webdavauth/l10n/nb_NO.php
index 4029a62c147..624ff1969bc 100644
--- a/apps/user_webdavauth/l10n/nb_NO.php
+++ b/apps/user_webdavauth/l10n/nb_NO.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "WebDAV-autentisering",
+"Save" => "Lagre",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Brukerens påloggingsinformasjon vil bli sendt til denne adressen. Denne utvidelsen sjekker svaret og vil tolke HTTP-statuskodene 401 og 403 som ugyldig bruker eller passord, og alle andre svar tolkes som gyldig påloggings."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/nl.php b/apps/user_webdavauth/l10n/nl.php
index badbbe06403..d8e8b6f3f24 100644
--- a/apps/user_webdavauth/l10n/nl.php
+++ b/apps/user_webdavauth/l10n/nl.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "WebDAV authenticatie",
+"Save" => "Bewaren",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "De ingloggegevens worden opgestuurd naar dit adres. Deze plugin controleert de terugkoppeling en interpreteert de HTTP statuscodes 401 en 403 als invalide inloggegevens, en alle andere terugkoppelingen als valide inloggegevens."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/nn_NO.php b/apps/user_webdavauth/l10n/nn_NO.php
index 86b3ff5954c..e52c6c653fc 100644
--- a/apps/user_webdavauth/l10n/nn_NO.php
+++ b/apps/user_webdavauth/l10n/nn_NO.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "WebDAV-autentisering",
+"Save" => "Lagra",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Innloggingsinformasjon blir sendt til denne nettadressa. Dette programtillegget kontrollerer svaret og tolkar HTTP-statuskodane 401 og 403 som ugyldige, og alle andre svar som gyldige."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/oc.php b/apps/user_webdavauth/l10n/oc.php
new file mode 100644
index 00000000000..42ef978066e
--- /dev/null
+++ b/apps/user_webdavauth/l10n/oc.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"Save" => "Enregistra"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n > 1);";
diff --git a/apps/user_webdavauth/l10n/pl.php b/apps/user_webdavauth/l10n/pl.php
index 0a2702bbf6e..1f884f895af 100644
--- a/apps/user_webdavauth/l10n/pl.php
+++ b/apps/user_webdavauth/l10n/pl.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "Uwierzytelnienie WebDAV",
+"Save" => "Zapisz",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Dane uwierzytelniające użytkownika zostaną wysłane na ten adres. Wtyczka sprawdza odpowiedź i będzie interpretował status HTTP 401 i 403 jako nieprawidłowe dane uwierzytelniające i wszystkie inne odpowiedzi jako prawidłowe uwierzytelnienie."
);
$PLURAL_FORMS = "nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/user_webdavauth/l10n/pt_BR.php b/apps/user_webdavauth/l10n/pt_BR.php
index 61c520c7c64..e3534fd90bf 100644
--- a/apps/user_webdavauth/l10n/pt_BR.php
+++ b/apps/user_webdavauth/l10n/pt_BR.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "Autenticação WebDAV",
+"Save" => "Guardar",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "As credenciais de usuário serão enviadas para este endereço. Este plugin verifica a resposta e interpretará os códigos de status HTTP 401 e 403 como \"credenciais inválidas\", e todas as outras respostas como \"credenciais válidas\"."
);
$PLURAL_FORMS = "nplurals=2; plural=(n > 1);";
diff --git a/apps/user_webdavauth/l10n/pt_PT.php b/apps/user_webdavauth/l10n/pt_PT.php
index 759318f6d37..4cf989a968c 100644
--- a/apps/user_webdavauth/l10n/pt_PT.php
+++ b/apps/user_webdavauth/l10n/pt_PT.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "Autenticação WebDAV",
+"Save" => "Guardar",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "As credenciais do utilizador vão ser enviadas para endereço URL. Este plugin verifica a resposta e vai interpretar os códigos de estado HTTP 401 e 403 como credenciais inválidas, e todas as outras respostas como válidas."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/ro.php b/apps/user_webdavauth/l10n/ro.php
index 5780805a884..8fafe932ad0 100644
--- a/apps/user_webdavauth/l10n/ro.php
+++ b/apps/user_webdavauth/l10n/ro.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
-"WebDAV Authentication" => "Autentificare WebDAV"
+"WebDAV Authentication" => "Autentificare WebDAV",
+"Save" => "Salvează"
);
$PLURAL_FORMS = "nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));";
diff --git a/apps/user_webdavauth/l10n/ru.php b/apps/user_webdavauth/l10n/ru.php
index 31626db4c83..cfb31b1cb1e 100644
--- a/apps/user_webdavauth/l10n/ru.php
+++ b/apps/user_webdavauth/l10n/ru.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "Идентификация WebDAV",
+"Save" => "Сохранить",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Учётные данные пользователя будут отправлены на этот адрес. Плагин проверит ответ и будет рассматривать HTTP коды 401 и 403 как неверные учётные данные, при любом другом ответе - учётные данные пользователя верны."
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/user_webdavauth/l10n/si_LK.php b/apps/user_webdavauth/l10n/si_LK.php
index cc5cfb3c9b2..661a8495c30 100644
--- a/apps/user_webdavauth/l10n/si_LK.php
+++ b/apps/user_webdavauth/l10n/si_LK.php
@@ -1,3 +1,5 @@
-<?php $TRANSLATIONS = array(
-"WebDAV URL: http://" => "WebDAV යොමුව: http://"
+<?php
+$TRANSLATIONS = array(
+"Save" => "සුරකින්න"
);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/sk.php b/apps/user_webdavauth/l10n/sk.php
new file mode 100644
index 00000000000..9efe9fe6549
--- /dev/null
+++ b/apps/user_webdavauth/l10n/sk.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"Save" => "Uložiť"
+);
+$PLURAL_FORMS = "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;";
diff --git a/apps/user_webdavauth/l10n/sk_SK.php b/apps/user_webdavauth/l10n/sk_SK.php
index 99e769ddc66..694653d9877 100644
--- a/apps/user_webdavauth/l10n/sk_SK.php
+++ b/apps/user_webdavauth/l10n/sk_SK.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "WebDAV overenie",
+"Save" => "Uložiť",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Používateľské prihlasovacie údaje budú odoslané na túto adresu. Tento plugin skontroluje odpoveď servera a interpretuje návratový kód HTTP 401 a 403 ako neplatné prihlasovacie údaje a akýkoľvek iný ako platné prihlasovacie údaje."
);
$PLURAL_FORMS = "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;";
diff --git a/apps/user_webdavauth/l10n/sl.php b/apps/user_webdavauth/l10n/sl.php
index ae459025ae1..1b0eed78141 100644
--- a/apps/user_webdavauth/l10n/sl.php
+++ b/apps/user_webdavauth/l10n/sl.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "Overitev WebDAV",
+"Save" => "Shrani",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Uporabniška poverila bodo poslana na naveden naslov. Vstavek preveri odziv in kodi stanja 401 in 403 obravnava kot neveljavna poverila, vse ostale odzive pa kot veljavna."
);
$PLURAL_FORMS = "nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);";
diff --git a/apps/user_webdavauth/l10n/sq.php b/apps/user_webdavauth/l10n/sq.php
new file mode 100644
index 00000000000..66d3b2fb102
--- /dev/null
+++ b/apps/user_webdavauth/l10n/sq.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"Save" => "Ruaj"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/sr.php b/apps/user_webdavauth/l10n/sr.php
index 5cb00494033..78f24013e5e 100644
--- a/apps/user_webdavauth/l10n/sr.php
+++ b/apps/user_webdavauth/l10n/sr.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
-"WebDAV Authentication" => "WebDAV провера идентитета"
+"WebDAV Authentication" => "WebDAV провера идентитета",
+"Save" => "Сачувај"
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/user_webdavauth/l10n/sr@latin.php b/apps/user_webdavauth/l10n/sr@latin.php
new file mode 100644
index 00000000000..3eb28111769
--- /dev/null
+++ b/apps/user_webdavauth/l10n/sr@latin.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"Save" => "Snimi"
+);
+$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/user_webdavauth/l10n/sv.php b/apps/user_webdavauth/l10n/sv.php
index b0c2985169a..b0404000cb2 100644
--- a/apps/user_webdavauth/l10n/sv.php
+++ b/apps/user_webdavauth/l10n/sv.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "WebDAV Autentisering",
+"Save" => "Spara",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "ownCloud kommer skicka användaruppgifterna till denna URL. Denna plugin kontrollerar svaret och tolkar HTTP-statuskoderna 401 och 403 som felaktiga uppgifter, och alla andra svar som giltiga uppgifter."
);
$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/ta_LK.php b/apps/user_webdavauth/l10n/ta_LK.php
index 9bd32954b05..fdf3ac7b15e 100644
--- a/apps/user_webdavauth/l10n/ta_LK.php
+++ b/apps/user_webdavauth/l10n/ta_LK.php
@@ -1,3 +1,5 @@
-<?php $TRANSLATIONS = array(
-"WebDAV URL: http://" => "WebDAV URL: http://"
+<?php
+$TRANSLATIONS = array(
+"Save" => "சேமிக்க "
);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/te.php b/apps/user_webdavauth/l10n/te.php
new file mode 100644
index 00000000000..f3bf5e83cde
--- /dev/null
+++ b/apps/user_webdavauth/l10n/te.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"Save" => "భద్రపరచు"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/th_TH.php b/apps/user_webdavauth/l10n/th_TH.php
index 102adaca4ab..c6120ba3090 100644
--- a/apps/user_webdavauth/l10n/th_TH.php
+++ b/apps/user_webdavauth/l10n/th_TH.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
-"WebDAV Authentication" => "WebDAV Authentication"
+"WebDAV Authentication" => "WebDAV Authentication",
+"Save" => "บันทึก"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/tr.php b/apps/user_webdavauth/l10n/tr.php
index 33dd2a887a9..f07b3d81746 100644
--- a/apps/user_webdavauth/l10n/tr.php
+++ b/apps/user_webdavauth/l10n/tr.php
@@ -1,6 +1,8 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "WebDAV Kimlik Doğrulaması",
+"Address:" => "Adres:",
+"Save" => "Kaydet",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Kullanıcı kimlik bilgileri bu adrese gönderilecek. Bu eklenti yanıtı kontrol edecek ve 401 ile 403 HTTP durum kodlarını geçersiz kimlik bilgileri olarak, diğer yanıtları ise doğru kimlik bilgileri olarak algılayacaktır."
);
$PLURAL_FORMS = "nplurals=2; plural=(n > 1);";
diff --git a/apps/user_webdavauth/l10n/ug.php b/apps/user_webdavauth/l10n/ug.php
index 8ad7963d49f..f4e736952c4 100644
--- a/apps/user_webdavauth/l10n/ug.php
+++ b/apps/user_webdavauth/l10n/ug.php
@@ -1,5 +1,6 @@
<?php
$TRANSLATIONS = array(
-"WebDAV Authentication" => "WebDAV سالاھىيەت دەلىللەش"
+"WebDAV Authentication" => "WebDAV سالاھىيەت دەلىللەش",
+"Save" => "ساقلا"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/uk.php b/apps/user_webdavauth/l10n/uk.php
index 326b9a03d87..b548b01951b 100644
--- a/apps/user_webdavauth/l10n/uk.php
+++ b/apps/user_webdavauth/l10n/uk.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "Аутентифікація WebDAV",
+"Save" => "Зберегти",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Облікові дані користувача буде надіслано на цю адресу. Цей плагін перевіряє відповідь і буде інтерпретувати коди статусу HTTP 401 і 403, як неправильні облікові дані, а всі інші відповіді, вважатимуться правильними."
);
$PLURAL_FORMS = "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);";
diff --git a/apps/user_webdavauth/l10n/ur_PK.php b/apps/user_webdavauth/l10n/ur_PK.php
new file mode 100644
index 00000000000..3546754a0d2
--- /dev/null
+++ b/apps/user_webdavauth/l10n/ur_PK.php
@@ -0,0 +1,5 @@
+<?php
+$TRANSLATIONS = array(
+"Save" => "حفظ"
+);
+$PLURAL_FORMS = "nplurals=2; plural=(n != 1);";
diff --git a/apps/user_webdavauth/l10n/vi.php b/apps/user_webdavauth/l10n/vi.php
index 9ab2887962a..ee8a47151ce 100644
--- a/apps/user_webdavauth/l10n/vi.php
+++ b/apps/user_webdavauth/l10n/vi.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "Xác thực WebDAV",
+"Save" => "Lưu",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "Các thông tin người dùng sẽ được gửi đến địa chỉ này. Plugin này sẽ kiểm tra các phản hồi và các statuscodes HTTP 401 và 403 không hợp lệ, và tất cả những phản h khác như thông tin hợp lệ."
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/zh_CN.php b/apps/user_webdavauth/l10n/zh_CN.php
index 5e16945708e..c3ee68849b9 100644
--- a/apps/user_webdavauth/l10n/zh_CN.php
+++ b/apps/user_webdavauth/l10n/zh_CN.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "WebDAV 认证",
+"Save" => "保存",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "用户的身份将会被发送到此 URL。这个插件检查返回值并且将 HTTP 状态编码 401 和 403 解释为非法身份,其他所有返回值为合法身份。"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/zh_HK.php b/apps/user_webdavauth/l10n/zh_HK.php
index 72d95340768..fa0e987fa3c 100644
--- a/apps/user_webdavauth/l10n/zh_HK.php
+++ b/apps/user_webdavauth/l10n/zh_HK.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "WebDAV 認證",
+"Save" => "儲存",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "使用者憑證將會被傳送到此位址。此外掛程式將會檢查回應,HTTP狀態碼 401與403將會被理解為無效憑證,而所有其他的回應將會被理解為有效憑證。"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";
diff --git a/apps/user_webdavauth/l10n/zh_TW.php b/apps/user_webdavauth/l10n/zh_TW.php
index 72d95340768..fa0e987fa3c 100644
--- a/apps/user_webdavauth/l10n/zh_TW.php
+++ b/apps/user_webdavauth/l10n/zh_TW.php
@@ -1,6 +1,7 @@
<?php
$TRANSLATIONS = array(
"WebDAV Authentication" => "WebDAV 認證",
+"Save" => "儲存",
"The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." => "使用者憑證將會被傳送到此位址。此外掛程式將會檢查回應,HTTP狀態碼 401與403將會被理解為無效憑證,而所有其他的回應將會被理解為有效憑證。"
);
$PLURAL_FORMS = "nplurals=1; plural=0;";