diff --git a/appinfo/app.php b/appinfo/app.php index 24e28b30..a5e66a3d 100644 --- a/appinfo/app.php +++ b/appinfo/app.php @@ -5,6 +5,7 @@ OC::$CLASSPATH['OCA\Contacts\VCard'] = 'contacts/lib/vcard.php'; OC::$CLASSPATH['OCA\Contacts\Hooks'] = 'contacts/lib/hooks.php'; OC::$CLASSPATH['OCA\Contacts\Share_Backend_Contact'] = 'contacts/lib/share/contact.php'; OC::$CLASSPATH['OCA\Contacts\Share_Backend_Addressbook'] = 'contacts/lib/share/addressbook.php'; +OC::$CLASSPATH['OCA\Contacts\AddressbookProvider'] = 'contacts/lib/addressbookprovider.php'; OC::$CLASSPATH['OC_Connector_Sabre_CardDAV'] = 'contacts/lib/sabre/backend.php'; OC::$CLASSPATH['OC_Connector_Sabre_CardDAV_AddressBookRoot'] = 'contacts/lib/sabre/addressbookroot.php'; OC::$CLASSPATH['OC_Connector_Sabre_CardDAV_UserAddressBooks'] = 'contacts/lib/sabre/useraddressbooks.php'; @@ -27,3 +28,7 @@ OCP\Util::addscript('contacts', 'loader'); OC_Search::registerProvider('OCA\Contacts\SearchProvider'); OCP\Share::registerBackend('contact', 'OCA\Contacts\Share_Backend_Contact'); OCP\Share::registerBackend('addressbook', 'OCA\Contacts\Share_Backend_Addressbook', 'contact'); + +foreach(OCA\Contacts\Addressbook::all(OCP\USER::getUser()) as $addressbook) { + OCP\Contacts::registerAddressBook(new OCA\Contacts\AddressbookProvider($addressbook['id'])); +} \ No newline at end of file diff --git a/css/contacts.css b/css/contacts.css index 2f1e8e93..653a33ef 100644 --- a/css/contacts.css +++ b/css/contacts.css @@ -3,7 +3,8 @@ #content li { cursor: default; } #content input[type=checkbox] { height: 14px; width: 14px; - border: 1px solid #fff; + border: 0px solid #fff; + background-color: white; -moz-appearance:none; -webkit-appearance: none; -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; -moz-border-radius: 2px; -webkit-border-radius: 2px; border-radius: 2px; @@ -17,8 +18,8 @@ content: url('%appswebroot%/contacts/img/checkmark.png'); display: block; position: relative; - top: -8px; - left: -6px; + top: -2px; + left: -1px; } #content input[type=radio]:checked::after { content: url('%appswebroot%/contacts/img/checkmark.png'); @@ -35,14 +36,17 @@ #content input:-ms-input-placeholder { color: #aaa; } #content input:placeholder { color: #aaa; } -#content input:not([type="checkbox"]), #content select, #content textarea { +#content input:not([type="checkbox"]), #content select:not(.button), #content textarea { background-color: #fefefe; border: 1px solid #fff !important; -moz-appearance:none !important; -webkit-appearance: none !important; -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; -moz-border-radius: 0px; -webkit-border-radius: 0px; border-radius: 0px; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; float: left; + width: auto; } +#content input[type="button"]:hover, #content select:hover, #content select:focus, #content select:active, #content input[type="button"]:focus, #content .button:hover, button:hover { background-color:#fff; color:#333; } + #content fieldset, #content div, #content span, #content section { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; } @@ -92,7 +96,7 @@ } #groupactions { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; height: 4em; border-bottom: 1px solid #DDDDDD; } -#groupactions > button, .addcontact, .import-upload-button, .doImport { +/*#groupactions > button, .addcontact, .import-upload-button, .doImport { -moz-border-bottom-colors: none; -moz-border-left-colors: none; -moz-border-right-colors: none; @@ -106,7 +110,7 @@ color: #fff; border-right: medium none; margin: .7em 2em; -} +}*/ #grouplist { z-index: 100; } #grouplist h3 .action:not(.starred):not(.checked):not(.favorite) { float: right; display: none; padding: 0; margin: auto; } @@ -128,26 +132,69 @@ dl.form { display: block; width: auto; margin: 0; padding: 0; cursor: normal; } .form dt { display: table-cell; clear: left; float: left; width: 7em; margin: 0; padding: 0.8em 0.5em 0 0; text-align:right; text-overflow:ellipsis; o-text-overflow: ellipsis; vertical-align: text-bottom; color: #bbb;/* white-space: pre-wrap; white-space: -moz-pre-wrap !important; white-space: -pre-wrap; white-space: -o-pre-wrap;*/ } .form dd { display: table-cell; clear: right; float: left; margin: 0; padding: 0; white-space: nowrap; vertical-align: text-bottom; } -.action { display: inline-block; width: 22px; height: 22px; padding: 0; margin: 0; cursor: pointer; } + /* override the default margin on share dropdown */ #dropdown { margin: 1.5em 0; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; width: 100%; } -.add { background:url('%webroot%/core/img/actions/add.svg') no-repeat center; clear: both; } -.delete { background:url('%webroot%/core/img/actions/delete.png') no-repeat center; } -.edit { background:url('%webroot%/core/img/actions/rename.svg') no-repeat center; } -.share { background:url('%webroot%/core/img/actions/share.svg') no-repeat center; } -.mail { background:url('%webroot%/core/img/actions/mail.svg') no-repeat center; } -.upload { background:url('%webroot%/core/img/actions/upload.svg') no-repeat center; } -.download { background:url('%webroot%/core/img/actions/download.svg') no-repeat center; } -.cloud { background:url('%webroot%/core/img/places/picture.svg') no-repeat center; } -.globe { background:url('%webroot%/core/img/actions/public.svg') no-repeat center; } -.starred { background:url('%appswebroot%/contacts/img/starred.png') no-repeat center; } -.checked { background:url('%appswebroot%/contacts/img/checkmark-green.png') no-repeat center; } -.checked.disabled { background:url('%appswebroot%/contacts/img/checkmark-gray.png') no-repeat center; cursor: default; } + +.action, .icon { + display: inline-block; + cursor: pointer; + background-repeat: no-repeat; +} +.action:not(.text), .icon:not(.text) { + width: 16px; height: 16px; + padding: 0; margin: 0; + background-position: center; +} + +.action.text, .icon.text { + background-position: left; + text-indent: 18px; +} + +/* TODO: Use @import url('%appswebroot%/contacts/css/[no-]svg.css); instead. */ + +.no-svg .add { background-image:url('%webroot%/core/img/actions/add.png'); } +.no-svg .delete { background-image:url('%webroot%/core/img/actions/delete.png'); } +.no-svg .edit { background-image:url('%webroot%/core/img/actions/rename.png'); } +.no-svg .share { background-image:url('%webroot%/core/img/actions/share.png'); } +.no-svg .groups { background-image:url('%webroot%/core/img/actions/shared.png'); } +.no-svg .mail { background-image:url('%webroot%/core/img/actions/mail.png'); } +.no-svg .import, .no-svg .upload { background-image:url('%webroot%/core/img/actions/upload.png'); } +.no-svg .export, .no-svg .download { background-image:url('%webroot%/core/img/actions/download.png'); } +.no-svg .cloud:not { background-image:url('%webroot%/core/img/places/picture.png'); } +.no-svg .globe:not { background-image:url('%webroot%/core/img/actions/public.png'); } +.no-svg .starred { background-image:url('%appswebroot%/contacts/img/starred.png'); background-size: contain; } +.no-svg .checked { background-image:url('%appswebroot%/contacts/img/checkmark-green.png'); } +.no-svg .checked.disabled { background-image:url('%appswebroot%/contacts/img/checkmark-gray.png'); cursor: default; } + +.svg .action:not(.text), .svg .icon:not(.text), .svg .svg:not(.text) { + background-size: contain; +} +.svg .action.text, .svg .icon.text, .svg .svg.text { + background-size: 16px 16px; + background-origin: content-box; + background-repeat: no-repeat; +} +.svg .add { background-image:url('%webroot%/core/img/actions/add.svg'); } +.svg .delete { background-image:url('%webroot%/core/img/actions/delete.svg'); } +.svg .edit { background-image:url('%webroot%/core/img/actions/rename.svg'); } +.svg .share { background-image:url('%webroot%/core/img/actions/share.svg'); } +.svg .groups { background-image:url('%webroot%/core/img/actions/shared.svg'); } +.svg .mail { background-image:url('%webroot%/core/img/actions/mail.svg'); } +.svg .import,.svg .upload { background-image:url('%webroot%/core/img/actions/upload.svg'); } +.svg .export,.svg .download { background-image:url('%webroot%/core/img/actions/download.svg'); } +.svg .cloud { background-image:url('%webroot%/core/img/places/picture.svg'); } +.svg .globe { background-image:url('%webroot%/core/img/actions/public.svg'); } +.svg .starred { background-image:url('%appswebroot%/contacts/img/starred.svg'); background-size: contain; } +.svg .checked { background-image:url('%appswebroot%/contacts/img/checkmark-green.svg'); } +.svg .checked.disabled { background-image:url('%appswebroot%/contacts/img/checkmark-gray.svg'); cursor: default; } + .transparent{ opacity: 0.6; } .float { float: left; display: inline-block; width: auto; } .float.right { float: right; } .break { clear: both; } -.loading { background: url('%webroot%/core/img/loading.gif') no-repeat center !important; /*cursor: progress; */ cursor: wait; } +.loading { background: url('%webroot%/core/img/loading.gif') no-repeat center !important; cursor: wait; } .wait { opacity: cursor: wait; } .control { border: 1px solid #DDDDDD; @@ -201,7 +248,7 @@ ul.propertylist { width: 450px; } .propertylist li.propertycontainer .listactions a { display: inline-block; float: left; clear: none; - width: 20px; height: 20px; + width: 16px; height: 16px; } .propertylist { float: left; } @@ -216,7 +263,7 @@ ul.propertylist { width: 450px; } .select_wrapper select:hover { overflow: inherit; text-overflow: inherit; } .select_wrapper select option { color: #777; } .select_wrapper select:hover,.propertylist li > select:focus,.propertylist li > select:active { color: #777; } -.select_wrapper select.rtl { margin-left: -24px; direction: rtl; } +.select_wrapper select.rtl { margin-left: -24px; text-align: right; } .select_wrapper select.ltr { margin-right: -23px; } .propertylist li > input[type="checkbox"].impp { clear: none; } .propertylist li > label.xab { display: block; color: #bbb; float:left; clear: both; padding: 0.5em 0 0 2.5em; } @@ -262,7 +309,7 @@ ul.propertylist { width: 450px; } #contacts-settings .settings { width: 20px; height: 20px; float: left; - background:url('%webroot%/core/img/actions/settings.svg') no-repeat center; + background-image:url('%webroot%/core/img/actions/settings.svg'); } #contacts-settings.open { height: auto; @@ -301,7 +348,7 @@ ul.propertylist { width: 450px; } z-index: 1001; } .import-upload-button { - background-image: url("%webroot%/core/img/actions/upload-white.svg"); + background-image: url("%webroot%/core/img/actions/upload.svg"); background-position: center center; background-repeat: no-repeat; cursor: pointer; @@ -315,8 +362,19 @@ ul.propertylist { width: 450px; } .doImport{ margin: auto; } #toggle_all { position: absolute; bottom: .5em; left: .8em; } -input.propertytype { float: left; font-size: .8em; width: 8em !important; text-align: right; } -.contactphoto { float: left; display: inline-block; border-radius: 0.3em; border: thin solid #bbb; margin: 0.5em; background: url('%webroot%/core/img/loading.gif') no-repeat center center; -moz-box-shadow: 0 1px 3px #777; -webkit-box-shadow: 0 1px 3px #777; box-shadow: 0 1px 3px #777; opacity: 1; } +input:not([type="checkbox"]).propertytype { + float: left; font-size: .8em; + max-width: 100px; + text-align: right; + margin: 0; +} +input[type="checkbox"].propertytype { width: 10px; } +.contactphoto { + float: left; display: inline-block; + border-radius: 0.3em; border: thin solid #bbb; + margin: 0.5em; -moz-box-shadow: 0 1px 3px #777; -webkit-box-shadow: 0 1px 3px #777; box-shadow: 0 1px 3px #777; + opacity: 1; +} .contactphoto:hover { background: #fff; cursor: default; } #photowrapper { display: inline-block; @@ -330,18 +388,24 @@ input.propertytype { float: left; font-size: .8em; width: 8em !important; text-a display: inline-block; float: right; position: absolute; - right: -8px; top: -8px; + right: -6px; top: -6px; width: 25px; height: 25px; } -#photowrapper.wait { opacity: 0.6; filter:alpha(opacity=0.6); z-index:1000; background: url('%webroot%/core/img/loading.gif') no-repeat center; cursor: wait; } -#phototools { position:absolute; margin: 5px 0 0 10px; width:auto; height:22px; padding:0px; background-color:#fff; list-style-type:none; border-radius: 0.3em; -moz-box-shadow: 0 1px 3px #777; -webkit-box-shadow: 0 1px 3px #777; box-shadow: 0 1px 3px #777; } +#photowrapper.wait { opacity: 0.6; filter:alpha(opacity=0.6); z-index:1000; background-image: url('%webroot%/core/img/loading.gif'); cursor: wait; } +#phototools { position:absolute; margin: 5px 0 0 10px; width:auto; height:20px; padding:2px; background-color:#fff; list-style-type:none; border-radius: 0.3em; -moz-box-shadow: 0 1px 3px #777; -webkit-box-shadow: 0 1px 3px #777; box-shadow: 0 1px 3px #777; } #phototools li { display: inline; } -#phototools li a { float:left; cursor:pointer; width:22px; height:22px; opacity: 0.6; } +#phototools li a { float:left; opacity: 0.6; } #phototools li a:hover { opacity: 0.8; } #contactphoto_fileupload, #import_fileupload { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0; z-index:1001; } -.favorite { display: inline-block; float: left; height: 20px; width: 20px; background:url('%appswebroot%/contacts/img/inactive_star.png') no-repeat center; } -.favorite.active, .favorite:hover { background:url('%appswebroot%/contacts/img/active_star.png') no-repeat center; } -.favorite.inactive { background:url('%appswebroot%/contacts/img/inactive_star.png') no-repeat center; } + +.no-svg .favorite { display: inline-block; float: left; height: 20px; width: 20px; background-image:url('%appswebroot%/contacts/img/inactive_star.png'); } +.no-svg .favorite.active, .favorite:hover { background-image:url('%appswebroot%/contacts/img/active_star.png'); } +.no-svg .favorite.inactive { background-image:url('%appswebroot%/contacts/img/inactive_star.png'); } + +.svg .favorite { display: inline-block; float: left; height: 20px; width: 20px; background-image:url('%appswebroot%/contacts/img/inactive_star.svg'); } +.svg .favorite.active, .favorite:hover { background-image:url('%appswebroot%/contacts/img/active_star.svg'); } +.svg .favorite.inactive { background-image:url('%appswebroot%/contacts/img/inactive_star.svg'); } + /* Header */ #contactsheader { @@ -357,9 +421,13 @@ input.propertytype { float: left; font-size: .8em; width: 8em !important; text-a height: 100%; width: 100%; } #contactsheader button, #contactsheader select { position: relative; float: left; min-width: 26px; height: 26px; margin: .7em; padding: .2em; clear: none; } -#contactsheader .back { } -#contactsheader .import { background:url('%webroot%/core/img/actions/upload.svg') no-repeat center; } -#contactsheader .delete { background:url('%webroot%/core/img/actions/delete.svg') no-repeat center; float: right;} +#contactsheader .delete { + bottom: 0.5em; + right: 1em; + position: absolute; + background-image:url('%webroot%/core/img/actions/delete.svg'); +} +.no-svg #contactsheader .delete { background-image:url('%webroot%/core/img/actions/delete.vg'); float: right;} #contactsheader .list.add { margin-left: 5em; } @@ -382,8 +450,8 @@ input.propertytype { float: left; font-size: .8em; width: 8em !important; text-a /*display: table-cell;*/ } -.display .meta { text-align: right; } -.display .adr { cursor: pointer; } +.display .meta { text-align: right; margin-left: -30px; } +.display .adr { cursor: pointer; margin-left: 30px; } .adr.editor { width: 20em; margin-left: 120px; @@ -416,9 +484,9 @@ input.propertytype { float: left; font-size: .8em; width: 8em !important; text-a #contactlist tr > td.name>input[type="checkbox"]:hover:first-child { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=80)"; filter:alpha(opacity=80); opacity:.8; } #contactlist tr > td.name>input[type="checkbox"]:checked:first-child { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter:alpha(opacity=100); opacity:1; } #contactlist tr > td.name { font-weight: bold; text-indent: 1.6em; -webkit-transition:background-image 500ms; -moz-transition:background-image 500ms; -o-transition:background-image 500ms; transition:background-image 500ms; position:relative; background-position:1em .5em !important; background-repeat:no-repeat !important; } -#contactlist tr > td a.mailto { position: absolute; float: right; clear: none; cursor:pointer; width:22px; height:22px; z-index: 200; opacity: 0.6; background:url('%webroot%/core/img/actions/mail.svg') no-repeat center; } +#contactlist tr > td a.mailto { position: absolute; float: right; clear: none; cursor:pointer; width:16px; height:16px; margin: 2px; z-index: 200; opacity: 0.6; background-image:url('%webroot%/core/img/actions/mail.svg'); } #contactlist tr > td a.mailto:hover { opacity: 0.8; } -#contactlist.dim { background: #ddd; opacity: .50;filter:Alpha(Opacity=50); } +#contactlist.dim { background-image: #ddd; opacity: .50;filter:Alpha(Opacity=50); } #contact { background-color: white; color: #333333; @@ -443,7 +511,7 @@ input.propertytype { float: left; font-size: .8em; width: 8em !important; text-a -ms-transform: rotate(270deg); transform: rotate(270deg); } -#contact figure img { -moz-border-radius:.3em; -webkit-border-radius:.3em; border-radius:.3em; border: thin solid #bbb; margin: 0.3em; background: url('%webroot%/core/img/loading.gif') no-repeat center center; -moz-box-shadow: 0 1px 3px #777; -webkit-box-shadow: 0 1px 3px #777; box-shadow: 0 1px 3px #777; opacity: 1; } +#contact figure img { -moz-border-radius:.3em; -webkit-border-radius:.3em; border-radius:.3em; border: thin solid #bbb; margin: 0.3em; background-image: url('%webroot%/core/img/loading.gif'); -moz-box-shadow: 0 1px 3px #777; -webkit-box-shadow: 0 1px 3px #777; box-shadow: 0 1px 3px #777; opacity: 1; } #contact span.adr { diff --git a/export.php b/export.php index 8d00451b..588a6df7 100644 --- a/export.php +++ b/export.php @@ -11,10 +11,11 @@ OCP\User::checkLoggedIn(); OCP\App::checkAppEnabled('contacts'); $bookid = isset($_GET['bookid']) ? $_GET['bookid'] : null; $contactid = isset($_GET['contactid']) ? $_GET['contactid'] : null; +$selectedids = isset($_GET['selectedids']) ? $_GET['selectedids'] : null; $nl = "\n"; if(!is_null($bookid)) { try { - $addressbook = OCA\Contacts\Addressbook::find($bookid); // is owner access check + $addressbook = OCA\Contacts\Addressbook::find($bookid); } catch(Exception $e) { OCP\JSON::error( array( @@ -25,7 +26,7 @@ if(!is_null($bookid)) { ); exit(); } - //$cardobjects = OCA\Contacts\VCard::all($bookid); + header('Content-Type: text/directory'); header('Content-Disposition: inline; filename=' . str_replace(' ', '_', $addressbook['displayname']) . '.vcf'); @@ -34,7 +35,7 @@ if(!is_null($bookid)) { $batchsize = OCP\Config::getUserValue(OCP\User::getUser(), 'contacts', 'export_batch_size', 20); - while($cardobjects = OCA\Contacts\VCard::all($bookid, $start, $batchsize)) { + while($cardobjects = OCA\Contacts\VCard::all($bookid, $start, $batchsize, array('carddata'))) { foreach($cardobjects as $card) { echo $card['carddata'] . $nl; } @@ -57,4 +58,19 @@ if(!is_null($bookid)) { header('Content-Disposition: inline; filename=' . str_replace(' ', '_', $data['fullname']) . '.vcf'); echo $data['carddata']; +} elseif(!is_null($selectedids)) { + $selectedids = explode(',', $selectedids); + $l10n = \OC_L10N::get('contacts'); + header('Content-Type: text/directory'); + header('Content-Disposition: inline; filename=' + . $l10n->t('%d_selected_contacts', array(count($selectedids))) . '.vcf'); + + foreach($selectedids as $id) { + try { + $data = OCA\Contacts\VCard::find($id); + echo $data['carddata'] . $nl; + } catch(Exception $e) { + continue; + } + } } diff --git a/img/active_star.svg b/img/active_star.svg new file mode 100644 index 00000000..badb81b9 --- /dev/null +++ b/img/active_star.svg @@ -0,0 +1,78 @@ + + + + diff --git a/img/inactive_star.svg b/img/inactive_star.svg new file mode 100644 index 00000000..f62c6b03 --- /dev/null +++ b/img/inactive_star.svg @@ -0,0 +1,78 @@ + + + + diff --git a/js/app.js b/js/app.js index 42cd2eb3..c9f589da 100644 --- a/js/app.js +++ b/js/app.js @@ -460,6 +460,10 @@ GroupList.prototype.deleteGroup = function(groupid, cb) { GroupList.prototype.editGroup = function(id) { var self = this; + if(this.$editelem) { + console.log('Already editing, returning'); + return; + } // NOTE: Currently this only works for adding, not renaming var saveChanges = function($elem, $input) { console.log('saveChanges', $input.val()); @@ -474,6 +478,7 @@ GroupList.prototype.editGroup = function(id) { $elem.prepend(name).removeClass('editing').attr('data-id', response.id); $input.next('.checked').remove() $input.remove() + self.$editelem = null; } else { $input.prop('disabled', false); OC.notify({message:response.message}); @@ -484,17 +489,17 @@ GroupList.prototype.editGroup = function(id) { if(typeof id === 'undefined') { // Add new group var tmpl = this.$groupListItemTemplate; - var $elem = (tmpl).octemplate({ + self.$editelem = (tmpl).octemplate({ id: 'new', type: 'category', num: 0, name: '', }); var $input = $(''); - $elem.prepend($input).addClass('editing'); - $elem.data('contacts', []); - this.$groupList.find('h3.group[data-type="category"]').first().before($elem); - this.selectGroup({element:$elem}); + self.$editelem.prepend($input).addClass('editing'); + self.$editelem.data('contacts', []); + this.$groupList.find('h3.group[data-type="category"]').first().before(self.$editelem); + this.selectGroup({element:self.$editelem}); $input.on('input', function(event) { if($(this).val().length > 0) { $(this).next('.checked').removeClass('disabled'); @@ -505,9 +510,10 @@ GroupList.prototype.editGroup = function(id) { $input.on('keyup', function(event) { var keyCode = Math.max(event.keyCode, event.which); if(keyCode === 13) { - saveChanges($elem, $(this)); + saveChanges(self.$editelem, $(this)); } else if(keyCode === 27) { - $elem.remove(); + self.$editelem.remove(); + self.$editelem = null; } }); $input.next('.checked').on('click keydown', function(event) { @@ -515,7 +521,7 @@ GroupList.prototype.editGroup = function(id) { if(wrongKey(event)) { return; } - saveChanges($elem, $input); + saveChanges(self.$editelem, $input); }); $input.focus(); } else if(utils.isUInt(id)) { @@ -719,19 +725,19 @@ OC.Contacts = OC.Contacts || { this.scrollTimeoutMiliSecs = 100; this.isScrolling = false; this.cacheElements(); - this.Contacts = new OC.Contacts.ContactList( + this.contacts = new OC.Contacts.ContactList( this.$contactList, this.$contactListItemTemplate, this.$contactFullTemplate, this.detailTemplates ); - this.Groups = new GroupList(this.$groupList, this.$groupListItemTemplate); - OCCategories.changed = this.Groups.categoriesChanged; + this.groups = new GroupList(this.$groupList, this.$groupListItemTemplate); + OCCategories.changed = this.groups.categoriesChanged; OCCategories.app = 'contacts'; OCCategories.type = 'contact'; this.bindEvents(); this.$toggleAll.show(); - this.showActions(['addcontact']); + this.showActions(['add']); // Wait 2 mins then check if contacts are indexed. setTimeout(function() { @@ -754,6 +760,8 @@ OC.Contacts = OC.Contacts || { this.showActions(false); }, showActions:function(act) { + console.log('showActions', act); + //console.trace(); this.$headeractions.children().hide(); if(act && act.length > 0) { this.$headeractions.children('.'+act.join(',.')).show(); @@ -771,7 +779,7 @@ OC.Contacts = OC.Contacts || { $.each($($('#contactDetailsTemplate').html()), function(idx, node) { if(node.nodeType === Node.ELEMENT_NODE && node.nodeName === 'DIV') { var $tmpl = $(node.innerHTML); - self.detailTemplates[$tmpl.data('element')] = $(node.outerHTML); + self.detailTemplates[$tmpl.data('element')] = $(node); } }); this.$groupListItemTemplate = $('#groupListItemTemplate'); @@ -796,10 +804,10 @@ OC.Contacts = OC.Contacts || { buildGroupSelect: function() { // If a contact is open we know which categories it's in if(this.currentid) { - var contact = this.Contacts.contacts[this.currentid]; + var contact = this.contacts.contacts[this.currentid]; this.$groups.find('optgroup,option:not([value="-1"])').remove(); var addopts = '', rmopts = ''; - $.each(this.Groups.categories, function(i, category) { + $.each(this.groups.categories, function(i, category) { if(contact.inGroup(category.name)) { rmopts += ''; } else { @@ -814,10 +822,10 @@ OC.Contacts = OC.Contacts || { $(rmopts).appendTo(this.$groups) .wrapAll(''); } - } else if(this.Contacts.getSelectedContacts().length > 0) { // Otherwise add all categories to both add and remove + } else if(this.contacts.getSelectedContacts().length > 0) { // Otherwise add all categories to both add and remove this.$groups.find('optgroup,option:not([value="-1"])').remove(); var addopts = '', rmopts = ''; - $.each(this.Groups.categories, function(i, category) { + $.each(this.groups.categories, function(i, category) { rmopts += ''; addopts += ''; }); @@ -845,7 +853,7 @@ OC.Contacts = OC.Contacts || { var id = parseInt(data.id); console.log('contact', data.id, 'deleted'); // update counts on group lists - self.Groups.removeFromAll(data.id, true) + self.groups.removeFromAll(data.id, true) }); $(document).bind('status.contact.added', function(e, data) { @@ -874,7 +882,7 @@ OC.Contacts = OC.Contacts || { } else { self.numcontacts = result.numcontacts; self.loading(self.$rightContent, false); - self.Groups.loadGroups(self.numcontacts, function() { + self.groups.loadGroups(self.numcontacts, function() { self.loading($('#leftcontent'), false); console.log('Groups loaded, currentid', self.currentid); if(self.currentid) { @@ -930,9 +938,13 @@ OC.Contacts = OC.Contacts || { }); $(document).bind('request.contact.setasfavorite', function(e, data) { - var id = parseInt(data.id); console.log('contact', data.id, 'request.contact.setasfavorite'); - self.Groups.setAsFavorite(data.id, data.state); + self.groups.setAsFavorite(data.id, data.state); + }); + + $(document).bind('request.contact.addtogroup', function(e, data) { + console.log('contact', data.id, 'request.contact.addtogroup'); + self.groups.addTo(data.id, data.groupid); }); $(document).bind('request.contact.export', function(e, data) { @@ -950,7 +962,7 @@ OC.Contacts = OC.Contacts || { $(document).bind('request.contact.delete', function(e, data) { var id = parseInt(data.id); console.log('contact', data.id, 'request.contact.delete'); - self.Contacts.delayedDelete(id); + self.contacts.delayedDelete(id); self.$contactList.removeClass('dim'); self.showActions(['add']); }); @@ -974,13 +986,13 @@ OC.Contacts = OC.Contacts || { $(document).bind('request.addressbook.activate', function(e, result) { console.log('request.addressbook.activate', result); - self.Contacts.showFromAddressbook(result.id, result.activate); + self.contacts.showFromAddressbook(result.id, result.activate); }); $(document).bind('status.contact.removedfromgroup', function(e, result) { console.log('status.contact.removedfromgroup', result); if(self.currentgroup == result.groupid) { - self.Contacts.hideContact(result.contactid); + self.contacts.hideContact(result.contactid); self.closeContact(result.contactid); } }); @@ -989,21 +1001,21 @@ OC.Contacts = OC.Contacts || { console.log('status.group.groupremoved', result); if(parseInt(result.groupid) === parseInt(self.currentgroup)) { console.time('hiding'); - self.Contacts.showContacts([]); + self.contacts.showContacts([]); console.timeEnd('hiding'); self.currentgroup = 'all'; } $.each(result.contacts, function(idx, contactid) { - var contact = self.Contacts.findById(contactid); + var contact = self.contacts.findById(contactid); console.log('contactid', contactid, contact); - self.Contacts.findById(contactid).removeFromGroup(result.groupname); + self.contacts.findById(contactid).removeFromGroup(result.groupname); }); }); $(document).bind('status.group.contactadded', function(e, result) { console.log('status.group.contactadded', result); - self.Contacts.contacts[parseInt(result.contactid)].addToGroup(result.groupname); + self.contacts.contacts[parseInt(result.contactid)].addToGroup(result.groupname); }); // Group sorted, save the sort order @@ -1027,13 +1039,13 @@ OC.Contacts = OC.Contacts || { } self.$contactList.show(); self.$toggleAll.show(); - self.showActions(['addcontact']); + self.showActions(['add']); if(result.type === 'category' || result.type === 'fav') { - self.Contacts.showContacts(result.contacts); + self.contacts.showContacts(result.contacts); } else if(result.type === 'shared') { - self.Contacts.showFromAddressbook(self.currentgroup, true, true); + self.contacts.showFromAddressbook(self.currentgroup, true, true); } else { - self.Contacts.showContacts(self.currentgroup); + self.contacts.showContacts(self.currentgroup); } $.post(OC.filePath('contacts', 'ajax', 'setpreference.php'), {'key':'lastgroup', 'value':self.currentgroup}, function(jsondata) { if(!jsondata || jsondata.status !== 'success') { @@ -1052,7 +1064,7 @@ OC.Contacts = OC.Contacts || { var offset = self.$contactList.find('tr:eq(' + (num-20) + ')').offset().top; if(offset < self.$rightContent.height()) { console.log('load more'); - self.Contacts.loadContacts(num, function() { + self.contacts.loadContacts(num, function() { self.isScrolling = false; }); } else { @@ -1088,7 +1100,7 @@ OC.Contacts = OC.Contacts || { if(wrongKey(event)) { return; } - self.Groups.editGroup(); + self.groups.editGroup(); //self.addGroup(); }); @@ -1106,9 +1118,9 @@ OC.Contacts = OC.Contacts || { self.buildGroupSelect(); } if(isChecked) { - self.showActions(['addcontact', 'groups', 'delete', 'favorite']); + self.showActions(['add', 'download', 'groups', 'delete', 'favorite']); } else { - self.showActions(['addcontact']); + self.showActions(['add']); } }); @@ -1117,12 +1129,14 @@ OC.Contacts = OC.Contacts || { if(self.$groups.find('option').length === 1) { self.buildGroupSelect(); } - self.showActions(['addcontact', 'groups', 'delete', 'favorite']); - } else if(self.Contacts.getSelectedContacts().length === 0) { - self.showActions(['addcontact']); + self.showActions(['add', 'download', 'groups', 'delete', 'favorite']); + } else if(self.contacts.getSelectedContacts().length === 0) { + self.showActions(['add']); } }); + // Add to/remove from group multiple contacts. + // FIXME: Refactor this to be usable for favoriting also. this.$groups.on('change', function() { var $opt = $(this).find('option:selected'); var action = $opt.parent().data('action'); @@ -1134,13 +1148,13 @@ OC.Contacts = OC.Contacts || { ids = [self.currentid,]; buildnow = true } else { - ids = self.Contacts.getSelectedContacts(); + ids = self.contacts.getSelectedContacts(); } self.setAllChecked(false); self.$toggleAll.prop('checked', false); if(!self.currentid) { - self.showActions(['addcontact']); + self.showActions(['add']); } if($opt.val() === 'add') { // Add new group @@ -1151,13 +1165,13 @@ OC.Contacts = OC.Contacts || { if(response.status === 'success') { groupId = response.id; groupName = response.name; - self.Groups.addTo(ids, groupId, function(result) { + self.groups.addTo(ids, groupId, function(result) { if(result.status === 'success') { $.each(ids, function(idx, id) { // Delay each contact to not trigger too many ajax calls // at a time. setTimeout(function() { - self.Contacts.contacts[id].addToGroup(groupName); + self.contacts.contacts[id].addToGroup(groupName); // I don't think this is used... if(buildnow) { self.buildGroupSelect(); @@ -1170,7 +1184,7 @@ OC.Contacts = OC.Contacts || { }, 1000); }); } else { - // TODO: Use message return from Groups object. + // TODO: Use message returned from groups object. OC.notify({message:t('contacts', t('contacts', 'Error adding to group.'))}); } }); @@ -1185,7 +1199,7 @@ OC.Contacts = OC.Contacts || { console.log('trut', groupName, groupId); if(action === 'add') { - self.Groups.addTo(ids, $opt.val(), function(result) { + self.groups.addTo(ids, $opt.val(), function(result) { console.log('after add', result); if(result.status === 'success') { $.each(result.ids, function(idx, id) { @@ -1193,7 +1207,7 @@ OC.Contacts = OC.Contacts || { // at a time. setTimeout(function() { console.log('adding', id, 'to', groupName); - self.Contacts.contacts[id].addToGroup(groupName); + self.contacts.contacts[id].addToGroup(groupName); // I don't think this is used... if(buildnow) { self.buildGroupSelect(); @@ -1214,12 +1228,12 @@ OC.Contacts = OC.Contacts || { self.$groups.val(-1).hide().find('optgroup,option:not([value="-1"])').remove(); } } else if(action === 'remove') { - self.Groups.removeFrom(ids, $opt.val(), function(result) { + self.groups.removeFrom(ids, $opt.val(), function(result) { console.log('after remove', result); if(result.status === 'success') { var groupname = $opt.text(), groupid = $opt.val(); $.each(result.ids, function(idx, id) { - self.Contacts.contacts[id].removeFromGroup(groupname); + self.contacts.contacts[id].removeFromGroup(groupname); if(buildnow) { self.buildGroupSelect(); } @@ -1252,7 +1266,7 @@ OC.Contacts = OC.Contacts || { event.preventDefault(); console.log('select', event); self.dontScroll = true; - self.Contacts.select($(this).data('id'), true); + self.contacts.select($(this).data('id'), true); return; } if($(event.target).is('a.mailto')) { @@ -1268,23 +1282,6 @@ OC.Contacts = OC.Contacts || { self.openContact($(this).data('id')); }); - $('.addcontact').on('click keydown', function(event) { - if(wrongKey(event)) { - return; - } - console.log('add'); - self.$toggleAll.hide(); - $(this).hide(); - self.currentid = 'new'; - var props = { - favorite: false, - groups: self.Groups.categories, - }; - self.tmpcontact = self.Contacts.addContact(); - self.$rightContent.prepend(self.tmpcontact); - self.hideActions(); - }); - this.$settings.find('h3').on('click keydown', function(event) { if(wrongKey(event)) { return; @@ -1303,7 +1300,7 @@ OC.Contacts = OC.Contacts || { } $list.empty(); - $.each(self.Contacts.addressbooks, function(id, book) { + $.each(self.contacts.addressbooks, function(id, book) { var $li = self.$addressbookTmpl.octemplate({ id: id, permissions: book.permissions, @@ -1325,7 +1322,7 @@ OC.Contacts = OC.Contacts || { success:function(jsondata) { console.log(jsondata); if(jsondata.status == 'success') { - self.Contacts.unsetAddressbook(id); + self.contacts.unsetAddressbook(id); $li.remove(); OC.notify({ message:t('contacts','Deleting done. Click here to cancel reloading.'), @@ -1351,7 +1348,7 @@ OC.Contacts = OC.Contacts || { }); $list.find('a.action.globe').on('click keypress', function() { var id = parseInt($(this).parents('li').first().data('id')); - var book = self.Contacts.addressbooks[id]; + var book = self.contacts.addressbooks[id]; var uri = (book.owner === oc_current_user ) ? book.uri : book.uri + '_shared_by_' + book.owner; var link = totalurl+'/'+encodeURIComponent(oc_current_user)+'/'+encodeURIComponent(uri); var $dropdown = $('
'); @@ -1384,7 +1381,7 @@ OC.Contacts = OC.Contacts || { success:function(jsondata) { console.log(jsondata); if(jsondata.status == 'success') { - self.Contacts.setAddressbook(jsondata.data.addressbook); + self.contacts.setAddressbook(jsondata.data.addressbook); id = jsondata.data.addressbook.id } else { OC.notify({message:jsondata.data.message}); @@ -1399,7 +1396,7 @@ OC.Contacts = OC.Contacts || { } self.$importIntoSelect.empty(); - $.each(self.Contacts.addressbooks, function(id, book) { + $.each(self.contacts.addressbooks, function(id, book) { self.$importIntoSelect.append(''); }); self.$importIntoSelect.multiSelect({ @@ -1414,13 +1411,24 @@ OC.Contacts = OC.Contacts || { $list.toggle('slow'); }); - this.$header.on('click keydown', '.back', function(event) { + this.$header.on('click keydown', '.add', function(event) { if(wrongKey(event)) { return; } - console.log('back'); - self.closeContact(self.currentid); - self.$toggleAll.show(); + console.log('add'); + self.$toggleAll.hide(); + $(this).hide(); + self.currentid = 'new'; + // Properties that the contact doesn't know + console.log('addContact, groupid', self.currentgroup) + var groupprops = { + favorite: false, + groups: self.groups.categories, + currentgroup: {id:self.currentgroup, name:self.groups.nameById(self.currentgroup)}, + }; + self.tmpcontact = self.contacts.addContact(groupprops); + self.$rightContent.prepend(self.tmpcontact); + self.hideActions(); }); this.$header.on('click keydown', '.delete', function(event) { @@ -1430,11 +1438,11 @@ OC.Contacts = OC.Contacts || { console.log('delete'); if(self.currentid) { console.assert(utils.isUInt(self.currentid), 'self.currentid is not an integer'); - self.Contacts.delayedDelete(self.currentid); + self.contacts.delayedDelete(self.currentid); } else { - self.Contacts.delayedDelete(self.Contacts.getSelectedContacts()); + self.contacts.delayedDelete(self.contacts.getSelectedContacts()); } - self.showActions(['addcontact']); + self.showActions(['add']); }); this.$header.on('click keydown', '.download', function(event) { @@ -1442,11 +1450,8 @@ OC.Contacts = OC.Contacts || { return; } console.log('download'); - if(self.currentid) { - document.location.href = OC.linkTo('contacts', 'export.php') + '?contactid=' + self.currentid; - } else { - console.log('currentid is not set'); - } + document.location.href = OC.linkTo('contacts', 'export.php') + + '?selectedids=' + self.contacts.getSelectedContacts().join(','); }); this.$header.on('click keydown', '.favorite', function(event) { @@ -1457,9 +1462,9 @@ OC.Contacts = OC.Contacts || { return; } // FIXME: This should only apply for contacts list. - var state = self.Groups.isFavorite(self.currentid); + var state = self.groups.isFavorite(self.currentid); console.log('Favorite?', this, state); - self.Groups.setAsFavorite(self.currentid, !state, function(jsondata) { + self.groups.setAsFavorite(self.currentid, !state, function(jsondata) { if(jsondata.status === 'success') { if(state) { self.$header.find('.favorite').switchClass('active', ''); @@ -1672,7 +1677,7 @@ OC.Contacts = OC.Contacts || { }); $(document).on('keypress', function(event) { - if(event.target.nodeName.toUpperCase() != 'BODY') { + if(!$(event.target).is('body')) { return; } var keyCode = Math.max(event.keyCode, event.which); @@ -1700,14 +1705,14 @@ OC.Contacts = OC.Contacts || { break; case 46: // Delete if(event.shiftKey) { - self.Contacts.delayedDelete(self.currentid); + self.contacts.delayedDelete(self.currentid); } break; case 40: // down case 74: // j console.log('next'); if(!self.currentid && self.currentlistid) { - self.Contacts.contacts[self.currentlistid].next(); + self.contacts.contacts[self.currentlistid].next(); } break; case 65: // a @@ -1721,7 +1726,7 @@ OC.Contacts = OC.Contacts || { case 75: // k console.log('previous'); if(!self.currentid && self.currentlistid) { - self.Contacts.contacts[self.currentlistid].prev(); + self.contacts.contacts[self.currentlistid].prev(); } break; case 34: // PageDown @@ -1734,7 +1739,7 @@ OC.Contacts = OC.Contacts || { case 33: // PageUp case 80: // p // prev addressbook - //OC.Contacts.Contacts.previousAddressbook(); + //OC.contacts.contacts.previousAddressbook(); break; case 82: // r console.log('refresh - what?'); @@ -1774,7 +1779,7 @@ OC.Contacts = OC.Contacts || { height: 'auto', width: 'auto', buttons: { 'Ok':function() { - self.Groups.addGroup( + self.groups.addGroup( {name:$dlg.find('input:text').val()}, function(response) { if(typeof cb === 'function') { @@ -1808,11 +1813,12 @@ OC.Contacts = OC.Contacts || { }); }, jumpToContact: function(id) { - this.$rightContent.scrollTop(this.Contacts.contactPos(id)+10); + this.$rightContent.scrollTop(this.contacts.contactPos(id)+10); }, closeContact: function(id) { if(typeof this.currentid === 'number') { - if(this.Contacts.findById(id).close()) { + var contact = this.contacts.findById(id); + if(contact && contact.close()) { this.$contactList.show(); this.jumpToContact(id); } @@ -1822,7 +1828,7 @@ OC.Contacts = OC.Contacts || { } this.$contactList.removeClass('dim'); delete this.currentid; - this.showActions(['addcontact']); + this.showActions(['add']); this.$groups.find('optgroup,option:not([value="-1"])').remove(); }, openContact: function(id) { @@ -1831,17 +1837,19 @@ OC.Contacts = OC.Contacts || { this.closeContact(this.currentid); } this.currentid = parseInt(id); - console.log('Contacts.openContact, Favorite', this.currentid, this.Groups.isFavorite(this.currentid), this.Groups); + console.log('Contacts.openContact, Favorite', this.currentid, this.groups.isFavorite(this.currentid), this.groups); this.setAllChecked(false); //this.$contactList.hide(); this.$contactList.addClass('dim'); this.$toggleAll.hide(); this.jumpToContact(this.currentid); - var props = { - favorite: this.Groups.isFavorite(this.currentid), - groups: this.Groups.categories, + // Properties that the contact doesn't know + var groupprops = { + favorite: this.groups.isFavorite(this.currentid), + groups: this.groups.categories, + currentgroup: {id:this.currentgroup, name:this.groups.nameById(this.currentgroup)}, }; - var $contactelem = this.Contacts.showContact(this.currentid, props); + var $contactelem = this.contacts.showContact(this.currentid, groupprops); var self = this; var $contact = $contactelem.find('#contact'); var adjustElems = function() { @@ -2067,7 +2075,7 @@ OC.Contacts = OC.Contacts || { if(typeof cb === 'function') { cb({ status:'success', - addressbook:self.Contacts.addressbooks[parseInt(aid)], + addressbook:self.contacts.addressbooks[parseInt(aid)], }); } $(this).dialog('close'); @@ -2084,7 +2092,7 @@ OC.Contacts = OC.Contacts || { open: function(event, ui) { console.log('open', $(this)); var $lastrow = $(this).find('tr.new'); - $.each(self.Contacts.addressbooks, function(i, book) { + $.each(self.contacts.addressbooks, function(i, book) { console.log('book', i, book); if(book.owner === OC.currentUser || (book.permissions & OC.PERMISSION_UPDATE @@ -2114,7 +2122,12 @@ OC.Contacts = OC.Contacts || { }; (function( $ ) { - + // Support older browsers. From http://www.yelotofu.com/2008/08/jquery-outerhtml/ + jQuery.fn.outerHTML = function(s) { + return s + ? this.before(s).remove() + : jQuery('').append(this.eq(0).clone()).html(); + }; /** * Object Template * Inspired by micro templating done by e.g. underscore.js @@ -2136,7 +2149,7 @@ OC.Contacts = OC.Contacts || { // From stackoverflow.com/questions/1408289/best-way-to-do-variable-interpolation-in-javascript _build: function(o){ var data = this.$elem.attr('type') === 'text/template' - ? this.$elem.html() : this.$elem.get(0).outerHTML; + ? this.$elem.html() : this.$elem.outerHTML(); return data.replace(/{([^{}]*)}/g, function (a, b) { var r = o[b]; diff --git a/js/contacts.js b/js/contacts.js index 780d5ea1..92006244 100644 --- a/js/contacts.js +++ b/js/contacts.js @@ -26,6 +26,13 @@ OC.Contacts = OC.Contacts || {}; this.multi_properties = ['EMAIL', 'TEL', 'IMPP', 'ADR', 'URL']; } + Contact.prototype.showActions = function(act) { + this.$footer.children().hide(); + if(act && act.length > 0) { + this.$footer.children('.'+act.join(',.')).show(); + } + } + Contact.prototype.setAsSaving = function(obj, state) { if(!obj) { return; @@ -160,6 +167,7 @@ OC.Contacts = OC.Contacts || {}; return false; } self.saveProperty(params); + self.showActions(['close', 'add', 'export', 'delete']); }); return; } @@ -395,6 +403,20 @@ OC.Contacts = OC.Contacts || {}; self.id = parseInt(jsondata.data.id); self.access.id = parseInt(jsondata.data.aid); self.data = jsondata.data.details; + // Add contact to current group + if(self.groupprops && self.groupprops.currentgroup.name !== 'all' + && self.groupprops.currentgroup.name !== 'fav') { + if(!self.data.CATEGORIES) { + self.data.CATEGORIES = [{value:[self.groupprops.currentgroup.name], parameters:[]}]; + // Save to vCard + self.saveProperty({name:'CATEGORIES', value:self.data.CATEGORIES[0].value.join(',') }); + // Tell OC.Contacts to save in backend + $(document).trigger('request.contact.addtogroup', { + id: self.id, + groupid: self.groupprops.currentgroup.id, + }); + } + } $(document).trigger('status.contact.added', { id: self.id, contact: self, @@ -547,14 +569,15 @@ OC.Contacts = OC.Contacts || {}; * Render the full contact * @return A jquery object to be inserted in the DOM */ - Contact.prototype.renderContact = function(props) { + Contact.prototype.renderContact = function(groupprops) { + this.groupprops = groupprops; var self = this; var n = this.getPreferredValue('N', ['', '', '', '', '']); //console.log('Contact.renderContact', this.data); var values = this.data ? { id: this.id, - favorite:props.favorite ? 'active' : '', + favorite:groupprops.favorite ? 'active' : '', name: this.getPreferredValue('FN', ''), n0: n[0]||'', n1: n[1]||'', n2: n[2]||'', n3: n[3]||'', n4: n[4]||'', nickname: this.getPreferredValue('NICKNAME', ''), @@ -569,6 +592,9 @@ OC.Contacts = OC.Contacts || {}; } : {id:'', favorite:'', name:'', nickname:'', title:'', org:'', bday:'', note:'', n0:'', n1:'', n2:'', n3:'', n4:''}; this.$fullelem = this.$fullTemplate.octemplate(values).data('contactobject', this); + + this.$footer = this.$fullelem.find('footer'); + this.$fullelem.find('.tooltipped.rightwards.onfocus').tipsy({trigger: 'focus', gravity: 'w'}); this.$fullelem.on('submit', function() { return false; @@ -613,14 +639,12 @@ OC.Contacts = OC.Contacts || {}; self.deleteProperty({obj:event.target}); }); - var $footer = this.$fullelem.find('footer'); - - $footer.on('click keydown', 'button', function(event) { + this.$footer.on('click keydown', 'button', function(event) { $('.tipsy').remove(); if(wrongKey(event)) { return; } - if($(this).is('.close')) { + if($(this).is('.close') || $(this).is('.cancel')) { $(document).trigger('request.contact.close', { id: self.id, }); @@ -628,7 +652,7 @@ OC.Contacts = OC.Contacts || {}; $(document).trigger('request.contact.export', { id: self.id, }); - } else if($(this).is('.deletecontact')) { + } else if($(this).is('.delete')) { $(document).trigger('request.contact.delete', { id: self.id, }); @@ -657,6 +681,9 @@ OC.Contacts = OC.Contacts || {}; }); this.$fullelem.find('.favorite').on('click', function () { var state = $(this).hasClass('active'); + if(!this.data) { + return; + } if(state) { $(this).switchClass('active', 'inactive'); } else { @@ -671,6 +698,7 @@ OC.Contacts = OC.Contacts || {}; if(!this.data) { // A new contact this.setEnabled(true); + this.showActions(['cancel']); return this.$fullelem; } // Loop thru all single occurrence values. If not set hide the @@ -782,8 +810,10 @@ OC.Contacts = OC.Contacts || {}; && !(this.access.permissions & OC.PERMISSION_UPDATE || this.access.permissions & OC.PERMISSION_DELETE)) { this.setEnabled(false); + this.showActions(['close']); } else { this.setEnabled(true); + this.showActions(['close', 'add', 'export', 'delete']); } return this.$fullelem; } @@ -800,7 +830,7 @@ OC.Contacts = OC.Contacts || {}; */ Contact.prototype.renderStandardProperty = function(name, property) { if(!this.detailTemplates[name]) { - console.log('No template for', name); + console.error('No template for', name); return; } var values = property @@ -966,7 +996,7 @@ OC.Contacts = OC.Contacts || {}; if(!dontloadhandlers && this.isEditable()) { this.$photowrapper.on('mouseenter', function(event) { - if(event.target !== this) { + if($(event.target).is('.favorite') || !self.data) { return; } $phototools.slideDown(200); @@ -1245,8 +1275,6 @@ OC.Contacts = OC.Contacts || {}; } ContactList.prototype.contactPos = function(id) { - console.log('ContactList.contactPos, id', id); - console.trace() if(!id) { console.warn('id missing'); return false; diff --git a/l10n/ar.php b/l10n/ar.php index 87bd56b1..b50c0d60 100644 --- a/l10n/ar.php +++ b/l10n/ar.php @@ -34,6 +34,7 @@ "Phone" => "الهاتف", "Email" => "البريد الالكتروني", "Address" => "عنوان", +"Delete contact" => "امحي المعرفه", "Preferred" => "مفضل", "City" => "المدينة", "Country" => "البلد", @@ -41,7 +42,6 @@ "Export" => "تصدير المعلومات", "Add Contact" => "أضف شخص ", "Download contact" => "انزال المعرفه", -"Delete contact" => "امحي المعرفه", "Type" => "نوع", "PO Box" => "العنوان البريدي", "Extended" => "إضافة", diff --git a/l10n/ca.php b/l10n/ca.php index a73c9950..fb507325 100644 --- a/l10n/ca.php +++ b/l10n/ca.php @@ -49,12 +49,14 @@ "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", +"%d_selected_contacts" => "%d_contactes_selecionats", "Contact is already in this group." => "El contacte ja és en aquest grup.", "Contacts are already in this group." => "Els contactes ja són en aquest grup", "Couldn't get contact list." => "No s'ha pogut obtenir la llista de contactes.", "Contact is not in this group." => "El contacte no és en aquest grup.", "Contacts are not in this group." => "Els contactes no són en aquest grup.", "A group named {group} already exists" => "Un grup anomenat {group} ja existeix", +"You can drag groups to\narrange them as you like." => "Podeu arrossegar grups per\norganitzar-los com volgueu.", "All" => "Tots", "Favorites" => "Preferits", "Shared by {owner}" => "Compartits per {owner}", @@ -67,9 +69,14 @@ "Error adding to group." => "Error en afegir grup", "Error removing from group." => "Error en eliminar del grup", "There was an error opening a mail composer." => "S'ha produït un error en obrir un redactor de correus electrónics.", +"Deleting done. Click here to cancel reloading." => "S'ha eliminat. Feu clic aquí per cancel·lar la recàrrega.", +"Add address book" => "Afegeix llibreta d'adreces", +"Import done. Click here to cancel reloading." => "S'ha importat. Feu clic aquí per cancel·lar la recàrrega.", "Not all files uploaded. Retrying..." => "No s'han pujat tots els fitxers. Es reintenta...", "Something went wrong with the upload, please retry." => "Alguna cosa ha fallat en la pujada, intenteu-ho de nou.", "Error" => "Error", +"Importing from {filename}..." => "Important des de {filename}...", +"{success} imported, {failed} failed." => "{success} importat, {failed} fallat.", "Importing..." => "Important...", "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", @@ -145,12 +152,15 @@ "HomePage" => "Pàgina d'inici", "New Group" => "Grup nou", "Settings" => "Configuració", +"Address books" => "Llibretes d'adreces", "Import" => "Importa", +"Select files to import" => "Seleccioneu els fitxers a importar", +"Select files" => "Seleccioneu fitxers", "Import into:" => "Importa a:", "OK" => "D'acord", "(De-)select all" => "(Des-)selecciona'ls tots", "New Contact" => "Contate nou", -"Download Contact" => "Baixa contacte", +"Download Contact(s)" => "Baixa contacte(s)", "Groups" => "Grups", "Favorite" => "Preferits", "Delete Contact" => "Elimina contacte", @@ -181,9 +191,12 @@ "Nickname" => "Sobrenom", "Enter nickname" => "Escriviu el sobrenom", "Title" => "Títol", +"Enter title" => "Escriviu el títol", "Organization" => "Organització", +"Enter organization" => "Escriviu l'organització", "Birthday" => "Aniversari", "Notes go here..." => "Escriviu notes aquí...", +"Export as VCF" => "Exporta com a VCF", "Add" => "Afegeix", "Phone" => "Telèfon", "Email" => "Correu electrònic", @@ -191,6 +204,7 @@ "Address" => "Adreça", "Note" => "Nota", "Web site" => "Adreça web", +"Delete contact" => "Suprimeix el contacte", "Preferred" => "Preferit", "Please specify a valid email address." => "Especifiqueu una adreça de correu electrònic correcta", "someone@example.com" => "algú@exemple.com", @@ -209,12 +223,14 @@ "Your city" => "Ciutat", "City" => "Ciutat", "Some region" => "Comarca", +"State or province" => "Estat o província", "Your country" => "País", "Country" => "País", "Instant Messenger" => "Instant Messenger", "Delete IM" => "Elimina IM", "Share" => "Comparteix", "Export" => "Exporta", +"CardDAV link" => "Enllaç CardDAV", "Add Contact" => "Afegeix un contacte", "Drop photo to upload" => "Elimina la foto a carregar", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format personalitzat, Nom curt, Nom sencer, Invertit o Invertit amb coma", @@ -228,7 +244,6 @@ "Add notes here." => "Afegiu notes aquí.", "Add field" => "Afegeix un camp", "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", diff --git a/l10n/cs_CZ.php b/l10n/cs_CZ.php index e4d23354..baf09ec3 100644 --- a/l10n/cs_CZ.php +++ b/l10n/cs_CZ.php @@ -49,6 +49,7 @@ "Couldn't load temporary image: " => "Nelze načíst dočasný obrázek: ", "No file was uploaded. Unknown error" => "Soubor nebyl odeslán. Neznámá chyba", "Contacts" => "Kontakty", +"%d_selected_contacts" => "%d_vybranych_kontaktu", "Contact is already in this group." => "Kontakt je již v této skupině.", "Contacts are already in this group." => "Kontakty jsou již v této skupině.", "Couldn't get contact list." => "Nelze získat seznam kontaktů.", @@ -159,7 +160,7 @@ "OK" => "OK", "(De-)select all" => "Vybrat (odznačit) vše", "New Contact" => "Nový kontakt", -"Download Contact" => "Stáhnout kontakt", +"Download Contact(s)" => "Stáhnout kontakt(y)", "Groups" => "Skupiny", "Favorite" => "Oblíbit", "Delete Contact" => "Smazat kontakt", @@ -190,9 +191,12 @@ "Nickname" => "Přezdívka", "Enter nickname" => "Zadejte přezdívku", "Title" => "Název", +"Enter title" => "Zadejte název", "Organization" => "Organizace", +"Enter organization" => "Zadejte organizaci", "Birthday" => "Narozeniny", "Notes go here..." => "Sem vložte poznámky...", +"Export as VCF" => "Exportovat jako VCF", "Add" => "Přidat", "Phone" => "Telefon", "Email" => "E-mail", @@ -200,6 +204,7 @@ "Address" => "Adresa", "Note" => "Poznámka", "Web site" => "Webová stránka", +"Delete contact" => "Smazat kontakt", "Preferred" => "Preferované", "Please specify a valid email address." => "Prosím zadejte platnou e-mailovou adresu", "someone@example.com" => "někdo@example.com", @@ -218,6 +223,7 @@ "Your city" => "Vaše město", "City" => "Město", "Some region" => "Nějaký region", +"State or province" => "Stát, či provincie", "Your country" => "Váše země", "Country" => "Země", "Instant Messenger" => "Komunikátor", @@ -238,7 +244,6 @@ "Add notes here." => "Zde přidejte poznámky.", "Add field" => "Přidat pole", "Download contact" => "Stáhnout kontakt", -"Delete contact" => "Smazat kontakt", "The temporary image has been removed from cache." => "Obrázek byl odstraněn z vyrovnávací paměti.", "Edit address" => "Upravit adresu", "Type" => "Typ", diff --git a/l10n/da.php b/l10n/da.php index e9666e5e..c0a8fccd 100644 --- a/l10n/da.php +++ b/l10n/da.php @@ -140,6 +140,7 @@ "Address" => "Adresse", "Note" => "Note", "Web site" => "Hjemmeside", +"Delete contact" => "Slet kontaktperson", "Preferred" => "Foretrukken", "Please specify a valid email address." => "Indtast venligst en gyldig email-adresse.", "Mail to address" => "Send mail til adresse", @@ -169,7 +170,6 @@ "Add notes here." => "Tilføj noter her.", "Add field" => "Tilføj element", "Download contact" => "Download kontaktperson", -"Delete contact" => "Slet kontaktperson", "The temporary image has been removed from cache." => "Det midlertidige billede er ikke længere tilgængeligt.", "Edit address" => "Rediger adresse", "Type" => "Type", diff --git a/l10n/de.php b/l10n/de.php index 17c8f68f..b62c5d90 100644 --- a/l10n/de.php +++ b/l10n/de.php @@ -159,7 +159,6 @@ "OK" => "OK", "(De-)select all" => "Alle (nicht) auswählen", "New Contact" => "Neuer Kontakt", -"Download Contact" => "Kontakt herunterladen", "Groups" => "Gruppen", "Favorite" => "Favorit", "Delete Contact" => "Kontakt löschen", @@ -190,7 +189,9 @@ "Nickname" => "Spitzname", "Enter nickname" => "Spitzname angeben", "Title" => "Titel", +"Enter title" => "Titel eingeben", "Organization" => "Organisation", +"Enter organization" => "Organisation eingeben", "Birthday" => "Geburtstag", "Notes go here..." => "Notizen hier hinein...", "Add" => "Hinzufügen", @@ -200,6 +201,7 @@ "Address" => "Adresse", "Note" => "Notiz", "Web site" => "Webseite", +"Delete contact" => "Kontakt löschen", "Preferred" => "Bevorzugt", "Please specify a valid email address." => "Bitte trage eine gültige E-Mail-Adresse ein.", "someone@example.com" => "jemand@beispiel.de", @@ -218,6 +220,7 @@ "Your city" => "Deine Stadt", "City" => "Stadt", "Some region" => "Eine Region", +"State or province" => "Staat oder Provinz", "Your country" => "Dein Land", "Country" => "Land", "Instant Messenger" => "Instant Messenger", @@ -238,7 +241,6 @@ "Add notes here." => "Füge hier Notizen ein.", "Add field" => "Feld hinzufügen", "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", diff --git a/l10n/de_DE.php b/l10n/de_DE.php index 24a3b872..66670c5f 100644 --- a/l10n/de_DE.php +++ b/l10n/de_DE.php @@ -159,7 +159,7 @@ "OK" => "OK", "(De-)select all" => "Alle (ab-)wählen", "New Contact" => "Neuer Kontakt", -"Download Contact" => "Kontakt herunterladen", +"Download Contact(s)" => "Kontakte herunterladen", "Groups" => "Gruppen", "Favorite" => "Favorit", "Delete Contact" => "Kontakt löschen", @@ -190,9 +190,12 @@ "Nickname" => "Spitzname", "Enter nickname" => "Spitzname angeben", "Title" => "Titel", +"Enter title" => "Titel eingeben", "Organization" => "Organisation", +"Enter organization" => "Organisation eingeben", "Birthday" => "Geburtstag", "Notes go here..." => "Notizen hier hinein...", +"Export as VCF" => "Als VCF exportieren", "Add" => "Hinzufügen", "Phone" => "Telefon", "Email" => "E-Mail", @@ -200,6 +203,7 @@ "Address" => "Adresse", "Note" => "Notiz", "Web site" => "Webseite", +"Delete contact" => "Kontakt löschen", "Preferred" => "Bevorzugt", "Please specify a valid email address." => "Bitte tragen Sie eine gültige E-Mail-Adresse ein.", "someone@example.com" => "jemand@beispiel.com", @@ -218,6 +222,7 @@ "Your city" => "Ihre Stadt", "City" => "Stadt", "Some region" => "Eine Region", +"State or province" => "Staat oder Provinz", "Your country" => "Ihr Land", "Country" => "Land", "Instant Messenger" => "Instant Messenger", @@ -238,7 +243,6 @@ "Add notes here." => "Fügen Sie hier Notizen ein.", "Add field" => "Feld hinzufügen", "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", diff --git a/l10n/el.php b/l10n/el.php index a0c9d3ca..6341aca7 100644 --- a/l10n/el.php +++ b/l10n/el.php @@ -165,6 +165,7 @@ "Address" => "Διεύθυνση", "Note" => "Σημείωση", "Web site" => "Ιστότοπος", +"Delete contact" => "Διαγραφή επαφής", "Preferred" => "Προτιμώμενο", "Please specify a valid email address." => "Παρακαλώ εισήγαγε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου", "someone@example.com" => "someone@example.com", @@ -200,7 +201,6 @@ "Add notes here." => "Πρόσθεσε τις σημειώσεις εδώ", "Add field" => "Προσθήκη πεδίου", "Download contact" => "Λήψη επαφής", -"Delete contact" => "Διαγραφή επαφής", "The temporary image has been removed from cache." => "Η προσωρινή εικόνα αφαιρέθηκε από την κρυφή μνήμη.", "Edit address" => "Επεξεργασία διεύθυνσης", "Type" => "Τύπος", diff --git a/l10n/eo.php b/l10n/eo.php index 821ae318..67156930 100644 --- a/l10n/eo.php +++ b/l10n/eo.php @@ -150,7 +150,6 @@ "OK" => "Akcepti", "(De-)select all" => "(Mal)elekti ĉion", "New Contact" => "Nova kontakto", -"Download Contact" => "Elŝuti kontakton", "Groups" => "Grupoj", "Favorite" => "Favorato", "Delete Contact" => "Forigi kontakton", @@ -191,6 +190,7 @@ "Address" => "Adreso", "Note" => "Noto", "Web site" => "TTT-ejo", +"Delete contact" => "Forigi kontakton", "Preferred" => "Preferata", "Please specify a valid email address." => "Bonvolu specifi validan retpoŝtadreson.", "someone@example.com" => "iu@example.com", @@ -228,7 +228,6 @@ "Add notes here." => "Aldoni notojn ĉi tie.", "Add field" => "Aldoni kampon", "Download contact" => "Elŝuti kontakton", -"Delete contact" => "Forigi kontakton", "The temporary image has been removed from cache." => "La provizora bildo estas forigita de la kaŝmemoro.", "Edit address" => "Redakti adreson", "Type" => "Tipo", diff --git a/l10n/es.php b/l10n/es.php index 90441895..fff29abb 100644 --- a/l10n/es.php +++ b/l10n/es.php @@ -67,9 +67,15 @@ "Network or server error. Please inform administrator." => "Error en la red o en el servidor. Por favor informe al administrador.", "Error adding to group." => "Error al añadir al grupo.", "Error removing from group." => "Error al remover del grupo.", +"There was an error opening a mail composer." => "Hubo un error al abrir el escritor de correo electrónico.", +"Deleting done. Click here to cancel reloading." => "Borrado completo. Haga click para cancelar la recarga", +"Add address book" => "Añadir libreta de direcciones", +"Import done. Click here to cancel reloading." => "Importación completa. Haga click para cancerla la recarga. ", "Not all files uploaded. Retrying..." => "No se han podido subir todos los archivos. Reintentando...", "Something went wrong with the upload, please retry." => "Algo ha ido mal con la subida, por favor, reintentelo.", "Error" => "Fallo", +"Importing from {filename}..." => "Importando desde {filename}...", +"{success} imported, {failed} failed." => "{success} importados, {failed} fallidos.", "Importing..." => "Importando...", "Unable to upload your file as it is a directory or has 0 bytes" => "Imposible subir su archivo, es un directorio o tiene 0 bytes", "Upload Error" => "Error de subida", @@ -82,7 +88,7 @@ "Error loading profile picture." => "Error cargando la imagen del perfil.", "Enter name" => "Introducir nombre", "Enter description" => "Introducir descripción", -"Select addressbook" => "Seleccionar contactos", +"Select addressbook" => "Seleccionar libreta de direcciones", "The address book name cannot be empty." => "El nombre de la libreta de direcciones no puede estar vacio.", "Is this correct?" => "¿Es esto correcto?", "There was an unknown error when trying to delete this contact" => "Hubo un error desconocido al tratar de eliminar este contacto", @@ -145,12 +151,14 @@ "HomePage" => "Página de inicio", "New Group" => "Nuevo grupo", "Settings" => "Configuración", +"Address books" => "Libretas de direcciones", "Import" => "Importar", +"Select files to import" => "Selecionar archivos para importar", +"Select files" => "Selecionar archivos", "Import into:" => "Importar hacia:", "OK" => "Aceptar", "(De-)select all" => "Seleccionar todos", "New Contact" => "Nuevo contacto", -"Download Contact" => "Descargar contacto", "Groups" => "Grupos", "Favorite" => "Favorito", "Delete Contact" => "Eliminar contacto", @@ -159,7 +167,7 @@ "Navigation" => "Navegación", "Next contact in list" => "Siguiente contacto en la lista", "Previous contact in list" => "Anterior contacto en la lista", -"Expand/collapse current addressbook" => "Abrir/Cerrar la agenda", +"Expand/collapse current addressbook" => "Abrir/Cerrar la libreta de direcciones", "Next addressbook" => "Siguiente libreta de direcciones", "Previous addressbook" => "Anterior libreta de direcciones", "Actions" => "Acciones", @@ -181,9 +189,12 @@ "Nickname" => "Alias", "Enter nickname" => "Introduce un alias", "Title" => "Título", +"Enter title" => "Ingrese titulo", "Organization" => "Organización", +"Enter organization" => "Ingrese organización", "Birthday" => "Cumpleaños", "Notes go here..." => "Las notas van acá...", +"Export as VCF" => "Exportar como VCF", "Add" => "Añadir", "Phone" => "Teléfono", "Email" => "Correo electrónico", @@ -191,6 +202,7 @@ "Address" => "Dirección", "Note" => "Nota", "Web site" => "Sitio Web", +"Delete contact" => "Eliminar contacto", "Preferred" => "Preferido", "Please specify a valid email address." => "Por favor especifica una dirección de correo electrónico válida.", "someone@example.com" => "alguien@ejemplo.com", @@ -209,12 +221,14 @@ "Your city" => "Su ciudad", "City" => "Ciudad", "Some region" => "Alguna región", +"State or province" => "Estado o provincia", "Your country" => "Su país", "Country" => "País", "Instant Messenger" => "Mensajero instantáneo", "Delete IM" => "Eliminar IM", "Share" => "Compartir", "Export" => "Exportar", +"CardDAV link" => "Enlace a CardDAV", "Add Contact" => "Añadir contacto", "Drop photo to upload" => "Suelta una foto para subirla", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formato personalizado, nombre abreviado, nombre completo, al revés o al revés con coma", @@ -228,7 +242,6 @@ "Add notes here." => "Añade notas aquí.", "Add field" => "Añadir campo", "Download contact" => "Descargar contacto", -"Delete contact" => "Eliminar contacto", "The temporary image has been removed from cache." => "La foto temporal se ha borrado del cache.", "Edit address" => "Editar dirección", "Type" => "Tipo", diff --git a/l10n/es_AR.php b/l10n/es_AR.php index 550aea5d..42c9dc61 100644 --- a/l10n/es_AR.php +++ b/l10n/es_AR.php @@ -68,9 +68,9 @@ "Error adding to group." => "Error al añadir al grupo.", "Error removing from group." => "Error al quitar del grupo.", "There was an error opening a mail composer." => "Hubo un error al abrir el escritor de correo electrónico", -"Deleting done. Click here to cancel reloading." => "Borrado completo. Click para cancerla la recarga. ", +"Deleting done. Click here to cancel reloading." => "Borrado completo. Haga click para cancerla la recarga. ", "Add address book" => "Añadir agenda", -"Import done. Click here to cancel reloading." => "Importación completo. Click para cancerla la recarga. ", +"Import done. Click here to cancel reloading." => "Importación completa. Haga click para cancerla la recarga. ", "Not all files uploaded. Retrying..." => "No fue posible subir todos los archivos. Reintentando...", "Something went wrong with the upload, please retry." => "Algo salió mal durante la subida. Por favor, intentalo nuevamente.", "Error" => "Error", @@ -159,7 +159,6 @@ "OK" => "Aceptar", "(De-)select all" => "(De)selecionar todos", "New Contact" => "Nuevo contato", -"Download Contact" => "Descargar contacto", "Groups" => "Grupos", "Favorite" => "Favorito", "Delete Contact" => "Borrar contacto", @@ -190,9 +189,12 @@ "Nickname" => "Sobrenombre", "Enter nickname" => "Escribí un sobrenombre", "Title" => "Título", +"Enter title" => "Ingrese titulo", "Organization" => "Organización", +"Enter organization" => "Ingrese organización", "Birthday" => "Cumpleaños", "Notes go here..." => "Las notas van aquí", +"Export as VCF" => "Exportar como VCF", "Add" => "Agregar", "Phone" => "Teléfono", "Email" => "Correo Electrónico", @@ -200,6 +202,7 @@ "Address" => "Dirección", "Note" => "Nota", "Web site" => "Página web", +"Delete contact" => "Borrar contacto", "Preferred" => "Preferido", "Please specify a valid email address." => "Por favor, escribí una dirección de correo electrónico válida.", "someone@example.com" => "alguien@ejemplo.com", @@ -218,6 +221,7 @@ "Your city" => "Tu ciudad", "City" => "Ciudad", "Some region" => "Alguna región", +"State or province" => "Estado o provincia", "Your country" => "Tu país", "Country" => "País", "Instant Messenger" => "Mensajero instantáneo", @@ -238,7 +242,6 @@ "Add notes here." => "Agregá notas acá.", "Add field" => "Agregar campo", "Download contact" => "Descargar contacto", -"Delete contact" => "Borrar contacto", "The temporary image has been removed from cache." => "La imagen temporal fue borrada de la caché", "Edit address" => "Editar dirección", "Type" => "Tipo", diff --git a/l10n/et_EE.php b/l10n/et_EE.php index ce5bc4d5..377b4426 100644 --- a/l10n/et_EE.php +++ b/l10n/et_EE.php @@ -149,7 +149,6 @@ "OK" => "OK", "(De-)select all" => "(Ära) vali kõik", "New Contact" => "Uus kontakt", -"Download Contact" => "Lae kontakt alla", "Groups" => "Grupid", "Favorite" => "Lemmik", "Delete Contact" => "Kustuta kontakt", @@ -190,6 +189,7 @@ "Address" => "Aadress", "Note" => "Märkus", "Web site" => "Veebisait", +"Delete contact" => "Kustuta kontakt", "Preferred" => "Eelistatud", "Please specify a valid email address." => "Palun sisesta korrektne e-posti aadress.", "someone@example.com" => "someone@example.com", @@ -227,7 +227,6 @@ "Add notes here." => "Lisa märkmed siia.", "Add field" => "Lisa väli", "Download contact" => "Lae kontakt alla", -"Delete contact" => "Kustuta kontakt", "The temporary image has been removed from cache." => "Ajutine pilt on puhvrist eemaldatud.", "Edit address" => "Muuda aadressi", "Type" => "Tüüp", diff --git a/l10n/eu.php b/l10n/eu.php index e0484e9a..948a0eb6 100644 --- a/l10n/eu.php +++ b/l10n/eu.php @@ -66,9 +66,12 @@ "Error adding to group." => "Errore bat izan da taldera gehitzean.", "Error removing from group." => "Errore bat izan da taldetik kentzean.", "There was an error opening a mail composer." => "Errore bat izan da posta editorea abiaraztean.", +"Add address book" => "Gehitu helbide-liburua", +"Import done. Click here to cancel reloading." => "Inportatzea eginda. Hemen klikatu birkargatzea uzteko.", "Not all files uploaded. Retrying..." => "Fitxategi guztiak ez dira igo. Berriz saiatzen...", "Something went wrong with the upload, please retry." => "Zerbait gaizki joan da igotzean, mesedez saiatu berriz.", "Error" => "Errorea", +"Importing from {filename}..." => "Inportatzen {fitxategi-izena}...", "Importing..." => "Inportatzen", "Unable to upload your file as it is a directory or has 0 bytes" => "Ezin izan da zure fitxategia igo karpeta bat delako edo 0 byte dituelako", "Upload Error" => "Igotzeak huts egin du", @@ -143,12 +146,14 @@ "HomePage" => "WebOrria", "New Group" => "Talde berria", "Settings" => "Ezarpenak", +"Address books" => "Helbide liburuak", "Import" => "Inportatu", +"Select files to import" => "Hautatu inportatzeko fitxategiak", +"Select files" => "Hautatu fitxategiak", "Import into:" => "Inportatu hemen:", "OK" => "Ados", "(De-)select all" => "(Ez-)Hautatu dena", "New Contact" => "Kontaktu berria", -"Download Contact" => "Deskargatu kontaktua", "Groups" => "Taldeak", "Favorite" => "Gogokoa", "Delete Contact" => "Ezabatu kontaktua", @@ -179,9 +184,12 @@ "Nickname" => "Ezizena", "Enter nickname" => "Sartu ezizena", "Title" => "Izenburua", +"Enter title" => "Idatzi titulua", "Organization" => "Erakundea", +"Enter organization" => "Idatzi erakundea", "Birthday" => "Jaioteguna", "Notes go here..." => "Idatzi oharrak hemen...", +"Export as VCF" => "VCF gisa esportatu", "Add" => "Gehitu", "Phone" => "Telefonoa", "Email" => "Eposta", @@ -189,8 +197,10 @@ "Address" => "Helbidea", "Note" => "Oharra", "Web site" => "Web orria", +"Delete contact" => "Ezabatu kontaktua", "Preferred" => "Hobetsia", "Please specify a valid email address." => "Mesedez sartu eposta helbide egoki bat", +"someone@example.com" => "norbait@adibide.com", "Mail to address" => "Bidali helbidera", "Delete email address" => "Ezabatu eposta helbidea", "Enter phone number" => "Sartu telefono zenbakia", @@ -199,17 +209,21 @@ "Delete URL" => "Ezabatu URLa", "View on map" => "Ikusi mapan", "Delete address" => "Ezabatu helbidea", +"1 Main Street" => "Kale nagusia 1", "Street address" => "Kalearen helbidea", "12345" => "12345", "Postal code" => "Posta kodea", "Your city" => "Zure hiria", "City" => "Hiria", +"Some region" => "Eskualde bat", +"State or province" => "Estatu edo probintzia", "Your country" => "Zure herrialdea", "Country" => "Herrialdea", "Instant Messenger" => "Instant Messenger", "Delete IM" => "Ezabatu BM", "Share" => "Partekatu", "Export" => "Exportatu", +"CardDAV link" => "CardDAV lotura", "Add Contact" => "Gehitu kontaktua", "Drop photo to upload" => "Askatu argazkia igotzeko", "Edit name details" => "Editatu izenaren zehaztasunak", @@ -222,7 +236,6 @@ "Add notes here." => "Gehitu oharrak hemen.", "Add field" => "Gehitu eremua", "Download contact" => "Deskargatu kontaktua", -"Delete contact" => "Ezabatu kontaktua", "The temporary image has been removed from cache." => "Aldi bateko irudia cachetik ezabatu da.", "Edit address" => "Editatu helbidea", "Type" => "Mota", diff --git a/l10n/fa.php b/l10n/fa.php index cb56cff0..286b062e 100644 --- a/l10n/fa.php +++ b/l10n/fa.php @@ -88,6 +88,7 @@ "Email" => "نشانی پست الکترنیک", "Address" => "نشانی", "Note" => "یادداشت", +"Delete contact" => "پاک کردن اطلاعات شخص مورد نظر", "Preferred" => "مقدم", "Please specify a valid email address." => "لطفا یک پست الکترونیکی معتبر وارد کنید", "Mail to address" => "به نشانی ارسال شد", @@ -111,7 +112,6 @@ "Add notes here." => "اینجا یادداشت ها را بیافزایید", "Add field" => "اضافه کردن فیلد", "Download contact" => "دانلود مشخصات اشخاص", -"Delete contact" => "پاک کردن اطلاعات شخص مورد نظر", "The temporary image has been removed from cache." => "تصویر موقت از کش پاک شد.", "Edit address" => "ویرایش نشانی", "Type" => "نوع", diff --git a/l10n/fi_FI.php b/l10n/fi_FI.php index 4cc18108..64c10bcb 100644 --- a/l10n/fi_FI.php +++ b/l10n/fi_FI.php @@ -52,9 +52,12 @@ "Network or server error. Please inform administrator." => "Verkko- tai palvelinvirhe. Ilmoita asiasta ylläpitäjälle.", "Error adding to group." => "Virhe ryhmään lisättäessä.", "Error removing from group." => "Virhe poistettaessa ryhmästä.", +"Add address book" => "Lisää osoitekirja.", +"Import done. Click here to cancel reloading." => "Tuonti valmistui. Napsauta tästä peruaksesi uudelleen latauksen.", "Not all files uploaded. Retrying..." => "Kaikkia tiedostoja ei lähetetty. Yritetään uudelleen...", "Something went wrong with the upload, please retry." => "Jokin meni vikaan lähettäessä. Yritä uudelleen.", "Error" => "Virhe", +"{success} imported, {failed} failed." => "{success} tuotu, {failed} epäonnistui.", "Importing..." => "Tuodaan...", "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", @@ -126,11 +129,13 @@ "Contact not found." => "Yhteystietoja ei löytynyt.", "New Group" => "Uusi ryhmä", "Settings" => "Asetukset", +"Address books" => "Osoitekirjat", "Import" => "Tuo", +"Select files to import" => "Valitse tuotavat tiedostot", +"Select files" => "Valitse tiedostot", "OK" => "OK", "(De-)select all" => "Valitse kaikki tai poista kaikki valinnat", "New Contact" => "Uusi yhteystieto", -"Download Contact" => "Lataa yhteystieto", "Groups" => "Ryhmät", "Favorite" => "Suosikki", "Delete Contact" => "Poista yhteystieto", @@ -163,6 +168,7 @@ "Organization" => "Organisaatio", "Birthday" => "Syntymäpäivä", "Notes go here..." => "Muistiinpanot kuuluvat tähän...", +"Export as VCF" => "Vie VCF-muodossa", "Add" => "Lisää", "Phone" => "Puhelin", "Email" => "Sähköposti", @@ -170,6 +176,7 @@ "Address" => "Osoite", "Note" => "Huomio", "Web site" => "Verkkosivu", +"Delete contact" => "Poista yhteystieto", "Preferred" => "Ensisijainen", "Please specify a valid email address." => "Anna kelvollinen sähköpostiosoite.", "Mail to address" => "Lähetä sähköpostia", @@ -188,6 +195,7 @@ "Delete IM" => "Poista IM", "Share" => "Jaa", "Export" => "Vie", +"CardDAV link" => "CardDAV-linkki", "Add Contact" => "Lisää yhteystieto", "Drop photo to upload" => "Ladataksesi pudota kuva", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Itsemääritelty muoto, lyhyt nimi, pitkä nimi, vastakkainen tai vastakkainen pilkun kanssa", @@ -201,7 +209,6 @@ "Add notes here." => "Lisää huomiot tähän.", "Add field" => "Lisää kenttä", "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", diff --git a/l10n/fr.php b/l10n/fr.php index 64861d64..45321a41 100644 --- a/l10n/fr.php +++ b/l10n/fr.php @@ -150,7 +150,6 @@ "OK" => "OK", "(De-)select all" => "(Dé-)sélectionner tout", "New Contact" => "Nouveau Contact", -"Download Contact" => "Télécharger le Contact", "Groups" => "Groupes", "Favorite" => "Favoris", "Delete Contact" => "Supprimer le Contact", @@ -191,6 +190,7 @@ "Address" => "Adresse", "Note" => "Note", "Web site" => "Page web", +"Delete contact" => "Supprimer le contact", "Preferred" => "Préféré", "Please specify a valid email address." => "Veuillez entrer une adresse e-mail valide.", "someone@example.com" => "personne@exemple.com", @@ -228,7 +228,6 @@ "Add notes here." => "Ajouter des notes ici.", "Add field" => "Ajouter un champ.", "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", diff --git a/l10n/gl.php b/l10n/gl.php index 7ed57204..54f2c27c 100644 --- a/l10n/gl.php +++ b/l10n/gl.php @@ -142,6 +142,7 @@ "Address" => "Enderezo", "Note" => "Nota", "Web site" => "Sitio web", +"Delete contact" => "Borrar contacto", "Preferred" => "Preferido", "Please specify a valid email address." => "Indica unha dirección de correo electrónico válida.", "Mail to address" => "Enviar correo ao enderezo", @@ -171,7 +172,6 @@ "Add notes here." => "Engadir aquí as notas.", "Add field" => "Engadir campo", "Download contact" => "Descargar contacto", -"Delete contact" => "Borrar contacto", "The temporary image has been removed from cache." => "A imaxe temporal foi eliminada da caché.", "Edit address" => "Editar o enderezo", "Type" => "Escribir", diff --git a/l10n/he.php b/l10n/he.php index bda96ce8..60ddd67c 100644 --- a/l10n/he.php +++ b/l10n/he.php @@ -75,6 +75,7 @@ "Email" => "דואר אלקטרוני", "Address" => "כתובת", "Note" => "הערה", +"Delete contact" => "מחיקת איש קשר", "Preferred" => "מועדף", "Please specify a valid email address." => "אנא הזן כתובת דוא\"ל חוקית", "Mail to address" => "כתובת", @@ -97,7 +98,6 @@ "Add notes here." => "הוסף הערות כאן.", "Add field" => "הוסף שדה", "Download contact" => "הורדת איש קשר", -"Delete contact" => "מחיקת איש קשר", "Edit address" => "ערוך כתובת", "Type" => "סוג", "PO Box" => "תא דואר", diff --git a/l10n/hr.php b/l10n/hr.php index e1b95723..890d7cbf 100644 --- a/l10n/hr.php +++ b/l10n/hr.php @@ -80,6 +80,7 @@ "Email" => "E-mail", "Address" => "Adresa", "Note" => "Bilješka", +"Delete contact" => "Izbriši kontakt", "Preferred" => "Preferirano", "Please specify a valid email address." => "Upiši važeću email adresu.", "Delete email address" => "Izbriši email adresu", @@ -102,7 +103,6 @@ "Add notes here." => "Dodaj bilješke ovdje.", "Add field" => "Dodaj polje", "Download contact" => "Preuzmi kontakt", -"Delete contact" => "Izbriši kontakt", "Edit address" => "Uredi adresu", "Type" => "Tip", "PO Box" => "Poštanski Pretinac", diff --git a/l10n/hu_HU.php b/l10n/hu_HU.php index 1695ab37..0a87d4ab 100644 --- a/l10n/hu_HU.php +++ b/l10n/hu_HU.php @@ -88,6 +88,7 @@ "Email" => "E-mail", "Address" => "Cím", "Note" => "Jegyzet", +"Delete contact" => "Kapcsolat törlése", "Preferred" => "Előnyben részesített", "Please specify a valid email address." => "Adjon meg érvényes email címet", "Mail to address" => "Postai cím", @@ -111,7 +112,6 @@ "Add notes here." => "Megjegyzések", "Add field" => "Mező hozzáadása", "Download contact" => "Kapcsolat letöltése", -"Delete contact" => "Kapcsolat törlése", "The temporary image has been removed from cache." => "Az ideiglenes kép el lett távolítva a gyorsítótárból", "Edit address" => "Cím szerkesztése", "Type" => "Típus", diff --git a/l10n/ia.php b/l10n/ia.php index 234e38ef..dd3ddd4f 100644 --- a/l10n/ia.php +++ b/l10n/ia.php @@ -44,6 +44,7 @@ "Email" => "E-posta", "Address" => "Adresse", "Note" => "Nota", +"Delete contact" => "Deler contacto", "Preferred" => "Preferite", "Delete email address" => "Deler adresse de E-posta", "Enter phone number" => "Entrar un numero de telephono", @@ -59,7 +60,6 @@ "Add notes here." => "Adder notas hic", "Add field" => "Adder campo", "Download contact" => "Discargar contacto", -"Delete contact" => "Deler contacto", "Edit address" => "Modificar adresses", "Type" => "Typo", "PO Box" => "Cassa postal", diff --git a/l10n/id.php b/l10n/id.php index 1708307c..54526745 100644 --- a/l10n/id.php +++ b/l10n/id.php @@ -43,6 +43,7 @@ "Phone" => "telefon", "Email" => "surel", "Address" => "alamat", +"Delete contact" => "hapus kontak", "Preferred" => "disarankan", "City" => "kota", "Country" => "negara", @@ -53,7 +54,6 @@ "dd-mm-yyyy" => "dd-mm-yyyy", "Separate groups with commas" => "pisahkan grup dengan tanda koma", "Download contact" => "unduk kontak", -"Delete contact" => "hapus kontak", "Type" => "tipe", "PO Box" => "PO box", "Region" => "daerah", diff --git a/l10n/it.php b/l10n/it.php index a3d0347e..97cac3a5 100644 --- a/l10n/it.php +++ b/l10n/it.php @@ -49,6 +49,7 @@ "Couldn't load temporary image: " => "Impossibile caricare l'immagine temporanea: ", "No file was uploaded. Unknown error" => "Nessun file è stato inviato. Errore sconosciuto", "Contacts" => "Contatti", +"%d_selected_contacts" => "%d_contatti_selezionati", "Contact is already in this group." => "Il contatto è già in questo gruppo.", "Contacts are already in this group." => "I contatti sono già in questo gruppo.", "Couldn't get contact list." => "Impossibile ottenere l'elenco dei contatti.", @@ -159,7 +160,7 @@ "OK" => "OK", "(De-)select all" => "(De)seleziona tutto", "New Contact" => "Nuovo contatto", -"Download Contact" => "Scarica contatto", +"Download Contact(s)" => "Scarica contatto(i)", "Groups" => "Gruppi", "Favorite" => "Preferito", "Delete Contact" => "Elimina contatto", @@ -190,9 +191,12 @@ "Nickname" => "Pseudonimo", "Enter nickname" => "Inserisci pseudonimo", "Title" => "Titolo", +"Enter title" => "Inserisci il titolo", "Organization" => "Organizzazione", +"Enter organization" => "Inserisci l'organizzazione", "Birthday" => "Compleanno", "Notes go here..." => "Le note vanno qui...", +"Export as VCF" => "Esporta come VCF", "Add" => "Aggiungi", "Phone" => "Telefono", "Email" => "Email", @@ -200,6 +204,7 @@ "Address" => "Indirizzo", "Note" => "Nota", "Web site" => "Sito web", +"Delete contact" => "Elimina contatto", "Preferred" => "Preferito", "Please specify a valid email address." => "Specifica un indirizzo email valido", "someone@example.com" => "qualcuno@esempio.com", @@ -218,6 +223,7 @@ "Your city" => "La tua città", "City" => "Città", "Some region" => "Una regione", +"State or province" => "Stato o regione", "Your country" => "Il tuo paese", "Country" => "Stato", "Instant Messenger" => "Client di messaggistica istantanea", @@ -238,7 +244,6 @@ "Add notes here." => "Aggiungi qui le note.", "Add field" => "Aggiungi campo", "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", diff --git a/l10n/ja_JP.php b/l10n/ja_JP.php index 0473df82..1a2579b5 100644 --- a/l10n/ja_JP.php +++ b/l10n/ja_JP.php @@ -49,6 +49,7 @@ "Couldn't load temporary image: " => "一時的な画像の読み込みができませんでした: ", "No file was uploaded. Unknown error" => "ファイルは何もアップロードされていません。不明なエラー", "Contacts" => "連絡先", +"%d_selected_contacts" => "%d個の選択された連絡先", "Contact is already in this group." => "連絡先はすでにこのグループに存在します。", "Contacts are already in this group." => "連絡先はすでにこのグループに存在します。", "Couldn't get contact list." => "連絡先リストを取得できませんでした。", @@ -159,7 +160,7 @@ "OK" => "OK", "(De-)select all" => "すべての選択を解除", "New Contact" => "新しい連絡先", -"Download Contact" => "連絡先をダウンロード", +"Download Contact(s)" => "連絡先をダウンロード", "Groups" => "グループ", "Favorite" => "お気に入り", "Delete Contact" => "連絡先を削除", @@ -190,9 +191,12 @@ "Nickname" => "ニックネーム", "Enter nickname" => "ニックネームを入力", "Title" => "タイトル", +"Enter title" => "タイトルを入力", "Organization" => "所属", +"Enter organization" => "組織を入力", "Birthday" => "誕生日", "Notes go here..." => "メモはここに...", +"Export as VCF" => "VCFとしてエクスポート", "Add" => "追加", "Phone" => "電話番号", "Email" => "メールアドレス", @@ -200,6 +204,7 @@ "Address" => "住所", "Note" => "メモ", "Web site" => "ウェブサイト", +"Delete contact" => "連絡先の削除", "Preferred" => "推奨", "Please specify a valid email address." => "有効なメールアドレスを指定してください。", "someone@example.com" => "someone@example.com", @@ -218,6 +223,7 @@ "Your city" => "市", "City" => "都市", "Some region" => "都道府県", +"State or province" => "州/県", "Your country" => "国", "Country" => "国名", "Instant Messenger" => "インスタントメッセンジャー", @@ -238,7 +244,6 @@ "Add notes here." => "ここにメモを追加。", "Add field" => "項目を追加", "Download contact" => "連絡先のダウンロード", -"Delete contact" => "連絡先の削除", "The temporary image has been removed from cache." => "一時画像はキャッシュから削除されました。", "Edit address" => "住所を編集", "Type" => "種類", diff --git a/l10n/ka_GE.php b/l10n/ka_GE.php index c2b4e5c0..f054febd 100644 --- a/l10n/ka_GE.php +++ b/l10n/ka_GE.php @@ -46,6 +46,7 @@ "Email" => "იმეილი", "Address" => "მისამართი", "Note" => "შენიშვნა", +"Delete contact" => "კონტაქტის წაშლა", "City" => "ქალაქი", "Country" => "ქვეყანა", "Share" => "გაზიარება", @@ -56,7 +57,6 @@ "Enter email address" => "ჩაწერეთ იმეილ მისამართი", "Add field" => "დაამატე ველი", "Download contact" => "კონტაქტის ჩამოტვირთვა", -"Delete contact" => "კონტაქტის წაშლა", "Edit address" => "მისამართის რედაქტირება", "Type" => "ტიპი", "PO Box" => "PO ყუთი", diff --git a/l10n/ko.php b/l10n/ko.php index 317d066b..2eaeaa64 100644 --- a/l10n/ko.php +++ b/l10n/ko.php @@ -159,7 +159,6 @@ "OK" => "확인", "(De-)select all" => "전체 선택(해제)", "New Contact" => "새 연락처", -"Download Contact" => "연락처 다운로드", "Groups" => "그룹", "Favorite" => "즐겨찾기", "Delete Contact" => "연락처 삭제", @@ -190,7 +189,9 @@ "Nickname" => "별명", "Enter nickname" => "별명 입력", "Title" => "직위", +"Enter title" => "제목 입력", "Organization" => "조직", +"Enter organization" => "조직명 입력", "Birthday" => "생일", "Notes go here..." => "메모를 입력하십시오...", "Add" => "추가", @@ -200,6 +201,7 @@ "Address" => "주소", "Note" => "메모", "Web site" => "웹 사이트", +"Delete contact" => "연락처 삭제", "Preferred" => "선호함", "Please specify a valid email address." => "올바른 이메일 주소를 입력하십시오.", "someone@example.com" => "someone@example.com", @@ -218,6 +220,7 @@ "Your city" => "도시", "City" => "도시", "Some region" => "지역", +"State or province" => "주 또는 도", "Your country" => "국가", "Country" => "국가", "Instant Messenger" => "인스턴트 메신저", @@ -238,7 +241,6 @@ "Add notes here." => "여기에 메모를 추가하십시오.", "Add field" => "항목 추가", "Download contact" => "연락처 다운로드", -"Delete contact" => "연락처 삭제", "The temporary image has been removed from cache." => "임시 그림이 캐시에서 삭제되었습니다. ", "Edit address" => "주소 편집", "Type" => "종류", diff --git a/l10n/lb.php b/l10n/lb.php index f5118af6..ae9788a3 100644 --- a/l10n/lb.php +++ b/l10n/lb.php @@ -58,6 +58,7 @@ "Email" => "Email", "Address" => "Adress", "Note" => "Note", +"Delete contact" => "Kontakt läschen", "Enter phone number" => "Telefonsnummer aginn", "Delete phone number" => "Telefonsnummer läschen", "View on map" => "Op da Kaart uweisen", @@ -70,7 +71,6 @@ "Edit groups" => "Gruppen editéieren", "Edit address details" => "Adress Detailer editéieren", "Download contact" => "Kontakt eroflueden", -"Delete contact" => "Kontakt läschen", "Type" => "Typ", "PO Box" => "Postleetzuel", "Extended" => "Erweidert", diff --git a/l10n/lt_LT.php b/l10n/lt_LT.php index 6671a155..44dbb276 100644 --- a/l10n/lt_LT.php +++ b/l10n/lt_LT.php @@ -50,13 +50,13 @@ "Phone" => "Telefonas", "Email" => "El. paštas", "Address" => "Adresas", +"Delete contact" => "Ištrinti kontaktą", "City" => "Miestas", "Country" => "Šalis", "Share" => "Dalintis", "Export" => "Eksportuoti", "Add Contact" => "Pridėti kontaktą", "Download contact" => "Atsisųsti kontaktą", -"Delete contact" => "Ištrinti kontaktą", "Type" => "Tipas", "PO Box" => "Pašto dėžutė", "Region" => "Regionas", diff --git a/l10n/mk.php b/l10n/mk.php index 85a215cf..b228d5e9 100644 --- a/l10n/mk.php +++ b/l10n/mk.php @@ -88,6 +88,7 @@ "Email" => "Е-пошта", "Address" => "Адреса", "Note" => "Забелешка", +"Delete contact" => "Избриши го контактот", "Preferred" => "Претпочитано", "Please specify a valid email address." => "Ве молам внесете правилна адреса за е-пошта.", "Mail to address" => "Прати порака до адреса", @@ -111,7 +112,6 @@ "Add notes here." => "Внесете забелешки тука.", "Add field" => "Додади поле", "Download contact" => "Преземи го контактот", -"Delete contact" => "Избриши го контактот", "The temporary image has been removed from cache." => "Привремената слика е отстранета од кешот.", "Edit address" => "Уреди адреса", "Type" => "Тип", diff --git a/l10n/ms_MY.php b/l10n/ms_MY.php index 49cc5129..5b411a6e 100644 --- a/l10n/ms_MY.php +++ b/l10n/ms_MY.php @@ -92,6 +92,7 @@ "Email" => "Emel", "Address" => "Alamat", "Note" => "Nota", +"Delete contact" => "Padam hubungan", "Preferred" => "Pilihan", "Please specify a valid email address." => "Berikan alamat emel yang sah.", "Mail to address" => "Hantar ke alamat", @@ -115,7 +116,6 @@ "Add notes here." => "Letak nota disini.", "Add field" => "Letak ruangan", "Download contact" => "Muat turun hubungan", -"Delete contact" => "Padam hubungan", "The temporary image has been removed from cache." => "Imej sementara telah dibuang dari cache.", "Edit address" => "Ubah alamat", "Type" => "Jenis", diff --git a/l10n/nb_NO.php b/l10n/nb_NO.php index 11b0e4d2..e3309aaf 100644 --- a/l10n/nb_NO.php +++ b/l10n/nb_NO.php @@ -105,6 +105,7 @@ "Address" => "Adresse", "Note" => "Notat", "Web site" => "Hjemmeside", +"Delete contact" => "Slett kontakt", "Preferred" => "Foretrukket", "Please specify a valid email address." => "Vennligst angi en gyldig e-postadresse.", "Mail to address" => "Send e-post til adresse", @@ -128,7 +129,6 @@ "Add notes here." => "Legg inn notater her.", "Add field" => "Legg til felt", "Download contact" => "Hend ned kontakten", -"Delete contact" => "Slett kontakt", "The temporary image has been removed from cache." => "Det midlertidige bildet er fjernet fra cache.", "Edit address" => "Endre adresse", "Type" => "Type", diff --git a/l10n/nl.php b/l10n/nl.php index 951d8973..9ff5ffdb 100644 --- a/l10n/nl.php +++ b/l10n/nl.php @@ -149,7 +149,6 @@ "OK" => "OK", "(De-)select all" => "(De-)selecteer alle", "New Contact" => "Nieuw Contact", -"Download Contact" => "Download Contact", "Groups" => "Groepen", "Favorite" => "Favoriet", "Delete Contact" => "Verwijder Contact", @@ -190,6 +189,7 @@ "Address" => "Adres", "Note" => "Notitie", "Web site" => "Website", +"Delete contact" => "Verwijder contact", "Preferred" => "Voorkeur", "Please specify a valid email address." => "Geef een geldig email adres op.", "someone@example.com" => "iemand@voorbeeld.nl", @@ -223,7 +223,6 @@ "Add notes here." => "Voeg notitie toe", "Add field" => "Voeg veld toe", "Download contact" => "Download contact", -"Delete contact" => "Verwijder contact", "The temporary image has been removed from cache." => "Het tijdelijke plaatje is uit de cache verwijderd.", "Edit address" => "Wijzig adres", "Type" => "Type", diff --git a/l10n/nn_NO.php b/l10n/nn_NO.php index 26160faf..4ac4999a 100644 --- a/l10n/nn_NO.php +++ b/l10n/nn_NO.php @@ -35,13 +35,13 @@ "Phone" => "Telefonnummer", "Email" => "Epost", "Address" => "Adresse", +"Delete contact" => "Slett kontakt", "Preferred" => "Føretrekt", "City" => "Stad", "Country" => "Land", "Export" => "Eksporter", "Add Contact" => "Legg til kontakt", "Download contact" => "Last ned kontakt", -"Delete contact" => "Slett kontakt", "Type" => "Skriv", "PO Box" => "Postboks", "Extended" => "Utvida", diff --git a/l10n/pl.php b/l10n/pl.php index 05eb78b8..b0712c1e 100644 --- a/l10n/pl.php +++ b/l10n/pl.php @@ -55,6 +55,7 @@ "Contact is not in this group." => "Kontakt nie jest w tej grupie.", "Contacts are not in this group." => "Kontakty nie sa w tej grupie.", "A group named {group} already exists" => "Nazwa grupy {group} już istnieje", +"You can drag groups to\narrange them as you like." => "Można przeciągnąć grupy do\naby podzielić je jak chcesz.", "All" => "Wszystkie", "Favorites" => "Ulubione", "Shared by {owner}" => "Udostępnione przez {owner}", @@ -67,9 +68,14 @@ "Error adding to group." => "Błąd dodania do grupy.", "Error removing from group." => "Błąd usunięcia z grupy.", "There was an error opening a mail composer." => "Wystąpił błąd podczas otwierania edytora.", +"Deleting done. Click here to cancel reloading." => "Usuwanie udane. Kliknij tu aby anulować przeładowanie.", +"Add address book" => "Dodaj książkę adresową", +"Import done. Click here to cancel reloading." => "Importowanie zakończone. Kliknij tu aby anulować przeładowanie.", "Not all files uploaded. Retrying..." => "Nie wszystkie pliki załadowane. Ponowna próba...", "Something went wrong with the upload, please retry." => "Coś poszło nie tak z ładowanie, proszę spróbować ponownie.", "Error" => "Błąd", +"Importing from {filename}..." => "Importowanie z {filename}...", +"{success} imported, {failed} failed." => "{success} udanych, {failed} nieudanych.", "Importing..." => "Importowanie...", "Unable to upload your file as it is a directory or has 0 bytes" => "Nie można przesłać pliku, ponieważ to jest katalog lub ma 0 bajtów", "Upload Error" => "Błąd ładowania", @@ -145,12 +151,14 @@ "HomePage" => "Strona domowa", "New Group" => "Nowa grupa", "Settings" => "Ustawienia", +"Address books" => "Książki adresowe", "Import" => "Import", +"Select files to import" => "Wybierz pliki do importu", +"Select files" => "Wybierz pliki", "Import into:" => "Importuj do:", "OK" => "OK", "(De-)select all" => "Odznacz wszystkie", "New Contact" => "Nowy kontakt", -"Download Contact" => "Pobierz kontakt", "Groups" => "Grupy", "Favorite" => "Ulubione", "Delete Contact" => "Usuń kontakt", @@ -181,9 +189,12 @@ "Nickname" => "Nazwa", "Enter nickname" => "Wpisz nazwę", "Title" => "Tytuł", +"Enter title" => "Wpisz nazwę", "Organization" => "Organizacja", +"Enter organization" => "Wpisz organizację", "Birthday" => "Urodziny", "Notes go here..." => "Notatki kliknij tutaj...", +"Export as VCF" => "Eksportuj jako VCF", "Add" => "Dodaj", "Phone" => "Telefon", "Email" => "E-mail", @@ -191,6 +202,7 @@ "Address" => "Adres", "Note" => "Uwaga", "Web site" => "Strona www", +"Delete contact" => "Usuwa kontakt", "Preferred" => "Preferowane", "Please specify a valid email address." => "Określ prawidłowy adres e-mail.", "someone@example.com" => "twójmail@twojadomena.pl", @@ -209,12 +221,14 @@ "Your city" => "Twoje miasto", "City" => "Miasto", "Some region" => "Region", +"State or province" => "Województwo ", "Your country" => "Twoje państwo", "Country" => "Kraj", "Instant Messenger" => "Komunikator", "Delete IM" => "Usuń Komunikator", "Share" => "Udostępnij", "Export" => "Export", +"CardDAV link" => "Link CardDAV", "Add Contact" => "Dodaj kontakt", "Drop photo to upload" => "Upuść fotografię aby załadować", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format niestandardowy, krótkie nazwy, imię i nazwisko, Odwracać lub Odwrócić z przecinkiem", @@ -228,7 +242,6 @@ "Add notes here." => "Dodaj notatkę tutaj.", "Add field" => "Dodaj pole", "Download contact" => "Pobiera kontakt", -"Delete contact" => "Usuwa kontakt", "The temporary image has been removed from cache." => "Tymczasowy obraz został usunięty z pamięci podręcznej.", "Edit address" => "Edytuj adres", "Type" => "Typ", diff --git a/l10n/pt_BR.php b/l10n/pt_BR.php index c9b57027..c03d01bc 100644 --- a/l10n/pt_BR.php +++ b/l10n/pt_BR.php @@ -155,6 +155,7 @@ "Address" => "Endereço", "Note" => "Nota", "Web site" => "Web site", +"Delete contact" => "Apagar contato", "Preferred" => "Preferido", "Please specify a valid email address." => "Por favor, especifique um email válido.", "Mail to address" => "Correio para endereço", @@ -184,7 +185,6 @@ "Add notes here." => "Adicionar notas", "Add field" => "Adicionar campo", "Download contact" => "Baixar contato", -"Delete contact" => "Apagar contato", "The temporary image has been removed from cache." => "A imagem temporária foi removida cache.", "Edit address" => "Editar endereço", "Type" => "Digite", diff --git a/l10n/pt_PT.php b/l10n/pt_PT.php index 78216ec2..fd864100 100644 --- a/l10n/pt_PT.php +++ b/l10n/pt_PT.php @@ -159,7 +159,6 @@ "OK" => "OK", "(De-)select all" => "(Des)seleccionar todos", "New Contact" => "Novo Contacto", -"Download Contact" => "Transferir o contacto", "Groups" => "Grupos", "Favorite" => "Favorito", "Delete Contact" => "Eliminar o Contacto", @@ -200,6 +199,7 @@ "Address" => "Morada", "Note" => "Nota", "Web site" => "Página web", +"Delete contact" => "Apagar contacto", "Preferred" => "Preferido", "Please specify a valid email address." => "Por favor indique um endereço de correio válido", "someone@example.com" => "alguem@exemplo.com", @@ -238,7 +238,6 @@ "Add notes here." => "Insira notas aqui.", "Add field" => "Adicionar campo", "Download contact" => "Transferir contacto", -"Delete contact" => "Apagar contacto", "The temporary image has been removed from cache." => "A imagem temporária foi retirada do cache.", "Edit address" => "Editar endereço", "Type" => "Tipo", diff --git a/l10n/ro.php b/l10n/ro.php index abde4bd3..5795d43a 100644 --- a/l10n/ro.php +++ b/l10n/ro.php @@ -84,6 +84,7 @@ "Address" => "Adresă", "Note" => "Notă", "Web site" => "Site web", +"Delete contact" => "Șterge contact", "Preferred" => "Preferat", "Please specify a valid email address." => "Te rog să specifici un e-mail corect", "Mail to address" => "Trimite mesaj la e-mail", @@ -108,7 +109,6 @@ "Add notes here." => "Adaugă note", "Add field" => "Adaugă câmp", "Download contact" => "Descarcă acest contact", -"Delete contact" => "Șterge contact", "The temporary image has been removed from cache." => "Imaginea temporară a fost eliminată din cache.", "Edit address" => "Editeză adresă", "Type" => "Tip", diff --git a/l10n/ru.php b/l10n/ru.php index 6ac22d7a..764b7bc0 100644 --- a/l10n/ru.php +++ b/l10n/ru.php @@ -2,6 +2,10 @@ "Error (de)activating addressbook." => "Ошибка (де)активации адресной книги.", "id is not set." => "id не установлен.", "Cannot update addressbook with an empty name." => "Нельзя обновить адресную книгу с пустым именем.", +"No category name given." => "Не задано имя категории", +"Error adding group." => "Ошибка добавления группы.", +"Group ID missing from request." => "В запросе отсутствует ID группы.", +"Contact ID missing from request." => "В запросе отсутствует ID контакта.", "No ID provided" => "ID не предоставлен", "Error setting checksum." => "Ошибка установки контрольной суммы.", "No categories selected for deletion." => "Категории для удаления не установлены.", @@ -10,8 +14,10 @@ "element name is not set." => "имя элемента не установлено.", "checksum is not set." => "контрольная сумма не установлена.", "Information about vCard is incorrect. Please reload the page." => "Информация о vCard некорректна. Пожалуйста, обновите страницу.", +"Couldn't find vCard for %d." => "Невозможно найти vCard для %d.", "Information about vCard is incorrect. Please reload the page: " => "Информация о vCard не корректна. Перезагрузите страницу: ", "Something went FUBAR. " => "Что-то пошло FUBAR.", +"Cannot save property of type \"%s\" as array" => "Невозможно сохранить свойство типа \"%s\", как массив", "Missing IM parameter." => "Отсутствует параметр IM.", "Unknown IM: " => "Неизвестный IM:", "No contact ID was submitted." => "Нет контакта ID", @@ -29,6 +35,9 @@ "Error cropping image" => "Ошибка обрезки изображений", "Error creating temporary image" => "Ошибка создания временных изображений", "Error finding image: " => "Ошибка поиска изображений:", +"Key is not set for: " => "Не установлен ключ для:", +"Value is not set for: " => "Не установлено значение для:", +"Could not set preference: " => "Не удалось установить важность:", "Error uploading contacts to storage." => "Ошибка загрузки контактов в хранилище.", "There is no error, the file uploaded with success" => "Файл загружен успешно.", "The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Загружаемый файл первосходит значение переменной upload_max_filesize, установленно в php.ini", @@ -40,10 +49,33 @@ "Couldn't load temporary image: " => "Не удалось загрузить временное изображение:", "No file was uploaded. Unknown error" => "Файл не был загружен. Неизвестная ошибка", "Contacts" => "Контакты", +"Contact is already in this group." => "Контакт уже находятся в этой группе.", +"Contacts are already in this group." => "Контакты уже находятся в этой группе.", +"Couldn't get contact list." => "Не удалось получить список контактов.", +"Contact is not in this group." => "Контакт не в этой группе.", +"Contacts are not in this group." => "Контакты не в этой группе.", +"A group named {group} already exists" => "Группа с названием {group} уже существует", +"You can drag groups to\narrange them as you like." => "Вы можете перетащить группы в\nрасположите их как вам нравится", +"All" => "Все", +"Favorites" => "Избранное", +"Shared by {owner}" => "Опубликовано {owner}", +"Indexing contacts" => "Индексация контактов", +"Add to..." => "Добавить в...", +"Remove from..." => "Удалить из...", +"Add group..." => "Добавить группу...", "Select photo" => "Выберите фото", +"Network or server error. Please inform administrator." => "Ошибка сети или сервера. Пожалуйста, обратитесь к администратору.", +"Error adding to group." => "Ошибка добавления в группу.", +"Error removing from group." => "Ошибка удаления из группы", +"There was an error opening a mail composer." => "Произошла ошибка при открытии почтовой программы.", +"Deleting done. Click here to cancel reloading." => "Удаление завершено. Щелкните здесь для отмены перезагрузки.", +"Add address book" => "Добавить адресную книгу", +"Import done. Click here to cancel reloading." => "Импорт завершен. Щелкните здесь для отмены перезагрузки.", "Not all files uploaded. Retrying..." => "Не все файлы были загружены. Повторяю...", "Something went wrong with the upload, please retry." => "В процессе загрузки что-то пошло не так, пожалуйста загрузите повторно.", "Error" => "Ошибка", +"Importing from {filename}..." => "Импорт из {filename}...", +"{success} imported, {failed} failed." => "{success} импортировано, {failed} потеряно.", "Importing..." => "Импортирую...", "Unable to upload your file as it is a directory or has 0 bytes" => "Файл не был загружен: его размер 0 байт либо это не файл, а директория.", "Upload Error" => "Ошибка при загрузке", @@ -56,8 +88,13 @@ "Error loading profile picture." => "Ошибка загрузки изображения профиля.", "Enter name" => "Введите имя", "Enter description" => "Ввдите описание", +"Select addressbook" => "Выбрать адресную книгу", "The address book name cannot be empty." => "Имя адресной книги не может быть пустым.", +"Is this correct?" => "Это верно?", +"There was an unknown error when trying to delete this contact" => "Произошла неизвестная ошибка при попытке удалить этот контакт", "Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Некоторые контакты помечены на удаление, но ещё не удалены. Подождите, пока они удаляются.", +"Click to undo deletion of {num} contacts" => "Нажмите для отмены удаления {num} контактов", +"Cancelled deletion of {num}" => "Отменено удаление {num}", "Result: " => "Результат:", " imported, " => "импортировано, ", " failed." => "не удалось.", @@ -100,6 +137,7 @@ "Internet" => "Интернет", "Friends" => "Друзья", "Family" => "Семья", +"There was an error deleting properties for this contact." => "Произошла ошибка при удалении свойств данного контакта.", "{name}'s Birthday" => "День рождения {name}", "Contact" => "Контакт", "You do not have the permissions to add contacts to this addressbook." => "У вас нет права создавать контакты в этой адресной книге.", @@ -109,11 +147,20 @@ "Could not find the Addressbook with ID: " => "Не могу найти адресную книгу с ID:", "You do not have the permissions to delete this contact." => "У вас нет разрешений удалять этот контакт.", "There was an error deleting this contact." => "Ошибка при удалении контакта.", +"Contact not found." => "Контакт не найден.", +"HomePage" => "Домашняя страница", +"New Group" => "Новая группа", "Settings" => "Настройки", +"Address books" => "Адресная книга", "Import" => "Импорт", +"Select files to import" => "Выберите файлы для импорта:", +"Select files" => "Выберите файл", +"Import into:" => "Импорт в", "OK" => "ОК", +"(De-)select all" => "(Отменить) отметить все", "New Contact" => "Новый контакт", "Groups" => "Группы", +"Favorite" => "Избранное", "Delete Contact" => "Удалить контакт", "Close" => "Закрыть", "Keyboard shortcuts" => "Горячие клавиши", @@ -128,17 +175,26 @@ "Add new contact" => "Добавить новый контакт", "Add new addressbook" => "Добавить новую адресную книгу", "Delete current contact" => "Удалить текущий контакт", +"
Add a new contact or import existing contacts from a VCF file.
" => "Добавьте новый контакт или импортируйте контакты из VCF файла.
", "Add contact" => "Добавить контакт", +"Compose mail" => "Написать письмо", +"Delete group" => "Удалить группу", "Delete current photo" => "Удалить текущую фотографию", "Edit current photo" => "Редактировать текущую фотографию", "Upload new photo" => "Загрузить новую фотографию", "Select photo from ownCloud" => "Выбрать фотографию из ownCloud", +"First name" => "Имя", "Additional names" => "Отчество", +"Last name" => "Фамилия", "Nickname" => "Псевдоним", "Enter nickname" => "Введите псевдоним", "Title" => "Заголовок", +"Enter title" => "Введите название", "Organization" => "Организация", +"Enter organization" => "Введите организацию", "Birthday" => "День рождения", +"Notes go here..." => "Здесь будут заметки...", +"Export as VCF" => "Экспорт в VCF", "Add" => "Добавить", "Phone" => "Телефон", "Email" => "Эл. почта", @@ -146,8 +202,10 @@ "Address" => "Адрес", "Note" => "Заметка", "Web site" => "Веб-сайт", +"Delete contact" => "Удалить контакт", "Preferred" => "Предпочитаемый", "Please specify a valid email address." => "Укажите правильный адрес электронной почты.", +"someone@example.com" => "someone@example.com", "Mail to address" => "Написать по адресу", "Delete email address" => "Удалить адрес электронной почты", "Enter phone number" => "Введите номер телефона", @@ -155,14 +213,22 @@ "Go to web site" => "Перейти на веб-сайт", "Delete URL" => "Удалить URL", "View on map" => "Показать на карте", +"Delete address" => "Удалить адрес", +"1 Main Street" => "1 Ленина улица", "Street address" => "Улица", +"12345" => "12345", "Postal code" => "Почтовый индекс", +"Your city" => "Ваш город", "City" => "Город", +"Some region" => "Некоторый регион", +"State or province" => "Область или район", +"Your country" => "Ваша страна", "Country" => "Страна", "Instant Messenger" => "Instant Messenger", "Delete IM" => "Удалить IM", "Share" => "Опубликовать", "Export" => "Экспорт", +"CardDAV link" => "Ссылка CardDAV", "Add Contact" => "Добавить Контакт", "Drop photo to upload" => "Перетяните фотографии для загрузки", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Формат Краткое имя, Полное имя", @@ -176,7 +242,6 @@ "Add notes here." => "Добавьте заметки здесь.", "Add field" => "Добавить поле", "Download contact" => "Скачать контакт", -"Delete contact" => "Удалить контакт", "The temporary image has been removed from cache." => "Временный образ был удален из кэша.", "Edit address" => "Редактировать адрес", "Type" => "Тип", diff --git a/l10n/ru_RU.php b/l10n/ru_RU.php index 2195564b..160ae820 100644 --- a/l10n/ru_RU.php +++ b/l10n/ru_RU.php @@ -150,7 +150,6 @@ "OK" => "OK", "(De-)select all" => "Отметить(снять отметку) все", "New Contact" => "Новый контакт", -"Download Contact" => "Загрузить контакт", "Groups" => "Группы", "Favorite" => "Избранный", "Delete Contact" => "Удалить контакт", @@ -191,6 +190,7 @@ "Address" => "Адрес", "Note" => "Заметки", "Web site" => "Веб-сайт", +"Delete contact" => "Удалить контакт", "Preferred" => "Предпочтительный", "Please specify a valid email address." => "Пожалуйста,укажите действительный email адрес.", "someone@example.com" => "someone@example.com", @@ -228,7 +228,6 @@ "Add notes here." => "Добавить здесь заметок.", "Add field" => "Добавить поле", "Download contact" => "загрузить контакт", -"Delete contact" => "Удалить контакт", "The temporary image has been removed from cache." => "Временное изображение было удалено из кэша.", "Edit address" => "Редактировать адрес", "Type" => "Тип", diff --git a/l10n/si_LK.php b/l10n/si_LK.php index db094b54..0262dcd6 100644 --- a/l10n/si_LK.php +++ b/l10n/si_LK.php @@ -93,6 +93,7 @@ "Address" => "ලිපිනය", "Note" => "නෝට්ටුවක්", "Web site" => "වෙබ් අඩවිය", +"Delete contact" => "සබඳතාව මකන්න", "Preferred" => "රුචි", "Please specify a valid email address." => "වලංගු විද්යුත් තැපැල් ලිපිනයක් ලබා දෙන්න", "Mail to address" => "තැපැල් එවිය යුතු ලිපිනය", @@ -117,7 +118,6 @@ "Add notes here." => "මෙතැන නෝට්ටුවක් තබන්න", "Add field" => "ක්ෂේත්රයක් එකතු කරන්න", "Download contact" => "සබඳතා බාගත කරන්න", -"Delete contact" => "සබඳතාව මකන්න", "Edit address" => "ලිපිනය සංස්කරණය කරන්න", "Type" => "වර්ගය", "PO Box" => "තැ.පෙ.", diff --git a/l10n/sk_SK.php b/l10n/sk_SK.php index 3a39de53..3d3311e9 100644 --- a/l10n/sk_SK.php +++ b/l10n/sk_SK.php @@ -159,7 +159,6 @@ "OK" => "OK", "(De-)select all" => "(Ne-)vybrať všetky", "New Contact" => "Nový kontakt", -"Download Contact" => "Stiahnuť kontakt", "Groups" => "Skupiny", "Favorite" => "Obľúbené", "Delete Contact" => "Odstrániť kontakt", @@ -200,6 +199,7 @@ "Address" => "Adresa", "Note" => "Poznámka", "Web site" => "Web stránka", +"Delete contact" => "Odstrániť kontakt", "Preferred" => "Uprednostňované", "Please specify a valid email address." => "Prosím zadajte platnú e-mailovú adresu.", "someone@example.com" => "niekto@niečo.sk", @@ -238,7 +238,6 @@ "Add notes here." => "Tu môžete pridať poznámky.", "Add field" => "Pridať pole", "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", diff --git a/l10n/sl.php b/l10n/sl.php index 326f392d..0881be5f 100644 --- a/l10n/sl.php +++ b/l10n/sl.php @@ -159,7 +159,6 @@ "OK" => "V redu", "(De-)select all" => "(Od-)izberi vse", "New Contact" => "Nov stik", -"Download Contact" => "Prenesi stik", "Groups" => "Skupine", "Favorite" => "Priljubljen", "Delete Contact" => "Izbriši stik", @@ -200,6 +199,7 @@ "Address" => "Naslov", "Note" => "Opomba", "Web site" => "Spletna stran", +"Delete contact" => "Izbriši stik", "Preferred" => "Prednostno", "Please specify a valid email address." => "Navesti je treba veljaven elektronski poštni naslov.", "someone@example.com" => "nekdo@primer.com", @@ -238,7 +238,6 @@ "Add notes here." => "Opombe dodajte tukaj.", "Add field" => "Dodaj polje", "Download contact" => "Prejmi stik", -"Delete contact" => "Izbriši stik", "The temporary image has been removed from cache." => "Začasna slika je odstranjena iz predpomnilnika.", "Edit address" => "Uredi naslov", "Type" => "Vrsta", diff --git a/l10n/sr.php b/l10n/sr.php index 7962513d..a02076b5 100644 --- a/l10n/sr.php +++ b/l10n/sr.php @@ -1,6 +1,8 @@ "Greška u (de)aktiviranju adresara", "No categories selected for deletion." => "Ни једна категорија није означена за брисање.", "Information about vCard is incorrect. Please reload the page." => "Подаци о вКарти су неисправни. Поново учитајте страницу.", +"Error loading image." => "Greška pri učitavanju slika", "There is no error, the file uploaded with success" => "Нема грешке, фајл је успешно послат", "The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Послати фајл превазилази директиву upload_max_filesize из ", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Послати фајл превазилази директиву MAX_FILE_SIZE која је наведена у ХТМЛ форми", @@ -31,6 +33,10 @@ "Import" => "Увези", "Groups" => "Групе", "Close" => "Затвори", +"Delete current photo" => "Izbriši trenutnu fotografiju", +"Edit current photo" => "Izmeni trenutnu fotografiju", +"Upload new photo" => "Učitaj novu fotografiju", +"Select photo from ownCloud" => "Izaberi fotografiju sa ownCloud", "Title" => "Наслов", "Organization" => "Организација", "Birthday" => "Рођендан", @@ -38,6 +44,7 @@ "Phone" => "Телефон", "Email" => "Е-маил", "Address" => "Адреса", +"Delete contact" => "Обриши контакт", "Preferred" => "Пожељан", "City" => "Град", "Country" => "Земља", @@ -45,13 +52,15 @@ "Export" => "Извези", "Add Contact" => "Додај контакт", "Download contact" => "Преузми контакт", -"Delete contact" => "Обриши контакт", +"Edit address" => "Izmeni adresu", "Type" => "Тип", "PO Box" => "Поштански број", "Extended" => "Прошири", "Region" => "Регија", "Zipcode" => "Зип код", "Addressbook" => "Адресар", +"more info" => "више информација", +"iOS/OS X" => "iOS/OS X", "Addressbooks" => "Адресар", "New Address Book" => "Нови адресар", "Name" => "Име", diff --git a/l10n/sv.php b/l10n/sv.php index 7981153d..cabf15c5 100644 --- a/l10n/sv.php +++ b/l10n/sv.php @@ -159,7 +159,6 @@ "OK" => "OK", "(De-)select all" => "(Av-)markera alla", "New Contact" => "Ny kontakt", -"Download Contact" => "Ladda ner kontakt", "Groups" => "Grupper", "Favorite" => "Favorit", "Delete Contact" => "Radera kontakt", @@ -200,6 +199,7 @@ "Address" => "Adress", "Note" => "Notering", "Web site" => "Webbplats", +"Delete contact" => "Radera kontakt", "Preferred" => "Föredragen", "Please specify a valid email address." => "Vänligen ange en giltig e-postadress.", "someone@example.com" => "någon@exempel.com", @@ -238,7 +238,6 @@ "Add notes here." => "Lägg till noteringar här.", "Add field" => "Lägg till fält", "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", diff --git a/l10n/ta_LK.php b/l10n/ta_LK.php index f5680daf..e7532828 100644 --- a/l10n/ta_LK.php +++ b/l10n/ta_LK.php @@ -147,7 +147,6 @@ "OK" => "சரி ", "(De-)select all" => "எல்லாவற்றையும் தெரிவுசெய்க (செய்யாதிக-)", "New Contact" => "புதிய தொடர்பு", -"Download Contact" => "தொடர்பை பதிவிறக்குக", "Groups" => "குழுக்கள்", "Favorite" => "விருப்பமான", "Delete Contact" => "தொடர்பை நீக்குக", @@ -188,6 +187,7 @@ "Address" => "முகவரி", "Note" => "குறிப்பு", "Web site" => "வலைய தளம்", +"Delete contact" => "தொடர்பை நீக்குக", "Preferred" => "விரும்பிய", "Please specify a valid email address." => "தயவுசெய்து செல்லுபடியான மின்னஞ்சல் முகவரியை குறிப்பிடுக.", "someone@example.com" => "someone@example.com", @@ -225,7 +225,6 @@ "Add notes here." => "குறிப்புக்களை இங்கே சேர்க்க", "Add field" => "புலத்தை சேர்க்க", "Download contact" => "தொடர்பை தரவிறக்குக", -"Delete contact" => "தொடர்பை நீக்குக", "The temporary image has been removed from cache." => "தற்காலிக படம் இடைமாற்றுநினைவகத்திலிருந்து அகற்றப்படுகிறது.", "Edit address" => "முகவரியை தொகுக்க", "Type" => "வகை", diff --git a/l10n/th_TH.php b/l10n/th_TH.php index a01525df..cf8d1dc9 100644 --- a/l10n/th_TH.php +++ b/l10n/th_TH.php @@ -150,7 +150,6 @@ "OK" => "ตกลง", "(De-)select all" => "ยกเลิกการเลือกทั้งหมด", "New Contact" => "สร้างรายชื่อผู้ติดต่อใหม่", -"Download Contact" => "ดาวน์โหลดรายชื่อผู้ติดต่อ", "Groups" => "กลุ่ม", "Favorite" => "รายการโปรด", "Delete Contact" => "ลบรายชื่อผู้ติดต่อ", @@ -191,6 +190,7 @@ "Address" => "ที่อยู่", "Note" => "หมายเหตุ", "Web site" => "เว็บไซต์", +"Delete contact" => "ลบข้อมูลการติดต่อ", "Preferred" => "พิเศษ", "Please specify a valid email address." => "กรุณาระบุที่อยู่อีเมลที่ถูกต้อง", "someone@example.com" => "someone@example.com", @@ -228,7 +228,6 @@ "Add notes here." => "เพิ่มหมายเหตุกำกับไว้ที่นี่", "Add field" => "เพิ่มช่องรับข้อมูล", "Download contact" => "ดาวน์โหลดข้อมูลการติดต่อ", -"Delete contact" => "ลบข้อมูลการติดต่อ", "The temporary image has been removed from cache." => "รูปภาพชั่วคราวดังกล่าวได้ถูกลบออกจากหน่วยความจำแคชแล้ว", "Edit address" => "แก้ไขที่อยู่", "Type" => "ประเภท", diff --git a/l10n/tr.php b/l10n/tr.php index 4a6b0d2b..84066e27 100644 --- a/l10n/tr.php +++ b/l10n/tr.php @@ -140,6 +140,7 @@ "Address" => "Adres", "Note" => "Not", "Web site" => "Web sitesi", +"Delete contact" => "Kişiyi sil", "Preferred" => "Tercih edilen", "Please specify a valid email address." => "Lütfen geçerli bir eposta adresi belirtin.", "Mail to address" => "Eposta adresi", @@ -169,7 +170,6 @@ "Add notes here." => "Notları buraya ekleyin.", "Add field" => "Alan ekle", "Download contact" => "Kişiyi indir", -"Delete contact" => "Kişiyi sil", "The temporary image has been removed from cache." => "Geçici resim ön bellekten silinmiştir.", "Edit address" => "Adresi düzenle", "Type" => "Tür", diff --git a/l10n/uk.php b/l10n/uk.php index 3ac98b1f..cff7c6a2 100644 --- a/l10n/uk.php +++ b/l10n/uk.php @@ -55,6 +55,7 @@ "Contact is not in this group." => "Контакт не в даній групі.", "Contacts are not in this group." => "Контакти не в даній групі.", "A group named {group} already exists" => "Група з назвою {group} вже існує", +"You can drag groups to\narrange them as you like." => "Ви можете перетягнути групи в\nрозташуйте їх як вам до вподоби.", "All" => "Всі", "Favorites" => "Улюблені", "Shared by {owner}" => "Опублікував {owner}", @@ -67,8 +68,14 @@ "Error adding to group." => "Помилка при додаванні у групу.", "Error removing from group." => "Помилка при видаленні з групи.", "There was an error opening a mail composer." => "Виникла помилка при відкриванні поштової програми.", +"Deleting done. Click here to cancel reloading." => "Видалення завершено. Клацніть тут для скасування перезавантаження.", +"Add address book" => "Додати адресну книгу", +"Import done. Click here to cancel reloading." => "Імпорт завершено. Клацніть тут для скасування перезавантаження.", "Not all files uploaded. Retrying..." => "Не всі файли завантажено. Повторна спроба...", +"Something went wrong with the upload, please retry." => "Щось пішло не так при завантаженні, будь ласка, повторіть.", "Error" => "Помилка", +"Importing from {filename}..." => "Імпорт з {filename}...", +"{success} imported, {failed} failed." => "{success} імпортовано, {failed} змарновано.", "Importing..." => "Імпортування...", "Unable to upload your file as it is a directory or has 0 bytes" => "Неможливо завантажити ваш файл тому, що він тека або файл розміром 0 байт", "Upload Error" => "Помилка завантаження", @@ -144,12 +151,14 @@ "HomePage" => "Домашня Сторінка", "New Group" => "Нова група", "Settings" => "Налаштування", +"Address books" => "Адресні книги", "Import" => "Імпорт", +"Select files to import" => "Виберіть файли для імпорта", +"Select files" => "Виберіть файли", "Import into:" => "Імпортувати в:", "OK" => "OK", "(De-)select all" => "(Відміна) виділення усіх", "New Contact" => "Новий контакт", -"Download Contact" => "Завантажити контакт", "Groups" => "Групи", "Favorite" => "Улюблений", "Delete Contact" => "Видалити контакт", @@ -180,9 +189,12 @@ "Nickname" => "Прізвисько", "Enter nickname" => "Ввести прізвисько", "Title" => "Назва", +"Enter title" => "Введіть назву", "Organization" => "Організація", +"Enter organization" => "Введіть організацію", "Birthday" => "День народження", "Notes go here..." => "Тут будуть примітки...", +"Export as VCF" => "Експорт як VCF", "Add" => "Додати", "Phone" => "Телефон", "Email" => "Ел.пошта", @@ -190,6 +202,7 @@ "Address" => "Адреса", "Note" => "Примітка", "Web site" => "Веб-сайт", +"Delete contact" => "Видалити контакт", "Preferred" => "Пріоритетний", "Please specify a valid email address." => "Будь ласка, вкажіть вірну адресу електронної пошти.", "someone@example.com" => "someone@example.com", @@ -208,12 +221,14 @@ "Your city" => "Ваше місто", "City" => "Місто", "Some region" => "Деякий регіон", +"State or province" => "Область", "Your country" => "Ваша країна", "Country" => "Країна", "Instant Messenger" => "Instant Messenger", "Delete IM" => "Видалити IM", "Share" => "Поділитися", "Export" => "Експорт", +"CardDAV link" => "CardDAV посилання", "Add Contact" => "Додати контакт", "Drop photo to upload" => "Піднесіть фото для завантаження", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format custom, Short name, Full name, Reverse or Reverse with comma", @@ -227,7 +242,6 @@ "Add notes here." => "Додайте сюди примітки.", "Add field" => "Додати поле", "Download contact" => "Завантажити контакт", -"Delete contact" => "Видалити контакт", "The temporary image has been removed from cache." => "Тимчасове зображення було видалене з кешу.", "Edit address" => "Редагувати адреси", "Type" => "Тип", @@ -240,11 +254,11 @@ "Zipcode" => "Поштовий індекс", "Addressbook" => "Адресна книга", "Hon. prefixes" => "Високоповажні префікси", -"Miss" => "Miss", +"Miss" => "Пані", "Ms" => "Пані", "Mr" => "Пан", -"Sir" => "Sir", -"Mrs" => "Mrs", +"Sir" => "Пан", +"Mrs" => "Панове", "Dr" => "Доктор", "Given name" => "Ім'я", "Family name" => "Прізвище", diff --git a/l10n/vi.php b/l10n/vi.php index b77d2518..2ad729cb 100644 --- a/l10n/vi.php +++ b/l10n/vi.php @@ -150,7 +150,6 @@ "OK" => "Chấp nhận", "(De-)select all" => "(Hủy) chọn tất cả", "New Contact" => "Liên lạc mới", -"Download Contact" => "Tải liên lạc", "Groups" => "Nhóm", "Favorite" => "Ưu thích", "Delete Contact" => "Xóa liên lạc", @@ -191,6 +190,7 @@ "Address" => "Địa chỉ", "Note" => "Chú thích", "Web site" => "Web site", +"Delete contact" => "Xóa liên lạc", "Preferred" => "Được ưu tiên", "Please specify a valid email address." => "Vui lòng nhập địa chỉ Email hợp lệ.", "someone@example.com" => "someone@example.com", @@ -228,7 +228,6 @@ "Add notes here." => "Thêm chú thích", "Add field" => "Thêm trường mới", "Download contact" => "Tải liên lạc", -"Delete contact" => "Xóa liên lạc", "The temporary image has been removed from cache." => "Những hình ảnh tạm thời đã được gỡ bỏ từ bộ nhớ cache.", "Edit address" => "Sửa địa chỉ", "Type" => "Loại", diff --git a/l10n/zh_CN.GB2312.php b/l10n/zh_CN.GB2312.php index 03a5209b..67a407cd 100644 --- a/l10n/zh_CN.GB2312.php +++ b/l10n/zh_CN.GB2312.php @@ -140,6 +140,7 @@ "Address" => "地址", "Note" => "备注", "Web site" => "网站", +"Delete contact" => "删除联系人", "Preferred" => "偏好", "Please specify a valid email address." => "请指定有效的电子邮件地址。", "Mail to address" => "向此地址发送邮件", @@ -169,7 +170,6 @@ "Add notes here." => "在此添加备注。", "Add field" => "添加字段", "Download contact" => "下载联系人", -"Delete contact" => "删除联系人", "The temporary image has been removed from cache." => "临时相片已从缓存中移除。", "Edit address" => "编辑地址", "Type" => "类型", diff --git a/l10n/zh_CN.php b/l10n/zh_CN.php index fc330cd2..ccfb36ac 100644 --- a/l10n/zh_CN.php +++ b/l10n/zh_CN.php @@ -129,7 +129,6 @@ "OK" => "OK", "(De-)select all" => "反选全部", "New Contact" => "新建联系人", -"Download Contact" => "下载联系人", "Groups" => "分组", "Favorite" => "最爱", "Delete Contact" => "删除联系人", @@ -168,6 +167,7 @@ "Address" => "地址", "Note" => "注释", "Web site" => "网址", +"Delete contact" => "删除联系人", "Preferred" => "偏好", "Please specify a valid email address." => "请指定合法的电子邮件地址", "someone@example.com" => "someone@example.com", @@ -203,7 +203,6 @@ "Add notes here." => "添加注释。", "Add field" => "添加字段", "Download contact" => "下载联系人", -"Delete contact" => "删除联系人", "The temporary image has been removed from cache." => "临时图像文件已从缓存中删除", "Edit address" => "编辑地址", "Type" => "类型", diff --git a/l10n/zh_TW.php b/l10n/zh_TW.php index 8bec72bf..38cb0652 100644 --- a/l10n/zh_TW.php +++ b/l10n/zh_TW.php @@ -99,6 +99,7 @@ "Email" => "電子郵件", "Address" => "地址", "Note" => "註解", +"Delete contact" => "刪除通訊錄", "Preferred" => "首選", "Please specify a valid email address." => "註填入合法的電子郵件住址", "Mail to address" => "寄送住址", @@ -126,7 +127,6 @@ "Add notes here." => "在這裡新增註解", "Add field" => "新增欄位", "Download contact" => "下載通訊錄", -"Delete contact" => "刪除通訊錄", "Edit address" => "編輯地址", "Type" => "類型", "PO Box" => "通訊地址", diff --git a/lib/addressbookprovider.php b/lib/addressbookprovider.php new file mode 100644 index 00000000..94ae4321 --- /dev/null +++ b/lib/addressbookprovider.php @@ -0,0 +1,274 @@ +. + * + */ + +namespace OCA\Contacts; + +/** + * This class manages our addressbooks. + */ +class AddressbookProvider implements \OCP\IAddressBook { + + const CONTACT_TABLE = '*PREFIX*contacts_cards'; + const PROPERTY_TABLE = '*PREFIX*contacts_cards_properties'; + + /** + * Addressbook id + * @var integer + */ + public $id; + + /** + * Addressbook info array + * @var array + */ + public $addressbook; + + /** + * Constructor + * @param integer $id + */ + public function __construct($id) { + $this->id = $id; + \Sabre\VObject\Property::$classMap['GEO'] = 'Sabre\\VObject\\Property\\Compound'; + } + + public function getAddressbook() { + if(!$this->addressbook) { + $this->addressbook = Addressbook::find($this->id); + } + return $this->addressbook; + } + + /** + * @return string defining the technical unique key + */ + public function getKey() { + $book = $this->getAddressbook(); + return $book['uri']; + } + + /** + * In comparison to getKey() this function returns a human readable (maybe translated) name + * @return mixed + */ + public function getDisplayName() { + $book = $this->getAddressbook(); + return $book['displayname']; + } + + /** + * @return mixed + */ + public function getPermissions() { + $book = $this->getAddressbook(); + return $book['permissions']; + } + + private function getProperty(&$results, $row) { + if(!$row['name'] || !$row['value']) { + return false; + } + + $value = null; + + switch($row['name']) { + case 'PHOTO': + $value = 'VALUE=uri:' . \OCP\Util::linkToAbsolute('contacts', 'photo.php') . '?id=' . $row['contactid']; + break; + case 'N': + case 'ORG': + case 'ADR': + case 'GEO': + case 'CATEGORIES': + $property = \Sabre\VObject\Property::create($row['name'], $row['value']); + $value = $property->getParts(); + break; + default: + $value = $value = strtr($row['value'], array('\,' => ',', '\;' => ';')); + break; + } + + if(in_array($row['name'], App::$multi_properties)) { + if(!isset($results[$row['contactid']])) { + $results[$row['contactid']] = array('id' => $row['contactid'], $row['name'] => array($value)); + } elseif(!isset($results[$row['contactid']][$row['name']])) { + $results[$row['contactid']][$row['name']] = array($value); + } else { + $results[$row['contactid']][$row['name']][] = $value; + } + } else { + if(!isset($results[$row['contactid']])) { + $results[$row['contactid']] = array('id' => $row['contactid'], $row['name'] => $value); + } elseif(!isset($results[$row['contactid']][$row['name']])) { + $results[$row['contactid']][$row['name']] = $value; + } + } + } + + /** + * @param $pattern + * @param $searchProperties + * @param $options + * @return array|false + */ + public function search($pattern, $searchProperties, $options) { + $ids = array(); + $results = array(); + $query = 'SELECT DISTINCT `contactid` FROM `' . self::PROPERTY_TABLE . '` WHERE 1 AND ('; + foreach($searchProperties as $property) { + $query .= '(`name` = "' . $property . '" AND `value` LIKE "%' . $pattern . '%") OR '; + } + $query = substr($query, 0, strlen($query) - 4); + $query .= ')'; + + $stmt = \OCP\DB::prepare($query); + $result = $stmt->execute(); + if (\OC_DB::isError($result)) { + \OC_Log::write('contacts', __METHOD__ . 'DB error: ' . \OC_DB::getErrorMessage($result), + \OCP\Util::ERROR); + return false; + } + while( $row = $result->fetchRow()) { + $ids[] = $row['contactid']; + } + + $query = 'SELECT `' . self::CONTACT_TABLE . '`.`addressbookid`, `' . self::PROPERTY_TABLE . '`.`contactid`, `' + . self::PROPERTY_TABLE . '`.`name`, `' . self::PROPERTY_TABLE . '`.`value` FROM `' + . self::PROPERTY_TABLE . '`,`' . self::CONTACT_TABLE . '` WHERE `' + . self::CONTACT_TABLE . '`.`addressbookid` = \'' . $this->id . '\' AND `' + . self::PROPERTY_TABLE . '`.`contactid` = `' . self::CONTACT_TABLE . '`.`id` AND `' + . self::PROPERTY_TABLE . '`.`contactid` IN (' . join(',', array_fill(0, count($ids), '?')) . ')'; + + //\OC_Log::write('contacts', __METHOD__ . 'DB query: ' . $query, \OCP\Util::DEBUG); + $stmt = \OCP\DB::prepare($query); + $result = $stmt->execute($ids); + while( $row = $result->fetchRow()) { + $this->getProperty($results, $row); + } + + return $results; + } + + /** + * @param $properties + * @return mixed + */ + public function createOrUpdate($properties) { + $id = null; + $vcard = null; + if(array_key_exists('id', $properties)) { + // TODO: test if $id belongs to this addressbook + $id = $properties['id']; + // TODO: Test $vcard + $vcard = App::getContactVCard($properties['id']); + foreach(array_keys($properties) as $name) { + if(isset($vcard->{$name})) { + unset($vcard->{$name}); + } + } + } else { + $vcard = \Sabre\VObject\Component::create('VCARD'); + $uid = substr(md5(rand().time()), 0, 10); + $vcard->add('UID', $uid); + try { + $id = VCard::add($this->id, $vcard, null, true); + } catch(Exception $e) { + \OC_Log::write('contacts', __METHOD__ . ' ' . $e->getMessage(), \OCP\Util::ERROR); + return false; + } + } + + foreach($properties as $name => $value) { + switch($name) { + case 'ADR': + case 'N': + if(is_array($value)) { + $property = \Sabre\VObject\Property::create($name); + $property->setParts($value); + $vcard->add($property); + } else { + $vcard->{$name} = $value; + } + break; + case 'BDAY': + // TODO: try/catch + $date = New \DateTime($value); + $vcard->BDAY = $date->format('Y-m-d'); + $vcard->BDAY->VALUE = 'DATE'; + break; + case 'EMAIL': + case 'TEL': + case 'IMPP': // NOTE: We don't know if it's GTalk, Jabber etc. only the protocol + case 'URL': + if(is_array($value)) { + foreach($value as $val) { + $vcard->add($name, strip_tags($val)); + } + } else { + $vcard->add($name, strip_tags($value)); + } + default: + $vcard->{$name} = $value; + break; + } + } + + try { + VCard::edit($id, $vcard); + } catch(Exception $e) { + \OC_Log::write('contacts', __METHOD__ . ' ' . $e->getMessage(), \OCP\Util::ERROR); + return false; + } + + $asarray = VCard::structureContact($vcard); + $asarray['id'] = $id; + return $asarray; + } + + /** + * @param $id + * @return mixed + */ + public function delete($id) { + try { + $query = 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `id` = ? AND `addressbookid` = ?'; + $stmt = \OCP\DB::prepare($query); + $result = $stmt->execute(array($id, $this->id)); + if (\OC_DB::isError($result)) { + \OC_Log::write('contacts', __METHOD__ . 'DB error: ' . \OC_DB::getErrorMessage($result), + \OCP\Util::ERROR); + return false; + } + if($result->numRows() === 0) { + \OC_Log::write('contacts', __METHOD__ + . 'Contact with id ' . $id . 'doesn\'t belong to addressbook with id ' . $this->id, + \OCP\Util::ERROR); + return false; + } + } catch(\Exception $e) { + \OCP\Util::writeLog('contacts', __METHOD__ . ', exception: ' . $e->getMessage(), + \OCP\Util::ERROR); + return false; + } + return VCard::delete($id); + } +} diff --git a/lib/hooks.php b/lib/hooks.php index 15596088..b9ba97bf 100644 --- a/lib/hooks.php +++ b/lib/hooks.php @@ -92,7 +92,7 @@ class Hooks{ continue; } $birthday = $vcard->BDAY; - if ($birthday) { + if ((string)$birthday) { $date = new \DateTime($birthday); $vevent = VObject\Component::create('VEVENT'); //$vevent->setDateTime('LAST-MODIFIED', new DateTime($vcard->REV)); diff --git a/lib/sabre/backend.php b/lib/sabre/backend.php index c3a09bc0..d39bb2dd 100644 --- a/lib/sabre/backend.php +++ b/lib/sabre/backend.php @@ -153,7 +153,7 @@ class OC_Connector_Sabre_CardDAV extends Sabre_CardDAV_Backend_Abstract { 'id' => $i['id'], //'carddata' => $i['carddata'], 'size' => strlen($i['carddata']), - 'etag' => md5($i['carddata']), + 'etag' => '"' . md5($i['carddata']) . '"', 'uri' => $i['uri'], 'lastmodified' => $i['lastmodified'] ); } diff --git a/templates/contacts.php b/templates/contacts.php index 8150f5b9..b988d4d8 100644 --- a/templates/contacts.php +++ b/templates/contacts.php @@ -1,5 +1,4 @@ -