aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorMichael Gapczynski <mtgap@owncloud.com>2012-07-31 15:00:04 -0400
committerMichael Gapczynski <mtgap@owncloud.com>2012-07-31 15:00:04 -0400
commit94ce8f2168bdd9897f54ec433ad7017fb3db1cc8 (patch)
treedb031ac7fd4788be6593e258d170c8f134533e4b /apps
parent269922543eaf9e69dbf5a15fa0ba34704040b09c (diff)
parentdfae77dec1650f171d09d4bde88ab74029f6e8c7 (diff)
downloadnextcloud-server-94ce8f2168bdd9897f54ec433ad7017fb3db1cc8.tar.gz
nextcloud-server-94ce8f2168bdd9897f54ec433ad7017fb3db1cc8.zip
Merge branch 'master' into share_api
Conflicts: apps/contacts/lib/app.php apps/files_sharing/js/share.js
Diffstat (limited to 'apps')
-rw-r--r--apps/bookmarks/l10n/ca.php12
-rw-r--r--apps/bookmarks/l10n/de.php12
-rw-r--r--apps/bookmarks/l10n/el.php12
-rw-r--r--apps/bookmarks/l10n/es.php12
-rw-r--r--apps/bookmarks/l10n/fi_FI.php12
-rw-r--r--apps/bookmarks/l10n/sl.php12
-rw-r--r--apps/bookmarks/l10n/sv.php12
-rw-r--r--apps/calendar/l10n/ca.php52
-rw-r--r--apps/calendar/l10n/de.php15
-rw-r--r--apps/calendar/l10n/el.php52
-rw-r--r--apps/calendar/l10n/fi_FI.php35
-rw-r--r--apps/calendar/l10n/fr.php50
-rw-r--r--apps/calendar/l10n/it.php50
-rw-r--r--apps/calendar/l10n/sv.php50
-rw-r--r--apps/calendar/l10n/vi.php135
-rw-r--r--apps/calendar/lib/connector_sabre.php12
-rw-r--r--apps/contacts/ajax/currentphoto.php2
-rw-r--r--apps/contacts/ajax/savecrop.php3
-rw-r--r--apps/contacts/ajax/uploadphoto.php2
-rw-r--r--apps/contacts/js/contacts.js60
-rw-r--r--apps/contacts/l10n/ca.php103
-rw-r--r--apps/contacts/l10n/de.php121
-rw-r--r--apps/contacts/l10n/el.php115
-rw-r--r--apps/contacts/l10n/fi_FI.php64
-rw-r--r--apps/contacts/l10n/fr.php111
-rw-r--r--apps/contacts/l10n/it.php103
-rw-r--r--apps/contacts/l10n/sk_SK.php86
-rw-r--r--apps/contacts/l10n/sv.php67
-rw-r--r--apps/contacts/l10n/vi.php48
-rw-r--r--apps/contacts/lib/app.php97
-rw-r--r--apps/contacts/lib/vcard.php6
-rw-r--r--apps/files/css/files.css1
-rw-r--r--apps/files/js/fileactions.js1
-rw-r--r--apps/files/js/filelist.js127
-rw-r--r--apps/files/l10n/ar.php2
-rw-r--r--apps/files/l10n/bg_BG.php2
-rw-r--r--apps/files/l10n/ca.php13
-rw-r--r--apps/files/l10n/cs_CZ.php12
-rw-r--r--apps/files/l10n/da.php12
-rw-r--r--apps/files/l10n/de.php17
-rw-r--r--apps/files/l10n/el.php13
-rw-r--r--apps/files/l10n/eo.php12
-rw-r--r--apps/files/l10n/es.php13
-rw-r--r--apps/files/l10n/et_EE.php12
-rw-r--r--apps/files/l10n/eu.php12
-rw-r--r--apps/files/l10n/fa.php12
-rw-r--r--apps/files/l10n/fi_FI.php13
-rw-r--r--apps/files/l10n/fr.php13
-rw-r--r--apps/files/l10n/gl.php12
-rw-r--r--apps/files/l10n/he.php12
-rw-r--r--apps/files/l10n/hr.php12
-rw-r--r--apps/files/l10n/hu_HU.php12
-rw-r--r--apps/files/l10n/ia.php2
-rw-r--r--apps/files/l10n/id.php2
-rw-r--r--apps/files/l10n/it.php13
-rw-r--r--apps/files/l10n/ja_JP.php12
-rw-r--r--apps/files/l10n/ko.php11
-rw-r--r--apps/files/l10n/lb.php2
-rw-r--r--apps/files/l10n/lt_LT.php18
-rw-r--r--apps/files/l10n/lv.php21
-rw-r--r--apps/files/l10n/mk.php12
-rw-r--r--apps/files/l10n/ms_MY.php26
-rw-r--r--apps/files/l10n/nb_NO.php8
-rw-r--r--apps/files/l10n/nl.php12
-rw-r--r--apps/files/l10n/nn_NO.php2
-rw-r--r--apps/files/l10n/pl.php12
-rw-r--r--apps/files/l10n/pt_BR.php12
-rw-r--r--apps/files/l10n/pt_PT.php12
-rw-r--r--apps/files/l10n/ro.php2
-rw-r--r--apps/files/l10n/ru.php12
-rw-r--r--apps/files/l10n/sk_SK.php12
-rw-r--r--apps/files/l10n/sl.php13
-rw-r--r--apps/files/l10n/sr.php2
-rw-r--r--apps/files/l10n/sr@latin.php2
-rw-r--r--apps/files/l10n/sv.php13
-rw-r--r--apps/files/l10n/th_TH.php12
-rw-r--r--apps/files/l10n/tr.php12
-rw-r--r--apps/files/l10n/uk.php2
-rw-r--r--apps/files/l10n/vi.php31
-rw-r--r--apps/files/l10n/zh_CN.php12
-rw-r--r--apps/files/l10n/zh_TW.php2
-rw-r--r--apps/files_external/lib/ftp.php5
-rw-r--r--apps/files_imageviewer/js/jquery.fancybox-1.3.4.js4
-rw-r--r--apps/files_imageviewer/js/jquery.fancybox-1.3.4.pack.js2
-rw-r--r--apps/files_sharing/ajax/email.php7
-rw-r--r--apps/files_sharing/ajax/getitem.php7
-rw-r--r--apps/files_sharing/js/share.js375
-rw-r--r--apps/files_sharing/lib_share.php9
-rw-r--r--apps/gallery/l10n/ca.php8
-rw-r--r--apps/gallery/l10n/el.php8
-rw-r--r--apps/gallery/l10n/es.php8
-rw-r--r--apps/gallery/l10n/fi_FI.php8
-rw-r--r--apps/gallery/l10n/fr.php8
-rw-r--r--apps/gallery/l10n/it.php8
-rw-r--r--apps/gallery/l10n/sl.php8
-rw-r--r--apps/gallery/l10n/sv.php8
-rw-r--r--apps/gallery/l10n/vi.php11
-rw-r--r--apps/media/l10n/vi.php14
-rw-r--r--apps/media/lib_ampache.php5
-rw-r--r--apps/user_ldap/ajax/testConfiguration.php39
-rw-r--r--apps/user_ldap/group_ldap.php53
-rw-r--r--apps/user_ldap/js/settings.js22
-rw-r--r--apps/user_ldap/lib/access.php24
-rw-r--r--apps/user_ldap/lib/connection.php74
-rw-r--r--apps/user_ldap/settings.php12
-rw-r--r--apps/user_ldap/templates/settings.php3
-rw-r--r--apps/user_ldap/user_ldap.php38
107 files changed, 2445 insertions, 485 deletions
diff --git a/apps/bookmarks/l10n/ca.php b/apps/bookmarks/l10n/ca.php
new file mode 100644
index 00000000000..cf90d9a8874
--- /dev/null
+++ b/apps/bookmarks/l10n/ca.php
@@ -0,0 +1,12 @@
+<?php $TRANSLATIONS = array(
+"Bookmarks" => "Adreces d'interès",
+"unnamed" => "sense nom",
+"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Arrossegueu-ho al navegador i feu-hi un clic quan volgueu marcar ràpidament una adreça d'interès:",
+"Read later" => "Llegeix més tard",
+"Address" => "Adreça",
+"Title" => "Títol",
+"Tags" => "Etiquetes",
+"Save bookmark" => "Desa l'adreça d'interès",
+"You have no bookmarks" => "No teniu adreces d'interès",
+"Bookmarklet <br />" => "Bookmarklet <br />"
+);
diff --git a/apps/bookmarks/l10n/de.php b/apps/bookmarks/l10n/de.php
new file mode 100644
index 00000000000..9e0f137382c
--- /dev/null
+++ b/apps/bookmarks/l10n/de.php
@@ -0,0 +1,12 @@
+<?php $TRANSLATIONS = array(
+"Bookmarks" => "Lesezeichen",
+"unnamed" => "unbenannt",
+"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Ziehe dies zu deinen Browser-Lesezeichen und klicke es, wenn du eine Website schnell den Lesezeichen hinzufügen willst.",
+"Read later" => "Später lesen",
+"Address" => "Adresse",
+"Title" => "Title",
+"Tags" => "Tags",
+"Save bookmark" => "Lesezeichen speichern",
+"You have no bookmarks" => "Du hast keine Lesezeichen",
+"Bookmarklet <br />" => "Bookmarklet <br />"
+);
diff --git a/apps/bookmarks/l10n/el.php b/apps/bookmarks/l10n/el.php
new file mode 100644
index 00000000000..f282a1bbf85
--- /dev/null
+++ b/apps/bookmarks/l10n/el.php
@@ -0,0 +1,12 @@
+<?php $TRANSLATIONS = array(
+"Bookmarks" => "Σελιδοδείκτες",
+"unnamed" => "ανώνυμο",
+"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Σύρετε αυτό στους σελιδοδείκτες του περιηγητή σας και κάντε κλικ επάνω του, όταν θέλετε να προσθέσετε σύντομα μια ιστοσελίδα ως σελιδοδείκτη:",
+"Read later" => "Ανάγνωση αργότερα",
+"Address" => "Διεύθυνση",
+"Title" => "Τίτλος",
+"Tags" => "Ετικέτες",
+"Save bookmark" => "Αποθήκευση σελιδοδείκτη",
+"You have no bookmarks" => "Δεν έχετε σελιδοδείκτες",
+"Bookmarklet <br />" => "Εφαρμογίδιο Σελιδοδεικτών <br />"
+);
diff --git a/apps/bookmarks/l10n/es.php b/apps/bookmarks/l10n/es.php
new file mode 100644
index 00000000000..071b0dda707
--- /dev/null
+++ b/apps/bookmarks/l10n/es.php
@@ -0,0 +1,12 @@
+<?php $TRANSLATIONS = array(
+"Bookmarks" => "Marcadores",
+"unnamed" => "sin nombre",
+"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Arrastra desde aquí a los marcadores de tu navegador, y haz clic cuando quieras marcar una página web rápidamente:",
+"Read later" => "Leer después",
+"Address" => "Dirección",
+"Title" => "Título",
+"Tags" => "Etiquetas",
+"Save bookmark" => "Guardar marcador",
+"You have no bookmarks" => "No tienes marcadores",
+"Bookmarklet <br />" => "Bookmarklet <br />"
+);
diff --git a/apps/bookmarks/l10n/fi_FI.php b/apps/bookmarks/l10n/fi_FI.php
new file mode 100644
index 00000000000..c814747411b
--- /dev/null
+++ b/apps/bookmarks/l10n/fi_FI.php
@@ -0,0 +1,12 @@
+<?php $TRANSLATIONS = array(
+"Bookmarks" => "Kirjanmerkit",
+"unnamed" => "nimetön",
+"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Vedä tämä selaimesi kirjanmerkkipalkkiin ja napsauta sitä, kun haluat lisätä kirjanmerkin nopeasti:",
+"Read later" => "Lue myöhemmin",
+"Address" => "Osoite",
+"Title" => "Otsikko",
+"Tags" => "Tunnisteet",
+"Save bookmark" => "Tallenna kirjanmerkki",
+"You have no bookmarks" => "Sinulla ei ole kirjanmerkkejä",
+"Bookmarklet <br />" => "Kirjanmerkitsin <br />"
+);
diff --git a/apps/bookmarks/l10n/sl.php b/apps/bookmarks/l10n/sl.php
new file mode 100644
index 00000000000..32a41629082
--- /dev/null
+++ b/apps/bookmarks/l10n/sl.php
@@ -0,0 +1,12 @@
+<?php $TRANSLATIONS = array(
+"Bookmarks" => "Zaznamki",
+"unnamed" => "neimenovano",
+"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Povlecite to povezavo med zaznamke v vašem brskalniku in jo, ko želite ustvariti zaznamek trenutne strani, preprosto kliknite:",
+"Read later" => "Preberi kasneje",
+"Address" => "Naslov",
+"Title" => "Ime",
+"Tags" => "Oznake",
+"Save bookmark" => "Shrani zaznamek",
+"You have no bookmarks" => "Nimate zaznamkov",
+"Bookmarklet <br />" => "Bookmarklet <br />"
+);
diff --git a/apps/bookmarks/l10n/sv.php b/apps/bookmarks/l10n/sv.php
new file mode 100644
index 00000000000..689bd452f12
--- /dev/null
+++ b/apps/bookmarks/l10n/sv.php
@@ -0,0 +1,12 @@
+<?php $TRANSLATIONS = array(
+"Bookmarks" => "Bokmärken",
+"unnamed" => "namnlös",
+"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Dra till din webbläsares bokmärken och klicka på det när du vill bokmärka en webbsida snabbt:",
+"Read later" => "Läs senare",
+"Address" => "Adress",
+"Title" => "Titel",
+"Tags" => "Taggar",
+"Save bookmark" => "Spara bokmärke",
+"You have no bookmarks" => "Du har inga bokmärken",
+"Bookmarklet <br />" => "Skriptbokmärke <br />"
+);
diff --git a/apps/calendar/l10n/ca.php b/apps/calendar/l10n/ca.php
index afb1c799d93..d999eaf4739 100644
--- a/apps/calendar/l10n/ca.php
+++ b/apps/calendar/l10n/ca.php
@@ -1,12 +1,23 @@
<?php $TRANSLATIONS = array(
+"Not all calendars are completely cached" => "No tots els calendaris estan en memòria",
+"Everything seems to be completely cached" => "Sembla que tot està en memòria",
"No calendars found." => "No s'han trobat calendaris.",
"No events found." => "No s'han trobat events.",
"Wrong calendar" => "Calendari erroni",
+"The file contained either no events or all events are already saved in your calendar." => "El fitxer no contenia esdeveniments o aquests ja estaven desats en el vostre caledari",
+"events has been saved in the new calendar" => "els esdeveniments s'han desat en el calendari nou",
+"Import failed" => "Ha fallat la importació",
+"events has been saved in your calendar" => "els esdveniments s'han desat en el calendari",
"New Timezone:" => "Nova zona horària:",
"Timezone changed" => "La zona horària ha canviat",
"Invalid request" => "Sol.licitud no vàlida",
"Calendar" => "Calendari",
-"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",
+"ddd" => "ddd",
+"ddd M/d" => "ddd d/M",
+"dddd M/d" => "dddd d/M",
+"MMMM yyyy" => "MMMM yyyy",
+"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}" => "d [MMM ][yyyy ]{'&#8212;' d MMM yyyy}",
+"dddd, MMM d, yyyy" => "dddd, d MMM, yyyy",
"Birthday" => "Aniversari",
"Business" => "Feina",
"Call" => "Trucada",
@@ -22,7 +33,9 @@
"Projects" => "Projectes",
"Questions" => "Preguntes",
"Work" => "Feina",
+"by" => "per",
"unnamed" => "sense nom",
+"New Calendar" => "Calendari nou",
"Does not repeat" => "No es repeteix",
"Daily" => "Diari",
"Weekly" => "Mensual",
@@ -67,8 +80,26 @@
"by day and month" => "per dia del mes",
"Date" => "Data",
"Cal." => "Cal.",
+"Sun." => "Dg.",
+"Mon." => "Dl.",
+"Tue." => "Dm.",
+"Wed." => "Dc.",
+"Thu." => "Dj.",
+"Fri." => "Dv.",
+"Sat." => "Ds.",
+"Jan." => "Gen.",
+"Feb." => "Febr.",
+"Mar." => "Març",
+"Apr." => "Abr.",
+"May." => "Maig",
+"Jun." => "Juny",
+"Jul." => "Jul.",
+"Aug." => "Ag.",
+"Sep." => "Set.",
+"Oct." => "Oct.",
+"Nov." => "Nov.",
+"Dec." => "Des.",
"All day" => "Tot el dia",
-"New Calendar" => "Calendari nou",
"Missing fields" => "Els camps que falten",
"Title" => "Títol",
"From Date" => "Des de la data",
@@ -132,18 +163,17 @@
"Interval" => "Interval",
"End" => "Final",
"occurrences" => "aparicions",
-"Import a calendar file" => "Importa un fitxer de calendari",
-"Please choose the calendar" => "Escolliu el calendari",
"create a new calendar" => "crea un nou calendari",
+"Import a calendar file" => "Importa un fitxer de calendari",
+"Please choose a calendar" => "Escolliu un calendari",
"Name of new calendar" => "Nom del nou calendari",
+"Take an available name!" => "Escolliu un nom disponible!",
+"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Ja hi ha un calendari amb aquest nom. Si continueu, els calendaris es combinaran.",
"Import" => "Importa",
-"Importing calendar" => "S'està important el calendari",
-"Calendar imported successfully" => "El calendari s'ha importat amb èxit",
"Close Dialog" => "Tanca el diàleg",
"Create a new event" => "Crea un nou esdeveniment",
"View an event" => "Mostra un event",
"No categories selected" => "No hi ha categories seleccionades",
-"Select category" => "Seleccioneu categoria",
"of" => "de",
"at" => "a",
"Timezone" => "Zona horària",
@@ -152,7 +182,13 @@
"24h" => "24h",
"12h" => "12h",
"First day of the week" => "Primer dia de la setmana",
-"Calendar CalDAV syncing address:" => "Adreça de sincronització del calendari CalDAV:",
+"Cache" => "Memòria de cau",
+"Clear cache for repeating events" => "Neteja la memòria de cau pels esdeveniments amb repetició",
+"Calendar CalDAV syncing addresses" => "Adreça de sincronització del calendari CalDAV",
+"more info" => "més informació",
+"Primary address (Kontact et al)" => "Adreça primària (Kontact et al)",
+"iOS/OS X" => "IOS/OS X",
+"Read only iCalendar link(s)" => "Enllaç(os) iCalendar només de lectura",
"Users" => "Usuaris",
"select users" => "seleccioneu usuaris",
"Editable" => "Editable",
diff --git a/apps/calendar/l10n/de.php b/apps/calendar/l10n/de.php
index 33c924ac2c3..8270b6785e4 100644
--- a/apps/calendar/l10n/de.php
+++ b/apps/calendar/l10n/de.php
@@ -1,8 +1,13 @@
<?php $TRANSLATIONS = array(
+"Not all calendars are completely cached" => "Noch sind nicht alle Kalender zwischengespeichert.",
+"Everything seems to be completely cached" => "Es sieht so aus, als wäre alles vollständig zwischengespeichert.",
"No calendars found." => "Keine Kalender gefunden",
"No events found." => "Keine Termine gefunden",
"Wrong calendar" => "Falscher Kalender",
+"The file contained either no events or all events are already saved in your calendar." => "Entweder enthielt die Datei keine Termine oder alle Termine waren schon im Kalender gespeichert.",
+"events has been saved in the new calendar" => "Der Termin wurde im neuen Kalender gespeichert.",
"Import failed" => "Import fehlgeschlagen",
+"events has been saved in your calendar" => "Der Termin wurde im Kalender gespeichert.",
"New Timezone:" => "Neue Zeitzone:",
"Timezone changed" => "Zeitzone geändert",
"Invalid request" => "Fehlerhafte Anfrage",
@@ -160,7 +165,10 @@
"occurrences" => "Termine",
"create a new calendar" => "Neuen Kalender anlegen",
"Import a calendar file" => "Kalenderdatei Importieren",
+"Please choose a calendar" => "Wählen Sie bitte einen Kalender.",
"Name of new calendar" => "Kalendername",
+"Take an available name!" => "Wählen Sie einen verfügbaren Namen.",
+"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Ein Kalender mit diesem Namen existiert schon. Sollten Sie fortfahren, werden die beiden Kalender zusammengeführt.",
"Import" => "Importieren",
"Close Dialog" => "Dialog schließen",
"Create a new event" => "Neues Ereignis",
@@ -174,6 +182,13 @@
"24h" => "24h",
"12h" => "12h",
"First day of the week" => "erster Wochentag",
+"Cache" => "Zwischenspeicher",
+"Clear cache for repeating events" => "Lösche den Zwischenspeicher für wiederholende Veranstaltungen.",
+"Calendar CalDAV syncing addresses" => "CalDAV-Kalender gleicht Adressen ab.",
+"more info" => "weitere Informationen",
+"Primary address (Kontact et al)" => "Primäre Adresse (Kontakt u.a.)",
+"iOS/OS X" => "iOS/OS X",
+"Read only iCalendar link(s)" => "Nur lesende(r) iCalender-Link(s)",
"Users" => "Benutzer",
"select users" => "Benutzer auswählen",
"Editable" => "editierbar",
diff --git a/apps/calendar/l10n/el.php b/apps/calendar/l10n/el.php
index 0b289fbcf68..46572138485 100644
--- a/apps/calendar/l10n/el.php
+++ b/apps/calendar/l10n/el.php
@@ -1,17 +1,28 @@
<?php $TRANSLATIONS = array(
+"Not all calendars are completely cached" => "Δεν έχει δημιουργηθεί λανθάνουσα μνήμη για όλα τα ημερολόγια",
+"Everything seems to be completely cached" => "Όλα έχουν αποθηκευτεί στη cache",
"No calendars found." => "Δε βρέθηκαν ημερολόγια.",
"No events found." => "Δε βρέθηκαν γεγονότα.",
"Wrong calendar" => "Λάθος ημερολόγιο",
+"The file contained either no events or all events are already saved in your calendar." => "Το αρχείο που περιέχει είτε κανένα γεγονός είτε όλα τα γεγονότα έχουν ήδη αποθηκευτεί στο ημερολόγιό σας.",
+"events has been saved in the new calendar" => "τα συμβάντα αποθηκεύτηκαν σε ένα νέο ημερολόγιο",
+"Import failed" => "Η εισαγωγή απέτυχε",
+"events has been saved in your calendar" => "το συμβάν αποθηκεύτηκε στο ημερολογιό σου",
"New Timezone:" => "Νέα ζώνη ώρας:",
"Timezone changed" => "Η ζώνη ώρας άλλαξε",
"Invalid request" => "Μη έγκυρο αίτημα",
"Calendar" => "Ημερολόγιο",
+"ddd" => "ddd",
+"ddd M/d" => "ddd M/d",
+"dddd M/d" => "dddd M/d",
+"MMMM yyyy" => "MMMM yyyy",
"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",
+"dddd, MMM d, yyyy" => "dddd, MMM d, yyyy",
"Birthday" => "Γενέθλια",
"Business" => "Επιχείρηση",
"Call" => "Κλήση",
"Clients" => "Πελάτες",
-"Deliverer" => "Παραδώσας",
+"Deliverer" => "Προμηθευτής",
"Holidays" => "Διακοπές",
"Ideas" => "Ιδέες",
"Journey" => "Ταξίδι",
@@ -22,7 +33,9 @@
"Projects" => "Έργα",
"Questions" => "Ερωτήσεις",
"Work" => "Εργασία",
+"by" => "από",
"unnamed" => "ανώνυμο",
+"New Calendar" => "Νέα Ημερολόγιο",
"Does not repeat" => "Μη επαναλαμβανόμενο",
"Daily" => "Καθημερινά",
"Weekly" => "Εβδομαδιαία",
@@ -67,8 +80,26 @@
"by day and month" => "κατά ημέρα και μήνα",
"Date" => "Ημερομηνία",
"Cal." => "Ημερ.",
+"Sun." => "Κυρ.",
+"Mon." => "Δευ.",
+"Tue." => "Τρί.",
+"Wed." => "Τετ.",
+"Thu." => "Πέμ.",
+"Fri." => "Παρ.",
+"Sat." => "Σάβ.",
+"Jan." => "Ιαν.",
+"Feb." => "Φεβ.",
+"Mar." => "Μάρ.",
+"Apr." => "Απρ.",
+"May." => "Μαΐ.",
+"Jun." => "Ιούν.",
+"Jul." => "Ιούλ.",
+"Aug." => "Αύγ.",
+"Sep." => "Σεπ.",
+"Oct." => "Οκτ.",
+"Nov." => "Νοέ.",
+"Dec." => "Δεκ.",
"All day" => "Ολοήμερο",
-"New Calendar" => "Νέα Ημερολόγιο",
"Missing fields" => "Πεδία που λείπουν",
"Title" => "Τίτλος",
"From Date" => "Από Ημερομηνία",
@@ -132,18 +163,17 @@
"Interval" => "Διάστημα",
"End" => "Τέλος",
"occurrences" => "περιστατικά",
-"Import a calendar file" => "Εισαγωγή αρχείου ημερολογίου",
-"Please choose the calendar" => "Παρακαλώ επιλέξτε το ημερολόγιο",
"create a new calendar" => "δημιουργία νέου ημερολογίου",
+"Import a calendar file" => "Εισαγωγή αρχείου ημερολογίου",
+"Please choose a calendar" => "Παρακαλώ επέλεξε ένα ημερολόγιο",
"Name of new calendar" => "Όνομα νέου ημερολογίου",
+"Take an available name!" => "Επέλεξε ένα διαθέσιμο όνομα!",
+"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Ένα ημερολόγιο με αυτό το όνομα υπάρχει ήδη. Εάν θέλετε να συνεχίσετε, αυτά τα 2 ημερολόγια θα συγχωνευθούν.",
"Import" => "Εισαγωγή",
-"Importing calendar" => "Εισαγωγή ημερολογίου",
-"Calendar imported successfully" => "Το ημερολόγιο εισήχθει επιτυχώς",
"Close Dialog" => "Κλείσιμο Διαλόγου",
"Create a new event" => "Δημιουργήστε ένα νέο συμβάν",
"View an event" => "Εμφάνισε ένα γεγονός",
"No categories selected" => "Δεν επελέγησαν κατηγορίες",
-"Select category" => "Επιλέξτε κατηγορία",
"of" => "του",
"at" => "στο",
"Timezone" => "Ζώνη ώρας",
@@ -152,7 +182,13 @@
"24h" => "24ω",
"12h" => "12ω",
"First day of the week" => "Πρώτη μέρα της εβδομάδας",
-"Calendar CalDAV syncing address:" => "Διεύθυνση για το συγχρονισμού του ημερολογίου CalDAV:",
+"Cache" => "Cache",
+"Clear cache for repeating events" => "Εκκαθάριση λανθάνουσας μνήμης για επανάληψη γεγονότων",
+"Calendar CalDAV syncing addresses" => "Διευθύνσεις συγχρονισμού ημερολογίου CalDAV",
+"more info" => "περισσότερες πλροφορίες",
+"Primary address (Kontact et al)" => "Κύρια Διεύθυνση(Επαφή και άλλα)",
+"iOS/OS X" => "iOS/OS X",
+"Read only iCalendar link(s)" => " iCalendar link(s) μόνο για ανάγνωση",
"Users" => "Χρήστες",
"select users" => "επέλεξε χρήστες",
"Editable" => "Επεξεργάσιμο",
diff --git a/apps/calendar/l10n/fi_FI.php b/apps/calendar/l10n/fi_FI.php
index 4de94b7b7b7..23096d7365a 100644
--- a/apps/calendar/l10n/fi_FI.php
+++ b/apps/calendar/l10n/fi_FI.php
@@ -2,6 +2,9 @@
"No calendars found." => "Kalentereita ei löytynyt",
"No events found." => "Tapahtumia ei löytynyt.",
"Wrong calendar" => "Väärä kalenteri",
+"The file contained either no events or all events are already saved in your calendar." => "Tiedosto ei joko sisältänyt tapahtumia tai vaihtoehtoisesti kaikki tapahtumat on jo tallennettu kalenteriisi.",
+"Import failed" => "Tuonti epäonnistui",
+"events has been saved in your calendar" => "tapahtumaa on tallennettu kalenteriisi",
"New Timezone:" => "Uusi aikavyöhyke:",
"Timezone changed" => "Aikavyöhyke vaihdettu",
"Invalid request" => "Virheellinen pyyntö",
@@ -21,6 +24,7 @@
"Questions" => "Kysymykset",
"Work" => "Työ",
"unnamed" => "nimetön",
+"New Calendar" => "Uusi kalenteri",
"Does not repeat" => "Ei toistoa",
"Daily" => "Päivittäin",
"Weekly" => "Viikottain",
@@ -55,8 +59,26 @@
"November" => "Marraskuu",
"December" => "Joulukuu",
"Date" => "Päivämäärä",
+"Sun." => "Su",
+"Mon." => "Ma",
+"Tue." => "Ti",
+"Wed." => "Ke",
+"Thu." => "To",
+"Fri." => "Pe",
+"Sat." => "La",
+"Jan." => "Tammi",
+"Feb." => "Helmi",
+"Mar." => "Maalis",
+"Apr." => "Huhti",
+"May." => "Touko",
+"Jun." => "Kesä",
+"Jul." => "Heinä",
+"Aug." => "Elo",
+"Sep." => "Syys",
+"Oct." => "Loka",
+"Nov." => "Marras",
+"Dec." => "Joulu",
"All day" => "Koko päivä",
-"New Calendar" => "Uusi kalenteri",
"Missing fields" => "Puuttuvat kentät",
"Title" => "Otsikko",
"The event ends before it starts" => "Tapahtuma päättyy ennen alkamistaan",
@@ -110,25 +132,24 @@
"Select months" => "Valitse kuukaudet",
"Select weeks" => "Valitse viikot",
"Interval" => "Intervalli",
-"Import a calendar file" => "Tuo kalenteritiedosto",
-"Please choose the calendar" => "Valitse kalenteri",
"create a new calendar" => "luo uusi kalenteri",
+"Import a calendar file" => "Tuo kalenteritiedosto",
+"Please choose a calendar" => "Valitse kalenteri",
"Name of new calendar" => "Uuden kalenterin nimi",
+"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Samalla nimellä on jo olemassa kalenteri. Jos jatkat kaikesta huolimatta, kalenterit yhdistetään.",
"Import" => "Tuo",
-"Importing calendar" => "Tuodaan kalenteria",
-"Calendar imported successfully" => "Kalenteri tuotu onnistuneesti",
"Close Dialog" => "Sulje ikkuna",
"Create a new event" => "Luo uusi tapahtuma",
"View an event" => "Avaa tapahtuma",
"No categories selected" => "Luokkia ei ole valittu",
-"Select category" => "Valitse luokka",
"Timezone" => "Aikavyöhyke",
"Check always for changes of the timezone" => "Tarkista aina aikavyöhykkeen muutokset",
"Timeformat" => "Ajan esitysmuoto",
"24h" => "24 tuntia",
"12h" => "12 tuntia",
"First day of the week" => "Viikon ensimmäinen päivä",
-"Calendar CalDAV syncing address:" => "Kalenterin CalDAV-synkronointiosoite:",
+"Calendar CalDAV syncing addresses" => "Kalenterin CalDAV-synkronointiosoitteet",
+"iOS/OS X" => "iOS/OS X",
"Users" => "Käyttäjät",
"select users" => "valitse käyttäjät",
"Editable" => "Muoktattava",
diff --git a/apps/calendar/l10n/fr.php b/apps/calendar/l10n/fr.php
index 506453af428..289bc905b3c 100644
--- a/apps/calendar/l10n/fr.php
+++ b/apps/calendar/l10n/fr.php
@@ -1,12 +1,23 @@
<?php $TRANSLATIONS = array(
+"Not all calendars are completely cached" => "Tous les calendriers ne sont pas mis en cache",
+"Everything seems to be completely cached" => "Tout semble être en cache",
"No calendars found." => "Aucun calendrier n'a été trouvé.",
"No events found." => "Aucun événement n'a été trouvé.",
"Wrong calendar" => "Mauvais calendrier",
+"The file contained either no events or all events are already saved in your calendar." => "Soit le fichier ne contient aucun événement soit tous les événements sont déjà enregistrés dans votre calendrier.",
+"events has been saved in the new calendar" => "Les événements ont été enregistrés dans le nouveau calendrier",
+"Import failed" => "Échec de l'import",
+"events has been saved in your calendar" => "Les événements ont été enregistrés dans votre calendrier",
"New Timezone:" => "Nouveau fuseau horaire :",
"Timezone changed" => "Fuseau horaire modifié",
"Invalid request" => "Requête invalide",
"Calendar" => "Calendrier",
+"ddd" => "jjj",
+"ddd M/d" => "jjj M/j",
+"dddd M/d" => "jjjj M/j",
+"MMMM yyyy" => "MMMM aaaa",
"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",
+"dddd, MMM d, yyyy" => "jjjj, MMM j, aaaa",
"Birthday" => "Anniversaire",
"Business" => "Professionnel",
"Call" => "Appel",
@@ -22,7 +33,9 @@
"Projects" => "Projets",
"Questions" => "Questions",
"Work" => "Travail",
+"by" => "par",
"unnamed" => "sans-nom",
+"New Calendar" => "Nouveau Calendrier",
"Does not repeat" => "Pas de répétition",
"Daily" => "Tous les jours",
"Weekly" => "Hebdomadaire",
@@ -67,8 +80,26 @@
"by day and month" => "par jour et mois",
"Date" => "Date",
"Cal." => "Cal.",
+"Sun." => "Dim.",
+"Mon." => "Lun.",
+"Tue." => "Mar.",
+"Wed." => "Mer.",
+"Thu." => "Jeu",
+"Fri." => "Ven.",
+"Sat." => "Sam.",
+"Jan." => "Jan.",
+"Feb." => "Fév.",
+"Mar." => "Mars",
+"Apr." => "Avr.",
+"May." => "Mai",
+"Jun." => "Juin",
+"Jul." => "Juil.",
+"Aug." => "Août",
+"Sep." => "Sep.",
+"Oct." => "Oct.",
+"Nov." => "Nov.",
+"Dec." => "Déc.",
"All day" => "Journée entière",
-"New Calendar" => "Nouveau Calendrier",
"Missing fields" => "Champs manquants",
"Title" => "Titre",
"From Date" => "De la date",
@@ -132,18 +163,17 @@
"Interval" => "Intervalle",
"End" => "Fin",
"occurrences" => "occurrences",
-"Import a calendar file" => "Importer un fichier de calendriers",
-"Please choose the calendar" => "Choisissez le calendrier svp",
"create a new calendar" => "Créer un nouveau calendrier",
+"Import a calendar file" => "Importer un fichier de calendriers",
+"Please choose a calendar" => "Veuillez sélectionner un calendrier",
"Name of new calendar" => "Nom pour le nouveau calendrier",
+"Take an available name!" => "Choisissez un nom disponible !",
+"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Un calendrier de ce nom existe déjà. Si vous choisissez de continuer les calendriers seront fusionnés.",
"Import" => "Importer",
-"Importing calendar" => "Import du calendrier",
-"Calendar imported successfully" => "Calendrier importé avec succès",
"Close Dialog" => "Fermer la fenêtre",
"Create a new event" => "Créer un nouvel événement",
"View an event" => "Voir un événement",
"No categories selected" => "Aucune catégorie sélectionnée",
-"Select category" => "Sélectionner une catégorie",
"of" => "de",
"at" => "à",
"Timezone" => "Fuseau horaire",
@@ -152,7 +182,13 @@
"24h" => "24h",
"12h" => "12h",
"First day of the week" => "Premier jour de la semaine",
-"Calendar CalDAV syncing address:" => "Adresse de synchronisation du calendrier CalDAV :",
+"Cache" => "Cache",
+"Clear cache for repeating events" => "Nettoyer le cache des événements répétitifs",
+"Calendar CalDAV syncing addresses" => "Adresses de synchronisation des calendriers CalDAV",
+"more info" => "plus d'infos",
+"Primary address (Kontact et al)" => "Adresses principales (Kontact et assimilés)",
+"iOS/OS X" => "iOS/OS X",
+"Read only iCalendar link(s)" => "lien(s) iCalendar en lecture seule",
"Users" => "Utilisateurs",
"select users" => "sélectionner les utilisateurs",
"Editable" => "Modifiable",
diff --git a/apps/calendar/l10n/it.php b/apps/calendar/l10n/it.php
index cdb2d99c82e..b91e8b0df0b 100644
--- a/apps/calendar/l10n/it.php
+++ b/apps/calendar/l10n/it.php
@@ -1,12 +1,23 @@
<?php $TRANSLATIONS = array(
+"Not all calendars are completely cached" => "Non tutti i calendari sono mantenuti completamente in cache",
+"Everything seems to be completely cached" => "Tutto sembra essere mantenuto completamente in cache",
"No calendars found." => "Nessun calendario trovato.",
"No events found." => "Nessun evento trovato.",
"Wrong calendar" => "Calendario sbagliato",
+"The file contained either no events or all events are already saved in your calendar." => "Il file non conteneva alcun evento o tutti gli eventi erano già salvati nel tuo calendario.",
+"events has been saved in the new calendar" => "gli eventi sono stati salvati nel nuovo calendario",
+"Import failed" => "Importazione non riuscita",
+"events has been saved in your calendar" => "gli eventi sono stati salvati nel tuo calendario",
"New Timezone:" => "Nuovo fuso orario:",
"Timezone changed" => "Fuso orario cambiato",
"Invalid request" => "Richiesta non valida",
"Calendar" => "Calendario",
+"ddd" => "ggg",
+"ddd M/d" => "ggg M/g",
+"dddd M/d" => "gggg M/g",
+"MMMM yyyy" => "MMMM aaaa",
"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",
+"dddd, MMM d, yyyy" => "gggg, MMM g, aaaa",
"Birthday" => "Compleanno",
"Business" => "Azienda",
"Call" => "Chiama",
@@ -22,7 +33,9 @@
"Projects" => "Progetti",
"Questions" => "Domande",
"Work" => "Lavoro",
+"by" => "da",
"unnamed" => "senza nome",
+"New Calendar" => "Nuovo calendario",
"Does not repeat" => "Non ripetere",
"Daily" => "Giornaliero",
"Weekly" => "Settimanale",
@@ -67,8 +80,26 @@
"by day and month" => "per giorno e mese",
"Date" => "Data",
"Cal." => "Cal.",
+"Sun." => "Dom.",
+"Mon." => "Lun.",
+"Tue." => "Mar.",
+"Wed." => "Mer.",
+"Thu." => "Gio.",
+"Fri." => "Ven.",
+"Sat." => "Sab.",
+"Jan." => "Gen.",
+"Feb." => "Feb.",
+"Mar." => "Mar.",
+"Apr." => "Apr.",
+"May." => "Mag.",
+"Jun." => "Giu.",
+"Jul." => "Lug.",
+"Aug." => "Ago.",
+"Sep." => "Set.",
+"Oct." => "Ott.",
+"Nov." => "Nov.",
+"Dec." => "Dic.",
"All day" => "Tutti il giorno",
-"New Calendar" => "Nuovo calendario",
"Missing fields" => "Campi mancanti",
"Title" => "Titolo",
"From Date" => "Dal giorno",
@@ -132,18 +163,17 @@
"Interval" => "Intervallo",
"End" => "Fine",
"occurrences" => "occorrenze",
-"Import a calendar file" => "Importa un file di calendario",
-"Please choose the calendar" => "Scegli il calendario",
"create a new calendar" => "Crea un nuovo calendario",
+"Import a calendar file" => "Importa un file di calendario",
+"Please choose a calendar" => "Scegli un calendario",
"Name of new calendar" => "Nome del nuovo calendario",
+"Take an available name!" => "Usa un nome disponibile!",
+"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Un calendario con questo nome esiste già. Se continui, i due calendari saranno uniti.",
"Import" => "Importa",
-"Importing calendar" => "Importazione del calendario in corso",
-"Calendar imported successfully" => "Calendario importato correttamente",
"Close Dialog" => "Chiudi la finestra di dialogo",
"Create a new event" => "Crea un nuovo evento",
"View an event" => "Visualizza un evento",
"No categories selected" => "Nessuna categoria selezionata",
-"Select category" => "Seleziona una categoria",
"of" => "di",
"at" => "alle",
"Timezone" => "Fuso orario",
@@ -152,7 +182,13 @@
"24h" => "24h",
"12h" => "12h",
"First day of the week" => "Primo giorno della settimana",
-"Calendar CalDAV syncing address:" => "Indirizzo sincronizzazione calendario CalDAV:",
+"Cache" => "Cache",
+"Clear cache for repeating events" => "Cancella gli eventi che si ripetono dalla cache",
+"Calendar CalDAV syncing addresses" => "Indirizzi di sincronizzazione calendari CalDAV",
+"more info" => "ulteriori informazioni",
+"Primary address (Kontact et al)" => "Indirizzo principale (Kontact e altri)",
+"iOS/OS X" => "iOS/OS X",
+"Read only iCalendar link(s)" => "Collegamento(i) iCalendar sola lettura",
"Users" => "Utenti",
"select users" => "seleziona utenti",
"Editable" => "Modificabile",
diff --git a/apps/calendar/l10n/sv.php b/apps/calendar/l10n/sv.php
index 59f8c6e6b5d..e29e96b4631 100644
--- a/apps/calendar/l10n/sv.php
+++ b/apps/calendar/l10n/sv.php
@@ -1,12 +1,23 @@
<?php $TRANSLATIONS = array(
+"Not all calendars are completely cached" => "Alla kalendrar är inte fullständigt sparade i cache",
+"Everything seems to be completely cached" => "Allt verkar vara fullständigt sparat i cache",
"No calendars found." => "Inga kalendrar funna",
"No events found." => "Inga händelser funna.",
"Wrong calendar" => "Fel kalender",
+"The file contained either no events or all events are already saved in your calendar." => "Filen innehöll inga händelser eller så är alla händelser redan sparade i kalendern.",
+"events has been saved in the new calendar" => "händelser har sparats i den nya kalendern",
+"Import failed" => "Misslyckad import",
+"events has been saved in your calendar" => "händelse har sparats i din kalender",
"New Timezone:" => "Ny tidszon:",
"Timezone changed" => "Tidszon ändrad",
"Invalid request" => "Ogiltig begäran",
"Calendar" => "Kalender",
+"ddd" => "ddd",
+"ddd M/d" => "ddd M/d",
+"dddd M/d" => "dddd M/d",
+"MMMM yyyy" => "MMMM åååå",
"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",
+"dddd, MMM d, yyyy" => "ddd, MMM d, åååå",
"Birthday" => "Födelsedag",
"Business" => "Företag",
"Call" => "Ringa",
@@ -22,7 +33,9 @@
"Projects" => "Projekt",
"Questions" => "Frågor",
"Work" => "Arbetet",
+"by" => "av",
"unnamed" => "Namn saknas",
+"New Calendar" => "Ny kalender",
"Does not repeat" => "Upprepas inte",
"Daily" => "Dagligen",
"Weekly" => "Varje vecka",
@@ -67,8 +80,26 @@
"by day and month" => "efter dag och månad",
"Date" => "Datum",
"Cal." => "Kal.",
+"Sun." => "Sön.",
+"Mon." => "Mån.",
+"Tue." => "Tis.",
+"Wed." => "Ons.",
+"Thu." => "Tor.",
+"Fri." => "Fre.",
+"Sat." => "Lör.",
+"Jan." => "Jan.",
+"Feb." => "Feb.",
+"Mar." => "Mar.",
+"Apr." => "Apr.",
+"May." => "Maj.",
+"Jun." => "Jun.",
+"Jul." => "Jul.",
+"Aug." => "Aug.",
+"Sep." => "Sep.",
+"Oct." => "Okt.",
+"Nov." => "Nov.",
+"Dec." => "Dec.",
"All day" => "Hela dagen",
-"New Calendar" => "Ny kalender",
"Missing fields" => "Saknade fält",
"Title" => "Rubrik",
"From Date" => "Från datum",
@@ -132,18 +163,17 @@
"Interval" => "Hur ofta",
"End" => "Slut",
"occurrences" => "Händelser",
-"Import a calendar file" => "Importera en kalenderfil",
-"Please choose the calendar" => "Välj kalender",
"create a new calendar" => "skapa en ny kalender",
+"Import a calendar file" => "Importera en kalenderfil",
+"Please choose a calendar" => "Välj en kalender",
"Name of new calendar" => "Namn på ny kalender",
+"Take an available name!" => "Ta ett ledigt namn!",
+"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "En kalender med detta namn finns redan. Om du fortsätter ändå så kommer dessa kalendrar att slås samman.",
"Import" => "Importera",
-"Importing calendar" => "Importerar kalender",
-"Calendar imported successfully" => "Kalender importerades utan problem",
"Close Dialog" => "Stäng ",
"Create a new event" => "Skapa en ny händelse",
"View an event" => "Visa en händelse",
"No categories selected" => "Inga kategorier valda",
-"Select category" => "Välj kategori",
"of" => "av",
"at" => "på",
"Timezone" => "Tidszon",
@@ -152,7 +182,13 @@
"24h" => "24h",
"12h" => "12h",
"First day of the week" => "Första dagen av veckan",
-"Calendar CalDAV syncing address:" => "Synkroniseringsadress för CalDAV kalender:",
+"Cache" => "Cache",
+"Clear cache for repeating events" => "Töm cache för upprepade händelser",
+"Calendar CalDAV syncing addresses" => "Kalender CalDAV synkroniserar adresser",
+"more info" => "mer info",
+"Primary address (Kontact et al)" => "Primary address (Kontact et al)",
+"iOS/OS X" => "iOS/OS X",
+"Read only iCalendar link(s)" => "Read only iCalendar link(s)",
"Users" => "Användare",
"select users" => "välj användare",
"Editable" => "Redigerbar",
diff --git a/apps/calendar/l10n/vi.php b/apps/calendar/l10n/vi.php
new file mode 100644
index 00000000000..059b89e1635
--- /dev/null
+++ b/apps/calendar/l10n/vi.php
@@ -0,0 +1,135 @@
+<?php $TRANSLATIONS = array(
+"No calendars found." => "Không tìm thấy lịch.",
+"No events found." => "Không tìm thấy sự kiện nào",
+"Wrong calendar" => "Sai lịch",
+"New Timezone:" => "Múi giờ mới :",
+"Timezone changed" => "Thay đổi múi giờ",
+"Invalid request" => "Yêu cầu không hợp lệ",
+"Calendar" => "Lịch",
+"ddd" => "ddd",
+"ddd M/d" => "ddd M/d",
+"dddd M/d" => "dddd M/d",
+"MMMM yyyy" => "MMMM yyyy",
+"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",
+"dddd, MMM d, yyyy" => "dddd, MMM d, yyyy",
+"Birthday" => "Ngày sinh nhật",
+"Business" => "Công việc",
+"Call" => "Số điện thoại",
+"Clients" => "Máy trạm",
+"Holidays" => "Ngày lễ",
+"Ideas" => "Ý tưởng",
+"Jubilee" => "Lễ kỷ niệm",
+"Meeting" => "Hội nghị",
+"Other" => "Khác",
+"Personal" => "Cá nhân",
+"Projects" => "Dự án",
+"Questions" => "Câu hỏi",
+"Work" => "Công việc",
+"New Calendar" => "Lịch mới",
+"Does not repeat" => "Không lặp lại",
+"Daily" => "Hàng ngày",
+"Weekly" => "Hàng tuần",
+"Every Weekday" => "Mỗi ngày trong tuần",
+"Bi-Weekly" => "Hai tuần một lần",
+"Monthly" => "Hàng tháng",
+"Yearly" => "Hàng năm",
+"never" => "không thay đổi",
+"by occurrences" => "bởi xuất hiện",
+"by date" => "bởi ngày",
+"by monthday" => "bởi ngày trong tháng",
+"by weekday" => "bởi ngày trong tuần",
+"Monday" => "Thứ 2",
+"Tuesday" => "Thứ 3",
+"Wednesday" => "Thứ 4",
+"Thursday" => "Thứ 5",
+"Friday" => "Thứ ",
+"Saturday" => "Thứ 7",
+"Sunday" => "Chủ nhật",
+"events week of month" => "sự kiện trong tuần của tháng",
+"first" => "đầu tiên",
+"second" => "Thứ hai",
+"third" => "Thứ ba",
+"fourth" => "Thứ tư",
+"fifth" => "Thứ năm",
+"January" => "Tháng 1",
+"February" => "Tháng 2",
+"March" => "Tháng 3",
+"April" => "Tháng 4",
+"May" => "Tháng 5",
+"June" => "Tháng 6",
+"July" => "Tháng 7",
+"August" => "Tháng 8",
+"September" => "Tháng 9",
+"October" => "Tháng 10",
+"November" => "Tháng 11",
+"December" => "Tháng 12",
+"by events date" => "Theo ngày tháng sự kiện",
+"by weeknumber(s)" => "số tuần",
+"by day and month" => "ngày, tháng",
+"Date" => "Ngày",
+"Cal." => "Cal.",
+"All day" => "Tất cả các ngày",
+"Title" => "Tiêu đề",
+"From Date" => "Từ ngày",
+"From Time" => "Từ thời gian",
+"To Date" => "Tới ngày",
+"To Time" => "Tới thời gian",
+"The event ends before it starts" => "Sự kiện này kết thúc trước khi nó bắt đầu",
+"Week" => "Tuần",
+"Month" => "Tháng",
+"List" => "Danh sách",
+"Today" => "Hôm nay",
+"Calendars" => "Lịch",
+"There was a fail, while parsing the file." => "Có một thất bại, trong khi phân tích các tập tin.",
+"Choose active calendars" => "Chọn lịch hoạt động",
+"Your calendars" => "Lịch của bạn",
+"CalDav Link" => "Liên kết CalDav ",
+"Shared calendars" => "Chia sẻ lịch",
+"No shared calendars" => "Không chia sẻ lcihj",
+"Share Calendar" => "Chia sẻ lịch",
+"Download" => "Tải về",
+"Edit" => "Chỉnh sửa",
+"Delete" => "Xóa",
+"shared with you by" => "Chia sẻ bởi",
+"New calendar" => "Lịch mới",
+"Edit calendar" => "sửa Lịch",
+"Displayname" => "Hiển thị tên",
+"Active" => "Kích hoạt",
+"Calendar color" => "Màu lịch",
+"Save" => "Lưu",
+"Submit" => "Submit",
+"Cancel" => "Hủy",
+"Edit an event" => "Sửa sự kiện",
+"Share" => "Chia sẻ",
+"Title of the Event" => "Tên sự kiện",
+"Category" => "Danh mục",
+"All Day Event" => "Sự kiện trong ngày",
+"From" => "Từ",
+"To" => "Tới",
+"Advanced options" => "Tùy chọn nâng cao",
+"Location" => "Nơi",
+"Location of the Event" => "Nơi tổ chức sự kiện",
+"Description" => "Mô tả",
+"Description of the Event" => "Mô tả sự kiện",
+"Repeat" => "Lặp lại",
+"Advanced" => "Nâng cao",
+"Select weekdays" => "Chọn ngày trong tuần",
+"Select days" => "Chọn ngày",
+"and the events day of year." => "và sự kiện của ngày trong năm",
+"and the events day of month." => "và sự kiện của một ngày trong năm",
+"Select months" => "Chọn tháng",
+"Select weeks" => "Chọn tuần",
+"and the events week of year." => "và sự kiện của tuần trong năm.",
+"create a new calendar" => "Tạo lịch mới",
+"Name of new calendar" => "Tên lịch mới",
+"Close Dialog" => "Đóng hộp thoại",
+"Create a new event" => "Tạo một sự kiện mới",
+"View an event" => "Xem một sự kiện",
+"No categories selected" => "Không danh sách nào được chọn",
+"of" => "của",
+"at" => "tại",
+"Timezone" => "Múi giờ",
+"Check always for changes of the timezone" => "Luôn kiểm tra múi giờ",
+"24h" => "24h",
+"12h" => "12h"
+);
diff --git a/apps/calendar/lib/connector_sabre.php b/apps/calendar/lib/connector_sabre.php
index 263fb7ffde5..ac3b26ceb33 100644
--- a/apps/calendar/lib/connector_sabre.php
+++ b/apps/calendar/lib/connector_sabre.php
@@ -105,6 +105,9 @@ class OC_Connector_Sabre_CalDAV extends Sabre_CalDAV_Backend_Abstract {
if(!isset($newValues['timezone'])) $newValues['timezone'] = null;
if(!isset($newValues['calendarorder'])) $newValues['calendarorder'] = 0;
if(!isset($newValues['calendarcolor'])) $newValues['calendarcolor'] = null;
+ if(!is_null($newValues['calendarcolor']) && strlen($newValues['calendarcolor']) == 9){
+ $newValues['calendarcolor'] = substr($newValues['calendarcolor'], 0, 7);
+ }
return OC_Calendar_Calendar::addCalendarFromDAVData($principalUri,$calendarUri,$newValues['displayname'],$newValues['components'],$newValues['timezone'],$newValues['calendarorder'],$newValues['calendarcolor']);
}
@@ -192,7 +195,10 @@ class OC_Connector_Sabre_CalDAV extends Sabre_CalDAV_Backend_Abstract {
if(!isset($newValues['timezone'])) $newValues['timezone'] = null;
if(!isset($newValues['calendarorder'])) $newValues['calendarorder'] = null;
if(!isset($newValues['calendarcolor'])) $newValues['calendarcolor'] = null;
-
+ if(!is_null($newValues['calendarcolor']) && strlen($newValues['calendarcolor']) == 9){
+ $newValues['calendarcolor'] = substr($newValues['calendarcolor'], 0, 7);
+ }
+
OC_Calendar_Calendar::editCalendar($calendarId,$newValues['displayname'],null,$newValues['timezone'],$newValues['calendarorder'],$newValues['calendarcolor']);
return true;
@@ -206,6 +212,10 @@ class OC_Connector_Sabre_CalDAV extends Sabre_CalDAV_Backend_Abstract {
* @return void
*/
public function deleteCalendar($calendarId) {
+ if(preg_match( '=iCal/[1-4]?.*Mac OS X/10.[1-6](.[0-9])?=', $_SERVER['HTTP_USER_AGENT'] )){
+ throw new Sabre_DAV_Exception_Forbidden("Action is not possible with OSX 10.6.x", 403);
+ }
+
OC_Calendar_Calendar::deleteCalendar($calendarId);
}
diff --git a/apps/contacts/ajax/currentphoto.php b/apps/contacts/ajax/currentphoto.php
index 96080e661ef..c8cccf83a65 100644
--- a/apps/contacts/ajax/currentphoto.php
+++ b/apps/contacts/ajax/currentphoto.php
@@ -20,8 +20,6 @@
*
*/
-// Firefox and Konqueror tries to download application/json for me. --Arthur
-OCP\JSON::setContentTypeHeader('text/plain');
OCP\JSON::checkLoggedIn();
OCP\JSON::checkAppEnabled('contacts');
require_once 'loghandler.php';
diff --git a/apps/contacts/ajax/savecrop.php b/apps/contacts/ajax/savecrop.php
index 8ee2e46bf0c..07de138757d 100644
--- a/apps/contacts/ajax/savecrop.php
+++ b/apps/contacts/ajax/savecrop.php
@@ -24,9 +24,6 @@ OCP\JSON::checkLoggedIn();
OCP\JSON::checkAppEnabled('contacts');
OCP\JSON::callCheck();
-// Firefox and Konqueror tries to download application/json for me. --Arthur
-OCP\JSON::setContentTypeHeader('text/plain');
-
require_once 'loghandler.php';
$image = null;
diff --git a/apps/contacts/ajax/uploadphoto.php b/apps/contacts/ajax/uploadphoto.php
index 4cd38db8c72..63abeb1fee1 100644
--- a/apps/contacts/ajax/uploadphoto.php
+++ b/apps/contacts/ajax/uploadphoto.php
@@ -25,8 +25,6 @@ OCP\JSON::checkLoggedIn();
OCP\JSON::checkAppEnabled('contacts');
OCP\JSON::callCheck();
-// Firefox and Konqueror tries to download application/json for me. --Arthur
-OCP\JSON::setContentTypeHeader('text/plain');
require_once 'loghandler.php';
$l10n = OC_Contacts_App::$l10n;
// If it is a Drag'n'Drop transfer it's handled here.
diff --git a/apps/contacts/js/contacts.js b/apps/contacts/js/contacts.js
index 4c6c8bf3d93..34961360eea 100644
--- a/apps/contacts/js/contacts.js
+++ b/apps/contacts/js/contacts.js
@@ -14,17 +14,28 @@ Contacts={
UI:{
/**
* Arguments:
- * message: The text message to show. The only mandatory parameter.
+ * message: The text message to show.
* timeout: The timeout in seconds before the notification disappears. Default 10.
* timeouthandler: A function to run on timeout.
* clickhandler: A function to run on click. If a timeouthandler is given it will be cancelled.
* data: An object that will be passed as argument to the timeouthandler and clickhandler functions.
+ * cancel: If set cancel all ongoing timer events and hide the notification.
*/
notify:function(params) {
self = this;
if(!self.notifier) {
self.notifier = $('#notification');
}
+ if(params.cancel) {
+ self.notifier.off('click');
+ for(var id in self.notifier.data()) {
+ if($.isNumeric(id)) {
+ clearTimeout(parseInt(id));
+ }
+ }
+ self.notifier.text('').fadeOut().removeData();
+ return;
+ }
self.notifier.text(params.message);
self.notifier.fadeIn();
self.notifier.on('click', function() { $(this).fadeOut();});
@@ -460,6 +471,11 @@ Contacts={
}
$('#rightcontent').data('id', newid);
+ Contacts.UI.Contacts.deletionQueue.push(this.id);
+ if(!window.onbeforeunload) {
+ window.onbeforeunload = Contacts.UI.Contacts.warnNotDeleted;
+ }
+
with(this) {
delete id; delete fn; delete fullname; delete shortname; delete famname;
delete givname; delete addname; delete honpre; delete honsuf; delete data;
@@ -483,7 +499,7 @@ Contacts={
data:curlistitem,
message:t('contacts','Click to undo deletion of "') + curlistitem.find('a').text() + '"',
timeouthandler:function(contact) {
- Contacts.UI.Card.doDelete(contact.data('id'));
+ Contacts.UI.Card.doDelete(contact.data('id'), true);
delete contact;
},
clickhandler:function(contact) {
@@ -492,13 +508,21 @@ Contacts={
}
});
},
- doDelete:function(id) {
+ doDelete:function(id, removeFromQueue) {
+ if(Contacts.UI.Contacts.deletionQueue.indexOf(id) == -1 && removeFromQueue) {
+ return;
+ }
$.post(OC.filePath('contacts', 'ajax', 'deletecard.php'),{'id':id},function(jsondata) {
if(jsondata.status == 'error'){
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
}
+ if(removeFromQueue) {
+ Contacts.UI.Contacts.deletionQueue.splice(Contacts.UI.Contacts.deletionQueue.indexOf(id), 1);
+ }
+ if(Contacts.UI.Contacts.deletionQueue.length == 0) {
+ window.onbeforeunload = null;
+ }
});
- return false;
},
loadContact:function(jsondata, bookid){
this.data = jsondata;
@@ -1477,7 +1501,31 @@ Contacts={
},
Contacts:{
contacts:{},
+ deletionQueue:[],
batchnum:50,
+ warnNotDeleted:function(e) {
+ e = e || window.event;
+ var warn = t('contacts', 'Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted.');
+ if (e) {
+ e.returnValue = String(warn);
+ }
+ if(Contacts.UI.Contacts.deletionQueue.length > 0) {
+ setTimeout(Contacts.UI.Contacts.deleteFilesInQueue, 1);
+ }
+ return warn;
+ },
+ deleteFilesInQueue:function() {
+ var queue = Contacts.UI.Contacts.deletionQueue;
+ if(queue.length > 0) {
+ Contacts.UI.notify({cancel:true});
+ while(queue.length > 0) {
+ var id = queue.pop();
+ if(id) {
+ Contacts.UI.Card.doDelete(id, false);
+ }
+ }
+ }
+ },
getContact:function(id) {
if(!this.contacts[id]) {
this.contacts[id] = $('#contacts li[data-id="'+id+'"]');
@@ -1774,7 +1822,9 @@ $(document).ready(function(){
});
- // Load a contact.
+ //$(window).on('beforeunload', Contacts.UI.Contacts.deleteFilesInQueue);
+
+ // Load a contact.
$('.contacts').keydown(function(event) {
if(event.which == 13 || event.which == 32) {
$('.contacts').click();
diff --git a/apps/contacts/l10n/ca.php b/apps/contacts/l10n/ca.php
index 0c95b83d5eb..256182f02cd 100644
--- a/apps/contacts/l10n/ca.php
+++ b/apps/contacts/l10n/ca.php
@@ -1,10 +1,13 @@
<?php $TRANSLATIONS = array(
"Error (de)activating addressbook." => "Error en (des)activar la llibreta d'adreces.",
"There was an error adding the contact." => "S'ha produït un error en afegir el contacte.",
+"element name is not set." => "no s'ha establert el nom de l'element.",
+"id is not set." => "no s'ha establert la id.",
+"Could not parse contact: " => "No s'ha pogut processar el contacte:",
"Cannot add empty property." => "No es pot afegir una propietat buida.",
"At least one of the address fields has to be filled out." => "Almenys heu d'omplir un dels camps d'adreça.",
"Trying to add duplicate property: " => "Esteu intentant afegir una propietat duplicada:",
-"Error adding contact property." => "Error en afegir la propietat del contacte.",
+"Error adding contact property: " => "Error en afegir la propietat del contacte:",
"No ID provided" => "No heu facilitat cap ID",
"Error setting checksum." => "Error en establir la suma de verificació.",
"No categories selected for deletion." => "No heu seleccionat les categories a eliminar.",
@@ -12,22 +15,23 @@
"No contacts found." => "No s'han trobat contactes.",
"Missing ID" => "Falta la ID",
"Error parsing VCard for ID: \"" => "Error en analitzar la ID de la VCard: \"",
-"Cannot add addressbook with an empty name." => "No es pot afegir una llibreta d'adreces amb un nom buit.",
-"Error adding addressbook." => "Error en afegir la llibreta d'adreces.",
-"Error activating addressbook." => "Error en activar la llibreta d'adreces.",
"No contact ID was submitted." => "No s'ha tramès cap ID de contacte.",
"Error reading contact photo." => "Error en llegir la foto del contacte.",
"Error saving temporary file." => "Error en desar el fitxer temporal.",
"The loading photo is not valid." => "La foto carregada no és vàlida.",
-"id is not set." => "no s'ha establert la id.",
"Information about vCard is incorrect. Please reload the page." => "La informació de la vCard és incorrecta. Carregueu la pàgina de nou.",
"Error deleting contact property." => "Error en eliminar la propietat del contacte.",
"Contact ID is missing." => "falta la ID del contacte.",
-"Missing contact id." => "Falta la id del contacte.",
"No photo path was submitted." => "No heu tramès el camí de la foto.",
"File doesn't exist:" => "El fitxer no existeix:",
"Error loading image." => "Error en carregar la imatge.",
-"element name is not set." => "no s'ha establert el nom de l'element.",
+"Error getting contact object." => "Error en obtenir l'objecte contacte.",
+"Error getting PHOTO property." => "Error en obtenir la propietat PHOTO.",
+"Error saving contact." => "Error en desar el contacte.",
+"Error resizing image" => "Error en modificar la mida de la imatge",
+"Error cropping image" => "Error en retallar la imatge",
+"Error creating temporary image" => "Error en crear la imatge temporal",
+"Error finding image: " => "Error en trobar la imatge:",
"checksum is not set." => "no s'ha establert la suma de verificació.",
"Information about vCard is incorrect. Please reload the page: " => "La informació de la vCard és incorrecta. Carregueu de nou la pàgina:",
"Something went FUBAR. " => "Alguna cosa ha anat FUBAR.",
@@ -41,8 +45,27 @@
"The uploaded file was only partially uploaded" => "El fitxer només s'ha carregat parcialment",
"No file was uploaded" => "No s'ha carregat cap fitxer",
"Missing a temporary folder" => "Falta un fitxer temporal",
+"Couldn't save temporary image: " => "No s'ha pogut desar la imatge temporal: ",
+"Couldn't load temporary image: " => "No s'ha pogut carregar la imatge temporal: ",
+"No file was uploaded. Unknown error" => "No s'ha carregat cap fitxer. Error desconegut",
"Contacts" => "Contactes",
-"Drop a VCF file to import contacts." => "Elimina un fitxer VCF per importar contactes.",
+"Sorry, this functionality has not been implemented yet" => "Aquesta funcionalitat encara no està implementada",
+"Not implemented" => "No implementada",
+"Couldn't get a valid address." => "No s'ha pogut obtenir una adreça vàlida.",
+"Error" => "Error",
+"Contact" => "Contacte",
+"New" => "Nou",
+"New Contact" => "Contate nou",
+"This property has to be non-empty." => "Aquesta propietat no pot ser buida.",
+"Couldn't serialize elements." => "No s'han pogut serialitzar els elements.",
+"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' s'ha cridat sense argument de tipus. Informeu-ne a bugs.owncloud.org",
+"Edit name" => "Edita el nom",
+"No files selected for upload." => "No s'han seleccionat fitxers per a la pujada.",
+"The file you are trying to upload exceed the maximum size for file uploads on this server." => "El fitxer que intenteu pujar excedeix la mida màxima de pujada en aquest servidor.",
+"Select type" => "Seleccioneu un tipus",
+"Result: " => "Resultat: ",
+" imported, " => " importat, ",
+" failed." => " fallada.",
"Addressbook not found." => "No s'ha trobat la llibreta d'adreces.",
"This is not your addressbook." => "Aquesta no és la vostra llibreta d'adreces",
"Contact could not be found." => "No s'ha trobat el contacte.",
@@ -60,25 +83,54 @@
"Video" => "Vídeo",
"Pager" => "Paginador",
"Internet" => "Internet",
+"Birthday" => "Aniversari",
+"Business" => "Negocis",
+"Call" => "Trucada",
+"Clients" => "Clients",
+"Deliverer" => "Emissari",
+"Holidays" => "Vacances",
+"Ideas" => "Idees",
+"Journey" => "Viatge",
+"Jubilee" => "Aniversari",
+"Meeting" => "Reunió",
+"Other" => "Altres",
+"Personal" => "Personal",
+"Projects" => "Projectes",
+"Questions" => "Preguntes",
"{name}'s Birthday" => "Aniversari de {name}",
-"Contact" => "Contacte",
"Add Contact" => "Afegeix un contacte",
+"Import" => "Importa",
"Addressbooks" => "Llibretes d'adreces",
+"Close" => "Tanca",
+"Keyboard shortcuts" => "Dreceres de teclat",
+"Navigation" => "Navegació",
+"Next contact in list" => "Següent contacte de la llista",
+"Previous contact in list" => "Contacte anterior de la llista",
+"Expand/collapse current addressbook" => "Expandeix/col·lapsa la llibreta d'adreces",
+"Next/previous addressbook" => "Següent/anterior llibreta d'adreces",
+"Actions" => "Accions",
+"Refresh contacts list" => "Carrega de nou la llista de contactes",
+"Add new contact" => "Afegeix un contacte nou",
+"Add new addressbook" => "Afegeix una llibreta d'adreces nova",
+"Delete current contact" => "Esborra el contacte",
"Configure Address Books" => "Configura les llibretes d'adreces",
"New Address Book" => "Nova llibreta d'adreces",
-"Import from VCF" => "Importa de VFC",
"CardDav Link" => "Enllaç CardDav",
"Download" => "Baixa",
"Edit" => "Edita",
"Delete" => "Suprimeix",
-"Download contact" => "Baixa el contacte",
-"Delete contact" => "Suprimeix el contacte",
"Drop photo to upload" => "Elimina la foto a carregar",
+"Delete current photo" => "Elimina la foto actual",
+"Edit current photo" => "Edita la foto actual",
+"Upload new photo" => "Carrega una foto nova",
+"Select photo from ownCloud" => "Selecciona una foto de ownCloud",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format personalitzat, Nom curt, Nom sencer, Invertit o Invertit amb coma",
"Edit name details" => "Edita detalls del nom",
"Nickname" => "Sobrenom",
"Enter nickname" => "Escriviu el sobrenom",
-"Birthday" => "Aniversari",
+"Web site" => "Adreça web",
+"http://www.somesite.com" => "http://www.somesite.com",
+"Go to web site" => "Vés a la web",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Groups" => "Grups",
"Separate groups with commas" => "Separeu els grups amb comes",
@@ -94,24 +146,24 @@
"Edit address details" => "Edita els detalls de l'adreça",
"Add notes here." => "Afegiu notes aquí.",
"Add field" => "Afegeix un camp",
-"Profile picture" => "Foto de perfil",
"Phone" => "Telèfon",
"Note" => "Nota",
-"Delete current photo" => "Elimina la foto actual",
-"Edit current photo" => "Edita la foto actual",
-"Upload new photo" => "Carrega una foto nova",
-"Select photo from ownCloud" => "Selecciona una foto de ownCloud",
+"Download contact" => "Baixa el contacte",
+"Delete contact" => "Suprimeix el contacte",
+"The temporary image has been removed from cache." => "La imatge temporal ha estat eliminada de la memòria de cau.",
"Edit address" => "Edita l'adreça",
"Type" => "Tipus",
"PO Box" => "Adreça postal",
+"Street address" => "Adreça",
+"Street and number" => "Carrer i número",
"Extended" => "Addicional",
-"Street" => "Carrer",
+"Apartment number etc." => "Número d'apartament, etc.",
"City" => "Ciutat",
"Region" => "Comarca",
+"E.g. state or province" => "p. ex. Estat o província ",
"Zipcode" => "Codi postal",
+"Postal code" => "Codi postal",
"Country" => "País",
-"Edit categories" => "Edita categories",
-"Add" => "Afegeix",
"Addressbook" => "Llibreta d'adreces",
"Hon. prefixes" => "Prefix honorífic:",
"Miss" => "Srta",
@@ -143,15 +195,16 @@
"Please choose the addressbook" => "Escolliu la llibreta d'adreces",
"create a new addressbook" => "crea una llibreta d'adreces nova",
"Name of new addressbook" => "Nom de la nova llibreta d'adreces",
-"Import" => "Importa",
"Importing contacts" => "S'estan important contactes",
-"Select address book to import to:" => "Seleccioneu la llibreta d'adreces a la que voleu importar:",
-"Select from HD" => "Selecciona de HD",
"You have no contacts in your addressbook." => "No teniu contactes a la llibreta d'adreces.",
"Add contact" => "Afegeix un contacte",
"Configure addressbooks" => "Configura les llibretes d'adreces",
+"Select Address Books" => "Selecccioneu llibretes d'adreces",
+"Enter name" => "Escriviu un nom",
+"Enter description" => "Escriviu una descripció",
"CardDAV syncing addresses" => "Adreces de sincronització CardDAV",
"more info" => "més informació",
"Primary address (Kontact et al)" => "Adreça primària (Kontact i al)",
-"iOS/OS X" => "iOS/OS X"
+"iOS/OS X" => "iOS/OS X",
+"Read only vCard directory link(s)" => "Enllaç(os) vCard només de lectura"
);
diff --git a/apps/contacts/l10n/de.php b/apps/contacts/l10n/de.php
index 3a1013eb4fc..b76c5ce0716 100644
--- a/apps/contacts/l10n/de.php
+++ b/apps/contacts/l10n/de.php
@@ -1,10 +1,13 @@
<?php $TRANSLATIONS = array(
"Error (de)activating addressbook." => "(De-)Aktivierung des Adressbuches fehlgeschlagen",
"There was an error adding the contact." => "Erstellen des Kontakts fehlgeschlagen",
+"element name is not set." => "Kein Name für das Element angegeben.",
+"id is not set." => "ID ist nicht angegeben.",
+"Could not parse contact: " => "Konnte folgenden Kontakt nicht verarbeiten:",
"Cannot add empty property." => "Feld darf nicht leer sein.",
"At least one of the address fields has to be filled out." => "Mindestens eines der Adressfelder muss ausgefüllt werden.",
"Trying to add duplicate property: " => "Versuche, doppelte Eigenschaft hinzuzufügen: ",
-"Error adding contact property." => "Kontakt ändern fehlgeschlagen",
+"Error adding contact property: " => "Fehler beim Hinzufügen der Kontakteigenschaft:",
"No ID provided" => "Keine ID angegeben",
"Error setting checksum." => "Fehler beim Setzen der Prüfsumme.",
"No categories selected for deletion." => "Keine Kategorien zum Löschen ausgewählt.",
@@ -12,22 +15,23 @@
"No contacts found." => "Keine Kontakte gefunden.",
"Missing ID" => "Fehlende ID",
"Error parsing VCard for ID: \"" => "Fehler beim Einlesen der VCard für die ID: \"",
-"Cannot add addressbook with an empty name." => "Bitte einen Namen für das Adressbuch angeben.",
-"Error adding addressbook." => "Adressbuch hinzufügen fehlgeschlagen",
-"Error activating addressbook." => "Adressbuchaktivierung fehlgeschlagen",
"No contact ID was submitted." => "Es wurde keine Kontakt-ID übermittelt.",
-"Error reading contact photo." => "Fehler beim auslesen des Kontaktfotos.",
+"Error reading contact photo." => "Fehler beim Auslesen des Kontaktfotos.",
"Error saving temporary file." => "Fehler beim Speichern der temporären Datei.",
"The loading photo is not valid." => "Das Kontaktfoto ist fehlerhaft.",
-"id is not set." => "ID ist nicht angegeben.",
"Information about vCard is incorrect. Please reload the page." => "Die Information der vCard ist fehlerhaft. Bitte aktualisiere die Seite.",
"Error deleting contact property." => "Kontakteigenschaft löschen fehlgeschlagen",
"Contact ID is missing." => "Keine Kontakt-ID angegeben.",
-"Missing contact id." => "Fehlende Kontakt-ID.",
"No photo path was submitted." => "Kein Foto-Pfad übermittelt.",
"File doesn't exist:" => "Datei existiert nicht: ",
"Error loading image." => "Fehler beim Laden des Bildes.",
-"element name is not set." => "Kein Name für das Element angegeben.",
+"Error getting contact object." => "Fehler beim Abruf des Kontakt-Objektes.",
+"Error getting PHOTO property." => "Fehler beim Abrufen der PHOTO Eigenschaft.",
+"Error saving contact." => "Fehler beim Speichern des Kontaktes",
+"Error resizing image" => "Fehler bei der Größenänderung des Bildes",
+"Error cropping image" => "Fehler beim Zuschneiden des Bildes",
+"Error creating temporary image" => "Fehler beim erstellen des temporären Bildes",
+"Error finding image: " => "Fehler beim Suchen des Bildes: ",
"checksum is not set." => "Keine Prüfsumme angegeben.",
"Information about vCard is incorrect. Please reload the page: " => "Die Informationen zur vCard sind fehlerhaft. Bitte Seite neu laden: ",
"Something went FUBAR. " => "Irgendwas ist hier so richtig schief gelaufen. ",
@@ -41,14 +45,33 @@
"The uploaded file was only partially uploaded" => "Datei konnte nur teilweise übertragen werden",
"No file was uploaded" => "Keine Datei konnte übertragen werden.",
"Missing a temporary folder" => "Kein temporärer Ordner vorhanden",
+"Couldn't save temporary image: " => "Konnte das temporäre Bild nicht speichern:",
+"Couldn't load temporary image: " => "Konnte das temporäre Bild nicht laden:",
+"No file was uploaded. Unknown error" => "Keine Datei hochgeladen. Unbekannter Fehler",
"Contacts" => "Kontakte",
-"Drop a VCF file to import contacts." => "Zieh' eine VCF Datei hierher zum Kontaktimport",
+"Sorry, this functionality has not been implemented yet" => "Diese Funktion steht leider noch nicht zur Verfügung",
+"Not implemented" => "Nicht Verfügbar",
+"Couldn't get a valid address." => "Konnte keine gültige Adresse abrufen",
+"Error" => "Fehler",
+"Contact" => "Kontakt",
+"New" => "Neu",
+"New Contact" => "Neuer Kontakt",
+"This property has to be non-empty." => "Dieses Feld darf nicht Leer sein.",
+"Couldn't serialize elements." => "Konnte Elemente nicht serialisieren",
+"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' wurde ohne Argumente aufgerufen, bitte Melde dies auf bugs.owncloud.org",
+"Edit name" => "Name ändern",
+"No files selected for upload." => "Keine Datei(en) zum Hochladen ausgewählt",
+"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Die Datei, die Sie versuchen hochzuladen, überschreitet die maximale Größe für Datei-Uploads auf diesem Server.",
+"Select type" => "Wähle Typ",
+"Result: " => "Ergebnis: ",
+" imported, " => " importiert, ",
+" failed." => " fehlgeschlagen.",
"Addressbook not found." => "Adressbuch nicht gefunden.",
"This is not your addressbook." => "Dies ist nicht dein Adressbuch.",
"Contact could not be found." => "Kontakt konnte nicht gefunden werden.",
"Address" => "Adresse",
"Telephone" => "Telefon",
-"Email" => "Email",
+"Email" => "E-Mail",
"Organization" => "Organisation",
"Work" => "Arbeit",
"Home" => "Zuhause",
@@ -60,28 +83,57 @@
"Video" => "Video",
"Pager" => "Pager",
"Internet" => "Internet",
+"Birthday" => "Geburtstag",
+"Business" => "Geschäftlich",
+"Call" => "Anruf",
+"Clients" => "Kunden",
+"Deliverer" => "Lieferant",
+"Holidays" => "Feiertage",
+"Ideas" => "Ideen",
+"Journey" => "Reise",
+"Jubilee" => "Jubiläum",
+"Meeting" => "Besprechung",
+"Other" => "Andere",
+"Personal" => "Persönlich",
+"Projects" => "Projekte",
+"Questions" => "Fragen",
"{name}'s Birthday" => "Geburtstag von {name}",
-"Contact" => "Kontakt",
"Add Contact" => "Kontakt hinzufügen",
+"Import" => "Importieren",
"Addressbooks" => "Adressbücher",
+"Close" => "Schließen",
+"Keyboard shortcuts" => "Tastaturbefehle",
+"Navigation" => "Navigation",
+"Next contact in list" => "Nächster Kontakt aus der Liste",
+"Previous contact in list" => "Vorheriger Kontakt aus der Liste",
+"Expand/collapse current addressbook" => "Ausklappen/Einklappen des Adressbuches",
+"Next/previous addressbook" => "Nächstes/Vorhergehendes Adressbuch",
+"Actions" => "Aktionen",
+"Refresh contacts list" => "Kontaktliste neu laden",
+"Add new contact" => "Neuen Kontakt hinzufügen",
+"Add new addressbook" => "Neues Adressbuch hinzufügen",
+"Delete current contact" => "Aktuellen Kontakt löschen",
"Configure Address Books" => "Adressbücher konfigurieren",
"New Address Book" => "Neues Adressbuch",
-"Import from VCF" => "Import von VCF Datei",
-"CardDav Link" => "CardDav Link",
+"CardDav Link" => "CardDav-Link",
"Download" => "Herunterladen",
"Edit" => "Bearbeiten",
"Delete" => "Löschen",
-"Download contact" => "Kontakt herunterladen",
-"Delete contact" => "Kontakt löschen",
-"Drop photo to upload" => "Zieh' ein Foto hierher zum hochladen",
-"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format benutzerdefiniert, Kurzname, Vollname, Rückwärts order Rückwärts mit Komma",
-"Edit name details" => "Namen ändern",
+"Drop photo to upload" => "Zieh' ein Foto hierher zum Hochladen",
+"Delete current photo" => "Derzeitiges Foto löschen",
+"Edit current photo" => "Foto ändern",
+"Upload new photo" => "Neues Foto hochladen",
+"Select photo from ownCloud" => "Foto aus ownCloud auswählen",
+"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format benutzerdefiniert, Kurzname, Vollname, Rückwärts oder Rückwärts mit Komma",
+"Edit name details" => "Name ändern",
"Nickname" => "Spitzname",
-"Enter nickname" => "Spitznamen angeben",
-"Birthday" => "Geburtstag",
-"dd-mm-yyyy" => "TT-MM-JJJJ",
+"Enter nickname" => "Spitzname angeben",
+"Web site" => "Webseite",
+"http://www.somesite.com" => "http://www.somesite.com",
+"Go to web site" => "Webseite aufrufen",
+"dd-mm-yyyy" => "dd.mm.yyyy",
"Groups" => "Gruppen",
-"Separate groups with commas" => "Gruppen mit Komma trennt",
+"Separate groups with commas" => "Gruppen mit Komma getrennt",
"Edit groups" => "Gruppen editieren",
"Preferred" => "Bevorzugt",
"Please specify a valid email address." => "Bitte eine gültige E-Mail-Adresse angeben.",
@@ -94,24 +146,24 @@
"Edit address details" => "Adressinformationen ändern",
"Add notes here." => "Füge hier Notizen ein.",
"Add field" => "Feld hinzufügen",
-"Profile picture" => "Profil Bild",
"Phone" => "Telefon",
"Note" => "Notiz",
-"Delete current photo" => "Derzeitiges Foto löschen",
-"Edit current photo" => "Foto ändern",
-"Upload new photo" => "Neues Foto hochladen",
-"Select photo from ownCloud" => "Foto aus ownCloud auswählen",
+"Download contact" => "Kontakt herunterladen",
+"Delete contact" => "Kontakt löschen",
+"The temporary image has been removed from cache." => "Das temporäre Bild wurde aus dem Cache gelöscht.",
"Edit address" => "Adresse ändern",
"Type" => "Typ",
"PO Box" => "Postfach",
+"Street address" => "Straßenanschrift",
+"Street and number" => "Straße und Nummer",
"Extended" => "Erweitert",
-"Street" => "Straße",
+"Apartment number etc." => "Wohnungsnummer usw.",
"City" => "Stadt",
"Region" => "Region",
+"E.g. state or province" => "Z.B. Staat oder Bezirk",
"Zipcode" => "Postleitzahl",
+"Postal code" => "PLZ",
"Country" => "Land",
-"Edit categories" => "Kategorie ändern",
-"Add" => "Hinzufügen",
"Addressbook" => "Adressbuch",
"Hon. prefixes" => "Höflichkeitspräfixe",
"Miss" => "Frau",
@@ -143,15 +195,16 @@
"Please choose the addressbook" => "Bitte Adressbuch auswählen",
"create a new addressbook" => "Neues Adressbuch erstellen",
"Name of new addressbook" => "Name des neuen Adressbuchs",
-"Import" => "Importieren",
"Importing contacts" => "Kontakte werden importiert",
-"Select address book to import to:" => "Adressbuch, in das importiert werden soll",
-"Select from HD" => "Von der Festplatte auswählen",
"You have no contacts in your addressbook." => "Du hast keine Kontakte im Adressbuch.",
"Add contact" => "Kontakt hinzufügen",
"Configure addressbooks" => "Adressbücher konfigurieren",
+"Select Address Books" => "Wähle Adressbuch",
+"Enter name" => "Name eingeben",
+"Enter description" => "Beschreibung eingeben",
"CardDAV syncing addresses" => "CardDAV Sync-Adressen",
"more info" => "mehr Info",
"Primary address (Kontact et al)" => "primäre Adresse (für Kontact o.ä. Programme)",
-"iOS/OS X" => "iOS/OS X"
+"iOS/OS X" => "iOS/OS X",
+"Read only vCard directory link(s)" => "Nur lesende(r) vCalender-Verzeichnis-Link(s)"
);
diff --git a/apps/contacts/l10n/el.php b/apps/contacts/l10n/el.php
index f015f0ca363..c67f27ab2aa 100644
--- a/apps/contacts/l10n/el.php
+++ b/apps/contacts/l10n/el.php
@@ -1,36 +1,40 @@
<?php $TRANSLATIONS = array(
"Error (de)activating addressbook." => "Σφάλμα (απ)ενεργοποίησης βιβλίου διευθύνσεων",
"There was an error adding the contact." => "Σφάλμα κατά την προσθήκη επαφής.",
+"element name is not set." => "δεν ορίστηκε όνομα στοιχείου",
+"id is not set." => "δεν ορίστηκε id",
+"Could not parse contact: " => "Δε αναγνώστηκε η επαφή",
"Cannot add empty property." => "Αδύνατη προσθήκη κενής ιδιότητας.",
"At least one of the address fields has to be filled out." => "Πρέπει να συμπληρωθεί τουλάχιστον ένα από τα παιδία διεύθυνσης.",
"Trying to add duplicate property: " => "Προσπάθεια προσθήκης διπλότυπης ιδιότητας:",
-"Error adding contact property." => "Σφάλμα προσθήκης ιδιότητας επαφής.",
-"No ID provided" => "Δε δώθηκε ID",
+"Error adding contact property: " => "Σφάλμα στη προσθήκη ιδιότητας επαφής",
+"No ID provided" => "Δε δόθηκε ID",
"Error setting checksum." => "Λάθος κατά τον ορισμό checksum ",
"No categories selected for deletion." => "Δε επελέγησαν κατηγορίες για διαγραφή",
"No address books found." => "Δε βρέθηκε βιβλίο διευθύνσεων",
"No contacts found." => "Δεν βρέθηκαν επαφές",
"Missing ID" => "Λείπει ID",
"Error parsing VCard for ID: \"" => "Σφάλμα κατά την ανάγνωση του VCard για το ID:\"",
-"Cannot add addressbook with an empty name." => "Δε μπορεί να προστεθεί βιβλίο διευθύνσεων με κενό όνομα",
-"Error adding addressbook." => "Σφάλμα προσθήκης βιβλίου διευθύνσεων.",
-"Error activating addressbook." => "Σφάλμα ενεργοποίησης βιβλίου διευθύνσεων",
"No contact ID was submitted." => "Δε υπεβλήθει ID επαφής",
"Error reading contact photo." => "Σφάλμα ανάγνωσης εικόνας επαφής",
"Error saving temporary file." => "Σφάλμα αποθήκευσης προσωρινού αρχείου",
"The loading photo is not valid." => "Η φορτωμένη φωτογραφία δεν είναι έγκυρη",
-"id is not set." => "δεν ορίστηκε id",
"Information about vCard is incorrect. Please reload the page." => "Οι πληροφορίες σχετικά με vCard είναι εσφαλμένες. Παρακαλώ επαναφορτώστε τη σελίδα.",
"Error deleting contact property." => "Σφάλμα διαγραφής ιδιότητας επαφής.",
"Contact ID is missing." => "Λείπει ID επαφής",
-"Missing contact id." => "Απουσιαζει ID επαφής",
"No photo path was submitted." => "Δε δόθηκε διαδρομή εικόνας",
"File doesn't exist:" => "Το αρχείο δεν υπάρχει:",
"Error loading image." => "Σφάλμα φόρτωσης εικόνας",
-"element name is not set." => "δεν ορίστηκε όνομα στοιχείου",
+"Error getting contact object." => "Σφάλμα κατά τη λήψη αντικειμένου επαφής",
+"Error getting PHOTO property." => "Σφάλμα κατά τη λήψη ιδιοτήτων ΦΩΤΟΓΡΑΦΙΑΣ.",
+"Error saving contact." => "Σφάλμα κατά την αποθήκευση επαφής.",
+"Error resizing image" => "Σφάλμα κατά την αλλαγή μεγέθους εικόνας",
+"Error cropping image" => "Σφάλμα κατά την περικοπή εικόνας",
+"Error creating temporary image" => "Σφάλμα κατά την δημιουργία προσωρινής εικόνας",
+"Error finding image: " => "Σφάλμα κατά την εύρεση της εικόνας: ",
"checksum is not set." => "δε ορίστηκε checksum ",
-"Information about vCard is incorrect. Please reload the page: " => "Οι πληροφορίες για τη vCard είναι λανθασμένες.Παρακαλώ ξαναφορτώστε τη σελίδα:",
-"Something went FUBAR. " => "Κάτι χάθηκε στο άγνωστο",
+"Information about vCard is incorrect. Please reload the page: " => "Οι πληροφορίες για τη vCard είναι λανθασμένες.Παρακαλώ ξαναφορτώστε τη σελίδα: ",
+"Something went FUBAR. " => "Κάτι χάθηκε στο άγνωστο. ",
"Error updating contact property." => "Σφάλμα ενημέρωσης ιδιότητας επαφής.",
"Cannot update addressbook with an empty name." => "Δε μπορεί να γίνει αλλαγή βιβλίου διευθύνσεων χωρίς όνομα",
"Error updating addressbook." => "Σφάλμα ενημέρωσης βιβλίου διευθύνσεων.",
@@ -41,8 +45,27 @@
"The uploaded file was only partially uploaded" => "Το αρχείο ανέβηκε μερικώς",
"No file was uploaded" => "Δεν ανέβηκε κάποιο αρχείο",
"Missing a temporary folder" => "Λείπει ο προσωρινός φάκελος",
+"Couldn't save temporary image: " => "Δεν ήταν δυνατή η αποθήκευση της προσωρινής εικόνας: ",
+"Couldn't load temporary image: " => "Δεν ήταν δυνατή η φόρτωση της προσωρινής εικόνας: ",
+"No file was uploaded. Unknown error" => "Δεν ανέβηκε κάποιο αρχείο. Άγνωστο σφάλμα",
"Contacts" => "Επαφές",
-"Drop a VCF file to import contacts." => "Εισάγεται ένα VCF αρχείο για εισαγωγή επαφών",
+"Sorry, this functionality has not been implemented yet" => "Λυπούμαστε, αυτή η λειτουργία δεν έχει υλοποιηθεί ακόμα",
+"Not implemented" => "Δεν έχει υλοποιηθεί",
+"Couldn't get a valid address." => "Αδυναμία λήψης έγκυρης διεύθυνσης",
+"Error" => "Σφάλμα",
+"Contact" => "Επαφή",
+"New" => "Νέο",
+"New Contact" => "Νέα επαφή",
+"This property has to be non-empty." => "Το πεδίο δεν πρέπει να είναι άδειο.",
+"Couldn't serialize elements." => "Αδύνατο να μπουν σε σειρά τα στοιχεία",
+"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "το 'deleteProperty' καλέστηκε χωρίς without type argument. Παρακαλώ αναφέρατε στο bugs.owncloud.org",
+"Edit name" => "Αλλαγή ονόματος",
+"No files selected for upload." => "Δεν επιλέχτηκαν αρχεία για μεταφόρτωση",
+"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Το αρχείο που προσπαθείτε να ανεβάσετε υπερβαίνει το μέγιστο μέγεθος για τις προσθήκες αρχείων σε αυτόν τον server.",
+"Select type" => "Επιλογή τύπου",
+"Result: " => "Αποτέλεσμα: ",
+" imported, " => " εισάγεται,",
+" failed." => " απέτυχε.",
"Addressbook not found." => "Δε βρέθηκε βιβλίο διευθύνσεων",
"This is not your addressbook." => "Αυτό δεν είναι το βιβλίο διευθύνσεων σας.",
"Contact could not be found." => "Η επαφή δεν μπόρεσε να βρεθεί.",
@@ -55,30 +78,59 @@
"Mobile" => "Κινητό",
"Text" => "Κείμενο",
"Voice" => "Ομιλία",
-"Message" => "Μήνυμα ",
+"Message" => "Μήνυμα",
"Fax" => "Φαξ",
"Video" => "Βίντεο",
"Pager" => "Βομβητής",
"Internet" => "Διαδίκτυο",
+"Birthday" => "Γενέθλια",
+"Business" => "Επιχείρηση",
+"Call" => "Κάλεσε",
+"Clients" => "Πελάτες",
+"Deliverer" => "Προμηθευτής",
+"Holidays" => "Διακοπές",
+"Ideas" => "Ιδέες",
+"Journey" => "Ταξίδι",
+"Jubilee" => "Ιωβηλαίο",
+"Meeting" => "Συνάντηση",
+"Other" => "Άλλο",
+"Personal" => "Προσωπικό",
+"Projects" => "Έργα",
+"Questions" => "Ερωτήσεις",
"{name}'s Birthday" => "{name} έχει Γενέθλια",
-"Contact" => "Επαφή",
"Add Contact" => "Προσθήκη επαφής",
+"Import" => "Εισαγωγή",
"Addressbooks" => "Βιβλία διευθύνσεων",
+"Close" => "Κλείσιμο ",
+"Keyboard shortcuts" => "Συντομεύσεις πλητρολογίου",
+"Navigation" => "Πλοήγηση",
+"Next contact in list" => "Επόμενη επαφή στη λίστα",
+"Previous contact in list" => "Προηγούμενη επαφή στη λίστα",
+"Expand/collapse current addressbook" => "Ανάπτυξη/σύμπτυξη τρέχοντος βιβλίου διευθύνσεων",
+"Next/previous addressbook" => "Επόμενο/προηγούμενο βιβλίο διευθύνσεων",
+"Actions" => "Ενέργειες",
+"Refresh contacts list" => "Ανανέωσε τη λίστα επαφών",
+"Add new contact" => "Προσθήκη νέας επαφής",
+"Add new addressbook" => "Προσθήκη νέου βιβλίου επαφών",
+"Delete current contact" => "Διαγραφή τρέχουσας επαφής",
"Configure Address Books" => "Ρυθμίστε το βιβλίο διευθύνσεων ",
"New Address Book" => "Νέο βιβλίο διευθύνσεων",
-"Import from VCF" => "Εισαγωγή από VCF αρχείο",
"CardDav Link" => "Σύνδεσμος CardDav",
"Download" => "Λήψη",
"Edit" => "Επεξεργασία",
"Delete" => "Διαγραφή",
-"Download contact" => "Λήψη επαφής",
-"Delete contact" => "Διαγραφή επαφής",
"Drop photo to upload" => "Ρίξε μια φωτογραφία για ανέβασμα",
+"Delete current photo" => "Διαγραφή τρέχουσας φωτογραφίας",
+"Edit current photo" => "Επεξεργασία τρέχουσας φωτογραφίας",
+"Upload new photo" => "Ανέβασε νέα φωτογραφία",
+"Select photo from ownCloud" => "Επέλεξε φωτογραφία από το ownCloud",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format custom, Όνομα, Επώνυμο, Αντίστροφο ή Αντίστροφο με κόμμα",
"Edit name details" => "Αλλάξτε τις λεπτομέρειες ονόματος",
"Nickname" => "Παρατσούκλι",
-"Enter nickname" => "Εισάγεται παρατσούκλι",
-"Birthday" => "Γενέθλια",
+"Enter nickname" => "Εισάγετε παρατσούκλι",
+"Web site" => "Ιστότοπος",
+"http://www.somesite.com" => "http://www.somesite.com",
+"Go to web site" => "Πήγαινε στον ιστότοπο",
"dd-mm-yyyy" => "ΗΗ-ΜΜ-ΕΕΕΕ",
"Groups" => "Ομάδες",
"Separate groups with commas" => "Διαχώρισε τις ομάδες με κόμμα ",
@@ -94,24 +146,24 @@
"Edit address details" => "Επεξεργασία λεπτομερειών διεύθυνσης",
"Add notes here." => "Πρόσθεσε τις σημειώσεις εδώ",
"Add field" => "Προσθήκη πεδίου",
-"Profile picture" => "Φωτογραφία προφίλ",
"Phone" => "Τηλέφωνο",
"Note" => "Σημείωση",
-"Delete current photo" => "Διαγραφή τρέχουσας φωτογραφίας",
-"Edit current photo" => "Επεξεργασία τρέχουσας φωτογραφίας",
-"Upload new photo" => "Ανέβασε νέα φωτογραφία",
-"Select photo from ownCloud" => "Επέλεξε φωτογραφία από το ownCloud",
+"Download contact" => "Λήψη επαφής",
+"Delete contact" => "Διαγραφή επαφής",
+"The temporary image has been removed from cache." => "Η προσωρινή εικόνα αφαιρέθηκε από την κρυφή μνήμη.",
"Edit address" => "Επεξεργασία διεύθυνσης",
"Type" => "Τύπος",
"PO Box" => "Ταχ. Θυρίδα",
+"Street address" => "Διεύθυνση οδού",
+"Street and number" => "Οδός και αριθμός",
"Extended" => "Εκτεταμένη",
-"Street" => "Οδός",
+"Apartment number etc." => "Αριθμός διαμερίσματος",
"City" => "Πόλη",
"Region" => "Περιοχή",
+"E.g. state or province" => "Π.χ. Πολιτεία ή επαρχεία",
"Zipcode" => "Τ.Κ.",
+"Postal code" => "Ταχυδρομικός Κωδικός",
"Country" => "Χώρα",
-"Edit categories" => "Επεξεργασία κατηγορίας",
-"Add" => "Προσθήκη",
"Addressbook" => "Βιβλίο διευθύνσεων",
"Hon. prefixes" => "προθέματα",
"Miss" => "Δις",
@@ -134,7 +186,7 @@
"Sn." => "Sn.",
"New Addressbook" => "Νέο βιβλίο διευθύνσεων",
"Edit Addressbook" => "Επεξεργασία βιβλίου διευθύνσεων",
-"Displayname" => "Προβαλόμενο όνομα",
+"Displayname" => "Προβαλλόμενο όνομα",
"Active" => "Ενεργό",
"Save" => "Αποθήκευση",
"Submit" => "Καταχώρηση",
@@ -143,15 +195,16 @@
"Please choose the addressbook" => "Παρακαλώ επέλεξε βιβλίο διευθύνσεων",
"create a new addressbook" => "Δημιουργία νέου βιβλίου διευθύνσεων",
"Name of new addressbook" => "Όνομα νέου βιβλίου διευθύνσεων",
-"Import" => "Εισαγωγή",
"Importing contacts" => "Εισαγωγή επαφών",
-"Select address book to import to:" => "Επέλεξε σε ποιο βιβλίο διευθύνσεων για εισαγωγή:",
-"Select from HD" => "Επιλογή από HD",
"You have no contacts in your addressbook." => "Δεν έχεις επαφές στο βιβλίο διευθύνσεων",
"Add contact" => "Προσθήκη επαφής",
"Configure addressbooks" => "Ρύθμισε το βιβλίο διευθύνσεων",
+"Select Address Books" => "Επέλεξε βιβλίο διευθύνσεων",
+"Enter name" => "Εισαγωγή ονόματος",
+"Enter description" => "Εισαγωγή περιγραφής",
"CardDAV syncing addresses" => "συγχρονισμός διευθύνσεων μέσω CardDAV ",
"more info" => "περισσότερες πληροφορίες",
"Primary address (Kontact et al)" => "Κύρια διεύθυνση",
-"iOS/OS X" => "iOS/OS X"
+"iOS/OS X" => "iOS/OS X",
+"Read only vCard directory link(s)" => "vCard σύνδεσμος(οι) φάκελου μόνο για ανάγνωση"
);
diff --git a/apps/contacts/l10n/fi_FI.php b/apps/contacts/l10n/fi_FI.php
index 2e3e91611bb..5c9a81eba08 100644
--- a/apps/contacts/l10n/fi_FI.php
+++ b/apps/contacts/l10n/fi_FI.php
@@ -2,18 +2,19 @@
"There was an error adding the contact." => "Virhe yhteystietoa lisättäessä.",
"Cannot add empty property." => "Tyhjää ominaisuutta ei voi lisätä.",
"At least one of the address fields has to be filled out." => "Vähintään yksi osoitekenttä tulee täyttää.",
-"Error adding contact property." => "Virhe lisättäessä ominaisuutta yhteystietoon.",
"No categories selected for deletion." => "Luokkia ei ole valittu poistettavaksi.",
"No address books found." => "Osoitekirjoja ei löytynyt.",
"No contacts found." => "Yhteystietoja ei löytynyt.",
"Error parsing VCard for ID: \"" => "Virhe jäsennettäessä vCardia tunnisteelle: \"",
-"Cannot add addressbook with an empty name." => "Ilman nimeä olevaa osoitekirjaa ei voi lisätä.",
-"Error adding addressbook." => "Virhe lisättäessä osoitekirjaa.",
-"Error activating addressbook." => "Virhe aktivoitaessa osoitekirjaa.",
"Error saving temporary file." => "Virhe tallennettaessa tilapäistiedostoa.",
+"Information about vCard is incorrect. Please reload the page." => "vCardin tiedot eivät kelpaa. Lataa sivu uudelleen.",
"Error deleting contact property." => "Virhe poistettaessa yhteystiedon ominaisuutta.",
"File doesn't exist:" => "Tiedostoa ei ole olemassa:",
"Error loading image." => "Virhe kuvaa ladatessa.",
+"Error saving contact." => "Virhe yhteystietoa tallennettaessa.",
+"Error resizing image" => "Virhe asettaessa kuvaa uuteen kokoon",
+"Error cropping image" => "Virhe rajatessa kuvaa",
+"Error creating temporary image" => "Virhe luotaessa väliaikaista kuvaa",
"Error updating contact property." => "Virhe päivitettäessä yhteystiedon ominaisuutta.",
"Error updating addressbook." => "Virhe päivitettäessä osoitekirjaa.",
"There is no error, the file uploaded with success" => "Ei virhettä, tiedosto lähetettiin onnistuneesti",
@@ -21,7 +22,17 @@
"The uploaded file was only partially uploaded" => "Lähetetty tiedosto lähetettiin vain osittain",
"No file was uploaded" => "Tiedostoa ei lähetetty",
"Missing a temporary folder" => "Tilapäiskansio puuttuu",
+"No file was uploaded. Unknown error" => "Tiedostoa ei lähetetty. Tuntematon virhe",
"Contacts" => "Yhteystiedot",
+"Error" => "Virhe",
+"Contact" => "Yhteystieto",
+"New" => "Uusi",
+"New Contact" => "Uusi yhteystieto",
+"Edit name" => "Muokkaa nimeä",
+"No files selected for upload." => "Tiedostoja ei ole valittu lähetettäväksi.",
+"Result: " => "Tulos: ",
+" imported, " => " tuotu, ",
+" failed." => " epäonnistui.",
"Addressbook not found." => "Osoitekirjaa ei löytynyt.",
"This is not your addressbook." => "Tämä ei ole osoitekirjasi.",
"Contact could not be found." => "Yhteystietoa ei löytynyt.",
@@ -39,22 +50,36 @@
"Video" => "Video",
"Pager" => "Hakulaite",
"Internet" => "Internet",
+"Birthday" => "Syntymäpäivä",
+"Business" => "Työ",
+"Other" => "Muu",
+"Questions" => "Kysymykset",
"{name}'s Birthday" => "Henkilön {name} syntymäpäivä",
-"Contact" => "Yhteystieto",
"Add Contact" => "Lisää yhteystieto",
+"Import" => "Tuo",
"Addressbooks" => "Osoitekirjat",
+"Close" => "Sulje",
+"Actions" => "Toiminnot",
+"Refresh contacts list" => "Päivitä yhteystietoluettelo",
+"Add new contact" => "Lisää uusi yhteystieto",
+"Add new addressbook" => "Lisää uusi osoitekirja",
+"Delete current contact" => "Poista nykyinen yhteystieto",
"Configure Address Books" => "Muokkaa osoitekirjoja",
"New Address Book" => "Uusi osoitekirja",
-"Import from VCF" => "Tuo VCF-tiedostosta",
"CardDav Link" => "CardDav-linkki",
"Download" => "Lataa",
"Edit" => "Muokkaa",
"Delete" => "Poista",
-"Download contact" => "Lataa yhteystieto",
-"Delete contact" => "Poista yhteystieto",
+"Delete current photo" => "Poista nykyinen valokuva",
+"Edit current photo" => "Muokkaa nykyistä valokuvaa",
+"Upload new photo" => "Lähetä uusi valokuva",
+"Select photo from ownCloud" => "Valitse valokuva ownCloudista",
+"Edit name details" => "Muokkaa nimitietoja",
"Nickname" => "Kutsumanimi",
"Enter nickname" => "Anna kutsumanimi",
-"Birthday" => "Syntymäpäivä",
+"Web site" => "Verkkosivu",
+"http://www.somesite.com" => "http://www.somesite.com",
+"Go to web site" => "Siirry verkkosivulle",
"Groups" => "Ryhmät",
"Separate groups with commas" => "Erota ryhmät pilkuilla",
"Edit groups" => "Muokkaa ryhmiä",
@@ -64,26 +89,26 @@
"Enter phone number" => "Anna puhelinnumero",
"Delete phone number" => "Poista puhelinnumero",
"View on map" => "Näytä kartalla",
+"Edit address details" => "Muokkaa osoitetietoja",
"Add notes here." => "Lisää huomiot tähän.",
"Add field" => "Lisää kenttä",
-"Profile picture" => "Profiilikuva",
"Phone" => "Puhelin",
"Note" => "Huomio",
-"Delete current photo" => "Poista nykyinen valokuva",
-"Edit current photo" => "Muokkaa nykyistä valokuvaa",
-"Upload new photo" => "Lähetä uusi valokuva",
-"Select photo from ownCloud" => "Valitse valokuva ownCloudista",
+"Download contact" => "Lataa yhteystieto",
+"Delete contact" => "Poista yhteystieto",
+"The temporary image has been removed from cache." => "Väliaikainen kuva on poistettu välimuistista.",
"Edit address" => "Muokkaa osoitetta",
"Type" => "Tyyppi",
"PO Box" => "Postilokero",
+"Street address" => "Katuosoite",
+"Street and number" => "Katu ja numero",
"Extended" => "Laajennettu",
-"Street" => "Katuosoite",
+"Apartment number etc." => "Asunnon numero jne.",
"City" => "Paikkakunta",
"Region" => "Alue",
"Zipcode" => "Postinumero",
+"Postal code" => "Postinumero",
"Country" => "Maa",
-"Edit categories" => "Muokkaa luokkia",
-"Add" => "Lisää",
"Addressbook" => "Osoitekirja",
"Given name" => "Etunimi",
"Additional names" => "Lisänimet",
@@ -98,12 +123,13 @@
"Please choose the addressbook" => "Valitse osoitekirja",
"create a new addressbook" => "luo uusi osoitekirja",
"Name of new addressbook" => "Uuden osoitekirjan nimi",
-"Import" => "Tuo",
"Importing contacts" => "Tuodaan yhteystietoja",
-"Select address book to import to:" => "Valitse osoitekirja, johon yhteystiedot tuodaan:",
"You have no contacts in your addressbook." => "Osoitekirjassasi ei ole yhteystietoja.",
"Add contact" => "Lisää yhteystieto",
"Configure addressbooks" => "Muokkaa osoitekirjoja",
+"Select Address Books" => "Valitse osoitekirjat",
+"Enter name" => "Anna nimi",
+"Enter description" => "Anna kuvaus",
"CardDAV syncing addresses" => "CardDAV-synkronointiosoitteet",
"iOS/OS X" => "iOS/OS X"
);
diff --git a/apps/contacts/l10n/fr.php b/apps/contacts/l10n/fr.php
index 0a2a4e58b9f..dd59a68aaf2 100644
--- a/apps/contacts/l10n/fr.php
+++ b/apps/contacts/l10n/fr.php
@@ -1,10 +1,13 @@
<?php $TRANSLATIONS = array(
"Error (de)activating addressbook." => "Des erreurs se sont produites lors de l'activation/désactivation du carnet d'adresses.",
"There was an error adding the contact." => "Une erreur s'est produite lors de l'ajout du contact.",
+"element name is not set." => "Le champ Nom n'est pas défini.",
+"id is not set." => "L'ID n'est pas défini.",
+"Could not parse contact: " => "Impossible de lire le contact :",
"Cannot add empty property." => "Impossible d'ajouter un champ vide.",
"At least one of the address fields has to be filled out." => "Au moins un des champs d'adresses doit être complété.",
"Trying to add duplicate property: " => "Ajout d'une propriété en double:",
-"Error adding contact property." => "Erreur lors de l'ajout du champ.",
+"Error adding contact property: " => "Erreur pendant l'ajout de la propriété du contact :",
"No ID provided" => "Aucun ID fourni",
"Error setting checksum." => "Erreur lors du paramétrage du hachage.",
"No categories selected for deletion." => "Pas de catégories sélectionnées pour la suppression.",
@@ -12,22 +15,23 @@
"No contacts found." => "Aucun contact trouvé.",
"Missing ID" => "ID manquant",
"Error parsing VCard for ID: \"" => "Erreur lors de l'analyse du VCard pour l'ID: \"",
-"Cannot add addressbook with an empty name." => "Ne peut être ajouté avec un nom vide.",
-"Error adding addressbook." => "Erreur lors de l'ajout du carnet d'adresses.",
-"Error activating addressbook." => "Erreur lors de l'activation du carnet d'adresses.",
"No contact ID was submitted." => "Aucun ID de contact envoyé",
"Error reading contact photo." => "Erreur de lecture de la photo du contact.",
"Error saving temporary file." => "Erreur de sauvegarde du fichier temporaire.",
"The loading photo is not valid." => "La photo chargée est invalide.",
-"id is not set." => "L'ID n'est pas défini.",
"Information about vCard is incorrect. Please reload the page." => "Les informations relatives à cette vCard sont incorrectes. Veuillez recharger la page.",
"Error deleting contact property." => "Erreur lors de la suppression du champ.",
"Contact ID is missing." => "L'ID du contact est manquant.",
-"Missing contact id." => "ID contact manquant.",
"No photo path was submitted." => "Le chemin de la photo n'a pas été envoyé.",
"File doesn't exist:" => "Fichier inexistant:",
"Error loading image." => "Erreur lors du chargement de l'image.",
-"element name is not set." => "Le champ Nom n'est pas défini.",
+"Error getting contact object." => "Erreur lors de l'obtention de l'objet contact",
+"Error getting PHOTO property." => "Erreur lors de l'obtention des propriétés de la photo",
+"Error saving contact." => "Erreur de sauvegarde du contact",
+"Error resizing image" => "Erreur de redimensionnement de l'image",
+"Error cropping image" => "Erreur lors du rognage de l'image",
+"Error creating temporary image" => "Erreur de création de l'image temporaire",
+"Error finding image: " => "Erreur pour trouver l'image :",
"checksum is not set." => "L'hachage n'est pas défini.",
"Information about vCard is incorrect. Please reload the page: " => "L'informatiion à propos de la vCard est incorrect. Merci de rafraichir la page:",
"Something went FUBAR. " => "Quelque chose est FUBAR.",
@@ -41,8 +45,27 @@
"The uploaded file was only partially uploaded" => "Le fichier envoyé n'a été que partiellement envoyé.",
"No file was uploaded" => "Pas de fichier envoyé.",
"Missing a temporary folder" => "Absence de dossier temporaire.",
+"Couldn't save temporary image: " => "Impossible de sauvegarder l'image temporaire :",
+"Couldn't load temporary image: " => "Impossible de charger l'image temporaire :",
+"No file was uploaded. Unknown error" => "Aucun fichier n'a été chargé. Erreur inconnue",
"Contacts" => "Contacts",
-"Drop a VCF file to import contacts." => "Glisser un fichier VCF pour importer des contacts.",
+"Sorry, this functionality has not been implemented yet" => "Désolé cette fonctionnalité n'a pas encore été implementée",
+"Not implemented" => "Pas encore implémenté",
+"Couldn't get a valid address." => "Impossible de trouver une adresse valide.",
+"Error" => "Erreur",
+"Contact" => "Contact",
+"New" => "Nouveau",
+"New Contact" => "Nouveau Contact",
+"This property has to be non-empty." => "Cette valeur ne doit pas être vide",
+"Couldn't serialize elements." => "Impossible de sérialiser les éléments",
+"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' a été appelé sans type d'arguments. Merci de rapporter un bug à bugs.owncloud.org",
+"Edit name" => "Éditer le nom",
+"No files selected for upload." => "Aucun fichiers choisis pour être chargés",
+"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Le fichier que vous tenter de charger dépasse la taille maximum de fichier autorisé sur ce serveur.",
+"Select type" => "Sélectionner un type",
+"Result: " => "Résultat :",
+" imported, " => "importé,",
+" failed." => "échoué.",
"Addressbook not found." => "Carnet d'adresses introuvable.",
"This is not your addressbook." => "Ce n'est pas votre carnet d'adresses.",
"Contact could not be found." => "Ce contact n'a pu être trouvé.",
@@ -60,25 +83,54 @@
"Video" => "Vidéo",
"Pager" => "Bipeur",
"Internet" => "Internet",
+"Birthday" => "Anniversaire",
+"Business" => "Business",
+"Call" => "Appel",
+"Clients" => "Clients",
+"Deliverer" => "Livreur",
+"Holidays" => "Vacances",
+"Ideas" => "Idées",
+"Journey" => "Trajet",
+"Jubilee" => "Jubilé",
+"Meeting" => "Rendez-vous",
+"Other" => "Autre",
+"Personal" => "Personnel",
+"Projects" => "Projets",
+"Questions" => "Questions",
"{name}'s Birthday" => "Anniversaire de {name}",
-"Contact" => "Contact",
"Add Contact" => "Ajouter un Contact",
+"Import" => "Importer",
"Addressbooks" => "Carnets d'adresses",
+"Close" => "Fermer",
+"Keyboard shortcuts" => "Raccourcis clavier",
+"Navigation" => "Navigation",
+"Next contact in list" => "Contact suivant dans la liste",
+"Previous contact in list" => "Contact précédent dans la liste",
+"Expand/collapse current addressbook" => "Dé/Replier le carnet d'adresses courant",
+"Next/previous addressbook" => "Passer au carnet d'adresses suivant/précédent",
+"Actions" => "Actions",
+"Refresh contacts list" => "Actualiser la liste des contacts",
+"Add new contact" => "Ajouter un nouveau contact",
+"Add new addressbook" => "Ajouter un nouveau carnet d'adresses",
+"Delete current contact" => "Effacer le contact sélectionné",
"Configure Address Books" => "Paramétrer carnet d'adresses",
"New Address Book" => "Nouveau Carnet d'adresses",
-"Import from VCF" => "Importer depuis VCF",
"CardDav Link" => "Lien CardDav",
"Download" => "Télécharger",
"Edit" => "Modifier",
"Delete" => "Supprimer",
-"Download contact" => "Télécharger le contact",
-"Delete contact" => "Supprimer le contact",
"Drop photo to upload" => "Glisser une photo pour l'envoi",
+"Delete current photo" => "Supprimer la photo actuelle",
+"Edit current photo" => "Editer la photo actuelle",
+"Upload new photo" => "Envoyer une nouvelle photo",
+"Select photo from ownCloud" => "Sélectionner une photo depuis ownCloud",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formatage personnalisé, Nom court, Nom complet, Inversé, Inversé avec virgule",
"Edit name details" => "Editer les noms",
"Nickname" => "Surnom",
"Enter nickname" => "Entrer un surnom",
-"Birthday" => "Anniversaire",
+"Web site" => "Page web",
+"http://www.somesite.com" => "http://www.somesite.com",
+"Go to web site" => "Allez à la page web",
"dd-mm-yyyy" => "jj-mm-aaaa",
"Groups" => "Groupes",
"Separate groups with commas" => "Séparer les groupes avec des virgules",
@@ -86,6 +138,7 @@
"Preferred" => "Préféré",
"Please specify a valid email address." => "Merci d'entrer une adresse e-mail valide.",
"Enter email address" => "Entrer une adresse e-mail",
+"Mail to address" => "Envoyer à l'adresse",
"Delete email address" => "Supprimer l'adresse e-mail",
"Enter phone number" => "Entrer un numéro de téléphone",
"Delete phone number" => "Supprimer le numéro de téléphone",
@@ -93,24 +146,24 @@
"Edit address details" => "Editer les adresses",
"Add notes here." => "Ajouter des notes ici.",
"Add field" => "Ajouter un champ.",
-"Profile picture" => "Photo de profil",
"Phone" => "Téléphone",
"Note" => "Note",
-"Delete current photo" => "Supprimer la photo actuelle",
-"Edit current photo" => "Editer la photo actuelle",
-"Upload new photo" => "Envoyer une nouvelle photo",
-"Select photo from ownCloud" => "Sélectionner une photo depuis ownCloud",
+"Download contact" => "Télécharger le contact",
+"Delete contact" => "Supprimer le contact",
+"The temporary image has been removed from cache." => "L'image temporaire a été supprimée du cache.",
"Edit address" => "Editer l'adresse",
"Type" => "Type",
"PO Box" => "Boîte postale",
+"Street address" => "Adresse postale",
+"Street and number" => "Rue et numéro",
"Extended" => "Étendu",
-"Street" => "Rue",
+"Apartment number etc." => "Numéro d'appartement, etc.",
"City" => "Ville",
"Region" => "Région",
+"E.g. state or province" => "Ex: état ou province",
"Zipcode" => "Code postal",
+"Postal code" => "Code postal",
"Country" => "Pays",
-"Edit categories" => "Editer les catégories",
-"Add" => "Ajouter",
"Addressbook" => "Carnet d'adresses",
"Hon. prefixes" => "Préfixe hon.",
"Miss" => "Mlle",
@@ -123,7 +176,14 @@
"Additional names" => "Nom supplémentaires",
"Family name" => "Nom de famille",
"Hon. suffixes" => "Suffixes hon.",
+"J.D." => "J.D.",
+"M.D." => "Dr.",
+"D.O." => "D.O.",
+"D.C." => "D.C.",
"Ph.D." => "Dr",
+"Esq." => "Esq.",
+"Jr." => "Jr.",
+"Sn." => "Sn.",
"New Addressbook" => "Nouveau carnet d'adresses",
"Edit Addressbook" => "Éditer le carnet d'adresses",
"Displayname" => "Nom",
@@ -135,15 +195,16 @@
"Please choose the addressbook" => "Choisissez le carnet d'adresses SVP",
"create a new addressbook" => "Créer un nouveau carnet d'adresses",
"Name of new addressbook" => "Nom du nouveau carnet d'adresses",
-"Import" => "Importer",
"Importing contacts" => "Importation des contacts",
-"Select address book to import to:" => "Selectionner le carnet d'adresses à importer vers:",
-"Select from HD" => "Selectionner depuis le disque dur",
"You have no contacts in your addressbook." => "Il n'y a pas de contact dans votre carnet d'adresses.",
"Add contact" => "Ajouter un contact",
"Configure addressbooks" => "Paramétrer carnet d'adresses",
+"Select Address Books" => "Choix du carnet d'adresses",
+"Enter name" => "Saisissez le nom",
+"Enter description" => "Saisissez une description",
"CardDAV syncing addresses" => "Synchronisation des contacts CardDAV",
"more info" => "Plus d'infos",
"Primary address (Kontact et al)" => "Adresse principale",
-"iOS/OS X" => "iOS/OS X"
+"iOS/OS X" => "iOS/OS X",
+"Read only vCard directory link(s)" => "Lien(s) vers le répertoire de vCards en lecture seule"
);
diff --git a/apps/contacts/l10n/it.php b/apps/contacts/l10n/it.php
index 2a5478e6c4b..820104b7774 100644
--- a/apps/contacts/l10n/it.php
+++ b/apps/contacts/l10n/it.php
@@ -1,10 +1,13 @@
<?php $TRANSLATIONS = array(
"Error (de)activating addressbook." => "Errore nel (dis)attivare la rubrica.",
"There was an error adding the contact." => "Si è verificato un errore nell'aggiunta del contatto.",
+"element name is not set." => "il nome dell'elemento non è impostato.",
+"id is not set." => "ID non impostato.",
+"Could not parse contact: " => "Impossibile elaborare il contatto: ",
"Cannot add empty property." => "Impossibile aggiungere una proprietà vuota.",
"At least one of the address fields has to be filled out." => "Deve essere riempito almeno un indirizzo.",
"Trying to add duplicate property: " => "P",
-"Error adding contact property." => "Errore durante l'aggiunta della proprietà del contatto.",
+"Error adding contact property: " => "Errore durante l'aggiunta della proprietà del contatto: ",
"No ID provided" => "Nessun ID fornito",
"Error setting checksum." => "Errore di impostazione del codice di controllo.",
"No categories selected for deletion." => "Nessuna categoria selezionata per l'eliminazione.",
@@ -12,22 +15,23 @@
"No contacts found." => "Nessun contatto trovato.",
"Missing ID" => "ID mancante",
"Error parsing VCard for ID: \"" => "Errore in fase di elaborazione del file VCard per l'ID: \"",
-"Cannot add addressbook with an empty name." => "Impossibile aggiungere una rubrica senza nome.",
-"Error adding addressbook." => "Errore durante l'aggiunta della rubrica.",
-"Error activating addressbook." => "Errore durante l'attivazione della rubrica.",
"No contact ID was submitted." => "Nessun ID di contatto inviato.",
"Error reading contact photo." => "Errore di lettura della foto del contatto.",
"Error saving temporary file." => "Errore di salvataggio del file temporaneo.",
"The loading photo is not valid." => "La foto caricata non è valida.",
-"id is not set." => "ID non impostato.",
"Information about vCard is incorrect. Please reload the page." => "Informazioni sulla vCard non corrette. Ricarica la pagina.",
"Error deleting contact property." => "Errore durante l'eliminazione della proprietà del contatto.",
"Contact ID is missing." => "Manca l'ID del contatto.",
-"Missing contact id." => "ID di contatto mancante.",
"No photo path was submitted." => "Non è stato inviato alcun percorso a una foto.",
"File doesn't exist:" => "Il file non esiste:",
"Error loading image." => "Errore di caricamento immagine.",
-"element name is not set." => "il nome dell'elemento non è impostato.",
+"Error getting contact object." => "Errore di recupero dell'oggetto contatto.",
+"Error getting PHOTO property." => "Errore di recupero della proprietà FOTO.",
+"Error saving contact." => "Errore di salvataggio del contatto.",
+"Error resizing image" => "Errore di ridimensionamento dell'immagine",
+"Error cropping image" => "Errore di ritaglio dell'immagine",
+"Error creating temporary image" => "Errore durante la creazione dell'immagine temporanea",
+"Error finding image: " => "Errore durante la ricerca dell'immagine: ",
"checksum is not set." => "il codice di controllo non è impostato.",
"Information about vCard is incorrect. Please reload the page: " => "Le informazioni della vCard non sono corrette. Ricarica la pagina: ",
"Something went FUBAR. " => "Qualcosa è andato storto. ",
@@ -41,8 +45,27 @@
"The uploaded file was only partially uploaded" => "Il file è stato inviato solo parzialmente",
"No file was uploaded" => "Nessun file è stato inviato",
"Missing a temporary folder" => "Manca una cartella temporanea",
+"Couldn't save temporary image: " => "Impossibile salvare l'immagine temporanea: ",
+"Couldn't load temporary image: " => "Impossibile caricare l'immagine temporanea: ",
+"No file was uploaded. Unknown error" => "Nessun file è stato inviato. Errore sconosciuto",
"Contacts" => "Contatti",
-"Drop a VCF file to import contacts." => "Rilascia un file VCF per importare i contatti.",
+"Sorry, this functionality has not been implemented yet" => "Siamo spiacenti, questa funzionalità non è stata ancora implementata",
+"Not implemented" => "Non implementata",
+"Couldn't get a valid address." => "Impossibile ottenere un indirizzo valido.",
+"Error" => "Errore",
+"Contact" => "Contatto",
+"New" => "Nuovo",
+"New Contact" => "Nuovo contatto",
+"This property has to be non-empty." => "Questa proprietà non può essere vuota.",
+"Couldn't serialize elements." => "Impossibile serializzare gli elementi.",
+"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' invocata senza l'argomento di tipo. Segnalalo a bugs.owncloud.org",
+"Edit name" => "Modifica il nome",
+"No files selected for upload." => "Nessun file selezionato per l'invio",
+"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Il file che stai cercando di inviare supera la dimensione massima per l'invio dei file su questo server.",
+"Select type" => "Seleziona il tipo",
+"Result: " => "Risultato: ",
+" imported, " => " importato, ",
+" failed." => " non riuscito.",
"Addressbook not found." => "Rubrica non trovata.",
"This is not your addressbook." => "Questa non è la tua rubrica.",
"Contact could not be found." => "Il contatto non può essere trovato.",
@@ -60,25 +83,54 @@
"Video" => "Video",
"Pager" => "Cercapersone",
"Internet" => "Internet",
+"Birthday" => "Compleanno",
+"Business" => "Lavoro",
+"Call" => "Chiama",
+"Clients" => "Client",
+"Deliverer" => "Corriere",
+"Holidays" => "Festività",
+"Ideas" => "Idee",
+"Journey" => "Viaggio",
+"Jubilee" => "Anniversario",
+"Meeting" => "Riunione",
+"Other" => "Altro",
+"Personal" => "Personale",
+"Projects" => "Progetti",
+"Questions" => "Domande",
"{name}'s Birthday" => "Data di nascita di {name}",
-"Contact" => "Contatto",
"Add Contact" => "Aggiungi contatto",
+"Import" => "Importa",
"Addressbooks" => "Rubriche",
+"Close" => "Chiudi",
+"Keyboard shortcuts" => "Scorciatoie da tastiera",
+"Navigation" => "Navigazione",
+"Next contact in list" => "Contatto successivo in elenco",
+"Previous contact in list" => "Contatto precedente in elenco",
+"Expand/collapse current addressbook" => "Espandi/Contrai la rubrica corrente",
+"Next/previous addressbook" => "Rubrica successiva/precedente",
+"Actions" => "Azioni",
+"Refresh contacts list" => "Aggiorna l'elenco dei contatti",
+"Add new contact" => "Aggiungi un nuovo contatto",
+"Add new addressbook" => "Aggiungi una nuova rubrica",
+"Delete current contact" => "Elimina il contatto corrente",
"Configure Address Books" => "Configura rubrica",
"New Address Book" => "Nuova rubrica",
-"Import from VCF" => "Importa da VCF",
"CardDav Link" => "Link CardDav",
"Download" => "Scarica",
"Edit" => "Modifica",
"Delete" => "Elimina",
-"Download contact" => "Scarica contatto",
-"Delete contact" => "Elimina contatto",
"Drop photo to upload" => "Rilascia una foto da inviare",
+"Delete current photo" => "Elimina la foto corrente",
+"Edit current photo" => "Modifica la foto corrente",
+"Upload new photo" => "Invia una nuova foto",
+"Select photo from ownCloud" => "Seleziona la foto da ownCloud",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formato personalizzato, nome breve, nome completo, invertito o invertito con virgola",
"Edit name details" => "Modifica dettagli del nome",
"Nickname" => "Pseudonimo",
"Enter nickname" => "Inserisci pseudonimo",
-"Birthday" => "Compleanno",
+"Web site" => "Sito web",
+"http://www.somesite.com" => "http://www.somesite.com",
+"Go to web site" => "Vai al sito web",
"dd-mm-yyyy" => "gg-mm-aaaa",
"Groups" => "Gruppi",
"Separate groups with commas" => "Separa i gruppi con virgole",
@@ -94,24 +146,24 @@
"Edit address details" => "Modifica dettagli dell'indirizzo",
"Add notes here." => "Aggiungi qui le note.",
"Add field" => "Aggiungi campo",
-"Profile picture" => "Immagine del profilo",
"Phone" => "Telefono",
"Note" => "Nota",
-"Delete current photo" => "Elimina la foto corrente",
-"Edit current photo" => "Modifica la foto corrente",
-"Upload new photo" => "Invia una nuova foto",
-"Select photo from ownCloud" => "Seleziona la foto da ownCloud",
+"Download contact" => "Scarica contatto",
+"Delete contact" => "Elimina contatto",
+"The temporary image has been removed from cache." => "L'immagine temporanea è stata rimossa dalla cache.",
"Edit address" => "Modifica indirizzo",
"Type" => "Tipo",
"PO Box" => "Casella postale",
+"Street address" => "Indirizzo",
+"Street and number" => "Via e numero",
"Extended" => "Esteso",
-"Street" => "Via",
+"Apartment number etc." => "Numero appartamento ecc.",
"City" => "Città",
"Region" => "Regione",
+"E.g. state or province" => "Ad es. stato o provincia",
"Zipcode" => "CAP",
+"Postal code" => "CAP",
"Country" => "Stato",
-"Edit categories" => "Modifica categorie",
-"Add" => "Aggiungi",
"Addressbook" => "Rubrica",
"Hon. prefixes" => "Prefissi onorifici",
"Miss" => "Sig.na",
@@ -143,15 +195,16 @@
"Please choose the addressbook" => "Scegli la rubrica",
"create a new addressbook" => "crea una nuova rubrica",
"Name of new addressbook" => "Nome della nuova rubrica",
-"Import" => "Importa",
"Importing contacts" => "Importazione contatti",
-"Select address book to import to:" => "Seleziona la rubrica di destinazione:",
-"Select from HD" => "Seleziona da disco",
"You have no contacts in your addressbook." => "Non hai contatti nella rubrica.",
"Add contact" => "Aggiungi contatto",
"Configure addressbooks" => "Configura rubriche",
+"Select Address Books" => "Seleziona rubriche",
+"Enter name" => "Inserisci il nome",
+"Enter description" => "Inserisci una descrizione",
"CardDAV syncing addresses" => "Indirizzi di sincronizzazione CardDAV",
"more info" => "altre informazioni",
"Primary address (Kontact et al)" => "Indirizzo principale (Kontact e altri)",
-"iOS/OS X" => "iOS/OS X"
+"iOS/OS X" => "iOS/OS X",
+"Read only vCard directory link(s)" => "Collegamento(i) cartella vCard sola lettura"
);
diff --git a/apps/contacts/l10n/sk_SK.php b/apps/contacts/l10n/sk_SK.php
index 6e5ebe3bd3c..79db2dbcf6e 100644
--- a/apps/contacts/l10n/sk_SK.php
+++ b/apps/contacts/l10n/sk_SK.php
@@ -1,10 +1,11 @@
<?php $TRANSLATIONS = array(
"Error (de)activating addressbook." => "Chyba (de)aktivácie adresára.",
"There was an error adding the contact." => "Vyskytla sa chyba pri pridávaní kontaktu.",
+"element name is not set." => "meno elementu nie je nastavené.",
+"id is not set." => "ID nie je nastavené.",
"Cannot add empty property." => "Nemôžem pridať prázdny údaj.",
"At least one of the address fields has to be filled out." => "Musí byť uvedený aspoň jeden adresný údaj.",
"Trying to add duplicate property: " => "Pokúšate sa pridať rovnaký atribút:",
-"Error adding contact property." => "Chyba pridania údaju kontaktu",
"No ID provided" => "ID nezadané",
"Error setting checksum." => "Chyba pri nastavovaní kontrolného súčtu.",
"No categories selected for deletion." => "Žiadne kategórie neboli vybraté na odstránenie.",
@@ -12,22 +13,23 @@
"No contacts found." => "Žiadne kontakty nenájdené.",
"Missing ID" => "Chýba ID",
"Error parsing VCard for ID: \"" => "Chyba pri vyňatí ID z VCard:",
-"Cannot add addressbook with an empty name." => "Nedá sa pridať adresár s prázdnym menom.",
-"Error adding addressbook." => "Chyba počas pridávania adresára.",
-"Error activating addressbook." => "Chyba aktivovania adresára.",
"No contact ID was submitted." => "Nebolo nastavené ID kontaktu.",
"Error reading contact photo." => "Chyba pri čítaní fotky kontaktu.",
"Error saving temporary file." => "Chyba pri ukladaní dočasného súboru.",
"The loading photo is not valid." => "Načítaná fotka je vadná.",
-"id is not set." => "ID nie je nastavené.",
"Information about vCard is incorrect. Please reload the page." => "Informácie o vCard sú neplatné. Prosím obnovte stránku.",
"Error deleting contact property." => "Chyba odstránenia údaju kontaktu.",
"Contact ID is missing." => "Chýba ID kontaktu.",
-"Missing contact id." => "Chýba ID kontaktu.",
"No photo path was submitted." => "Žiadna fotka nebola poslaná.",
"File doesn't exist:" => "Súbor neexistuje:",
"Error loading image." => "Chyba pri nahrávaní obrázka.",
-"element name is not set." => "meno elementu nie je nastavené.",
+"Error getting contact object." => "Chyba počas prevzatia objektu kontakt.",
+"Error getting PHOTO property." => "Chyba počas získavania fotky.",
+"Error saving contact." => "Chyba počas ukladania kontaktu.",
+"Error resizing image" => "Chyba počas zmeny obrázku.",
+"Error cropping image" => "Chyba počas orezania obrázku.",
+"Error creating temporary image" => "Chyba počas vytvárania dočasného obrázku.",
+"Error finding image: " => "Chyba vyhľadania obrázku: ",
"checksum is not set." => "kontrolný súčet nie je nastavený.",
"Information about vCard is incorrect. Please reload the page: " => "Informácia o vCard je nesprávna. Obnovte stránku, prosím.",
"Something went FUBAR. " => "Niečo sa pokazilo.",
@@ -41,8 +43,27 @@
"The uploaded file was only partially uploaded" => "Ukladaný súbor sa nahral len čiastočne",
"No file was uploaded" => "Žiadny súbor nebol uložený",
"Missing a temporary folder" => "Chýba dočasný priečinok",
+"Couldn't save temporary image: " => "Nemôžem uložiť dočasný obrázok: ",
+"Couldn't load temporary image: " => "Nemôžem načítať dočasný obrázok: ",
+"No file was uploaded. Unknown error" => "Žiaden súbor nebol odoslaný. Neznáma chyba",
"Contacts" => "Kontakty",
-"Drop a VCF file to import contacts." => "Pretiahnite VCF súbor pre import kontaktov.",
+"Sorry, this functionality has not been implemented yet" => "Bohužiaľ, táto funkcia ešte nebola implementovaná",
+"Not implemented" => "Neimplementované",
+"Couldn't get a valid address." => "Nemôžem získať platnú adresu.",
+"Error" => "Chyba",
+"Contact" => "Kontakt",
+"New" => "Nový",
+"New Contact" => "Nový kontakt",
+"This property has to be non-empty." => "Tento parameter nemôže byť prázdny.",
+"Couldn't serialize elements." => "Nemôžem previesť prvky.",
+"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' zavolané bez argument. Prosím oznámte chybu na bugs.owncloud.org",
+"Edit name" => "Upraviť meno",
+"No files selected for upload." => "Žiadne súbory neboli vybrané k nahratiu",
+"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Súbor, ktorý sa pokúšate nahrať, presahuje maximálnu povolenú veľkosť.",
+"Select type" => "Vybrať typ",
+"Result: " => "Výsledok: ",
+" imported, " => " importovaných, ",
+" failed." => " zlyhaných.",
"Addressbook not found." => "Adresár sa nenašiel.",
"This is not your addressbook." => "Toto nie je váš adresár.",
"Contact could not be found." => "Kontakt nebol nájdený.",
@@ -60,25 +81,44 @@
"Video" => "Video",
"Pager" => "Pager",
"Internet" => "Internet",
+"Birthday" => "Narodeniny",
+"Business" => "Biznis",
+"Clients" => "Klienti",
+"Holidays" => "Prázdniny",
+"Meeting" => "Stretnutie",
+"Other" => "Iné",
+"Projects" => "Projekty",
+"Questions" => "Otázky",
"{name}'s Birthday" => "Narodeniny {name}",
-"Contact" => "Kontakt",
"Add Contact" => "Pridať Kontakt.",
+"Import" => "Importovať",
"Addressbooks" => "Adresáre",
+"Close" => "Zatvoriť",
+"Keyboard shortcuts" => "Klávesové skratky",
+"Navigation" => "Navigácia",
+"Next contact in list" => "Ďalší kontakt v zozname",
+"Previous contact in list" => "Predchádzajúci kontakt v zozname",
+"Next/previous addressbook" => "Ďalší/predošlí adresár",
+"Actions" => "Akcie",
+"Refresh contacts list" => "Obnov zoznam kontaktov",
+"Add new contact" => "Pridaj nový kontakt",
+"Add new addressbook" => "Pridaj nový adresár",
+"Delete current contact" => "Vymaž súčasný kontakt",
"Configure Address Books" => "Nastaviť adresáre",
"New Address Book" => "Nový adresár",
-"Import from VCF" => "Importovať z VCF",
"CardDav Link" => "CardDav odkaz",
"Download" => "Stiahnuť",
"Edit" => "Upraviť",
"Delete" => "Odstrániť",
-"Download contact" => "Stiahnuť kontakt",
-"Delete contact" => "Odstrániť kontakt",
"Drop photo to upload" => "Pretiahnite sem fotku pre nahratie",
+"Delete current photo" => "Odstrániť súčasnú fotku",
+"Edit current photo" => "Upraviť súčasnú fotku",
+"Upload new photo" => "Nahrať novú fotku",
+"Select photo from ownCloud" => "Vybrať fotku z ownCloud",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formát vlastný, krátke meno, celé meno, obrátené alebo obrátené s čiarkami",
"Edit name details" => "Upraviť podrobnosti mena",
"Nickname" => "Prezývka",
"Enter nickname" => "Zadajte prezývku",
-"Birthday" => "Narodeniny",
"dd-mm-yyyy" => "dd. mm. yyyy",
"Groups" => "Skupiny",
"Separate groups with commas" => "Oddelte skupiny čiarkami",
@@ -94,24 +134,22 @@
"Edit address details" => "Upraviť podrobnosti adresy",
"Add notes here." => "Tu môžete pridať poznámky.",
"Add field" => "Pridať pole",
-"Profile picture" => "Profilová fotka",
"Phone" => "Telefón",
"Note" => "Poznámka",
-"Delete current photo" => "Odstrániť súčasnú fotku",
-"Edit current photo" => "Upraviť súčasnú fotku",
-"Upload new photo" => "Nahrať novú fotku",
-"Select photo from ownCloud" => "Vybrať fotku z ownCloud",
+"Download contact" => "Stiahnuť kontakt",
+"Delete contact" => "Odstrániť kontakt",
+"The temporary image has been removed from cache." => "Dočasný obrázok bol odstránený z cache.",
"Edit address" => "Upraviť adresu",
"Type" => "Typ",
"PO Box" => "PO Box",
+"Street address" => "Ulica",
+"Street and number" => "Ulica a číslo",
"Extended" => "Rozšírené",
-"Street" => "Ulica",
"City" => "Mesto",
"Region" => "Región",
"Zipcode" => "PSČ",
+"Postal code" => "PSČ",
"Country" => "Krajina",
-"Edit categories" => "Upraviť kategórie",
-"Add" => "Pridať",
"Addressbook" => "Adresár",
"Hon. prefixes" => "Tituly pred",
"Miss" => "Slečna",
@@ -126,6 +164,8 @@
"Hon. suffixes" => "Tituly za",
"J.D." => "JUDr.",
"M.D." => "MUDr.",
+"D.O." => "D.O.",
+"D.C." => "D.C.",
"Ph.D." => "Ph.D.",
"Esq." => "Esq.",
"Jr." => "ml.",
@@ -141,13 +181,11 @@
"Please choose the addressbook" => "Prosím zvolte adresár",
"create a new addressbook" => "vytvoriť nový adresár",
"Name of new addressbook" => "Meno nového adresára",
-"Import" => "Importovať",
"Importing contacts" => "Importovanie kontaktov",
-"Select address book to import to:" => "Vyberte adresár, do ktorého chcete importovať:",
-"Select from HD" => "Vyberte z pevného disku",
"You have no contacts in your addressbook." => "Nemáte žiadne kontakty v adresári.",
"Add contact" => "Pridať kontakt",
"Configure addressbooks" => "Nastaviť adresáre",
+"Enter name" => "Zadaj meno",
"CardDAV syncing addresses" => "Adresy pre synchronizáciu s CardDAV",
"more info" => "viac informácií",
"Primary address (Kontact et al)" => "Predvolená adresa (Kontakt etc)",
diff --git a/apps/contacts/l10n/sv.php b/apps/contacts/l10n/sv.php
index 8d5d37d2484..bb8f0d0a300 100644
--- a/apps/contacts/l10n/sv.php
+++ b/apps/contacts/l10n/sv.php
@@ -1,30 +1,32 @@
<?php $TRANSLATIONS = array(
"Error (de)activating addressbook." => "Fel när (av)aktivera adressbok",
"There was an error adding the contact." => "Det uppstod ett fel när kontakt skulle läggas till",
+"id is not set." => "ID är inte satt.",
+"Could not parse contact: " => "Kunde inte läsa kontakt:",
"Cannot add empty property." => "Kan inte lägga till en tom egenskap",
"At least one of the address fields has to be filled out." => "Minst ett fält måste fyllas i",
-"Error adding contact property." => "Fel när kontaktegenskap skulle läggas till",
+"Error adding contact property: " => "Kunde inte lägga till egenskap för kontakt:",
"No ID provided" => "Inget ID angett",
"Error setting checksum." => "Fel uppstod när kontrollsumma skulle sättas.",
"No categories selected for deletion." => "Inga kategorier valda för borttaging",
"No address books found." => "Ingen adressbok funnen.",
"No contacts found." => "Inga kontakter funna.",
"Missing ID" => "ID saknas",
-"Cannot add addressbook with an empty name." => "Kan inte lägga till adressbok med ett tomt namn.",
-"Error adding addressbook." => "Fel när adressbok skulle läggas till",
-"Error activating addressbook." => "Fel uppstod när adressbok skulle aktiveras",
"No contact ID was submitted." => "Inget kontakt-ID angavs.",
"Error reading contact photo." => "Fel uppstod när ",
"Error saving temporary file." => "Fel uppstod när temporär fil skulle sparas.",
"The loading photo is not valid." => "Det laddade fotot är inte giltigt.",
-"id is not set." => "ID är inte satt.",
"Information about vCard is incorrect. Please reload the page." => "Information om vCard är felaktigt. Vänligen ladda om sidan.",
"Error deleting contact property." => "Fel uppstod när kontaktegenskap skulle tas bort",
"Contact ID is missing." => "Kontakt-ID saknas.",
-"Missing contact id." => "Saknar kontakt-ID.",
"No photo path was submitted." => "Ingen sökväg till foto angavs.",
"File doesn't exist:" => "Filen existerar inte.",
"Error loading image." => "Fel uppstod när bild laddades.",
+"Error saving contact." => "Fel vid sparande av kontakt.",
+"Error resizing image" => "Fel vid storleksförändring av bilden",
+"Error cropping image" => "Fel vid beskärning av bilden",
+"Error creating temporary image" => "Fel vid skapande av tillfällig bild",
+"Error finding image: " => "Kunde inte hitta bild",
"checksum is not set." => "kontrollsumma är inte satt.",
"Information about vCard is incorrect. Please reload the page: " => "Informationen om vCard är fel. Ladda om sidan:",
"Error updating contact property." => "Fel uppstod när kontaktegenskap skulle uppdateras",
@@ -37,8 +39,27 @@
"The uploaded file was only partially uploaded" => "Den uppladdade filen var bara delvist uppladdad",
"No file was uploaded" => "Ingen fil laddades upp",
"Missing a temporary folder" => "En temporär mapp saknas",
+"Couldn't save temporary image: " => "Kunde inte spara tillfällig bild:",
+"Couldn't load temporary image: " => "Kunde inte ladda tillfällig bild:",
+"No file was uploaded. Unknown error" => "Ingen fil uppladdad. Okänt fel",
"Contacts" => "Kontakter",
-"Drop a VCF file to import contacts." => "Släpp en VCF-fil för att importera kontakter.",
+"Sorry, this functionality has not been implemented yet" => "Tyvärr är denna funktion inte införd än",
+"Not implemented" => "Inte införd",
+"Couldn't get a valid address." => "Kunde inte hitta en giltig adress.",
+"Error" => "Fel",
+"Contact" => "Kontakt",
+"New" => "Ny",
+"New Contact" => "Ny kontakt",
+"This property has to be non-empty." => "Denna egenskap får inte vara tom.",
+"Couldn't serialize elements." => "Kunde inte serialisera element.",
+"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "\"deleteProperty\" anropades utan typargument. Vänligen rapportera till bugs.owncloud.org",
+"Edit name" => "Ändra namn",
+"No files selected for upload." => "Inga filer valda för uppladdning",
+"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Filen du försöker ladda upp är större än den maximala storleken för filuppladdning på denna server.",
+"Select type" => "Välj typ",
+"Result: " => "Resultat:",
+" imported, " => "importerad,",
+" failed." => "misslyckades.",
"Addressbook not found." => "Hittade inte adressboken",
"This is not your addressbook." => "Det här är inte din adressbok.",
"Contact could not be found." => "Kontakt kunde inte hittas.",
@@ -56,25 +77,33 @@
"Video" => "Video",
"Pager" => "Personsökare",
"Internet" => "Internet",
+"Birthday" => "Födelsedag",
+"Business" => "Företag",
+"Call" => "Ring",
+"Clients" => "Kunder",
+"Deliverer" => "Leverera",
+"Holidays" => "Helgdagar",
+"Ideas" => "Idéer",
"{name}'s Birthday" => "{name}'s födelsedag",
-"Contact" => "Kontakt",
"Add Contact" => "Lägg till kontakt",
+"Import" => "Importera",
"Addressbooks" => "Adressböcker",
+"Close" => "Stäng",
"Configure Address Books" => "Konfigurera adressböcker",
"New Address Book" => "Ny adressbok",
-"Import from VCF" => "Importera från VCF",
"CardDav Link" => "CardDAV länk",
"Download" => "Nedladdning",
"Edit" => "Redigera",
"Delete" => "Radera",
-"Download contact" => "Ladda ner kontakt",
-"Delete contact" => "Radera kontakt",
"Drop photo to upload" => "Släpp foto för att ladda upp",
+"Delete current photo" => "Ta bort aktuellt foto",
+"Edit current photo" => "Redigera aktuellt foto",
+"Upload new photo" => "Ladda upp ett nytt foto",
+"Select photo from ownCloud" => "Välj foto från ownCloud",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => " anpassad, korta namn, hela namn, bakåt eller bakåt med komma",
"Edit name details" => "Redigera detaljer för namn",
"Nickname" => "Smeknamn",
"Enter nickname" => "Ange smeknamn",
-"Birthday" => "Födelsedag",
"dd-mm-yyyy" => "dd-mm-åååå",
"Groups" => "Grupper",
"Separate groups with commas" => "Separera grupperna med kommatecken",
@@ -90,24 +119,19 @@
"Edit address details" => "Redigera detaljer för adress",
"Add notes here." => "Lägg till noteringar här.",
"Add field" => "Lägg till fält",
-"Profile picture" => "Profilbild",
"Phone" => "Telefon",
"Note" => "Notering",
-"Delete current photo" => "Ta bort aktuellt foto",
-"Edit current photo" => "Redigera aktuellt foto",
-"Upload new photo" => "Ladda upp ett nytt foto",
-"Select photo from ownCloud" => "Välj foto från ownCloud",
+"Download contact" => "Ladda ner kontakt",
+"Delete contact" => "Radera kontakt",
+"The temporary image has been removed from cache." => "Den tillfälliga bilden har raderats från cache.",
"Edit address" => "Editera adress",
"Type" => "Typ",
"PO Box" => "Postbox",
"Extended" => "Utökad",
-"Street" => "Gata",
"City" => "Stad",
"Region" => "Län",
"Zipcode" => "Postnummer",
"Country" => "Land",
-"Edit categories" => "Editera kategorier",
-"Add" => "Ny",
"Addressbook" => "Adressbok",
"Miss" => "Herr",
"Ms" => "Ingen adressbok funnen.",
@@ -129,10 +153,7 @@
"Please choose the addressbook" => "Vänligen välj adressboken",
"create a new addressbook" => "skapa en ny adressbok",
"Name of new addressbook" => "Namn för ny adressbok",
-"Import" => "Importera",
"Importing contacts" => "Importerar kontakter",
-"Select address book to import to:" => "Importera till adressbok:",
-"Select from HD" => "Välj från hårddisk",
"You have no contacts in your addressbook." => "Du har inga kontakter i din adressbok.",
"Add contact" => "Lägg till en kontakt",
"Configure addressbooks" => "Konfigurera adressböcker",
diff --git a/apps/contacts/l10n/vi.php b/apps/contacts/l10n/vi.php
new file mode 100644
index 00000000000..5713ede7b00
--- /dev/null
+++ b/apps/contacts/l10n/vi.php
@@ -0,0 +1,48 @@
+<?php $TRANSLATIONS = array(
+"element name is not set." => "tên phần tử không được thiết lập.",
+"id is not set." => "id không được thiết lập.",
+"No ID provided" => "Không có ID được cung cấp",
+"No address books found." => "Không tìm thấy sổ địa chỉ.",
+"No contacts found." => "Không tìm thấy danh sách",
+"Missing ID" => "Missing ID",
+"Error reading contact photo." => "Lỗi đọc liên lạc hình ảnh.",
+"The loading photo is not valid." => "Các hình ảnh tải không hợp lệ.",
+"File doesn't exist:" => "Tập tin không tồn tại",
+"Error loading image." => "Lỗi khi tải hình ảnh.",
+"Error uploading contacts to storage." => "Lỗi tải lên danh sách địa chỉ để lưu trữ.",
+"There is no error, the file uploaded with success" => "Không có lỗi, các tập tin tải lên thành công",
+"Contacts" => "Liên lạc",
+"Contact" => "Danh sách",
+"Address" => "Địa chỉ",
+"Telephone" => "Điện thoại bàn",
+"Email" => "Email",
+"Organization" => "Tổ chức",
+"Work" => "Công việc",
+"Home" => "Nhà",
+"Mobile" => "Di động",
+"Fax" => "Fax",
+"Video" => "Video",
+"Pager" => "số trang",
+"Birthday" => "Ngày sinh nhật",
+"Add Contact" => "Thêm liên lạc",
+"Addressbooks" => "Sổ địa chỉ",
+"CardDav Link" => "CardDav Link",
+"Download" => "Tải về",
+"Edit" => "Sửa",
+"Delete" => "Xóa",
+"Phone" => "Điện thoại",
+"Delete contact" => "Xóa liên lạc",
+"PO Box" => "Hòm thư bưu điện",
+"City" => "Thành phố",
+"Region" => "Vùng/miền",
+"Zipcode" => "Mã bưu điện",
+"Country" => "Quốc gia",
+"Addressbook" => "Sổ địa chỉ",
+"New Addressbook" => "Sổ địa chỉ mới",
+"Edit Addressbook" => "Sửa sổ địa chỉ",
+"Displayname" => "Hiển thị tên",
+"Active" => "Kích hoạt",
+"Save" => "Lưu",
+"Submit" => "Submit",
+"Cancel" => "Hủy"
+);
diff --git a/apps/contacts/lib/app.php b/apps/contacts/lib/app.php
index 80141bb7240..74464aa718b 100644
--- a/apps/contacts/lib/app.php
+++ b/apps/contacts/lib/app.php
@@ -26,14 +26,12 @@ class OC_Contacts_App {
if ($addressbook === false) {
OCP\Util::writeLog('contacts', 'Addressbook not found: '. $id, OCP\Util::ERROR);
OCP\JSON::error(array('data' => array( 'message' => self::$l10n->t('Addressbook not found.'))));
- exit();
} else if ($addressbook['userid'] != OCP\USER::getUser()) {
if ($shared = OCP\Share::getItemSharedWithBySource('addressbook', $id)) {
$addressbook['displayname'] = $shared['item_target'];
} else {
OCP\Util::writeLog('contacts', 'Addressbook('.$id.') is not from '.OCP\USER::getUser(), OCP\Util::ERROR);
OCP\JSON::error(array('data' => array( 'message' => self::$l10n->t('This is not your addressbook.'))));
- exit();
}
}
return $addressbook;
@@ -42,8 +40,17 @@ class OC_Contacts_App {
public static function getContactObject($id) {
$card = OC_Contacts_VCard::find( $id );
if( $card === false ) {
- OCP\Util::writeLog('contacts', 'Contact could not be found: '.$id, OCP\Util::ERROR);
- OCP\JSON::error(array('data' => array( 'message' => self::$l10n->t('Contact could not be found.').' '.print_r($id, true))));
+ OCP\Util::writeLog('contacts',
+ 'Contact could not be found: '.$id,
+ OCP\Util::ERROR);
+ OCP\JSON::error(
+ array(
+ 'data' => array(
+ 'message' => self::$l10n->t('Contact could not be found.')
+ .' '.print_r($id, true)
+ )
+ )
+ );
exit();
}
@@ -59,22 +66,6 @@ class OC_Contacts_App {
$card = self::getContactObject( $id );
$vcard = OC_VObject::parse($card['carddata']);
- // Try to fix cards with missing 'N' field from pre ownCloud 4. Hot damn, this is ugly...
- if(!is_null($vcard) && !$vcard->__isset('N')) {
- $version = OCP\App::getAppVersion('contacts');
- if($version >= 5) {
- OCP\Util::writeLog('contacts', 'OC_Contacts_App::getContactVCard. Deprecated check for missing N field', OCP\Util::DEBUG);
- }
- OCP\Util::writeLog('contacts', 'getContactVCard, Missing N field', OCP\Util::DEBUG);
- if($vcard->__isset('FN')) {
- OCP\Util::writeLog('contacts', 'getContactVCard, found FN field: '.$vcard->__get('FN'), OCP\Util::DEBUG);
- $n = implode(';', array_reverse(array_slice(explode(' ', $vcard->__get('FN')), 0, 2))).';;;';
- $vcard->setString('N', $n);
- OC_Contacts_VCard::edit( $id, $vcard);
- } else { // Else just add an empty 'N' field :-P
- $vcard->setString('N', 'Unknown;Name;;;');
- }
- }
if (!is_null($vcard) && !isset($vcard->REV)) {
$rev = new DateTime('@'.$card['lastmodified']);
$vcard->setString('REV', $rev->format(DateTime::W3C));
@@ -112,29 +103,29 @@ class OC_Contacts_App {
public static function getTypesOfProperty($prop) {
$l = self::$l10n;
switch($prop) {
- case 'ADR':
- return array(
- 'WORK' => $l->t('Work'),
- 'HOME' => $l->t('Home'),
- );
- case 'TEL':
- return array(
- 'HOME' => $l->t('Home'),
- 'CELL' => $l->t('Mobile'),
- 'WORK' => $l->t('Work'),
- 'TEXT' => $l->t('Text'),
- 'VOICE' => $l->t('Voice'),
- 'MSG' => $l->t('Message'),
- 'FAX' => $l->t('Fax'),
- 'VIDEO' => $l->t('Video'),
- 'PAGER' => $l->t('Pager'),
- );
- case 'EMAIL':
- return array(
- 'WORK' => $l->t('Work'),
- 'HOME' => $l->t('Home'),
- 'INTERNET' => $l->t('Internet'),
- );
+ case 'ADR':
+ return array(
+ 'WORK' => $l->t('Work'),
+ 'HOME' => $l->t('Home'),
+ );
+ case 'TEL':
+ return array(
+ 'HOME' => $l->t('Home'),
+ 'CELL' => $l->t('Mobile'),
+ 'WORK' => $l->t('Work'),
+ 'TEXT' => $l->t('Text'),
+ 'VOICE' => $l->t('Voice'),
+ 'MSG' => $l->t('Message'),
+ 'FAX' => $l->t('Fax'),
+ 'VIDEO' => $l->t('Video'),
+ 'PAGER' => $l->t('Pager'),
+ );
+ case 'EMAIL':
+ return array(
+ 'WORK' => $l->t('Work'),
+ 'HOME' => $l->t('Home'),
+ 'INTERNET' => $l->t('Internet'),
+ );
}
}
@@ -144,11 +135,13 @@ class OC_Contacts_App {
*/
protected static function getVCategories() {
if (is_null(self::$categories)) {
- self::$categories = new OC_VCategories('contacts', null, self::getDefaultCategories());
+ self::$categories = new OC_VCategories('contacts',
+ null,
+ self::getDefaultCategories());
}
return self::$categories;
}
-
+
/**
* @brief returns the categories for the user
* @return (Array) $categories
@@ -185,7 +178,7 @@ class OC_Contacts_App {
(string)self::$l10n->t('Work'),
);
}
-
+
/**
* scan vcards for categories.
* @param $vccontacts VCards to scan. null to check all vcards for the current user.
@@ -200,14 +193,20 @@ class OC_Contacts_App {
}
$start = 0;
$batchsize = 10;
- while($vccontacts = OC_Contacts_VCard::all($vcaddressbookids, $start, $batchsize)){
+ while($vccontacts =
+ OC_Contacts_VCard::all($vcaddressbookids, $start, $batchsize)) {
$cards = array();
foreach($vccontacts as $vccontact) {
$cards[] = $vccontact['carddata'];
}
- OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', scanning: '.$batchsize.' starting from '.$start, OCP\Util::DEBUG);
+ OCP\Util::writeLog('contacts',
+ __CLASS__.'::'.__METHOD__
+ .', scanning: '.$batchsize.' starting from '.$start,
+ OCP\Util::DEBUG);
// only reset on first batch.
- self::getVCategories()->rescan($cards, true, ($start == 0 ? true : false));
+ self::getVCategories()->rescan($cards,
+ true,
+ ($start == 0 ? true : false));
$start += $batchsize;
}
}
diff --git a/apps/contacts/lib/vcard.php b/apps/contacts/lib/vcard.php
index ca171e792fc..990e790c035 100644
--- a/apps/contacts/lib/vcard.php
+++ b/apps/contacts/lib/vcard.php
@@ -79,7 +79,7 @@ class OC_Contacts_VCard{
return false;
}
} else {
- OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.'. Addressbook id(s) argument is empty: '. $id, OCP\Util::DEBUG);
+ OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.'. Addressbook id(s) argument is empty: '. print_r($id, true), OCP\Util::DEBUG);
return false;
}
$cards = array();
@@ -129,7 +129,7 @@ class OC_Contacts_VCard{
return $result->fetchRow();
}
- /**
+ /**
* @brief Format property TYPE parameters for upgrading from v. 2.1
* @param $property Reference to a Sabre_VObject_Property.
* In version 2.1 e.g. a phone can be formatted like: TEL;HOME;CELL:123456789
@@ -145,7 +145,7 @@ class OC_Contacts_VCard{
}
}
- /**
+ /**
* @brief Decode properties for upgrading from v. 2.1
* @param $property Reference to a Sabre_VObject_Property.
* The only encoding allowed in version 3.0 is 'b' for binary. All encoded strings
diff --git a/apps/files/css/files.css b/apps/files/css/files.css
index dc298e4d440..317c0b8a1e2 100644
--- a/apps/files/css/files.css
+++ b/apps/files/css/files.css
@@ -89,3 +89,4 @@ a.action>img { max-height:16px; max-width:16px; vertical-align:text-bottom; }
#navigation>ul>li:first-child+li { padding-top:2.9em; }
#scanning-message{ top:40%; left:40%; position:absolute; display:none; }
+#notification span { cursor:pointer; font-weight:bold; margin-left:1em; } \ No newline at end of file
diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js
index d54dd466469..39e848cec80 100644
--- a/apps/files/js/fileactions.js
+++ b/apps/files/js/fileactions.js
@@ -172,6 +172,7 @@ FileActions.register('all','Delete', FileActions.PERMISSION_DELETE, function(){r
}else{
FileList.do_delete(filename);
}
+ $('.tipsy').remove();
});
FileActions.register('all','Rename', FileActions.PERMISSION_UPDATE, function(){return OC.imagePath('core','actions/rename')},function(filename){
diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js
index 3645258f98f..a414c5f8303 100644
--- a/apps/files/js/filelist.js
+++ b/apps/files/js/filelist.js
@@ -136,24 +136,39 @@ FileList={
event.stopPropagation();
event.preventDefault();
var newname=input.val();
- tr.attr('data-file',newname);
- td.children('a.name').empty();
+ if (newname != name) {
+ if ($('tr').filterAttr('data-file', newname).length > 0) {
+ $('#notification').html(newname+' '+t('files', 'already exists')+'<span class="replace">'+t('files', 'replace')+'</span><span class="cancel">'+t('files', 'cancel')+'</span>');
+ $('#notification').data('oldName', name);
+ $('#notification').data('newName', newname);
+ $('#notification').fadeIn();
+ newname = name;
+ } else {
+ $.get(OC.filePath('files','ajax','rename.php'), { dir : $('#dir').val(), newname: newname, file: name },function(result) {
+ if (!result || result.status == 'error') {
+ OC.dialogs.alert(result.data.message, 'Error moving file');
+ newname = name;
+ }
+ });
+ }
+
+ }
+ tr.attr('data-file', newname);
var path = td.children('a.name').attr('href');
td.children('a.name').attr('href', path.replace(encodeURIComponent(name), encodeURIComponent(newname)));
- if(newname.indexOf('.')>0){
- basename=newname.substr(0,newname.lastIndexOf('.'));
- }else{
- basename=newname;
+ if (newname.indexOf('.') > 0) {
+ var basename=newname.substr(0,newname.lastIndexOf('.'));
+ } else {
+ var basename=newname;
}
+ td.children('a.name').empty();
var span=$('<span class="nametext"></span>');
span.text(basename);
td.children('a.name').append(span);
- if(newname.indexOf('.')>0){
+ if (newname.indexOf('.') > 0) {
span.append($('<span class="extension">'+newname.substr(newname.lastIndexOf('.'))+'</span>'));
}
- $.get(OC.filePath('files','ajax','rename.php'), { dir : $('#dir').val(), newname: newname, file: name },function(){
- tr.data('renaming',false);
- });
+ tr.data('renaming',false);
return false;
});
input.click(function(event){
@@ -164,12 +179,64 @@ FileList={
form.trigger('submit');
});
},
+ replace:function(oldName, newName) {
+ // Finish any existing actions
+ if (FileList.lastAction || !FileList.useUndo) {
+ FileList.lastAction();
+ }
+ var tr = $('tr').filterAttr('data-file', oldName);
+ tr.hide();
+ FileList.replaceCanceled = false;
+ FileList.replaceOldName = oldName;
+ FileList.replaceNewName = newName;
+ FileList.lastAction = function() {
+ FileList.finishReplace();
+ };
+ $('#notification').html(t('files', 'replaced')+' '+newName+' '+t('files', 'with')+' '+oldName+'<span class="undo">'+t('files', 'undo')+'</span>');
+ $('#notification').fadeIn();
+ },
+ finishReplace:function() {
+ if (!FileList.replaceCanceled && FileList.replaceOldName && FileList.replaceNewName) {
+ // Delete the file being replaced and rename the replacement
+ FileList.deleteCanceled = false;
+ FileList.deleteFiles = [FileList.replaceNewName];
+ FileList.finishDelete(function() {
+ $.ajax({url: OC.filePath('files', 'ajax', 'rename.php'), async: false, data: { dir: $('#dir').val(), newname: FileList.replaceNewName, file: FileList.replaceOldName }, success: function(result) {
+ if (result && result.status == 'success') {
+ var tr = $('tr').filterAttr('data-file', FileList.replaceOldName);
+ tr.attr('data-file', FileList.replaceNewName);
+ var td = tr.children('td.filename');
+ td.children('a.name .span').text(FileList.replaceNewName);
+ var path = td.children('a.name').attr('href');
+ td.children('a.name').attr('href', path.replace(encodeURIComponent(FileList.replaceOldName), encodeURIComponent(FileList.replaceNewName)));
+ if (FileList.replaceNewName.indexOf('.') > 0) {
+ var basename = FileList.replaceNewName.substr(0, FileList.replaceNewName.lastIndexOf('.'));
+ } else {
+ var basename = FileList.replaceNewName;
+ }
+ td.children('a.name').empty();
+ var span = $('<span class="nametext"></span>');
+ span.text(basename);
+ td.children('a.name').append(span);
+ if (FileList.replaceNewName.indexOf('.') > 0) {
+ span.append($('<span class="extension">'+FileList.replaceNewName.substr(FileList.replaceNewName.lastIndexOf('.'))+'</span>'));
+ }
+ tr.show();
+ } else {
+ OC.dialogs.alert(result.data.message, 'Error moving file');
+ }
+ FileList.replaceCanceled = true;
+ FileList.replaceOldName = null;
+ FileList.replaceNewName = null;
+ FileList.lastAction = null;
+ }});
+ }, true);
+ }
+ },
do_delete:function(files){
- if(FileList.deleteFiles || !FileList.useUndo){//finish any ongoing deletes first
- FileList.finishDelete(function(){
- FileList.do_delete(files);
- });
- return;
+ // Finish any existing actions
+ if (FileList.lastAction || !FileList.useUndo) {
+ FileList.lastAction();
}
if(files.substr){
files=[files];
@@ -183,8 +250,10 @@ FileList={
procesSelection();
FileList.deleteCanceled=false;
FileList.deleteFiles=files;
- $('#notification').text(t('files','undo deletion'));
- $('#notification').data('deletefile',true);
+ FileList.lastAction = function() {
+ FileList.finishDelete(null, true);
+ };
+ $('#notification').html(t('files', 'deleted')+' '+files+'<span class="undo">'+t('files', 'undo')+'</span>');
$('#notification').fadeIn();
},
finishDelete:function(ready,sync){
@@ -202,6 +271,7 @@ FileList={
});
FileList.deleteCanceled=true;
FileList.deleteFiles=null;
+ FileList.lastAction = null;
if(ready){
ready();
}
@@ -214,20 +284,33 @@ FileList={
$(document).ready(function(){
$('#notification').hide();
- $('#notification').click(function(){
- if($('#notification').data('deletefile'))
- {
+ $('#notification .undo').live('click', function(){
+ if (FileList.deleteFiles) {
$.each(FileList.deleteFiles,function(index,file){
$('tr').filterAttr('data-file',file).show();
-// alert(file);
});
FileList.deleteCanceled=true;
FileList.deleteFiles=null;
+ } else if (FileList.replaceOldName && FileList.replaceNewName) {
+ $('tr').filterAttr('data-file', FileList.replaceOldName).show();
+ FileList.replaceCanceled = true;
+ FileList.replaceOldName = null;
+ FileList.replaceNewName = null;
}
$('#notification').fadeOut();
});
+ $('#notification .replace').live('click', function() {
+ $('#notification').fadeOut('400', function() {
+ FileList.replace($('#notification').data('oldName'), $('#notification').data('newName'));
+ });
+ });
+ $('#notification .cancel').live('click', function() {
+ $('#notification').fadeOut();
+ });
FileList.useUndo=('onbeforeunload' in window)
$(window).bind('beforeunload', function (){
- FileList.finishDelete(null,true);
+ if (FileList.lastAction) {
+ FileList.lastAction();
+ }
});
});
diff --git a/apps/files/l10n/ar.php b/apps/files/l10n/ar.php
index 91e748e3002..52480ce7ff8 100644
--- a/apps/files/l10n/ar.php
+++ b/apps/files/l10n/ar.php
@@ -6,6 +6,7 @@
"No file was uploaded" => "لم يتم ترفيع أي من الملفات",
"Missing a temporary folder" => "المجلد المؤقت غير موجود",
"Files" => "الملفات",
+"Delete" => "محذوف",
"Size" => "حجم",
"Modified" => "معدل",
"Maximum upload size" => "الحد الأقصى لحجم الملفات التي يمكن رفعها",
@@ -16,7 +17,6 @@
"Nothing in here. Upload something!" => "لا يوجد شيء هنا. إرفع بعض الملفات!",
"Name" => "الاسم",
"Download" => "تحميل",
-"Delete" => "محذوف",
"Upload too large" => "حجم الترفيع أعلى من المسموح",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "حجم الملفات التي تريد ترفيعها أعلى من المسموح على الخادم."
);
diff --git a/apps/files/l10n/bg_BG.php b/apps/files/l10n/bg_BG.php
index 83b36087310..329f306d9e8 100644
--- a/apps/files/l10n/bg_BG.php
+++ b/apps/files/l10n/bg_BG.php
@@ -6,6 +6,7 @@
"No file was uploaded" => "Фахлът не бе качен",
"Missing a temporary folder" => "Липсва временната папка",
"Files" => "Файлове",
+"Delete" => "Изтриване",
"Size" => "Размер",
"Modified" => "Променено",
"Maximum upload size" => "Макс. размер за качване",
@@ -13,7 +14,6 @@
"Nothing in here. Upload something!" => "Няма нищо, качете нещо!",
"Name" => "Име",
"Download" => "Изтегляне",
-"Delete" => "Изтриване",
"Upload too large" => "Файлът е прекалено голям",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Файловете които се опитвате да качите са по-големи от позволеното за сървъра."
);
diff --git a/apps/files/l10n/ca.php b/apps/files/l10n/ca.php
index baa6b3b7d45..c23746ac5ac 100644
--- a/apps/files/l10n/ca.php
+++ b/apps/files/l10n/ca.php
@@ -7,8 +7,20 @@
"Missing a temporary folder" => "S'ha perdut un fitxer temporal",
"Failed to write to disk" => "Ha fallat en escriure al disc",
"Files" => "Fitxers",
+"Unshare" => "Deixa de compartir",
+"Delete" => "Suprimeix",
+"generating ZIP-file, it may take some time." => "s'estan generant fitxers ZIP, pot trigar una estona.",
+"Unable to upload your file as it is a directory or has 0 bytes" => "No es pot pujar el fitxer perquè és una carpeta o té 0 bytes",
+"Upload Error" => "Error en la pujada",
+"Pending" => "Pendents",
+"Upload cancelled." => "La pujada s'ha cancel·lat.",
+"Invalid name, '/' is not allowed." => "El nom no és vàlid, no es permet '/'.",
"Size" => "Mida",
"Modified" => "Modificat",
+"folder" => "carpeta",
+"folders" => "carpetes",
+"file" => "fitxer",
+"files" => "fitxers",
"File handling" => "Gestió de fitxers",
"Maximum upload size" => "Mida màxima de pujada",
"max. possible: " => "màxim possible:",
@@ -26,7 +38,6 @@
"Name" => "Nom",
"Share" => "Comparteix",
"Download" => "Baixa",
-"Delete" => "Suprimeix",
"Upload too large" => "La pujada és massa gran",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Els fitxers que esteu intentant pujar excedeixen la mida màxima de pujada del servidor",
"Files are being scanned, please wait." => "S'estan escanejant els fitxers, espereu",
diff --git a/apps/files/l10n/cs_CZ.php b/apps/files/l10n/cs_CZ.php
index 9a4be26dadb..ddaf923d1bd 100644
--- a/apps/files/l10n/cs_CZ.php
+++ b/apps/files/l10n/cs_CZ.php
@@ -7,8 +7,19 @@
"Missing a temporary folder" => "Chybí adresář pro sočasné soubory",
"Failed to write to disk" => "Zápis na disk se nezdařil",
"Files" => "Soubory",
+"Delete" => "Vymazat",
+"generating ZIP-file, it may take some time." => "generuji ZIP soubor, může to chvíli trvat",
+"Unable to upload your file as it is a directory or has 0 bytes" => "Nemohu nahrát váš soubor neboť to je adresář a nebo má nulovou délku.",
+"Upload Error" => "Chyba při nahrávání",
+"Pending" => "Očekává se",
+"Upload cancelled." => "Nahrávání zrušeno",
+"Invalid name, '/' is not allowed." => "Špatné jméno, znak '/' není povolen",
"Size" => "Velikost",
"Modified" => "Změněno",
+"folder" => "adresář",
+"folders" => "adresáře",
+"file" => "soubor",
+"files" => "soubory",
"File handling" => "Nastavení chování k souborům",
"Maximum upload size" => "Maximální velikost ukládaných souborů",
"max. possible: " => "největší možná:",
@@ -26,7 +37,6 @@
"Name" => "Název",
"Share" => "Sdílet",
"Download" => "Stáhnout",
-"Delete" => "Vymazat",
"Upload too large" => "Příliš velký soubor",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Soubory, které se snažíte uložit, překračují maximální velikosti uploadu na tomto serveru.",
"Files are being scanned, please wait." => "Soubory se prohledávají, prosím čekejte.",
diff --git a/apps/files/l10n/da.php b/apps/files/l10n/da.php
index 3683ab8484d..d24e2a8dcb7 100644
--- a/apps/files/l10n/da.php
+++ b/apps/files/l10n/da.php
@@ -7,8 +7,19 @@
"Missing a temporary folder" => "Mangler en midlertidig mappe",
"Failed to write to disk" => "Fejl ved skrivning til disk.",
"Files" => "Filer",
+"Delete" => "Slet",
+"generating ZIP-file, it may take some time." => "genererer ZIP-fil, det kan tage lidt tid.",
+"Unable to upload your file as it is a directory or has 0 bytes" => "Kunne ikke uploade din fil, da det enten er en mappe eller er tom",
+"Upload Error" => "Fejl ved upload",
+"Pending" => "Afventer",
+"Upload cancelled." => "Upload afbrudt.",
+"Invalid name, '/' is not allowed." => "Ugyldigt navn, '/' er ikke tilladt.",
"Size" => "Størrelse",
"Modified" => "Ændret",
+"folder" => "mappe",
+"folders" => "mapper",
+"file" => "fil",
+"files" => "filer",
"File handling" => "Filhåndtering",
"Maximum upload size" => "Maksimal upload-størrelse",
"max. possible: " => "max. mulige: ",
@@ -26,7 +37,6 @@
"Name" => "Navn",
"Share" => "Del",
"Download" => "Download",
-"Delete" => "Slet",
"Upload too large" => "Upload for stor",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filerne, du prøver at uploade, er større end den maksimale størrelse for fil-upload på denne server.",
"Files are being scanned, please wait." => "Filerne bliver indlæst, vent venligst.",
diff --git a/apps/files/l10n/de.php b/apps/files/l10n/de.php
index 9c5310c43b8..ea7ffa5ac54 100644
--- a/apps/files/l10n/de.php
+++ b/apps/files/l10n/de.php
@@ -6,11 +6,23 @@
"No file was uploaded" => "Es wurde keine Datei hochgeladen.",
"Missing a temporary folder" => "Temporärer Ordner fehlt.",
"Failed to write to disk" => "Fehler beim Schreiben auf Festplatte",
-"Files" => "Files",
+"Files" => "Dateien",
+"Unshare" => "Nicht mehr teilen",
+"Delete" => "Löschen",
+"generating ZIP-file, it may take some time." => "Erstelle ZIP-Datei. Dies kann eine Weile dauern.",
+"Unable to upload your file as it is a directory or has 0 bytes" => "Datei kann nicht hochgeladen werden da sie ein Verzeichniss ist oder 0 bytes hat.",
+"Upload Error" => "Fehler beim Hochladen",
+"Pending" => "Anstehend",
+"Upload cancelled." => "Hochladen abgebrochen.",
+"Invalid name, '/' is not allowed." => "Ungültiger Name, \"/\" ist nicht erlaubt.",
"Size" => "Größe",
"Modified" => "Bearbeitet",
+"folder" => "Ordner",
+"folders" => "Ordner",
+"file" => "Datei",
+"files" => "Dateien",
"File handling" => "Dateibehandlung",
-"Maximum upload size" => "Maximum upload size",
+"Maximum upload size" => "Maximale Upload-Größe",
"max. possible: " => "maximal möglich:",
"Needed for multi-file and folder downloads." => "Für Mehrfachdateien- und Ordnerdownloads benötigt:",
"Enable ZIP-download" => "ZIP-Download aktivieren",
@@ -26,7 +38,6 @@
"Name" => "Name",
"Share" => "Teilen",
"Download" => "Herunterladen",
-"Delete" => "Löschen",
"Upload too large" => "Upload zu groß",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.",
"Files are being scanned, please wait." => "Daten werden gescannt, bitte warten.",
diff --git a/apps/files/l10n/el.php b/apps/files/l10n/el.php
index 93be0246156..ce154bacb7f 100644
--- a/apps/files/l10n/el.php
+++ b/apps/files/l10n/el.php
@@ -7,8 +7,20 @@
"Missing a temporary folder" => "Λείπει ένας προσωρινός φάκελος",
"Failed to write to disk" => "Η εγγραφή στο δίσκο απέτυχε",
"Files" => "Αρχεία",
+"Unshare" => "Ακύρωση Διαμοιρασμού",
+"Delete" => "Διαγραφή",
+"generating ZIP-file, it may take some time." => "παραγωγή αρχείου ZIP, ίσως διαρκέσει αρκετά.",
+"Unable to upload your file as it is a directory or has 0 bytes" => "Αδυναμία στην μεταφόρτωση του αρχείου σας αφού είναι φάκελος ή έχει 0 bytes",
+"Upload Error" => "Σφάλμα Μεταφόρτωσης",
+"Pending" => "Εν αναμονή",
+"Upload cancelled." => "Η μεταφόρτωση ακυρώθηκε.",
+"Invalid name, '/' is not allowed." => "Μη έγκυρο όνομα, το '/' δεν επιτρέπεται.",
"Size" => "Μέγεθος",
"Modified" => "Τροποποιήθηκε",
+"folder" => "φάκελος",
+"folders" => "φάκελοι",
+"file" => "αρχείο",
+"files" => "αρχεία",
"File handling" => "Διαχείριση αρχείων",
"Maximum upload size" => "Μέγιστο μέγεθος μεταφόρτωσης",
"max. possible: " => "μέγιστο δυνατό:",
@@ -26,7 +38,6 @@
"Name" => "Όνομα",
"Share" => "Διαμοίρασε",
"Download" => "Λήψη",
-"Delete" => "Διαγραφή",
"Upload too large" => "Πολύ μεγάλο το αρχείο προς μεταφόρτωση",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Τα αρχεία που προσπαθείτε να ανεβάσετε υπερβαίνουν το μέγιστο μέγεθος μεταφόρτωσης αρχείων σε αυτόν το διακομιστή.",
"Files are being scanned, please wait." => "Τα αρχεία ανιχνεύονται, παρακαλώ περιμένετε",
diff --git a/apps/files/l10n/eo.php b/apps/files/l10n/eo.php
index 64c380d600f..fa9e5eca42b 100644
--- a/apps/files/l10n/eo.php
+++ b/apps/files/l10n/eo.php
@@ -7,8 +7,19 @@
"Missing a temporary folder" => "Mankas tempa dosierujo",
"Failed to write to disk" => "Malsukcesis skribo al disko",
"Files" => "Dosieroj",
+"Delete" => "Forigi",
+"generating ZIP-file, it may take some time." => "generanta ZIP-dosiero, ĝi povas daŭri iom da tempo",
+"Unable to upload your file as it is a directory or has 0 bytes" => "Ne eblis alŝuti vian dosieron ĉar ĝi estas dosierujo aŭ havas 0 duumokojn",
+"Upload Error" => "Alŝuta eraro",
+"Pending" => "Traktotaj",
+"Upload cancelled." => "La alŝuto nuliĝis.",
+"Invalid name, '/' is not allowed." => "Nevalida nomo, “/” ne estas permesata.",
"Size" => "Grando",
"Modified" => "Modifita",
+"folder" => "dosierujo",
+"folders" => "dosierujoj",
+"file" => "dosiero",
+"files" => "dosieroj",
"File handling" => "Dosieradministro",
"Maximum upload size" => "Maksimuma alŝutogrando",
"max. possible: " => "maks. ebla: ",
@@ -26,7 +37,6 @@
"Name" => "Nomo",
"Share" => "Kunhavigi",
"Download" => "Elŝuti",
-"Delete" => "Forigi",
"Upload too large" => "Elŝuto tro larĝa",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "La dosieroj, kiujn vi provas alŝuti, transpasas la maksimuman grandon por dosieralŝutoj en ĉi tiu servilo.",
"Files are being scanned, please wait." => "Dosieroj estas skanataj, bonvolu atendi.",
diff --git a/apps/files/l10n/es.php b/apps/files/l10n/es.php
index 67bfb4702e8..e1376aa42b1 100644
--- a/apps/files/l10n/es.php
+++ b/apps/files/l10n/es.php
@@ -7,8 +7,20 @@
"Missing a temporary folder" => "Falta un directorio temporal",
"Failed to write to disk" => "La escritura en disco ha fallado",
"Files" => "Archivos",
+"Unshare" => "No compartir",
+"Delete" => "Eliminado",
+"generating ZIP-file, it may take some time." => "generando un fichero ZIP, puede llevar un tiempo.",
+"Unable to upload your file as it is a directory or has 0 bytes" => "No ha sido posible subir tu archivo porque es un directorio o tiene 0 bytes",
+"Upload Error" => "Error al subir el archivo",
+"Pending" => "Pendiente",
+"Upload cancelled." => "Subida cancelada.",
+"Invalid name, '/' is not allowed." => "Nombre no válido, '/' no está permitido.",
"Size" => "Tamaño",
"Modified" => "Modificado",
+"folder" => "carpeta",
+"folders" => "carpetas",
+"file" => "archivo",
+"files" => "archivos",
"File handling" => "Tratamiento de archivos",
"Maximum upload size" => "Tamaño máximo de subida",
"max. possible: " => "máx. posible:",
@@ -26,7 +38,6 @@
"Name" => "Nombre",
"Share" => "Compartir",
"Download" => "Descargar",
-"Delete" => "Eliminado",
"Upload too large" => "El archivo es demasiado grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido por este servidor.",
"Files are being scanned, please wait." => "Se están escaneando los archivos, por favor espere.",
diff --git a/apps/files/l10n/et_EE.php b/apps/files/l10n/et_EE.php
index 89bb96581c9..a5dd345f8eb 100644
--- a/apps/files/l10n/et_EE.php
+++ b/apps/files/l10n/et_EE.php
@@ -7,8 +7,19 @@
"Missing a temporary folder" => "Ajutiste failide kaust puudub",
"Failed to write to disk" => "Kettale kirjutamine ebaõnnestus",
"Files" => "Failid",
+"Delete" => "Kustuta",
+"generating ZIP-file, it may take some time." => "ZIP-faili loomine, see võib veidi aega võtta.",
+"Unable to upload your file as it is a directory or has 0 bytes" => "Sinu faili üleslaadimine ebaõnnestus, kuna see on kaust või selle suurus on 0 baiti",
+"Upload Error" => "Üleslaadimise viga",
+"Pending" => "Ootel",
+"Upload cancelled." => "Üleslaadimine tühistati.",
+"Invalid name, '/' is not allowed." => "Vigane nimi, '/' pole lubatud.",
"Size" => "Suurus",
"Modified" => "Muudetud",
+"folder" => "kaust",
+"folders" => "kausta",
+"file" => "fail",
+"files" => "faili",
"File handling" => "Failide käsitlemine",
"Maximum upload size" => "Maksimaalne üleslaadimise suurus",
"max. possible: " => "maks. võimalik: ",
@@ -26,7 +37,6 @@
"Name" => "Nimi",
"Share" => "Jaga",
"Download" => "Lae alla",
-"Delete" => "Kustuta",
"Upload too large" => "Üleslaadimine on liiga suur",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Failid, mida sa proovid üles laadida, ületab serveri poolt üleslaetavatele failidele määratud maksimaalse suuruse.",
"Files are being scanned, please wait." => "Faile skannitakse, palun oota",
diff --git a/apps/files/l10n/eu.php b/apps/files/l10n/eu.php
index a7ca21f496b..588df210a1c 100644
--- a/apps/files/l10n/eu.php
+++ b/apps/files/l10n/eu.php
@@ -7,8 +7,19 @@
"Missing a temporary folder" => "Aldi baterako karpeta falta da",
"Failed to write to disk" => "Errore bat izan da diskoan idazterakoan",
"Files" => "Fitxategiak",
+"Delete" => "Ezabatu",
+"generating ZIP-file, it may take some time." => "ZIP-fitxategia sortzen ari da, denbora har dezake",
+"Unable to upload your file as it is a directory or has 0 bytes" => "Ezin da zure fitxategia igo, karpeta bat da edo 0 byt ditu",
+"Upload Error" => "Igotzean errore bat suertatu da",
+"Pending" => "Zain",
+"Upload cancelled." => "Igoera ezeztatuta",
+"Invalid name, '/' is not allowed." => "Baliogabeko izena, '/' ezin da erabili. ",
"Size" => "Tamaina",
"Modified" => "Aldatuta",
+"folder" => "karpeta",
+"folders" => "Karpetak",
+"file" => "fitxategia",
+"files" => "fitxategiak",
"File handling" => "Fitxategien kudeaketa",
"Maximum upload size" => "Igo daitekeen gehienezko tamaina",
"max. possible: " => "max, posiblea:",
@@ -26,7 +37,6 @@
"Name" => "Izena",
"Share" => "Elkarbanatu",
"Download" => "Deskargatu",
-"Delete" => "Ezabatu",
"Upload too large" => "Igotakoa handiegia da",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Igotzen saiatzen ari zaren fitxategiak zerbitzari honek igotzeko onartzen duena baino handiagoak dira.",
"Files are being scanned, please wait." => "Fitxategiak eskaneatzen ari da, itxoin mezedez.",
diff --git a/apps/files/l10n/fa.php b/apps/files/l10n/fa.php
index 4bb46e1fcf9..77173d28364 100644
--- a/apps/files/l10n/fa.php
+++ b/apps/files/l10n/fa.php
@@ -7,8 +7,19 @@
"Missing a temporary folder" => "یک پوشه موقت گم شده است",
"Failed to write to disk" => "نوشتن بر روی دیسک سخت ناموفق بود",
"Files" => "فایل ها",
+"Delete" => "پاک کردن",
+"generating ZIP-file, it may take some time." => "در حال ساخت فایل فشرده ممکن است زمان زیادی به طول بیانجامد",
+"Unable to upload your file as it is a directory or has 0 bytes" => "ناتوان در بارگذاری یا فایل یک پوشه است یا 0بایت دارد",
+"Upload Error" => "خطا در بار گذاری",
+"Pending" => "در انتظار",
+"Upload cancelled." => "بار گذاری لغو شد",
+"Invalid name, '/' is not allowed." => "نام نامناسب '/' غیرفعال است",
"Size" => "اندازه",
"Modified" => "تغییر یافته",
+"folder" => "پوشه",
+"folders" => "پوشه ها",
+"file" => "پرونده",
+"files" => "پرونده ها",
"File handling" => "اداره پرونده ها",
"Maximum upload size" => "حداکثر اندازه بارگزاری",
"max. possible: " => "حداکثرمقدارممکن:",
@@ -26,7 +37,6 @@
"Name" => "نام",
"Share" => "به اشتراک گذاری",
"Download" => "بارگیری",
-"Delete" => "پاک کردن",
"Upload too large" => "حجم بارگذاری بسیار زیاد است",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "فایلها بیش از حد تعیین شده در این سرور هستند\nمترجم:با تغییر فایل php,ini میتوان این محدودیت را برطرف کرد",
"Files are being scanned, please wait." => "پرونده ها در حال بازرسی هستند لطفا صبر کنید",
diff --git a/apps/files/l10n/fi_FI.php b/apps/files/l10n/fi_FI.php
index c99d4408f60..1b1cfd394cc 100644
--- a/apps/files/l10n/fi_FI.php
+++ b/apps/files/l10n/fi_FI.php
@@ -7,8 +7,20 @@
"Missing a temporary folder" => "Väliaikaiskansiota ei ole olemassa",
"Failed to write to disk" => "Levylle kirjoitus epäonnistui",
"Files" => "Tiedostot",
+"Unshare" => "Lopeta jakaminen",
+"Delete" => "Poista",
+"generating ZIP-file, it may take some time." => "luodaan ZIP-tiedostoa, tämä saattaa kestää hetken.",
+"Unable to upload your file as it is a directory or has 0 bytes" => "Tiedoston lähetys epäonnistui, koska sen koko on 0 tavua tai kyseessä on kansio",
+"Upload Error" => "Lähetysvirhe.",
+"Pending" => "Odottaa",
+"Upload cancelled." => "Lähetys peruttu.",
+"Invalid name, '/' is not allowed." => "Virheellinen nimi, merkki '/' ei ole sallittu.",
"Size" => "Koko",
"Modified" => "Muutettu",
+"folder" => "kansio",
+"folders" => "kansiota",
+"file" => "tiedosto",
+"files" => "tiedostoa",
"File handling" => "Tiedostonhallinta",
"Maximum upload size" => "Lähetettävän tiedoston suurin sallittu koko",
"Needed for multi-file and folder downloads." => "Tarvitaan useampien tiedostojen ja kansioiden latausta varten.",
@@ -25,7 +37,6 @@
"Name" => "Nimi",
"Share" => "Jaa",
"Download" => "Lataa",
-"Delete" => "Poista",
"Upload too large" => "Lähetettävä tiedosto on liian suuri",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Lähetettäväksi valitsemasi tiedostot ylittävät palvelimen salliman tiedostokoon rajan.",
"Files are being scanned, please wait." => "Tiedostoja tarkistetaan, odota hetki."
diff --git a/apps/files/l10n/fr.php b/apps/files/l10n/fr.php
index ab2f4ea13df..ca3d03ad6f7 100644
--- a/apps/files/l10n/fr.php
+++ b/apps/files/l10n/fr.php
@@ -7,8 +7,20 @@
"Missing a temporary folder" => "Il manque un répertoire temporaire",
"Failed to write to disk" => "Erreur d'écriture sur le disque",
"Files" => "Fichiers",
+"Unshare" => "Ne plus partager",
+"Delete" => "Supprimer",
+"generating ZIP-file, it may take some time." => "Générer un fichier ZIP, cela peut prendre du temps",
+"Unable to upload your file as it is a directory or has 0 bytes" => "Impossible de charger vos fichiers car il s'agit d'un dossier ou le fichier fait 0 octet.",
+"Upload Error" => "Erreur de chargement",
+"Pending" => "En cours",
+"Upload cancelled." => "Chargement annulé",
+"Invalid name, '/' is not allowed." => "Nom invalide, '/' n'est pas autorisé.",
"Size" => "Taille",
"Modified" => "Modifié",
+"folder" => "dossier",
+"folders" => "dossiers",
+"file" => "fichier",
+"files" => "fichiers",
"File handling" => "Gestion des fichiers",
"Maximum upload size" => "Taille max. d'envoi",
"max. possible: " => "Max. possible :",
@@ -26,7 +38,6 @@
"Name" => "Nom",
"Share" => "Partager",
"Download" => "Téléchargement",
-"Delete" => "Supprimer",
"Upload too large" => "Fichier trop volumineux",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Les fichiers que vous essayez d'envoyer dépassent la taille maximale permise par ce serveur.",
"Files are being scanned, please wait." => "Les fichiers sont analysés, patientez svp.",
diff --git a/apps/files/l10n/gl.php b/apps/files/l10n/gl.php
index 36eafaefe27..cbbd65217b8 100644
--- a/apps/files/l10n/gl.php
+++ b/apps/files/l10n/gl.php
@@ -7,8 +7,19 @@
"Missing a temporary folder" => "Falta un cartafol temporal",
"Failed to write to disk" => "Erro ao escribir no disco",
"Files" => "Ficheiros",
+"Delete" => "Eliminar",
+"generating ZIP-file, it may take some time." => "xerando ficheiro ZIP, pode levar un anaco.",
+"Unable to upload your file as it is a directory or has 0 bytes" => "Non se puido subir o ficheiro pois ou é un directorio ou ten 0 bytes",
+"Upload Error" => "Erro na subida",
+"Pending" => "Pendentes",
+"Upload cancelled." => "Subida cancelada.",
+"Invalid name, '/' is not allowed." => "Nome non válido, '/' non está permitido.",
"Size" => "Tamaño",
"Modified" => "Modificado",
+"folder" => "cartafol",
+"folders" => "cartafoles",
+"file" => "ficheiro",
+"files" => "ficheiros",
"File handling" => "Manexo de ficheiro",
"Maximum upload size" => "Tamaño máximo de envío",
"max. possible: " => "máx. posible: ",
@@ -26,7 +37,6 @@
"Name" => "Nome",
"Share" => "Compartir",
"Download" => "Descargar",
-"Delete" => "Eliminar",
"Upload too large" => "Envío demasiado grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Os ficheiros que trata de subir superan o tamaño máximo permitido neste servidor",
"Files are being scanned, please wait." => "Estanse analizando os ficheiros, espere por favor.",
diff --git a/apps/files/l10n/he.php b/apps/files/l10n/he.php
index 0876eb952c7..65d093e3662 100644
--- a/apps/files/l10n/he.php
+++ b/apps/files/l10n/he.php
@@ -7,8 +7,19 @@
"Missing a temporary folder" => "תיקייה זמנית חסרה",
"Failed to write to disk" => "הכתיבה לכונן נכשלה",
"Files" => "קבצים",
+"Delete" => "מחיקה",
+"generating ZIP-file, it may take some time." => "יוצר קובץ ZIP, אנא המתן.",
+"Unable to upload your file as it is a directory or has 0 bytes" => "לא יכול להעלות את הקובץ מכיוון שזו תקיה או שמשקל הקובץ 0 בתים",
+"Upload Error" => "שגיאת העלאה",
+"Pending" => "ממתין",
+"Upload cancelled." => "ההעלאה בוטלה.",
+"Invalid name, '/' is not allowed." => "שם לא חוקי, '/' אסור לשימוש.",
"Size" => "גודל",
"Modified" => "זמן שינוי",
+"folder" => "תקיה",
+"folders" => "תקיות",
+"file" => "קובץ",
+"files" => "קבצים",
"File handling" => "טיפול בקבצים",
"Maximum upload size" => "גודל העלאה מקסימלי",
"max. possible: " => "המרבי האפשרי: ",
@@ -26,7 +37,6 @@
"Name" => "שם",
"Share" => "שיתוף",
"Download" => "הורדה",
-"Delete" => "מחיקה",
"Upload too large" => "העלאה גדולה מידי",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "הקבצים שניסית להעלות חרגו מהגודל המקסימלי להעלאת קבצים על שרת זה.",
"Files are being scanned, please wait." => "הקבצים נסרקים, נא להמתין.",
diff --git a/apps/files/l10n/hr.php b/apps/files/l10n/hr.php
index 3281d20a61d..7d5e61b3542 100644
--- a/apps/files/l10n/hr.php
+++ b/apps/files/l10n/hr.php
@@ -7,8 +7,19 @@
"Missing a temporary folder" => "Nedostaje privremena mapa",
"Failed to write to disk" => "Neuspjelo pisanje na disk",
"Files" => "Datoteke",
+"Delete" => "Briši",
+"generating ZIP-file, it may take some time." => "generiranje ZIP datoteke, ovo može potrajati.",
+"Unable to upload your file as it is a directory or has 0 bytes" => "Nemoguće poslati datoteku jer je prazna ili je direktorij",
+"Upload Error" => "Pogreška pri slanju",
+"Pending" => "U tijeku",
+"Upload cancelled." => "Slanje poništeno.",
+"Invalid name, '/' is not allowed." => "Neispravan naziv, znak '/' nije dozvoljen.",
"Size" => "Veličina",
"Modified" => "Zadnja promjena",
+"folder" => "mapa",
+"folders" => "mape",
+"file" => "datoteka",
+"files" => "datoteke",
"File handling" => "datoteka za rukovanje",
"Maximum upload size" => "Maksimalna veličina prijenosa",
"max. possible: " => "maksimalna moguća: ",
@@ -26,7 +37,6 @@
"Name" => "Naziv",
"Share" => "podjeli",
"Download" => "Preuzmi",
-"Delete" => "Briši",
"Upload too large" => "Prijenos je preobiman",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Datoteke koje pokušavate prenijeti prelaze maksimalnu veličinu za prijenos datoteka na ovom poslužitelju.",
"Files are being scanned, please wait." => "Datoteke se skeniraju, molimo pričekajte.",
diff --git a/apps/files/l10n/hu_HU.php b/apps/files/l10n/hu_HU.php
index 41255cb4096..22d39585167 100644
--- a/apps/files/l10n/hu_HU.php
+++ b/apps/files/l10n/hu_HU.php
@@ -7,8 +7,19 @@
"Missing a temporary folder" => "Hiányzik az ideiglenes könyvtár",
"Failed to write to disk" => "Nem írható lemezre",
"Files" => "Fájlok",
+"Delete" => "Törlés",
+"generating ZIP-file, it may take some time." => "ZIP-fájl generálása, ez eltarthat egy ideig.",
+"Unable to upload your file as it is a directory or has 0 bytes" => "Nem tölthető fel, mert mappa volt, vagy 0 byte méretű",
+"Upload Error" => "Feltöltési hiba",
+"Pending" => "Folyamatban",
+"Upload cancelled." => "Feltöltés megszakítva",
+"Invalid name, '/' is not allowed." => "Érvénytelen név, a '/' nem megengedett",
"Size" => "Méret",
"Modified" => "Módosítva",
+"folder" => "mappa",
+"folders" => "mappák",
+"file" => "fájl",
+"files" => "fájlok",
"File handling" => "Fájlkezelés",
"Maximum upload size" => "Maximális feltölthető fájlméret",
"max. possible: " => "max. lehetséges",
@@ -26,7 +37,6 @@
"Name" => "Név",
"Share" => "Megosztás",
"Download" => "Letöltés",
-"Delete" => "Törlés",
"Upload too large" => "Feltöltés túl nagy",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "A fájlokat amit próbálsz feltölteni meghaladta a legnagyobb fájlméretet ezen a szerveren.",
"Files are being scanned, please wait." => "File-ok vizsgálata, kis türelmet",
diff --git a/apps/files/l10n/ia.php b/apps/files/l10n/ia.php
index 645eba48a18..f9205cb5f64 100644
--- a/apps/files/l10n/ia.php
+++ b/apps/files/l10n/ia.php
@@ -2,6 +2,7 @@
"The uploaded file was only partially uploaded" => "Le file incargate solmente esseva incargate partialmente",
"No file was uploaded" => "Nulle file esseva incargate",
"Files" => "Files",
+"Delete" => "Deler",
"Size" => "Dimension",
"Modified" => "Modificate",
"Maximum upload size" => "Dimension maxime de incargamento",
@@ -12,6 +13,5 @@
"Nothing in here. Upload something!" => "Nihil hic. Incarga alcun cosa!",
"Name" => "Nomine",
"Download" => "Discargar",
-"Delete" => "Deler",
"Upload too large" => "Incargamento troppo longe"
);
diff --git a/apps/files/l10n/id.php b/apps/files/l10n/id.php
index 1f9dc3290aa..47ce6429c9f 100644
--- a/apps/files/l10n/id.php
+++ b/apps/files/l10n/id.php
@@ -5,6 +5,7 @@
"Missing a temporary folder" => "Kehilangan folder temporer",
"Failed to write to disk" => "Gagal menulis ke disk",
"Files" => "Berkas",
+"Delete" => "Hapus",
"Size" => "Ukuran",
"Modified" => "Dimodifikasi",
"File handling" => "Penanganan berkas",
@@ -24,7 +25,6 @@
"Name" => "Nama",
"Share" => "Bagikan",
"Download" => "Unduh",
-"Delete" => "Hapus",
"Upload too large" => "Unggahan terlalu besar",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Berkas yang anda coba unggah melebihi ukuran maksimum untuk pengunggahan berkas di server ini.",
"Files are being scanned, please wait." => "Berkas sedang dipindai, silahkan tunggu.",
diff --git a/apps/files/l10n/it.php b/apps/files/l10n/it.php
index 82871826c18..35ee7a5fdd1 100644
--- a/apps/files/l10n/it.php
+++ b/apps/files/l10n/it.php
@@ -7,8 +7,20 @@
"Missing a temporary folder" => "Cartella temporanea mancante",
"Failed to write to disk" => "Scrittura su disco non riuscita",
"Files" => "File",
+"Unshare" => "Rimuovi condivisione",
+"Delete" => "Elimina",
+"generating ZIP-file, it may take some time." => "creazione file ZIP, potrebbe richiedere del tempo.",
+"Unable to upload your file as it is a directory or has 0 bytes" => "Impossibile inviare il file poiché è una cartella o ha dimensione 0 byte",
+"Upload Error" => "Errore di invio",
+"Pending" => "In corso",
+"Upload cancelled." => "Invio annullato",
+"Invalid name, '/' is not allowed." => "Nome non valido",
"Size" => "Dimensione",
"Modified" => "Modificato",
+"folder" => "cartella",
+"folders" => "cartelle",
+"file" => "file",
+"files" => "file",
"File handling" => "Gestione file",
"Maximum upload size" => "Dimensione massima upload",
"max. possible: " => "numero mass.: ",
@@ -26,7 +38,6 @@
"Name" => "Nome",
"Share" => "Condividi",
"Download" => "Scarica",
-"Delete" => "Elimina",
"Upload too large" => "Il file caricato è troppo grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "I file che stai provando a caricare superano la dimensione massima consentita su questo server.",
"Files are being scanned, please wait." => "Scansione dei file in corso, attendi",
diff --git a/apps/files/l10n/ja_JP.php b/apps/files/l10n/ja_JP.php
index c04d0836dfb..231bbe3dcb5 100644
--- a/apps/files/l10n/ja_JP.php
+++ b/apps/files/l10n/ja_JP.php
@@ -7,8 +7,19 @@
"Missing a temporary folder" => "テンポラリフォルダが見つかりません",
"Failed to write to disk" => "ディスクへの書き込みに失敗しました",
"Files" => "ファイル",
+"Delete" => "削除",
+"generating ZIP-file, it may take some time." => "ZIPファイルを生成中です、しばらくお待ちください。",
+"Unable to upload your file as it is a directory or has 0 bytes" => "アップロード使用としているファイルがディレクトリ、もしくはサイズが0バイトのため、アップロードできません。",
+"Upload Error" => "アップロードエラー",
+"Pending" => "保留",
+"Upload cancelled." => "アップロードはキャンセルされました。",
+"Invalid name, '/' is not allowed." => "無効な名前、'/' は使用できません。",
"Size" => "サイズ",
"Modified" => "更新日時",
+"folder" => "フォルダ",
+"folders" => "フォルダ",
+"file" => "ファイル",
+"files" => "ファイル",
"File handling" => "ファイル操作",
"Maximum upload size" => "最大アップロードサイズ",
"max. possible: " => "最大容量: ",
@@ -26,7 +37,6 @@
"Name" => "名前",
"Share" => "共有",
"Download" => "ダウンロード",
-"Delete" => "削除",
"Upload too large" => "ファイルサイズが大きすぎます",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "アップロードしようとしているファイルは、サーバで規定された最大サイズを超えています。",
"Files are being scanned, please wait." => "ファイルをスキャンしています、しばらくお待ちください。",
diff --git a/apps/files/l10n/ko.php b/apps/files/l10n/ko.php
index 70575f0975d..218dd0ea2d7 100644
--- a/apps/files/l10n/ko.php
+++ b/apps/files/l10n/ko.php
@@ -7,8 +7,18 @@
"Missing a temporary folder" => "임시 폴더가 사라짐",
"Failed to write to disk" => "디스크에 쓰지 못했습니다",
"Files" => "파일",
+"Delete" => "삭제",
+"generating ZIP-file, it may take some time." => "ZIP파일 생성에 시간이 걸릴 수 있습니다.",
+"Upload Error" => "업로드 에러",
+"Pending" => "보류 중",
+"Upload cancelled." => "업로드 취소.",
+"Invalid name, '/' is not allowed." => "잘못된 이름, '/' 은 허용이 되지 않습니다.",
"Size" => "크기",
"Modified" => "수정됨",
+"folder" => "폴더",
+"folders" => "폴더",
+"file" => "파일",
+"files" => "파일",
"File handling" => "파일 처리",
"Maximum upload size" => "최대 업로드 크기",
"max. possible: " => "최대. 가능한:",
@@ -26,7 +36,6 @@
"Name" => "이름",
"Share" => "공유",
"Download" => "다운로드",
-"Delete" => "삭제",
"Upload too large" => "업로드 용량 초과",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "이 파일이 서버에서 허용하는 최대 업로드 가능 용량보다 큽니다.",
"Files are being scanned, please wait." => "파일을 검색중입니다, 기다려 주십시오.",
diff --git a/apps/files/l10n/lb.php b/apps/files/l10n/lb.php
index 548ef4895d4..f7a10fbc5cd 100644
--- a/apps/files/l10n/lb.php
+++ b/apps/files/l10n/lb.php
@@ -7,6 +7,7 @@
"Missing a temporary folder" => "Et feelt en temporären Dossier",
"Failed to write to disk" => "Konnt net op den Disk schreiwen",
"Files" => "Dateien",
+"Delete" => "Läschen",
"Size" => "Gréisst",
"Modified" => "Geännert",
"File handling" => "Fichier handling",
@@ -26,7 +27,6 @@
"Name" => "Numm",
"Share" => "Share",
"Download" => "Eroflueden",
-"Delete" => "Läschen",
"Upload too large" => "Upload ze grouss",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Déi Dateien déi Dir probéiert erop ze lueden sinn méi grouss wei déi Maximal Gréisst déi op dësem Server erlaabt ass.",
"Files are being scanned, please wait." => "Fichieren gi gescannt, war weg.",
diff --git a/apps/files/l10n/lt_LT.php b/apps/files/l10n/lt_LT.php
index e876e743a48..14c7a1a6ff6 100644
--- a/apps/files/l10n/lt_LT.php
+++ b/apps/files/l10n/lt_LT.php
@@ -7,9 +7,22 @@
"Missing a temporary folder" => "Nėra laikinojo katalogo",
"Failed to write to disk" => "Nepavyko įrašyti į diską",
"Files" => "Failai",
+"Delete" => "Ištrinti",
+"generating ZIP-file, it may take some time." => "kuriamas ZIP archyvas, tai gali užtrukti šiek tiek laiko.",
+"Unable to upload your file as it is a directory or has 0 bytes" => "Neįmanoma įkelti failo - jo dydis gali būti 0 bitų arba tai katalogas",
+"Upload Error" => "Įkėlimo klaida",
+"Upload cancelled." => "Įkėlimas atšauktas.",
+"Invalid name, '/' is not allowed." => "Pavadinime negali būti naudojamas ženklas \"/\".",
"Size" => "Dydis",
"Modified" => "Pakeista",
+"folder" => "katalogas",
+"folders" => "katalogai",
+"file" => "failas",
+"files" => "failai",
"Maximum upload size" => "Maksimalus failo dydis",
+"Enable ZIP-download" => "Įjungti atsisiuntimą ZIP archyvu",
+"0 is unlimited" => "0 yra neribotas",
+"Maximum input size for ZIP files" => "Maksimalus ZIP archyvo failo dydis",
"New" => "Naujas",
"Text file" => "Teksto failas",
"Folder" => "Katalogas",
@@ -20,7 +33,8 @@
"Name" => "Pavadinimas",
"Share" => "Dalintis",
"Download" => "Atsisiųsti",
-"Delete" => "Ištrinti",
"Upload too large" => "Įkėlimui failas per didelis",
-"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Bandomų įkelti failų dydis viršija maksimalų leidžiamą šiame serveryje"
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Bandomų įkelti failų dydis viršija maksimalų leidžiamą šiame serveryje",
+"Files are being scanned, please wait." => "Skenuojami failai, prašome palaukti.",
+"Current scanning" => "Šiuo metu skenuojama"
);
diff --git a/apps/files/l10n/lv.php b/apps/files/l10n/lv.php
new file mode 100644
index 00000000000..3fa3246d7ca
--- /dev/null
+++ b/apps/files/l10n/lv.php
@@ -0,0 +1,21 @@
+<?php $TRANSLATIONS = array(
+"Files" => "Faili",
+"Unshare" => "Pārtraukt līdzdalīšanu",
+"Delete" => "Izdzēst",
+"Upload Error" => "Augšuplādēšanas laikā radās kļūda",
+"Pending" => "Gaida savu kārtu",
+"Upload cancelled." => "Augšuplāde ir atcelta",
+"Invalid name, '/' is not allowed." => "Šis simbols '/', nav atļauts.",
+"Size" => "Izmērs",
+"Modified" => "Izmainīts",
+"folder" => "mape",
+"folders" => "mapes",
+"file" => "fails",
+"files" => "faili",
+"Maximum upload size" => "Maksimālais failu augšuplādes apjoms",
+"Upload" => "Augšuplādet",
+"Nothing in here. Upload something!" => "Te vēl nekas nav. Rīkojies, sāc augšuplādēt",
+"Name" => "Nosaukums",
+"Download" => "Lejuplādēt",
+"Upload too large" => "Fails ir par lielu lai to augšuplādetu"
+);
diff --git a/apps/files/l10n/mk.php b/apps/files/l10n/mk.php
index d3efa4d0225..4e1eccff255 100644
--- a/apps/files/l10n/mk.php
+++ b/apps/files/l10n/mk.php
@@ -7,8 +7,19 @@
"Missing a temporary folder" => "Не постои привремена папка",
"Failed to write to disk" => "Неуспеав да запишам на диск",
"Files" => "Датотеки",
+"Delete" => "Избриши",
+"generating ZIP-file, it may take some time." => "Се генерира ZIP фајлот, ќе треба извесно време.",
+"Unable to upload your file as it is a directory or has 0 bytes" => "Не може да се преземе вашата датотека бидејќи фолдерот во кој се наоѓа фајлот има големина од 0 бајти",
+"Upload Error" => "Грешка при преземање",
+"Pending" => "Чека",
+"Upload cancelled." => "Преземањето е прекинато.",
+"Invalid name, '/' is not allowed." => "неисправно име, '/' не е дозволено.",
"Size" => "Големина",
"Modified" => "Променето",
+"folder" => "фолдер",
+"folders" => "фолдери",
+"file" => "датотека",
+"files" => "датотеки",
"File handling" => "Ракување со датотеки",
"Maximum upload size" => "Максимална големина за подигање",
"max. possible: " => "макс. можно:",
@@ -26,7 +37,6 @@
"Name" => "Име",
"Share" => "Сподели",
"Download" => "Преземи",
-"Delete" => "Избриши",
"Upload too large" => "Датотеката е премногу голема",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер.",
"Files are being scanned, please wait." => "Се скенираат датотеки, ве молам почекајте.",
diff --git a/apps/files/l10n/ms_MY.php b/apps/files/l10n/ms_MY.php
index 1a1d72a01b6..f0870c79ed7 100644
--- a/apps/files/l10n/ms_MY.php
+++ b/apps/files/l10n/ms_MY.php
@@ -5,18 +5,40 @@
"The uploaded file was only partially uploaded" => "Sebahagian daripada fail telah dimuat naik. ",
"No file was uploaded" => "Tiada fail yang dimuat naik",
"Missing a temporary folder" => "Folder sementara hilang",
+"Failed to write to disk" => "Gagal untuk disimpan",
"Files" => "fail",
+"Delete" => "Padam",
+"generating ZIP-file, it may take some time." => "sedang menghasilkan fail ZIP, mungkin mengambil sedikit masa.",
+"Unable to upload your file as it is a directory or has 0 bytes" => "Tidak boleh memuatnaik fail anda kerana mungkin ianya direktori atau saiz fail 0 bytes",
+"Upload Error" => "Muat naik ralat",
+"Pending" => "Dalam proses",
+"Upload cancelled." => "Muatnaik dibatalkan.",
+"Invalid name, '/' is not allowed." => "penggunaa nama tidak sah, '/' tidak dibenarkan.",
"Size" => "Saiz",
"Modified" => "Dimodifikasi",
+"folder" => "direktori",
+"folders" => "direktori",
+"file" => "fail",
+"files" => "fail",
+"File handling" => "Pengendalian fail",
"Maximum upload size" => "Saiz maksimum muat naik",
+"max. possible: " => "maksimum:",
+"Needed for multi-file and folder downloads." => "Diperlukan untuk muatturun fail pelbagai ",
+"Enable ZIP-download" => "Aktifkan muatturun ZIP",
+"0 is unlimited" => "0 adalah tanpa had",
+"Maximum input size for ZIP files" => "Saiz maksimum input untuk fail ZIP",
"New" => "Baru",
"Text file" => "Fail teks",
"Folder" => "Folder",
+"From url" => "Dari url",
"Upload" => "Muat naik",
+"Cancel upload" => "Batal muat naik",
"Nothing in here. Upload something!" => "Tiada apa-apa di sini. Muat naik sesuatu!",
"Name" => "Nama ",
+"Share" => "Kongsi",
"Download" => "Muat turun",
-"Delete" => "Padam",
"Upload too large" => "Muat naik terlalu besar",
-"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Fail yang cuba dimuat naik melebihi saiz maksimum fail upload server"
+"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Fail yang cuba dimuat naik melebihi saiz maksimum fail upload server",
+"Files are being scanned, please wait." => "Fail sedang diimbas, harap bersabar.",
+"Current scanning" => "Imbasan semasa"
);
diff --git a/apps/files/l10n/nb_NO.php b/apps/files/l10n/nb_NO.php
index 0f4cc33ae38..f02de12615a 100644
--- a/apps/files/l10n/nb_NO.php
+++ b/apps/files/l10n/nb_NO.php
@@ -7,8 +7,15 @@
"Missing a temporary folder" => "Mangler en midlertidig mappe",
"Failed to write to disk" => "Klarte ikke å skrive til disk",
"Files" => "Filer",
+"Delete" => "Slett",
+"generating ZIP-file, it may take some time." => "opprettet ZIP-fil, dette kan ta litt tid",
+"Pending" => "Ventende",
"Size" => "Størrelse",
"Modified" => "Endret",
+"folder" => "mappe",
+"folders" => "mapper",
+"file" => "fil",
+"files" => "filer",
"File handling" => "Filhåndtering",
"Maximum upload size" => "Maksimum opplastingsstørrelse",
"max. possible: " => "max. mulige:",
@@ -26,7 +33,6 @@
"Name" => "Navn",
"Share" => "Del",
"Download" => "Last ned",
-"Delete" => "Slett",
"Upload too large" => "Opplasting for stor",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filene du prøver å laste opp er for store for å laste opp til denne serveren.",
"Files are being scanned, please wait." => "Skanner etter filer, vennligst vent.",
diff --git a/apps/files/l10n/nl.php b/apps/files/l10n/nl.php
index 119f6034f15..b093dc3ce12 100644
--- a/apps/files/l10n/nl.php
+++ b/apps/files/l10n/nl.php
@@ -7,8 +7,19 @@
"Missing a temporary folder" => "Een tijdelijke map mist",
"Failed to write to disk" => "Schrijven naar schijf mislukt",
"Files" => "Bestanden",
+"Delete" => "Verwijder",
+"generating ZIP-file, it may take some time." => "aanmaken ZIP-file, dit kan enige tijd duren.",
+"Unable to upload your file as it is a directory or has 0 bytes" => "uploaden van de file mislukt, het is of een directory of de bestandsgrootte is 0 bytes",
+"Upload Error" => "Upload Fout",
+"Pending" => "Wachten",
+"Upload cancelled." => "Uploaden geannuleerd.",
+"Invalid name, '/' is not allowed." => "Ongeldige naam, '/' is niet toegestaan.",
"Size" => "Bestandsgrootte",
"Modified" => "Laatst aangepast",
+"folder" => "map",
+"folders" => "mappen",
+"file" => "bestand",
+"files" => "bestanden",
"File handling" => "Bestand",
"Maximum upload size" => "Maximale bestandsgrootte voor uploads",
"max. possible: " => "max. mogelijk: ",
@@ -26,7 +37,6 @@
"Name" => "Naam",
"Share" => "Delen",
"Download" => "Download",
-"Delete" => "Verwijder",
"Upload too large" => "Bestanden te groot",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "De bestanden die u probeert te uploaden zijn groter dan de maximaal toegestane bestandsgrootte voor deze server.",
"Files are being scanned, please wait." => "Bestanden worden gescand, even wachten.",
diff --git a/apps/files/l10n/nn_NO.php b/apps/files/l10n/nn_NO.php
index 002e85de5cc..d6af7302494 100644
--- a/apps/files/l10n/nn_NO.php
+++ b/apps/files/l10n/nn_NO.php
@@ -6,6 +6,7 @@
"No file was uploaded" => "Ingen filer vart lasta opp",
"Missing a temporary folder" => "Manglar ei mellombels mappe",
"Files" => "Filer",
+"Delete" => "Slett",
"Size" => "Storleik",
"Modified" => "Endra",
"Maximum upload size" => "Maksimal opplastingsstorleik",
@@ -16,7 +17,6 @@
"Nothing in here. Upload something!" => "Ingenting her. Last noko opp!",
"Name" => "Namn",
"Download" => "Last ned",
-"Delete" => "Slett",
"Upload too large" => "For stor opplasting",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filene du prøver å laste opp er større enn maksgrensa til denne tenaren."
);
diff --git a/apps/files/l10n/pl.php b/apps/files/l10n/pl.php
index bfdd04659dd..67a29b46613 100644
--- a/apps/files/l10n/pl.php
+++ b/apps/files/l10n/pl.php
@@ -7,8 +7,19 @@
"Missing a temporary folder" => "Brak katalogu tymczasowego",
"Failed to write to disk" => "Błąd zapisu na dysk",
"Files" => "Pliki",
+"Delete" => "Usuwa element",
+"generating ZIP-file, it may take some time." => "Generowanie pliku ZIP, może potrwać pewien czas.",
+"Unable to upload your file as it is a directory or has 0 bytes" => "Nie można wczytać pliku jeśli jest katalogiem lub ma 0 bajtów",
+"Upload Error" => "Błąd wczytywania",
+"Pending" => "Oczekujące",
+"Upload cancelled." => "Wczytywanie anulowane.",
+"Invalid name, '/' is not allowed." => "Nieprawidłowa nazwa '/' jest niedozwolone.",
"Size" => "Rozmiar",
"Modified" => "Czas modyfikacji",
+"folder" => "folder",
+"folders" => "foldery",
+"file" => "plik",
+"files" => "pliki",
"File handling" => "Zarządzanie plikami",
"Maximum upload size" => "Maksymalny rozmiar wysyłanego pliku",
"max. possible: " => "max. możliwych",
@@ -26,7 +37,6 @@
"Name" => "Nazwa",
"Share" => "Współdziel",
"Download" => "Pobiera element",
-"Delete" => "Usuwa element",
"Upload too large" => "Wysyłany plik ma za duży rozmiar",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Pliki które próbujesz przesłać, przekraczają maksymalną, dopuszczalną wielkość.",
"Files are being scanned, please wait." => "Skanowanie plików, proszę czekać.",
diff --git a/apps/files/l10n/pt_BR.php b/apps/files/l10n/pt_BR.php
index b70406f5171..b783c37cb03 100644
--- a/apps/files/l10n/pt_BR.php
+++ b/apps/files/l10n/pt_BR.php
@@ -7,8 +7,19 @@
"Missing a temporary folder" => "Pasta temporária não encontrada",
"Failed to write to disk" => "Falha ao escrever no disco",
"Files" => "Arquivos",
+"Delete" => "Excluir",
+"generating ZIP-file, it may take some time." => "gerando arquivo ZIP, isso pode levar um tempo.",
+"Unable to upload your file as it is a directory or has 0 bytes" => "Impossível enviar seus arquivo como diretório ou ele tem 0 bytes.",
+"Upload Error" => "Erro de envio",
+"Pending" => "Pendente",
+"Upload cancelled." => "Envio cancelado.",
+"Invalid name, '/' is not allowed." => "Nome inválido, '/' não é permitido.",
"Size" => "Tamanho",
"Modified" => "Modificado",
+"folder" => "pasta",
+"folders" => "pastas",
+"file" => "arquivo",
+"files" => "arquivos",
"File handling" => "Tratamento de Arquivo",
"Maximum upload size" => "Tamanho máximo para carregar",
"max. possible: " => "max. possível:",
@@ -26,7 +37,6 @@
"Name" => "Nome",
"Share" => "Compartilhar",
"Download" => "Baixar",
-"Delete" => "Excluir",
"Upload too large" => "Arquivo muito grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Os arquivos que você está tentando carregar excedeu o tamanho máximo para arquivos no servidor.",
"Files are being scanned, please wait." => "Arquivos sendo escaneados, por favor aguarde.",
diff --git a/apps/files/l10n/pt_PT.php b/apps/files/l10n/pt_PT.php
index ac224302825..6e5ffce797e 100644
--- a/apps/files/l10n/pt_PT.php
+++ b/apps/files/l10n/pt_PT.php
@@ -7,8 +7,19 @@
"Missing a temporary folder" => "Falta uma pasta temporária",
"Failed to write to disk" => "Falhou a escrita no disco",
"Files" => "Ficheiros",
+"Delete" => "Apagar",
+"generating ZIP-file, it may take some time." => "a gerar o ficheiro ZIP, poderá demorar algum tempo.",
+"Unable to upload your file as it is a directory or has 0 bytes" => "Não é possivel fazer o upload do ficheiro devido a ser uma pasta ou ter 0 bytes",
+"Upload Error" => "Erro no upload",
+"Pending" => "Pendente",
+"Upload cancelled." => "O upload foi cancelado.",
+"Invalid name, '/' is not allowed." => "nome inválido, '/' não permitido.",
"Size" => "Tamanho",
"Modified" => "Modificado",
+"folder" => "pasta",
+"folders" => "pastas",
+"file" => "ficheiro",
+"files" => "ficheiros",
"File handling" => "Manuseamento de ficheiros",
"Maximum upload size" => "Tamanho máximo de envio",
"max. possible: " => "max. possivel: ",
@@ -26,7 +37,6 @@
"Name" => "Nome",
"Share" => "Partilhar",
"Download" => "Transferir",
-"Delete" => "Apagar",
"Upload too large" => "Envio muito grande",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Os ficheiro que estás a tentar enviar excedem o tamanho máximo de envio neste servidor.",
"Files are being scanned, please wait." => "Os ficheiros estão a ser analisados, por favor aguarde.",
diff --git a/apps/files/l10n/ro.php b/apps/files/l10n/ro.php
index e6f0294fd3f..58a6d2454f5 100644
--- a/apps/files/l10n/ro.php
+++ b/apps/files/l10n/ro.php
@@ -7,6 +7,7 @@
"Missing a temporary folder" => "Lipsește un dosar temporar",
"Failed to write to disk" => "Eroare la scriere pe disc",
"Files" => "Fișiere",
+"Delete" => "Șterge",
"Size" => "Dimensiune",
"Modified" => "Modificat",
"File handling" => "Manipulare fișiere",
@@ -26,7 +27,6 @@
"Name" => "Nume",
"Share" => "Partajează",
"Download" => "Descarcă",
-"Delete" => "Șterge",
"Upload too large" => "Fișierul încărcat este prea mare",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Fișierul care l-ai încărcat a depășită limita maximă admisă la încărcare pe acest server.",
"Files are being scanned, please wait." => "Fișierele sunt scanate, te rog așteptă.",
diff --git a/apps/files/l10n/ru.php b/apps/files/l10n/ru.php
index 45648012a14..99bb6df8f87 100644
--- a/apps/files/l10n/ru.php
+++ b/apps/files/l10n/ru.php
@@ -7,8 +7,19 @@
"Missing a temporary folder" => "Невозможно найти временную папку",
"Failed to write to disk" => "Ошибка записи на диск",
"Files" => "Файлы",
+"Delete" => "Удалить",
+"generating ZIP-file, it may take some time." => "создание ZIP-файла, это может занять некоторое время.",
+"Unable to upload your file as it is a directory or has 0 bytes" => "Не удается загрузить файл размером 0 байт в каталог",
+"Upload Error" => "Ошибка загрузки",
+"Pending" => "Ожидание",
+"Upload cancelled." => "Загрузка отменена.",
+"Invalid name, '/' is not allowed." => "Неверное имя, '/' не допускается.",
"Size" => "Размер",
"Modified" => "Изменен",
+"folder" => "папка",
+"folders" => "папки",
+"file" => "файл",
+"files" => "файлы",
"File handling" => "Управление файлами",
"Maximum upload size" => "Максимальный размер файла",
"max. possible: " => "макс. возможно: ",
@@ -26,7 +37,6 @@
"Name" => "Название",
"Share" => "Поделиться",
"Download" => "Скачать",
-"Delete" => "Удалить",
"Upload too large" => "Файл слишком большой",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Файлы, которые Вы пытаетесь закачать, превышают лимит для файлов на этом сервере.",
"Files are being scanned, please wait." => "Подождите, файлы сканируются.",
diff --git a/apps/files/l10n/sk_SK.php b/apps/files/l10n/sk_SK.php
index 2a7e84af6c4..8a31c550320 100644
--- a/apps/files/l10n/sk_SK.php
+++ b/apps/files/l10n/sk_SK.php
@@ -7,8 +7,19 @@
"Missing a temporary folder" => "Chýbajúci dočasný priečinok",
"Failed to write to disk" => "Zápis na disk sa nepodaril",
"Files" => "Súbory",
+"Delete" => "Odstrániť",
+"generating ZIP-file, it may take some time." => "generujem ZIP-súbor, môže to chvíľu trvať.",
+"Unable to upload your file as it is a directory or has 0 bytes" => "Nemôžem nahrať súbor lebo je to priečinok alebo má 0 bajtov.",
+"Upload Error" => "Chyba nahrávania",
+"Pending" => "Čaká sa",
+"Upload cancelled." => "Nahrávanie zrušené",
+"Invalid name, '/' is not allowed." => "Chybný názov, \"/\" nie je povolené",
"Size" => "Veľkosť",
"Modified" => "Upravené",
+"folder" => "priečinok",
+"folders" => "priečinky",
+"file" => "súbor",
+"files" => "súbory",
"File handling" => "Nastavenie správanie k súborom",
"Maximum upload size" => "Maximálna veľkosť nahratia",
"max. possible: " => "najväčšie možné:",
@@ -26,7 +37,6 @@
"Name" => "Meno",
"Share" => "Zdielať",
"Download" => "Stiahnuť",
-"Delete" => "Odstrániť",
"Upload too large" => "Nahrávanie príliš veľké",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Súbory ktoré sa snažíte nahrať presahujú maximálnu veľkosť pre nahratie súborov na tento server.",
"Files are being scanned, please wait." => "Súbory sa práve prehľadávajú, prosím čakajte.",
diff --git a/apps/files/l10n/sl.php b/apps/files/l10n/sl.php
index b0ea2dc373c..a4f3b578885 100644
--- a/apps/files/l10n/sl.php
+++ b/apps/files/l10n/sl.php
@@ -7,8 +7,20 @@
"Missing a temporary folder" => "Manjka začasna mapa",
"Failed to write to disk" => "Pisanje na disk je spodletelo",
"Files" => "Datoteke",
+"Unshare" => "Vzemi iz souporabe",
+"Delete" => "Izbriši",
+"generating ZIP-file, it may take some time." => "Ustvarjam ZIP datoteko. To lahko traja nekaj časa.",
+"Unable to upload your file as it is a directory or has 0 bytes" => "Nalaganje ni mogoče, saj gre za mapo, ali pa ima datoteka velikost 0 bajtov.",
+"Upload Error" => "Napaka pri nalaganju",
+"Pending" => "Na čakanju",
+"Upload cancelled." => "Nalaganje je bilo preklicano.",
+"Invalid name, '/' is not allowed." => "Neveljavno ime. Znak '/' ni dovoljen.",
"Size" => "Velikost",
"Modified" => "Spremenjeno",
+"folder" => "mapa",
+"folders" => "mape",
+"file" => "datoteka",
+"files" => "datoteke",
"File handling" => "Rokovanje z datotekami",
"Maximum upload size" => "Največja velikost za nalaganje",
"max. possible: " => "največ mogoče:",
@@ -26,7 +38,6 @@
"Name" => "Ime",
"Share" => "Souporaba",
"Download" => "Prejmi",
-"Delete" => "Izbriši",
"Upload too large" => "Nalaganje ni mogoče, ker je preveliko",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Datoteke, ki jih želite naložiti, presegajo največjo dovoljeno velikost na tem strežniku.",
"Files are being scanned, please wait." => "Preiskujem datoteke, prosimo počakajte.",
diff --git a/apps/files/l10n/sr.php b/apps/files/l10n/sr.php
index 68c50d5282a..84164e25c62 100644
--- a/apps/files/l10n/sr.php
+++ b/apps/files/l10n/sr.php
@@ -6,6 +6,7 @@
"No file was uploaded" => "Ниједан фајл није послат",
"Missing a temporary folder" => "Недостаје привремена фасцикла",
"Files" => "Фајлови",
+"Delete" => "Обриши",
"Size" => "Величина",
"Modified" => "Задња измена",
"Maximum upload size" => "Максимална величина пошиљке",
@@ -16,7 +17,6 @@
"Nothing in here. Upload something!" => "Овде нема ничег. Пошаљите нешто!",
"Name" => "Име",
"Download" => "Преузми",
-"Delete" => "Обриши",
"Upload too large" => "Пошиљка је превелика",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Фајлови које желите да пошаљете превазилазе ограничење максималне величине пошиљке на овом серверу."
);
diff --git a/apps/files/l10n/sr@latin.php b/apps/files/l10n/sr@latin.php
index 63843fc8b55..96c567aec41 100644
--- a/apps/files/l10n/sr@latin.php
+++ b/apps/files/l10n/sr@latin.php
@@ -6,6 +6,7 @@
"No file was uploaded" => "Nijedan fajl nije poslat",
"Missing a temporary folder" => "Nedostaje privremena fascikla",
"Files" => "Fajlovi",
+"Delete" => "Obriši",
"Size" => "Veličina",
"Modified" => "Zadnja izmena",
"Maximum upload size" => "Maksimalna veličina pošiljke",
@@ -13,7 +14,6 @@
"Nothing in here. Upload something!" => "Ovde nema ničeg. Pošaljite nešto!",
"Name" => "Ime",
"Download" => "Preuzmi",
-"Delete" => "Obriši",
"Upload too large" => "Pošiljka je prevelika",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Fajlovi koje želite da pošaljete prevazilaze ograničenje maksimalne veličine pošiljke na ovom serveru."
);
diff --git a/apps/files/l10n/sv.php b/apps/files/l10n/sv.php
index f508f22f3cf..f3d936ff845 100644
--- a/apps/files/l10n/sv.php
+++ b/apps/files/l10n/sv.php
@@ -7,8 +7,20 @@
"Missing a temporary folder" => "Saknar en tillfällig mapp",
"Failed to write to disk" => "Misslyckades spara till disk",
"Files" => "Filer",
+"Unshare" => "Sluta dela",
+"Delete" => "Ta bort",
+"generating ZIP-file, it may take some time." => "Gererar ZIP-fil. Det kan ta lite tid.",
+"Unable to upload your file as it is a directory or has 0 bytes" => "Kunde inte ladda upp dina filer eftersom det antingen är en mapp eller har 0 bytes.",
+"Upload Error" => "Uppladdningsfel",
+"Pending" => "Väntar",
+"Upload cancelled." => "Uppladdning avbruten.",
+"Invalid name, '/' is not allowed." => "Ogiltigt namn, '/' är inte tillåten.",
"Size" => "Storlek",
"Modified" => "Ändrad",
+"folder" => "mapp",
+"folders" => "mappar",
+"file" => "fil",
+"files" => "filer",
"File handling" => "Filhantering",
"Maximum upload size" => "Maximal storlek att ladda upp",
"max. possible: " => "max. möjligt:",
@@ -26,7 +38,6 @@
"Name" => "Namn",
"Share" => "Dela",
"Download" => "Ladda ned",
-"Delete" => "Ta bort",
"Upload too large" => "För stor uppladdning",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Filerna du försöker ladda upp överstiger den maximala storleken för filöverföringar på servern.",
"Files are being scanned, please wait." => "Filerna skannas, var god vänta",
diff --git a/apps/files/l10n/th_TH.php b/apps/files/l10n/th_TH.php
index ec538262e02..4299c31a45a 100644
--- a/apps/files/l10n/th_TH.php
+++ b/apps/files/l10n/th_TH.php
@@ -7,8 +7,19 @@
"Missing a temporary folder" => "แฟ้มเอกสารชั่วคราวเกิดการสูญหาย",
"Failed to write to disk" => "เขียนข้อมูลลงแผ่นดิสก์ล้มเหลว",
"Files" => "ไฟล์",
+"Delete" => "ลบ",
+"generating ZIP-file, it may take some time." => "กำลังสร้างไฟล์บีบอัด ZIP อาจใช้เวลาสักครู่",
+"Unable to upload your file as it is a directory or has 0 bytes" => "ไม่สามารถอัพโหลดไฟล์ของคุณได้ เนื่องจากไฟล์ดังกล่าวเป็นไดเร็กทอรี่หรือมีขนาด 0 ไบต์",
+"Upload Error" => "เกิดข้อผิดพลาดในการอัพโหลด",
+"Pending" => "อยู่ระหว่างดำเนินการ",
+"Upload cancelled." => "การอัพโหลดถูกยกเลิก",
+"Invalid name, '/' is not allowed." => "ชื่อที่ใช้ไม่ถูกต้อง '/' ไม่อนุญาตให้ใช้งาน",
"Size" => "ขนาด",
"Modified" => "ปรับปรุงล่าสุด",
+"folder" => "โฟลเดอร์",
+"folders" => "โฟลเดอร์",
+"file" => "ไฟล์",
+"files" => "ไฟล์",
"File handling" => "การจัดกาไฟล์",
"Maximum upload size" => "ขนาดไฟล์สูงสุดที่อัพโหลดได้",
"max. possible: " => "จำนวนสูงสุดที่สามารถทำได้: ",
@@ -26,7 +37,6 @@
"Name" => "ชื่อ",
"Share" => "แชร์",
"Download" => "ดาวน์โหลด",
-"Delete" => "ลบ",
"Upload too large" => "ไฟล์ที่อัพโหลดมีขนาดใหญ่เกินไป",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "ไฟล์ที่คุณพยายามที่จะอัพโหลดมีขนาดเกินกว่าขนาดสูงสุดที่กำหนดไว้ให้อัพโหลดได้สำหรับเซิร์ฟเวอร์นี้",
"Files are being scanned, please wait." => "ไฟล์กำลังอยู่ระหว่างการสแกน, กรุณารอสักครู่.",
diff --git a/apps/files/l10n/tr.php b/apps/files/l10n/tr.php
index b8de8249a1d..0ecbcadb486 100644
--- a/apps/files/l10n/tr.php
+++ b/apps/files/l10n/tr.php
@@ -7,8 +7,19 @@
"Missing a temporary folder" => "Geçici bir klasör eksik",
"Failed to write to disk" => "Diske yazılamadı",
"Files" => "Dosyalar",
+"Delete" => "Sil",
+"generating ZIP-file, it may take some time." => "ZIP dosyası oluşturuluyor, biraz sürebilir.",
+"Unable to upload your file as it is a directory or has 0 bytes" => "Dosyanızın boyutu 0 byte olduğundan veya bir dizin olduğundan yüklenemedi",
+"Upload Error" => "Yükleme hatası",
+"Pending" => "Bekliyor",
+"Upload cancelled." => "Yükleme iptal edildi.",
+"Invalid name, '/' is not allowed." => "Geçersiz isim, '/' işaretine izin verilmiyor.",
"Size" => "Boyut",
"Modified" => "Değiştirilme",
+"folder" => "dizin",
+"folders" => "dizinler",
+"file" => "dosya",
+"files" => "dosyalar",
"File handling" => "Dosya taşıma",
"Maximum upload size" => "Maksimum yükleme boyutu",
"max. possible: " => "mümkün olan en fazla: ",
@@ -26,7 +37,6 @@
"Name" => "Ad",
"Share" => "Paylaş",
"Download" => "İndir",
-"Delete" => "Sil",
"Upload too large" => "Yüklemeniz çok büyük",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Yüklemeye çalıştığınız dosyalar bu sunucudaki maksimum yükleme boyutunu aşıyor.",
"Files are being scanned, please wait." => "Dosyalar taranıyor, lütfen bekleyin.",
diff --git a/apps/files/l10n/uk.php b/apps/files/l10n/uk.php
index 8b21cb26a3c..743bc57feeb 100644
--- a/apps/files/l10n/uk.php
+++ b/apps/files/l10n/uk.php
@@ -6,6 +6,7 @@
"No file was uploaded" => "Не відвантажено жодного файлу",
"Missing a temporary folder" => "Відсутній тимчасовий каталог",
"Files" => "Файли",
+"Delete" => "Видалити",
"Size" => "Розмір",
"Modified" => "Змінено",
"Maximum upload size" => "Максимальний розмір відвантажень",
@@ -16,7 +17,6 @@
"Nothing in here. Upload something!" => "Тут нічого немає. Відвантажте що-небудь!",
"Name" => "Ім'я",
"Download" => "Завантажити",
-"Delete" => "Видалити",
"Upload too large" => "Файл занадто великий",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "Файли,що ви намагаєтесь відвантажити перевищують максимальний дозволений розмір файлів на цьому сервері."
);
diff --git a/apps/files/l10n/vi.php b/apps/files/l10n/vi.php
new file mode 100644
index 00000000000..c2284d5feb9
--- /dev/null
+++ b/apps/files/l10n/vi.php
@@ -0,0 +1,31 @@
+<?php $TRANSLATIONS = array(
+"Files" => "Tập tin",
+"Delete" => "Xóa",
+"Upload Error" => "Tải lên lỗi",
+"Pending" => "Chờ",
+"Upload cancelled." => "Hủy tải lên",
+"Invalid name, '/' is not allowed." => "Tên không hợp lệ ,không được phép dùng '/'",
+"Size" => "Kích cỡ",
+"Modified" => "Thay đổi",
+"folder" => "folder",
+"folders" => "folders",
+"file" => "file",
+"files" => "files",
+"File handling" => "Xử lý tập tin",
+"Maximum upload size" => "Kích thước tối đa ",
+"Enable ZIP-download" => "Cho phép ZIP-download",
+"0 is unlimited" => "0 là không giới hạn",
+"Maximum input size for ZIP files" => "Kích thước tối đa cho các tập tin ZIP",
+"New" => "Mới",
+"Text file" => "Tập tin văn bản",
+"Folder" => "Folder",
+"From url" => "Từ url",
+"Upload" => "Tải lên",
+"Cancel upload" => "Hủy upload",
+"Nothing in here. Upload something!" => "Không có gì ở đây .Hãy tải lên một cái gì đó !",
+"Name" => "Tên",
+"Share" => "Chia sẻ",
+"Download" => "Tải xuống",
+"Upload too large" => "File tải lên quá lớn",
+"Files are being scanned, please wait." => "Tập tin đang được quét ,vui lòng chờ."
+);
diff --git a/apps/files/l10n/zh_CN.php b/apps/files/l10n/zh_CN.php
index c2e6541f2a2..80693ba1d46 100644
--- a/apps/files/l10n/zh_CN.php
+++ b/apps/files/l10n/zh_CN.php
@@ -7,8 +7,19 @@
"Missing a temporary folder" => "缺少临时目录",
"Failed to write to disk" => "写入磁盘失败",
"Files" => "文件",
+"Delete" => "删除",
+"generating ZIP-file, it may take some time." => "正在生成 ZIP 文件,可能需要一些时间",
+"Unable to upload your file as it is a directory or has 0 bytes" => "无法上传文件,因为它是一个目录或者大小为 0 字节",
+"Upload Error" => "上传错误",
+"Pending" => "操作等待中",
+"Upload cancelled." => "上传已取消",
+"Invalid name, '/' is not allowed." => "非法的名称,不允许使用‘/’。",
"Size" => "大小",
"Modified" => "修改日期",
+"folder" => "文件夹",
+"folders" => "文件夹",
+"file" => "文件",
+"files" => "文件",
"File handling" => "文件处理",
"Maximum upload size" => "最大上传大小",
"max. possible: " => "最大可能: ",
@@ -26,7 +37,6 @@
"Name" => "名称",
"Share" => "共享",
"Download" => "下载",
-"Delete" => "删除",
"Upload too large" => "上传文件过大",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "您正尝试上传的文件超过了此服务器可以上传的最大大小",
"Files are being scanned, please wait." => "文件正在被扫描,请稍候。",
diff --git a/apps/files/l10n/zh_TW.php b/apps/files/l10n/zh_TW.php
index 91a1344ca37..bc8aa4ff892 100644
--- a/apps/files/l10n/zh_TW.php
+++ b/apps/files/l10n/zh_TW.php
@@ -7,6 +7,7 @@
"Missing a temporary folder" => "遺失暫存資料夾",
"Failed to write to disk" => "寫入硬碟失敗",
"Files" => "檔案",
+"Delete" => "刪除",
"Size" => "大小",
"Modified" => "修改",
"File handling" => "檔案處理",
@@ -26,7 +27,6 @@
"Name" => "名稱",
"Share" => "分享",
"Download" => "下載",
-"Delete" => "刪除",
"Upload too large" => "上傳過大",
"The files you are trying to upload exceed the maximum size for file uploads on this server." => "你試圖上傳的檔案已超過伺服器的最大容量限制。 ",
"Files are being scanned, please wait." => "正在掃描檔案,請稍等。",
diff --git a/apps/files_external/lib/ftp.php b/apps/files_external/lib/ftp.php
index 4d5ae670de5..63f14a28777 100644
--- a/apps/files_external/lib/ftp.php
+++ b/apps/files_external/lib/ftp.php
@@ -24,9 +24,10 @@ class OC_FileStorage_FTP extends OC_FileStorage_StreamWrapper{
if(!$this->root || $this->root[0]!='/'){
$this->root='/'.$this->root;
}
-
//create the root folder if necesary
- mkdir($this->constructUrl(''));
+ if (!$this->is_dir('')) {
+ $this->mkdir('');
+ }
}
/**
diff --git a/apps/files_imageviewer/js/jquery.fancybox-1.3.4.js b/apps/files_imageviewer/js/jquery.fancybox-1.3.4.js
index a1db7b6198c..e5493cd9393 100644
--- a/apps/files_imageviewer/js/jquery.fancybox-1.3.4.js
+++ b/apps/files_imageviewer/js/jquery.fancybox-1.3.4.js
@@ -124,9 +124,7 @@
} else if (href.indexOf("#") === 0) {
type = 'inline';
- } else {
- type = 'ajax';
- }
+ }
}
if (!type) {
diff --git a/apps/files_imageviewer/js/jquery.fancybox-1.3.4.pack.js b/apps/files_imageviewer/js/jquery.fancybox-1.3.4.pack.js
index e5ee2ae3595..260f2c2d466 100644
--- a/apps/files_imageviewer/js/jquery.fancybox-1.3.4.pack.js
+++ b/apps/files_imageviewer/js/jquery.fancybox-1.3.4.pack.js
@@ -1 +1 @@
-(function(B){var L,T,Q,M,d,m,J,A,O,z,C=0,H={},j=[],e=0,G={},y=[],f=null,o=new Image(),i=/\.(jpg|gif|png|bmp|jpeg)(.*)?$/i,k=/[^\.]\.(swf)\s*$/i,p,N=1,h=0,t="",b,c,P=false,s=B.extend(B("<div/>")[0],{prop:0}),S=B.browser.msie&&B.browser.version<7&&!window.XMLHttpRequest,r=function(){T.hide();o.onerror=o.onload=null;if(f){f.abort()}L.empty()},x=function(){if(false===H.onError(j,C,H)){T.hide();P=false;return}H.titleShow=false;H.width="auto";H.height="auto";L.html('<p id="fancybox-error">The requested content cannot be loaded.<br />Please try again later.</p>');n()},w=function(){var Z=j[C],W,Y,ab,aa,V,X;r();H=B.extend({},B.fn.fancybox.defaults,(typeof B(Z).data("fancybox")=="undefined"?H:B(Z).data("fancybox")));X=H.onStart(j,C,H);if(X===false){P=false;return}else{if(typeof X=="object"){H=B.extend(H,X)}}ab=H.title||(Z.nodeName?B(Z).attr("title"):Z.title)||"";if(Z.nodeName&&!H.orig){H.orig=B(Z).children("img:first").length?B(Z).children("img:first"):B(Z)}if(ab===""&&H.orig&&H.titleFromAlt){ab=H.orig.attr("alt")}ab=ab.replace(/</,"&lt;").replace(/>/,"&gt;");W=H.href||(Z.nodeName?B(Z).attr("href"):Z.href)||null;if((/^(?:javascript)/i).test(W)||W=="#"){W=null}if(H.type){Y=H.type;if(!W){W=H.content}}else{if(H.content){Y="html"}else{if(W){if(W.match(i)){Y="image"}else{if(W.match(k)){Y="swf"}else{if(B(Z).hasClass("iframe")){Y="iframe"}else{if(W.indexOf("#")===0){Y="inline"}else{Y="ajax"}}}}}}}if(!Y){x();return}if(Y=="inline"){Z=W.substr(W.indexOf("#"));Y=B(Z).length>0?"inline":"ajax"}H.type=Y;H.href=W;H.title=ab;if(H.autoDimensions){if(H.type=="html"||H.type=="inline"||H.type=="ajax"){H.width="auto";H.height="auto"}else{H.autoDimensions=false}}if(H.modal){H.overlayShow=true;H.hideOnOverlayClick=false;H.hideOnContentClick=false;H.enableEscapeButton=false;H.showCloseButton=false}H.padding=parseInt(H.padding,10);H.margin=parseInt(H.margin,10);L.css("padding",(H.padding+H.margin));B(".fancybox-inline-tmp").unbind("fancybox-cancel").bind("fancybox-change",function(){B(this).replaceWith(m.children())});switch(Y){case"html":L.html(H.content);n();break;case"inline":if(B(Z).parent().is("#fancybox-content")===true){P=false;return}B('<div class="fancybox-inline-tmp" />').hide().insertBefore(B(Z)).bind("fancybox-cleanup",function(){B(this).replaceWith(m.children())}).bind("fancybox-cancel",function(){B(this).replaceWith(L.children())});B(Z).appendTo(L);n();break;case"image":P=false;B.fancybox.showActivity();o=new Image();o.onerror=function(){x()};o.onload=function(){P=true;o.onerror=o.onload=null;F()};o.src=W;break;case"swf":H.scrolling="no";aa='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="'+H.width+'" height="'+H.height+'"><param name="movie" value="'+W+'"></param>';V="";B.each(H.swf,function(ac,ad){aa+='<param name="'+ac+'" value="'+ad+'"></param>';V+=" "+ac+'="'+ad+'"'});aa+='<embed src="'+W+'" type="application/x-shockwave-flash" width="'+H.width+'" height="'+H.height+'"'+V+"></embed></object>";L.html(aa);n();break;case"ajax":P=false;B.fancybox.showActivity();H.ajax.win=H.ajax.success;f=B.ajax(B.extend({},H.ajax,{url:W,data:H.ajax.data||{},error:function(ac,ae,ad){if(ac.status>0){x()}},success:function(ad,af,ac){var ae=typeof ac=="object"?ac:f;if(ae.status==200){if(typeof H.ajax.win=="function"){X=H.ajax.win(W,ad,af,ac);if(X===false){T.hide();return}else{if(typeof X=="string"||typeof X=="object"){ad=X}}}L.html(ad);n()}}}));break;case"iframe":E();break}},n=function(){var V=H.width,W=H.height;if(V.toString().indexOf("%")>-1){V=parseInt((B(window).width()-(H.margin*2))*parseFloat(V)/100,10)+"px"}else{V=V=="auto"?"auto":V+"px"}if(W.toString().indexOf("%")>-1){W=parseInt((B(window).height()-(H.margin*2))*parseFloat(W)/100,10)+"px"}else{W=W=="auto"?"auto":W+"px"}L.wrapInner('<div style="width:'+V+";height:"+W+";overflow: "+(H.scrolling=="auto"?"auto":(H.scrolling=="yes"?"scroll":"hidden"))+';position:relative;"></div>');H.width=L.width();H.height=L.height();E()},F=function(){H.width=o.width;H.height=o.height;B("<img />").attr({id:"fancybox-img",src:o.src,alt:H.title}).appendTo(L);E()},E=function(){var W,V;T.hide();if(M.is(":visible")&&false===G.onCleanup(y,e,G)){B.event.trigger("fancybox-cancel");P=false;return}P=true;B(m.add(Q)).unbind();B(window).unbind("resize.fb scroll.fb");B(document).unbind("keydown.fb");if(M.is(":visible")&&G.titlePosition!=="outside"){M.css("height",M.height())}y=j;e=C;G=H;if(G.overlayShow){Q.css({"background-color":G.overlayColor,opacity:G.overlayOpacity,cursor:G.hideOnOverlayClick?"pointer":"auto",height:B(document).height()});if(!Q.is(":visible")){if(S){B("select:not(#fancybox-tmp select)").filter(function(){return this.style.visibility!=="hidden"}).css({visibility:"hidden"}).one("fancybox-cleanup",function(){this.style.visibility="inherit"})}Q.show()}}else{Q.hide()}c=R();l();if(M.is(":visible")){B(J.add(O).add(z)).hide();W=M.position(),b={top:W.top,left:W.left,width:M.width(),height:M.height()};V=(b.width==c.width&&b.height==c.height);m.fadeTo(G.changeFade,0.3,function(){var X=function(){m.html(L.contents()).fadeTo(G.changeFade,1,v)};B.event.trigger("fancybox-change");m.empty().removeAttr("filter").css({"border-width":G.padding,width:c.width-G.padding*2,height:H.autoDimensions?"auto":c.height-h-G.padding*2});if(V){X()}else{s.prop=0;B(s).animate({prop:1},{duration:G.changeSpeed,easing:G.easingChange,step:U,complete:X})}});return}M.removeAttr("style");m.css("border-width",G.padding);if(G.transitionIn=="elastic"){b=I();m.html(L.contents());M.show();if(G.opacity){c.opacity=0}s.prop=0;B(s).animate({prop:1},{duration:G.speedIn,easing:G.easingIn,step:U,complete:v});return}if(G.titlePosition=="inside"&&h>0){A.show()}m.css({width:c.width-G.padding*2,height:H.autoDimensions?"auto":c.height-h-G.padding*2}).html(L.contents());M.css(c).fadeIn(G.transitionIn=="none"?0:G.speedIn,v)},D=function(V){if(V&&V.length){if(G.titlePosition=="float"){return'<table id="fancybox-title-float-wrap" cellpadding="0" cellspacing="0"><tr><td id="fancybox-title-float-left"></td><td id="fancybox-title-float-main">'+V+'</td><td id="fancybox-title-float-right"></td></tr></table>'}return'<div id="fancybox-title-'+G.titlePosition+'">'+V+"</div>"}return false},l=function(){t=G.title||"";h=0;A.empty().removeAttr("style").removeClass();if(G.titleShow===false){A.hide();return}t=B.isFunction(G.titleFormat)?G.titleFormat(t,y,e,G):D(t);if(!t||t===""){A.hide();return}A.addClass("fancybox-title-"+G.titlePosition).html(t).appendTo("body").show();switch(G.titlePosition){case"inside":A.css({width:c.width-(G.padding*2),marginLeft:G.padding,marginRight:G.padding});h=A.outerHeight(true);A.appendTo(d);c.height+=h;break;case"over":A.css({marginLeft:G.padding,width:c.width-(G.padding*2),bottom:G.padding}).appendTo(d);break;case"float":A.css("left",parseInt((A.width()-c.width-40)/2,10)*-1).appendTo(M);break;default:A.css({width:c.width-(G.padding*2),paddingLeft:G.padding,paddingRight:G.padding}).appendTo(M);break}A.hide()},g=function(){if(G.enableEscapeButton||G.enableKeyboardNav){B(document).bind("keydown.fb",function(V){if(V.keyCode==27&&G.enableEscapeButton){V.preventDefault();B.fancybox.close()}else{if((V.keyCode==37||V.keyCode==39)&&G.enableKeyboardNav&&V.target.tagName!=="INPUT"&&V.target.tagName!=="TEXTAREA"&&V.target.tagName!=="SELECT"){V.preventDefault();B.fancybox[V.keyCode==37?"prev":"next"]()}}})}if(!G.showNavArrows){O.hide();z.hide();return}if((G.cyclic&&y.length>1)||e!==0){O.show()}if((G.cyclic&&y.length>1)||e!=(y.length-1)){z.show()}},v=function(){if(!B.support.opacity){m.get(0).style.removeAttribute("filter");M.get(0).style.removeAttribute("filter")}if(H.autoDimensions){m.css("height","auto")}M.css("height","auto");if(t&&t.length){A.show()}if(G.showCloseButton){J.show()}g();if(G.hideOnContentClick){m.bind("click",B.fancybox.close)}if(G.hideOnOverlayClick){Q.bind("click",B.fancybox.close)}B(window).bind("resize.fb",B.fancybox.resize);if(G.centerOnScroll){B(window).bind("scroll.fb",B.fancybox.center)}if(G.type=="iframe"){B('<iframe id="fancybox-frame" name="fancybox-frame'+new Date().getTime()+'" frameborder="0" hspace="0" '+(B.browser.msie?'allowtransparency="true""':"")+' scrolling="'+H.scrolling+'" src="'+G.href+'"></iframe>').appendTo(m)}M.show();P=false;B.fancybox.center();G.onComplete(y,e,G);K()},K=function(){var V,W;if((y.length-1)>e){V=y[e+1].href;if(typeof V!=="undefined"&&V.match(i)){W=new Image();W.src=V}}if(e>0){V=y[e-1].href;if(typeof V!=="undefined"&&V.match(i)){W=new Image();W.src=V}}},U=function(W){var V={width:parseInt(b.width+(c.width-b.width)*W,10),height:parseInt(b.height+(c.height-b.height)*W,10),top:parseInt(b.top+(c.top-b.top)*W,10),left:parseInt(b.left+(c.left-b.left)*W,10)};if(typeof c.opacity!=="undefined"){V.opacity=W<0.5?0.5:W}M.css(V);m.css({width:V.width-G.padding*2,height:V.height-(h*W)-G.padding*2})},u=function(){return[B(window).width()-(G.margin*2),B(window).height()-(G.margin*2),B(document).scrollLeft()+G.margin,B(document).scrollTop()+G.margin]},R=function(){var V=u(),Z={},W=G.autoScale,X=G.padding*2,Y;if(G.width.toString().indexOf("%")>-1){Z.width=parseInt((V[0]*parseFloat(G.width))/100,10)}else{Z.width=G.width+X}if(G.height.toString().indexOf("%")>-1){Z.height=parseInt((V[1]*parseFloat(G.height))/100,10)}else{Z.height=G.height+X}if(W&&(Z.width>V[0]||Z.height>V[1])){if(H.type=="image"||H.type=="swf"){Y=(G.width)/(G.height);if((Z.width)>V[0]){Z.width=V[0];Z.height=parseInt(((Z.width-X)/Y)+X,10)}if((Z.height)>V[1]){Z.height=V[1];Z.width=parseInt(((Z.height-X)*Y)+X,10)}}else{Z.width=Math.min(Z.width,V[0]);Z.height=Math.min(Z.height,V[1])}}Z.top=parseInt(Math.max(V[3]-20,V[3]+((V[1]-Z.height-40)*0.5)),10);Z.left=parseInt(Math.max(V[2]-20,V[2]+((V[0]-Z.width-40)*0.5)),10);return Z},q=function(V){var W=V.offset();W.top+=parseInt(V.css("paddingTop"),10)||0;W.left+=parseInt(V.css("paddingLeft"),10)||0;W.top+=parseInt(V.css("border-top-width"),10)||0;W.left+=parseInt(V.css("border-left-width"),10)||0;W.width=V.width();W.height=V.height();return W},I=function(){var Y=H.orig?B(H.orig):false,X={},W,V;if(Y&&Y.length){W=q(Y);X={width:W.width+(G.padding*2),height:W.height+(G.padding*2),top:W.top-G.padding-20,left:W.left-G.padding-20}}else{V=u();X={width:G.padding*2,height:G.padding*2,top:parseInt(V[3]+V[1]*0.5,10),left:parseInt(V[2]+V[0]*0.5,10)}}return X},a=function(){if(!T.is(":visible")){clearInterval(p);return}B("div",T).css("top",(N*-40)+"px");N=(N+1)%12};B.fn.fancybox=function(V){if(!B(this).length){return this}B(this).data("fancybox",B.extend({},V,(B.metadata?B(this).metadata():{}))).unbind("click.fb").bind("click.fb",function(X){X.preventDefault();if(P){return}P=true;B(this).blur();j=[];C=0;var W=B(this).attr("rel")||"";if(!W||W==""||W==="nofollow"){j.push(this)}else{j=B("a[rel="+W+"], area[rel="+W+"]");C=j.index(this)}w();return});return this};B.fancybox=function(Y){var X;if(P){return}P=true;X=typeof arguments[1]!=="undefined"?arguments[1]:{};j=[];C=parseInt(X.index,10)||0;if(B.isArray(Y)){for(var W=0,V=Y.length;W<V;W++){if(typeof Y[W]=="object"){B(Y[W]).data("fancybox",B.extend({},X,Y[W]))}else{Y[W]=B({}).data("fancybox",B.extend({content:Y[W]},X))}}j=jQuery.merge(j,Y)}else{if(typeof Y=="object"){B(Y).data("fancybox",B.extend({},X,Y))}else{Y=B({}).data("fancybox",B.extend({content:Y},X))}j.push(Y)}if(C>j.length||C<0){C=0}w()};B.fancybox.showActivity=function(){clearInterval(p);T.show();p=setInterval(a,66)};B.fancybox.hideActivity=function(){T.hide()};B.fancybox.next=function(){return B.fancybox.pos(e+1)};B.fancybox.prev=function(){return B.fancybox.pos(e-1)};B.fancybox.pos=function(V){if(P){return}V=parseInt(V);j=y;if(V>-1&&V<y.length){C=V;w()}else{if(G.cyclic&&y.length>1){C=V>=y.length?0:y.length-1;w()}}return};B.fancybox.cancel=function(){if(P){return}P=true;B.event.trigger("fancybox-cancel");r();H.onCancel(j,C,H);P=false};B.fancybox.close=function(){if(P||M.is(":hidden")){return}P=true;if(G&&false===G.onCleanup(y,e,G)){P=false;return}r();B(J.add(O).add(z)).hide();B(m.add(Q)).unbind();B(window).unbind("resize.fb scroll.fb");B(document).unbind("keydown.fb");m.find("iframe").attr("src",S&&/^https/i.test(window.location.href||"")?"javascript:void(false)":"about:blank");if(G.titlePosition!=="inside"){A.empty()}M.stop();function V(){Q.fadeOut("fast");A.empty().hide();M.hide();B.event.trigger("fancybox-cleanup");m.empty();G.onClosed(y,e,G);y=H=[];e=C=0;G=H={};P=false}if(G.transitionOut=="elastic"){b=I();var W=M.position();c={top:W.top,left:W.left,width:M.width(),height:M.height()};if(G.opacity){c.opacity=1}A.empty().hide();s.prop=1;B(s).animate({prop:0},{duration:G.speedOut,easing:G.easingOut,step:U,complete:V})}else{M.fadeOut(G.transitionOut=="none"?0:G.speedOut,V)}};B.fancybox.resize=function(){if(Q.is(":visible")){Q.css("height",B(document).height())}B.fancybox.center(true)};B.fancybox.center=function(){var V,W;if(P){return}W=arguments[0]===true?1:0;V=u();if(!W&&(M.width()>V[0]||M.height()>V[1])){return}M.stop().animate({top:parseInt(Math.max(V[3]-20,V[3]+((V[1]-m.height()-40)*0.5)-G.padding)),left:parseInt(Math.max(V[2]-20,V[2]+((V[0]-m.width()-40)*0.5)-G.padding))},typeof arguments[0]=="number"?arguments[0]:200)};B.fancybox.init=function(){if(B("#fancybox-wrap").length){return}B("body").append(L=B('<div id="fancybox-tmp"></div>'),T=B('<div id="fancybox-loading"><div></div></div>'),Q=B('<div id="fancybox-overlay"></div>'),M=B('<div id="fancybox-wrap"></div>'));d=B('<div id="fancybox-outer"></div>').append('<div class="fancybox-bg" id="fancybox-bg-n"></div><div class="fancybox-bg" id="fancybox-bg-ne"></div><div class="fancybox-bg" id="fancybox-bg-e"></div><div class="fancybox-bg" id="fancybox-bg-se"></div><div class="fancybox-bg" id="fancybox-bg-s"></div><div class="fancybox-bg" id="fancybox-bg-sw"></div><div class="fancybox-bg" id="fancybox-bg-w"></div><div class="fancybox-bg" id="fancybox-bg-nw"></div>').appendTo(M);d.append(m=B('<div id="fancybox-content"></div>'),J=B('<a id="fancybox-close"></a>'),A=B('<div id="fancybox-title"></div>'),O=B('<a href="javascript:;" id="fancybox-left"><span class="fancy-ico" id="fancybox-left-ico"></span></a>'),z=B('<a href="javascript:;" id="fancybox-right"><span class="fancy-ico" id="fancybox-right-ico"></span></a>'));J.click(B.fancybox.close);T.click(B.fancybox.cancel);O.click(function(V){V.preventDefault();B.fancybox.prev()});z.click(function(V){V.preventDefault();B.fancybox.next()});if(B.fn.mousewheel){M.bind("mousewheel.fb",function(V,W){if(P){V.preventDefault()}else{if(B(V.target).get(0).clientHeight==0||B(V.target).get(0).scrollHeight===B(V.target).get(0).clientHeight){V.preventDefault();B.fancybox[W>0?"prev":"next"]()}}})}if(!B.support.opacity){M.addClass("fancybox-ie")}if(S){T.addClass("fancybox-ie6");M.addClass("fancybox-ie6");B('<iframe id="fancybox-hide-sel-frame" src="'+(/^https/i.test(window.location.href||"")?"javascript:void(false)":"about:blank")+'" scrolling="no" border="0" frameborder="0" tabindex="-1"></iframe>').prependTo(d)}};B.fn.fancybox.defaults={padding:10,margin:40,opacity:false,modal:false,cyclic:false,scrolling:"auto",width:560,height:340,autoScale:true,autoDimensions:true,centerOnScroll:false,ajax:{},swf:{wmode:"transparent"},hideOnOverlayClick:true,hideOnContentClick:false,overlayShow:true,overlayOpacity:0.7,overlayColor:"#777",titleShow:true,titlePosition:"float",titleFormat:null,titleFromAlt:false,transitionIn:"fade",transitionOut:"fade",speedIn:300,speedOut:300,changeSpeed:300,changeFade:"fast",easingIn:"swing",easingOut:"swing",showCloseButton:true,showNavArrows:true,enableEscapeButton:true,enableKeyboardNav:true,onStart:function(){},onCancel:function(){},onComplete:function(){},onCleanup:function(){},onClosed:function(){},onError:function(){}};B(document).ready(function(){B.fancybox.init()})})(jQuery); \ No newline at end of file
+(function(B){var L,T,Q,M,d,m,J,A,O,z,C=0,H={},j=[],e=0,G={},y=[],f=null,o=new Image(),i=/\.(jpg|gif|png|bmp|jpeg)(.*)?$/i,k=/[^\.]\.(swf)\s*$/i,p,N=1,h=0,t="",b,c,P=false,s=B.extend(B("<div/>")[0],{prop:0}),S=B.browser.msie&&B.browser.version<7&&!window.XMLHttpRequest,r=function(){T.hide();o.onerror=o.onload=null;if(f){f.abort()}L.empty()},x=function(){if(false===H.onError(j,C,H)){T.hide();P=false;return}H.titleShow=false;H.width="auto";H.height="auto";L.html('<p id="fancybox-error">The requested content cannot be loaded.<br />Please try again later.</p>');n()},w=function(){var Z=j[C],W,Y,ab,aa,V,X;r();H=B.extend({},B.fn.fancybox.defaults,(typeof B(Z).data("fancybox")=="undefined"?H:B(Z).data("fancybox")));X=H.onStart(j,C,H);if(X===false){P=false;return}else{if(typeof X=="object"){H=B.extend(H,X)}}ab=H.title||(Z.nodeName?B(Z).attr("title"):Z.title)||"";if(Z.nodeName&&!H.orig){H.orig=B(Z).children("img:first").length?B(Z).children("img:first"):B(Z)}if(ab===""&&H.orig&&H.titleFromAlt){ab=H.orig.attr("alt")}ab=ab.replace(/</,"&lt;").replace(/>/,"&gt;");W=H.href||(Z.nodeName?B(Z).attr("href"):Z.href)||null;if((/^(?:javascript)/i).test(W)||W=="#"){W=null}if(H.type){Y=H.type;if(!W){W=H.content}}else{if(H.content){Y="html"}else{if(W){if(W.match(i)){Y="image"}else{if(W.match(k)){Y="swf"}else{if(B(Z).hasClass("iframe")){Y="iframe"}else{if(W.indexOf("#")===0){Y="inline"}}}}}}}if(!Y){x();return}if(Y=="inline"){Z=W.substr(W.indexOf("#"));Y=B(Z).length>0?"inline":"ajax"}H.type=Y;H.href=W;H.title=ab;if(H.autoDimensions){if(H.type=="html"||H.type=="inline"||H.type=="ajax"){H.width="auto";H.height="auto"}else{H.autoDimensions=false}}if(H.modal){H.overlayShow=true;H.hideOnOverlayClick=false;H.hideOnContentClick=false;H.enableEscapeButton=false;H.showCloseButton=false}H.padding=parseInt(H.padding,10);H.margin=parseInt(H.margin,10);L.css("padding",(H.padding+H.margin));B(".fancybox-inline-tmp").unbind("fancybox-cancel").bind("fancybox-change",function(){B(this).replaceWith(m.children())});switch(Y){case"html":L.html(H.content);n();break;case"inline":if(B(Z).parent().is("#fancybox-content")===true){P=false;return}B('<div class="fancybox-inline-tmp" />').hide().insertBefore(B(Z)).bind("fancybox-cleanup",function(){B(this).replaceWith(m.children())}).bind("fancybox-cancel",function(){B(this).replaceWith(L.children())});B(Z).appendTo(L);n();break;case"image":P=false;B.fancybox.showActivity();o=new Image();o.onerror=function(){x()};o.onload=function(){P=true;o.onerror=o.onload=null;F()};o.src=W;break;case"swf":H.scrolling="no";aa='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="'+H.width+'" height="'+H.height+'"><param name="movie" value="'+W+'"></param>';V="";B.each(H.swf,function(ac,ad){aa+='<param name="'+ac+'" value="'+ad+'"></param>';V+=" "+ac+'="'+ad+'"'});aa+='<embed src="'+W+'" type="application/x-shockwave-flash" width="'+H.width+'" height="'+H.height+'"'+V+"></embed></object>";L.html(aa);n();break;case"ajax":P=false;B.fancybox.showActivity();H.ajax.win=H.ajax.success;f=B.ajax(B.extend({},H.ajax,{url:W,data:H.ajax.data||{},error:function(ac,ae,ad){if(ac.status>0){x()}},success:function(ad,af,ac){var ae=typeof ac=="object"?ac:f;if(ae.status==200){if(typeof H.ajax.win=="function"){X=H.ajax.win(W,ad,af,ac);if(X===false){T.hide();return}else{if(typeof X=="string"||typeof X=="object"){ad=X}}}L.html(ad);n()}}}));break;case"iframe":E();break}},n=function(){var V=H.width,W=H.height;if(V.toString().indexOf("%")>-1){V=parseInt((B(window).width()-(H.margin*2))*parseFloat(V)/100,10)+"px"}else{V=V=="auto"?"auto":V+"px"}if(W.toString().indexOf("%")>-1){W=parseInt((B(window).height()-(H.margin*2))*parseFloat(W)/100,10)+"px"}else{W=W=="auto"?"auto":W+"px"}L.wrapInner('<div style="width:'+V+";height:"+W+";overflow: "+(H.scrolling=="auto"?"auto":(H.scrolling=="yes"?"scroll":"hidden"))+';position:relative;"></div>');H.width=L.width();H.height=L.height();E()},F=function(){H.width=o.width;H.height=o.height;B("<img />").attr({id:"fancybox-img",src:o.src,alt:H.title}).appendTo(L);E()},E=function(){var W,V;T.hide();if(M.is(":visible")&&false===G.onCleanup(y,e,G)){B.event.trigger("fancybox-cancel");P=false;return}P=true;B(m.add(Q)).unbind();B(window).unbind("resize.fb scroll.fb");B(document).unbind("keydown.fb");if(M.is(":visible")&&G.titlePosition!=="outside"){M.css("height",M.height())}y=j;e=C;G=H;if(G.overlayShow){Q.css({"background-color":G.overlayColor,opacity:G.overlayOpacity,cursor:G.hideOnOverlayClick?"pointer":"auto",height:B(document).height()});if(!Q.is(":visible")){if(S){B("select:not(#fancybox-tmp select)").filter(function(){return this.style.visibility!=="hidden"}).css({visibility:"hidden"}).one("fancybox-cleanup",function(){this.style.visibility="inherit"})}Q.show()}}else{Q.hide()}c=R();l();if(M.is(":visible")){B(J.add(O).add(z)).hide();W=M.position(),b={top:W.top,left:W.left,width:M.width(),height:M.height()};V=(b.width==c.width&&b.height==c.height);m.fadeTo(G.changeFade,0.3,function(){var X=function(){m.html(L.contents()).fadeTo(G.changeFade,1,v)};B.event.trigger("fancybox-change");m.empty().removeAttr("filter").css({"border-width":G.padding,width:c.width-G.padding*2,height:H.autoDimensions?"auto":c.height-h-G.padding*2});if(V){X()}else{s.prop=0;B(s).animate({prop:1},{duration:G.changeSpeed,easing:G.easingChange,step:U,complete:X})}});return}M.removeAttr("style");m.css("border-width",G.padding);if(G.transitionIn=="elastic"){b=I();m.html(L.contents());M.show();if(G.opacity){c.opacity=0}s.prop=0;B(s).animate({prop:1},{duration:G.speedIn,easing:G.easingIn,step:U,complete:v});return}if(G.titlePosition=="inside"&&h>0){A.show()}m.css({width:c.width-G.padding*2,height:H.autoDimensions?"auto":c.height-h-G.padding*2}).html(L.contents());M.css(c).fadeIn(G.transitionIn=="none"?0:G.speedIn,v)},D=function(V){if(V&&V.length){if(G.titlePosition=="float"){return'<table id="fancybox-title-float-wrap" cellpadding="0" cellspacing="0"><tr><td id="fancybox-title-float-left"></td><td id="fancybox-title-float-main">'+V+'</td><td id="fancybox-title-float-right"></td></tr></table>'}return'<div id="fancybox-title-'+G.titlePosition+'">'+V+"</div>"}return false},l=function(){t=G.title||"";h=0;A.empty().removeAttr("style").removeClass();if(G.titleShow===false){A.hide();return}t=B.isFunction(G.titleFormat)?G.titleFormat(t,y,e,G):D(t);if(!t||t===""){A.hide();return}A.addClass("fancybox-title-"+G.titlePosition).html(t).appendTo("body").show();switch(G.titlePosition){case"inside":A.css({width:c.width-(G.padding*2),marginLeft:G.padding,marginRight:G.padding});h=A.outerHeight(true);A.appendTo(d);c.height+=h;break;case"over":A.css({marginLeft:G.padding,width:c.width-(G.padding*2),bottom:G.padding}).appendTo(d);break;case"float":A.css("left",parseInt((A.width()-c.width-40)/2,10)*-1).appendTo(M);break;default:A.css({width:c.width-(G.padding*2),paddingLeft:G.padding,paddingRight:G.padding}).appendTo(M);break}A.hide()},g=function(){if(G.enableEscapeButton||G.enableKeyboardNav){B(document).bind("keydown.fb",function(V){if(V.keyCode==27&&G.enableEscapeButton){V.preventDefault();B.fancybox.close()}else{if((V.keyCode==37||V.keyCode==39)&&G.enableKeyboardNav&&V.target.tagName!=="INPUT"&&V.target.tagName!=="TEXTAREA"&&V.target.tagName!=="SELECT"){V.preventDefault();B.fancybox[V.keyCode==37?"prev":"next"]()}}})}if(!G.showNavArrows){O.hide();z.hide();return}if((G.cyclic&&y.length>1)||e!==0){O.show()}if((G.cyclic&&y.length>1)||e!=(y.length-1)){z.show()}},v=function(){if(!B.support.opacity){m.get(0).style.removeAttribute("filter");M.get(0).style.removeAttribute("filter")}if(H.autoDimensions){m.css("height","auto")}M.css("height","auto");if(t&&t.length){A.show()}if(G.showCloseButton){J.show()}g();if(G.hideOnContentClick){m.bind("click",B.fancybox.close)}if(G.hideOnOverlayClick){Q.bind("click",B.fancybox.close)}B(window).bind("resize.fb",B.fancybox.resize);if(G.centerOnScroll){B(window).bind("scroll.fb",B.fancybox.center)}if(G.type=="iframe"){B('<iframe id="fancybox-frame" name="fancybox-frame'+new Date().getTime()+'" frameborder="0" hspace="0" '+(B.browser.msie?'allowtransparency="true""':"")+' scrolling="'+H.scrolling+'" src="'+G.href+'"></iframe>').appendTo(m)}M.show();P=false;B.fancybox.center();G.onComplete(y,e,G);K()},K=function(){var V,W;if((y.length-1)>e){V=y[e+1].href;if(typeof V!=="undefined"&&V.match(i)){W=new Image();W.src=V}}if(e>0){V=y[e-1].href;if(typeof V!=="undefined"&&V.match(i)){W=new Image();W.src=V}}},U=function(W){var V={width:parseInt(b.width+(c.width-b.width)*W,10),height:parseInt(b.height+(c.height-b.height)*W,10),top:parseInt(b.top+(c.top-b.top)*W,10),left:parseInt(b.left+(c.left-b.left)*W,10)};if(typeof c.opacity!=="undefined"){V.opacity=W<0.5?0.5:W}M.css(V);m.css({width:V.width-G.padding*2,height:V.height-(h*W)-G.padding*2})},u=function(){return[B(window).width()-(G.margin*2),B(window).height()-(G.margin*2),B(document).scrollLeft()+G.margin,B(document).scrollTop()+G.margin]},R=function(){var V=u(),Z={},W=G.autoScale,X=G.padding*2,Y;if(G.width.toString().indexOf("%")>-1){Z.width=parseInt((V[0]*parseFloat(G.width))/100,10)}else{Z.width=G.width+X}if(G.height.toString().indexOf("%")>-1){Z.height=parseInt((V[1]*parseFloat(G.height))/100,10)}else{Z.height=G.height+X}if(W&&(Z.width>V[0]||Z.height>V[1])){if(H.type=="image"||H.type=="swf"){Y=(G.width)/(G.height);if((Z.width)>V[0]){Z.width=V[0];Z.height=parseInt(((Z.width-X)/Y)+X,10)}if((Z.height)>V[1]){Z.height=V[1];Z.width=parseInt(((Z.height-X)*Y)+X,10)}}else{Z.width=Math.min(Z.width,V[0]);Z.height=Math.min(Z.height,V[1])}}Z.top=parseInt(Math.max(V[3]-20,V[3]+((V[1]-Z.height-40)*0.5)),10);Z.left=parseInt(Math.max(V[2]-20,V[2]+((V[0]-Z.width-40)*0.5)),10);return Z},q=function(V){var W=V.offset();W.top+=parseInt(V.css("paddingTop"),10)||0;W.left+=parseInt(V.css("paddingLeft"),10)||0;W.top+=parseInt(V.css("border-top-width"),10)||0;W.left+=parseInt(V.css("border-left-width"),10)||0;W.width=V.width();W.height=V.height();return W},I=function(){var Y=H.orig?B(H.orig):false,X={},W,V;if(Y&&Y.length){W=q(Y);X={width:W.width+(G.padding*2),height:W.height+(G.padding*2),top:W.top-G.padding-20,left:W.left-G.padding-20}}else{V=u();X={width:G.padding*2,height:G.padding*2,top:parseInt(V[3]+V[1]*0.5,10),left:parseInt(V[2]+V[0]*0.5,10)}}return X},a=function(){if(!T.is(":visible")){clearInterval(p);return}B("div",T).css("top",(N*-40)+"px");N=(N+1)%12};B.fn.fancybox=function(V){if(!B(this).length){return this}B(this).data("fancybox",B.extend({},V,(B.metadata?B(this).metadata():{}))).unbind("click.fb").bind("click.fb",function(X){X.preventDefault();if(P){return}P=true;B(this).blur();j=[];C=0;var W=B(this).attr("rel")||"";if(!W||W==""||W==="nofollow"){j.push(this)}else{j=B("a[rel="+W+"], area[rel="+W+"]");C=j.index(this)}w();return});return this};B.fancybox=function(Y){var X;if(P){return}P=true;X=typeof arguments[1]!=="undefined"?arguments[1]:{};j=[];C=parseInt(X.index,10)||0;if(B.isArray(Y)){for(var W=0,V=Y.length;W<V;W++){if(typeof Y[W]=="object"){B(Y[W]).data("fancybox",B.extend({},X,Y[W]))}else{Y[W]=B({}).data("fancybox",B.extend({content:Y[W]},X))}}j=jQuery.merge(j,Y)}else{if(typeof Y=="object"){B(Y).data("fancybox",B.extend({},X,Y))}else{Y=B({}).data("fancybox",B.extend({content:Y},X))}j.push(Y)}if(C>j.length||C<0){C=0}w()};B.fancybox.showActivity=function(){clearInterval(p);T.show();p=setInterval(a,66)};B.fancybox.hideActivity=function(){T.hide()};B.fancybox.next=function(){return B.fancybox.pos(e+1)};B.fancybox.prev=function(){return B.fancybox.pos(e-1)};B.fancybox.pos=function(V){if(P){return}V=parseInt(V);j=y;if(V>-1&&V<y.length){C=V;w()}else{if(G.cyclic&&y.length>1){C=V>=y.length?0:y.length-1;w()}}return};B.fancybox.cancel=function(){if(P){return}P=true;B.event.trigger("fancybox-cancel");r();H.onCancel(j,C,H);P=false};B.fancybox.close=function(){if(P||M.is(":hidden")){return}P=true;if(G&&false===G.onCleanup(y,e,G)){P=false;return}r();B(J.add(O).add(z)).hide();B(m.add(Q)).unbind();B(window).unbind("resize.fb scroll.fb");B(document).unbind("keydown.fb");m.find("iframe").attr("src",S&&/^https/i.test(window.location.href||"")?"javascript:void(false)":"about:blank");if(G.titlePosition!=="inside"){A.empty()}M.stop();function V(){Q.fadeOut("fast");A.empty().hide();M.hide();B.event.trigger("fancybox-cleanup");m.empty();G.onClosed(y,e,G);y=H=[];e=C=0;G=H={};P=false}if(G.transitionOut=="elastic"){b=I();var W=M.position();c={top:W.top,left:W.left,width:M.width(),height:M.height()};if(G.opacity){c.opacity=1}A.empty().hide();s.prop=1;B(s).animate({prop:0},{duration:G.speedOut,easing:G.easingOut,step:U,complete:V})}else{M.fadeOut(G.transitionOut=="none"?0:G.speedOut,V)}};B.fancybox.resize=function(){if(Q.is(":visible")){Q.css("height",B(document).height())}B.fancybox.center(true)};B.fancybox.center=function(){var V,W;if(P){return}W=arguments[0]===true?1:0;V=u();if(!W&&(M.width()>V[0]||M.height()>V[1])){return}M.stop().animate({top:parseInt(Math.max(V[3]-20,V[3]+((V[1]-m.height()-40)*0.5)-G.padding)),left:parseInt(Math.max(V[2]-20,V[2]+((V[0]-m.width()-40)*0.5)-G.padding))},typeof arguments[0]=="number"?arguments[0]:200)};B.fancybox.init=function(){if(B("#fancybox-wrap").length){return}B("body").append(L=B('<div id="fancybox-tmp"></div>'),T=B('<div id="fancybox-loading"><div></div></div>'),Q=B('<div id="fancybox-overlay"></div>'),M=B('<div id="fancybox-wrap"></div>'));d=B('<div id="fancybox-outer"></div>').append('<div class="fancybox-bg" id="fancybox-bg-n"></div><div class="fancybox-bg" id="fancybox-bg-ne"></div><div class="fancybox-bg" id="fancybox-bg-e"></div><div class="fancybox-bg" id="fancybox-bg-se"></div><div class="fancybox-bg" id="fancybox-bg-s"></div><div class="fancybox-bg" id="fancybox-bg-sw"></div><div class="fancybox-bg" id="fancybox-bg-w"></div><div class="fancybox-bg" id="fancybox-bg-nw"></div>').appendTo(M);d.append(m=B('<div id="fancybox-content"></div>'),J=B('<a id="fancybox-close"></a>'),A=B('<div id="fancybox-title"></div>'),O=B('<a href="javascript:;" id="fancybox-left"><span class="fancy-ico" id="fancybox-left-ico"></span></a>'),z=B('<a href="javascript:;" id="fancybox-right"><span class="fancy-ico" id="fancybox-right-ico"></span></a>'));J.click(B.fancybox.close);T.click(B.fancybox.cancel);O.click(function(V){V.preventDefault();B.fancybox.prev()});z.click(function(V){V.preventDefault();B.fancybox.next()});if(B.fn.mousewheel){M.bind("mousewheel.fb",function(V,W){if(P){V.preventDefault()}else{if(B(V.target).get(0).clientHeight==0||B(V.target).get(0).scrollHeight===B(V.target).get(0).clientHeight){V.preventDefault();B.fancybox[W>0?"prev":"next"]()}}})}if(!B.support.opacity){M.addClass("fancybox-ie")}if(S){T.addClass("fancybox-ie6");M.addClass("fancybox-ie6");B('<iframe id="fancybox-hide-sel-frame" src="'+(/^https/i.test(window.location.href||"")?"javascript:void(false)":"about:blank")+'" scrolling="no" border="0" frameborder="0" tabindex="-1"></iframe>').prependTo(d)}};B.fn.fancybox.defaults={padding:10,margin:40,opacity:false,modal:false,cyclic:false,scrolling:"auto",width:560,height:340,autoScale:true,autoDimensions:true,centerOnScroll:false,ajax:{},swf:{wmode:"transparent"},hideOnOverlayClick:true,hideOnContentClick:false,overlayShow:true,overlayOpacity:0.7,overlayColor:"#777",titleShow:true,titlePosition:"float",titleFormat:null,titleFromAlt:false,transitionIn:"fade",transitionOut:"fade",speedIn:300,speedOut:300,changeSpeed:300,changeFade:"fast",easingIn:"swing",easingOut:"swing",showCloseButton:true,showNavArrows:true,enableEscapeButton:true,enableKeyboardNav:true,onStart:function(){},onCancel:function(){},onComplete:function(){},onCleanup:function(){},onClosed:function(){},onError:function(){}};B(document).ready(function(){B.fancybox.init()})})(jQuery); \ No newline at end of file
diff --git a/apps/files_sharing/ajax/email.php b/apps/files_sharing/ajax/email.php
index 3026eb74675..aba4f699fa8 100644
--- a/apps/files_sharing/ajax/email.php
+++ b/apps/files_sharing/ajax/email.php
@@ -10,4 +10,9 @@ $subject = $user.' shared a '.$type.' with you';
$link = $_POST['link'];
$text = $user.' shared the '.$type.' '.$_POST['file'].' with you. It is available for download here: '.$link;
$fromaddress = OCP\Config::getUserValue($user, 'settings', 'email', 'sharing-noreply@'.OCP\Util::getServerHost());
-OCP\Util::sendMail($_POST['toaddress'], $_POST['toaddress'], $subject, $text, $fromaddress, $user);
+try {
+ OCP\Util::sendMail($_POST['toaddress'], $_POST['toaddress'], $subject, $text, $fromaddress, $user);
+ OCP\JSON::success();
+} catch (Exception $exception) {
+ OCP\JSON::error(array('data' => array('message' => $exception->getMessage())));
+}
diff --git a/apps/files_sharing/ajax/getitem.php b/apps/files_sharing/ajax/getitem.php
index ff6c29b6a0a..06a80102dec 100644
--- a/apps/files_sharing/ajax/getitem.php
+++ b/apps/files_sharing/ajax/getitem.php
@@ -22,8 +22,13 @@ while ($path != $userDirectory) {
}
} else {
// Check if uid_shared_with is a group
- if (($pos = strpos($uid_shared_with, '@')) !== false) {
+ $pos = strrpos($uid_shared_with, '@');
+ if ($pos !== false) {
$gid = substr($uid_shared_with, $pos + 1);
+ } else {
+ $gid = false;
+ }
+ if ($gid && OC_Group::groupExists($gid)) {
// Include users in the group so the users can be removed from the list of people to share with
if ($path == $source) {
$group = array(array('gid' => $gid, 'permissions' => $rows[$i]['permissions'], 'users' => OC_Group::usersInGroup($gid), 'parentFolder' => false));
diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js
new file mode 100644
index 00000000000..3cfa3583b13
--- /dev/null
+++ b/apps/files_sharing/js/share.js
@@ -0,0 +1,375 @@
+OC.Share={
+ icons:[],
+ itemUsers:[],
+ itemGroups:[],
+ itemPrivateLink:false,
+ usersAndGroups:[],
+ loadIcons:function() {
+ // Cache all icons for shared files
+ $.getJSON(OC.filePath('files_sharing', 'ajax', 'getstatuses.php'), function(result) {
+ if (result && result.status === 'success') {
+ $.each(result.data, function(item, hasPrivateLink) {
+ if (hasPrivateLink) {
+ OC.Share.icons[item] = OC.imagePath('core', 'actions/public');
+ } else {
+ OC.Share.icons[item] = OC.imagePath('core', 'actions/shared');
+ }
+ });
+ }
+ });
+ },
+ loadItem:function(item) {
+ $.ajax({type: 'GET', url: OC.filePath('files_sharing', 'ajax', 'getitem.php'), data: { item: item }, async: false, success: function(result) {
+ if (result && result.status === 'success') {
+ var item = result.data;
+ OC.Share.itemUsers = item.users;
+ OC.Share.itemGroups = item.groups;
+ OC.Share.itemPrivateLink = item.privateLink;
+ }
+ }});
+ },
+ share:function(source, uid_shared_with, permissions, callback) {
+ $.post(OC.filePath('files_sharing', 'ajax', 'share.php'), { sources: source, uid_shared_with: uid_shared_with, permissions: permissions }, function(result) {
+ if (result && result.status === 'success') {
+ if (callback) {
+ callback(result.data);
+ }
+ } else {
+ OC.dialogs.alert(result.data.message, 'Error while sharing');
+ }
+ });
+ },
+ unshare:function(source, uid_shared_with, callback) {
+ $.post(OC.filePath('files_sharing', 'ajax', 'unshare.php'), { source: source, uid_shared_with: uid_shared_with }, function(result) {
+ if (result && result.status === 'success') {
+ if (callback) {
+ callback();
+ }
+ } else {
+ OC.dialogs.alert('Error', 'Error while unsharing');
+ }
+ });
+ },
+ changePermissions:function(source, uid_shared_with, permissions) {
+ $.post(OC.filePath('files_sharing','ajax','setpermissions.php'), { source: source, uid_shared_with: uid_shared_with, permissions: permissions }, function(result) {
+ if (!result || result.status !== 'success') {
+ OC.dialogs.alert('Error', 'Error while changing permissions');
+ }
+ });
+ },
+ showDropDown:function(item, appendTo) {
+ OC.Share.loadItem(item);
+ var html = '<div id="dropdown" class="drop" data-item="'+item+'">';
+ html += '<select data-placeholder="User or Group" id="share_with" class="chzen-select">';
+ html += '<option value="" selected="selected" disabled="disabled">Your groups & members</option>';
+ html += '</select>';
+ html += '<div id="sharedWithList">';
+ html += '<ul id="userList"></ul>';
+ html += '<div id="groups" style="display:none;">';
+ html += '<br />';
+ html += 'Groups: ';
+ html += '<ul id="groupList"></ul>';
+ html += '</div>';
+ html += '</div>';
+ html += '<div id="privateLink">';
+ html += '<input type="checkbox" name="privateLinkCheckbox" id="privateLinkCheckbox" value="1" /><label for="privateLinkCheckbox">Share with private link</label>';
+ html += '<br />';
+ html += '<form id="emailPrivateLink">';
+ html += '<input id="privateLinkText" style="display:none; width:90%;" />';
+ html += '<input id="email" style="display:none; width:65%;" value="" placeholder="Email link to person" />';
+ html += '<input id="emailButton" style="display:none;" type="submit" value="Send" />';
+ html += '</form>';
+ html += '</div>';
+ $(html).appendTo(appendTo);
+ if (OC.Share.usersAndGroups.length < 1) {
+ $.ajax({type: 'GET', url: OC.filePath('files_sharing', 'ajax', 'userautocomplete.php'), async: false, success: function(users) {
+ if (users) {
+ OC.Share.usersAndGroups = users;
+ $.each(users, function(index, user) {
+ $(user).appendTo('#share_with');
+ });
+ $('#share_with').trigger('liszt:updated');
+ }
+ }});
+ } else {
+ $.each(OC.Share.usersAndGroups, function(index, user) {
+ $(user).appendTo('#share_with');
+ });
+ $('#share_with').trigger('liszt:updated');
+ }
+ if (OC.Share.itemUsers) {
+ $.each(OC.Share.itemUsers, function(index, user) {
+ if (user.parentFolder) {
+ OC.Share.addSharedWith(user.uid, user.permissions, false, user.parentFolder);
+ } else {
+ OC.Share.addSharedWith(user.uid, user.permissions, false, false);
+ }
+ });
+ }
+ if (OC.Share.itemGroups) {
+ $.each(OC.Share.itemGroups, function(index, group) {
+ if (group.parentFolder) {
+ OC.Share.addSharedWith(group.gid, group.permissions, group.users, group.parentFolder);
+ } else {
+ OC.Share.addSharedWith(group.gid, group.permissions, group.users, false);
+ }
+ });
+ }
+ if (OC.Share.itemPrivateLink) {
+ OC.Share.showPrivateLink(item, OC.Share.itemPrivateLink);
+ }
+ $('#dropdown').show('blind');
+ $('#share_with').chosen();
+ },
+ hideDropDown:function(callback) {
+ $('#dropdown').hide('blind', function() {
+ $('#dropdown').remove();
+ if (callback) {
+ callback.call();
+ }
+ });
+ },
+ addSharedWith:function(uid_shared_with, permissions, isGroup, parentFolder) {
+ if (parentFolder) {
+ var sharedWith = '<li>Parent folder '+parentFolder+' shared with '+uid_shared_with+'</li>';
+ } else {
+ var checked = ((permissions > 0) ? 'checked="checked"' : 'style="display:none;"');
+ var style = ((permissions == 0) ? 'style="display:none;"' : '');
+ var sharedWith = '<li data-uid_shared_with="'+uid_shared_with+'">';
+ sharedWith += '<a href="" class="unshare" style="display:none;"><img class="svg" alt="Unshare" src="'+OC.imagePath('core','actions/delete')+'"/></a>';
+ sharedWith += uid_shared_with;
+ sharedWith += '<input type="checkbox" name="permissions" id="'+uid_shared_with+'" class="permissions" '+checked+' />';
+ sharedWith += '<label class="edit" for="'+uid_shared_with+'" '+style+'>can edit</label>';
+ sharedWith += '</li>';
+ }
+ if (isGroup) {
+ // Groups are added to a different list
+ $('#groups').show();
+ $(sharedWith).appendTo('#groupList');
+ // Remove group from select form
+ $('#share_with option[value="'+uid_shared_with+'(group)"]').remove();
+ $('#share_with').trigger('liszt:updated');
+ // Remove users in group from select form
+ $.each(isGroup, function(index, user) {
+ $('#share_with option[value="'+user+'"]').remove();
+ $('#share_with').trigger('liszt:updated');
+ });
+ } else {
+ $(sharedWith).appendTo('#userList');
+ // Remove user from select form
+ $('#share_with option[value="'+uid_shared_with+'"]').remove();
+ $('#share_with').trigger('liszt:updated');
+ }
+
+ },
+ removeSharedWith:function(uid_shared_with) {
+ var option;
+ if ($('#userList li[data-uid_shared_with="'+uid_shared_with+'"]').length > 0) {
+ $('#userList li[data-uid_shared_with="'+uid_shared_with+'"]').remove();
+ option = '<option value="'+uid_shared_with+'">'+uid_shared_with+'</option>';
+ } else if ($('#groupList li[data-uid_shared_with="'+uid_shared_with+'"]').length > 0) {
+ $('#groupList li[data-uid_shared_with="'+uid_shared_with+'"]').remove();
+ if ($('#groupList li').length < 1) {
+ $('#groups').hide();
+ }
+ option = '<option value="'+uid_shared_with+'(group)">'+uid_shared_with+' (group)</option>';
+ }
+ $(option).appendTo('#share_with');
+ $('#share_with').trigger('liszt:updated');
+ },
+ showPrivateLink:function(item, token) {
+ $('#privateLinkCheckbox').attr('checked', true);
+ var link = parent.location.protocol+'//'+location.host+OC.linkTo('', 'public.php')+'?service=files&token='+token;
+ if (token.indexOf('&path=') == -1) {
+ link += '&file=' + encodeURIComponent(item).replace(/%2F/g, '/');
+ } else {
+ // Disable checkbox if inside a shared parent folder
+ $('#privateLinkCheckbox').attr('disabled', 'true');
+ }
+ $('#privateLinkText').val(link);
+ $('#privateLinkText').show('blind', function() {
+ $('#privateLinkText').after('<br id="emailBreak" />');
+ $('#email').show();
+ $('#emailButton').show();
+ });
+ },
+ hidePrivateLink:function() {
+ $('#privateLinkText').hide('blind');
+ $('#emailBreak').remove();
+ $('#email').hide();
+ $('#emailButton').hide();
+ },
+ emailPrivateLink:function() {
+ var link = $('#privateLinkText').val();
+ var file = link.substr(link.lastIndexOf('/') + 1).replace(/%20/g, ' ');
+ var email = $('#email').val();
+ if (email != '') {
+ $.post(OC.filePath('files_sharing', 'ajax', 'email.php'), { toaddress: email, link: link, file: file }, function(result) {
+ if (result && result.status == 'success') {
+ $('#email').css('font-weight', 'bold');
+ $('#email').animate({ fontWeight: 'normal' }, 2000, function() {
+ $(this).val('');
+ }).val('Email sent');
+ } else {
+ OC.dialogs.alert(result.data.message, 'Error while sharing');
+ }
+ });
+ }
+ },
+ dirname:function(path) {
+ return path.replace(/\\/g,'/').replace(/\/[^\/]*$/, '');
+ }
+}
+
+$(document).ready(function() {
+
+ if (typeof FileActions !== 'undefined') {
+ OC.Share.loadIcons();
+ FileActions.register('all', 'Share', function(filename) {
+ // Return the correct sharing icon
+ if (scanFiles.scanning) { return; } // workaround to prevent additional http request block scanning feedback
+ var item = $('#dir').val() + '/' + filename;
+ // Check if icon is in cache
+ if (OC.Share.icons[item]) {
+ return OC.Share.icons[item];
+ } else {
+ var last = '';
+ var path = OC.Share.dirname(item);
+ // Search for possible parent folders that are shared
+ while (path != last) {
+ if (OC.Share.icons[path]) {
+ OC.Share.icons[item] = OC.Share.icons[path];
+ return OC.Share.icons[item];
+ }
+ last = path;
+ path = OC.Share.dirname(path);
+ }
+ OC.Share.icons[item] = OC.imagePath('core', 'actions/share');
+ return OC.Share.icons[item];
+ }
+ }, function(filename) {
+ var file = $('#dir').val() + '/' + filename;
+ var appendTo = $('tr').filterAttr('data-file',filename).find('td.filename');
+ // Check if drop down is already visible for a different file
+ if (($('#dropdown').length > 0)) {
+ if (file != $('#dropdown').data('item')) {
+ OC.Share.hideDropDown(function () {
+ $('tr').removeClass('mouseOver');
+ $('tr').filterAttr('data-file',filename).addClass('mouseOver');
+ OC.Share.showDropDown(file, appendTo);
+ });
+ }
+ } else {
+ $('tr').filterAttr('data-file',filename).addClass('mouseOver');
+ OC.Share.showDropDown(file, appendTo);
+ }
+ });
+ };
+
+ $(this).click(function(event) {
+ if (!($(event.target).hasClass('drop')) && $(event.target).parents().index($('#dropdown')) == -1) {
+ if ($('#dropdown').is(':visible')) {
+ OC.Share.hideDropDown(function() {
+ $('tr').removeClass('mouseOver');
+ });
+ }
+ }
+ });
+
+ $('#sharedWithList li').live('mouseenter', function(event) {
+ // Show permissions and unshare button
+ $(':hidden', this).show();
+ });
+
+ $('#sharedWithList li').live('mouseleave', function(event) {
+ // Hide permissions and unshare button
+ $('a', this).hide();
+ if (!$('input:[type=checkbox]', this).is(':checked')) {
+ $('input:[type=checkbox]', this).hide();
+ $('label', this).hide();
+ }
+ });
+
+ $('#share_with').live('change', function() {
+ var item = $('#dropdown').data('item');
+ var uid_shared_with = $(this).val();
+ var pos = uid_shared_with.indexOf('(group)');
+ var isGroup = false;
+ if (pos != -1) {
+ // Remove '(group)' from uid_shared_with
+ uid_shared_with = uid_shared_with.substr(0, pos);
+ isGroup = true;
+ }
+ OC.Share.share(item, uid_shared_with, 0, function() {
+ if (isGroup) {
+ // Reload item because we don't know which users are in the group
+ OC.Share.loadItem(item);
+ var users;
+ $.each(OC.Share.itemGroups, function(index, group) {
+ if (group.gid == uid_shared_with) {
+ users = group.users;
+ }
+ });
+ OC.Share.addSharedWith(uid_shared_with, 0, users, false);
+ } else {
+ OC.Share.addSharedWith(uid_shared_with, 0, false, false);
+ }
+ // Change icon
+ if (!OC.Share.itemPrivateLink) {
+ OC.Share.icons[item] = OC.imagePath('core', 'actions/shared');
+ }
+ });
+ });
+
+ $('.unshare').live('click', function() {
+ var item = $('#dropdown').data('item');
+ var uid_shared_with = $(this).parent().data('uid_shared_with');
+ OC.Share.unshare(item, uid_shared_with, function() {
+ OC.Share.removeSharedWith(uid_shared_with);
+ // Reload item to update cached users and groups for the icon check
+ OC.Share.loadItem(item);
+ // Change icon
+ if (!OC.Share.itemPrivateLink && !OC.Share.itemUsers && !OC.Share.itemGroups) {
+ OC.Share.icons[item] = OC.imagePath('core', 'actions/share');
+ }
+ });
+ });
+
+ $('.permissions').live('change', function() {
+ var permissions = (this.checked) ? 1 : 0;
+ OC.Share.changePermissions($('#dropdown').data('item'), $(this).parent().data('uid_shared_with'), permissions);
+ });
+
+ $('#privateLinkCheckbox').live('change', function() {
+ var item = $('#dropdown').data('item');
+ if (this.checked) {
+ // Create a private link
+ OC.Share.share(item, 'public', 0, function(token) {
+ OC.Share.showPrivateLink(item, token);
+ // Change icon
+ OC.Share.icons[item] = OC.imagePath('core', 'actions/public');
+ });
+ } else {
+ // Delete private link
+ OC.Share.unshare(item, 'public', function() {
+ OC.Share.hidePrivateLink();
+ // Change icon
+ if (OC.Share.itemUsers || OC.Share.itemGroups) {
+ OC.Share.icons[item] = OC.imagePath('core', 'actions/shared');
+ } else {
+ OC.Share.icons[item] = OC.imagePath('core', 'actions/share');
+ }
+ });
+ }
+ });
+
+ $('#privateLinkText').live('click', function() {
+ $(this).focus();
+ $(this).select();
+ });
+
+ $('#emailPrivateLink').live('submit', function(event) {
+ event.preventDefault();
+ OC.Share.emailPrivateLink();
+ });
+}); \ No newline at end of file
diff --git a/apps/files_sharing/lib_share.php b/apps/files_sharing/lib_share.php
index 0237acfc1ac..1c061cde07a 100644
--- a/apps/files_sharing/lib_share.php
+++ b/apps/files_sharing/lib_share.php
@@ -179,10 +179,13 @@ class OC_Share {
$uid_shared_with = OC_Group::usersInGroup($uid_shared_with);
// Remove the owner from the list of users in the group
$uid_shared_with = array_diff($uid_shared_with, array(OCP\USER::getUser()));
- } else if ($uid = strstr($uid_shared_with, '@', true)) {
- $uid_shared_with = array($uid);
} else {
- $uid_shared_with = array($uid_shared_with);
+ $pos = strrpos($uid_shared_with, '@');
+ if ($pos !== false && OC_Group::groupExists(substr($uid_shared_with, $pos + 1))) {
+ $uid_shared_with = array(substr($uid_shared_with, 0, $pos));
+ } else {
+ $uid_shared_with = array($uid_shared_with);
+ }
}
foreach ($uid_shared_with as $uid) {
$sharedFolder = $uid.'/files/Shared';
diff --git a/apps/gallery/l10n/ca.php b/apps/gallery/l10n/ca.php
index 165414fba20..1c5848cee28 100644
--- a/apps/gallery/l10n/ca.php
+++ b/apps/gallery/l10n/ca.php
@@ -1,9 +1,9 @@
<?php $TRANSLATIONS = array(
"Pictures" => "Fotos",
-"Settings" => "Arranjament",
-"Rescan" => "Escaneja de nou",
-"Stop" => "Atura",
-"Share" => "Comparteix",
+"Share gallery" => "Comperteix la galeria",
+"Error: " => "Error: ",
+"Internal error" => "Error intern",
+"Slideshow" => "Passi de diapositives",
"Back" => "Enrera",
"Remove confirmation" => "Elimina la confirmació",
"Do you want to remove album" => "Voleu eliminar l'àlbum",
diff --git a/apps/gallery/l10n/el.php b/apps/gallery/l10n/el.php
index 3983011a0c0..47bc3af2bb6 100644
--- a/apps/gallery/l10n/el.php
+++ b/apps/gallery/l10n/el.php
@@ -1,9 +1,9 @@
<?php $TRANSLATIONS = array(
"Pictures" => "Εικόνες",
-"Settings" => "Ρυθμίσεις",
-"Rescan" => "Επανασάρωση",
-"Stop" => "Διακοπή",
-"Share" => "Κοινοποίηση",
+"Share gallery" => "Κοινοποίηση συλλογής",
+"Error: " => "Σφάλμα: ",
+"Internal error" => "Εσωτερικό σφάλμα",
+"Slideshow" => "Προβολή Διαφανειών",
"Back" => "Επιστροφή",
"Remove confirmation" => "Αφαίρεση επιβεβαίωσης",
"Do you want to remove album" => "Θέλετε να αφαιρέσετε το άλμπουμ",
diff --git a/apps/gallery/l10n/es.php b/apps/gallery/l10n/es.php
index 03e8d6a4563..aa425a0bd04 100644
--- a/apps/gallery/l10n/es.php
+++ b/apps/gallery/l10n/es.php
@@ -1,9 +1,9 @@
<?php $TRANSLATIONS = array(
"Pictures" => "Imágenes",
-"Settings" => "Preferencias",
-"Rescan" => "Refrescar",
-"Stop" => "Parar",
-"Share" => "Compartir",
+"Share gallery" => "Compartir galería",
+"Error: " => "Fallo ",
+"Internal error" => "Fallo interno",
+"Slideshow" => "Presentación",
"Back" => "Atrás",
"Remove confirmation" => "Borrar confirmación",
"Do you want to remove album" => "¿Quieres eliminar el álbum",
diff --git a/apps/gallery/l10n/fi_FI.php b/apps/gallery/l10n/fi_FI.php
index 267bb5e547e..659289ae41f 100644
--- a/apps/gallery/l10n/fi_FI.php
+++ b/apps/gallery/l10n/fi_FI.php
@@ -1,9 +1,9 @@
<?php $TRANSLATIONS = array(
"Pictures" => "Kuvat",
-"Settings" => "Asetukset",
-"Rescan" => "Etsi uusia",
-"Stop" => "Pysäytä",
-"Share" => "Jaa",
+"Share gallery" => "Jaa galleria",
+"Error: " => "Virhe: ",
+"Internal error" => "Sisäinen virhe",
+"Slideshow" => "Diaesitys",
"Back" => "Takaisin",
"Remove confirmation" => "Poiston vahvistus",
"Do you want to remove album" => "Tahdotko poistaa albumin",
diff --git a/apps/gallery/l10n/fr.php b/apps/gallery/l10n/fr.php
index dfd668ebe89..04421236e10 100644
--- a/apps/gallery/l10n/fr.php
+++ b/apps/gallery/l10n/fr.php
@@ -1,9 +1,9 @@
<?php $TRANSLATIONS = array(
"Pictures" => "Images",
-"Settings" => "Préférences",
-"Rescan" => "Analyser à nouveau",
-"Stop" => "Arrêter",
-"Share" => "Partager",
+"Share gallery" => "Partager la galerie",
+"Error: " => "Erreur :",
+"Internal error" => "Erreur interne",
+"Slideshow" => "Diaporama",
"Back" => "Retour",
"Remove confirmation" => "Enlever la confirmation",
"Do you want to remove album" => "Voulez-vous supprimer l'album",
diff --git a/apps/gallery/l10n/it.php b/apps/gallery/l10n/it.php
index e21a1d6524b..ef8d596e7eb 100644
--- a/apps/gallery/l10n/it.php
+++ b/apps/gallery/l10n/it.php
@@ -1,9 +1,9 @@
<?php $TRANSLATIONS = array(
"Pictures" => "Immagini",
-"Settings" => "Impostazioni",
-"Rescan" => "Nuova scansione",
-"Stop" => "Ferma",
-"Share" => "Condividi",
+"Share gallery" => "Condividi la galleria",
+"Error: " => "Errore: ",
+"Internal error" => "Errore interno",
+"Slideshow" => "Presentazione",
"Back" => "Indietro",
"Remove confirmation" => "Rimuovi conferma",
"Do you want to remove album" => "Vuoi rimuovere l'album",
diff --git a/apps/gallery/l10n/sl.php b/apps/gallery/l10n/sl.php
index 5e061239862..8d3bb9f5887 100644
--- a/apps/gallery/l10n/sl.php
+++ b/apps/gallery/l10n/sl.php
@@ -1,9 +1,9 @@
<?php $TRANSLATIONS = array(
"Pictures" => "Slike",
-"Settings" => "Nastavitve",
-"Rescan" => "Ponovno preišči",
-"Stop" => "Stop",
-"Share" => "Deli",
+"Share gallery" => "Daj galerijo v souporabo",
+"Error: " => "Napaka: ",
+"Internal error" => "Notranja napaka",
+"Slideshow" => "predstavitev",
"Back" => "Nazaj",
"Remove confirmation" => "Odstrani potrditev",
"Do you want to remove album" => "Ali želite odstraniti album",
diff --git a/apps/gallery/l10n/sv.php b/apps/gallery/l10n/sv.php
index 520d271df10..b63a89d90fc 100644
--- a/apps/gallery/l10n/sv.php
+++ b/apps/gallery/l10n/sv.php
@@ -1,9 +1,9 @@
<?php $TRANSLATIONS = array(
"Pictures" => "Bilder",
-"Settings" => "Inställningar",
-"Rescan" => "Sök igen",
-"Stop" => "Stoppa",
-"Share" => "Dela",
+"Share gallery" => "Dela galleri",
+"Error: " => "Fel:",
+"Internal error" => "Internt fel",
+"Slideshow" => "Bildspel",
"Back" => "Tillbaka",
"Remove confirmation" => "Vill du säkert ta bort",
"Do you want to remove album" => "Vill du ta bort albumet",
diff --git a/apps/gallery/l10n/vi.php b/apps/gallery/l10n/vi.php
new file mode 100644
index 00000000000..d1d7fc64fca
--- /dev/null
+++ b/apps/gallery/l10n/vi.php
@@ -0,0 +1,11 @@
+<?php $TRANSLATIONS = array(
+"Pictures" => "Hình ảnh",
+"Share gallery" => "Chia sẻ gallery",
+"Error: " => "Lỗi :",
+"Internal error" => "Lỗi nội bộ",
+"Back" => "Trở lại",
+"Remove confirmation" => "Xóa xác nhận",
+"Do you want to remove album" => "Bạn muốn xóa album này ",
+"Change album name" => "Đổi tên album",
+"New album name" => "Tên album mới"
+);
diff --git a/apps/media/l10n/vi.php b/apps/media/l10n/vi.php
new file mode 100644
index 00000000000..01942ba173f
--- /dev/null
+++ b/apps/media/l10n/vi.php
@@ -0,0 +1,14 @@
+<?php $TRANSLATIONS = array(
+"Music" => "Âm nhạc",
+"Add album to playlist" => "Thêm album vào playlist",
+"Play" => "Play",
+"Pause" => "Tạm dừng",
+"Previous" => "Trang trước",
+"Next" => "Tiếp theo",
+"Mute" => "Tắt",
+"Unmute" => "Bật",
+"Rescan Collection" => "Quét lại bộ sưu tập",
+"Artist" => "Nghệ sỹ",
+"Album" => "Album",
+"Title" => "Tiêu đề"
+);
diff --git a/apps/media/lib_ampache.php b/apps/media/lib_ampache.php
index d5a093338cc..4951399fa18 100644
--- a/apps/media/lib_ampache.php
+++ b/apps/media/lib_ampache.php
@@ -150,6 +150,7 @@ class OC_MEDIA_AMPACHE{
$users=$query->execute(array($auth))->fetchAll();
if(count($users)>0){
OC_MEDIA_COLLECTION::$uid=$users[0]['user_id'];
+ OC_User::setUserId($users[0]['user_id']);
return $users[0]['user_id'];
}else{
return false;
@@ -271,7 +272,7 @@ class OC_MEDIA_AMPACHE{
</root>");
return;
}
- $filter=$params['filter'];
+ $filter = isset($params['filter']) ? $params['filter'] : '';
$albums=OC_MEDIA_COLLECTION::getAlbums($filter);
$artist=OC_MEDIA_COLLECTION::getArtistName($filter);
echo('<?xml version="1.0" encoding="UTF-8"?>');
@@ -400,7 +401,7 @@ class OC_MEDIA_AMPACHE{
</root>");
return;
}
- $filter=$params['filter'];
+ $filter = isset($params['filter']) ? $params['filter'] : '';
$artists=OC_MEDIA_COLLECTION::getArtists($filter);
$albums=OC_MEDIA_COLLECTION::getAlbums(0,$filter);
$songs=OC_MEDIA_COLLECTION::getSongs(0,0,$filter);
diff --git a/apps/user_ldap/ajax/testConfiguration.php b/apps/user_ldap/ajax/testConfiguration.php
new file mode 100644
index 00000000000..a82f7e4c17b
--- /dev/null
+++ b/apps/user_ldap/ajax/testConfiguration.php
@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * ownCloud - user_ldap
+ *
+ * @author Arthur Schiwon
+ * @copyright 2012 Arthur Schiwon blizzz@owncloud.com
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+// Check user and app status
+OCP\JSON::checkAdminUser();
+OCP\JSON::checkAppEnabled('user_ldap');
+OCP\JSON::callCheck();
+
+$connection = new \OCA\user_ldap\lib\Connection(null);
+if($connection->setConfiguration($_POST)) {
+ //Configuration is okay
+ if($connection->bind()) {
+ OCP\JSON::success(array('message' => 'The configuration is valid and the connection could be established!'));
+ } else {
+ OCP\JSON::error(array('message' => 'The configuration is valid, but the Bind failed. Please check the server settings and credentials.'));
+ }
+} else {
+ OCP\JSON::error(array('message' => 'The configuration is invalid. Please look in the ownCloud log for further details.'));
+}
diff --git a/apps/user_ldap/group_ldap.php b/apps/user_ldap/group_ldap.php
index b9f4bdf1990..aff25593ef7 100644
--- a/apps/user_ldap/group_ldap.php
+++ b/apps/user_ldap/group_ldap.php
@@ -26,11 +26,6 @@ namespace OCA\user_ldap;
class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
protected $enabled = false;
- protected $_group_user = array();
- protected $_user_groups = array();
- protected $_group_users = array();
- protected $_groups = array();
-
public function setConnector(lib\Connection &$connection) {
parent::setConnector($connection);
if(empty($this->connection->ldapGroupFilter) || empty($this->connection->ldapGroupMemberAssocAttr)) {
@@ -51,18 +46,20 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
if(!$this->enabled) {
return false;
}
- if(isset($this->_group_user[$gid][$uid])) {
- return $this->_group_user[$gid][$uid];
+ if($this->connection->isCached('inGroup'.$uid.':'.$gid)) {
+ return $this->connection->getFromCache('inGroup'.$uid.':'.$gid);
}
$dn_user = $this->username2dn($uid);
$dn_group = $this->groupname2dn($gid);
// just in case
if(!$dn_group || !$dn_user) {
+ $this->connection->writeToCache('inGroup'.$uid.':'.$gid, false);
return false;
}
//usually, LDAP attributes are said to be case insensitive. But there are exceptions of course.
$members = $this->readAttribute($dn_group, $this->connection->ldapGroupMemberAssocAttr);
if(!$members) {
+ $this->connection->writeToCache('inGroup'.$uid.':'.$gid, false);
return false;
}
@@ -81,8 +78,10 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
$members = $dns;
}
- $this->_group_user[$gid][$uid] = in_array($dn_user, $members);
- return $this->_group_user[$gid][$uid];
+ $isInGroup = in_array($dn_user, $members);
+ $this->connection->writeToCache('inGroup'.$uid.':'.$gid, $isInGroup);
+
+ return $isInGroup;
}
/**
@@ -97,12 +96,12 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
if(!$this->enabled) {
return array();
}
- if(isset($this->_user_groups[$uid])) {
- return $this->_user_groups[$uid];
+ if($this->connection->isCached('getUserGroups'.$uid)) {
+ return $this->connection->getFromCache('getUserGroups'.$uid);
}
$userDN = $this->username2dn($uid);
if(!$userDN) {
- $this->_user_groups[$uid] = array();
+ $this->connection->writeToCache('getUserGroups'.$uid, array());
return array();
}
@@ -124,9 +123,10 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
$this->connection->ldapGroupMemberAssocAttr.'='.$uid
));
$groups = $this->fetchListOfGroups($filter, array($this->connection->ldapGroupDisplayName,'dn'));
- $this->_user_groups[$uid] = array_unique($this->ownCloudGroupNames($groups), SORT_LOCALE_STRING);
+ $groups = array_unique($this->ownCloudGroupNames($groups), SORT_LOCALE_STRING);
+ $this->connection->writeToCache('getUserGroups'.$uid, $groups);
- return $this->_user_groups[$uid];
+ return $groups;
}
/**
@@ -137,19 +137,19 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
if(!$this->enabled) {
return array();
}
- if(isset($this->_group_users[$gid])) {
- return $this->_group_users[$gid];
+ if($this->connection->isCached('usersInGroup'.$gid)) {
+ return $this->connection->getFromCache('usersInGroup'.$gid);
}
$groupDN = $this->groupname2dn($gid);
if(!$groupDN) {
- $this->_group_users[$gid] = array();
+ $this->connection->writeToCache('usersInGroup'.$gid, array());
return array();
}
$members = $this->readAttribute($groupDN, $this->connection->ldapGroupMemberAssocAttr);
if(!$members) {
- $this->_group_users[$gid] = array();
+ $this->connection->writeToCache('usersInGroup'.$gid, array());
return array();
}
@@ -173,8 +173,10 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
if(!$isMemberUid) {
$result = array_intersect($result, \OCP\User::getUsers());
}
- $this->_group_users[$gid] = array_unique($result, SORT_LOCALE_STRING);
- return $this->_group_users[$gid];
+ $groupUsers = array_unique($result, SORT_LOCALE_STRING);
+ $this->connection->writeToCache('usersInGroup'.$gid, $groupUsers);
+
+ return $groupUsers;
}
/**
@@ -187,11 +189,14 @@ class GROUP_LDAP extends lib\Access implements \OCP\GroupInterface {
if(!$this->enabled) {
return array();
}
- if(empty($this->_groups)) {
- $ldap_groups = $this->fetchListOfGroups($this->connection->ldapGroupFilter, array($this->connection->ldapGroupDisplayName, 'dn'));
- $this->_groups = $this->ownCloudGroupNames($ldap_groups);
+ if($this->connection->isCached('getGroups')) {
+ return $this->connection->getFromCache('getGroups');
}
- return $this->_groups;
+ $ldap_groups = $this->fetchListOfGroups($this->connection->ldapGroupFilter, array($this->connection->ldapGroupDisplayName, 'dn'));
+ $ldap_groups = $this->ownCloudGroupNames($ldap_groups);
+ $this->connection->writeToCache('getGroups', $ldap_groups);
+
+ return $ldap_groups;
}
/**
diff --git a/apps/user_ldap/js/settings.js b/apps/user_ldap/js/settings.js
index cae9655e3df..4e5923406ea 100644
--- a/apps/user_ldap/js/settings.js
+++ b/apps/user_ldap/js/settings.js
@@ -1,3 +1,25 @@
$(document).ready(function() {
$('#ldapSettings').tabs();
+ $('#ldap_action_test_connection').button();
+ $('#ldap_action_test_connection').click(function(event){
+ event.preventDefault();
+ $.post(
+ OC.filePath('user_ldap','ajax','testConfiguration.php'),
+ $('#ldap').serialize(),
+ function (result) {
+ if (result.status == 'success') {
+ OC.dialogs.alert(
+ result.message,
+ 'Connection test succeeded'
+ );
+ } else {
+ $('#ldap_action_test_connection').css('background-color', 'red');
+ OC.dialogs.alert(
+ result.message,
+ 'Connection test failed'
+ );
+ }
+ }
+ );
+ });
}); \ No newline at end of file
diff --git a/apps/user_ldap/lib/access.php b/apps/user_ldap/lib/access.php
index 19122b34c7d..a50afd0d602 100644
--- a/apps/user_ldap/lib/access.php
+++ b/apps/user_ldap/lib/access.php
@@ -178,7 +178,7 @@ abstract class Access {
* @param $ldapname optional, the display name of the object
* @returns string with with the name to use in ownCloud, false on DN outside of search DN
*
- * returns the internal ownCloud name for the given LDAP DN of the group
+ * returns the internal ownCloud name for the given LDAP DN of the group, false on DN outside of search DN or failure
*/
public function dn2groupname($dn, $ldapname = null) {
if(mb_strripos($dn, $this->connection->ldapBaseGroups, 0, 'UTF-8') !== (mb_strlen($dn, 'UTF-8')-mb_strlen($this->connection->ldapBaseGroups, 'UTF-8'))) {
@@ -193,7 +193,7 @@ abstract class Access {
* @param $ldapname optional, the display name of the object
* @returns string with with the name to use in ownCloud
*
- * returns the internal ownCloud name for the given LDAP DN of the user, false on DN outside of search DN
+ * returns the internal ownCloud name for the given LDAP DN of the user, false on DN outside of search DN or failure
*/
public function dn2username($dn, $ldapname = null) {
if(mb_strripos($dn, $this->connection->ldapBaseUsers, 0, 'UTF-8') !== (mb_strlen($dn, 'UTF-8')-mb_strlen($this->connection->ldapBaseUsers, 'UTF-8'))) {
@@ -233,6 +233,10 @@ abstract class Access {
if(is_null($ldapname)) {
$ldapname = $this->readAttribute($dn, $nameAttribute);
+ if(!isset($ldapname[0]) && empty($ldapname[0])) {
+ \OCP\Util::writeLog('user_ldap', 'No or empty name for '.$dn.'.', \OCP\Util::INFO);
+ return false;
+ }
$ldapname = $ldapname[0];
}
$ldapname = $this->sanitizeUsername($ldapname);
@@ -248,9 +252,8 @@ abstract class Access {
return $oc_name;
}
- //TODO: do not simple die away!
- //and this of course should never been thrown :)
- throw new Exception('LDAP backend: unexpected collision of DN and ownCloud Name.');
+ //if everything else did not help..
+ OCP\Util::writeLog('user_ldap', 'Could not create unique ownCloud name for '.$dn.'.', \OCP\Util::INFO);
}
/**
@@ -294,6 +297,12 @@ abstract class Access {
continue;
}
+ //we do not take empty usernames
+ if(!isset($ldapObject[$nameAttribute]) || empty($ldapObject[$nameAttribute])) {
+ \OCP\Util::writeLog('user_ldap', 'No or empty name for '.$ldapObject['dn'].', skipping.', \OCP\Util::INFO);
+ continue;
+ }
+
//a new group! Then let's try to add it. We're shooting into the blue with the group name, assuming that in most cases there will not be a conflict. But first make sure, that the display name contains only allowed characters.
$ocname = $this->sanitizeUsername($ldapObject[$nameAttribute]);
if($this->mapComponent($ldapObject['dn'], $ocname, $isUsers)) {
@@ -308,9 +317,8 @@ abstract class Access {
continue;
}
- //TODO: do not simple die away
- //and this of course should never been thrown :)
- throw new Exception('LDAP backend: unexpected collision of DN and ownCloud Name.');
+ //if everything else did not help..
+ \OCP\Util::writeLog('user_ldap', 'Could not create unique ownCloud name for '.$ldapObject['dn'].', skipping.', \OCP\Util::INFO);
}
return $ownCloudNames;
}
diff --git a/apps/user_ldap/lib/connection.php b/apps/user_ldap/lib/connection.php
index e54a8e2b241..a84174d1dfd 100644
--- a/apps/user_ldap/lib/connection.php
+++ b/apps/user_ldap/lib/connection.php
@@ -28,7 +28,10 @@ class Connection {
private $configID;
private $configured = false;
- //cached settings
+ //cache handler
+ protected $cache;
+
+ //settings
protected $config = array(
'ldapHost' => null,
'ldapPort' => null,
@@ -48,10 +51,12 @@ class Connection {
'ldapQuotaAttribute' => null,
'ldapQuotaDefault' => null,
'ldapEmailAttribute' => null,
+ 'ldapCacheTTL' => null,
);
public function __construct($configID = 'user_ldap') {
$this->configID = $configID;
+ $this->cache = \OC_Cache::getGlobalCache();
}
public function __destruct() {
@@ -92,6 +97,57 @@ class Connection {
return $this->ldapConnectionRes;
}
+ private function getCacheKey($key) {
+ $prefix = 'LDAP-'.$this->configID.'-';
+ if(is_null($key)) {
+ return $prefix;
+ }
+ return $prefix.md5($key);
+ }
+
+ public function getFromCache($key) {
+ if(!$this->configured) {
+ $this->readConfiguration();
+ }
+ if(!$this->config['ldapCacheTTL']) {
+ return null;
+ }
+ if(!$this->isCached($key)) {
+ return null;
+
+ }
+ $key = $this->getCacheKey($key);
+
+ return unserialize(base64_decode($this->cache->get($key)));
+ }
+
+ public function isCached($key) {
+ if(!$this->configured) {
+ $this->readConfiguration();
+ }
+ if(!$this->config['ldapCacheTTL']) {
+ return false;
+ }
+ $key = $this->getCacheKey($key);
+ return $this->cache->hasKey($key);
+ }
+
+ public function writeToCache($key, $value) {
+ if(!$this->configured) {
+ $this->readConfiguration();
+ }
+ if(!$this->config['ldapCacheTTL']) {
+ return null;
+ }
+ $key = $this->getCacheKey($key);
+ $value = base64_encode(serialize($value));
+ $this->cache->set($key, $value, $this->config['ldapCacheTTL']);
+ }
+
+ public function clearCache() {
+ $this->cache->clear($this->getCacheKey(null));
+ }
+
/**
* Caches the general LDAP configuration.
*/
@@ -110,14 +166,15 @@ class Connection {
$this->config['ldapNoCase'] = \OCP\Config::getAppValue($this->configID, 'ldap_nocase', 0);
$this->config['ldapUserDisplayName'] = mb_strtolower(\OCP\Config::getAppValue($this->configID, 'ldap_display_name', 'uid'), 'UTF-8');
$this->config['ldapUserFilter'] = \OCP\Config::getAppValue($this->configID, 'ldap_userlist_filter','objectClass=person');
- $this->config['ldapGroupFilter'] = \OCP\Config::getAppValue($this->configID, 'ldap_group_filter','(objectClass=posixGroup)');
+ $this->config['ldapGroupFilter'] = \OCP\Config::getAppValue($this->configID, 'ldap_group_filter','(objectClass=posixGroup)');
$this->config['ldapLoginFilter'] = \OCP\Config::getAppValue($this->configID, 'ldap_login_filter', '(uid=%uid)');
$this->config['ldapGroupDisplayName'] = mb_strtolower(\OCP\Config::getAppValue($this->configID, 'ldap_group_display_name', 'uid'), 'UTF-8');
$this->config['ldapQuotaAttribute'] = \OCP\Config::getAppValue($this->configID, 'ldap_quota_attr', '');
$this->config['ldapQuotaDefault'] = \OCP\Config::getAppValue($this->configID, 'ldap_quota_def', '');
- $this->config['ldapEmailAttribute'] = \OCP\Config::getAppValue($this->configID, 'ldap_email_attr', '');
- $this->config['ldapGroupMemberAssocAttr'] = \OCP\Config::getAppValue($this->configID, 'ldap_group_member_assoc_attribute', 'uniqueMember');
+ $this->config['ldapEmailAttribute'] = \OCP\Config::getAppValue($this->configID, 'ldap_email_attr', '');
+ $this->config['ldapGroupMemberAssocAttr'] = \OCP\Config::getAppValue($this->configID, 'ldap_group_member_assoc_attribute', 'uniqueMember');
$this->config['ldapIgnoreNamingRules'] = \OCP\Config::getSystemValue('ldapIgnoreNamingRules', false);
+ $this->config['ldapCacheTTL'] = \OCP\Config::getAppValue($this->configID, 'ldap_cache_ttl', 10*60);
$this->configured = $this->validateConfiguration();
}
@@ -134,12 +191,21 @@ class Connection {
return false;
}
+ $params = array('ldap_host'=>'ldapHost', 'ldap_port'=>'ldapPort', 'ldap_dn'=>'ldapAgentName', 'ldap_agent_password'=>'ldapAgentPassword', 'ldap_base'=>'ldapBase', 'ldap_base_users'=>'ldapBaseUsers', 'ldap_base_groups'=>'ldapBaseGroups', 'ldap_userlist_filter'=>'ldapUserFilter', 'ldap_login_filter'=>'ldapLoginFilter', 'ldap_group_filter'=>'ldapGroupFilter', 'ldap_display_name'=>'ldapUserDisplayName', 'ldap_group_display_name'=>'ldapGroupDisplayName',
+
+ 'ldap_tls'=>'ldapTLS', 'ldap_nocase'=>'ldapNoCase', 'ldap_quota_def'=>'ldapQuotaDefault', 'ldap_quota_attr'=>'ldapQuotaAttribute', 'ldap_email_attr'=>'ldapEmailAttribute', 'ldap_group_member_assoc_attribute'=>'ldapGroupMemberAssocAttr', 'ldap_cache_ttl'=>'ldapCacheTTL');
+
foreach($config as $parameter => $value) {
if(isset($this->config[$parameter])) {
$this->config[$parameter] = $value;
if(is_array($setParameters)) {
$setParameters[] = $parameter;
}
+ } else if(isset($params[$parameter])) {
+ $this->config[$params[$parameter]] = $value;
+ if(is_array($setParameters)) {
+ $setParameters[] = $params[$parameter];
+ }
}
}
diff --git a/apps/user_ldap/settings.php b/apps/user_ldap/settings.php
index 42084855e85..135c735e703 100644
--- a/apps/user_ldap/settings.php
+++ b/apps/user_ldap/settings.php
@@ -20,7 +20,7 @@
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
-$params = array('ldap_host', 'ldap_port', 'ldap_dn', 'ldap_agent_password', 'ldap_base', 'ldap_base_users', 'ldap_base_groups', 'ldap_userlist_filter', 'ldap_login_filter', 'ldap_group_filter', 'ldap_display_name', 'ldap_group_display_name', 'ldap_tls', 'ldap_nocase', 'ldap_quota_def', 'ldap_quota_attr', 'ldap_email_attr', 'ldap_group_member_assoc_attribute');
+$params = array('ldap_host', 'ldap_port', 'ldap_dn', 'ldap_agent_password', 'ldap_base', 'ldap_base_users', 'ldap_base_groups', 'ldap_userlist_filter', 'ldap_login_filter', 'ldap_group_filter', 'ldap_display_name', 'ldap_group_display_name', 'ldap_tls', 'ldap_nocase', 'ldap_quota_def', 'ldap_quota_attr', 'ldap_email_attr', 'ldap_group_member_assoc_attribute', 'ldap_cache_ttl');
OCP\Util::addscript('user_ldap', 'settings');
@@ -29,18 +29,23 @@ if ($_POST) {
if(isset($_POST[$param])){
if('ldap_agent_password' == $param) {
OCP\Config::setAppValue('user_ldap', $param, base64_encode($_POST[$param]));
+ } elseif('ldap_cache_ttl' == $param) {
+ if(OCP\Config::getAppValue('user_ldap', $param,'') != $_POST[$param]) {
+ $ldap = new \OCA\user_ldap\lib\Connection('user_ldap');
+ $ldap->clearCache();
+ OCP\Config::setAppValue('user_ldap', $param, $_POST[$param]);
+ }
} else {
OCP\Config::setAppValue('user_ldap', $param, $_POST[$param]);
}
}
elseif('ldap_tls' == $param) {
// unchecked checkboxes are not included in the post paramters
- OCP\Config::setAppValue('user_ldap', $param, 0);
+ OCP\Config::setAppValue('user_ldap', $param, 0);
}
elseif('ldap_nocase' == $param) {
OCP\Config::setAppValue('user_ldap', $param, 0);
}
-
}
}
@@ -57,5 +62,6 @@ $tmpl->assign( 'ldap_display_name', OCP\Config::getAppValue('user_ldap', 'ldap_d
$tmpl->assign( 'ldap_group_display_name', OCP\Config::getAppValue('user_ldap', 'ldap_group_display_name', 'cn'));
$tmpl->assign( 'ldap_group_member_assoc_attribute', OCP\Config::getAppValue('user_ldap', 'ldap_group_member_assoc_attribute', 'uniqueMember'));
$tmpl->assign( 'ldap_agent_password', base64_decode(OCP\Config::getAppValue('user_ldap', 'ldap_agent_password')));
+$tmpl->assign( 'ldap_cache_ttl', OCP\Config::getAppValue('user_ldap', 'ldap_cache_ttl', '600'));
return $tmpl->fetchPage();
diff --git a/apps/user_ldap/templates/settings.php b/apps/user_ldap/templates/settings.php
index 31f453b5a5a..893d93c3c42 100644
--- a/apps/user_ldap/templates/settings.php
+++ b/apps/user_ldap/templates/settings.php
@@ -26,8 +26,9 @@
<p><label for="ldap_quota_attr">Quota Attribute</label><input type="text" id="ldap_quota_attr" name="ldap_quota_attr" value="<?php echo $_['ldap_quota_attr']; ?>" />
<label for="ldap_quota_def">Quota Default</label><input type="text" id="ldap_quota_def" name="ldap_quota_def" value="<?php if (isset($_['ldap_quota_def'])) echo $_['ldap_quota_def']; ?>" />bytes</p>
<p><label for="ldap_email_attr">Email Attribute</label><input type="text" id="ldap_email_attr" name="ldap_email_attr" value="<?php echo $_['ldap_email_attr']; ?>" /></p>
+ <p><label for="ldap_cache_ttl">Cache Time-To-Live</label><input type="text" id="ldap_cache_ttl" name="ldap_cache_ttl" value="<?php echo $_['ldap_cache_ttl']; ?>" /><small><?php echo $l->t('in seconds');?></small></p>
</fieldset>
- <input type="submit" value="Save" /> <a href="http://owncloud.org/support/ldap-backend/" target="_blank"><img src="<?php echo OCP\Util::imagePath('','actions/info.png'); ?>" style="height:1.75ex" /> <?php echo $l->t('Help');?></a>
+ <input type="submit" value="Save" /> <button id="ldap_action_test_connection" name="ldap_action_test_connection">Test Configuration</button> <a href="http://owncloud.org/support/ldap-backend/" target="_blank"><img src="<?php echo OCP\Util::imagePath('','actions/info.png'); ?>" style="height:1.75ex" /> <?php echo $l->t('Help');?></a>
</div>
</form>
diff --git a/apps/user_ldap/user_ldap.php b/apps/user_ldap/user_ldap.php
index a4a8921d08d..2059d5b0c6d 100644
--- a/apps/user_ldap/user_ldap.php
+++ b/apps/user_ldap/user_ldap.php
@@ -27,12 +27,6 @@ namespace OCA\user_ldap;
class USER_LDAP extends lib\Access implements \OCP\UserInterface {
- // will be retrieved from LDAP server
- protected $ldap_dc = false;
-
- // cache getUsers()
- protected $_users = null;
-
private function updateQuota($dn) {
$quota = null;
if(!empty($this->connection->ldapQuotaDefault)) {
@@ -85,12 +79,19 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
return false;
}
- //update some settings, if necessary
- $this->updateQuota($dn);
- $this->updateEmail($dn);
+ //do we have a username for him/her?
+ $ocname = $this->dn2username($dn);
+
+ if($ocname){
+ //update some settings, if necessary
+ $this->updateQuota($dn);
+ $this->updateEmail($dn);
+
+ //give back the display name
+ return $ocname;
+ }
- //give back the display name
- return $this->dn2username($dn);
+ return false;
}
/**
@@ -100,11 +101,13 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
* Get a list of all users.
*/
public function getUsers(){
- if(is_null($this->_users)) {
+ $ldap_users = $this->connection->getFromCache('getUsers');
+ if(is_null($ldap_users)) {
$ldap_users = $this->fetchListOfUsers($this->connection->ldapUserFilter, array($this->connection->ldapUserDisplayName, 'dn'));
- $this->_users = $this->ownCloudUserNames($ldap_users);
+ $ldap_users = $this->ownCloudUserNames($ldap_users);
+ $this->connection->writeToCache('getUsers', $ldap_users);
}
- return $this->_users;
+ return $ldap_users;
}
/**
@@ -113,18 +116,25 @@ class USER_LDAP extends lib\Access implements \OCP\UserInterface {
* @return boolean
*/
public function userExists($uid){
+ if($this->connection->isCached('userExists'.$uid)) {
+ return $this->connection->getFromCache('userExists'.$uid);
+ }
+
//getting dn, if false the user does not exist. If dn, he may be mapped only, requires more checking.
$dn = $this->username2dn($uid);
if(!$dn) {
+ $this->connection->writeToCache('userExists'.$uid, false);
return false;
}
//if user really still exists, we will be able to read his cn
$cn = $this->readAttribute($dn, 'cn');
if(!$cn || empty($cn)) {
+ $this->connection->writeToCache('userExists'.$uid, false);
return false;
}
+ $this->connection->writeToCache('userExists'.$uid, true);
return true;
}