1
0
mirror of https://github.com/owncloudarchive/contacts.git synced 2024-12-01 13:24:10 +01:00

Merge branch 'master' into filesystem

This commit is contained in:
Robin Appelman 2012-12-15 02:32:24 +01:00
commit 7db0425204
62 changed files with 983 additions and 261 deletions

View File

@ -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']));
}

View File

@ -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 {

View File

@ -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;
}
}
}

78
img/active_star.svg Normal file
View File

@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="322.00055"
height="306.45065"
id="svg2"
version="1.1"
inkscape:version="0.48.3.1 r9886"
sodipodi:docname="inactive_star.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8"
inkscape:cx="116.4202"
inkscape:cy="165.53453"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1920"
inkscape:window-height="1021"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-148.03866,-745.93365)">
<path
sodipodi:type="star"
style="fill:#ffcc00;fill-opacity:1;stroke:none"
id="path2987"
sodipodi:sides="5"
sodipodi:cx="330"
sodipodi:cy="1027.7194"
sodipodi:r1="169.28609"
sodipodi:r2="75.090069"
sodipodi:arg1="-1.5686866"
sodipodi:arg2="-0.95344865"
inkscape:flatsided="false"
inkscape:rounded="0"
inkscape:randomized="0"
d="m 330.35715,858.43365 43.11057,108.05601 117.64292,9.25721 -89.44547,74.39173 27.54954,114.7457 -98.39092,-62.0794 -100.61637,61.6596 28.63654,-112.759 -89.73387,-76.63797 116.08927,-7.60945 z"
inkscape:transform-center-x="-0.11036321"
inkscape:transform-center-y="-16.060386"
transform="translate(-21.071429,-112.5)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

78
img/inactive_star.svg Normal file
View File

@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="322.00055"
height="306.45065"
id="svg2"
version="1.1"
inkscape:version="0.48.3.1 r9886"
sodipodi:docname="inactive_star.svg">
<defs
id="defs4" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8"
inkscape:cx="116.4202"
inkscape:cy="165.53453"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1920"
inkscape:window-height="1021"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1" />
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-148.03866,-745.93365)">
<path
sodipodi:type="star"
style="fill:#cccccc;fill-opacity:1;stroke:none"
id="path2987"
sodipodi:sides="5"
sodipodi:cx="330"
sodipodi:cy="1027.7194"
sodipodi:r1="169.28609"
sodipodi:r2="75.090069"
sodipodi:arg1="-1.5686866"
sodipodi:arg2="-0.95344865"
inkscape:flatsided="false"
inkscape:rounded="0"
inkscape:randomized="0"
d="m 330.35715,858.43365 43.11057,108.05601 117.64292,9.25721 -89.44547,74.39173 27.54954,114.7457 -98.39092,-62.0794 -100.61637,61.6596 28.63654,-112.759 -89.73387,-76.63797 116.08927,-7.60945 z"
inkscape:transform-center-x="-0.11036321"
inkscape:transform-center-y="-16.060386"
transform="translate(-21.071429,-112.5)" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

219
js/app.js
View File

@ -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 = $('<input type="text" class="active" /><a class="action checked disabled" />');
$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 += '<option value="' + category.id + '">' + category.name + '</option>';
} else {
@ -814,10 +822,10 @@ OC.Contacts = OC.Contacts || {
$(rmopts).appendTo(this.$groups)
.wrapAll('<optgroup data-action="remove" label="' + t('contacts', 'Remove from...') + '"/>');
}
} 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 += '<option value="' + category.id + '">' + category.name + '</option>';
addopts += '<option value="' + category.id + '">' + category.name + '</option>';
});
@ -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 = $('<div id="dropdown" class="drop"><input type="text" value="' + link + '" /></div>');
@ -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('<option value="' + id + '">' + book.displayname + '</option>');
});
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('<p>').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];

View File

@ -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;

View File

@ -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" => "إضافة",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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" => "Τύπος",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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" => "نوع",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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" => "תא דואר",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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" => "種類",

View File

@ -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 ყუთი",

View File

@ -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" => "종류",

View File

@ -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",

View File

@ -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",

View File

@ -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" => "Тип",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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",

View File

@ -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" => "Удалить текущий контакт",
"<h3>You have no contacts in your addressbook.</h3><p>Add a new contact or import existing contacts from a VCF file.</p>" => "<h3>В вашей адресной книге нет контактов.</h3><p>Добавьте новый контакт или импортируйте контакты из VCF файла.</p>",
"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" => "Тип",

View File

@ -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" => "Тип",

View File

@ -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" => "තැ.පෙ.",

View File

@ -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",

View File

@ -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",

View File

@ -1,6 +1,8 @@
<?php $TRANSLATIONS = array(
"Error (de)activating addressbook." => "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" => "Име",

View File

@ -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",

View File

@ -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" => "வகை",

View File

@ -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" => "ประเภท",

View File

@ -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",

View File

@ -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" => "Прізвище",

View File

@ -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",

View File

@ -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" => "类型",

View File

@ -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" => "类型",

View File

@ -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" => "通訊地址",

274
lib/addressbookprovider.php Normal file
View File

@ -0,0 +1,274 @@
<?php
/**
* ownCloud - AddressbookProvider
*
* @author Thomas Tanghus
* @copyright 2012 Thomas Tanghus (thomas@tanghus.net)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\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);
}
}

View File

@ -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));

View File

@ -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'] );
}

View File

@ -1,5 +1,4 @@
<div id='notification'></div>
<div id="appsettings" class="popup topright hidden"></div>
<script type='text/javascript'>
var is_indexed = <?php echo $_['is_indexed'] == 'yes' ? 'true' : 'false'; ?>;
var totalurl = '<?php echo OCP\Util::linkToRemote('carddav'); ?>addressbooks';
@ -59,13 +58,13 @@
<div id="contactsheader">
<input type="checkbox" id="toggle_all" title="<?php echo $l->t('(De-)select all'); ?>" />
<div class="actions">
<button class="addcontact"><?php echo $l->t('New Contact'); ?></button>
<button class="download control" title="<?php echo $l->t('Download Contact'); ?>"></button>
<select class="groups control" name="groups">
<button class="add svg action text"><?php echo $l->t('New Contact'); ?></button>
<button class="download svg action text"><?php echo $l->t('Download Contact(s)'); ?></button>
<select class="groups svg action text button" name="groups">
<option value="-1" disabled="disabled" selected="selected"><?php echo $l->t('Groups'); ?></option>
</select>
<button class="favorite inactive control" title="<?php echo $l->t('Favorite'); ?>"></button>
<button class="delete control" title="<?php echo $l->t('Delete Contact'); ?>"></button>
<button class="favorite action svg inactive control" title="<?php echo $l->t('Favorite'); ?>"></button>
<a class="delete action" title="<?php echo $l->t('Delete Contact'); ?>"></a>
</div>
</div>
<div id="rightcontent" class="loading">
@ -148,7 +147,7 @@
</td>
<td class="email">
<a href="mailto:{email}">{email}</a>
<a class="mailto hidden" title="<?php echo $l->t('Compose mail'); ?>"></a>
<a class="svg mailto hidden" title="<?php echo $l->t('Compose mail'); ?>"></a>
</td>
<td class="tel">{tel}</td>
<td class="adr">{adr}</td>
@ -172,10 +171,10 @@
<li>
<div id="photowrapper" class="propertycontainer" data-element="photo">
<ul id="phototools" class="transparent hidden">
<li><a class="svg delete" title="<?php echo $l->t('Delete current photo'); ?>"></a></li>
<li><a class="svg edit" title="<?php echo $l->t('Edit current photo'); ?>"></a></li>
<li><a class="svg upload" title="<?php echo $l->t('Upload new photo'); ?>"></a></li>
<li><a class="svg cloud" title="<?php echo $l->t('Select photo from ownCloud'); ?>"></a></li>
<li><a class="action delete" title="<?php echo $l->t('Delete current photo'); ?>"></a></li>
<li><a class="action edit" title="<?php echo $l->t('Edit current photo'); ?>"></a></li>
<li><a class="action upload" title="<?php echo $l->t('Upload new photo'); ?>"></a></li>
<li><a class="action cloud" title="<?php echo $l->t('Select photo from ownCloud'); ?>"></a></li>
</ul>
<a class="favorite action {favorite}"></a>
</div>
@ -262,9 +261,10 @@
</li>
</ul>
<footer>
<button class="close float tooltipped downwards" title="<?php echo $l->t('Close'); ?>"><?php echo $l->t('Close'); ?></button>
<button class="export float tooltipped downwards" title="<?php echo $l->t('Export as VCF'); ?>"><?php echo $l->t('Download'); ?></button>
<select id="addproperty">
<button class="cancel action text tooltipped downwards" title="<?php echo $l->t('Cancel'); ?>"><?php echo $l->t('Cancel'); ?></button>
<button class="close text tooltipped downwards" title="<?php echo $l->t('Close'); ?>"><?php echo $l->t('Close'); ?></button>
<button class="export action text tooltipped downwards" title="<?php echo $l->t('Export as VCF'); ?>"><?php echo $l->t('Download'); ?></button>
<select class="add action text button" id="addproperty">
<option value=""><?php echo $l->t('Add'); ?></option>
<option value="ORG"><?php echo $l->t('Organization'); ?></option>
<option value="NICKNAME"><?php echo $l->t('Nickname'); ?></option>
@ -277,7 +277,7 @@
<option value="URL"><?php echo $l->t('Web site'); ?></option>
<option value="CATEGORIES"><?php echo $l->t('Groups'); ?></option>
</select>
<button class="deletecontact float right tooltipped downwards" title="<?php echo $l->t('Delete contact'); ?>"><?php echo $l->t('Delete'); ?></button>
<button class="delete action text float right tooltipped downwards" title="<?php echo $l->t('Delete contact'); ?>"><?php echo $l->t('Delete'); ?></button>
</footer>
</section>
</form>
@ -382,12 +382,12 @@
<?php echo OCP\html_select_options($_['impp_types'], array()) ?>
</select>
<input type="checkbox" class="parameter impp tooltipped downwards" name="parameters[TYPE][]" value="PREF" title="<?php echo $l->t('Preferred'); ?>" />
</span>
<div class="select_wrapper">
<select class="rtl parameter label impp" data-parameter="X-SERVICE-TYPE" name="parameters[X-SERVICE-TYPE]">
<select class="ltr parameter label impp" data-parameter="X-SERVICE-TYPE" name="parameters[X-SERVICE-TYPE]">
<?php echo OCP\html_select_options($_['im_protocols'], array()) ?>
</select>
</div>
</span>
<input type="text" class="nonempty value" name="value" value="{value}"
placeholder="<?php echo $l->t('Instant Messenger'); ?>" required />
<span class="listactions">