Compare commits
227 Commits
dav-push-sync
...
v9.1.1
| Author | SHA1 | Date | |
|---|---|---|---|
| 5cc7dd8922 | |||
| aed4ee9f81 | |||
| debe1c3f84 | |||
| 6fe80377e8 | |||
| f572239546 | |||
| d614c12d3f | |||
| 64151706e6 | |||
| bc81af74e7 | |||
| 39182a49ab | |||
| 4f0d8d4943 | |||
| faa6c45089 | |||
| a2d01aab8a | |||
| 7cc8f4d7e9 | |||
| d8d29f2221 | |||
| 3560458714 | |||
| 7c042a47e8 | |||
| 8fe2daaa9e | |||
| bb291e2932 | |||
| c145ca0bac | |||
| d4d3e3b128 | |||
| 12b28f8b86 | |||
| d87dbad598 | |||
| 46f23622c4 | |||
| 2061fed3e2 | |||
| 794229a783 | |||
| 22c1ea893b | |||
| 5119b630df | |||
| 0fae262b0b | |||
| 6870045cf4 | |||
| c195ee678d | |||
| 1b558ae201 | |||
| 74c2c63b31 | |||
| 5cb0d5823c | |||
| 4a0b0bc53f | |||
| 7d641bbfdf | |||
| 8c7491cac2 | |||
| ef16b119de | |||
| a870db5cd2 | |||
| 7633cd967d | |||
| 72745eff07 | |||
| 85e8a46e14 | |||
| cc65604955 | |||
| 04605ad442 | |||
| 3ae319fdaa | |||
| bbfa0fe833 | |||
| 8003c16105 | |||
| 13d794ff88 | |||
| 5aa789272a | |||
| 4e8718a78e | |||
| 4c7135a44d | |||
| 6c64d36f48 | |||
| c4ba9f2f97 | |||
| 20aa7ee280 | |||
| ced5ba0763 | |||
| e466349754 | |||
| e27efa5d52 | |||
| c058e9456c | |||
| 80a4940267 | |||
| 554e96cb1c | |||
| 8b9536c22b | |||
| 3737f5ad80 | |||
| fb9576df9e | |||
| d4ec50c637 | |||
| 98af8941ef | |||
| 9bbf347e58 | |||
| b59b6978de | |||
| c687c89354 | |||
| 0815af34c0 | |||
| aea66fabf4 | |||
| 35f9a562df | |||
| 4765f5b214 | |||
| 64d78879db | |||
| b7356d881b | |||
| 22d20833b5 | |||
| 01a51543a5 | |||
| 4b9879db3d | |||
| c5477ad059 | |||
| 8cca364160 | |||
| 03a65e5e3a | |||
| 5d6a2b8041 | |||
| c492277cf1 | |||
| 837bf1c587 | |||
| dc7d55c857 | |||
| 3717e6237e | |||
| c8a385d61e | |||
| aacf391f8b | |||
| df16a0c5e3 | |||
| 4033a6b65a | |||
| 563df59f58 | |||
| a986fd4b79 | |||
| 6e44ef83ff | |||
| 80e106f04a | |||
| befed183e5 | |||
| 912aa4f82b | |||
| 4b1b5adb34 | |||
| ed59de57bb | |||
| 4d47963a6e | |||
| ee7106ca71 | |||
| a32f50a5bf | |||
| ee72c9b1e8 | |||
| 1a497b1027 | |||
| 66f86bc686 | |||
| f376122168 | |||
| db85499697 | |||
| 62235e511d | |||
| 97e24aed58 | |||
| 56ee571dc3 | |||
| 2bf6f54366 | |||
| ec02b8bf25 | |||
| f5c5bac0fe | |||
| b247e4e5ff | |||
| 716273a918 | |||
| 9f2117613d | |||
| 1550ae93ef | |||
| 57a045efcb | |||
| b642b26f72 | |||
| 28a689c856 | |||
| dd3e5e0e88 | |||
| 425107ba2f | |||
| 0aef283dff | |||
| ef7d362810 | |||
| a9faa22241 | |||
| 084f46917a | |||
| 0daddd5866 | |||
| 92f49fbb39 | |||
| 3de4dfb2e5 | |||
| c301b8d71e | |||
| 9712c9db0f | |||
| 0ddbf5c981 | |||
| 830c1f2fbf | |||
| 0ec43a4f0f | |||
| 8b601c567d | |||
| 513e4aac85 | |||
| de5b3c5d35 | |||
| e2dbc0d0e6 | |||
| 19cf727a0f | |||
| 7c4108ee4b | |||
| e668cf1a33 | |||
| 8a298c4635 | |||
| 1d10d58284 | |||
| 3bde47cffe | |||
| e7cc8bac1e | |||
| 89e581acf8 | |||
| 8b8d2b679a | |||
| a35747b6fa | |||
| a573b6863c | |||
| 8147eefaeb | |||
| 325776eaf2 | |||
| aa42d60c5f | |||
| 6b4b337e53 | |||
| 59fc3ff45a | |||
| 6a89a63d2e | |||
| b0bad03234 | |||
| 5cc01476e4 | |||
| 0a8f7bdc5b | |||
| 9e7e3decd3 | |||
| 6cc6538ad2 | |||
| 1ad97f8479 | |||
| 027715f9ac | |||
| e42ce62ce2 | |||
| aaf4c3073a | |||
| 44a8a13655 | |||
| 74b29a0ffa | |||
| 54ecc4c375 | |||
| 779ee95834 | |||
| 39723c5958 | |||
| 17036c4cc3 | |||
| cb3b678b2c | |||
| dc35554091 | |||
| e67615ef0c | |||
| 4c426ad970 | |||
| 0ccc412fcc | |||
| fe007fd543 | |||
| a29c65037e | |||
| d2209d304f | |||
| e1c24e7c50 | |||
| dc6c2344f6 | |||
| 6a1d9d0c32 | |||
| 20b1ba0771 | |||
| b40013928c | |||
| 86a0e64628 | |||
| 332b38fd92 | |||
| f107be3d29 | |||
| 646c90cc4a | |||
| 06331625a9 | |||
| 8d32e1d35b | |||
| 79cfad0cc0 | |||
| 72a3301ba4 | |||
| 5e2a9dac14 | |||
| 6e0c40ffd9 | |||
| dbd176cfab | |||
| 95344d0625 | |||
| 9681bf7cee | |||
| 48116660f5 | |||
| 9549e2ded7 | |||
| 4be95374a5 | |||
| 089fcb45c0 | |||
| ee90bef50a | |||
| 52eab2a61a | |||
| 3d65979f0a | |||
| c295523ae2 | |||
| e9a0a6d83a | |||
| 213d7119f9 | |||
| 19a53982d4 | |||
| ee674844f2 | |||
| d484fef837 | |||
| db34671626 | |||
| 5e58b5115f | |||
| 39b533d0d8 | |||
| bf3ee69d86 | |||
| d345047b0f | |||
| 04e3da0cf5 | |||
| 56ad4cdfec | |||
| 7dc36289ab | |||
| 2ca1301494 | |||
| dc78d26f2a | |||
| 819b7c45a9 | |||
| 29068d3845 | |||
| 6c1ea7a54b | |||
| 8fef9a197f | |||
| e2a28db2b5 | |||
| cc2aec11af | |||
| 040c541138 | |||
| bac1a3a623 | |||
| e5d8726859 | |||
| 97f1813695 | |||
| 508c580e67 |
@@ -182,7 +182,8 @@ Jesús Macias <jmacias@solidgear.es> Jesus Macias <jmacias@full-on-net.com>
|
||||
jknockaert <jasper@knockaert.nl>
|
||||
Joan <aseques@gmail.com>
|
||||
Joar Wandborg <git@wandborg.com>
|
||||
Joas Schilling <nickvergessen@owncloud.com> Joas Schilling <nickvergessen@gmx.de>
|
||||
Joas Schilling <coding@schilljs.com> Joas Schilling <nickvergessen@gmx.de>
|
||||
Joas Schilling <coding@schilljs.com> Joas Schilling <nickvergessen@owncloud.com>
|
||||
joel hansson <joel.hansson@gmail.com>
|
||||
Johan Björk <johanimon@gmail.com>
|
||||
Johannes Twittmann <github.com@deryo.de>
|
||||
|
||||
+1
-1
Submodule 3rdparty updated: 509385e674...f65a242bbd
Vendored
+137
@@ -0,0 +1,137 @@
|
||||
#!groovy
|
||||
/*
|
||||
* This Jenkinsfile is intended to run on https://ci.owncloud.org and may fail anywhere else.
|
||||
* It makes assumptions about plugins being installed, labels mapping to nodes that can build what is needed, etc.
|
||||
*/
|
||||
|
||||
timestampedNode('SLAVE') {
|
||||
stage 'Checkout'
|
||||
checkout scm
|
||||
sh '''git submodule update --init'''
|
||||
|
||||
stage 'JavaScript Testing'
|
||||
executeAndReport('tests/autotest-results-js.xml') {
|
||||
sh '''./autotest-js.sh'''
|
||||
}
|
||||
|
||||
stage 'PHPUnit'
|
||||
executeAndReport('tests/autotest-results-sqlite.xml') {
|
||||
sh '''
|
||||
export NOCOVERAGE=1
|
||||
unset USEDOCKER
|
||||
phpenv local 7.0
|
||||
./autotest.sh sqlite
|
||||
'''
|
||||
}
|
||||
executeAndReport('tests/autotest-results-mysql.xml') {
|
||||
sh '''
|
||||
export NOCOVERAGE=1
|
||||
unset USEDOCKER
|
||||
phpenv local 5.4
|
||||
./autotest.sh mysql
|
||||
'''
|
||||
}
|
||||
executeAndReport('tests/autotest-results-pgsql.xml') {
|
||||
sh '''
|
||||
export NOCOVERAGE=1
|
||||
unset USEDOCKER
|
||||
phpenv local 5.6
|
||||
./autotest.sh pgsql
|
||||
'''
|
||||
}
|
||||
executeAndReport('tests/autotest-results-oci.xml') {
|
||||
sh '''
|
||||
export NOCOVERAGE=1
|
||||
unset USEDOCKER
|
||||
phpenv local 5.5
|
||||
./autotest.sh oci
|
||||
'''
|
||||
}
|
||||
|
||||
stage 'Files External Testing'
|
||||
executeAndReport('tests/autotest-external-results-sqlite-webdav-ownCloud.xml') {
|
||||
sh '''phpenv local 7.0
|
||||
export NOCOVERAGE=1
|
||||
unset USEDOCKER
|
||||
./autotest-external.sh sqlite webdav-ownCloud
|
||||
'''
|
||||
}
|
||||
executeAndReport('tests/autotest-external-results-sqlite-smb-silvershell.xml') {
|
||||
sh '''phpenv local 7.0
|
||||
export NOCOVERAGE=1
|
||||
unset USEDOCKER
|
||||
./autotest-external.sh sqlite smb-silvershell
|
||||
'''
|
||||
}
|
||||
executeAndReport('tests/autotest-external-results-sqlite-swift-ceph.xml') {
|
||||
sh '''phpenv local 7.0
|
||||
export NOCOVERAGE=1
|
||||
unset USEDOCKER
|
||||
./autotest-external.sh sqlite swift-ceph
|
||||
'''
|
||||
}
|
||||
executeAndReport('tests/autotest-external-results-sqlite-smb-windows.xml') {
|
||||
sh '''phpenv local 7.0
|
||||
export NOCOVERAGE=1
|
||||
unset USEDOCKER
|
||||
./autotest-external.sh sqlite smb-windows
|
||||
'''
|
||||
}
|
||||
|
||||
step([$class: 'JUnitResultArchiver', testResults: 'tests/autotest-external-results-sqlite.xml'])
|
||||
|
||||
stage 'Primary Objectstore Test - Swift'
|
||||
executeAndReport('tests/autotest-results-mysql.xml') {
|
||||
sh '''phpenv local 7.0
|
||||
|
||||
export NOCOVERAGE=1
|
||||
export RUN_OBJECTSTORE_TESTS=1
|
||||
export PRIMARY_STORAGE_CONFIG="swift"
|
||||
unset USEDOCKER
|
||||
|
||||
rm tests/autotest-results-*.xml
|
||||
./autotest.sh mysql
|
||||
'''
|
||||
}
|
||||
|
||||
stage 'Integration Testing'
|
||||
executeAndReport('build/integration/output/*.xml') {
|
||||
sh '''phpenv local 7.0
|
||||
rm -rf config/config.php
|
||||
./occ maintenance:install --admin-pass=admin
|
||||
rm -rf build/integration/output
|
||||
rm -rf build/integration/vendor
|
||||
rm -rf build/integration/composer.lock
|
||||
cd build/integration
|
||||
./run.sh
|
||||
'''
|
||||
}
|
||||
}
|
||||
|
||||
void executeAndReport(String testResultLocation, def body) {
|
||||
def failed = false
|
||||
// We're wrapping this in a timeout - if it takes longer, kill it.
|
||||
try {
|
||||
timeout(time: 120, unit: 'MINUTES') {
|
||||
body.call()
|
||||
}
|
||||
} catch (Exception e) {
|
||||
failed = true
|
||||
echo "Test execution failed: ${e}"
|
||||
} finally {
|
||||
step([$class: 'JUnitResultArchiver', testResults: testResultLocation])
|
||||
}
|
||||
|
||||
if (failed) {
|
||||
error "Test execution failed. Terminating the build"
|
||||
}
|
||||
}
|
||||
|
||||
// Runs the given body within a Timestamper wrapper on the given label.
|
||||
def timestampedNode(String label, Closure body) {
|
||||
node(label) {
|
||||
wrap([$class: 'TimestamperBuildWrapper']) {
|
||||
body.call()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -31,7 +31,7 @@
|
||||
'{{/if}}' +
|
||||
' </div>' +
|
||||
' <form class="newCommentForm">' +
|
||||
' <textarea class="message" placeholder="{{newMessagePlaceholder}}">{{{message}}}</textarea>' +
|
||||
' <textarea class="message" placeholder="{{newMessagePlaceholder}}">{{message}}</textarea>' +
|
||||
' <input class="submit" type="submit" value="{{submitText}}" />' +
|
||||
'{{#if isEditMode}}' +
|
||||
' <input class="cancel" type="button" value="{{cancelText}}" />' +
|
||||
@@ -337,10 +337,10 @@
|
||||
$comment.data('commentEl').remove();
|
||||
$comment.remove();
|
||||
},
|
||||
error: function(msg) {
|
||||
error: function() {
|
||||
$loading.addClass('hidden');
|
||||
$comment.removeClass('disabled');
|
||||
OC.Notification.showTemporary(msg);
|
||||
OC.Notification.showTemporary(t('comments', 'Error occurred while retrieving comment with id {id}', {id: commentId}));
|
||||
}
|
||||
});
|
||||
|
||||
@@ -388,12 +388,12 @@
|
||||
.html(self._formatMessage(model.get('message')));
|
||||
$row.remove();
|
||||
},
|
||||
error: function(msg) {
|
||||
error: function() {
|
||||
$submit.removeClass('hidden');
|
||||
$loading.addClass('hidden');
|
||||
$textArea.prop('disabled', false);
|
||||
|
||||
OC.Notification.showTemporary(msg);
|
||||
OC.Notification.showTemporary(t('comments', 'Error occurred while updating comment with id {id}', {id: commentId}));
|
||||
}
|
||||
});
|
||||
} else {
|
||||
@@ -413,12 +413,12 @@
|
||||
$loading.addClass('hidden');
|
||||
$textArea.val('').prop('disabled', false);
|
||||
},
|
||||
error: function(msg) {
|
||||
error: function() {
|
||||
$submit.removeClass('hidden');
|
||||
$loading.addClass('hidden');
|
||||
$textArea.prop('disabled', false);
|
||||
|
||||
OC.Notification.showTemporary(msg);
|
||||
OC.Notification.showTemporary(t('comments', 'Error occurred while posting comment'));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ OC.L10N.register(
|
||||
{
|
||||
"Type in a new comment..." : "Напиши нов коментар...",
|
||||
"Delete comment" : "Изтрий коментар",
|
||||
"Post" : "Публикация",
|
||||
"Cancel" : "Отказ",
|
||||
"Edit comment" : "Редактирай коментра",
|
||||
"[Deleted user]" : "[Изтрит потребител]",
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
{ "translations": {
|
||||
"Type in a new comment..." : "Напиши нов коментар...",
|
||||
"Delete comment" : "Изтрий коментар",
|
||||
"Post" : "Публикация",
|
||||
"Cancel" : "Отказ",
|
||||
"Edit comment" : "Редактирай коментра",
|
||||
"[Deleted user]" : "[Изтрит потребител]",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Více komentářů...",
|
||||
"Save" : "Uložit",
|
||||
"Allowed characters {count} of {max}" : "Povolených znaků {count} z {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Došlo k chybě při načítání komentáře s id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Došlo k chybě při aktualizování komentáře s id {id}",
|
||||
"Error occurred while posting comment" : "Došlo k chybě při zveřejňování komentáře",
|
||||
"{count} unread comments" : "{count} nepřečtených komentářů",
|
||||
"Comment" : "Komentář",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Komentáře</strong> pro soubory <em>(vždy uvedeny v proudu)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Více komentářů...",
|
||||
"Save" : "Uložit",
|
||||
"Allowed characters {count} of {max}" : "Povolených znaků {count} z {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Došlo k chybě při načítání komentáře s id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Došlo k chybě při aktualizování komentáře s id {id}",
|
||||
"Error occurred while posting comment" : "Došlo k chybě při zveřejňování komentáře",
|
||||
"{count} unread comments" : "{count} nepřečtených komentářů",
|
||||
"Comment" : "Komentář",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Komentáře</strong> pro soubory <em>(vždy uvedeny v proudu)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Weitere Kommentare...",
|
||||
"Save" : "Speichern",
|
||||
"Allowed characters {count} of {max}" : "Erlaubte Zeichen {count} von {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Es ist ein Fehler beim Empfangen des Kommentars mit der ID {id} aufgetreten",
|
||||
"Error occurred while updating comment with id {id}" : "Es ist ein Fehler beim Aktualisieren des Kommentars mit der ID {id} aufgetreten",
|
||||
"Error occurred while posting comment" : "Es ist ein Fehler beim Veröffentlichen des Kommentars aufgetreten",
|
||||
"{count} unread comments" : "{count} ungelesene Kommentare",
|
||||
"Comment" : "Kommentar",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Kommentare</strong> für Dateien<em>(immer im Stream aufgelistet)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Weitere Kommentare...",
|
||||
"Save" : "Speichern",
|
||||
"Allowed characters {count} of {max}" : "Erlaubte Zeichen {count} von {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Es ist ein Fehler beim Empfangen des Kommentars mit der ID {id} aufgetreten",
|
||||
"Error occurred while updating comment with id {id}" : "Es ist ein Fehler beim Aktualisieren des Kommentars mit der ID {id} aufgetreten",
|
||||
"Error occurred while posting comment" : "Es ist ein Fehler beim Veröffentlichen des Kommentars aufgetreten",
|
||||
"{count} unread comments" : "{count} ungelesene Kommentare",
|
||||
"Comment" : "Kommentar",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Kommentare</strong> für Dateien<em>(immer im Stream aufgelistet)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Weitere Kommentare...",
|
||||
"Save" : "Speichern",
|
||||
"Allowed characters {count} of {max}" : "{count} von {max} Zeichen benutzt",
|
||||
"Error occurred while retrieving comment with id {id}" : "Es ist ein Fehler beim Empfangen des Kommentars mit der ID {id} aufgetreten",
|
||||
"Error occurred while updating comment with id {id}" : "Es ist ein Fehler beim Aktualisieren des Kommentars mit der ID {id} aufgetreten",
|
||||
"Error occurred while posting comment" : "Es ist ein Fehler beim Veröffentlichen des Kommentars aufgetreten",
|
||||
"{count} unread comments" : "[count] ungelesene Kommentare",
|
||||
"Comment" : "Kommentar",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Kommentare</strong> für Dateien<em>(immer im Stream aufgelistet)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Weitere Kommentare...",
|
||||
"Save" : "Speichern",
|
||||
"Allowed characters {count} of {max}" : "{count} von {max} Zeichen benutzt",
|
||||
"Error occurred while retrieving comment with id {id}" : "Es ist ein Fehler beim Empfangen des Kommentars mit der ID {id} aufgetreten",
|
||||
"Error occurred while updating comment with id {id}" : "Es ist ein Fehler beim Aktualisieren des Kommentars mit der ID {id} aufgetreten",
|
||||
"Error occurred while posting comment" : "Es ist ein Fehler beim Veröffentlichen des Kommentars aufgetreten",
|
||||
"{count} unread comments" : "[count] ungelesene Kommentare",
|
||||
"Comment" : "Kommentar",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Kommentare</strong> für Dateien<em>(immer im Stream aufgelistet)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "More comments...",
|
||||
"Save" : "Save",
|
||||
"Allowed characters {count} of {max}" : "Allowed characters {count} of {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Error occurred while retrieving comment with id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Error occurred while updating comment with id {id}",
|
||||
"Error occurred while posting comment" : "Error occurred while posting comment",
|
||||
"{count} unread comments" : "{count} unread comments",
|
||||
"Comment" : "Comment",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Comments</strong> for files <em>(always listed in stream)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "More comments...",
|
||||
"Save" : "Save",
|
||||
"Allowed characters {count} of {max}" : "Allowed characters {count} of {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Error occurred while retrieving comment with id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Error occurred while updating comment with id {id}",
|
||||
"Error occurred while posting comment" : "Error occurred while posting comment",
|
||||
"{count} unread comments" : "{count} unread comments",
|
||||
"Comment" : "Comment",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Comments</strong> for files <em>(always listed in stream)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Lisää kommentteja...",
|
||||
"Save" : "Tallenna",
|
||||
"Allowed characters {count} of {max}" : "Sallittujen merkkien määrä {count}/{max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Virhe noutaessa kommenttia tunnisteella {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Virhe päivittäessä kommenttia tunnisteella {id}",
|
||||
"Error occurred while posting comment" : "Virhe kommenttia lähettäessä",
|
||||
"{count} unread comments" : "{count} lukematonta kommenttia",
|
||||
"Comment" : "Kommentti",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Kommentit</strong> tiedostoille <em>(aina listattu luettelossa)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Lisää kommentteja...",
|
||||
"Save" : "Tallenna",
|
||||
"Allowed characters {count} of {max}" : "Sallittujen merkkien määrä {count}/{max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Virhe noutaessa kommenttia tunnisteella {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Virhe päivittäessä kommenttia tunnisteella {id}",
|
||||
"Error occurred while posting comment" : "Virhe kommenttia lähettäessä",
|
||||
"{count} unread comments" : "{count} lukematonta kommenttia",
|
||||
"Comment" : "Kommentti",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Kommentit</strong> tiedostoille <em>(aina listattu luettelossa)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Plus de commentaires...",
|
||||
"Save" : "Enregistrer",
|
||||
"Allowed characters {count} of {max}" : "{count} sur {max} caractères autorisés",
|
||||
"Error occurred while retrieving comment with id {id}" : "Une erreur est survenue lors de la récupération du commentaire avec l'id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Une erreur est survenue lors de la mise à jour du commentaire avec l'id {id}",
|
||||
"Error occurred while posting comment" : "Une erreur est survenue lors de l'envoi du commentaire",
|
||||
"{count} unread comments" : "{count} commentaires non lus",
|
||||
"Comment" : "Commenter",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Commentaires</strong> pour les fichiers <em>(toujours listés dans le flux)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Plus de commentaires...",
|
||||
"Save" : "Enregistrer",
|
||||
"Allowed characters {count} of {max}" : "{count} sur {max} caractères autorisés",
|
||||
"Error occurred while retrieving comment with id {id}" : "Une erreur est survenue lors de la récupération du commentaire avec l'id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Une erreur est survenue lors de la mise à jour du commentaire avec l'id {id}",
|
||||
"Error occurred while posting comment" : "Une erreur est survenue lors de l'envoi du commentaire",
|
||||
"{count} unread comments" : "{count} commentaires non lus",
|
||||
"Comment" : "Commenter",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Commentaires</strong> pour les fichiers <em>(toujours listés dans le flux)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "תגובות נוספות...",
|
||||
"Save" : "שמירה",
|
||||
"Allowed characters {count} of {max}" : "תווים מותרים {count} מתוך {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "שגיאה אירעה כאשר אוחזרה תגובה עם מספר זיהוי {id}",
|
||||
"Error occurred while updating comment with id {id}" : "שגיאה אירעה כאשר עודכנה תגובה עם מספר זיהוי {id}",
|
||||
"Error occurred while posting comment" : "אירעה שגיאה בזמן פרסום תגובה",
|
||||
"{count} unread comments" : "{count} תגובות שלא נקראו",
|
||||
"Comment" : "תגובה",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>תגובות</strong> עבור קבצים <em>(תמיד נרשמים בהזרמת מדיה)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "תגובות נוספות...",
|
||||
"Save" : "שמירה",
|
||||
"Allowed characters {count} of {max}" : "תווים מותרים {count} מתוך {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "שגיאה אירעה כאשר אוחזרה תגובה עם מספר זיהוי {id}",
|
||||
"Error occurred while updating comment with id {id}" : "שגיאה אירעה כאשר עודכנה תגובה עם מספר זיהוי {id}",
|
||||
"Error occurred while posting comment" : "אירעה שגיאה בזמן פרסום תגובה",
|
||||
"{count} unread comments" : "{count} תגובות שלא נקראו",
|
||||
"Comment" : "תגובה",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>תגובות</strong> עבור קבצים <em>(תמיד נרשמים בהזרמת מדיה)</em>",
|
||||
|
||||
@@ -3,7 +3,7 @@ OC.L10N.register(
|
||||
{
|
||||
"Type in a new comment..." : "Digita un nuovo commento...",
|
||||
"Delete comment" : "Elimina commento",
|
||||
"Post" : "Post",
|
||||
"Post" : "Pubblica",
|
||||
"Cancel" : "Annulla",
|
||||
"Edit comment" : "Modifica commento",
|
||||
"[Deleted user]" : "[Utente eliminato]",
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Altri commenti...",
|
||||
"Save" : "Salva",
|
||||
"Allowed characters {count} of {max}" : "Caratteri consentiti {count} di {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Si è verificato un errore durante il tentativo di recupero del commento con id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Si è verificato un errore durante il tentativo di aggiornamento del commento con id {id}",
|
||||
"Error occurred while posting comment" : "Si è verificato un errore durante la pubblicazione del commento.",
|
||||
"{count} unread comments" : "{count} commenti non letti",
|
||||
"Comment" : "Commento",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Commenti</strong> sui file <em>(elencati sempre nel flusso)</em>",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{ "translations": {
|
||||
"Type in a new comment..." : "Digita un nuovo commento...",
|
||||
"Delete comment" : "Elimina commento",
|
||||
"Post" : "Post",
|
||||
"Post" : "Pubblica",
|
||||
"Cancel" : "Annulla",
|
||||
"Edit comment" : "Modifica commento",
|
||||
"[Deleted user]" : "[Utente eliminato]",
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Altri commenti...",
|
||||
"Save" : "Salva",
|
||||
"Allowed characters {count} of {max}" : "Caratteri consentiti {count} di {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Si è verificato un errore durante il tentativo di recupero del commento con id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Si è verificato un errore durante il tentativo di aggiornamento del commento con id {id}",
|
||||
"Error occurred while posting comment" : "Si è verificato un errore durante la pubblicazione del commento.",
|
||||
"{count} unread comments" : "{count} commenti non letti",
|
||||
"Comment" : "Commento",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Commenti</strong> sui file <em>(elencati sempre nel flusso)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "コメントをさらに表示...",
|
||||
"Save" : "保存",
|
||||
"Allowed characters {count} of {max}" : "入力文字数 {count} / {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "コメントID {id} のコメントを取得する際にエラーが発生",
|
||||
"Error occurred while updating comment with id {id}" : "コメントID {id} のコメントをアップロードする際にエラーが発生",
|
||||
"Error occurred while posting comment" : "コメント投稿時にエラーが発生",
|
||||
"{count} unread comments" : "未読コメント数 {count}",
|
||||
"Comment" : "コメント",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "ファイルに対する<strong>コメント</strong><em>(常時ストリームに表示)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "コメントをさらに表示...",
|
||||
"Save" : "保存",
|
||||
"Allowed characters {count} of {max}" : "入力文字数 {count} / {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "コメントID {id} のコメントを取得する際にエラーが発生",
|
||||
"Error occurred while updating comment with id {id}" : "コメントID {id} のコメントをアップロードする際にエラーが発生",
|
||||
"Error occurred while posting comment" : "コメント投稿時にエラーが発生",
|
||||
"{count} unread comments" : "未読コメント数 {count}",
|
||||
"Comment" : "コメント",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "ファイルに対する<strong>コメント</strong><em>(常時ストリームに表示)</em>",
|
||||
|
||||
@@ -12,9 +12,15 @@ OC.L10N.register(
|
||||
"More comments..." : "Flere kommentarer..",
|
||||
"Save" : "Lagre",
|
||||
"Allowed characters {count} of {max}" : "Antall tegn tillatt {count} av {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "En feil oppstod ved henting av kommentar med id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "En feil oppstod ved oppdatering av kommentar med id {id}",
|
||||
"Error occurred while posting comment" : "En feil oppstod ved innlegging av kommentar",
|
||||
"{count} unread comments" : "{count} uleste kommentarer",
|
||||
"Comment" : "Kommentar",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Kommentarer</strong> for filer <em>(alltid listet i strømmen)</em>",
|
||||
"You commented" : "Du kommenterte",
|
||||
"%1$s commented" : "%1$s kommentert",
|
||||
"You commented on %2$s" : "Du kommenterte på %2$s",
|
||||
"%1$s commented on %2$s" : "%1$s kommenterte %2$s"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
@@ -10,9 +10,15 @@
|
||||
"More comments..." : "Flere kommentarer..",
|
||||
"Save" : "Lagre",
|
||||
"Allowed characters {count} of {max}" : "Antall tegn tillatt {count} av {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "En feil oppstod ved henting av kommentar med id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "En feil oppstod ved oppdatering av kommentar med id {id}",
|
||||
"Error occurred while posting comment" : "En feil oppstod ved innlegging av kommentar",
|
||||
"{count} unread comments" : "{count} uleste kommentarer",
|
||||
"Comment" : "Kommentar",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Kommentarer</strong> for filer <em>(alltid listet i strømmen)</em>",
|
||||
"You commented" : "Du kommenterte",
|
||||
"%1$s commented" : "%1$s kommentert",
|
||||
"You commented on %2$s" : "Du kommenterte på %2$s",
|
||||
"%1$s commented on %2$s" : "%1$s kommenterte %2$s"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Meer reacties...",
|
||||
"Save" : "Opslaan",
|
||||
"Allowed characters {count} of {max}" : "{count} van de {max} toegestane tekens",
|
||||
"Error occurred while retrieving comment with id {id}" : "Er trad een fout op bij het ophalen van reactie met id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Er trad een fout op bij het bijwerken van reactie met id {id}",
|
||||
"Error occurred while posting comment" : "Er trad een fout op bij het plaatsten van een reactie",
|
||||
"{count} unread comments" : "{count} ongelezen reacties",
|
||||
"Comment" : "Reactie",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Reacties</strong> voor bestanden <em>(altijd getoond in de stroom)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Meer reacties...",
|
||||
"Save" : "Opslaan",
|
||||
"Allowed characters {count} of {max}" : "{count} van de {max} toegestane tekens",
|
||||
"Error occurred while retrieving comment with id {id}" : "Er trad een fout op bij het ophalen van reactie met id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Er trad een fout op bij het bijwerken van reactie met id {id}",
|
||||
"Error occurred while posting comment" : "Er trad een fout op bij het plaatsten van een reactie",
|
||||
"{count} unread comments" : "{count} ongelezen reacties",
|
||||
"Comment" : "Reactie",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Reacties</strong> voor bestanden <em>(altijd getoond in de stroom)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Więcej komentarzy...",
|
||||
"Save" : "Zapisz",
|
||||
"Allowed characters {count} of {max}" : "Dozwolone znaki {count} z {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "W trakcie otrzymywania komentarza o identyfikatorze {id} wystąpił błąd.",
|
||||
"Error occurred while updating comment with id {id}" : "W trakcie aktualizacji komentarza o identyfikatorze {id} wystąpił błąd.",
|
||||
"Error occurred while posting comment" : "Podczas wysyłania komentarza wystąpił błąd",
|
||||
"{count} unread comments" : "{count} nieprzeczytanych komentarzy",
|
||||
"Comment" : "Komentarz",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Komentarze</strong> dla plików <em>(zawsze wypisane w strumieniu)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Więcej komentarzy...",
|
||||
"Save" : "Zapisz",
|
||||
"Allowed characters {count} of {max}" : "Dozwolone znaki {count} z {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "W trakcie otrzymywania komentarza o identyfikatorze {id} wystąpił błąd.",
|
||||
"Error occurred while updating comment with id {id}" : "W trakcie aktualizacji komentarza o identyfikatorze {id} wystąpił błąd.",
|
||||
"Error occurred while posting comment" : "Podczas wysyłania komentarza wystąpił błąd",
|
||||
"{count} unread comments" : "{count} nieprzeczytanych komentarzy",
|
||||
"Comment" : "Komentarz",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Komentarze</strong> dla plików <em>(zawsze wypisane w strumieniu)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Mais comentários...",
|
||||
"Save" : "Salvar",
|
||||
"Allowed characters {count} of {max}" : "Caracteres permitidos {count} de {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Ocorreu um erro ao recuperar comentário com o id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Ocorreu um erro durante a atualização do comentário com o id {id}",
|
||||
"Error occurred while posting comment" : "Ocorreu um erro ao postar o comentário",
|
||||
"{count} unread comments" : "{count} comentários não lidos",
|
||||
"Comment" : "Comentário",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Comemtários</strong> para arquivos <em>(sempre listados no fluxo)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Mais comentários...",
|
||||
"Save" : "Salvar",
|
||||
"Allowed characters {count} of {max}" : "Caracteres permitidos {count} de {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Ocorreu um erro ao recuperar comentário com o id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Ocorreu um erro durante a atualização do comentário com o id {id}",
|
||||
"Error occurred while posting comment" : "Ocorreu um erro ao postar o comentário",
|
||||
"{count} unread comments" : "{count} comentários não lidos",
|
||||
"Comment" : "Comentário",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Comemtários</strong> para arquivos <em>(sempre listados no fluxo)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Mais comentários...",
|
||||
"Save" : "Guardar",
|
||||
"Allowed characters {count} of {max}" : "{count} de {max} caracteres restantes",
|
||||
"Error occurred while retrieving comment with id {id}" : "Ocorreu um erro ao tentar obter o comentário com o id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Ocorreu um erro ao tentar atualizar o comentário com o id {id}",
|
||||
"Error occurred while posting comment" : "Ocorreu um erro ao tentar publicar o comentário",
|
||||
"{count} unread comments" : "{count} comentários não lidos",
|
||||
"Comment" : "Comentário",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Comentários</strong> aos ficheiros <em>(listados sempre na transmissão)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Mais comentários...",
|
||||
"Save" : "Guardar",
|
||||
"Allowed characters {count} of {max}" : "{count} de {max} caracteres restantes",
|
||||
"Error occurred while retrieving comment with id {id}" : "Ocorreu um erro ao tentar obter o comentário com o id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Ocorreu um erro ao tentar atualizar o comentário com o id {id}",
|
||||
"Error occurred while posting comment" : "Ocorreu um erro ao tentar publicar o comentário",
|
||||
"{count} unread comments" : "{count} comentários não lidos",
|
||||
"Comment" : "Comentário",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Comentários</strong> aos ficheiros <em>(listados sempre na transmissão)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Ещё комментарии...",
|
||||
"Save" : "Сохранить",
|
||||
"Allowed characters {count} of {max}" : "Допустимых символов {count} из {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Произошла ошибка при извлечении комментария с id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Произошла ошибка при обновлении комментария с id {id}",
|
||||
"Error occurred while posting comment" : "При сохранении комментария произошла ошибка",
|
||||
"{count} unread comments" : "{count} непрочитанных комментариев",
|
||||
"Comment" : "Коментарий",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Комментарии</strong> к файлам <em>(всегда перечислены в потоке)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Ещё комментарии...",
|
||||
"Save" : "Сохранить",
|
||||
"Allowed characters {count} of {max}" : "Допустимых символов {count} из {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Произошла ошибка при извлечении комментария с id {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Произошла ошибка при обновлении комментария с id {id}",
|
||||
"Error occurred while posting comment" : "При сохранении комментария произошла ошибка",
|
||||
"{count} unread comments" : "{count} непрочитанных комментариев",
|
||||
"Comment" : "Коментарий",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Комментарии</strong> к файлам <em>(всегда перечислены в потоке)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Več opomb ...",
|
||||
"Save" : "Shrani",
|
||||
"Allowed characters {count} of {max}" : "Dovoljeni znaki: {count} od {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Napaka se je zgodila med prenosom komentarja z oznako {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Napaka se je zgodila med posodabljanjem komentarja z oznako {id}",
|
||||
"Error occurred while posting comment" : "Napaka se je zgodila med predajo komentarja",
|
||||
"{count} unread comments" : "{count} neprebranih opomb",
|
||||
"Comment" : "Opomba",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Opombe</strong> k datotekam <em>(vedno pokaži)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Več opomb ...",
|
||||
"Save" : "Shrani",
|
||||
"Allowed characters {count} of {max}" : "Dovoljeni znaki: {count} od {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Napaka se je zgodila med prenosom komentarja z oznako {id}",
|
||||
"Error occurred while updating comment with id {id}" : "Napaka se je zgodila med posodabljanjem komentarja z oznako {id}",
|
||||
"Error occurred while posting comment" : "Napaka se je zgodila med predajo komentarja",
|
||||
"{count} unread comments" : "{count} neprebranih opomb",
|
||||
"Comment" : "Opomba",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Opombe</strong> k datotekam <em>(vedno pokaži)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Më tepër komente…",
|
||||
"Save" : "Ruaje",
|
||||
"Allowed characters {count} of {max}" : "Shenja të lejuara {count} nga {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Ndodhi një gabim teksa merrej komenti me id{id}",
|
||||
"Error occurred while updating comment with id {id}" : "Ndodhi një gabim teksa përditësohej komenti me id{id}",
|
||||
"Error occurred while posting comment" : "Ndodhi një gabim teksa postohej komenti",
|
||||
"{count} unread comments" : "{count} komente të palexuar",
|
||||
"Comment" : "Koment",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Komente</strong> për kartela <em>(përherë të pranishme në rrjedhë)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Më tepër komente…",
|
||||
"Save" : "Ruaje",
|
||||
"Allowed characters {count} of {max}" : "Shenja të lejuara {count} nga {max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "Ndodhi një gabim teksa merrej komenti me id{id}",
|
||||
"Error occurred while updating comment with id {id}" : "Ndodhi një gabim teksa përditësohej komenti me id{id}",
|
||||
"Error occurred while posting comment" : "Ndodhi një gabim teksa postohej komenti",
|
||||
"{count} unread comments" : "{count} komente të palexuar",
|
||||
"Comment" : "Koment",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>Komente</strong> për kartela <em>(përherë të pranishme në rrjedhë)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "ความคิดเห็นอื่นๆ ...",
|
||||
"Save" : "บันทึก",
|
||||
"Allowed characters {count} of {max}" : "อนุญาตให้ใช้ {count} จากทั้งหมด {max} ตัวอักษร",
|
||||
"Error occurred while retrieving comment with id {id}" : "เกิดข้อผิดพลาดขณะดึงข้อมูลความความคิดเห็นของ id {ID}",
|
||||
"Error occurred while updating comment with id {id}" : "เกิดข้อผิดพลาดขณะดึงข้อมูลความความคิดเห็นของ id {ID}",
|
||||
"Error occurred while posting comment" : "มีข้อผิดพลาดเกิดขึ้นในขณะที่โพสต์แสดงความคิดเห็น",
|
||||
"{count} unread comments" : "{count} ความคิดเห็นที่ยังไม่ได้อ่าน",
|
||||
"Comment" : "แสดงความคิดเห็น",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>ความคิดเห็น</strong> สำหรับไฟล์ <em>(ระบุไว้เสมอในสตรีม)</em>",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "ความคิดเห็นอื่นๆ ...",
|
||||
"Save" : "บันทึก",
|
||||
"Allowed characters {count} of {max}" : "อนุญาตให้ใช้ {count} จากทั้งหมด {max} ตัวอักษร",
|
||||
"Error occurred while retrieving comment with id {id}" : "เกิดข้อผิดพลาดขณะดึงข้อมูลความความคิดเห็นของ id {ID}",
|
||||
"Error occurred while updating comment with id {id}" : "เกิดข้อผิดพลาดขณะดึงข้อมูลความความคิดเห็นของ id {ID}",
|
||||
"Error occurred while posting comment" : "มีข้อผิดพลาดเกิดขึ้นในขณะที่โพสต์แสดงความคิดเห็น",
|
||||
"{count} unread comments" : "{count} ความคิดเห็นที่ยังไม่ได้อ่าน",
|
||||
"Comment" : "แสดงความคิดเห็น",
|
||||
"<strong>Comments</strong> for files <em>(always listed in stream)</em>" : "<strong>ความคิดเห็น</strong> สำหรับไฟล์ <em>(ระบุไว้เสมอในสตรีม)</em>",
|
||||
|
||||
@@ -12,6 +12,9 @@ OC.L10N.register(
|
||||
"More comments..." : "Daha fazla yorum...",
|
||||
"Save" : "Kaydet",
|
||||
"Allowed characters {count} of {max}" : "İzin verilen karakterler {count}/{max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "id {id} ile yorum alınırken hata oluştu",
|
||||
"Error occurred while updating comment with id {id}" : "id {id} ile yorumu güncellerken hata oluştu",
|
||||
"Error occurred while posting comment" : "Yorum gönderilirken hata oluştu",
|
||||
"{count} unread comments" : "{count} okunmamış yorum",
|
||||
"Comment" : "Yorum",
|
||||
"You commented" : "Yorum yaptınız",
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
"More comments..." : "Daha fazla yorum...",
|
||||
"Save" : "Kaydet",
|
||||
"Allowed characters {count} of {max}" : "İzin verilen karakterler {count}/{max}",
|
||||
"Error occurred while retrieving comment with id {id}" : "id {id} ile yorum alınırken hata oluştu",
|
||||
"Error occurred while updating comment with id {id}" : "id {id} ile yorumu güncellerken hata oluştu",
|
||||
"Error occurred while posting comment" : "Yorum gönderilirken hata oluştu",
|
||||
"{count} unread comments" : "{count} okunmamış yorum",
|
||||
"Comment" : "Yorum",
|
||||
"You commented" : "Yorum yaptınız",
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<description>ownCloud WebDAV endpoint</description>
|
||||
<licence>AGPL</licence>
|
||||
<author>owncloud.org</author>
|
||||
<version>0.2.5</version>
|
||||
<version>0.2.6</version>
|
||||
<default_enable/>
|
||||
<types>
|
||||
<filesystem/>
|
||||
|
||||
@@ -114,7 +114,7 @@ class Application extends App {
|
||||
/** @var IAppContainer $c */
|
||||
return new Classification(
|
||||
$c->query('CalDavBackend'),
|
||||
$c->getServer()->getUserManager()
|
||||
$c->getServer()->getDatabaseConnection()
|
||||
);
|
||||
});
|
||||
|
||||
|
||||
@@ -1079,22 +1079,27 @@ class CalDavBackend extends AbstractBackend implements SyncSupport, Subscription
|
||||
'lastmodified' => time(),
|
||||
];
|
||||
|
||||
foreach($this->subscriptionPropertyMap as $xmlName=>$dbName) {
|
||||
if (isset($properties[$xmlName])) {
|
||||
$propertiesBoolean = ['striptodos', 'stripalarms', 'stripattachments'];
|
||||
|
||||
foreach($this->subscriptionPropertyMap as $xmlName=>$dbName) {
|
||||
if (array_key_exists($xmlName, $properties)) {
|
||||
$values[$dbName] = $properties[$xmlName];
|
||||
$fieldNames[] = $dbName;
|
||||
if (in_array($dbName, $propertiesBoolean)) {
|
||||
$values[$dbName] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$valuesToInsert = array();
|
||||
|
||||
$query = $this->db->getQueryBuilder();
|
||||
|
||||
foreach (array_keys($values) as $name) {
|
||||
$valuesToInsert[$name] = $query->createNamedParameter($values[$name]);
|
||||
}
|
||||
|
||||
$query->insert('calendarsubscriptions')
|
||||
->values([
|
||||
'principaluri' => $query->createNamedParameter($values['principaluri']),
|
||||
'uri' => $query->createNamedParameter($values['uri']),
|
||||
'source' => $query->createNamedParameter($values['source']),
|
||||
'lastmodified' => $query->createNamedParameter($values['lastmodified']),
|
||||
])
|
||||
->values($valuesToInsert)
|
||||
->execute();
|
||||
|
||||
return $this->db->lastInsertId('*PREFIX*calendarsubscriptions');
|
||||
|
||||
@@ -848,7 +848,7 @@ class CardDavBackend implements BackendInterface, SyncSupport {
|
||||
$query = $this->db->getQueryBuilder();
|
||||
$query->select('*')->from($this->dbCardsTable)
|
||||
->where($query->expr()->eq('uri', $query->createNamedParameter($uri)))
|
||||
->where($query->expr()->eq('addressbookid', $query->createNamedParameter($addressBookId)));
|
||||
->andWhere($query->expr()->eq('addressbookid', $query->createNamedParameter($addressBookId)));
|
||||
$queryResult = $query->execute();
|
||||
$contact = $queryResult->fetch();
|
||||
$queryResult->closeCursor();
|
||||
|
||||
@@ -161,7 +161,7 @@ class Converter {
|
||||
*/
|
||||
private function getAvatarImage(IUser $user) {
|
||||
try {
|
||||
$image = $user->getAvatarImage(-1);
|
||||
$image = $user->getAvatarImage(96);
|
||||
return $image;
|
||||
} catch (\Exception $ex) {
|
||||
return null;
|
||||
|
||||
@@ -108,8 +108,18 @@ class ImageExportPlugin extends ServerPlugin {
|
||||
$photo = $vObject->PHOTO;
|
||||
$type = $this->getType($photo);
|
||||
|
||||
$valType = $photo->getValueType();
|
||||
$val = ($valType === 'URI' ? $photo->getRawMimeDirValue() : $photo->getValue());
|
||||
$val = $photo->getValue();
|
||||
if ($photo->getValueType() === 'URI') {
|
||||
$parsed = \Sabre\URI\parse($val);
|
||||
//only allow data://
|
||||
if ($parsed['scheme'] !== 'data') {
|
||||
return false;
|
||||
}
|
||||
if (substr_count($parsed['path'], ';') === 1) {
|
||||
list($type,) = explode(';', $parsed['path']);
|
||||
}
|
||||
$val = file_get_contents($val);
|
||||
}
|
||||
return [
|
||||
'Content-Type' => $type,
|
||||
'body' => $val
|
||||
|
||||
@@ -185,7 +185,7 @@ class CommentNode implements \Sabre\DAV\INode, \Sabre\DAV\IProperties {
|
||||
$msg = 'Message exceeds allowed character limit of ';
|
||||
throw new BadRequest($msg . IComment::MAX_MESSAGE_LENGTH, 0, $e);
|
||||
}
|
||||
return false;
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -98,7 +98,7 @@ class PublicAuth extends AbstractBasic {
|
||||
if ($this->shareManager->checkPassword($share, $password)) {
|
||||
return true;
|
||||
} else if ($this->session->exists('public_link_authenticated')
|
||||
&& $this->session->get('public_link_authenticated') === $share->getId()) {
|
||||
&& $this->session->get('public_link_authenticated') === (string)$share->getId()) {
|
||||
return true;
|
||||
} else {
|
||||
if (in_array('XMLHttpRequest', explode(',', $this->request->getHeader('X-Requested-With')))) {
|
||||
|
||||
@@ -42,6 +42,8 @@ class ExceptionLoggerPlugin extends \Sabre\DAV\ServerPlugin {
|
||||
// forbidden can be expected when trying to upload to
|
||||
// read-only folders for example
|
||||
'Sabre\DAV\Exception\Forbidden' => true,
|
||||
// Custom exception similar to NotAuthenticated
|
||||
'OCA\DAV\Connector\Sabre\Exception\PasswordLoginForbidden' => true,
|
||||
);
|
||||
|
||||
/** @var string */
|
||||
|
||||
@@ -308,15 +308,10 @@ class FilesPlugin extends ServerPlugin {
|
||||
$displayName = $owner->getDisplayName();
|
||||
return $displayName;
|
||||
});
|
||||
|
||||
$propFind->handle(self::DATA_FINGERPRINT_PROPERTYNAME, function() use ($node) {
|
||||
if ($node->getPath() === '/') {
|
||||
return $this->config->getSystemValue('data-fingerprint', '');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if ($node instanceof \OCA\DAV\Files\FilesHome) {
|
||||
if ($node instanceof \OCA\DAV\Connector\Sabre\Node
|
||||
|| $node instanceof \OCA\DAV\Files\FilesHome) {
|
||||
$propFind->handle(self::DATA_FINGERPRINT_PROPERTYNAME, function() use ($node) {
|
||||
return $this->config->getSystemValue('data-fingerprint', '');
|
||||
});
|
||||
|
||||
@@ -283,6 +283,11 @@ class ObjectTree extends \Sabre\DAV\Tree {
|
||||
throw new InvalidPath($ex->getMessage());
|
||||
}
|
||||
|
||||
// Webdav's copy will implicitly do a delete+create, so only create+delete permissions are required
|
||||
if (!$this->fileView->isCreatable($destinationDir)) {
|
||||
throw new \Sabre\DAV\Exception\Forbidden();
|
||||
}
|
||||
|
||||
try {
|
||||
$this->fileView->copy($source, $destination);
|
||||
} catch (StorageNotAvailableException $e) {
|
||||
|
||||
@@ -23,8 +23,7 @@
|
||||
namespace OCA\DAV\Migration;
|
||||
|
||||
use OCA\DAV\CalDAV\CalDavBackend;
|
||||
use OCP\IUser;
|
||||
use OCP\IUserManager;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\Migration\IOutput;
|
||||
use OCP\Migration\IRepairStep;
|
||||
|
||||
@@ -33,33 +32,19 @@ class Classification implements IRepairStep {
|
||||
/** @var CalDavBackend */
|
||||
private $calDavBackend;
|
||||
|
||||
/** @var IUserManager */
|
||||
private $userManager;
|
||||
/** @var IDBConnection */
|
||||
private $connection;
|
||||
|
||||
/**
|
||||
* Classification constructor.
|
||||
*
|
||||
* @param CalDavBackend $calDavBackend
|
||||
* @param IDBConnection $connection
|
||||
*/
|
||||
public function __construct(CalDavBackend $calDavBackend, IUserManager $userManager) {
|
||||
public function __construct(CalDavBackend $calDavBackend, IDBConnection $connection) {
|
||||
$this->calDavBackend = $calDavBackend;
|
||||
$this->userManager = $userManager;
|
||||
}
|
||||
$this->connection = $connection;
|
||||
|
||||
/**
|
||||
* @param IUser $user
|
||||
*/
|
||||
public function runForUser($user) {
|
||||
$principal = 'principals/users/' . $user->getUID();
|
||||
$calendars = $this->calDavBackend->getCalendarsForUser($principal);
|
||||
foreach ($calendars as $calendar) {
|
||||
$objects = $this->calDavBackend->getCalendarObjects($calendar['id']);
|
||||
foreach ($objects as $object) {
|
||||
$calObject = $this->calDavBackend->getCalendarObject($calendar['id'], $object['uri']);
|
||||
$classification = $this->extractClassification($calObject['calendardata']);
|
||||
$this->calDavBackend->setClassification($object['id'], $classification);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -82,12 +67,37 @@ class Classification implements IRepairStep {
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function run(IOutput $output) {
|
||||
$output->startProgress();
|
||||
$this->userManager->callForAllUsers(function($user) use ($output) {
|
||||
/** @var IUser $user */
|
||||
$output->advance(1, $user->getDisplayName());
|
||||
$this->runForUser($user);
|
||||
});
|
||||
$qb = $this->connection->getQueryBuilder();
|
||||
$result = $qb->select($qb->createFunction('COUNT(*)'))
|
||||
->from('calendarobjects')
|
||||
->execute();
|
||||
|
||||
$max = $result->fetchColumn();
|
||||
$output->startProgress($max);
|
||||
|
||||
$query = $this->connection->getQueryBuilder();
|
||||
$query->select(['id', 'calendardata', 'classification'])
|
||||
->from('calendarobjects');
|
||||
|
||||
$stmt = $query->execute();
|
||||
|
||||
while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
|
||||
|
||||
$output->advance(1);
|
||||
|
||||
$classification = $this->extractClassification($this->readBlob($row['calendardata']));
|
||||
$this->calDavBackend->setClassification($row['id'], $classification);
|
||||
}
|
||||
|
||||
$output->finishProgress();
|
||||
}
|
||||
|
||||
private function readBlob($cardData) {
|
||||
if (is_resource($cardData)) {
|
||||
return stream_get_contents($cardData);
|
||||
}
|
||||
|
||||
return $cardData;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -66,13 +66,16 @@ class Server {
|
||||
$this->server->setBaseUri($this->baseUri);
|
||||
|
||||
$this->server->addPlugin(new BlockLegacyClientPlugin(\OC::$server->getConfig()));
|
||||
$authPlugin = new Plugin($authBackend, 'ownCloud');
|
||||
$authPlugin = new Plugin();
|
||||
$this->server->addPlugin($authPlugin);
|
||||
|
||||
// allow setup of additional auth backends
|
||||
$event = new SabrePluginEvent($this->server);
|
||||
$dispatcher->dispatch('OCA\DAV\Connector\Sabre::authInit', $event);
|
||||
|
||||
// because we are throwing exceptions this plugin has to be the last one
|
||||
$authPlugin->addBackend($authBackend);
|
||||
|
||||
// debugging
|
||||
if(\OC::$server->getConfig()->getSystemValue('debug', false)) {
|
||||
$this->server->addPlugin(new \Sabre\DAV\Browser\Plugin());
|
||||
@@ -158,6 +161,9 @@ class Server {
|
||||
)
|
||||
)
|
||||
);
|
||||
$this->server->addPlugin(
|
||||
new \OCA\DAV\Connector\Sabre\QuotaPlugin($view));
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -48,6 +48,9 @@ class AssemblyStream implements \Icewind\Streams\File {
|
||||
/** @var int */
|
||||
private $size;
|
||||
|
||||
/** @var resource */
|
||||
private $currentStream = null;
|
||||
|
||||
/**
|
||||
* @param string $path
|
||||
* @param string $mode
|
||||
@@ -100,16 +103,36 @@ class AssemblyStream implements \Icewind\Streams\File {
|
||||
* @return string
|
||||
*/
|
||||
public function stream_read($count) {
|
||||
do {
|
||||
if ($this->currentStream === null) {
|
||||
list($node, $posInNode) = $this->getNodeForPosition($this->pos);
|
||||
if (is_null($node)) {
|
||||
// reached last node, no more data
|
||||
return '';
|
||||
}
|
||||
$this->currentStream = $this->getStream($node);
|
||||
fseek($this->currentStream, $posInNode);
|
||||
}
|
||||
|
||||
list($node, $posInNode) = $this->getNodeForPosition($this->pos);
|
||||
if (is_null($node)) {
|
||||
return null;
|
||||
}
|
||||
$stream = $this->getStream($node);
|
||||
$data = fread($this->currentStream, $count);
|
||||
// isset is faster than strlen
|
||||
if (isset($data[$count - 1])) {
|
||||
// we read the full count
|
||||
$read = $count;
|
||||
} else {
|
||||
// reaching end of stream, which happens less often so strlen is ok
|
||||
$read = strlen($data);
|
||||
}
|
||||
|
||||
fseek($stream, $posInNode);
|
||||
$data = fread($stream, $count);
|
||||
$read = strlen($data);
|
||||
if (feof($this->currentStream)) {
|
||||
fclose($this->currentStream);
|
||||
$this->currentNode = null;
|
||||
$this->currentStream = null;
|
||||
}
|
||||
// if no data read, try again with the next node because
|
||||
// returning empty data can make the caller think there is no more
|
||||
// data left to read
|
||||
} while ($read === 0);
|
||||
|
||||
// update position
|
||||
$this->pos += $read;
|
||||
|
||||
@@ -3,12 +3,12 @@ SCRIPT=`realpath $0`
|
||||
SCRIPTPATH=`dirname $SCRIPT`
|
||||
|
||||
|
||||
if [ ! -f CalDAVTester/run.py ]; then
|
||||
cd "$SCRIPTPATH"
|
||||
git clone https://github.com/DeepDiver1975/CalDAVTester.git
|
||||
cd "$SCRIPTPATH/CalDAVTester"
|
||||
python run.py -s
|
||||
cd "$SCRIPTPATH"
|
||||
cd "$SCRIPTPATH"
|
||||
if [ ! -f CalDAVTester/testcaldav.py ]; then
|
||||
git clone https://github.com/apple/ccs-caldavtester.git CalDAVTester
|
||||
fi
|
||||
if [ ! -f pycalendar/setup.py ]; then
|
||||
git clone https://github.com/apple/ccs-pycalendar.git pycalendar
|
||||
fi
|
||||
|
||||
# create test user
|
||||
|
||||
@@ -3,12 +3,12 @@ SCRIPT=`realpath $0`
|
||||
SCRIPTPATH=`dirname $SCRIPT`
|
||||
|
||||
|
||||
if [ ! -f CalDAVTester/run.py ]; then
|
||||
cd "$SCRIPTPATH"
|
||||
git clone https://github.com/DeepDiver1975/CalDAVTester.git
|
||||
cd "$SCRIPTPATH/CalDAVTester"
|
||||
python run.py -s
|
||||
cd "$SCRIPTPATH"
|
||||
cd "$SCRIPTPATH"
|
||||
if [ ! -f CalDAVTester/testcaldav.py ]; then
|
||||
git clone https://github.com/apple/ccs-caldavtester.git CalDAVTester
|
||||
fi
|
||||
if [ ! -f pycalendar/setup.py ]; then
|
||||
git clone https://github.com/apple/ccs-pycalendar.git pycalendar
|
||||
fi
|
||||
|
||||
# create test user
|
||||
|
||||
@@ -333,15 +333,20 @@ EOD;
|
||||
|
||||
public function testSubscriptions() {
|
||||
$id = $this->backend->createSubscription(self::UNIT_TEST_USER, 'Subscription', [
|
||||
'{http://calendarserver.org/ns/}source' => new Href('test-source')
|
||||
'{http://calendarserver.org/ns/}source' => new Href('test-source'),
|
||||
'{http://apple.com/ns/ical/}calendar-color' => '#1C4587',
|
||||
'{http://calendarserver.org/ns/}subscribed-strip-todos' => ''
|
||||
]);
|
||||
|
||||
$subscriptions = $this->backend->getSubscriptionsForUser(self::UNIT_TEST_USER);
|
||||
$this->assertEquals(1, count($subscriptions));
|
||||
$this->assertEquals('#1C4587', $subscriptions[0]['{http://apple.com/ns/ical/}calendar-color']);
|
||||
$this->assertEquals(true, $subscriptions[0]['{http://calendarserver.org/ns/}subscribed-strip-todos']);
|
||||
$this->assertEquals($id, $subscriptions[0]['id']);
|
||||
|
||||
$patch = new PropPatch([
|
||||
'{DAV:}displayname' => 'Unit test',
|
||||
'{http://apple.com/ns/ical/}calendar-color' => '#ac0606',
|
||||
]);
|
||||
$this->backend->updateSubscription($id, $patch);
|
||||
$patch->commit();
|
||||
@@ -350,6 +355,7 @@ EOD;
|
||||
$this->assertEquals(1, count($subscriptions));
|
||||
$this->assertEquals($id, $subscriptions[0]['id']);
|
||||
$this->assertEquals('Unit test', $subscriptions[0]['{DAV:}displayname']);
|
||||
$this->assertEquals('#ac0606', $subscriptions[0]['{http://apple.com/ns/ical/}calendar-color']);
|
||||
|
||||
$this->backend->deleteSubscription($id);
|
||||
$subscriptions = $this->backend->getSubscriptionsForUser(self::UNIT_TEST_USER);
|
||||
|
||||
@@ -606,6 +606,10 @@ class CardDavBackendTest extends TestCase {
|
||||
$this->assertSame(5489543, (int)$result['lastmodified']);
|
||||
$this->assertSame('etag0', $result['etag']);
|
||||
$this->assertSame(120, (int)$result['size']);
|
||||
|
||||
// this shouldn't return any result because 'uri1' is in address book 1
|
||||
$result = $this->backend->getContact(0, 'uri1');
|
||||
$this->assertEmpty($result);
|
||||
}
|
||||
|
||||
public function testGetContactFail() {
|
||||
|
||||
@@ -140,12 +140,9 @@ class ImageExportPluginTest extends TestCase {
|
||||
'empty vcard' => [false, ''],
|
||||
'vcard without PHOTO' => [false, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nEND:VCARD\r\n"],
|
||||
'vcard 3 with PHOTO' => [['Content-Type' => 'image/jpeg', 'body' => '12345'], "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;ENCODING=b;TYPE=JPEG:MTIzNDU=\r\nEND:VCARD\r\n"],
|
||||
//
|
||||
// TODO: these three below are not working - needs debugging
|
||||
//
|
||||
//'vcard 3 with PHOTO URL' => [['Content-Type' => 'image/jpeg', 'body' => '12345'], "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;TYPE=JPEG:http://example.org/photo.jpg\r\nEND:VCARD\r\n"],
|
||||
//'vcard 4 with PHOTO' => [['Content-Type' => 'image/jpeg', 'body' => '12345'], "BEGIN:VCARD\r\nVERSION:4.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO:data:image/jpeg;MTIzNDU=\r\nEND:VCARD\r\n"],
|
||||
'vcard 4 with PHOTO URL' => [['Content-Type' => 'image/jpeg', 'body' => 'http://example.org/photo.jpg'], "BEGIN:VCARD\r\nVERSION:4.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;MEDIATYPE=image/jpeg:http://example.org/photo.jpg\r\nEND:VCARD\r\n"],
|
||||
'vcard 3 with PHOTO URL' => [false, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;TYPE=JPEG;VALUE=URI:http://example.com/photo.jpg\r\nEND:VCARD\r\n"],
|
||||
'vcard 4 with PHOTO' => [['Content-Type' => 'image/jpeg', 'body' => '12345'], "BEGIN:VCARD\r\nVERSION:4.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO:data:image/jpeg;base64,MTIzNDU=\r\nEND:VCARD\r\n"],
|
||||
'vcard 4 with PHOTO URL' => [false, "BEGIN:VCARD\r\nVERSION:4.0\r\nPRODID:-//Sabre//Sabre VObject 3.5.0//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nPHOTO;MEDIATYPE=image/jpeg:http://example.org/photo.jpg\r\nEND:VCARD\r\n"],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -166,6 +166,10 @@ class CommentsNodeTest extends \Test\TestCase {
|
||||
$this->assertTrue($this->node->updateComment($msg));
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException Exception
|
||||
* @expectedExceptionMessage buh!
|
||||
*/
|
||||
public function testUpdateCommentLogException() {
|
||||
$msg = null;
|
||||
|
||||
@@ -198,7 +202,7 @@ class CommentsNodeTest extends \Test\TestCase {
|
||||
$this->logger->expects($this->once())
|
||||
->method('logException');
|
||||
|
||||
$this->assertFalse($this->node->updateComment($msg));
|
||||
$this->node->updateComment($msg);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -191,7 +191,8 @@ class FilesPluginTest extends TestCase {
|
||||
$this->assertEquals('http://example.com/', $propFind->get(self::DOWNLOADURL_PROPERTYNAME));
|
||||
$this->assertEquals('foo', $propFind->get(self::OWNER_ID_PROPERTYNAME));
|
||||
$this->assertEquals('M. Foo', $propFind->get(self::OWNER_DISPLAY_NAME_PROPERTYNAME));
|
||||
$this->assertEquals([self::SIZE_PROPERTYNAME, self::DATA_FINGERPRINT_PROPERTYNAME], $propFind->get404Properties());
|
||||
$this->assertEquals('my_fingerprint', $propFind->get(self::DATA_FINGERPRINT_PROPERTYNAME));
|
||||
$this->assertEquals([self::SIZE_PROPERTYNAME], $propFind->get404Properties());
|
||||
}
|
||||
|
||||
public function testGetPropertiesForFileHome() {
|
||||
@@ -332,7 +333,8 @@ class FilesPluginTest extends TestCase {
|
||||
$this->assertEquals(1025, $propFind->get(self::SIZE_PROPERTYNAME));
|
||||
$this->assertEquals('DWCKMSR', $propFind->get(self::PERMISSIONS_PROPERTYNAME));
|
||||
$this->assertEquals(null, $propFind->get(self::DOWNLOADURL_PROPERTYNAME));
|
||||
$this->assertEquals([self::DOWNLOADURL_PROPERTYNAME, self::DATA_FINGERPRINT_PROPERTYNAME], $propFind->get404Properties());
|
||||
$this->assertEquals('my_fingerprint', $propFind->get(self::DATA_FINGERPRINT_PROPERTYNAME));
|
||||
$this->assertEquals([self::DOWNLOADURL_PROPERTYNAME], $propFind->get404Properties());
|
||||
}
|
||||
|
||||
public function testGetPropertiesForRootDirectory() {
|
||||
|
||||
@@ -142,6 +142,88 @@ class ObjectTreeTest extends \Test\TestCase {
|
||||
$objectTree->move($source, $destination);
|
||||
}
|
||||
|
||||
public function copyDataProvider() {
|
||||
return [
|
||||
// copy into same dir
|
||||
['a', 'b', ''],
|
||||
// copy into same dir
|
||||
['a/a', 'a/b', 'a'],
|
||||
// copy into another dir
|
||||
['a', 'sub/a', 'sub'],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider copyDataProvider
|
||||
*/
|
||||
public function testCopy($sourcePath, $targetPath, $targetParent) {
|
||||
$view = $this->getMock('\OC\Files\View');
|
||||
$view->expects($this->once())
|
||||
->method('verifyPath')
|
||||
->with($targetParent)
|
||||
->will($this->returnValue(true));
|
||||
$view->expects($this->once())
|
||||
->method('isCreatable')
|
||||
->with($targetParent)
|
||||
->will($this->returnValue(true));
|
||||
$view->expects($this->once())
|
||||
->method('copy')
|
||||
->with($sourcePath, $targetPath)
|
||||
->will($this->returnValue(true));
|
||||
|
||||
$info = new FileInfo('', null, null, array(), null);
|
||||
|
||||
$rootDir = new \OCA\DAV\Connector\Sabre\Directory($view, $info);
|
||||
$objectTree = $this->getMock('\OCA\DAV\Connector\Sabre\ObjectTree',
|
||||
array('nodeExists', 'getNodeForPath'),
|
||||
array($rootDir, $view));
|
||||
|
||||
$objectTree->expects($this->once())
|
||||
->method('getNodeForPath')
|
||||
->with($this->identicalTo($sourcePath))
|
||||
->will($this->returnValue(false));
|
||||
|
||||
/** @var $objectTree \OCA\DAV\Connector\Sabre\ObjectTree */
|
||||
$mountManager = \OC\Files\Filesystem::getMountManager();
|
||||
$objectTree->init($rootDir, $view, $mountManager);
|
||||
$objectTree->copy($sourcePath, $targetPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider copyDataProvider
|
||||
* @expectedException \Sabre\DAV\Exception\Forbidden
|
||||
*/
|
||||
public function testCopyFailNotCreatable($sourcePath, $targetPath, $targetParent) {
|
||||
$view = $this->getMock('\OC\Files\View');
|
||||
$view->expects($this->once())
|
||||
->method('verifyPath')
|
||||
->with($targetParent)
|
||||
->will($this->returnValue(true));
|
||||
$view->expects($this->once())
|
||||
->method('isCreatable')
|
||||
->with($targetParent)
|
||||
->will($this->returnValue(false));
|
||||
$view->expects($this->never())
|
||||
->method('copy');
|
||||
|
||||
$info = new FileInfo('', null, null, array(), null);
|
||||
|
||||
$rootDir = new \OCA\DAV\Connector\Sabre\Directory($view, $info);
|
||||
$objectTree = $this->getMock('\OCA\DAV\Connector\Sabre\ObjectTree',
|
||||
array('nodeExists', 'getNodeForPath'),
|
||||
array($rootDir, $view));
|
||||
|
||||
$objectTree->expects($this->once())
|
||||
->method('getNodeForPath')
|
||||
->with($this->identicalTo($sourcePath))
|
||||
->will($this->returnValue(false));
|
||||
|
||||
/** @var $objectTree \OCA\DAV\Connector\Sabre\ObjectTree */
|
||||
$mountManager = \OC\Files\Filesystem::getMountManager();
|
||||
$objectTree->init($rootDir, $view, $mountManager);
|
||||
$objectTree->copy($sourcePath, $targetPath);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider nodeForPathProvider
|
||||
*/
|
||||
|
||||
@@ -1,75 +0,0 @@
|
||||
<?php
|
||||
/**
|
||||
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
||||
*
|
||||
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
||||
* @license AGPL-3.0
|
||||
*
|
||||
* This code is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3,
|
||||
* as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OCA\DAV\Tests\unit\DAV\Migration;
|
||||
|
||||
use OCA\DAV\CalDAV\CalDavBackend;
|
||||
use OCA\DAV\Migration\Classification;
|
||||
use OCA\DAV\Tests\unit\CalDAV\AbstractCalDavBackendTest;
|
||||
use OCP\IUser;
|
||||
|
||||
/**
|
||||
* Class ClassificationTest
|
||||
*
|
||||
* @group DB
|
||||
*
|
||||
* @package OCA\DAV\Tests\unit\DAV
|
||||
*/
|
||||
class ClassificationTest extends AbstractCalDavBackendTest {
|
||||
|
||||
/** @var \PHPUnit_Framework_MockObject_MockObject | \OCP\IUserManager */
|
||||
private $userManager;
|
||||
|
||||
public function setUp() {
|
||||
parent::setUp();
|
||||
|
||||
$this->userManager = $this->getMockBuilder('OCP\IUserManager')
|
||||
->disableOriginalConstructor()->getMock();
|
||||
}
|
||||
|
||||
public function test() {
|
||||
// setup data
|
||||
$calendarId = $this->createTestCalendar();
|
||||
$eventUri = $this->createEvent($calendarId, '20130912T130000Z', '20130912T140000Z');
|
||||
$object = $this->backend->getCalendarObject($calendarId, $eventUri);
|
||||
|
||||
// assert proper classification
|
||||
$this->assertEquals(CalDavBackend::CLASSIFICATION_PUBLIC, $object['classification']);
|
||||
$this->backend->setClassification($object['id'], CalDavBackend::CLASSIFICATION_CONFIDENTIAL);
|
||||
$object = $this->backend->getCalendarObject($calendarId, $eventUri);
|
||||
$this->assertEquals(CalDavBackend::CLASSIFICATION_CONFIDENTIAL, $object['classification']);
|
||||
|
||||
// run migration
|
||||
$c = new Classification($this->backend, $this->userManager);
|
||||
|
||||
/** @var IUser | \PHPUnit_Framework_MockObject_MockObject $user */
|
||||
$user = $this->getMockBuilder('OCP\IUser')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
$user->expects($this->once())->method('getUID')->willReturn('caldav-unit-test');
|
||||
|
||||
$c->runForUser($user);
|
||||
|
||||
// assert classification after migration
|
||||
$object = $this->backend->getCalendarObject($calendarId, $eventUri);
|
||||
$this->assertEquals(CalDavBackend::CLASSIFICATION_PUBLIC, $object['classification']);
|
||||
}
|
||||
}
|
||||
@@ -32,18 +32,78 @@ class AssemblyStreamTest extends \Test\TestCase {
|
||||
$this->assertEquals($expected, $content);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider providesNodes()
|
||||
*/
|
||||
public function testGetContentsFread($expected, $nodes) {
|
||||
$stream = \OCA\DAV\Upload\AssemblyStream::wrap($nodes);
|
||||
|
||||
$content = '';
|
||||
while (!feof($stream)) {
|
||||
$content .= fread($stream, 3);
|
||||
}
|
||||
|
||||
$this->assertEquals($expected, $content);
|
||||
}
|
||||
|
||||
function providesNodes() {
|
||||
$data8k = $this->makeData(8192);
|
||||
$dataLess8k = $this->makeData(8191);
|
||||
return[
|
||||
'one node only' => ['1234567890', [
|
||||
'one node zero bytes' => [
|
||||
'', [
|
||||
$this->buildNode('0', '')
|
||||
]],
|
||||
'one node only' => [
|
||||
'1234567890', [
|
||||
$this->buildNode('0', '1234567890')
|
||||
]],
|
||||
'two nodes' => ['1234567890', [
|
||||
'one node buffer boundary' => [
|
||||
$data8k, [
|
||||
$this->buildNode('0', $data8k)
|
||||
]],
|
||||
'two nodes' => [
|
||||
'1234567890', [
|
||||
$this->buildNode('1', '67890'),
|
||||
$this->buildNode('0', '12345')
|
||||
]]
|
||||
]],
|
||||
'two nodes end on buffer boundary' => [
|
||||
$data8k . $data8k, [
|
||||
$this->buildNode('1', $data8k),
|
||||
$this->buildNode('0', $data8k)
|
||||
]],
|
||||
'two nodes with one on buffer boundary' => [
|
||||
$data8k . $dataLess8k, [
|
||||
$this->buildNode('1', $dataLess8k),
|
||||
$this->buildNode('0', $data8k)
|
||||
]],
|
||||
'two nodes on buffer boundary plus one byte' => [
|
||||
$data8k . 'X' . $data8k, [
|
||||
$this->buildNode('1', $data8k),
|
||||
$this->buildNode('0', $data8k . 'X')
|
||||
]],
|
||||
'two nodes on buffer boundary plus one byte at the end' => [
|
||||
$data8k . $data8k . 'X', [
|
||||
$this->buildNode('1', $data8k . 'X'),
|
||||
$this->buildNode('0', $data8k)
|
||||
]],
|
||||
];
|
||||
}
|
||||
|
||||
private function makeData($count) {
|
||||
$data = '';
|
||||
$base = '1234567890';
|
||||
$j = 0;
|
||||
for ($i = 0; $i < $count; $i++) {
|
||||
$data .= $base[$j];
|
||||
$j++;
|
||||
if (!isset($base[$j])) {
|
||||
$j = 0;
|
||||
}
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
private function buildNode($name, $data) {
|
||||
$node = $this->getMockBuilder('\Sabre\DAV\File')
|
||||
->setMethods(['getName', 'get', 'getSize'])
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
OC.L10N.register(
|
||||
"federatedfilesharing",
|
||||
{
|
||||
"Sharing %s failed, because this item is already shared with %s" : "Compartir %s falló, porque esti elementu yá ta compartiéndose con %s"
|
||||
"Invalid Federated Cloud ID" : "Inválidu ID de Ñube Federada",
|
||||
"Sharing %s failed, because this item is already shared with %s" : "Compartir %s falló, porque esti elementu yá ta compartiéndose con %s",
|
||||
"Not allowed to create a federated share with the same user" : "Nun s'almite crear un recursu compartíu federáu col mesmu usuariu",
|
||||
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Compartir %s falló, nun pudo atopase %s, pue qu'el servidor nun seya anguaño algamable."
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
{ "translations": {
|
||||
"Sharing %s failed, because this item is already shared with %s" : "Compartir %s falló, porque esti elementu yá ta compartiéndose con %s"
|
||||
"Invalid Federated Cloud ID" : "Inválidu ID de Ñube Federada",
|
||||
"Sharing %s failed, because this item is already shared with %s" : "Compartir %s falló, porque esti elementu yá ta compartiéndose con %s",
|
||||
"Not allowed to create a federated share with the same user" : "Nun s'almite crear un recursu compartíu federáu col mesmu usuariu",
|
||||
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Compartir %s falló, nun pudo atopase %s, pue qu'el servidor nun seya anguaño algamable."
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -7,6 +7,8 @@ OC.L10N.register(
|
||||
"Not allowed to create a federated share with the same user" : "Non autorisé à créer un partage fédéré avec le même utilisateur",
|
||||
"File is already shared with %s" : "Le fichier est déjà partagé avec %s",
|
||||
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Le partage de %s a échoué : impossible de trouver %s. Peut-être le serveur est-il momentanément injoignable.",
|
||||
"You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Vous recevez \"/%3$s\" comme un partage distant depuis %1$s (au nom de %2$s)",
|
||||
"You received \"/%3$s\" as a remote share from %1$s" : "Vous recevez \"/%3$s\" comme un partage distant depuis %1$s",
|
||||
"Accept" : "Accepter",
|
||||
"Decline" : "Refuser",
|
||||
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Partagez avec moi grâce à mon identifiant Federated Cloud #owncloud %s",
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
"Not allowed to create a federated share with the same user" : "Non autorisé à créer un partage fédéré avec le même utilisateur",
|
||||
"File is already shared with %s" : "Le fichier est déjà partagé avec %s",
|
||||
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Le partage de %s a échoué : impossible de trouver %s. Peut-être le serveur est-il momentanément injoignable.",
|
||||
"You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Vous recevez \"/%3$s\" comme un partage distant depuis %1$s (au nom de %2$s)",
|
||||
"You received \"/%3$s\" as a remote share from %1$s" : "Vous recevez \"/%3$s\" comme un partage distant depuis %1$s",
|
||||
"Accept" : "Accepter",
|
||||
"Decline" : "Refuser",
|
||||
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Partagez avec moi grâce à mon identifiant Federated Cloud #owncloud %s",
|
||||
|
||||
@@ -2,14 +2,15 @@ OC.L10N.register(
|
||||
"federatedfilesharing",
|
||||
{
|
||||
"Federated sharing" : "連携共有",
|
||||
"Invalid Federated Cloud ID" : "無効な統合されたクラウドID",
|
||||
"Invalid Federated Cloud ID" : "クラウド統合IDが無効",
|
||||
"Sharing %s failed, because this item is already shared with %s" : "%s を共有できませんでした。このアイテムはすでに %s に共有されています。",
|
||||
"Not allowed to create a federated share with the same user" : "同じユーザーでフェデレーション共有を作成することは出来ません",
|
||||
"File is already shared with %s" : "ファイルは既に %s と共有されています。",
|
||||
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s を共有できませんでした。%s が見つかりませんでした。現在サーバーに接続できないようです。",
|
||||
"You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "%1$s からリモート共有として \"/%3$s\" を受け取りました。(%2$s の代理として)",
|
||||
"You received \"/%3$s\" as a remote share from %1$s" : "%1$s からリモート共有として \"/%3$s\" を受け取りました。",
|
||||
"Accept" : "承諾",
|
||||
"Decline" : "拒否《はてなキーワード》",
|
||||
"Accept" : "受領",
|
||||
"Decline" : "拒否",
|
||||
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "#ownCloud の「クラウド連携ID」で私と共有できます。こちらを見てください。%s",
|
||||
"Share with me through my #ownCloud Federated Cloud ID" : "#ownCloud の「クラウド連携ID」で私と共有できます。",
|
||||
"Federated Cloud Sharing" : "統合されたクラウド共有",
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
{ "translations": {
|
||||
"Federated sharing" : "連携共有",
|
||||
"Invalid Federated Cloud ID" : "無効な統合されたクラウドID",
|
||||
"Invalid Federated Cloud ID" : "クラウド統合IDが無効",
|
||||
"Sharing %s failed, because this item is already shared with %s" : "%s を共有できませんでした。このアイテムはすでに %s に共有されています。",
|
||||
"Not allowed to create a federated share with the same user" : "同じユーザーでフェデレーション共有を作成することは出来ません",
|
||||
"File is already shared with %s" : "ファイルは既に %s と共有されています。",
|
||||
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s を共有できませんでした。%s が見つかりませんでした。現在サーバーに接続できないようです。",
|
||||
"You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "%1$s からリモート共有として \"/%3$s\" を受け取りました。(%2$s の代理として)",
|
||||
"You received \"/%3$s\" as a remote share from %1$s" : "%1$s からリモート共有として \"/%3$s\" を受け取りました。",
|
||||
"Accept" : "承諾",
|
||||
"Decline" : "拒否《はてなキーワード》",
|
||||
"Accept" : "受領",
|
||||
"Decline" : "拒否",
|
||||
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "#ownCloud の「クラウド連携ID」で私と共有できます。こちらを見てください。%s",
|
||||
"Share with me through my #ownCloud Federated Cloud ID" : "#ownCloud の「クラウド連携ID」で私と共有できます。",
|
||||
"Federated Cloud Sharing" : "統合されたクラウド共有",
|
||||
|
||||
@@ -5,7 +5,10 @@ OC.L10N.register(
|
||||
"Invalid Federated Cloud ID" : "Ugyldig ID for sammenknyttet sky",
|
||||
"Sharing %s failed, because this item is already shared with %s" : "Deling av %s feilet, fordi dette elementet allerede er delt med %s",
|
||||
"Not allowed to create a federated share with the same user" : "Ikke tillatt å opprette en Sammenknyttet sky-deling med den samme brukeren",
|
||||
"File is already shared with %s" : "Filen deles allerede med %s",
|
||||
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Deling %s feilet, fant ikke %s, kanskje servern er utilgjengelig for øyeblikket.",
|
||||
"You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Du mottok \"/%3$s\" som en ekstern deling fra %1$s (på vegne av %2$s)",
|
||||
"You received \"/%3$s\" as a remote share from %1$s" : "Du mottok \"/%3$s\" som en ekstern deling fra %1$s",
|
||||
"Accept" : "Aksepter",
|
||||
"Decline" : "Avslå",
|
||||
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Del med meg gjennom min #ownCloud ID for sammenknyttet sky, se %s",
|
||||
|
||||
@@ -3,7 +3,10 @@
|
||||
"Invalid Federated Cloud ID" : "Ugyldig ID for sammenknyttet sky",
|
||||
"Sharing %s failed, because this item is already shared with %s" : "Deling av %s feilet, fordi dette elementet allerede er delt med %s",
|
||||
"Not allowed to create a federated share with the same user" : "Ikke tillatt å opprette en Sammenknyttet sky-deling med den samme brukeren",
|
||||
"File is already shared with %s" : "Filen deles allerede med %s",
|
||||
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Deling %s feilet, fant ikke %s, kanskje servern er utilgjengelig for øyeblikket.",
|
||||
"You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "Du mottok \"/%3$s\" som en ekstern deling fra %1$s (på vegne av %2$s)",
|
||||
"You received \"/%3$s\" as a remote share from %1$s" : "Du mottok \"/%3$s\" som en ekstern deling fra %1$s",
|
||||
"Accept" : "Aksepter",
|
||||
"Decline" : "Avslå",
|
||||
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "Del med meg gjennom min #ownCloud ID for sammenknyttet sky, se %s",
|
||||
|
||||
@@ -5,7 +5,10 @@ OC.L10N.register(
|
||||
"Invalid Federated Cloud ID" : "ไอดีคลาวด์ในเครือไม่ถูกต้อง",
|
||||
"Sharing %s failed, because this item is already shared with %s" : "การแชร์ %s ล้มเหลวเพราะรายการนี้ถูกแชร์กับ %s",
|
||||
"Not allowed to create a federated share with the same user" : "ไม่อนุญาตให้สร้างแชร์สหพันธ์กับผู้ใช้เดียวกัน",
|
||||
"File is already shared with %s" : "ไฟล์ได้ถูกแชร์แล้วกับ %s",
|
||||
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "การแชร์ %s ล้มเหลวไม่สามารถหา %s, บางทีอาจจะยังไม่สามารถเข้าถึงเซิร์ฟเวอร์ปัจจุบัน",
|
||||
"You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "คุณได้รับ \"/%3$s\" เป็นรีโมทแชร์จาก %1$s (ในนามของ %2$s)",
|
||||
"You received \"/%3$s\" as a remote share from %1$s" : "คุณได้รับ\"/%3$s\" เป็นรีโมทแชร์จาก %1$s",
|
||||
"Accept" : "ยอมรับ",
|
||||
"Decline" : "ลดลง",
|
||||
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "แชร์กับฉันผ่าน #ownCloud ด้วยไอดีคลาวด์สหพันธ์ สามารถดูได้ที่ %s",
|
||||
|
||||
@@ -3,7 +3,10 @@
|
||||
"Invalid Federated Cloud ID" : "ไอดีคลาวด์ในเครือไม่ถูกต้อง",
|
||||
"Sharing %s failed, because this item is already shared with %s" : "การแชร์ %s ล้มเหลวเพราะรายการนี้ถูกแชร์กับ %s",
|
||||
"Not allowed to create a federated share with the same user" : "ไม่อนุญาตให้สร้างแชร์สหพันธ์กับผู้ใช้เดียวกัน",
|
||||
"File is already shared with %s" : "ไฟล์ได้ถูกแชร์แล้วกับ %s",
|
||||
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "การแชร์ %s ล้มเหลวไม่สามารถหา %s, บางทีอาจจะยังไม่สามารถเข้าถึงเซิร์ฟเวอร์ปัจจุบัน",
|
||||
"You received \"/%3$s\" as a remote share from %1$s (on behalf of %2$s)" : "คุณได้รับ \"/%3$s\" เป็นรีโมทแชร์จาก %1$s (ในนามของ %2$s)",
|
||||
"You received \"/%3$s\" as a remote share from %1$s" : "คุณได้รับ\"/%3$s\" เป็นรีโมทแชร์จาก %1$s",
|
||||
"Accept" : "ยอมรับ",
|
||||
"Decline" : "ลดลง",
|
||||
"Share with me through my #ownCloud Federated Cloud ID, see %s" : "แชร์กับฉันผ่าน #ownCloud ด้วยไอดีคลาวด์สหพันธ์ สามารถดูได้ที่ %s",
|
||||
|
||||
@@ -5,6 +5,7 @@ OC.L10N.register(
|
||||
"Invalid Federated Cloud ID" : "Geçersiz Birleşmiş Bulut Kimliği",
|
||||
"Sharing %s failed, because this item is already shared with %s" : "%s paylaşımı, %s ile zaten paylaşıldığından dolayı başarısız oldu",
|
||||
"Not allowed to create a federated share with the same user" : "Aynı kullanıcı ile bir birleşmiş paylaşım oluşturulamaz",
|
||||
"File is already shared with %s" : "Dosya önceden %s ile paylaşıldı",
|
||||
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s paylaşımı başarısız. %s bulunamadı veya sunucu şu anda ulaşılamıyor olabilir.",
|
||||
"Accept" : "Kabul et",
|
||||
"Decline" : "Reddet",
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
"Invalid Federated Cloud ID" : "Geçersiz Birleşmiş Bulut Kimliği",
|
||||
"Sharing %s failed, because this item is already shared with %s" : "%s paylaşımı, %s ile zaten paylaşıldığından dolayı başarısız oldu",
|
||||
"Not allowed to create a federated share with the same user" : "Aynı kullanıcı ile bir birleşmiş paylaşım oluşturulamaz",
|
||||
"File is already shared with %s" : "Dosya önceden %s ile paylaşıldı",
|
||||
"Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "%s paylaşımı başarısız. %s bulunamadı veya sunucu şu anda ulaşılamıyor olabilir.",
|
||||
"Accept" : "Kabul et",
|
||||
"Decline" : "Reddet",
|
||||
|
||||
@@ -39,6 +39,8 @@ class DiscoveryManager {
|
||||
private $cache;
|
||||
/** @var IClient */
|
||||
private $client;
|
||||
/** @var bool */
|
||||
public $underTest = false;
|
||||
|
||||
/**
|
||||
* @param ICacheFactory $cacheFactory
|
||||
@@ -82,6 +84,10 @@ class DiscoveryManager {
|
||||
'share' => '/ocs/v1.php/cloud/shares',
|
||||
];
|
||||
|
||||
if (defined('PHPUNIT_RUN') && !$this->underTest) {
|
||||
return $discoveredServices;
|
||||
}
|
||||
|
||||
// Read the data from the response body
|
||||
try {
|
||||
$response = $this->client->get($remote . '/ocs-provider/', [
|
||||
|
||||
@@ -473,6 +473,8 @@ class FederatedShareProvider implements IShareProvider {
|
||||
|
||||
$isOwner = false;
|
||||
|
||||
$this->removeShareFromTable($share);
|
||||
|
||||
// if the local user is the owner we can send the unShare request directly...
|
||||
if ($this->userManager->userExists($share->getShareOwner())) {
|
||||
$this->notifications->sendRemoteUnShare($remote, $share->getId(), $share->getToken());
|
||||
@@ -494,8 +496,6 @@ class FederatedShareProvider implements IShareProvider {
|
||||
}
|
||||
$this->notifications->sendRevokeShare($remote, $remoteId, $share->getToken());
|
||||
}
|
||||
|
||||
$this->removeShareFromTable($share);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -62,6 +62,7 @@ class DiscoveryManagerTest extends \Test\TestCase {
|
||||
$cacheFactory,
|
||||
$clientService
|
||||
);
|
||||
$this->discoveryManager->underTest = true;
|
||||
}
|
||||
|
||||
public function testWithMalformedFormattedEndpointCached() {
|
||||
|
||||
@@ -7,9 +7,9 @@ OC.L10N.register(
|
||||
"Could not add server" : "サーバーを追加できませんでした",
|
||||
"Federation" : "連携",
|
||||
"ownCloud Federation allows you to connect with other trusted ownClouds to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "ownCloud 連携機能では信頼済のownCloudのユーザーディレクトリを相互に接続することができます。例えば、連携で共有したときには、連携先の外部ユーザー名の自動補完を使えるようになります。",
|
||||
"Add server automatically once a federated share was created successfully" : "追加するサーバは自動的に統合され、共有が追加されました",
|
||||
"Trusted ownCloud Servers" : "ownCloudサーバを信頼する",
|
||||
"+ Add ownCloud server" : "ownCloudサーバを追加",
|
||||
"Add server automatically once a federated share was created successfully" : "ownCloudサーバー連携で一度でも共有が作成できた場合は、サーバーを自動的に追加します。",
|
||||
"Trusted ownCloud Servers" : "信頼済 ownCloudサーバ",
|
||||
"+ Add ownCloud server" : "+ownCloudサーバを追加",
|
||||
"ownCloud Server" : "ownCloudサーバ"
|
||||
},
|
||||
"nplurals=1; plural=0;");
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
"Could not add server" : "サーバーを追加できませんでした",
|
||||
"Federation" : "連携",
|
||||
"ownCloud Federation allows you to connect with other trusted ownClouds to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "ownCloud 連携機能では信頼済のownCloudのユーザーディレクトリを相互に接続することができます。例えば、連携で共有したときには、連携先の外部ユーザー名の自動補完を使えるようになります。",
|
||||
"Add server automatically once a federated share was created successfully" : "追加するサーバは自動的に統合され、共有が追加されました",
|
||||
"Trusted ownCloud Servers" : "ownCloudサーバを信頼する",
|
||||
"+ Add ownCloud server" : "ownCloudサーバを追加",
|
||||
"Add server automatically once a federated share was created successfully" : "ownCloudサーバー連携で一度でも共有が作成できた場合は、サーバーを自動的に追加します。",
|
||||
"Trusted ownCloud Servers" : "信頼済 ownCloudサーバ",
|
||||
"+ Add ownCloud server" : "+ownCloudサーバを追加",
|
||||
"ownCloud Server" : "ownCloudサーバ"
|
||||
},"pluralForm" :"nplurals=1; plural=0;"
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
OC.L10N.register(
|
||||
"federation",
|
||||
{
|
||||
"Server added to the list of trusted ownClouds" : "De Server gouf op d'Lëscht vun den zouverlässegen ownClouds gesat.",
|
||||
"Server is already in the list of trusted servers." : "De Server ass schonn op der Lëscht vun den zouverlässegen Serveren.",
|
||||
"No ownCloud server found" : "Keen ownCloud Server fonnt",
|
||||
"Could not add server" : "De Server konnt net derbäi gesat ginn",
|
||||
"Federation" : "Federatioun",
|
||||
"ownCloud Federation allows you to connect with other trusted ownClouds to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "D'ownCloud Federatioun erlaabt der fir dech mat aneren zouverlässegen ownClouds ze verbannen an d'Benotzer Verzeechnes auszetauschen. Zum Beispill gëtt dëst hei benotzt fir extern Benotzer automatesch fir federatiivt Deelen ze vervollstännegen.",
|
||||
"Add server automatically once a federated share was created successfully" : "Setz de Server automatesch derbäi soubal e federativen Undeel erfollegräich erstallt gouf",
|
||||
"Trusted ownCloud Servers" : "Zouverlässeg ownCloud Serveren",
|
||||
"+ Add ownCloud server" : "+ ownCloud Server derbäi setzen",
|
||||
"ownCloud Server" : "ownCloud Server"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
@@ -0,0 +1,13 @@
|
||||
{ "translations": {
|
||||
"Server added to the list of trusted ownClouds" : "De Server gouf op d'Lëscht vun den zouverlässegen ownClouds gesat.",
|
||||
"Server is already in the list of trusted servers." : "De Server ass schonn op der Lëscht vun den zouverlässegen Serveren.",
|
||||
"No ownCloud server found" : "Keen ownCloud Server fonnt",
|
||||
"Could not add server" : "De Server konnt net derbäi gesat ginn",
|
||||
"Federation" : "Federatioun",
|
||||
"ownCloud Federation allows you to connect with other trusted ownClouds to exchange the user directory. For example this will be used to auto-complete external users for federated sharing." : "D'ownCloud Federatioun erlaabt der fir dech mat aneren zouverlässegen ownClouds ze verbannen an d'Benotzer Verzeechnes auszetauschen. Zum Beispill gëtt dëst hei benotzt fir extern Benotzer automatesch fir federatiivt Deelen ze vervollstännegen.",
|
||||
"Add server automatically once a federated share was created successfully" : "Setz de Server automatesch derbäi soubal e federativen Undeel erfollegräich erstallt gouf",
|
||||
"Trusted ownCloud Servers" : "Zouverlässeg ownCloud Serveren",
|
||||
"+ Add ownCloud server" : "+ ownCloud Server derbäi setzen",
|
||||
"ownCloud Server" : "ownCloud Server"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -329,6 +329,21 @@ table td.filename .nametext {
|
||||
margin-right: 50px;
|
||||
}
|
||||
|
||||
.hide-hidden-files #fileList tr.hidden-file,
|
||||
.hide-hidden-files #fileList tr.hidden-file.dragging {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#fileList tr.animate-opacity {
|
||||
-webkit-transition:opacity 250ms;
|
||||
-moz-transition:opacity 250ms;
|
||||
-o-transition:opacity 250ms;
|
||||
transition:opacity 250ms;
|
||||
}
|
||||
#fileList tr.dragging {
|
||||
opacity: 0.2;
|
||||
}
|
||||
|
||||
table td.filename .nametext .innernametext {
|
||||
text-overflow: ellipsis;
|
||||
overflow: hidden;
|
||||
|
||||
+78
-35
@@ -194,6 +194,7 @@
|
||||
* @param options.folderDropOptions folder drop options, disabled by default
|
||||
* @param options.scrollTo name of file to scroll to after the first load
|
||||
* @param {OC.Files.Client} [options.filesClient] files API client
|
||||
* @param {OC.Backbone.Model} [options.filesConfig] files app configuration
|
||||
* @private
|
||||
*/
|
||||
initialize: function($el, options) {
|
||||
@@ -207,11 +208,9 @@
|
||||
this._filesConfig = options.config;
|
||||
} else if (!_.isUndefined(OCA.Files) && !_.isUndefined(OCA.Files.App)) {
|
||||
this._filesConfig = OCA.Files.App.getFilesConfig();
|
||||
}
|
||||
|
||||
if (!_.isUndefined(this._filesConfig)) {
|
||||
this._filesConfig.on('change:showhidden', function() {
|
||||
self.setFiles(self.files);
|
||||
} else {
|
||||
this._filesConfig = new OC.Backbone.Model({
|
||||
'showhidden': false
|
||||
});
|
||||
}
|
||||
|
||||
@@ -236,6 +235,22 @@
|
||||
this.$table = $el.find('table:first');
|
||||
this.$fileList = $el.find('#fileList');
|
||||
|
||||
if (!_.isUndefined(this._filesConfig)) {
|
||||
this._filesConfig.on('change:showhidden', function() {
|
||||
var showHidden = this.get('showhidden');
|
||||
self.$el.toggleClass('hide-hidden-files', !showHidden);
|
||||
self.updateSelectionSummary();
|
||||
|
||||
if (!showHidden) {
|
||||
// hiding files could make the page too small, need to try rendering next page
|
||||
self._onScroll();
|
||||
}
|
||||
});
|
||||
|
||||
this.$el.toggleClass('hide-hidden-files', !this._filesConfig.get('showhidden'));
|
||||
}
|
||||
|
||||
|
||||
if (_.isUndefined(options.detailsViewEnabled) || options.detailsViewEnabled) {
|
||||
this._detailsView = new OCA.Files.DetailsView();
|
||||
this._detailsView.$el.insertBefore(this.$el);
|
||||
@@ -250,7 +265,7 @@
|
||||
|
||||
this.files = [];
|
||||
this._selectedFiles = {};
|
||||
this._selectionSummary = new OCA.Files.FileSummary();
|
||||
this._selectionSummary = new OCA.Files.FileSummary(undefined, {config: this._filesConfig});
|
||||
// dummy root dir info
|
||||
this.dirInfo = new OC.Files.FileInfo({});
|
||||
|
||||
@@ -513,7 +528,7 @@
|
||||
* Event handler for when the URL changed
|
||||
*/
|
||||
_onUrlChanged: function(e) {
|
||||
if (e && e.dir) {
|
||||
if (e && _.isString(e.dir)) {
|
||||
this.changeDirectory(e.dir, false, true);
|
||||
}
|
||||
},
|
||||
@@ -875,10 +890,6 @@
|
||||
* @return array of DOM elements of the newly added files
|
||||
*/
|
||||
_nextPage: function(animate) {
|
||||
// Save full files list while rendering
|
||||
var allFiles = this.files;
|
||||
this.files = this._filterHiddenFiles(this.files);
|
||||
|
||||
var index = this.$fileList.children().length,
|
||||
count = this.pageSize(),
|
||||
hidden,
|
||||
@@ -926,9 +937,6 @@
|
||||
}, 0);
|
||||
}
|
||||
|
||||
// Restore full files list after rendering
|
||||
this.files = allFiles;
|
||||
|
||||
return newTrs;
|
||||
},
|
||||
|
||||
@@ -967,8 +975,6 @@
|
||||
this.$el.find('.select-all').prop('checked', false);
|
||||
|
||||
// Save full files list while rendering
|
||||
var allFiles = this.files;
|
||||
this.files = this._filterHiddenFiles(this.files);
|
||||
|
||||
this.isEmpty = this.files.length === 0;
|
||||
this._nextPage();
|
||||
@@ -982,9 +988,6 @@
|
||||
this.updateSelectionSummary();
|
||||
$(window).scrollTop(0);
|
||||
|
||||
// Restore full files list after rendering
|
||||
this.files = allFiles;
|
||||
|
||||
this.$fileList.trigger(jQuery.Event('updated'));
|
||||
_.defer(function() {
|
||||
self.$el.closest('#app-content').trigger(jQuery.Event('apprendered'));
|
||||
@@ -992,18 +995,14 @@
|
||||
},
|
||||
|
||||
/**
|
||||
* Filter hidden files of the given filesArray (dot-files)
|
||||
* Returns whether the given file info must be hidden
|
||||
*
|
||||
* @param filesArray files to be filtered
|
||||
* @returns {array}
|
||||
* @param {OC.Files.FileInfo} fileInfo file info
|
||||
*
|
||||
* @return {boolean} true if the file is a hidden file, false otherwise
|
||||
*/
|
||||
_filterHiddenFiles: function(files) {
|
||||
if (_.isUndefined(this._filesConfig) || this._filesConfig.get('showhidden')) {
|
||||
return files;
|
||||
}
|
||||
return _.filter(files, function(file) {
|
||||
return file.name.indexOf('.') !== 0;
|
||||
});
|
||||
_isHiddenFile: function(file) {
|
||||
return file.name && file.name.charAt(0) === '.';
|
||||
},
|
||||
|
||||
/**
|
||||
@@ -1327,6 +1326,10 @@
|
||||
tr.addClass('hidden');
|
||||
}
|
||||
|
||||
if (this._isHiddenFile(fileData)) {
|
||||
tr.addClass('hidden-file');
|
||||
}
|
||||
|
||||
// display actions
|
||||
this.fileActions.display(filenameTd, !options.silent, this);
|
||||
|
||||
@@ -1397,6 +1400,16 @@
|
||||
return OC.linkTo('files', 'index.php')+"?dir="+ encodeURIComponent(dir).replace(/%2F/g, '/');
|
||||
},
|
||||
|
||||
_isValidPath: function(path) {
|
||||
var sections = path.split('/');
|
||||
for (var i = 0; i < sections.length; i++) {
|
||||
if (sections[i] === '..') {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
},
|
||||
|
||||
/**
|
||||
* Sets the current directory name and updates the breadcrumb.
|
||||
* @param targetDir directory to display
|
||||
@@ -1405,6 +1418,10 @@
|
||||
*/
|
||||
_setCurrentDir: function(targetDir, changeUrl, fileId) {
|
||||
targetDir = targetDir.replace(/\\/g, '/');
|
||||
if (!this._isValidPath(targetDir)) {
|
||||
targetDir = '/';
|
||||
changeUrl = true;
|
||||
}
|
||||
var previousDir = this.getCurrentDirectory(),
|
||||
baseDir = OC.basename(targetDir);
|
||||
|
||||
@@ -1415,6 +1432,9 @@
|
||||
this.setPageTitle();
|
||||
}
|
||||
|
||||
if (targetDir.length > 0 && targetDir[0] !== '/') {
|
||||
targetDir = '/' + targetDir;
|
||||
}
|
||||
this._currentDirectory = targetDir;
|
||||
|
||||
// legacy stuff
|
||||
@@ -2283,7 +2303,7 @@
|
||||
var $tr = $('<tr class="summary"></tr>');
|
||||
this.$el.find('tfoot').append($tr);
|
||||
|
||||
return new OCA.Files.FileSummary($tr);
|
||||
return new OCA.Files.FileSummary($tr, {config: this._filesConfig});
|
||||
},
|
||||
updateEmptyContent: function() {
|
||||
var permissions = this.getDirectoryPermissions();
|
||||
@@ -2351,22 +2371,39 @@
|
||||
* @param filter
|
||||
*/
|
||||
setFilter:function(filter) {
|
||||
var total = 0;
|
||||
if (this._filter === filter) {
|
||||
return;
|
||||
}
|
||||
this._filter = filter;
|
||||
this.fileSummary.setFilter(filter, this.files);
|
||||
total = this.fileSummary.getTotal();
|
||||
if (!this.$el.find('.mask').exists()) {
|
||||
this.hideIrrelevantUIWhenNoFilesMatch();
|
||||
}
|
||||
var that = this;
|
||||
|
||||
var visibleCount = 0;
|
||||
filter = filter.toLowerCase();
|
||||
this.$fileList.find('tr').each(function(i,e) {
|
||||
var $e = $(e);
|
||||
|
||||
function filterRows(tr) {
|
||||
var $e = $(tr);
|
||||
if ($e.data('file').toString().toLowerCase().indexOf(filter) === -1) {
|
||||
$e.addClass('hidden');
|
||||
} else {
|
||||
visibleCount++;
|
||||
$e.removeClass('hidden');
|
||||
}
|
||||
});
|
||||
that.$container.trigger('scroll');
|
||||
}
|
||||
|
||||
var $trs = this.$fileList.find('tr');
|
||||
do {
|
||||
_.each($trs, filterRows);
|
||||
if (visibleCount < total) {
|
||||
$trs = this._nextPage(false);
|
||||
}
|
||||
} while (visibleCount < total && $trs.length > 0);
|
||||
|
||||
this.$container.trigger('scroll');
|
||||
},
|
||||
hideIrrelevantUIWhenNoFilesMatch:function() {
|
||||
if (this._filter && this.fileSummary.summary.totalDirs + this.fileSummary.summary.totalFiles === 0) {
|
||||
@@ -2413,6 +2450,7 @@
|
||||
var summary = this._selectionSummary.summary;
|
||||
var selection;
|
||||
|
||||
var showHidden = !!this._filesConfig.get('showhidden');
|
||||
if (summary.totalFiles === 0 && summary.totalDirs === 0) {
|
||||
this.$el.find('#headerName a.name>span:first').text(t('files','Name'));
|
||||
this.$el.find('#headerSize a>span:first').text(t('files','Size'));
|
||||
@@ -2439,6 +2477,11 @@
|
||||
selection = fileInfo;
|
||||
}
|
||||
|
||||
if (!showHidden && summary.totalHidden > 0) {
|
||||
var hiddenInfo = n('files', 'including %n hidden', 'including %n hidden', summary.totalHidden);
|
||||
selection += ' (' + hiddenInfo + ')';
|
||||
}
|
||||
|
||||
this.$el.find('#headerName a.name>span:first').text(selection);
|
||||
this.$el.find('#modified a>span:first').text('');
|
||||
this.$el.find('table').addClass('multiselect');
|
||||
|
||||
@@ -391,14 +391,18 @@ var dragOptions={
|
||||
if (!$selectedFiles.length) {
|
||||
$selectedFiles = $(this);
|
||||
}
|
||||
$selectedFiles.closest('tr').fadeTo(250, 0.2).addClass('dragging');
|
||||
$selectedFiles.closest('tr').addClass('animate-opacity dragging');
|
||||
},
|
||||
stop: function(event, ui) {
|
||||
var $selectedFiles = $('td.filename input:checkbox:checked');
|
||||
if (!$selectedFiles.length) {
|
||||
$selectedFiles = $(this);
|
||||
}
|
||||
$selectedFiles.closest('tr').fadeTo(250, 1).removeClass('dragging');
|
||||
var $tr = $selectedFiles.closest('tr');
|
||||
$tr.removeClass('dragging');
|
||||
setTimeout(function() {
|
||||
$tr.removeClass('animate-opacity');
|
||||
}, 300);
|
||||
},
|
||||
drag: function(event, ui) {
|
||||
var scrollingArea = FileList.$container;
|
||||
|
||||
@@ -20,6 +20,15 @@
|
||||
*/
|
||||
|
||||
(function() {
|
||||
var INFO_TEMPLATE =
|
||||
'<span class="info">' +
|
||||
'<span class="dirinfo"></span>' +
|
||||
'<span class="connector"> and </span>' +
|
||||
'<span class="fileinfo"></span>' +
|
||||
'<span class="hiddeninfo"></span>' +
|
||||
'<span class="filter"></span>' +
|
||||
'</span>';
|
||||
|
||||
/**
|
||||
* The FileSummary class encapsulates the file summary values and
|
||||
* the logic to render it in the given container
|
||||
@@ -28,26 +37,51 @@
|
||||
* @memberof OCA.Files
|
||||
*
|
||||
* @param $tr table row element
|
||||
* @param {OC.Backbone.Model} [options.filesConfig] files app configuration
|
||||
*/
|
||||
var FileSummary = function($tr) {
|
||||
var FileSummary = function($tr, options) {
|
||||
options = options || {};
|
||||
var self = this;
|
||||
this.$el = $tr;
|
||||
var filesConfig = options.config;
|
||||
if (filesConfig) {
|
||||
this._showHidden = !!filesConfig.get('showhidden');
|
||||
filesConfig.on('change:showhidden', function() {
|
||||
self._showHidden = !!this.get('showhidden');
|
||||
self.update();
|
||||
});
|
||||
}
|
||||
this.clear();
|
||||
this.render();
|
||||
};
|
||||
|
||||
FileSummary.prototype = {
|
||||
_showHidden: null,
|
||||
|
||||
summary: {
|
||||
totalFiles: 0,
|
||||
totalDirs: 0,
|
||||
totalHidden: 0,
|
||||
totalSize: 0,
|
||||
filter:'',
|
||||
sumIsPending:false
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns whether the given file info must be hidden
|
||||
*
|
||||
* @param {OC.Files.FileInfo} fileInfo file info
|
||||
*
|
||||
* @return {boolean} true if the file is a hidden file, false otherwise
|
||||
*/
|
||||
_isHiddenFile: function(file) {
|
||||
return file.name && file.name.charAt(0) === '.';
|
||||
},
|
||||
|
||||
/**
|
||||
* Adds file
|
||||
* @param file file to add
|
||||
* @param update whether to update the display
|
||||
* @param {OC.Files.FileInfo} file file to add
|
||||
* @param {boolean} update whether to update the display
|
||||
*/
|
||||
add: function(file, update) {
|
||||
if (file.name && file.name.toLowerCase().indexOf(this.summary.filter) === -1) {
|
||||
@@ -59,6 +93,10 @@
|
||||
else {
|
||||
this.summary.totalFiles++;
|
||||
}
|
||||
if (this._isHiddenFile(file)) {
|
||||
this.summary.totalHidden++;
|
||||
}
|
||||
|
||||
var size = parseInt(file.size, 10) || 0;
|
||||
if (size >=0) {
|
||||
this.summary.totalSize += size;
|
||||
@@ -71,8 +109,8 @@
|
||||
},
|
||||
/**
|
||||
* Removes file
|
||||
* @param file file to remove
|
||||
* @param update whether to update the display
|
||||
* @param {OC.Files.FileInfo} file file to remove
|
||||
* @param {boolean} update whether to update the display
|
||||
*/
|
||||
remove: function(file, update) {
|
||||
if (file.name && file.name.toLowerCase().indexOf(this.summary.filter) === -1) {
|
||||
@@ -84,6 +122,9 @@
|
||||
else {
|
||||
this.summary.totalFiles--;
|
||||
}
|
||||
if (this._isHiddenFile(file)) {
|
||||
this.summary.totalHidden--;
|
||||
}
|
||||
var size = parseInt(file.size, 10) || 0;
|
||||
if (size >=0) {
|
||||
this.summary.totalSize -= size;
|
||||
@@ -111,6 +152,7 @@
|
||||
var summary = {
|
||||
totalDirs: 0,
|
||||
totalFiles: 0,
|
||||
totalHidden: 0,
|
||||
totalSize: 0,
|
||||
filter: this.summary.filter,
|
||||
sumIsPending: false
|
||||
@@ -127,6 +169,9 @@
|
||||
else {
|
||||
summary.totalFiles++;
|
||||
}
|
||||
if (this._isHiddenFile(file)) {
|
||||
summary.totalHidden++;
|
||||
}
|
||||
var size = parseInt(file.size, 10) || 0;
|
||||
if (size >=0) {
|
||||
summary.totalSize += size;
|
||||
@@ -154,6 +199,13 @@
|
||||
this.update();
|
||||
},
|
||||
|
||||
_infoTemplate: function(data) {
|
||||
if (!this._infoTemplateCompiled) {
|
||||
this._infoTemplateCompiled = Handlebars.compile(INFO_TEMPLATE);
|
||||
}
|
||||
return this._infoTemplateCompiled(data);
|
||||
},
|
||||
|
||||
/**
|
||||
* Renders the file summary element
|
||||
*/
|
||||
@@ -171,10 +223,12 @@
|
||||
var $fileInfo = this.$el.find('.fileinfo');
|
||||
var $connector = this.$el.find('.connector');
|
||||
var $filterInfo = this.$el.find('.filter');
|
||||
var $hiddenInfo = this.$el.find('.hiddeninfo');
|
||||
|
||||
// Substitute old content with new translations
|
||||
$dirInfo.html(n('files', '%n folder', '%n folders', this.summary.totalDirs));
|
||||
$fileInfo.html(n('files', '%n file', '%n files', this.summary.totalFiles));
|
||||
$hiddenInfo.html(' (' + n('files', 'including %n hidden', 'including %n hidden', this.summary.totalHidden) + ')');
|
||||
var fileSize = this.summary.sumIsPending ? t('files', 'Pending') : OC.Util.humanFileSize(this.summary.totalSize);
|
||||
this.$el.find('.filesize').html(fileSize);
|
||||
|
||||
@@ -194,6 +248,7 @@
|
||||
if (this.summary.totalDirs > 0 && this.summary.totalFiles > 0) {
|
||||
$connector.removeClass('hidden');
|
||||
}
|
||||
$hiddenInfo.toggleClass('hidden', this.summary.totalHidden === 0 || this._showHidden)
|
||||
if (this.summary.filter === '') {
|
||||
$filterInfo.html('');
|
||||
$filterInfo.addClass('hidden');
|
||||
@@ -206,19 +261,7 @@
|
||||
if (!this.$el) {
|
||||
return;
|
||||
}
|
||||
// TODO: ideally this should be separate to a template or something
|
||||
var summary = this.summary;
|
||||
var directoryInfo = n('files', '%n folder', '%n folders', summary.totalDirs);
|
||||
var fileInfo = n('files', '%n file', '%n files', summary.totalFiles);
|
||||
var filterInfo = '';
|
||||
if (this.summary.filter !== '') {
|
||||
filterInfo = ' ' + n('files', 'matches \'{filter}\'', 'match \'{filter}\'', summary.totalFiles + summary.totalDirs, {filter: summary.filter});
|
||||
}
|
||||
|
||||
var infoVars = {
|
||||
dirs: '<span class="dirinfo">'+directoryInfo+'</span><span class="connector">',
|
||||
files: '</span><span class="fileinfo">'+fileInfo+'</span>'
|
||||
};
|
||||
|
||||
// don't show the filesize column, if filesize is NaN (e.g. in trashbin)
|
||||
var fileSize = '';
|
||||
@@ -227,15 +270,14 @@
|
||||
fileSize = '<td class="filesize">' + fileSize + '</td>';
|
||||
}
|
||||
|
||||
var info = t('files', '{dirs} and {files}', infoVars, null, {'escape': false});
|
||||
|
||||
var $summary = $('<td><span class="info">'+info+'<span class="filter">'+filterInfo+'</span></span></td>'+fileSize+'<td class="date"></td>');
|
||||
|
||||
if (!this.summary.totalFiles && !this.summary.totalDirs) {
|
||||
this.$el.addClass('hidden');
|
||||
}
|
||||
|
||||
var $summary = $(
|
||||
'<td>' + this._infoTemplate() + '</td>' +
|
||||
fileSize +
|
||||
'<td class="date"></td>'
|
||||
);
|
||||
this.$el.addClass('hidden');
|
||||
this.$el.append($summary);
|
||||
this.update();
|
||||
}
|
||||
};
|
||||
OCA.Files.FileSummary = FileSummary;
|
||||
|
||||
@@ -133,7 +133,7 @@
|
||||
|
||||
this.handleFolderClick = function($row, result, event) {
|
||||
// open folder
|
||||
if (self.fileAppLoaded()) {
|
||||
if (self.fileAppLoaded() && self.fileList.id === 'files') {
|
||||
self.fileList.changeDirectory(result.path);
|
||||
return false;
|
||||
} else {
|
||||
@@ -142,7 +142,7 @@
|
||||
};
|
||||
|
||||
this.handleFileClick = function($row, result, event) {
|
||||
if (self.fileAppLoaded()) {
|
||||
if (self.fileAppLoaded() && self.fileList.id === 'files') {
|
||||
self.fileList.changeDirectory(OC.dirname(result.path));
|
||||
self.fileList.scrollTo(result.name);
|
||||
return false;
|
||||
@@ -184,6 +184,13 @@
|
||||
|
||||
search.setHandler('folder', this.handleFolderClick.bind(this));
|
||||
search.setHandler(['file', 'audio', 'image'], this.handleFileClick.bind(this));
|
||||
|
||||
if (self.fileAppLoaded()) {
|
||||
// hide results when switching directory outside of search results
|
||||
$('#app-content').delegate('>div', 'changeDirectory', function() {
|
||||
search.clear();
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
OCA.Search.Files = Files;
|
||||
|
||||
@@ -21,6 +21,7 @@ OC.L10N.register(
|
||||
"Invalid directory." : "Direutoriu non válidu.",
|
||||
"Files" : "Ficheros",
|
||||
"All files" : "Tolos ficheros",
|
||||
"File could not be found" : "Nun s'atopó el ficheru",
|
||||
"Home" : "Casa",
|
||||
"Close" : "Zarrar",
|
||||
"Favorites" : "Favoritos",
|
||||
@@ -28,8 +29,19 @@ OC.L10N.register(
|
||||
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Nun pudo xubise {filename}, paez que ye un directoriu o tien 0 bytes",
|
||||
"Total file size {size1} exceeds upload limit {size2}" : "El tamañu de ficheru total {size1} perpasa la llende de xuba {size2}",
|
||||
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Nun hai abondu espaciu llibre, tas xubiendo {size1} pero namái falta {size2}",
|
||||
"Error uploading file \"{fileName}\": {message}" : "Fallu xubiendo'l ficheru \"{fileName}\": {message}",
|
||||
"Could not get result from server." : "Nun pudo obtenese'l resultáu del sirvidor.",
|
||||
"Uploading..." : "Xubiendo...",
|
||||
"..." : "...",
|
||||
"{hours}:{minutes}:{seconds} hour{plural_s} left" : "Falten {hours}:{minutes}:{seconds} hour{plural_s}",
|
||||
"{hours}:{minutes}h" : "{hours}:{minutes}h",
|
||||
"{minutes}:{seconds} minute{plural_s} left" : "Falten {minutes}:{seconds} minute{plural_s} ",
|
||||
"{minutes}:{seconds}m" : "{minutes}:{seconds}m",
|
||||
"{seconds} second{plural_s} left" : "Falten {seconds} second{plural_s}",
|
||||
"{seconds}s" : "{seconds}s",
|
||||
"Any moment now..." : "En cualquier momentu...",
|
||||
"Soon..." : "Pronto...",
|
||||
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
|
||||
"File upload is in progress. Leaving the page now will cancel the upload." : "La xuba del ficheru ta en progresu. Si dexes agora la páxina, va encaboxase la xuba.",
|
||||
"Actions" : "Aiciones",
|
||||
"Download" : "Descargar",
|
||||
@@ -43,6 +55,17 @@ OC.L10N.register(
|
||||
"Unable to determine date" : "Imposible determinar la fecha",
|
||||
"This operation is forbidden" : "La operación ta prohibida",
|
||||
"This directory is unavailable, please check the logs or contact the administrator" : "Esti direutoriu nun ta disponible, por favor verifica'l rexistru o contacta l'alministrador",
|
||||
"Could not move \"{file}\", target exists" : "Nun pudo movese \"{file}\", destín yá esiste",
|
||||
"Could not move \"{file}\"" : "Nun pudo movese \"{file}\"",
|
||||
"{newName} already exists" : "{newName} yá esiste",
|
||||
"Could not rename \"{fileName}\", it does not exist any more" : "Nun pudo renomase \"{fileName}\", yá nun esiste",
|
||||
"The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nome \"{targetName}\" yá ta n'usu na carpeta \"{dir}\". Por favor, escueyi un nome diferente.",
|
||||
"Could not rename \"{fileName}\"" : "Nun pudo renomase \"{fileName}\"",
|
||||
"Could not create file \"{file}\"" : "Nun pudo crease'l ficheru \"{file}\"",
|
||||
"Could not create file \"{file}\" because it already exists" : "Nun pudo crease'l ficheru \"{file}\" porque yá esiste",
|
||||
"Could not create folder \"{dir}\"" : "Nun pudo crease la carpeta \"{dir}\"",
|
||||
"Could not create folder \"{dir}\" because it already exists" : "Nun pudo crease la carpeta \"{dir}\" porque yá esiste",
|
||||
"Error deleting file \"{fileName}\"." : "Fallu borrando'l ficheru \"{fileName}\".",
|
||||
"No entries in this folder match '{filter}'" : "Nun concasa nenguna entrada nesta carpeta '{filter}'",
|
||||
"Name" : "Nome",
|
||||
"Size" : "Tamañu",
|
||||
@@ -64,6 +87,7 @@ OC.L10N.register(
|
||||
"_%n byte_::_%n bytes_" : ["%n bytes","%n bytes"],
|
||||
"Favorited" : "Favoritos",
|
||||
"Favorite" : "Favoritu",
|
||||
"Local link" : "Enllaz llocal",
|
||||
"Folder" : "Carpeta",
|
||||
"New folder" : "Nueva carpeta",
|
||||
"{newname} already exists" : "{newname} yá existe",
|
||||
@@ -91,8 +115,12 @@ OC.L10N.register(
|
||||
"Maximum upload size" : "Tamañu máximu de xubida",
|
||||
"max. possible: " : "máx. posible:",
|
||||
"Save" : "Guardar",
|
||||
"With PHP-FPM it might take 5 minutes for changes to be applied." : "Con PHP-FPM pue retrasase 5 minutos pa que los cambeos s'apliquen.",
|
||||
"Missing permissions to edit from here." : "Falten permisos pa editar dende equí.",
|
||||
"Settings" : "Axustes",
|
||||
"Show hidden files" : "Amosar ficheros ocultos",
|
||||
"WebDAV" : "WebDAV",
|
||||
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Usa esta direición <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">p'acceder a los dos Ficheros via WebDAV</a>",
|
||||
"No files in here" : "Nun hai nengún ficheru equí",
|
||||
"Upload some content or sync with your devices!" : "¡Xuba algún conteníu o sincroniza colos sos preseos!",
|
||||
"No entries found in this folder" : "Nenguna entrada en esta carpeta",
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
"Invalid directory." : "Direutoriu non válidu.",
|
||||
"Files" : "Ficheros",
|
||||
"All files" : "Tolos ficheros",
|
||||
"File could not be found" : "Nun s'atopó el ficheru",
|
||||
"Home" : "Casa",
|
||||
"Close" : "Zarrar",
|
||||
"Favorites" : "Favoritos",
|
||||
@@ -26,8 +27,19 @@
|
||||
"Unable to upload {filename} as it is a directory or has 0 bytes" : "Nun pudo xubise {filename}, paez que ye un directoriu o tien 0 bytes",
|
||||
"Total file size {size1} exceeds upload limit {size2}" : "El tamañu de ficheru total {size1} perpasa la llende de xuba {size2}",
|
||||
"Not enough free space, you are uploading {size1} but only {size2} is left" : "Nun hai abondu espaciu llibre, tas xubiendo {size1} pero namái falta {size2}",
|
||||
"Error uploading file \"{fileName}\": {message}" : "Fallu xubiendo'l ficheru \"{fileName}\": {message}",
|
||||
"Could not get result from server." : "Nun pudo obtenese'l resultáu del sirvidor.",
|
||||
"Uploading..." : "Xubiendo...",
|
||||
"..." : "...",
|
||||
"{hours}:{minutes}:{seconds} hour{plural_s} left" : "Falten {hours}:{minutes}:{seconds} hour{plural_s}",
|
||||
"{hours}:{minutes}h" : "{hours}:{minutes}h",
|
||||
"{minutes}:{seconds} minute{plural_s} left" : "Falten {minutes}:{seconds} minute{plural_s} ",
|
||||
"{minutes}:{seconds}m" : "{minutes}:{seconds}m",
|
||||
"{seconds} second{plural_s} left" : "Falten {seconds} second{plural_s}",
|
||||
"{seconds}s" : "{seconds}s",
|
||||
"Any moment now..." : "En cualquier momentu...",
|
||||
"Soon..." : "Pronto...",
|
||||
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} de {totalSize} ({bitrate})",
|
||||
"File upload is in progress. Leaving the page now will cancel the upload." : "La xuba del ficheru ta en progresu. Si dexes agora la páxina, va encaboxase la xuba.",
|
||||
"Actions" : "Aiciones",
|
||||
"Download" : "Descargar",
|
||||
@@ -41,6 +53,17 @@
|
||||
"Unable to determine date" : "Imposible determinar la fecha",
|
||||
"This operation is forbidden" : "La operación ta prohibida",
|
||||
"This directory is unavailable, please check the logs or contact the administrator" : "Esti direutoriu nun ta disponible, por favor verifica'l rexistru o contacta l'alministrador",
|
||||
"Could not move \"{file}\", target exists" : "Nun pudo movese \"{file}\", destín yá esiste",
|
||||
"Could not move \"{file}\"" : "Nun pudo movese \"{file}\"",
|
||||
"{newName} already exists" : "{newName} yá esiste",
|
||||
"Could not rename \"{fileName}\", it does not exist any more" : "Nun pudo renomase \"{fileName}\", yá nun esiste",
|
||||
"The name \"{targetName}\" is already used in the folder \"{dir}\". Please choose a different name." : "El nome \"{targetName}\" yá ta n'usu na carpeta \"{dir}\". Por favor, escueyi un nome diferente.",
|
||||
"Could not rename \"{fileName}\"" : "Nun pudo renomase \"{fileName}\"",
|
||||
"Could not create file \"{file}\"" : "Nun pudo crease'l ficheru \"{file}\"",
|
||||
"Could not create file \"{file}\" because it already exists" : "Nun pudo crease'l ficheru \"{file}\" porque yá esiste",
|
||||
"Could not create folder \"{dir}\"" : "Nun pudo crease la carpeta \"{dir}\"",
|
||||
"Could not create folder \"{dir}\" because it already exists" : "Nun pudo crease la carpeta \"{dir}\" porque yá esiste",
|
||||
"Error deleting file \"{fileName}\"." : "Fallu borrando'l ficheru \"{fileName}\".",
|
||||
"No entries in this folder match '{filter}'" : "Nun concasa nenguna entrada nesta carpeta '{filter}'",
|
||||
"Name" : "Nome",
|
||||
"Size" : "Tamañu",
|
||||
@@ -62,6 +85,7 @@
|
||||
"_%n byte_::_%n bytes_" : ["%n bytes","%n bytes"],
|
||||
"Favorited" : "Favoritos",
|
||||
"Favorite" : "Favoritu",
|
||||
"Local link" : "Enllaz llocal",
|
||||
"Folder" : "Carpeta",
|
||||
"New folder" : "Nueva carpeta",
|
||||
"{newname} already exists" : "{newname} yá existe",
|
||||
@@ -89,8 +113,12 @@
|
||||
"Maximum upload size" : "Tamañu máximu de xubida",
|
||||
"max. possible: " : "máx. posible:",
|
||||
"Save" : "Guardar",
|
||||
"With PHP-FPM it might take 5 minutes for changes to be applied." : "Con PHP-FPM pue retrasase 5 minutos pa que los cambeos s'apliquen.",
|
||||
"Missing permissions to edit from here." : "Falten permisos pa editar dende equí.",
|
||||
"Settings" : "Axustes",
|
||||
"Show hidden files" : "Amosar ficheros ocultos",
|
||||
"WebDAV" : "WebDAV",
|
||||
"Use this address to <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">access your Files via WebDAV</a>" : "Usa esta direición <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">p'acceder a los dos Ficheros via WebDAV</a>",
|
||||
"No files in here" : "Nun hai nengún ficheru equí",
|
||||
"Upload some content or sync with your devices!" : "¡Xuba algún conteníu o sincroniza colos sos preseos!",
|
||||
"No entries found in this folder" : "Nenguna entrada en esta carpeta",
|
||||
|
||||
@@ -90,6 +90,7 @@ OC.L10N.register(
|
||||
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файловете, които се опитваш да качиш са по-големи от позволеното на този сървър.",
|
||||
"No favorites" : "Няма любими",
|
||||
"Files and folders you mark as favorite will show up here" : "Файловете и папките които отбелязваш като любими ще се показват тук",
|
||||
"Text file" : "Текстов файл"
|
||||
"Text file" : "Текстов файл",
|
||||
"New text file.txt" : "Нов текст file.txt"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
@@ -88,6 +88,7 @@
|
||||
"The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файловете, които се опитваш да качиш са по-големи от позволеното на този сървър.",
|
||||
"No favorites" : "Няма любими",
|
||||
"Files and folders you mark as favorite will show up here" : "Файловете и папките които отбелязваш като любими ще се показват тук",
|
||||
"Text file" : "Текстов файл"
|
||||
"Text file" : "Текстов файл",
|
||||
"New text file.txt" : "Нов текст file.txt"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -33,7 +33,15 @@ OC.L10N.register(
|
||||
"Could not get result from server." : "Ne peut recevoir les résultats du serveur.",
|
||||
"Uploading..." : "Téléversement en cours…",
|
||||
"..." : "...",
|
||||
"{hours}:{minutes}:{seconds} hour{plural_s} left" : "{hours}:{minutes}:{seconds} heure{plural_s} restante{plural_s}",
|
||||
"{hours}:{minutes}h" : "{hours}:{minutes}h",
|
||||
"{minutes}:{seconds} minute{plural_s} left" : "{minutes}:{seconds} minute{plural_s} restante{plural_s}",
|
||||
"{minutes}:{seconds}m" : "{minutes}:{seconds}m",
|
||||
"{seconds} second{plural_s} left" : "{seconds} seconde{plural_s} restante{plural_s}",
|
||||
"{seconds}s" : "{seconds}s",
|
||||
"Any moment now..." : "D'un instant à l'autre...",
|
||||
"Soon..." : "Bientôt...",
|
||||
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} sur {totalSize} ({bitrate})",
|
||||
"File upload is in progress. Leaving the page now will cancel the upload." : "L'envoi du fichier est en cours. Quitter cette page maintenant annulera l'envoi du fichier.",
|
||||
"Actions" : "Actions",
|
||||
"Download" : "Télécharger",
|
||||
|
||||
@@ -31,7 +31,15 @@
|
||||
"Could not get result from server." : "Ne peut recevoir les résultats du serveur.",
|
||||
"Uploading..." : "Téléversement en cours…",
|
||||
"..." : "...",
|
||||
"{hours}:{minutes}:{seconds} hour{plural_s} left" : "{hours}:{minutes}:{seconds} heure{plural_s} restante{plural_s}",
|
||||
"{hours}:{minutes}h" : "{hours}:{minutes}h",
|
||||
"{minutes}:{seconds} minute{plural_s} left" : "{minutes}:{seconds} minute{plural_s} restante{plural_s}",
|
||||
"{minutes}:{seconds}m" : "{minutes}:{seconds}m",
|
||||
"{seconds} second{plural_s} left" : "{seconds} seconde{plural_s} restante{plural_s}",
|
||||
"{seconds}s" : "{seconds}s",
|
||||
"Any moment now..." : "D'un instant à l'autre...",
|
||||
"Soon..." : "Bientôt...",
|
||||
"{loadedSize} of {totalSize} ({bitrate})" : "{loadedSize} sur {totalSize} ({bitrate})",
|
||||
"File upload is in progress. Leaving the page now will cancel the upload." : "L'envoi du fichier est en cours. Quitter cette page maintenant annulera l'envoi du fichier.",
|
||||
"Actions" : "Actions",
|
||||
"Download" : "Télécharger",
|
||||
|
||||
@@ -21,6 +21,7 @@ OC.L10N.register(
|
||||
"Invalid directory." : "無効なディレクトリです。",
|
||||
"Files" : "ファイル",
|
||||
"All files" : "すべてのファイル",
|
||||
"File could not be found" : "ファイルは見つかりませんでした。",
|
||||
"Home" : "ホーム",
|
||||
"Close" : "閉じる",
|
||||
"Favorites" : "お気に入り",
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
"Invalid directory." : "無効なディレクトリです。",
|
||||
"Files" : "ファイル",
|
||||
"All files" : "すべてのファイル",
|
||||
"File could not be found" : "ファイルは見つかりませんでした。",
|
||||
"Home" : "ホーム",
|
||||
"Close" : "閉じる",
|
||||
"Favorites" : "お気に入り",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user