1
0
mirror of https://github.com/owncloudarchive/contacts.git synced 2025-01-30 19:52:17 +01:00

Merge branch 'master' into navigation

This commit is contained in:
Jan-Christoph Borchardt 2012-12-18 15:44:12 +01:00
commit 01aa7deb2e
133 changed files with 14055 additions and 6821 deletions

View File

@ -13,20 +13,33 @@ OCP\JSON::checkAppEnabled('contacts');
OCP\JSON::callCheck();
$id = $_POST['id'];
$book = OC_Contacts_App::getAddressbook($id);// is owner access check
if(!OC_Contacts_Addressbook::setActive($id, $_POST['active'])) {
try {
$book = OCA\Contacts\Addressbook::find($id); // is owner access check
} catch(Exception $e) {
OCP\JSON::error(
array(
'data' => array(
'message' => $e->getMessage(),
'file'=>$_POST['file']
)
)
);
exit();
}
if(!OCA\Contacts\Addressbook::setActive($id, $_POST['active'])) {
OCP\Util::writeLog('contacts',
'ajax/activation.php: Error activating addressbook: '. $id,
OCP\Util::ERROR);
OCP\JSON::error(array(
'data' => array(
'message' => OC_Contacts_App::$l10n->t('Error (de)activating addressbook.'))));
'message' => OCA\Contacts\App::$l10n->t('Error (de)activating addressbook.'))));
exit();
}
OCP\JSON::success(array(
'active' => OC_Contacts_Addressbook::isActive($id),
'active' => OCA\Contacts\Addressbook::isActive($id),
'id' => $id,
'addressbook' => $book,
));

View File

@ -25,13 +25,13 @@ $description = isset($_POST['description'])
if(is_null($name)) {
bailOut('Cannot add addressbook with an empty name.');
}
$bookid = OC_Contacts_Addressbook::add($userid, $name, $description);
$bookid = OCA\Contacts\Addressbook::add($userid, $name, $description);
if(!$bookid) {
bailOut('Error adding addressbook: '.$name);
}
if(!OC_Contacts_Addressbook::setActive($bookid, 1)) {
if(!OCA\Contacts\Addressbook::setActive($bookid, 1)) {
bailOut('Error activating addressbook.');
}
$addressbook = OC_Contacts_App::getAddressbook($bookid);
$addressbook = OCA\Contacts\Addressbook::find($bookid);
OCP\JSON::success(array('data' => array('addressbook' => $addressbook)));

View File

@ -28,11 +28,11 @@ require_once __DIR__.'/../loghandler.php';
$id = $_POST['id'];
if(!$id) {
bailOut(OC_Contacts_App::$l10n->t('id is not set.'));
bailOut(OCA\Contacts\App::$l10n->t('id is not set.'));
}
try {
OC_Contacts_Addressbook::delete($id);
OCA\Contacts\Addressbook::delete($id);
} catch(Exception $e) {
bailOut($e->getMessage());
}

View File

@ -16,24 +16,24 @@ $name = trim(strip_tags($_POST['name']));
$description = trim(strip_tags($_POST['description']));
if(!$id) {
bailOut(OC_Contacts_App::$l10n->t('id is not set.'));
bailOut(OCA\Contacts\App::$l10n->t('id is not set.'));
}
if(!$name) {
bailOut(OC_Contacts_App::$l10n->t('Cannot update addressbook with an empty name.'));
bailOut(OCA\Contacts\App::$l10n->t('Cannot update addressbook with an empty name.'));
}
try {
OC_Contacts_Addressbook::edit($id, $name, $description);
OCA\Contacts\Addressbook::edit($id, $name, $description);
} catch(Exception $e) {
bailOut($e->getMessage());
}
if(!OC_Contacts_Addressbook::setActive($id, $_POST['active'])) {
bailOut(OC_Contacts_App::$l10n->t('Error (de)activating addressbook.'));
if(!OCA\Contacts\Addressbook::setActive($id, $_POST['active'])) {
bailOut(OCA\Contacts\App::$l10n->t('Error (de)activating addressbook.'));
}
$addressbook = OC_Contacts_App::getAddressbook($id);
$addressbook = OCA\Contacts\Addressbook::find($id);
OCP\JSON::success(array(
'data' => array('addressbook' => $addressbook),
));

29
ajax/categories/add.php Normal file
View File

@ -0,0 +1,29 @@
<?php
/**
* Copyright (c) 2012 Thomas Tanghus <thomas@tanghus.net>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
OCP\JSON::checkLoggedIn();
OCP\JSON::checkAppEnabled('contacts');
OCP\JSON::callCheck();
require_once __DIR__.'/../loghandler.php';
$category = isset($_POST['category']) ? trim(strip_tags($_POST['category'])) : null;
if(is_null($category) || $category === "") {
bailOut(OCA\Contacts\App::$l10n->t('No category name given.'));
}
$catman = new OC_VCategories('contact');
$id = $catman->add($category);
if($id !== false) {
OCP\JSON::success(array('data' => array('id'=>$id)));
} else {
bailOut(OCA\Contacts\App::$l10n->t('Error adding group.'));
}

34
ajax/categories/addto.php Normal file
View File

@ -0,0 +1,34 @@
<?php
/**
* Copyright (c) 2012 Thomas Tanghus <thomas@tanghus.net>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
OCP\JSON::checkLoggedIn();
OCP\JSON::checkAppEnabled('contacts');
OCP\JSON::callCheck();
require_once __DIR__.'/../loghandler.php';
$categoryid = isset($_POST['categoryid']) ? $_POST['categoryid'] : null;
$contactids = isset($_POST['contactids']) ? $_POST['contactids'] : null;
if(is_null($categoryid)) {
bailOut(OCA\Contacts\App::$l10n->t('Group ID missing from request.'));
}
if(is_null($contactids)) {
bailOut(OCA\Contacts\App::$l10n->t('Contact ID missing from request.'));
}
$catmgr = OCA\Contacts\App::getVCategories();
foreach($contactids as $contactid) {
debug('contactid: ' . $contactid . ', categoryid: ' . $categoryid);
$catmgr->addToCategory($contactid, $categoryid);
}
OCP\JSON::success();

View File

@ -14,10 +14,11 @@ $id = isset($_GET['id'])?$_GET['id']:null;
if(is_null($id)) {
OCP\JSON::error(array(
'data' => array(
'message' => OC_Contacts_App::$l10n->t('No ID provided'))));
'message' => OCA\Contacts\App::$l10n->t('No ID provided'))));
exit();
}
$vcard = OC_Contacts_App::getContactVCard( $id );
$vcard = OCA\Contacts\App::getContactVCard( $id );
foreach($vcard->children as $property) {
if($property->name == 'CATEGORIES') {
$checksum = md5($property->serialize());
@ -31,4 +32,4 @@ foreach($vcard->children as $property) {
}
OCP\JSON::error(array(
'data' => array(
'message' => OC_Contacts_App::$l10n->t('Error setting checksum.'))));
'message' => OCA\Contacts\App::$l10n->t('Error setting checksum.'))));

View File

@ -13,36 +13,39 @@ OCP\JSON::callCheck();
require_once __DIR__.'/../loghandler.php';
$categories = isset($_POST['categories'])?$_POST['categories']:null;
$categories = isset($_POST['categories']) ? $_POST['categories'] : null;
$fromobjects = (isset($_POST['fromobjects'])
&& ($_POST['fromobjects'] === 'true' || $_POST['fromobjects'] === '1')) ? true : false;
if(is_null($categories)) {
bailOut(OC_Contacts_App::$l10n->t('No categories selected for deletion.'));
bailOut(OCA\Contacts\App::$l10n->t('No categories selected for deletion.'));
}
debug(print_r($categories, true));
if($fromobjects) {
$addressbooks = OCA\Contacts\Addressbook::all(OCP\USER::getUser());
if(count($addressbooks) == 0) {
bailOut(OCA\Contacts\App::$l10n->t('No address books found.'));
}
$addressbookids = array();
foreach($addressbooks as $addressbook) {
$addressbookids[] = $addressbook['id'];
}
$contacts = OCA\Contacts\VCard::all($addressbookids);
if(count($contacts) == 0) {
bailOut(OCA\Contacts\App::$l10n->t('No contacts found.'));
}
$addressbooks = OC_Contacts_Addressbook::all(OCP\USER::getUser());
if(count($addressbooks) == 0) {
bailOut(OC_Contacts_App::$l10n->t('No address books found.'));
}
$addressbookids = array();
foreach($addressbooks as $addressbook) {
$addressbookids[] = $addressbook['id'];
}
$contacts = OC_Contacts_VCard::all($addressbookids);
if(count($contacts) == 0) {
bailOut(OC_Contacts_App::$l10n->t('No contacts found.'));
$cards = array();
foreach($contacts as $contact) {
$cards[] = array($contact['id'], $contact['carddata']);
}
}
$cards = array();
foreach($contacts as $contact) {
$cards[] = array($contact['id'], $contact['carddata']);
}
debug('Before delete: '.print_r($categories, true));
$catman = new OC_VCategories('contacts');
$catman = new OC_VCategories('contact');
$catman->delete($categories, $cards);
debug('After delete: '.print_r($catman->categories(), true));
OC_Contacts_VCard::updateDataByID($cards);
OCP\JSON::success(array('data' => array('categories'=>$catman->categories())));
if($fromobjects) {
OCA\Contacts\VCard::updateDataByID($cards);
}
OCP\JSON::success();

View File

@ -10,6 +10,37 @@
OCP\JSON::checkLoggedIn();
OCP\JSON::checkAppEnabled('contacts');
$categories = OC_Contacts_App::getCategories();
$catmgr = OCA\Contacts\App::getVCategories();
$categories = $catmgr->categories(OC_VCategories::FORMAT_MAP);
foreach($categories as &$category) {
$ids = array();
$contacts = $catmgr->itemsForCategory(
$category['name'],
array(
'tablename' => '*PREFIX*contacts_cards',
'fields' => array('id',),
));
foreach($contacts as $contact) {
$ids[] = $contact['id'];
}
$category['contacts'] = $ids;
}
OCP\JSON::success(array('data' => array('categories'=>$categories)));
$favorites = $catmgr->getFavorites();
OCP\JSON::success(array(
'data' => array(
'categories' => $categories,
'favorites' => $favorites,
'shared' => OCP\Share::getItemsSharedWith('addressbook', OCA\Contacts\Share_Backend_Addressbook::FORMAT_ADDRESSBOOKS),
'lastgroup' => OCP\Config::getUserValue(
OCP\User::getUser(),
'contacts',
'lastgroup', 'all'),
'sortorder' => OCP\Config::getUserValue(
OCP\User::getUser(),
'contacts',
'groupsort', ''),
)
)
);

View File

@ -0,0 +1,34 @@
<?php
/**
* Copyright (c) 2012 Thomas Tanghus <thomas@tanghus.net>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
OCP\JSON::checkLoggedIn();
OCP\JSON::checkAppEnabled('contacts');
OCP\JSON::callCheck();
require_once __DIR__.'/../loghandler.php';
$categoryid = isset($_POST['categoryid']) ? $_POST['categoryid'] : null;
$contactids = isset($_POST['contactids']) ? $_POST['contactids'] : null;
if(is_null($categoryid)) {
bailOut(OCA\Contacts\App::$l10n->t('Group ID missing from request.'));
}
if(is_null($contactids)) {
bailOut(OCA\Contacts\App::$l10n->t('Contact ID missing from request.'));
}
$catmgr = OCA\Contacts\App::getVCategories();
foreach($contactids as $contactid) {
debug('id: ' . $contactid .', categoryid: ' . $categoryid);
$catmgr->removeFromCategory($contactid, $categoryid);
}
OCP\JSON::success();

View File

@ -11,7 +11,7 @@ OCP\JSON::checkLoggedIn();
OCP\JSON::checkAppEnabled('contacts');
OCP\JSON::callCheck();
OC_Contacts_App::scanCategories();
$categories = OC_Contacts_App::getCategories();
OCA\Contacts\App::scanCategories();
$categories = OCA\Contacts\App::getCategories();
OCP\JSON::success(array('data' => array('categories'=>$categories)));

View File

@ -27,23 +27,23 @@ OCP\JSON::callCheck();
require_once __DIR__.'/../loghandler.php';
$aid = isset($_POST['aid'])?$_POST['aid']:null;
$aid = isset($_POST['aid']) ? $_POST['aid'] : null;
if(!$aid) {
$aid = min(OC_Contacts_Addressbook::activeIds()); // first active addressbook.
$aid = min(OCA\Contacts\Addressbook::activeIds()); // first active addressbook.
}
$isnew = isset($_POST['isnew'])?$_POST['isnew']:false;
$fn = trim($_POST['fn']);
$n = trim($_POST['n']);
debug('Adding new contact to: ' . $aid);
$vcard = new OC_VObject('VCARD');
$vcard->setUID();
$vcard->setString('FN', $fn);
$vcard->setString('N', $n);
$isnew = isset($_POST['isnew']) ? $_POST['isnew'] : false;
$vcard = Sabre\VObject\Component::create('VCARD');
$uid = substr(md5(rand().time()), 0, 10);
$vcard->add('UID', $uid);
debug('vobject: ', print_r($vcard->serialize(), true));
$id = null;
try {
$id = OC_Contacts_VCard::add($aid, $vcard, null, $isnew);
$id = OCA\Contacts\VCard::add($aid, $vcard, null, $isnew);
} catch(Exception $e) {
bailOut($e->getMessage());
}
@ -52,7 +52,7 @@ if(!$id) {
bailOut('There was an error adding the contact.');
}
$lastmodified = OC_Contacts_App::lastModified($vcard);
$lastmodified = OCA\Contacts\App::lastModified($vcard);
if(!$lastmodified) {
$lastmodified = new DateTime();
}
@ -60,6 +60,7 @@ OCP\JSON::success(array(
'data' => array(
'id' => $id,
'aid' => $aid,
'details' => OCA\Contacts\VCard::structureContact($vcard),
'lastmodified' => $lastmodified->format('U')
)
));

View File

@ -1,168 +0,0 @@
<?php
/**
* ownCloud - Addressbook
*
* @author Jakob Sack
* @copyright 2011 Jakob Sack mail@jakobsack.de
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
// Check if we are a user
OCP\JSON::checkLoggedIn();
OCP\JSON::checkAppEnabled('contacts');
OCP\JSON::callCheck();
require_once __DIR__.'/../loghandler.php';
$id = isset($_POST['id'])?$_POST['id']:null;
$name = isset($_POST['name'])?$_POST['name']:null;
$value = isset($_POST['value'])?$_POST['value']:null;
$parameters = isset($_POST['parameters'])?$_POST['parameters']:array();
$vcard = OC_Contacts_App::getContactVCard($id);
$l10n = OC_Contacts_App::$l10n;
if(!$name) {
bailOut($l10n->t('element name is not set.'));
}
if(!$id) {
bailOut($l10n->t('id is not set.'));
}
if(!$vcard) {
bailOut($l10n->t('Could not parse contact: ').$id);
}
if(!is_array($value)) {
$value = trim($value);
if(!$value
&& in_array(
$name,
array('TEL', 'EMAIL', 'ORG', 'BDAY', 'URL', 'NICKNAME', 'NOTE'))
) {
bailOut($l10n->t('Cannot add empty property.'));
}
} elseif($name === 'ADR') { // only add if non-empty elements.
$empty = true;
foreach($value as $part) {
if(trim($part) != '') {
$empty = false;
break;
}
}
if($empty) {
bailOut($l10n->t('At least one of the address fields has to be filled out.'));
}
}
// Prevent setting a duplicate entry
$current = $vcard->select($name);
foreach($current as $item) {
$tmpvalue = (is_array($value)?implode(';', $value):$value);
if($tmpvalue == $item->value) {
bailOut($l10n->t('Trying to add duplicate property: '.$name.': '.$tmpvalue));
}
}
if(is_array($value)) {
// NOTE: Important, otherwise the compound value will
// be set in the order the fields appear in the form!
ksort($value);
$value = array_map('strip_tags', $value);
} else {
$value = strip_tags($value);
}
/* preprocessing value */
switch($name) {
case 'BDAY':
$date = New DateTime($value);
$value = $date->format(DateTime::ATOM);
case 'FN':
if(!$value) {
// create a method thats returns an alternative for FN.
//$value = getOtherValue();
}
case 'N':
case 'ORG':
case 'NOTE':
$value = str_replace('\n', ' \\n', $value);
break;
case 'NICKNAME':
// TODO: Escape commas and semicolons.
break;
case 'EMAIL':
$value = strtolower($value);
break;
case 'TEL':
case 'ADR':
break;
case 'IMPP':
if(is_null($parameters) || !isset($parameters['X-SERVICE-TYPE'])) {
bailOut(OC_Contacts_App::$l10n->t('Missing IM parameter.'));
}
$impp = OC_Contacts_App::getIMOptions($parameters['X-SERVICE-TYPE']);
if(is_null($impp)) {
bailOut(OC_Contacts_App::$l10n->t('Unknown IM: '.$parameters['X-SERVICE-TYPE']));
}
$value = $impp['protocol'] . ':' . $value;
break;
}
switch($name) {
case 'NOTE':
$vcard->setString('NOTE', $value);
break;
default:
$property = $vcard->addProperty($name, $value); //, $parameters);
break;
}
$line = count($vcard->children) - 1;
// Apparently Sabre\VObject\Parameter doesn't do well with
// multiple values or I don't know how to do it. Tanghus.
foreach ($parameters as $key=>$element) {
if(is_array($element) /*&& strtoupper($key) == 'TYPE'*/) {
// NOTE: Maybe this doesn't only apply for TYPE?
// And it probably shouldn't be done here anyways :-/
foreach($element as $e) {
if($e != '' && !is_null($e)) {
if(trim($e)) {
$vcard->children[$line]->parameters[] = new Sabre\VObject\Parameter($key, $e);
}
}
}
} else {
if(trim($element)) {
$vcard->children[$line]->parameters[] = new Sabre\VObject\Parameter($key, $element);
}
}
}
$checksum = md5($vcard->children[$line]->serialize());
try {
OC_Contacts_VCard::edit($id, $vcard);
} catch(Exception $e) {
bailOut($e->getMessage());
}
OCP\JSON::success(array(
'data' => array(
'checksum' => $checksum,
'lastmodified' => OC_Contacts_App::lastModified($vcard)->format('U'))
)
);

View File

@ -29,11 +29,11 @@ require_once __DIR__.'/../loghandler.php';
$id = isset($_POST['id']) ? $_POST['id'] : null;
if(!$id) {
bailOut(OC_Contacts_App::$l10n->t('id is not set.'));
bailOut(OCA\Contacts\App::$l10n->t('id is not set.'));
}
try {
OC_Contacts_VCard::delete($id);
OCA\Contacts\VCard::delete($id);
} catch(Exception $e) {
bailOut($e->getMessage());
}

View File

@ -27,21 +27,40 @@ OCP\JSON::callCheck();
require_once __DIR__.'/../loghandler.php';
$id = $_POST['id'];
$checksum = $_POST['checksum'];
$l10n = OC_Contacts_App::$l10n;
$id = isset($_POST['id']) ? $_POST['id'] : null;
$name = isset($_POST['name']) ? $_POST['name'] : null;
$checksum = isset($_POST['checksum']) ? $_POST['checksum'] : null;
$l10n = OCA\Contacts\App::$l10n;
$vcard = OC_Contacts_App::getContactVCard( $id );
$line = OC_Contacts_App::getPropertyLineByChecksum($vcard, $checksum);
if(is_null($line)) {
bailOut($l10n->t('Information about vCard is incorrect. Please reload the page.'));
exit();
$multi_properties = array('EMAIL', 'TEL', 'IMPP', 'ADR', 'URL');
if(!$id) {
bailOut(OCA\Contacts\App::$l10n->t('id is not set.'));
}
unset($vcard->children[$line]);
if(!$name) {
bailOut(OCA\Contacts\App::$l10n->t('element name is not set.'));
}
if(!$checksum && in_array($name, $multi_properties)) {
bailOut(OCA\Contacts\App::$l10n->t('checksum is not set.'));
}
$vcard = OCA\Contacts\App::getContactVCard( $id );
if(!is_null($checksum)) {
$line = OCA\Contacts\App::getPropertyLineByChecksum($vcard, $checksum);
if(is_null($line)) {
bailOut($l10n->t('Information about vCard is incorrect. Please reload the page.'));
exit();
}
unset($vcard->children[$line]);
} else {
unset($vcard->{$name});
}
try {
OC_Contacts_VCard::edit($id, $vcard);
OCA\Contacts\VCard::edit($id, $vcard);
} catch(Exception $e) {
bailOut($e->getMessage());
}
@ -49,6 +68,6 @@ try {
OCP\JSON::success(array(
'data' => array(
'id' => $id,
'lastmodified' => OC_Contacts_App::lastModified($vcard)->format('U'),
'lastmodified' => OCA\Contacts\App::lastModified($vcard)->format('U'),
)
));

View File

@ -1,76 +0,0 @@
<?php
/**
* ownCloud - Addressbook
*
* @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/>.
*
*/
require_once __DIR__.'/../loghandler.php';
// Check if we are a user
OCP\JSON::checkLoggedIn();
OCP\JSON::checkAppEnabled('contacts');
$id = isset($_GET['id'])?$_GET['id']:null;
if(is_null($id)) {
bailOut(OC_Contacts_App::$l10n->t('Missing ID'));
}
$card = OC_Contacts_VCard::find($id);
$vcard = OC_VObject::parse($card['carddata']);
if(is_null($vcard)) {
bailOut(OC_Contacts_App::$l10n->t('Error parsing VCard for ID: "'.$id.'"'));
}
$details = OC_Contacts_VCard::structureContact($vcard);
// Make up for not supporting the 'N' field in earlier version.
if(!isset($details['N'])) {
$details['N'] = array();
$details['N'][0] = array($details['FN'][0]['value'],'','','','');
}
// Don't wanna transfer the photo in a json string.
if(isset($details['PHOTO'])) {
$details['PHOTO'] = true;
//unset($details['PHOTO']);
} else {
$details['PHOTO'] = false;
}
$lastmodified = OC_Contacts_App::lastModified($vcard);
if(!$lastmodified) {
$lastmodified = new DateTime();
}
$permissions = OCP\Share::PERMISSION_CREATE | OCP\Share::PERMISSION_READ
| OCP\Share::PERMISSION_UPDATE | OCP\Share::PERMISSION_DELETE
| OCP\Share::PERMISSION_SHARE;
$addressbook = OC_Contacts_Addressbook::find($card['addressbookid']);
if ($addressbook['userid'] != OCP\User::getUser()) {
$sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $card['addressbookid']);
if($sharedAddressbook) {
$permissions = $sharedAddressbook['permissions'];
}
}
$details['id'] = $id;
$details['displayname'] = $card['fullname'];
$details['addressbookid'] = $card['addressbookid'];
$details['lastmodified'] = $lastmodified->format('U');
$details['permissions'] = $permissions;
OC_Contacts_App::setLastModifiedHeader($vcard);
OCP\JSON::success(array('data' => $details));

View File

@ -8,27 +8,33 @@
function cmp($a, $b)
{
if ($a['displayname'] == $b['displayname']) {
if ($a['fullname'] == $b['fullname']) {
return 0;
}
return ($a['displayname'] < $b['displayname']) ? -1 : 1;
return ($a['fullname'] < $b['fullname']) ? -1 : 1;
}
OCP\JSON::checkLoggedIn();
OCP\JSON::checkAppEnabled('contacts');
$start = isset($_GET['startat'])?$_GET['startat']:0;
$offset = isset($_GET['offset']) ? $_GET['offset'] : 0;
$aid = isset($_GET['aid'])?$_GET['aid']:null;
$active_addressbooks = array();
if(is_null($aid)) {
// Called initially to get the active addressbooks.
$active_addressbooks = OC_Contacts_Addressbook::active(OCP\USER::getUser());
$active_addressbooks = OCA\Contacts\Addressbook::active(OCP\USER::getUser());
} else {
// called each time more contacts has to be shown.
$active_addressbooks = array(OC_Contacts_Addressbook::find($aid));
$active_addressbooks = array(OCA\Contacts\Addressbook::find($aid));
}
$lastModified = OCA\Contacts\App::lastModified();
if(!is_null($lastModified)) {
OCP\Response::enableCaching();
OCP\Response::setLastModifiedHeader($lastModified);
OCP\Response::setETagHeader(md5($lastModified->format('U')));
}
session_write_close();
// create the addressbook associate array
@ -36,43 +42,66 @@ $contacts_addressbook = array();
$ids = array();
foreach($active_addressbooks as $addressbook) {
$ids[] = $addressbook['id'];
if(!isset($contacts_addressbook[$addressbook['id']])) {
/*if(!isset($contacts_addressbook[$addressbook['id']])) {
$contacts_addressbook[$addressbook['id']]
= array('contacts' => array('type' => 'book',));
$contacts_addressbook[$addressbook['id']]['displayname']
= $addressbook['displayname'];
$contacts_addressbook[$addressbook['id']]['description']
= $addressbook['description'];
$contacts_addressbook[$addressbook['id']]['permissions']
= $addressbook['permissions'];
$contacts_addressbook[$addressbook['id']]['owner']
= $addressbook['userid'];
}
}*/
}
$contacts_alphabet = array();
// get next 50 for each addressbook.
foreach($ids as $id) {
$contacts_alphabet = array_merge(
$contacts_alphabet,
OCA\Contacts\VCard::all($ids)
);
/*foreach($ids as $id) {
if($id) {
$contacts_alphabet = array_merge(
$contacts_alphabet,
OC_Contacts_VCard::all($id, $start, 50)
OCA\Contacts\VCard::all($id, $offset, 50)
);
}
}
}*/
uasort($contacts_alphabet, 'cmp');
$contacts = array();
// Our new array for the contacts sorted by addressbook
if($contacts_alphabet) {
foreach($contacts_alphabet as $contact) {
try {
$vcard = Sabre\VObject\Reader::read($contact['carddata']);
$details = OCA\Contacts\VCard::structureContact($vcard);
$contacts[] = array(
'id' => $contact['id'],
'aid' => $contact['addressbookid'],
'data' => $details,
);
} catch (Exception $e) {
continue;
}
// This should never execute.
if(!isset($contacts_addressbook[$contact['addressbookid']])) {
/*if(!isset($contacts_addressbook[$contact['addressbookid']])) {
$contacts_addressbook[$contact['addressbookid']] = array(
'contacts' => array('type' => 'book',)
);
}
$display = trim($contact['fullname']);
if(!$display) {
$vcard = OC_Contacts_App::getContactVCard($contact['id']);
$vcard = OCA\Contacts\App::getContactVCard($contact['id']);
if(!is_null($vcard)) {
$struct = OC_Contacts_VCard::structureContact($vcard);
$struct = OCA\Contacts\VCard::structureContact($vcard);
$display = isset($struct['EMAIL'][0])
? $struct['EMAIL'][0]['value']
: '[UNKNOWN]';
@ -87,10 +116,15 @@ if($contacts_alphabet) {
isset($contacts_addressbook[$contact['addressbookid']]['permissions'])
? $contacts_addressbook[$contact['addressbookid']]['permissions']
: '0',
);
);*/
}
}
unset($contacts_alphabet);
uasort($contacts_addressbook, 'cmp');
//unset($contacts_alphabet);
//uasort($contacts, 'cmp');
OCP\JSON::success(array('data' => array('entries' => $contacts_addressbook)));
OCP\JSON::success(array(
'data' => array(
'contacts' => $contacts,
'addressbooks' => $active_addressbooks,
)
));

View File

@ -0,0 +1,61 @@
<?php
/**
* Copyright (c) 2011 Thomas Tanghus <thomas@tanghus.net>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
function cmpcategories($a, $b)
{
if (strtolower($a['name']) == strtolower($b['name'])) {
return 0;
}
return (strtolower($a['name']) < strtolower($b['name'])) ? -1 : 1;
}
function cmpcontacts($a, $b)
{
if (strtolower($a['fullname']) == strtolower($b['fullname'])) {
return 0;
}
return (strtolower($a['fullname']) < strtolower($b['fullname'])) ? -1 : 1;
}
OCP\JSON::checkLoggedIn();
OCP\JSON::checkAppEnabled('contacts');
$offset = isset($_GET['offset']) ? $_GET['offset'] : null;
$category = isset($_GET['category']) ? $_GET['category'] : null;
$list = array();
$catmgr = OC_Contacts_App::getVCategories();
if(is_null($category)) {
$categories = $catmgr->categories(OC_VCategories::FORMAT_MAP);
uasort($categories, 'cmpcategories');
foreach($categories as $category) {
$list[] = array(
'name' => $category['name'],
'contacts' => $catmgr->itemsForCategory(
$category['name'],
array(
'tablename' => '*PREFIX*contacts_cards',
'fields' => array('id',),
))
);
}
uasort($list['contacts'], 'cmpcontacts');
} else {
$list[$category] = $catmgr->itemsForCategory(
$category,
'*PREFIX*contacts_cards',
50,
$offset);
uasort($list[$category], 'cmpcontacts');
}
session_write_close();
OCP\JSON::success(array('data' => array('categories' => $list)));

View File

@ -17,9 +17,21 @@ $aid = intval($_POST['aid']);
$isaddressbook = isset($_POST['isaddressbook']) ? true: false;
// Ownership checking
OC_Contacts_App::getAddressbook($aid);
try {
OC_Contacts_VCard::moveToAddressBook($aid, $id, $isaddressbook);
OCA\Contacts\Addressbook::find($id); // is owner access check
} catch(Exception $e) {
OCP\JSON::error(
array(
'data' => array(
'message' => $e->getMessage(),
)
)
);
exit();
}
try {
OCA\Contacts\VCard::moveToAddressBook($aid, $id, $isaddressbook);
} catch (Exception $e) {
$msg = $e->getMessage();
OCP\Util::writeLog('contacts', 'Error moving contacts "'.implode(',', $id).'" to addressbook "'.$aid.'"'.$msg, OCP\Util::ERROR);

View File

@ -20,26 +20,64 @@
*
*/
namespace OCA\Contacts;
use Sabre\VObject as VObject;
require_once __DIR__.'/../loghandler.php';
function setParameters($property, $parameters, $reset = false) {
if(!$parameters) {
return;
}
if($reset) {
$property->parameters = array();
}
debug('Setting parameters: ' . print_r($parameters, true));
foreach($parameters as $key => $parameter) {
debug('Adding parameter: ' . $key);
if(is_array($parameter)) {
foreach($parameter as $val) {
if(is_array($val)) {
foreach($val as $val2) {
if(trim($key) && trim($val2)) {
debug('Adding parameter: '.$key.'=>'.print_r($val2, true));
$property->add($key, strip_tags($val2));
}
}
} else {
if(trim($key) && trim($val)) {
debug('Adding parameter: '.$key.'=>'.print_r($val, true));
$property->add($key, strip_tags($val));
}
}
}
}
}
}
// Check if we are a user
OCP\JSON::checkLoggedIn();
OCP\JSON::checkAppEnabled('contacts');
OCP\JSON::callCheck();
\OCP\JSON::checkLoggedIn();
\OCP\JSON::checkAppEnabled('contacts');
\OCP\JSON::callCheck();
$id = isset($_POST['id'])?$_POST['id']:null;
$name = isset($_POST['name'])?$_POST['name']:null;
$value = isset($_POST['value'])?$_POST['value']:null;
$parameters = isset($_POST['parameters'])?$_POST['parameters']:null;
$checksum = isset($_POST['checksum'])?$_POST['checksum']:null;
debug('value: ' . print_r($value, 1));
$multi_properties = array('EMAIL', 'TEL', 'IMPP', 'ADR', 'URL');
if(!$name) {
bailOut(OC_Contacts_App::$l10n->t('element name is not set.'));
bailOut(App::$l10n->t('element name is not set.'));
}
if(!$id) {
bailOut(OC_Contacts_App::$l10n->t('id is not set.'));
bailOut(App::$l10n->t('id is not set.'));
}
if(!$checksum) {
bailOut(OC_Contacts_App::$l10n->t('checksum is not set.'));
if(!$checksum && in_array($name, $multi_properties)) {
bailOut(App::$l10n->t('checksum is not set.'));
}
if(is_array($value)) {
$value = array_map('strip_tags', $value);
@ -47,33 +85,82 @@ if(is_array($value)) {
// set in the order the fields appear in the form!
ksort($value);
//if($name == 'CATEGORIES') {
// $value = OC_Contacts_VCard::escapeDelimiters($value, ',');
// $value = VCard::escapeDelimiters($value, ',');
//} else {
$value = OC_Contacts_VCard::escapeDelimiters($value, ';');
// $value = VCard::escapeDelimiters($value, ';');
//}
} else {
$value = trim(strip_tags($value));
}
$vcard = OC_Contacts_App::getContactVCard( $id );
$line = OC_Contacts_App::getPropertyLineByChecksum($vcard, $checksum);
if(is_null($line)) {
bailOut(OC_Contacts_App::$l10n->t(
'Information about vCard is incorrect. Please reload the page: ').$checksum
);
$vcard = App::getContactVCard($id);
if(!$vcard) {
bailOut(App::$l10n->t('Couldn\'t find vCard for %d.', array($id)));
}
$element = $vcard->children[$line]->name;
if($element != $name) {
bailOut(OC_Contacts_App::$l10n->t(
'Something went FUBAR. ').$name.' != '.$element
);
$property = null;
if(in_array($name, $multi_properties)) {
if($checksum !== 'new') {
$line = App::getPropertyLineByChecksum($vcard, $checksum);
if(is_null($line)) {
bailOut(App::$l10n->t(
'Information about vCard is incorrect. Please reload the page: ').$checksum
);
}
$property = $vcard->children[$line];
$element = $property->name;
if($element != $name) {
bailOut(App::$l10n->t(
'Something went FUBAR. ').$name.' != '.$element
);
}
} else {
// Add new property
$element = $name;
if (!is_scalar($value)) {
$property = VObject\Property::create($name);
if(in_array($name, array('ADR',))) {
$property->setParts($value);
} else {
bailOut(App::$l10n->t(
'Cannot save property of type "%s" as array', array($name,)
));
}
} else {
$property = VObject\Property::create($name, $value, $parameters);
}
setParameters($property, $parameters);
$vcard->add($property);
$checksum = substr(md5($property->serialize()), 0, 8);
try {
VCard::edit($id, $vcard);
} catch(Exception $e) {
bailOut($e->getMessage());
}
\OCP\JSON::success(array('data' => array(
'checksum' => $checksum,
'oldchecksum' => $_POST['checksum'],
)));
exit();
}
} else {
$element = $name;
$property = $vcard->select($name);
debug('propertylist: ' . get_class($property));
if(count($property) === 0) {
$property = VObject\Property::create($name);
$vcard->add($property);
} else {
$property = array_shift($property);
}
}
/* preprocessing value */
switch($element) {
case 'BDAY':
$date = New DateTime($value);
$date = New \DateTime($value);
$value = $date->format('Y-m-d');
break;
case 'FN':
@ -90,86 +177,80 @@ switch($element) {
break;
case 'IMPP':
if(is_null($parameters) || !isset($parameters['X-SERVICE-TYPE'])) {
bailOut(OC_Contacts_App::$l10n->t('Missing IM parameter.'));
bailOut(App::$l10n->t('Missing IM parameter.'));
}
$impp = OC_Contacts_App::getIMOptions($parameters['X-SERVICE-TYPE']);
$impp = App::getIMOptions($parameters['X-SERVICE-TYPE']);
if(is_null($impp)) {
bailOut(OC_Contacts_App::$l10n->t('Unknown IM: '.$parameters['X-SERVICE-TYPE']));
bailOut(App::$l10n->t('Unknown IM: '.$parameters['X-SERVICE-TYPE']));
}
$value = $impp['protocol'] . ':' . $value;
break;
}
// If empty remove the property
if(!$value) {
unset($vcard->children[$line]);
$checksum = '';
if(in_array($name, $multi_properties)) {
unset($vcard->children[$line]);
$checksum = '';
} else {
unset($vcard->{$name});
}
} else {
/* setting value */
switch($element) {
case 'BDAY':
// I don't use setDateTime() because that formats it as YYYYMMDD instead
// of YYYY-MM-DD which is what the RFC recommends.
$vcard->children[$line]->setValue($value);
$vcard->children[$line]->parameters = array();
$vcard->children[$line]->add(
new Sabre\VObject\Parameter('VALUE', 'DATE')
);
debug('Setting value:'.$name.' '.$vcard->children[$line]);
$vcard->BDAY = $value;
if(!isset($vcard->BDAY['VALUE'])) {
$vcard->BDAY->add('VALUE', 'DATE');
} else {
$vcard->BDAY->VALUE = 'DATE';
}
break;
case 'CATEGORIES':
debug('Setting string:'.$name.' '.$value);
$vcard->children[$line]->setValue($value);
case 'ADR':
case 'N':
if(is_array($value)) {
$property->setParts($value);
} else {
debug('Saving N ' . $value);
$vcard->N = $value;
}
break;
case 'EMAIL':
case 'TEL':
case 'ADR':
case 'IMPP':
case 'URL':
debug('Setting element: (EMAIL/TEL/ADR)'.$element);
$vcard->children[$line]->setValue($value);
$vcard->children[$line]->parameters = array();
if(!is_null($parameters)) {
debug('Setting parameters: '.$parameters);
foreach($parameters as $key => $parameter) {
debug('Adding parameter: '.$key);
if(is_array($parameter)) {
foreach($parameter as $val) {
if(trim($val)) {
debug('Adding parameter: '.$key.'=>'.$val);
$vcard->children[$line]->add(new Sabre\VObject\Parameter(
$key,
strtoupper(strip_tags($val)))
);
}
}
} else {
if(trim($parameter)) {
$vcard->children[$line]->add(new Sabre\VObject\Parameter(
$key,
strtoupper(strip_tags($parameter)))
);
}
}
}
}
$property->setValue($value);
break;
default:
$vcard->setString($name, $value);
$vcard->{$name} = $value;
break;
}
setParameters($property, $parameters, true);
// Do checksum and be happy
$checksum = md5($vcard->children[$line]->serialize());
if(in_array($name, $multi_properties)) {
$checksum = substr(md5($property->serialize()), 0, 8);
}
}
//debug('New checksum: '.$checksum);
//$vcard->children[$line] = $property; ???
try {
OC_Contacts_VCard::edit($id, $vcard);
VCard::edit($id, $vcard);
} catch(Exception $e) {
bailOut($e->getMessage());
}
OCP\JSON::success(array('data' => array(
'line' => $line,
'checksum' => $checksum,
'oldchecksum' => $_POST['checksum'],
'lastmodified' => OC_Contacts_App::lastModified($vcard)->format('U'),
)));
if(in_array($name, $multi_properties)) {
\OCP\JSON::success(array('data' => array(
'line' => $line,
'checksum' => $checksum,
'oldchecksum' => $_POST['checksum'],
'lastmodified' => App::lastModified($vcard)->format('U'),
)));
} else {
\OCP\JSON::success(array('data' => array(
'lastmodified' => App::lastModified($vcard)->format('U'),
)));
}

View File

@ -27,27 +27,29 @@ OCP\JSON::checkAppEnabled('contacts');
require_once 'loghandler.php';
if (!isset($_GET['id'])) {
bailOut(OC_Contacts_App::$l10n->t('No contact ID was submitted.'));
bailOut(OCA\Contacts\App::$l10n->t('No contact ID was submitted.'));
}
$contact = OC_Contacts_App::getContactVCard($_GET['id']);
$contact = OCA\Contacts\App::getContactVCard($_GET['id']);
// invalid vcard
if( is_null($contact)) {
bailOut(OC_Contacts_App::$l10n->t('Error reading contact photo.'));
bailOut(OCA\Contacts\App::$l10n->t('Error reading contact photo.'));
} else {
$image = new OC_Image();
if(!$image->loadFromBase64($contact->getAsString('PHOTO'))) {
$image->loadFromBase64($contact->getAsString('LOGO'));
if(!isset($contact->PHOTO) || !$image->loadFromBase64((string)$contact->PHOTO)) {
if(isset($contact->LOGO)) {
$image->loadFromBase64((string)$contact->LOGO);
}
}
if($image->valid()) {
$tmpkey = 'contact-photo-'.$contact->getAsString('UID');
$tmpkey = 'contact-photo-'.$contact->UID;
if(OC_Cache::set($tmpkey, $image->data(), 600)) {
OCP\JSON::success(array('data' => array('id'=>$_GET['id'], 'tmp'=>$tmpkey)));
exit();
} else {
bailOut(OC_Contacts_App::$l10n->t('Error saving temporary file.'));
bailOut(OCA\Contacts\App::$l10n->t('Error saving temporary file.'));
}
} else {
bailOut(OC_Contacts_App::$l10n->t('The loading photo is not valid.'));
bailOut(OCA\Contacts\App::$l10n->t('The loading photo is not valid.'));
}
}

View File

@ -12,14 +12,14 @@ OCP\JSON::checkAppEnabled('contacts');
$id = $_GET['id'];
$checksum = isset($_GET['checksum'])?$_GET['checksum']:'';
$vcard = OC_Contacts_App::getContactVCard($id);
$adr_types = OC_Contacts_App::getTypesOfProperty('ADR');
$vcard = OCA\Contacts\App::getContactVCard($id);
$adr_types = OCA\Contacts\App::getTypesOfProperty('ADR');
$tmpl = new OCP\Template("contacts", "part.edit_address_dialog");
if($checksum) {
$line = OC_Contacts_App::getPropertyLineByChecksum($vcard, $checksum);
$line = OCA\Contacts\App::getPropertyLineByChecksum($vcard, $checksum);
$element = $vcard->children[$line];
$adr = OC_Contacts_VCard::structureProperty($element);
$adr = OCA\Contacts\VCard::structureProperty($element);
$types = array();
if(isset($adr['parameters']['TYPE'])) {
if(is_array($adr['parameters']['TYPE'])) {

View File

@ -16,19 +16,19 @@ $tmpl = new OCP\Template("contacts", "part.edit_name_dialog");
$id = isset($_GET['id'])?$_GET['id']:'';
if($id) {
$vcard = OC_Contacts_App::getContactVCard($id);
$vcard = OCA\Contacts\App::getContactVCard($id);
$name = array('', '', '', '', '');
if($vcard->__isset('N')) {
$property = $vcard->__get('N');
if($property) {
$name = OC_Contacts_VCard::structureProperty($property);
$name = OCA\Contacts\VCard::structureProperty($property);
}
}
$name = array_map('htmlspecialchars', $name['value']);
$tmpl->assign('name', $name, false);
$tmpl->assign('id', $id, false);
} else {
bailOut(OC_Contacts_App::$l10n->t('Contact ID is missing.'));
bailOut(OCA\Contacts\App::$l10n->t('Contact ID is missing.'));
}
$page = $tmpl->fetchPage();
OCP\JSON::success(array('data' => array('page'=>$page)));

View File

@ -25,26 +25,26 @@ OCP\JSON::checkAppEnabled('contacts');
require_once 'loghandler.php';
if(!isset($_GET['id'])) {
bailOut(OC_Contacts_App::$l10n->t('No contact ID was submitted.'));
bailOut(OCA\Contacts\App::$l10n->t('No contact ID was submitted.'));
}
if(!isset($_GET['path'])) {
bailOut(OC_Contacts_App::$l10n->t('No photo path was submitted.'));
bailOut(OCA\Contacts\App::$l10n->t('No photo path was submitted.'));
}
$localpath = OC_Filesystem::getLocalFile($_GET['path']);
$tmpkey = 'contact-photo-'.$_GET['id'];
if(!file_exists($localpath)) {
bailOut(OC_Contacts_App::$l10n->t('File doesn\'t exist:').$localpath);
bailOut(OCA\Contacts\App::$l10n->t('File doesn\'t exist:').$localpath);
}
$image = new OC_Image();
if(!$image) {
bailOut(OC_Contacts_App::$l10n->t('Error loading image.'));
bailOut(OCA\Contacts\App::$l10n->t('Error loading image.'));
}
if(!$image->loadFromFile($localpath)) {
bailOut(OC_Contacts_App::$l10n->t('Error loading image.'));
bailOut(OCA\Contacts\App::$l10n->t('Error loading image.'));
}
if($image->width() > 400 || $image->height() > 400) {
$image->resize(400); // Prettier resizing than with browser and saves bandwidth.

View File

@ -63,10 +63,10 @@ if($data) {
if(($image->width() <= 200 && $image->height() <= 200)
|| $image->resize(200)) {
$vcard = OC_Contacts_App::getContactVCard($id);
$vcard = OCA\Contacts\App::getContactVCard($id);
if(!$vcard) {
OC_Cache::remove($tmpkey);
bailOut(OC_Contacts_App::$l10n
bailOut(OCA\Contacts\App::$l10n
->t('Error getting contact object.'));
}
if($vcard->__isset('PHOTO')) {
@ -76,7 +76,7 @@ if($data) {
$property = $vcard->__get('PHOTO');
if(!$property) {
OC_Cache::remove($tmpkey);
bailOut(OC_Contacts_App::$l10n
bailOut(OCA\Contacts\App::$l10n
->t('Error getting PHOTO property.'));
}
$property->setValue($image->__toString());
@ -89,34 +89,41 @@ if($data) {
OCP\Util::writeLog('contacts',
'savecrop.php: files: Adding PHOTO property.',
OCP\Util::DEBUG);
$vcard->addProperty('PHOTO',
// For vCard 3.0 the type must be e.g. JPEG or PNG
// For version 4.0 the full mimetype should be used.
// https://tools.ietf.org/html/rfc2426#section-3.1.4
$type = $vcard->VERSION == '4.0'
? $image->mimeType()
: strtoupper(array_pop(explode('/', $image->mimeType())));
$vcard->add('PHOTO',
$image->__toString(), array('ENCODING' => 'b',
'TYPE' => $image->mimeType()));
'TYPE' => $type));
}
$now = new DateTime;
$vcard->setString('REV', $now->format(DateTime::W3C));
if(!OC_Contacts_VCard::edit($id, $vcard)) {
bailOut(OC_Contacts_App::$l10n->t('Error saving contact.'));
$vcard->{'REV'} = $now->format(DateTime::W3C);
if(!OCA\Contacts\VCard::edit($id, $vcard)) {
bailOut(OCA\Contacts\App::$l10n->t('Error saving contact.'));
}
OCA\Contacts\App::cacheThumbnail($id, $image);
OCP\JSON::success(array(
'data' => array(
'id' => $id,
'width' => $image->width(),
'height' => $image->height(),
'lastmodified' => OC_Contacts_App::lastModified($vcard)->format('U')
'lastmodified' => OCA\Contacts\App::lastModified($vcard)->format('U')
)
));
} else {
bailOut(OC_Contacts_App::$l10n->t('Error resizing image'));
bailOut(OCA\Contacts\App::$l10n->t('Error resizing image'));
}
} else {
bailOut(OC_Contacts_App::$l10n->t('Error cropping image'));
bailOut(OCA\Contacts\App::$l10n->t('Error cropping image'));
}
} else {
bailOut(OC_Contacts_App::$l10n->t('Error creating temporary image'));
bailOut(OCA\Contacts\App::$l10n->t('Error creating temporary image'));
}
} else {
bailOut(OC_Contacts_App::$l10n->t('Error finding image: ').$tmpkey);
bailOut(OCA\Contacts\App::$l10n->t('Error finding image: ').$tmpkey);
}
OC_Cache::remove($tmpkey);

View File

@ -9,7 +9,7 @@
OCP\JSON::checkLoggedIn();
OCP\JSON::checkAppEnabled('contacts');
$books = OC_Contacts_Addressbook::all(OCP\USER::getUser());
$books = OCA\Contacts\Addressbook::all(OCP\USER::getUser());
$tmpl = new OCP\Template("contacts", "part.selectaddressbook");
$tmpl->assign('addressbooks', $books);
$page = $tmpl->fetchPage();

55
ajax/setpreference.php Normal file
View File

@ -0,0 +1,55 @@
<?php
/**
* ownCloud - Contacts
*
* @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/>.
*
*/
/**
* @brief Set user preference.
* @param $key
* @param $value
*/
OCP\JSON::checkLoggedIn();
OCP\JSON::checkAppEnabled('contacts');
OCP\JSON::callCheck();
require_once 'loghandler.php';
$key = isset($_POST['key'])?$_POST['key']:null;
$value = isset($_POST['value'])?$_POST['value']:null;
if(is_null($key)) {
bailOut(OCA\Contacts\App::$l10n->t('Key is not set for: '.$value));
}
if(is_null($value)) {
bailOut(OCA\Contacts\App::$l10n->t('Value is not set for: '.$key));
}
if(OCP\Config::setUserValue(OCP\USER::getUser(), 'contacts', $key, $value)) {
OCP\JSON::success(array(
'data' => array(
'key' => $key,
'value' => $value)
)
);
} else {
bailOut(OCA\Contacts\App::$l10n->t(
'Could not set preference: ' . $key . ':' . $value)
);
}

View File

@ -26,7 +26,7 @@ OCP\JSON::checkAppEnabled('contacts');
OCP\JSON::callCheck();
require_once 'loghandler.php';
$l10n = OC_Contacts_App::$l10n;
$l10n = OCA\Contacts\App::$l10n;
$view = OCP\Files::getStorage('contacts');
if(!$view->file_exists('imports')) {

View File

@ -28,7 +28,7 @@ OCP\JSON::callCheck();
// Firefox and Konqueror tries to download application/json for me. --Arthur
OCP\JSON::setContentTypeHeader('text/plain; charset=utf-8');
require_once 'loghandler.php';
$l10n = OC_Contacts_App::$l10n;
$l10n = OCA\Contacts\App::$l10n;
// If it is a Drag'n'Drop transfer it's handled here.
$fn = (isset($_SERVER['HTTP_X_FILE_NAME']) ? $_SERVER['HTTP_X_FILE_NAME'] : false);
if ($fn) {

View File

@ -1,20 +1,21 @@
<?php
OC::$CLASSPATH['OC_Contacts_App'] = 'contacts/lib/app.php';
OC::$CLASSPATH['OC_Contacts_Addressbook'] = 'contacts/lib/addressbook.php';
OC::$CLASSPATH['OC_Contacts_VCard'] = 'contacts/lib/vcard.php';
OC::$CLASSPATH['OC_Contacts_Hooks'] = 'contacts/lib/hooks.php';
OC::$CLASSPATH['OC_Share_Backend_Contact'] = 'contacts/lib/share/contact.php';
OC::$CLASSPATH['OC_Share_Backend_Addressbook'] = 'contacts/lib/share/addressbook.php';
OC::$CLASSPATH['OCA\Contacts\App'] = 'contacts/lib/app.php';
OC::$CLASSPATH['OCA\Contacts\Addressbook'] = 'contacts/lib/addressbook.php';
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';
OC::$CLASSPATH['OC_Connector_Sabre_CardDAV_AddressBook'] = 'contacts/lib/sabre/addressbook.php';
OC::$CLASSPATH['OC_Connector_Sabre_CardDAV_Card'] = 'contacts/lib/sabre/card.php';
OC::$CLASSPATH['OC_Search_Provider_Contacts'] = 'contacts/lib/search.php';
OCP\Util::connectHook('OC_User', 'post_createUser', 'OC_Contacts_Hooks', 'createUser');
OCP\Util::connectHook('OC_User', 'post_deleteUser', 'OC_Contacts_Hooks', 'deleteUser');
OCP\Util::connectHook('OC_Calendar', 'getEvents', 'OC_Contacts_Hooks', 'getBirthdayEvents');
OCP\Util::connectHook('OC_Calendar', 'getSources', 'OC_Contacts_Hooks', 'getCalenderSources');
OC::$CLASSPATH['OCA\\Contacts\\SearchProvider'] = 'contacts/lib/search.php';
OCP\Util::connectHook('OC_User', 'post_createUser', 'OCA\Contacts\Hooks', 'createUser');
OCP\Util::connectHook('OC_User', 'post_deleteUser', 'OCA\Contacts\Hooks', 'deleteUser');
OCP\Util::connectHook('OC_Calendar', 'getEvents', 'OCA\Contacts\Hooks', 'getBirthdayEvents');
OCP\Util::connectHook('OC_Calendar', 'getSources', 'OCA\Contacts\Hooks', 'getCalenderSources');
OCP\App::addNavigationEntry( array(
'id' => 'contacts_index',
@ -24,6 +25,10 @@ OCP\App::addNavigationEntry( array(
'name' => OC_L10N::get('contacts')->t('Contacts') ));
OCP\Util::addscript('contacts', 'loader');
OC_Search::registerProvider('OC_Search_Provider_Contacts');
OCP\Share::registerBackend('contact', 'OC_Share_Backend_Contact');
OCP\Share::registerBackend('addressbook', 'OC_Share_Backend_Addressbook', 'contact');
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

@ -1,138 +1,213 @@
<?xml version="1.0" encoding="ISO-8859-1" ?>
<database>
<name>*dbname*</name>
<create>true</create>
<overwrite>false</overwrite>
<name>*dbname*</name>
<create>true</create>
<overwrite>false</overwrite>
<charset>utf8</charset>
<charset>utf8</charset>
<table>
<table>
<name>*dbprefix*contacts_addressbooks</name>
<name>*dbprefix*contacts_addressbooks</name>
<declaration>
<declaration>
<field>
<name>id</name>
<type>integer</type>
<default>0</default>
<notnull>true</notnull>
<autoincrement>1</autoincrement>
<unsigned>true</unsigned>
<length>4</length>
</field>
<field>
<name>id</name>
<type>integer</type>
<default>0</default>
<notnull>true</notnull>
<autoincrement>1</autoincrement>
<unsigned>true</unsigned>
<length>4</length>
</field>
<field>
<name>userid</name>
<type>text</type>
<default></default>
<notnull>true</notnull>
<length>255</length>
</field>
<field>
<name>userid</name>
<type>text</type>
<default></default>
<notnull>true</notnull>
<length>255</length>
</field>
<field>
<name>displayname</name>
<type>text</type>
<default></default>
<notnull>false</notnull>
<length>255</length>
</field>
<field>
<name>displayname</name>
<type>text</type>
<default></default>
<notnull>false</notnull>
<length>255</length>
</field>
<field>
<name>uri</name>
<type>text</type>
<default></default>
<notnull>false</notnull>
<length>200</length>
</field>
<field>
<name>uri</name>
<type>text</type>
<default></default>
<notnull>false</notnull>
<length>200</length>
</field>
<field>
<name>description</name>
<type>text</type>
<notnull>false</notnull>
<length>255</length>
</field>
<field>
<name>description</name>
<type>text</type>
<notnull>false</notnull>
<length>255</length>
</field>
<field>
<name>ctag</name>
<type>integer</type>
<default>1</default>
<notnull>true</notnull>
<unsigned>true</unsigned>
<length>4</length>
</field>
<field>
<name>ctag</name>
<type>integer</type>
<default>1</default>
<notnull>true</notnull>
<unsigned>true</unsigned>
<length>4</length>
</field>
<field>
<name>active</name>
<type>integer</type>
<default>1</default>
<notnull>true</notnull>
<length>4</length>
</field>
<field>
<name>active</name>
<type>integer</type>
<default>1</default>
<notnull>true</notnull>
<length>4</length>
</field>
</declaration>
</declaration>
</table>
</table>
<table>
<table>
<name>*dbprefix*contacts_cards</name>
<name>*dbprefix*contacts_cards</name>
<declaration>
<declaration>
<field>
<name>id</name>
<type>integer</type>
<default>0</default>
<notnull>true</notnull>
<autoincrement>1</autoincrement>
<unsigned>true</unsigned>
<length>4</length>
</field>
<field>
<name>id</name>
<type>integer</type>
<default>0</default>
<notnull>true</notnull>
<autoincrement>1</autoincrement>
<unsigned>true</unsigned>
<length>4</length>
</field>
<field>
<name>addressbookid</name>
<type>integer</type>
<default></default>
<notnull>true</notnull>
<unsigned>true</unsigned>
<length>4</length>
</field>
<field>
<name>addressbookid</name>
<type>integer</type>
<default></default>
<notnull>true</notnull>
<unsigned>true</unsigned>
<length>4</length>
</field>
<field>
<name>fullname</name>
<type>text</type>
<default></default>
<notnull>false</notnull>
<length>255</length>
</field>
<field>
<name>fullname</name>
<type>text</type>
<default></default>
<notnull>false</notnull>
<length>255</length>
</field>
<field>
<name>carddata</name>
<type>clob</type>
<notnull>false</notnull>
</field>
<field>
<name>carddata</name>
<type>clob</type>
<notnull>false</notnull>
</field>
<field>
<name>uri</name>
<type>text</type>
<default></default>
<notnull>false</notnull>
<length>200</length>
</field>
<field>
<name>uri</name>
<type>text</type>
<default></default>
<notnull>false</notnull>
<length>200</length>
</field>
<field>
<name>lastmodified</name>
<type>integer</type>
<default></default>
<notnull>false</notnull>
<unsigned>true</unsigned>
<length>4</length>
</field>
<field>
<name>lastmodified</name>
<type>integer</type>
<default></default>
<notnull>false</notnull>
<unsigned>true</unsigned>
<length>4</length>
</field>
</declaration>
</declaration>
</table>
</table>
<table>
<name>*dbprefix*contacts_cards_properties</name>
<declaration>
<field>
<name>id</name>
<type>integer</type>
<default>0</default>
<notnull>true</notnull>
<autoincrement>1</autoincrement>
<unsigned>true</unsigned>
<length>4</length>
</field>
<field>
<name>userid</name>
<type>text</type>
<default></default>
<notnull>true</notnull>
<length>255</length>
</field>
<field>
<name>contactid</name>
<type>integer</type>
<default></default>
<notnull>true</notnull>
<unsigned>true</unsigned>
<length>4</length>
</field>
<field>
<name>name</name>
<type>text</type>
<default></default>
<notnull>false</notnull>
<length>64</length>
</field>
<field>
<name>value</name>
<type>text</type>
<default></default>
<notnull>false</notnull>
<length>255</length>
</field>
<field>
<name>preferred</name>
<type>integer</type>
<default>1</default>
<notnull>true</notnull>
<length>4</length>
</field>
<index>
<name>name_index</name>
<field>
<name>name</name>
<sorting>ascending</sorting>
</field>
</index>
<index>
<name>value_index</name>
<field>
<name>value</name>
<sorting>ascending</sorting>
</field>
</index>
</declaration>
</table>
</database>

View File

@ -3,7 +3,7 @@
<id>contacts</id>
<name>Contacts</name>
<licence>AGPL</licence>
<author>Jakob Sack</author>
<author>Jakob Sack,Thomas Tanghus</author>
<require>4.9</require>
<shipped>true</shipped>
<description>Address book with CardDAV support.</description>
@ -12,5 +12,6 @@
<remote>
<contacts>appinfo/remote.php</contacts>
<carddav>appinfo/remote.php</carddav>
<contactthumbnail>thumbnail.php</contactthumbnail>
</remote>
</info>

View File

@ -44,7 +44,7 @@ class OC_Migration_Provider_Contacts extends OC_Migration_Provider{
// Map the id
$idmap[$row['id']] = OCP\DB::insertid('*PREFIX*contacts_addressbooks');
// Make the addressbook active
OC_Contacts_Addressbook::setActive($idmap[$row['id']], true);
OCA\Contacts\Addressbook::setActive($idmap[$row['id']], true);
}
// Now tags
foreach($idmap as $oldid => $newid) {

View File

@ -1 +1 @@
0.2.4
0.2.5

View File

@ -1,159 +1,571 @@
/*dl > dt {
font-weight: bold;
}*/
/* General element settings */
#content li { cursor: default; }
#content input[type=checkbox] {
height: 14px; width: 14px;
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;
}
#content input[type=radio] {
width: 12px; height: 12px;
-moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px;
}
#content input[type=checkbox]:hover { border: 1px solid #D4D4D4 !important; }
#content input[type=checkbox]:checked::after {
content: url('%appswebroot%/contacts/img/checkmark.png');
display: block;
position: relative;
top: -2px;
left: -1px;
}
#content input[type=radio]:checked::after {
content: url('%appswebroot%/contacts/img/checkmark.png');
margin: 0; padding: 0;
display: inline-block;
position: relative;
top: -8px;
left: -6px;
}
#content textarea { font-family: inherit; }
#content input:-moz-placeholder { color: #aaa; }
#content input::-webkit-input-placeholder { color: #aaa; }
#content input:-ms-input-placeholder { color: #aaa; }
#content input:placeholder { color: #aaa; }
#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;
}
#content fieldset.editor {
border: 1px solid #1d2d44;
-moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; outline:none;
}
#content input:invalid, #content input:hover:not([type="checkbox"]), #content input:active:not([type="checkbox"]), #content input:focus:not([type="checkbox"]), #content input.active, #content textarea:focus, #content textarea:hover {
border: 1px solid silver !important;
-moz-border-radius:.3em; -webkit-border-radius:.3em; border-radius:.3em;
outline:none; float: left;
}
/* Left content */
#leftcontent { top: 3.5em !important; padding: 0; margin: 0; }
#leftcontent a { padding: 0 0 0 25px; }
#rightcontent { top: 3.5em !important; padding-top: 5px; }
#leftcontent h3 { cursor: pointer; -moz-transition: background 300ms ease 0s; background: none no-repeat scroll 1em center #eee; border-bottom: 1px solid #ddd; border-top: 1px solid #fff; display: block; max-width: 100%; padding: 0.5em 0.8em; color: #666; text-shadow: 0 1px 0 #f8f8f8; font-size: 1.2em; }
#leftcontent h3:hover,#leftcontent h3:active,#leftcontent h3.active { background-color: #DBDBDB; border-bottom: 1px solid #CCCCCC; border-top: 1px solid #D4D4D4; color: #333333; font-weight: bold; }
#leftcontent h3 img.shared { float: right; opacity: 0.4; }
#leftcontent a { display: inline-block; padding: 0; margin: 0; }
#leftcontent h3 {
cursor: pointer;
-moz-transition: background 300ms ease 0s;
background: none no-repeat scroll 1em center #eee;
border-bottom: 1px solid #ddd; border-top: 1px solid #fff;
display: block;
max-width: 100%;
height: 2em;
padding: 0.5em 0.8em;
color: #666;
text-shadow: 0 1px 0 #f8f8f8;
font-size: 1.2em;
}
#leftcontent h3:hover,#leftcontent h3:active,#leftcontent h3.active {
background-color: #DBDBDB;
border-bottom: 1px solid #CCCCCC; border-top: 1px solid #D4D4D4;
color: #333333; font-weight: bold;
}
#leftcontent h3 img.shared { float: right; opacity: 0.4; margin: 0 .5em; }
#leftcontent h3 img.shared:hover { opacity: 1; }
#contacts { position: fixed; background: #fff; max-width: 100%; width: 20em; left: 12.5em; top: 3.7em; bottom: 3em; overflow: auto; padding: 0; margin: 0; }
.contacts a { height: 23px; display: block; left: 12.5em; margin: 0 0 0 0; padding: 0 0 0 25px; }
.contacts li.ui-draggable { height: 23px; }
.ui-draggable-dragging { width: 17em; cursor: move; }
.ui-state-hover { border: 1px solid dashed; }
#bottomcontrols { padding: 0; bottom:0px; height:2.8em; width: 20em; margin:0; background:#eee; border-top:1px solid #ccc; position:fixed; -moz-box-shadow: 0 -3px 3px -3px #000; -webkit-box-shadow: 0 -3px 3px -3px #000; box-shadow: 0 -3px 3px -3px #000;}
#bottomcontrols img { margin-top: 0.35em; }
#uploadprogressbar { display: none; padding: 0; bottom: 3em; height:2em; width: 20em; margin:0; background:#eee; border:1px solid #ccc; position:fixed; }
button.control { float: left; margin: 0.2em 0 0 1em; height: 2.4em; width: 2.4em; /* border: 0 none; border-radius: 0; -moz-box-shadow: none; box-shadow: none; outline: 0 none;*/ }
.settings { background:url('%webroot%/core/img/actions/settings.svg') no-repeat center; float: right !important; margin: 0.2em 1em 0 0 !important; }
.import { background:url('%webroot%/core/img/actions/upload.svg') no-repeat center; }
.newcontact { background:url('%appswebroot%/contacts/img/contact-new.svg') no-repeat center; }
#actionbar { clear: both; height: 30px;}
#contacts_deletecard {position:relative; float:left; background:url('%webroot%/core/img/actions/delete.svg') no-repeat center; }
#contacts_downloadcard {position:relative; float:left; background:url('%webroot%/core/img/actions/download.svg') no-repeat center; }
#contacts_propertymenu { clear: left; float:left; max-width: 15em; margin: 2em; }
#contacts_propertymenu_button { position:relative;top:0;left:0; margin: 0; }
#contacts_propertymenu_dropdown { background-color: #fff; position:relative; right:0; overflow:hidden; text-overflow:ellipsis; border: thin solid #1d2d44; box-shadow: 0 3px 5px #bbb; /* -moz-box-shadow:0 0 10px #000; -webkit-box-shadow:0 0 10px #000; box-shadow:0 0 10px #000; -moz-border-radius:0.5em; -webkit-border-radius:0.5em; border-radius:0.5em; -moz-border-radius:0.5em; -webkit-border-radius:0.5em;*/ border-radius: 3px; }
#contacts_propertymenu li { display: block; font-weight: bold; height: 20px; }
#contacts_propertymenu li a { padding: 3px; display: block }
#contacts_propertymenu li:hover { background-color: #1d2d44; }
#contacts_propertymenu li a:hover { color: #fff }
#card { width: auto; font-size: 10px; /*max-width: 70em; border: thin solid lightgray; display: block;*/ }
#leftcontent h3.editing .checked { margin-left: -25px; opacity: 1; display: inline-block; float: left; }
#leftcontent h3.editing .checked.disabled { opacity: .5 }
#leftcontent h3 input[type="text"] {
display: block;
width: 100%;
font-size: .8em;
float: left;
-webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box;
margin: auto 0 auto .3em;
}
#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 {
-moz-border-bottom-colors: none;
-moz-border-left-colors: none;
-moz-border-right-colors: none;
-moz-border-top-colors: none;
border-color: #51A351 #419341 #387038;
border-image: none;
border-style: solid;
border-width: 1px;
box-shadow: 0 1px 1px #F8F8F8, 1px 1px 1px #AADDAA inset;
background-color: #5BB75B;
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; }
#grouplist h3:not([data-type="shared"]):not(.editing):hover .action.numcontacts, #grouplist h3:not([data-type="shared"]):not(.editing) .active.action.numcontacts { display: inline-block; }
#grouplist h3[data-type="category"]:not(.editing):hover .action.delete { display: inline-block; }
#grouplist h3:not(.editing) .action.delete { width: 20px; height: 20px; }
/* First run */
#firstrun { position: relative; top: 25%; left: 20%; right: 20%; width: 50%; font-weight:bold; text-align: center; color: #777; }
#firstrun h3 { font-size:1.5em; text-align: center; margin-bottom: 1em; }
#firstrun p { font-size:1.2em; text-align: }
#firstrun p { font-size:1.2em; text-align:center; }
#firstrun #selections { font-size:0.8em; margin: 2em auto auto auto; clear: both; }
#card input[type="text"].contacts_property,input[type="email"].contacts_property,input[type="url"].contacts_property { width: 14em; float: left; font-weight: bold; }
.categories { float: left; width: 16em; }
#card input[type="checkbox"].contacts_property, #card input[type="text"], #card input[type="email"], #card input[type="url"], #card input[type="tel"], #card input[type="date"], #card select, #card textarea { background-color: #fefefe; border: 0 !important; -moz-appearance:none !important; -webkit-box-sizing:none !important; -moz-box-sizing:none !important; box-sizing:none !important; -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; -moz-border-radius: 0px; -webkit-border-radius: 0px; border-radius: 0px; float: left; }
#card input[type="text"]:hover, #card input[type="text"]:focus, #card input[type="text"]:active, input[type="email"]:hover, #card input[type="url"]:hover, #card input[type="tel"]:hover, #card input[type="date"]:hover, #card input[type="date"], #card input[type="date"]:hover, #card input[type="date"]:active, #card input[type="date"]:active, #card input[type="date"]:active, #card input[type="email"]:active, #card input[type="url"]:active, #card input[type="tel"]:active, #card textarea:focus, #card textarea:hover { border: 0 !important; -webkit-appearance:textfield; -moz-appearance:textfield; -webkit-box-sizing:content-box; -moz-box-sizing:content-box; box-sizing:content-box; background:#fff; color:#333; border:1px solid #ddd; -moz-box-shadow:0 1px 1px #ddd, 0 2px 0 #bbb inset; -webkit-box-shadow:0 1px 1px #ddd, 0 1px 0 #bbb inset; box-shadow:0 1px 1px #ddd, 0 1px 0 #bbb inset; -moz-border-radius:.5em; -webkit-border-radius:.5em; border-radius:.5em; outline:none; float: left; }
#card textarea { width: 80%; min-height: 5em; min-width: 30em; margin: 0 !important; padding: 0 !important; outline: 0 !important;}
dl.form { width: 100%; float: left; clear: right; margin: 0; padding: 0; cursor: normal; }
#contact { margin: 1em; }
#contact textarea { min-height: 5em; min-width: 30em; margin: 0 !important; padding: 0 !important; outline: 0 !important;}
#contact input[type="checkbox"] { margin-top: 10px; vertical-align: bottom; float: left; }
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: 0px; white-space: nowrap; vertical-align: text-bottom; }
label:hover, dt:hover { color: #333; }
/*::-webkit-input-placeholder { color: #bbb; }
:-moz-placeholder { color: #bbb; }
:-ms-input-placeholder { color: #bbb; }*/
.droptarget { margin: 0.5em; padding: 0.5em; border: thin solid #ccc; -moz-border-radius:.3em; -webkit-border-radius:.3em; border-radius:.3em; }
.droppable { margin: 0.5em; padding: 0.5em; border: thin dashed #333; -moz-border-radius:.3em; -webkit-border-radius:.3em; border-radius:.3em; }
.loading { background: url('%webroot%/core/img/loading.gif') no-repeat center !important; /*cursor: progress; */ cursor: wait; }
.ui-autocomplete-loading { background: url('%webroot%/core/img/loading.gif') right center no-repeat; }
.ui-autocomplete-input { margin-top: 0.5em; } /* Ugly hack */
.float { float: left; }
.svg { border: inherit; background: inherit; }
.listactions { height: 1em; width:60px; float: left; clear: right; }
.add,.edit,.delete,.mail, .globe, .upload, .download, .cloud, .share { cursor: pointer; width: 20px; height: 20px; margin: 0; float: left; position:relative; opacity: 0.1; }
.add:hover,.edit:hover,.delete:hover,.mail:hover, .globe:hover, .upload:hover, .download:hover .cloud:hover { opacity: 1.0 }
.add { background:url('%webroot%/core/img/actions/add.svg') no-repeat center; clear: both; }
.delete { background:url('%webroot%/core/img/actions/delete.svg') 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('../img/globe.svg') no-repeat center; }*/
.globe { background:url('%webroot%/core/img/actions/public.svg') no-repeat center; }
.form dd { display: table-cell; clear: right; float: left; margin: 0; padding: 0; white-space: nowrap; vertical-align: text-bottom; }
/* 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%; }
.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; }
#edit_name_dialog { padding:0; }
#edit_name_dialog > input { width: 15em; }
#edit_address_dialog { /*width: 30em;*/ }
#edit_address_dialog > input { width: 15em; }
#edit_photo_dialog_img { display: block; min-width: 150; min-height: 200; }
#fn { float: left !important; width: 18em !important; }
#name { /*position: absolute; top: 0px; left: 0px;*/ min-width: 25em; height: 2em; clear: right; display: block; }
#identityprops { /*position: absolute; top: 2.5em; left: 0px;*/ }
#contact_photo { float: left; margin: 1em; }
#contact_identity { min-width: 30em; padding: 0.5em;}
.contactsection { position: relative; float: left; width: 35em; padding: 0.5em; height: auto; }
.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: wait; }
.wait { opacity: cursor: wait; }
.control {
border: 1px solid #DDDDDD;
border-radius: 0.3em;
color: #555;
cursor: pointer;
font-weight: bold;
font-size: 1em;
width: auto;
}
.control > * { background: none repeat scroll 0 0 #F8F8F8; color: #555 !important; font-size: 100%; margin: 0px; }
#cropbox { margin: auto; }
#contacts_details_photo_wrapper { width: 150px; }
#contacts_details_photo_wrapper.wait { opacity: 0.6; filter:alpha(opacity=0.6); z-index:1000; background: url('%webroot%/core/img/loading.gif') no-repeat center center; cursor: wait; }
.contacts_details_photo { border-radius: 0.5em; 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; }
.contacts_details_photo:hover { background: #fff; cursor: default; }
#phototools { position:absolute; margin: 5px 0 0 10px; width:auto; height:22px; padding:0px; background-color:#fff; list-style-type:none; border-radius: 0.5em; -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:hover { opacity: 0.8; }
.ui-draggable { height: 3em; z-index: 1000; }
.ui-draggable-dragging { width: 70%; cursor: move; }
.ui-state-hover { border: 1px solid dashed; z-index: 1; }
/* Address editor */
#addressdisplay { padding: 0.5em; }
dl.addresscard { background-color: #fff; float: left; width: auto; margin: 0 0.3em 0.3em 0.3em; padding: 0; border: 0; }
dl.addresscard dd {}
dl.addresscard dt { padding: 0.3em; font-weight: bold; clear: both; color: #aaa; }
dl.addresscard dt:hover { color:#777; }
dl.addresscard dd > ul { margin: 0.3em; padding: 0.3em; }
dl.addresscard .action { float: right; }
#address dt { width: 30%; white-space:nowrap; }
#address dd { width: 66%; }
#address input { width: 12em; padding: 0.6em 0.5em 0.4em; }
#address input:-moz-placeholder { color: #aaa; }
#address input::-webkit-input-placeholder { color: #aaa; }
#address input:-ms-input-placeholder { color: #aaa; }
#address input:placeholder { color: #aaa; }
#adr_type {} /* Select */
#adr_pobox {}
#adr_extended {}
#adr_street {}
#adr_city {}
#adr_region {}
#adr_zipcode {}
#adr_country {}
/* Properties */
#file_upload_form { width: 0; height: 0; }
#file_upload_target, #import_upload_target, #crop_target { display:none; }
#file_upload_start, #import_upload_start { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0; z-index:1001; width:0; height:0;}
input[type="checkbox"] { width: 20px; height: 20px; vertical-align: bottom; }
.big { font-weight:bold; font-size:1.2em; }
.huge { font-weight:bold; font-size:1.5em; }
.propertycontainer dd { float: left; width: 25em; }
/*.propertylist { clear: none; max-width: 33em; }*/
.propertylist li.propertycontainer { white-space: nowrap; min-width: 35em; display: block; clear: both; }
.propertycontainer[data-element="EMAIL"] > input[type="email"],.propertycontainer[data-element="TEL"] > input[type="text"] { min-width: 12em !important; float: left; }
.propertylist li > input[type="checkbox"],input[type="radio"] { float: left; clear: left; width: 16px; height: 16px; vertical-align: middle; padding: 0; }
.singleproperties { display: inline-block; float: left; width: 270px; }
.singleproperties .fullname { font-weight:bold; font-size:1.5em; width: 250px; margin: 5px 0; }
.singleproperties .n.editor { width: 270px; padding: 3px; }
.singleproperties .n.editor input { width: 95%; }
.singleproperties .propertycontainer input.value { font-weight: bold; }
.singleproperties .propertycontainer input.value.new { border: 3px solid #1d2d44;}
.singleproperties .propertycontainer input.value.error { border: 3px solid red;}
.singleproperties .propertycontainer .action {
float: left;
width: 20px; height: 20px;
opacity: 0;
}
.singleproperties .propertycontainer:hover .action { opacity: 1; }
.singleproperties dl { width: 270px; }
.parameters {
width: 120px;
float: left;
text-align: right;
box-sizing: border-box;
display: inline-block;
}
ul.propertylist { width: 450px; }
.propertylist li.propertycontainer { white-space: nowrap; min-width: 38em; display: block; clear: both; }
.propertylist li.propertycontainer > .listactions {
display: inline-block;
position: absolute;
clear: none; opacity: 0;
float: right;
}
.propertylist li.propertycontainer:hover > .listactions { opacity: 1; }
.propertylist li.propertycontainer .listactions a {
display: inline-block;
float: left; clear: none;
width: 16px; height: 16px;
}
.propertylist { float: left; }
/*.propertylist li > a { display: block; }}*/
.propertylist li > input[type="checkbox"],input[type="radio"] { display: inline-block; }
.propertylist input.value:not([type="checkbox"]) { width: 16em; display: inline-block; font-weight: bold; }
.propertylist input.value:not([type="checkbox"]).new { border: 3px solid #1d2d44;}
.propertylist input.value:not([type="checkbox"]).error { border: 3px solid red;}
.propertylist li > select { float: left; max-width: 8em; }
.propertylist li > .select_wrapper { float: left; overflow: hidden; color: #bbb; font-size: 0.8em; }
.propertylist li > .select_wrapper select { float: left; overflow: hidden; color: #bbb; }
.propertylist li > .select_wrapper select option { color: #777; }
.propertylist li > .select_wrapper select:hover,.propertylist li > select:focus,.propertylist li > select:active { color: #777; }
.propertylist li > .select_wrapper select.impp { margin-left: -23px; direction: rtl; }
.propertylist li > .select_wrapper select.types { margin-right: -23px; }
.select_wrapper { float: left; overflow: hidden; color: #bbb; font-size: 0.8em; }
.select_wrapper select { float: left; overflow: hidden; text-overflow: ellipsis; color: #bbb; width: 8em; }
.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; 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; }
.propertylist li > label.xab:hover { color: #777; }
#rightcontent label, #rightcontent dt, #rightcontent th, #rightcontent .label {
float: left;
font-size: 0.7em; font-weight: bold;
color: #bbb !important;
border: 0;
display: inline-block;
box-sizing: border-box;
}
#rightcontent label:hover, .form dt:hover, #rightcontent input.label:hover { color: #777 !important; }
#rightcontent input.label:hover, #rightcontent input.label:active { border: 0 none !important; border-radius: 0; cursor: pointer; }
.typelist[type="button"] { float: left; max-width: 8em; border: 0; background-color: #fff; color: #bbb; box-shadow: none; } /* for multiselect */
.typelist[type="button"]:hover { color: #777; } /* for multiselect */
.addresslist { clear: both; font-weight: bold; }
#ninjahelp { position: absolute; bottom: 0; left: 0; right: 0; padding: 1em; margin: 1em; opacity: 0.9; }
/* Help section */
#ninjahelp { position: relative; bottom: 0; left: 0; right: 0; padding: 1em; margin: 1em; opacity: 0.9; }
#ninjahelp .close { position: absolute; top: 5px; right: 5px; height: 20px; width: 20px; }
#ninjahelp h2, .help-section h3 { width: 100%; font-weight: bold; text-align: center; }
#ninjahelp h2 { font-size: 1.4em; }
.help-section { width: 45%; min-width: 35em; float: left; }
.help-section h3 { font-size: 1.2em; }
.help-section dl { width: 100%; float: left; clear: right; margin: 0; padding: 0; cursor: normal; }
.help-section dt { display: table-cell; clear: left; float: left; width: 35%; margin: 0; padding: 0.2em; text-align: right; text-overflow: ellipsis; vertical-align: text-bottom; font-weight: bold: }
.help-section dt { display: table-cell; clear: left; float: left; width: 35%; margin: 0; padding: 0.2em; text-align: right; text-overflow: ellipsis; vertical-align: text-bottom; font-weight: bold; }
.help-section dd { display: table-cell; clear: right; float: left; margin: 0; padding: 0.2em; white-space: nowrap; vertical-align: text-bottom; }
/* Settings */
.contacts-settings dl { width: 100%; }
.addressbooks-settings table { width: 100%; }
.addressbooks-settings .actions { width: 100%; white-space: nowrap; }
.addressbooks-settings .actions * { float: left; }
.addressbooks-settings .actions input.name { width: 5em; }
.addressbooks-settings .actions input.name { width: 7em; }
.addressbooks-settings a.action { opacity: 0.2; }
.addressbooks-settings a.action { opacity: 0.5; }
.addressbooks-settings a.action:hover { opacity: 1; }
.addressbooks-settings td.active, .addressbooks-settings td.action { width: 20px; }
#contacts-settings .settings {
width: 20px; height: 20px;
float: left;
background-image:url('%webroot%/core/img/actions/settings.svg');
}
#contacts-settings.open {
height: auto;
}
#contacts-settings {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
background: none repeat scroll 0 0 #EEEEEE;
border-right: 1px solid #CCCCCC;
border-top: 1px solid #CCCCCC;
bottom: 0;
height: 2.8em;
margin: 0;
overflow: visible;
padding: 0;
position: fixed;
width: 20em;
z-index: 2;
}
#contacts-settings li,#contacts-settings li:hover { background-color: transparent; white-space: nowrap; }
#contacts-settings a.action { width: 20px; height: 20px; }
#contacts-settings .actions { float: right; }
.multiselectoptions label { display: block; }
/* Single elements */
#file_upload_target, #import_upload_target, #crop_target { display:none; }
#import_fileupload {
height: 2.29em;
/*width: 2.5em;*/
width: 95%;
margin-top: -2.5em;
display:block;
clear: right;
cursor: pointer;
z-index: 1001;
}
.import-upload-button {
background-image: url("%webroot%/core/img/actions/upload.svg");
background-position: center center;
background-repeat: no-repeat;
cursor: pointer;
height: 2.29em;
width: 2.5em;
z-index: 100;
margin: 0;
cursor: pointer;
}
.doImport{ margin: auto; }
#toggle_all { position: absolute; bottom: .5em; left: .8em; }
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;
position: relative;
float: left;
width: 170px; height: 200px;
margin: 5px;
}
#photowrapper .favorite {
display: inline-block;
float: right;
position: absolute;
right: -6px; top: -6px;
width: 25px; height: 25px;
}
#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; 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; }
.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 {
position: fixed;
-webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box;
padding: 0; margin:0;
top:3.5em; left: 32.5em; right: 0; height: 4em;
border-bottom: 1px solid #DDDDDD; z-index: 50;
}
#contactsheader div.actions {
-webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box;
padding: 0 .5em 0 4em; margin: 0 auto;
height: 100%; width: 100%;
}
#contactsheader button, #contactsheader select { position: relative; float: left; min-width: 26px; height: 26px; margin: .7em; padding: .2em; clear: none; }
#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; }
/* Right content layout */
#rightcontent, .rightcontent { position:fixed; top: 7.5em; left: 32.5em; overflow-x:hidden; overflow-y: auto; }
/* Contact layout */
#contact > ul > li { white-space: nowrap; }
#contact > ul.propertylist {
font-size: 10px;
/*display: table;
border-spacing: 1em;
border: thin solid black;*/
}
#contact > ul.propertylist > li {
display: inline-block;
padding: 1em;
/*display: table-cell;*/
}
.display .meta { text-align: right; margin-left: -30px; }
.display .adr { cursor: pointer; margin-left: 30px; }
.adr.editor {
width: 20em;
margin-left: 120px;
}
.adr.editor ul {
-moz-column-count: 1;
-webkit-columns: 1;
-o-columns: 1;
columns: 1;
}
.adr.editor input.value { border: none; }
.adr.editor input.value:hover { border: none; }
.adr.editor input.value.street, ul.adr.edit input.value.country, ul.adr.edit input.value.region { width: 19em;}
.adr.editor input.value.zip { width: 5em; }
.adr.editor input.value.city { width: 10em; }
.note { margin-left: 120px; }
#rightcontent footer { padding: 1em; width: 100%; -moz-box-sizing: border-box; box-sizing: border-box; clear: both; }
#rightcontent footer > { display: inline-block; }
/* contact list */
#contactlist { position: relative; top: 0; left: 0; right: 0; width: 100%; }
#contactlist tr { height: 3em; display: none; }
#contactlist tr.active, #contactlist tr:hover { background-color: #eee; }
#contactlist tr > td { border-bottom: 1px solid #DDDDDD; font-weight: normal; text-align: left; overflow: hidden; text-overflow: ellipsis; vertical-align: middle; white-space: nowrap; }
#contactlist tr > td:hover { overflow: inherit; text-overflow: inherit; background-color: #fff; z-index: 200; }
#contactlist tr > td:not(.adr) { width: 15%; }
#contactlist tr > td.name>input[type=checkbox]:first-child { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0; float:left; margin:.5em 0 0 1.2em; -webkit-transition:opacity 200ms; -moz-transition:opacity 200ms; -o-transition:opacity 200ms; transition:opacity 200ms; }
#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: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-image: #ddd; opacity: .50;filter:Alpha(Opacity=50); }
#contact {
background-color: white; color: #333333;
border-radius: 3px; box-shadow: 0 0 10px #888888;
padding: 10px;
position: fixed !important;
z-index: 200;
top: 8em; left: 35em;
width: 490px;
}
#contact .arrow {
border-bottom: 20px solid white;
border-left: 20px solid transparent;
border-right: 20px solid transparent;
display: block;
height: 0;
position: absolute;
left: -28px; top: 2em;
width: 0;
z-index: 201;
-webkit-transform: rotate(270deg); -moz-transform: rotate(270deg); -o-transform: rotate(270deg);
-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-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 {
font-weight: bold;
float: left;
width: 20em;
padding-top: .5em;
overflow: hidden; text-overflow: ellipsis; text-align: bottom; white-space: nowrap;
}
#contact span.adr:hover { /*overflow: inherit;*/ white-space: pre-wrap; }
#contact > ul.propertylist {
-webkit-transition: all 0.5s ease-in-out;
-moz-transition: all 0.5s ease-in-out;
-o-transition: all 0.5s ease-in-out;
-ms-transition: all 0.5s ease-out;
transition: all 0.5s ease-in-out;
}
@media screen and (min-width: 1400px) {
#contact > ul.propertylist {
-moz-column-count: 3;
-webkit-columns: 3;
-o-columns: 3;
columns: 3;
}
}
@media screen and (min-width: 800px) and (max-width: 1400px) {
#singlevalues { max-width: 50%; }
#contact > ul.propertylist {
-moz-column-count: 2;
-webkit-columns: 2;
-o-columns: 2;
columns: 2;
}
}
@media screen and (max-width: 400px) {
#contact > ul.propertylist {
-moz-column-count: 1;
-webkit-columns: 1;
-o-columns: 1;
columns: 1;
}
}
@media screen and (max-width: 1500px) {
#contactlist tr td.categories { display: none; }
}
@media screen and (max-width: 1400px) {
#contactlist tr td.adr { display: none; }
}
@media screen and (max-width: 1200px) {
#contactlist tr td.tel { display: none; }
}
@media screen and (max-width: 900px) {
#contactlist tr td.email { display: none; }
}

78
css/multiselect.css Normal file
View File

@ -0,0 +1,78 @@
/* Copyright (c) 2011, Jan-Christoph Borchardt, http://jancborchardt.net
This file is licensed under the Affero General Public License version 3 or later.
See the COPYING-README file. */
ul.multiselectoptions {
background-color:#fff;
border:1px solid #ddd;
border-top:none;
box-shadow:0 1px 1px #ddd;
padding-top:.5em;
position:absolute;
max-height: 20em;
overflow-y: auto;
z-index:49;
}
ul.multiselectoptions.down {
border-bottom-left-radius:.5em;
border-bottom-right-radius:.5em;
}
ul.multiselectoptions.up {
border-top-left-radius:.5em;
border-top-right-radius:.5em;
}
ul.multiselectoptions>li {
overflow:hidden;
white-space:nowrap;
}
div.multiselect {
display:inline-block;
max-width:400px;
min-width:100px;
padding-right:.6em;
position:relative;
vertical-align:bottom;
}
div.multiselect.active {
background-color:#fff;
position:relative;
z-index:50;
}
div.multiselect.up {
border-top:0 none;
border-top-left-radius:0;
border-top-right-radius:0;
}
div.multiselect.down {
border-bottom:none;
border-bottom-left-radius:0;
border-bottom-right-radius:0;
}
div.multiselect>span:first-child {
float:left;
margin-right:2em;
overflow:hidden;
text-overflow:ellipsis;
width:90%;
}
div.multiselect>span:last-child {
position:absolute;
right:.8em;
}
ul.multiselectoptions input.new {
border-top-left-radius:0;
border-top-right-radius:0;
padding-bottom:.2em;
padding-top:.2em;
margin:0;
}

View File

@ -11,10 +11,22 @@ 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(isset($bookid)) {
$addressbook = OC_Contacts_App::getAddressbook($bookid);
//$cardobjects = OC_Contacts_VCard::all($bookid);
if(!is_null($bookid)) {
try {
$addressbook = OCA\Contacts\Addressbook::find($bookid);
} catch(Exception $e) {
OCP\JSON::error(
array(
'data' => array(
'message' => $e->getMessage(),
)
)
);
exit();
}
header('Content-Type: text/directory');
header('Content-Disposition: inline; filename='
. str_replace(' ', '_', $addressbook['displayname']) . '.vcf');
@ -23,16 +35,42 @@ if(isset($bookid)) {
$batchsize = OCP\Config::getUserValue(OCP\User::getUser(),
'contacts',
'export_batch_size', 20);
while($cardobjects = OC_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;
}
$start += $batchsize;
}
}elseif(isset($contactid)) {
$data = OC_Contacts_App::getContactObject($contactid);
} elseif(!is_null($contactid)) {
try {
$data = OCA\Contacts\VCard::find($contactid);
} catch(Exception $e) {
OCP\JSON::error(
array(
'data' => array(
'message' => $e->getMessage(),
)
)
);
exit();
}
header('Content-Type: text/vcard');
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;
}
}
}

BIN
img/active_star.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 527 B

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

BIN
img/checkmark-gray.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 742 B

110
img/checkmark-gray.svg Normal file
View File

@ -0,0 +1,110 @@
<?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="300"
height="300"
id="svg2"
sodipodi:version="0.32"
inkscape:version="0.48.3.1 r9886"
inkscape:export-filename="/home/tol/owncloud/apps/contacts/img/checkmark-green.png"
inkscape:export-xdpi="6"
inkscape:export-ydpi="6"
sodipodi:docname="checkmark.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
version="1.0"
sodipodi:modified="true">
<defs
id="defs4">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 180.81233 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="417.20389 : 180.81233 : 1"
inkscape:persp3d-origin="208.60194 : 120.54155 : 1"
id="perspective2441" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
gridtolerance="10000"
guidetolerance="10"
objecttolerance="10"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.7"
inkscape:cx="406.63391"
inkscape:cy="114.40134"
inkscape:document-units="px"
inkscape:current-layer="layer1"
inkscape:window-width="1024"
inkscape:window-height="712"
inkscape:window-x="100"
inkscape:window-y="100"
showgrid="false"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-maximized="0">
<sodipodi:guide
orientation="0,1"
position="348.57143,57.142857"
id="guide3213" />
<sodipodi:guide
orientation="1,0"
position="302.85714,57.142857"
id="guide3215" />
</sodipodi:namedview>
<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" />
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/" />
<dc:title></dc:title>
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/3.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-101.54091,-225.22029)">
<path
style="fill:#6c5353;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="M 404.39805,284.11817 C 368.06032,253.38444 350.86772,226.50504 350.86772,226.50504 283.76197,275.28106 212.49623,448.47251 212.49623,448.47251 179.09795,390.4747 145.5172,374.29794 145.5172,374.29794 c -15.09673,24.88467 -41.11915,58.04874 -41.11915,58.04874 60.69423,20.16404 111.63866,94.15836 111.63866,94.15836 C 326.16622,313.22083 404.39805,284.11817 404.39805,284.11817 z"
id="path5075"
sodipodi:nodetypes="ccccccc"
inkscape:export-filename="C:\Documents and Settings\Staff\Desktop\photos\SVG\path2161.png"
inkscape:export-xdpi="72.839996"
inkscape:export-ydpi="72.839996"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

BIN
img/checkmark-green.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 618 B

109
img/checkmark-green.svg Normal file
View File

@ -0,0 +1,109 @@
<?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="300"
height="300"
id="svg2"
sodipodi:version="0.32"
inkscape:version="0.48.3.1 r9886"
inkscape:export-filename="C:\Documents and Settings\Staff\Desktop\checkmark.png"
inkscape:export-xdpi="72.839996"
inkscape:export-ydpi="72.839996"
sodipodi:docname="checkmark.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
version="1.0"
sodipodi:modified="true">
<defs
id="defs4">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 180.81233 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="417.20389 : 180.81233 : 1"
inkscape:persp3d-origin="208.60194 : 120.54155 : 1"
id="perspective2441" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
gridtolerance="10000"
guidetolerance="10"
objecttolerance="10"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.7"
inkscape:cx="165.91962"
inkscape:cy="114.40134"
inkscape:document-units="px"
inkscape:current-layer="layer1"
inkscape:window-width="1024"
inkscape:window-height="712"
inkscape:window-x="100"
inkscape:window-y="100"
showgrid="false"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-maximized="0">
<sodipodi:guide
orientation="0,1"
position="348.57143,57.142857"
id="guide3213" />
<sodipodi:guide
orientation="1,0"
position="302.85714,57.142857"
id="guide3215" />
</sodipodi:namedview>
<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" />
<cc:license
rdf:resource="http://creativecommons.org/licenses/by-sa/3.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/licenses/by-sa/3.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Notice" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#Attribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
<cc:requires
rdf:resource="http://creativecommons.org/ns#ShareAlike" />
</cc:License>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-101.54091,-225.22029)">
<path
style="fill:#1e6f1e;fill-opacity:1;fill-rule:evenodd;stroke:none"
d="M 404.39805,284.11817 C 368.06032,253.38444 350.86772,226.50504 350.86772,226.50504 283.76197,275.28106 212.49623,448.47251 212.49623,448.47251 179.09795,390.4747 145.5172,374.29794 145.5172,374.29794 c -15.09673,24.88467 -41.11915,58.04874 -41.11915,58.04874 60.69423,20.16404 111.63866,94.15836 111.63866,94.15836 C 326.16622,313.22083 404.39805,284.11817 404.39805,284.11817 z"
id="path5075"
sodipodi:nodetypes="ccccccc"
inkscape:export-filename="C:\Documents and Settings\Staff\Desktop\photos\SVG\path2161.png"
inkscape:export-xdpi="72.839996"
inkscape:export-ydpi="72.839996"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

BIN
img/checkmark.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 280 B

BIN
img/inactive_star.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 583 B

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

BIN
img/starred.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 727 B

78
img/starred.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="300"
height="300"
id="svg2"
version="1.1"
inkscape:version="0.48.3.1 r9886"
sodipodi:docname="starred.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="53.205915"
inkscape:cy="122.67739"
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,-752.3843)">
<path
sodipodi:type="star"
style="fill:#ffcc00;fill-opacity:1;stroke:#000000;stroke-width:5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:0;stroke-opacity:0.56578944;stroke-dasharray:none"
id="path2987"
sodipodi:sides="5"
sodipodi:cx="330"
sodipodi:cy="1027.7194"
sodipodi:r1="169.28609"
sodipodi:r2="75.090073"
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-y="-15.471227"
transform="matrix(0.91668358,0,0,0.96331605,-4.7129291,-71.75982)"
inkscape:transform-center-x="-0.1011681" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -39,7 +39,7 @@ if(!$file) {
exit();
}
if(isset($_POST['method']) && $_POST['method'] == 'new') {
$id = OC_Contacts_Addressbook::add(OCP\USER::getUser(),
$id = OCA\Contacts\Addressbook::add(OCP\USER::getUser(),
$_POST['addressbookname']);
if(!$id) {
OCP\JSON::error(
@ -49,7 +49,7 @@ if(isset($_POST['method']) && $_POST['method'] == 'new') {
);
exit();
}
OC_Contacts_Addressbook::setActive($id, 1);
OCA\Contacts\Addressbook::setActive($id, 1);
}else{
$id = $_POST['id'];
if(!$id) {
@ -63,7 +63,19 @@ if(isset($_POST['method']) && $_POST['method'] == 'new') {
);
exit();
}
OC_Contacts_App::getAddressbook($id); // is owner access check
try {
OCA\Contacts\Addressbook::find($id); // is owner access check
} catch(Exception $e) {
OCP\JSON::error(
array(
'data' => array(
'message' => $e->getMessage(),
'file'=>$_POST['file']
)
)
);
exit();
}
}
//analyse the contacts file
writeProgress('40');
@ -110,20 +122,21 @@ if(!count($parts) > 0) {
exit();
}
foreach($parts as $part) {
$card = OC_VObject::parse($part);
if (!$card) {
try {
$vcard = Sabre\VObject\Reader::read($part);
} catch (Exception $e) {
$failed += 1;
OCP\Util::writeLog('contacts',
'Import: skipping card. Error parsing VCard: ' . $part,
'Import: skipping card. Error parsing VCard: ' . $e->getMessage(),
OCP\Util::ERROR);
continue; // Ditch cards that can't be parsed by Sabre.
}
try {
OC_Contacts_VCard::add($id, $card);
OCA\Contacts\VCard::add($id, $vcard);
$imported += 1;
} catch (Exception $e) {
OCP\Util::writeLog('contacts',
'Error importing vcard: ' . $e->getMessage() . $nl . $card,
'Error importing vcard: ' . $e->getMessage() . $nl . $vcard,
OCP\Util::ERROR);
$failed += 1;
}

View File

@ -13,8 +13,8 @@ OCP\User::checkLoggedIn();
OCP\App::checkAppEnabled('contacts');
// Get active address books. This creates a default one if none exists.
$ids = OC_Contacts_Addressbook::activeIds(OCP\USER::getUser());
$has_contacts = (count(OC_Contacts_VCard::all($ids, 0, 1)) > 0
$ids = OCA\Contacts\Addressbook::activeIds(OCP\USER::getUser());
$has_contacts = (count(OCA\Contacts\VCard::all($ids, 0, 1)) > 0
? true
: false); // just to check if there are any contacts.
if($has_contacts === false) {
@ -28,15 +28,16 @@ OCP\App::setActiveNavigationEntry('contacts_index');
// Load a specific user?
$id = isset( $_GET['id'] ) ? $_GET['id'] : null;
$impp_types = OC_Contacts_App::getTypesOfProperty('IMPP');
$phone_types = OC_Contacts_App::getTypesOfProperty('TEL');
$email_types = OC_Contacts_App::getTypesOfProperty('EMAIL');
$ims = OC_Contacts_App::getIMOptions();
$impp_types = OCA\Contacts\App::getTypesOfProperty('IMPP');
$adr_types = OCA\Contacts\App::getTypesOfProperty('ADR');
$phone_types = OCA\Contacts\App::getTypesOfProperty('TEL');
$email_types = OCA\Contacts\App::getTypesOfProperty('EMAIL');
$ims = OCA\Contacts\App::getIMOptions();
$im_protocols = array();
foreach($ims as $name => $values) {
$im_protocols[$name] = $values['displayname'];
}
$categories = OC_Contacts_App::getCategories();
$categories = OCA\Contacts\App::getCategories();
$upload_max_filesize = OCP\Util::computerFileSize(ini_get('upload_max_filesize'));
$post_max_size = OCP\Util::computerFileSize(ini_get('post_max_size'));
@ -46,29 +47,35 @@ $freeSpace=OC_Filesystem::free_space('/');
$freeSpace=max($freeSpace, 0);
$maxUploadFilesize = min($maxUploadFilesize, $freeSpace);
OCP\Util::addscript('', 'jquery.multiselect');
OCP\Util::addscript('contacts', 'multiselect');
OCP\Util::addscript('', 'oc-vcategories');
OCP\Util::addscript('contacts', 'app');
OCP\Util::addscript('contacts', 'contacts');
OCP\Util::addscript('contacts', 'modernizr');
OCP\Util::addscript('contacts', 'placeholder.polyfill.jquery');
OCP\Util::addscript('contacts', 'expanding');
OCP\Util::addscript('contacts', 'jquery.combobox');
OCP\Util::addscript('files', 'jquery.fileupload');
OCP\Util::addscript('core', 'jquery.inview');
//OCP\Util::addscript('core', 'jquery.inview');
OCP\Util::addscript('contacts', 'jquery.Jcrop');
OCP\Util::addscript('contacts', 'jquery.multi-autocomplete');
OCP\Util::addStyle('', 'jquery.multiselect');
OCP\Util::addStyle('contacts', 'multiselect');
OCP\Util::addStyle('contacts', 'jquery.combobox');
OCP\Util::addStyle('contacts', 'jquery.Jcrop');
OCP\Util::addStyle('contacts', 'contacts');
$tmpl = new OCP\Template( "contacts", "index", "user" );
$tmpl = new OCP\Template( "contacts", "contacts", "user" );
$tmpl->assign('uploadMaxFilesize', $maxUploadFilesize, false);
$tmpl->assign('uploadMaxHumanFilesize',
OCP\Util::humanFileSize($maxUploadFilesize), false);
$tmpl->assign('addressbooks', OCA\Contacts\Addressbook::all(OCP\USER::getUser()), false);
$tmpl->assign('phone_types', $phone_types, false);
$tmpl->assign('email_types', $email_types, false);
$tmpl->assign('adr_types', $adr_types, false);
$tmpl->assign('impp_types', $impp_types, false);
$tmpl->assign('categories', $categories, false);
$tmpl->assign('im_protocols', $im_protocols, false);
$tmpl->assign('has_contacts', $has_contacts, false);
$tmpl->assign('id', $id);
$tmpl->printPage();
$tmpl->assign('is_indexed', OCP\Config::getUserValue(OCP\User::getUser(), 'contacts', 'contacts_indexed', 'no'));
$tmpl->printPage();

2177
js/app.js Normal file
View File

@ -0,0 +1,2177 @@
var utils = {};
/**
* utils.isArray
*
* Best guess if object is an array.
*/
utils.isArray = function(obj) {
// do an instanceof check first
if (obj instanceof Array) {
return true;
}
// then check for obvious falses
if (typeof obj !== 'object') {
return false;
}
if (utils.type(obj) === 'array') {
return true;
}
return false;
};
utils.isInt = function(s) {
return typeof s === 'number' && (s.toString().search(/^-?[0-9]+$/) === 0);
}
utils.isUInt = function(s) {
return typeof s === 'number' && (s.toString().search(/^[0-9]+$/) === 0);
}
/**
* utils.type
*
* Attempt to ascertain actual object type.
*/
utils.type = function(obj) {
if (obj === null || typeof obj === 'undefined') {
return String (obj);
}
return Object.prototype.toString.call(obj)
.replace(/\[object ([a-zA-Z]+)\]/, '$1').toLowerCase();
};
utils.moveCursorToEnd = function(el) {
if (typeof el.selectionStart === 'number') {
el.selectionStart = el.selectionEnd = el.value.length;
} else if (typeof el.createTextRange !== 'undefined') {
el.focus();
var range = el.createTextRange();
range.collapse(false);
range.select();
}
}
if (typeof Object.create !== 'function') {
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
}
Array.prototype.clone = function() {
return this.slice(0);
};
Array.prototype.clean = function(deleteValue) {
var arr = this.clone();
for (var i = 0; i < arr.length; i++) {
if (arr[i] == deleteValue) {
arr.splice(i, 1);
i--;
}
}
return arr;
};
// Keep it DRY ;)
var wrongKey = function(event) {
return (event.type === 'keydown' && (event.keyCode !== 32 && event.keyCode !== 13));
}
/**
* Simply notifier
* Arguments:
* @param message The text message to show.
* @param timeout The timeout in seconds before the notification disappears. Default 10.
* @param timeouthandler A function to run on timeout.
* @param clickhandler A function to run on click. If a timeouthandler is given it will be cancelled on click.
* @param data An object that will be passed as argument to the timeouthandler and clickhandler functions.
* @param cancel If set cancel all ongoing timer events and hide the notification.
*/
OC.notify = function(params) {
var self = this;
if(!self.notifier) {
self.notifier = $('#notification');
if(!self.notifier.length) {
$('#content').prepend('<div id="notification" />');
self.notifier = $('#notification');
}
}
if(params.cancel) {
self.notifier.off('click');
for(var id in self.notifier.data()) {
if($.isNumeric(id)) {
clearTimeout(parseInt(id));
}
}
self.notifier.text('').fadeOut().removeData();
return;
}
self.notifier.text(params.message);
self.notifier.fadeIn();
self.notifier.on('click', function() { $(this).fadeOut();});
var timer = setTimeout(function() {
/*if(!self || !self.notifier) {
var self = OC.Contacts;
self.notifier = $('#notification');
}*/
self.notifier.fadeOut();
if(params.timeouthandler && $.isFunction(params.timeouthandler)) {
params.timeouthandler(self.notifier.data(dataid));
self.notifier.off('click');
self.notifier.removeData(dataid);
}
}, params.timeout && $.isNumeric(params.timeout) ? parseInt(params.timeout)*1000 : 10000);
var dataid = timer.toString();
if(params.data) {
self.notifier.data(dataid, params.data);
}
if(params.clickhandler && $.isFunction(params.clickhandler)) {
self.notifier.on('click', function() {
/*if(!self || !self.notifier) {
var self = OC.Contacts;
self.notifier = $(this);
}*/
clearTimeout(timer);
self.notifier.off('click');
params.clickhandler(self.notifier.data(dataid));
self.notifier.removeData(dataid);
});
}
}
var GroupList = function(groupList, listItemTmpl) {
this.$groupList = groupList;
var self = this;
var numtypes = ['category', 'fav', 'all'];
this.$groupList.on('click', 'h3', function(event) {
$('.tipsy').remove();
if(wrongKey(event)) {
return;
}
console.log($(event.target));
if($(event.target).is('.action.delete')) {
var id = $(event.target).parents('h3').first().data('id');
self.deleteGroup(id, function(response) {
if(response.status !== 'success') {
OC.notify({message:response.data.message});
}
})
} else {
self.selectGroup({element:$(this)});
}
});
this.$groupListItemTemplate = listItemTmpl;
this.categories = [];
}
GroupList.prototype.nameById = function(id) {
return this.findById(id).contents().filter(function(){ return(this.nodeType == 3); }).text().trim()
}
GroupList.prototype.findById = function(id) {
return this.$groupList.find('h3[data-id="' + id + '"]');
}
GroupList.prototype.isFavorite = function(contactid) {
return this.inGroup(contactid, 'fav');
}
GroupList.prototype.selectGroup = function(params) {
var id, $elem;
if(typeof params.id !== 'undefined') {
id = params.id;
$elem = this.findById(id);
} else if(typeof params.element !== 'undefined') {
id = params.element.data('id');
$elem = params.element;
}
if(!$elem) {
self.selectGroup('all');
return;
}
console.log('selectGroup', id, $elem);
this.$groupList.find('h3').removeClass('active');
$elem.addClass('active');
if(id === 'new') {
return;
}
this.lastgroup = id;
$(document).trigger('status.group.selected', {
id: this.lastgroup,
type: $elem.data('type'),
contacts: $elem.data('contacts'),
});
}
GroupList.prototype.inGroup = function(contactid, groupid) {
var $groupelem = this.findById(groupid);
var contacts = $groupelem.data('contacts');
return (contacts.indexOf(contactid) !== -1);
}
GroupList.prototype.setAsFavorite = function(contactid, state, cb) {
contactid = parseInt(contactid);
var $groupelem = this.findById('fav');
var contacts = $groupelem.data('contacts');
if(state) {
OCCategories.addToFavorites(contactid, 'contact', function(jsondata) {
if(jsondata.status === 'success') {
contacts.push(contactid);
$groupelem.data('contacts', contacts);
$groupelem.find('.numcontacts').text(contacts.length);
if(contacts.length > 0 && $groupelem.is(':hidden')) {
$groupelem.show();
}
}
if(typeof cb === 'function') {
cb(jsondata);
} else if(jsondata.status !== 'success') {
OC.notify({message:t('contacts', jsondata.data.message)});
}
});
} else {
OCCategories.removeFromFavorites(contactid, 'contact', function(jsondata) {
if(jsondata.status === 'success') {
contacts.splice(contacts.indexOf(contactid), 1);
//console.log('contacts', contacts, contacts.indexOf(id), contacts.indexOf(String(id)));
$groupelem.data('contacts', contacts);
$groupelem.find('.numcontacts').text(contacts.length);
if(contacts.length === 0 && $groupelem.is(':visible')) {
$groupelem.hide();
}
}
if(typeof cb === 'function') {
cb(jsondata);
} else if(jsondata.status !== 'success') {
OC.notify({message:t('contacts', jsondata.data.message)});
}
});
}
}
/**
* Add one or more contact ids to a group
* @param contactid An integer id or an array of integer ids.
* @param groupid The integer id of the group
* @param cb Optional call-back function
*/
GroupList.prototype.addTo = function(contactid, groupid, cb) {
console.log('GroupList.addTo', contactid, groupid);
var $groupelem = this.findById(groupid);
var contacts = $groupelem.data('contacts');
var ids = [];
if(!contacts) {
console.log('Contacts not found, adding list!!!');
contacts = [];
}
var self = this;
var doPost = false;
if(typeof contactid === 'number') {
if(contacts.indexOf(contactid) === -1) {
ids.push(contactid);
doPost = true;
} else {
if(typeof cb == 'function') {
cb({status:'error', message:t('contacts', 'Contact is already in this group.')});
}
}
} else if(utils.isArray(contactid)) {
$.each(contactid, function(i, id) {
if(contacts.indexOf(id) === -1) {
ids.push(id);
}
});
if(ids.length > 0) {
doPost = true;
} else {
if(typeof cb == 'function') {
cb({status:'error', message:t('contacts', 'Contacts are already in this group.')});
}
}
}
if(doPost) {
$.post(OC.filePath('contacts', 'ajax', 'categories/addto.php'), {contactids: ids, categoryid: groupid},function(jsondata) {
if(!jsondata) {
if(typeof cb === 'function') {
cb({status:'error', message:'Network or server error. Please inform administrator.'});
}
return;
}
if(jsondata.status === 'success') {
contacts = contacts.concat(ids).sort();
$groupelem.data('contacts', contacts);
var $numelem = $groupelem.find('.numcontacts');
$numelem.text(contacts.length).switchClass('', 'active', 200);
setTimeout(function() {
$numelem.switchClass('active', '', 1000);
}, 2000);
if(typeof cb === 'function') {
cb({status:'success', ids:ids});
} else {
$(document).trigger('status.group.contactadded', {
contactid: contactid,
groupid: groupid,
groupname: self.nameById(groupid),
});
}
} else {
if(typeof cb == 'function') {
cb({status:'error', message:jsondata.data.message});
}
}
});
}
}
GroupList.prototype.removeFrom = function(contactid, groupid, cb) {
console.log('GroupList.removeFrom', contactid, groupid);
var $groupelem = this.findById(groupid);
var contacts = $groupelem.data('contacts');
var ids = [];
// If it's the 'all' group simply decrement the number
if(groupid === 'all') {
var $numelem = $groupelem.find('.numcontacts');
$numelem.text(parseInt($numelem.text()-1)).switchClass('', 'active', 200);
setTimeout(function() {
$numelem.switchClass('active', '', 1000);
}, 2000);
if(typeof cb === 'function') {
cb({status:'success', ids:[id]});
}
}
// If the contact is in the category remove it from internal list.
if(!contacts) {
if(typeof cb === 'function') {
cb({status:'error', message:t('contacts', 'Couldn\'t get contact list.')});
}
return;
}
var doPost = false;
if(typeof contactid === 'number') {
if(contacts.indexOf(contactid) !== -1) {
ids.push(contactid);
doPost = true;
} else {
if(typeof cb == 'function') {
cb({status:'error', message:t('contacts', 'Contact is not in this group.')});
}
}
} else if(utils.isArray(contactid)) {
$.each(contactid, function(i, id) {
if(contacts.indexOf(id) !== -1) {
ids.push(id);
}
});
if(ids.length > 0) {
doPost = true;
} else {
console.log(contactid, 'not in', contacts);
if(typeof cb == 'function') {
cb({status:'error', message:t('contacts', 'Contacts are not in this group.')});
}
}
}
if(doPost) {
$.post(OC.filePath('contacts', 'ajax', 'categories/removefrom.php'), {contactids: ids, categoryid: groupid},function(jsondata) {
if(!jsondata) {
if(typeof cb === 'function') {
cb({status:'error', message:'Network or server error. Please inform administrator.'});
}
return;
}
if(jsondata.status === 'success') {
$.each(ids, function(idx, id) {
contacts.splice(contacts.indexOf(id), 1);
});
//console.log('contacts', contacts, contacts.indexOf(id), contacts.indexOf(String(id)));
$groupelem.data('contacts', contacts);
var $numelem = $groupelem.find('.numcontacts');
$numelem.text(contacts.length).switchClass('', 'active', 200);
setTimeout(function() {
$numelem.switchClass('active', '', 1000);
}, 2000);
if(typeof cb === 'function') {
cb({status:'success', ids:ids});
}
} else {
if(typeof cb == 'function') {
cb({status:'error', message:jsondata.data.message});
}
}
});
}
}
GroupList.prototype.removeFromAll = function(contactid, alsospecial) {
var self = this;
var selector = alsospecial ? 'h3' : 'h3[data-type="category"]';
$.each(this.$groupList.find(selector), function(i, group) {
self.removeFrom(contactid, $(this).data('id'));
});
}
GroupList.prototype.categoriesChanged = function(newcategories) {
console.log('GroupList.categoriesChanged, I should do something');
}
GroupList.prototype.contactDropped = function(event, ui) {
var dragitem = ui.draggable, droptarget = $(this);
console.log('dropped', dragitem);
if(dragitem.is('tr')) {
console.log('tr dropped', dragitem.data('id'), 'on', $(this).data('id'));
if($(this).data('type') === 'fav') {
$(this).data('obj').setAsFavorite(dragitem.data('id'), true);
} else {
$(this).data('obj').addTo(dragitem.data('id'), $(this).data('id'));
}
}
}
GroupList.prototype.deleteGroup = function(groupid, cb) {
var $elem = this.findById(groupid);
var $newelem = $elem.prev('h3');
var name = this.nameById(groupid);
var contacts = $elem.data('contacts');
var self = this;
console.log('delete group', groupid, contacts);
$.post(OC.filePath('contacts', 'ajax', 'categories/delete.php'), {categories: name}, function(jsondata) {
if (jsondata && jsondata.status == 'success') {
$(document).trigger('status.group.groupremoved', {
groupid: groupid,
newgroupid: parseInt($newelem.data('id')),
groupname: self.nameById(groupid),
contacts: contacts,
});
$elem.remove();
self.selectGroup({element:$newelem});
} else {
//
}
if(typeof cb === 'function') {
cb(jsondata);
}
});
}
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());
var name = $input.val().trim();
if(name.length === 0) {
return false;
}
$input.prop('disabled', true);
$elem.data('name', '');
self.addGroup({name:name, element:$elem}, function(response) {
if(response.status === 'success') {
$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});
}
});
}
if(typeof id === 'undefined') {
// Add new group
var tmpl = this.$groupListItemTemplate;
self.$editelem = (tmpl).octemplate({
id: 'new',
type: 'category',
num: 0,
name: '',
});
var $input = $('<input type="text" class="active" /><a class="action checked disabled" />');
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');
} else {
$(this).next('.checked').addClass('disabled');
}
});
$input.on('keyup', function(event) {
var keyCode = Math.max(event.keyCode, event.which);
if(keyCode === 13) {
saveChanges(self.$editelem, $(this));
} else if(keyCode === 27) {
self.$editelem.remove();
self.$editelem = null;
}
});
$input.next('.checked').on('click keydown', function(event) {
console.log('clicked', event);
if(wrongKey(event)) {
return;
}
saveChanges(self.$editelem, $input);
});
$input.focus();
} else if(utils.isUInt(id)) {
var $elem = this.findById(id);
var $text = $elem.contents().filter(function(){ return(this.nodeType == 3); });
var name = $text.text();
console.log('Group name', $text, name);
$text.remove();
var $input = $('<input type="text" class="active" value="' + name + '" /><a class="action checked disabled />');
$elem.prepend($input).addClass('editing');
$input.focus();
} else {
throw { name: 'WrongParameterType', message: 'GroupList.editGroup only accept integers.'}
}
}
GroupList.prototype.addGroup = function(params, cb) {
console.log('GroupList.addGroup', params.name);
var name = params.name;
contacts = []; // $.map(contacts, function(c) {return parseInt(c)});
var self = this, exists = false;
self.$groupList.find('h3[data-type="category"]').each(function() {
if ($(this).data('name').toLowerCase() === name.toLowerCase()) {
exists = true;
return false; //break out of loop
}
});
if(exists) {
if(typeof cb === 'function') {
cb({status:'error', message:t('contacts', 'A group named {group} already exists', {group: name})});
}
return;
}
$.post(OC.filePath('contacts', 'ajax', 'categories/add.php'), {category: name}, function(jsondata) {
if (jsondata && jsondata.status == 'success') {
var tmpl = self.$groupListItemTemplate;
var $elem = params.element
? params.element
: (tmpl).octemplate({
id: jsondata.data.id,
type: 'category',
num: contacts.length,
name: name,
})
self.categories.push({id: jsondata.data.id, name: name});
$elem.data('obj', self);
$elem.data('contacts', contacts);
$elem.data('name', name);
$elem.data('id', jsondata.data.id);
var added = false;
self.$groupList.find('h3.group[data-type="category"]').each(function() {
if ($(this).data('name').toLowerCase().localeCompare(name.toLowerCase()) > 0) {
$(this).before($elem);
added = true;
return false;
}
});
if(!added) {
$elem.insertAfter(self.$groupList.find('h3.group[data-type="category"]').last());
}
self.selectGroup({element:$elem});
$elem.tipsy({trigger:'manual', gravity:'w', fallback: t('contacts', 'You can drag groups to\narrange them as you like.')});
$elem.tipsy('show');
if(typeof cb === 'function') {
cb({status:'success', id:parseInt(jsondata.data.id), name:name});
}
} else {
if(typeof cb === 'function') {
cb({status:'error', message:jsondata.data.message});
}
}
});
}
GroupList.prototype.loadGroups = function(numcontacts, cb) {
var self = this;
var acceptdrop = 'tr.contact';
var $groupList = this.$groupList;
var tmpl = this.$groupListItemTemplate;
tmpl.octemplate({id: 'all', type: 'all', num: numcontacts, name: t('contacts', 'All')}).appendTo($groupList);
$.getJSON(OC.filePath('contacts', 'ajax', 'categories/list.php'), {}, function(jsondata) {
if (jsondata && jsondata.status == 'success') {
self.lastgroup = jsondata.data.lastgroup;
self.sortorder = jsondata.data.sortorder.length > 0
? $.map(jsondata.data.sortorder.split(','), function(c) {return parseInt(c)})
: [];
console.log('sortorder', self.sortorder);
// Favorites
var contacts = $.map(jsondata.data.favorites, function(c) {return parseInt(c)});
var $elem = tmpl.octemplate({
id: 'fav',
type: 'fav',
num: contacts.length,
name: t('contacts', 'Favorites')
}).appendTo($groupList);
$elem.data('obj', self);
$elem.data('contacts', contacts).find('.numcontacts').before('<span class="starred action" />');
$elem.droppable({
drop: self.contactDropped,
activeClass: 'ui-state-active',
hoverClass: 'ui-state-hover',
accept: acceptdrop
});
if(contacts.length === 0) {
$elem.hide();
}
console.log('favorites', $elem.data('contacts'));
// Normal groups
$.each(jsondata.data.categories, function(c, category) {
var contacts = $.map(category.contacts, function(c) {return parseInt(c)});
var $elem = (tmpl).octemplate({
id: category.id,
type: 'category',
num: contacts.length,
name: category.name,
});
self.categories.push({id: category.id, name: category.name});
$elem.data('obj', self);
$elem.data('contacts', contacts);
$elem.data('name', category.name);
$elem.data('id', category.id);
$elem.droppable({
drop: self.contactDropped,
activeClass: 'ui-state-hover',
accept: acceptdrop
});
$elem.appendTo($groupList);
});
var elems = $groupList.find('h3[data-type="category"]').get();
elems.sort(function(a, b) {
return self.sortorder.indexOf(parseInt($(a).data('id'))) > self.sortorder.indexOf(parseInt($(b).data('id')));
});
$.each(elems, function(index, elem) {
$groupList.append(elem);
});
// Shared addressbook
$.each(jsondata.data.shared, function(c, shared) {
var sharedindicator = '<img class="shared svg" src="' + OC.imagePath('core', 'actions/shared') + '"'
+ 'title="' + t('contacts', 'Shared by {owner}', {owner:shared.userid}) + '" />'
var $elem = (tmpl).octemplate({
id: shared.id,
type: 'shared',
num: '', //jsondata.data.shared.length,
name: shared.displayname,
});
$elem.find('.numcontacts').after(sharedindicator);
$elem.data('obj', self);
$elem.data('name', shared.displayname);
$elem.data('id', shared.id);
$elem.appendTo($groupList);
});
$groupList.sortable({
items: 'h3[data-type="category"]',
stop: function() {
console.log('stop sorting', $(this));
var ids = [];
$.each($(this).children('h3[data-type="category"]'), function(i, elem) {
ids.push($(elem).data('id'))
})
self.sortorder = ids;
$(document).trigger('status.groups.sorted', {
sortorder: self.sortorder.join(','),
});
},
});
var $elem = self.findById(self.lastgroup);
$elem.addClass('active');
$(document).trigger('status.group.selected', {
id: self.lastgroup,
type: $elem.data('type'),
contacts: $elem.data('contacts'),
});
} // TODO: else
if(typeof cb === 'function') {
cb();
}
});
}
OC.Contacts = OC.Contacts || {
init:function(id) {
if(oc_debug === true) {
$(document).ajaxError(function(e, xhr, settings, exception) {
// Don't try to get translation because it's likely a network error.
OC.notify({
message: 'error in: ' + settings.url + ', '+'error: ' + xhr.responseText,
});
});
}
//if(id) {
this.currentid = parseInt(id);
console.log('init, id:', id);
//}
// Holds an array of {id,name} maps
this.scrollTimeoutMiliSecs = 100;
this.isScrolling = false;
this.cacheElements();
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;
OCCategories.app = 'contacts';
OCCategories.type = 'contact';
this.bindEvents();
this.$toggleAll.show();
this.showActions(['add']);
// Wait 2 mins then check if contacts are indexed.
setTimeout(function() {
if(!is_indexed) {
OC.notify({message:t('contacts', 'Indexing contacts'), timeout:20});
$.post(OC.filePath('contacts', 'ajax', 'indexproperties.php'));
} else {
console.log('contacts are indexed.');
}
}, 10000);
},
loading:function(obj, state) {
$(obj).toggleClass('loading', state);
},
/**
* Show/hide elements in the header
* @param act An array of actions to show based on class name e.g ['add', 'delete']
*/
hideActions:function() {
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();
}
},
showAction:function(act, show) {
this.$headeractions.find('.' + act).toggle(show);
},
cacheElements: function() {
var self = this;
this.detailTemplates = {};
// Load templates for contact details.
// The weird double loading is because jquery apparently doesn't
// create a searchable object from a script element.
$.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);
}
});
this.$groupListItemTemplate = $('#groupListItemTemplate');
this.$contactListItemTemplate = $('#contactListItemTemplate');
this.$contactFullTemplate = $('#contactFullTemplate');
this.$contactDetailsTemplate = $('#contactDetailsTemplate');
this.$rightContent = $('#rightcontent');
this.$header = $('#contactsheader');
this.$headeractions = this.$header.find('div.actions');
this.$groupList = $('#grouplist');
this.$contactList = $('#contactlist');
this.$contactListHeader = $('#contactlistheader');
this.$toggleAll = $('#toggle_all');
this.$groups = this.$headeractions.find('.groups');
this.$ninjahelp = $('#ninjahelp');
this.$firstRun = $('#firstrun');
this.$settings = $('#contacts-settings');
this.$importFileInput = $('#import_fileupload');
this.$importIntoSelect = $('#import_into');
},
// Build the select to add/remove from groups.
buildGroupSelect: function() {
// If a contact is open we know which categories it's in
if(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) {
if(contact.inGroup(category.name)) {
rmopts += '<option value="' + category.id + '">' + category.name + '</option>';
} else {
addopts += '<option value="' + category.id + '">' + category.name + '</option>';
}
});
if(addopts.length) {
$(addopts).appendTo(this.$groups)
.wrapAll('<optgroup data-action="add" label="' + t('contacts', 'Add to...') + '"/>');
}
if(rmopts.length) {
$(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
this.$groups.find('optgroup,option:not([value="-1"])').remove();
var addopts = '', rmopts = '';
$.each(this.groups.categories, function(i, category) {
rmopts += '<option value="' + category.id + '">' + category.name + '</option>';
addopts += '<option value="' + category.id + '">' + category.name + '</option>';
});
$(addopts).appendTo(this.$groups)
.wrapAll('<optgroup data-action="add" label="' + t('contacts', 'Add to...') + '"/>');
$(rmopts).appendTo(this.$groups)
.wrapAll('<optgroup data-action="remove" label="' + t('contacts', 'Remove from...') + '"/>');
} else {
// 3rd option: No contact open, none checked, just show "Add group..."
this.$groups.find('optgroup,option:not([value="-1"])').remove();
}
$('<option value="add">' + t('contacts', 'Add group...') + '</option>').appendTo(this.$groups);
this.$groups.val(-1);
},
bindEvents: function() {
var self = this;
// Should fix Opera check for delayed delete.
$(window).unload(function (){
$(window).trigger('beforeunload');
});
// App specific events
$(document).bind('status.contact.deleted', function(e, data) {
var id = parseInt(data.id);
console.log('contact', data.id, 'deleted');
// update counts on group lists
self.groups.removeFromAll(data.id, true)
});
$(document).bind('status.contact.added', function(e, data) {
self.currentid = parseInt(data.id);
self.buildGroupSelect();
self.hideActions();
});
$(document).bind('status.contact.error', function(e, data) {
OC.notify({message:data.message});
});
$(document).bind('status.contact.enabled', function(e, enabled) {
console.log('status.contact.enabled', enabled)
/*if(enabled) {
self.showActions(['back', 'download', 'delete', 'groups']);
} else {
self.showActions(['back']);
}*/
});
$(document).bind('status.contacts.loaded', function(e, result) {
console.log('status.contacts.loaded', result);
if(result.status !== true) {
alert('Error loading contacts!');
} else {
self.numcontacts = result.numcontacts;
self.loading(self.$rightContent, false);
self.groups.loadGroups(self.numcontacts, function() {
self.loading($('#leftcontent'), false);
console.log('Groups loaded, currentid', self.currentid);
if(self.currentid) {
self.openContact(self.currentid);
}
});
}
});
$(document).bind('status.contact.currentlistitem', function(e, result) {
//console.log('status.contact.currentlistitem', result, self.$rightContent.height());
if(self.dontScroll !== true) {
if(result.pos > self.$rightContent.height()) {
self.$rightContent.scrollTop(result.pos - self.$rightContent.height() + result.height);
}
else if(result.pos < self.$rightContent.offset().top) {
self.$rightContent.scrollTop(result.pos);
}
} else {
setTimeout(function() {
self.dontScroll = false;
}, 100);
}
self.currentlistid = result.id
});
$(document).bind('status.nomorecontacts', function(e, result) {
console.log('status.nomorecontacts', result);
self.$contactList.hide();
self.$firstRun.show();
// TODO: Show a first-run page.
});
$(document).bind('status.visiblecontacts', function(e, result) {
console.log('status.visiblecontacts', result);
// TODO: To be decided.
});
// A contact id was in the request
$(document).bind('request.loadcontact', function(e, result) {
console.log('request.loadcontact', result);
if(self.numcontacts) {
self.openContact(result.id);
} else {
// Contacts are not loaded yet, try again.
console.log('waiting for contacts to load');
setTimeout(function() {
$(document).trigger('request.loadcontact', {
id: result.id,
});
}, 1000);
}
});
$(document).bind('request.contact.setasfavorite', function(e, data) {
console.log('contact', data.id, 'request.contact.setasfavorite');
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) {
var id = parseInt(data.id);
console.log('contact', data.id, 'request.contact.export');
document.location.href = OC.linkTo('contacts', 'export.php') + '?contactid=' + self.currentid;
});
$(document).bind('request.contact.close', function(e, data) {
var id = parseInt(data.id);
console.log('contact', data.id, 'request.contact.close');
self.closeContact(id);
});
$(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.$contactList.removeClass('dim');
self.showActions(['add']);
});
$(document).bind('request.select.contactphoto.fromlocal', function(e, result) {
console.log('request.select.contactphoto.fromlocal', result);
$('#contactphoto_fileupload').trigger('click');
});
$(document).bind('request.select.contactphoto.fromcloud', function(e, result) {
console.log('request.select.contactphoto.fromcloud', result);
OC.dialogs.filepicker(t('contacts', 'Select photo'), function(path) {
self.cloudPhotoSelected(self.currentid, path);
}, false, 'image', true);
});
$(document).bind('request.edit.contactphoto', function(e, result) {
console.log('request.edit.contactphoto', result);
self.editCurrentPhoto(result.id);
});
$(document).bind('request.addressbook.activate', function(e, result) {
console.log('request.addressbook.activate', result);
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.closeContact(result.contactid);
}
});
$(document).bind('status.group.groupremoved', function(e, result) {
console.log('status.group.groupremoved', result);
if(parseInt(result.groupid) === parseInt(self.currentgroup)) {
console.time('hiding');
self.contacts.showContacts([]);
console.timeEnd('hiding');
self.currentgroup = 'all';
}
$.each(result.contacts, function(idx, contactid) {
var contact = self.contacts.findById(contactid);
console.log('contactid', contactid, contact);
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);
});
// Group sorted, save the sort order
$(document).bind('status.groups.sorted', function(e, result) {
console.log('status.groups.sorted', result);
$.post(OC.filePath('contacts', 'ajax', 'setpreference.php'), {'key':'groupsort', 'value':result.sortorder}, function(jsondata) {
if(jsondata.status !== 'success') {
OC.notify({message: jsondata ? jsondata.data.message : t('contacts', 'Network or server error. Please inform administrator.')});
}
});
});
// Group selected, only show contacts from that group
$(document).bind('status.group.selected', function(e, result) {
console.log('status.group.selected', result);
self.currentgroup = result.id;
// Close any open contact.
if(self.currentid) {
var id = self.currentid;
self.closeContact(id);
self.jumpToContact(id);
}
self.$contactList.show();
self.$toggleAll.show();
self.showActions(['add']);
if(result.type === 'category' || result.type === 'fav') {
self.contacts.showContacts(result.contacts);
} else if(result.type === 'shared') {
self.contacts.showFromAddressbook(self.currentgroup, true, true);
} else {
self.contacts.showContacts(self.currentgroup);
}
$.post(OC.filePath('contacts', 'ajax', 'setpreference.php'), {'key':'lastgroup', 'value':self.currentgroup}, function(jsondata) {
if(!jsondata || jsondata.status !== 'success') {
OC.notify({message: (jsondata && jsondata.data) ? jsondata.data.message : t('contacts', 'Network or server error. Please inform administrator.')});
}
});
self.$rightContent.scrollTop(0);
});
// mark items whose title was hid under the top edge as read
/*this.$rightContent.scroll(function() {
// prevent too many scroll requests;
if(!self.isScrolling) {
self.isScrolling = true;
var num = self.$contactList.find('tr').length;
//console.log('num', num);
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.isScrolling = false;
});
} else {
setTimeout(function() {
self.isScrolling = false;
}, self.scrollTimeoutMiliSecs);
}
//console.log('scroll, unseen:', offset, self.$rightContent.height());
}
});*/
this.$settings.find('.settings').on('click keydown',function(event) {
if(wrongKey(event)) {
return;
}
var bodyListener = function(e) {
if(self.$settings.find($(e.target)).length == 0) {
self.$settings.switchClass('open', '');
}
}
if(self.$settings.hasClass('open')) {
self.$settings.switchClass('open', '');
$('body').unbind('click', bodyListener);
} else {
self.$settings.switchClass('', 'open');
$('body').bind('click', bodyListener);
}
});
$('#contactphoto_fileupload').on('change', function() {
self.uploadPhoto(this.files);
});
$('#groupactions > .addgroup').on('click keydown',function(event) {
if(wrongKey(event)) {
return;
}
self.groups.editGroup();
//self.addGroup();
});
this.$ninjahelp.find('.close').on('click keydown',function(event) {
if(wrongKey(event)) {
return;
}
self.$ninjahelp.hide();
});
this.$toggleAll.on('change', function() {
var isChecked = $(this).is(':checked');
self.setAllChecked(isChecked);
if(self.$groups.find('option').length === 1) {
self.buildGroupSelect();
}
if(isChecked) {
self.showActions(['add', 'download', 'groups', 'delete', 'favorite']);
} else {
self.showActions(['add']);
}
});
this.$contactList.on('change', 'input:checkbox', function(event) {
if($(this).is(':checked')) {
if(self.$groups.find('option').length === 1) {
self.buildGroupSelect();
}
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');
var ids, groupName, groupId, buildnow = false;
// If a contact is open the action is only applied to that,
// otherwise on all selected items.
if(self.currentid) {
ids = [self.currentid,];
buildnow = true
} else {
ids = self.contacts.getSelectedContacts();
}
self.setAllChecked(false);
self.$toggleAll.prop('checked', false);
if(!self.currentid) {
self.showActions(['add']);
}
if($opt.val() === 'add') { // Add new group
action = 'add';
console.log('add group...');
self.$groups.val(-1);
self.addGroup(function(response) {
if(response.status === 'success') {
groupId = response.id;
groupName = response.name;
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);
// I don't think this is used...
if(buildnow) {
self.buildGroupSelect();
}
$(document).trigger('status.contact.addedtogroup', {
contactid: id,
groupid: groupId,
groupname: groupName,
});
}, 1000);
});
} else {
// TODO: Use message returned from groups object.
OC.notify({message:t('contacts', t('contacts', 'Error adding to group.'))});
}
});
} else {
OC.notify({message: response.message});
}
});
return;
}
groupName = $opt.text(), groupId = $opt.val();
console.log('trut', groupName, groupId);
if(action === 'add') {
self.groups.addTo(ids, $opt.val(), function(result) {
console.log('after add', result);
if(result.status === 'success') {
$.each(result.ids, function(idx, id) {
// Delay each contact to not trigger too many ajax calls
// at a time.
setTimeout(function() {
console.log('adding', id, 'to', groupName);
self.contacts.contacts[id].addToGroup(groupName);
// I don't think this is used...
if(buildnow) {
self.buildGroupSelect();
}
$(document).trigger('status.contact.addedtogroup', {
contactid: id,
groupid: groupId,
groupname: groupName,
});
}, 1000);
});
} else {
var msg = result.message ? result.message : t('contacts', 'Error adding to group.');
OC.notify({message:msg});
}
});
if(!buildnow) {
self.$groups.val(-1).hide().find('optgroup,option:not([value="-1"])').remove();
}
} else if(action === 'remove') {
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);
if(buildnow) {
self.buildGroupSelect();
}
// If a group is selected the contact has to be removed from the list
$(document).trigger('status.contact.removedfromgroup', {
contactid: id,
groupid: groupId,
groupname: groupName,
});
});
} else {
var msg = result.message ? result.message : t('contacts', 'Error removing from group.');
OC.notify({message:msg});
}
});
if(!buildnow) {
self.$groups.val(-1).hide().find('optgroup,option:not([value="-1"])').remove();
}
} // else something's wrong ;)
self.setAllChecked(false);
});
// Contact list. Either open a contact or perform an action (mailto etc.)
this.$contactList.on('click', 'tr', function(event) {
if($(event.target).is('input')) {
return;
}
if(event.ctrlKey || event.metaKey) {
event.stopPropagation();
event.preventDefault();
console.log('select', event);
self.dontScroll = true;
self.contacts.select($(this).data('id'), true);
return;
}
if($(event.target).is('a.mailto')) {
var mailto = 'mailto:' + $(this).find('.email').text().trim();
console.log('mailto', mailto);
try {
window.location.href=mailto;
} catch(e) {
alert(t('contacts', 'There was an error opening a mail composer.'));
}
return;
}
self.openContact($(this).data('id'));
});
this.$settings.find('h3').on('click keydown', function(event) {
if(wrongKey(event)) {
return;
}
if($(this).next('ul').is(':visible')) {
$(this).next('ul').slideUp();
return;
}
console.log('settings');
var $list = $(this).next('ul');
if($(this).data('id') === 'addressbooks') {
console.log('addressbooks');
if(!self.$addressbookTmpl) {
self.$addressbookTmpl = $('#addressbookTemplate');
}
$list.empty();
$.each(self.contacts.addressbooks, function(id, book) {
var $li = self.$addressbookTmpl.octemplate({
id: id,
permissions: book.permissions,
displayname: book.displayname,
});
$list.append($li);
});
$list.find('a.action').tipsy({gravity: 'w'});
$list.find('a.action.delete').on('click keypress', function() {
$('.tipsy').remove();
var id = parseInt($(this).parents('li').first().data('id'));
console.log('delete', id);
var $li = $(this).parents('li').first();
$.ajax({
type:'POST',
url:OC.filePath('contacts', 'ajax', 'addressbook/delete.php'),
data:{ id: id },
success:function(jsondata) {
console.log(jsondata);
if(jsondata.status == 'success') {
self.contacts.unsetAddressbook(id);
$li.remove();
OC.notify({
message:t('contacts','Deleting done. Click here to cancel reloading.'),
timeout:5,
timeouthandler:function() {
console.log('reloading');
window.location.href = OC.linkTo('contacts', 'index.php');
},
clickhandler:function() {
console.log('reloading cancelled');
OC.notify({cancel:true});
}
});
} else {
OC.notify({message:jsondata.data.message});
}
},
error:function(jqXHR, textStatus, errorThrown) {
OC.notify({message:textStatus + ': ' + errorThrown});
id = false;
},
});
});
$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 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>');
$dropdown.appendTo($(this).parents('li').first());
var $input = $dropdown.find('input');
$input.focus().get(0).select();
$input.on('blur', function() {
$dropdown.hide('blind', function() {
$dropdown.remove();
});
});
});
if(typeof OC.Share !== 'undefined') {
OC.Share.loadIcons('addressbook');
} else {
$list.find('a.action.share').css('display', 'none');
}
} else if($(this).data('id') === 'import') {
console.log('import');
$('.import-upload').show();
$('.import-select').hide();
var addAddressbookCallback = function(select, name) {
var id;
$.ajax({
type:'POST',
async:false,
url:OC.filePath('contacts', 'ajax', 'addressbook/add.php'),
data:{ name: name },
success:function(jsondata) {
console.log(jsondata);
if(jsondata.status == 'success') {
self.contacts.setAddressbook(jsondata.data.addressbook);
id = jsondata.data.addressbook.id
} else {
OC.notify({message:jsondata.data.message});
}
},
error:function(jqXHR, textStatus, errorThrown) {
OC.notify({message:textStatus + ': ' + errorThrown});
id = false;
},
});
return id;
}
self.$importIntoSelect.empty();
$.each(self.contacts.addressbooks, function(id, book) {
self.$importIntoSelect.append('<option value="' + id + '">' + book.displayname + '</option>');
});
self.$importIntoSelect.multiSelect({
createCallback:addAddressbookCallback,
singleSelect: true,
createText:String(t('contacts', 'Add address book')),
minWidth: 120,
});
}
$(this).parents('ul').first().find('ul:visible').slideUp();
$list.toggle('slow');
});
this.$header.on('click keydown', '.add', function(event) {
if(wrongKey(event)) {
return;
}
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) {
if(wrongKey(event)) {
return;
}
console.log('delete');
if(self.currentid) {
console.assert(utils.isUInt(self.currentid), 'self.currentid is not an integer');
self.contacts.delayedDelete(self.currentid);
} else {
self.contacts.delayedDelete(self.contacts.getSelectedContacts());
}
self.showActions(['add']);
});
this.$header.on('click keydown', '.download', function(event) {
if(wrongKey(event)) {
return;
}
console.log('download');
document.location.href = OC.linkTo('contacts', 'export.php')
+ '?selectedids=' + self.contacts.getSelectedContacts().join(',');
});
this.$header.on('click keydown', '.favorite', function(event) {
if(wrongKey(event)) {
return;
}
if(!utils.isUInt(self.currentid)) {
return;
}
// FIXME: This should only apply for contacts list.
var state = self.groups.isFavorite(self.currentid);
console.log('Favorite?', this, state);
self.groups.setAsFavorite(self.currentid, !state, function(jsondata) {
if(jsondata.status === 'success') {
if(state) {
self.$header.find('.favorite').switchClass('active', '');
} else {
self.$header.find('.favorite').switchClass('', 'active');
}
} else {
OC.notify({message:t('contacts', jsondata.data.message)});
}
});
});
this.$contactList.on('mouseenter', 'td.email', function(event) {
if($(this).text().trim().length > 3) {
$(this).find('.mailto').css('display', 'inline-block'); //.fadeIn(100);
}
});
this.$contactList.on('mouseleave', 'td.email', function(event) {
$(this).find('.mailto').fadeOut(100);
});
// Import using jquery.fileupload
$(function() {
var uploadingFiles = {}, numfiles = 0, uploadedfiles = 0, retries = 0;
var aid, importError = false;
var $progressbar = $('#import-progress');
var $status = $('#import-status-text');
var waitForImport = function() {
if(numfiles == 0 && uploadedfiles == 0) {
$progressbar.progressbar('value',100);
if(!importError) {
OC.notify({
message:t('contacts','Import done. Click here to cancel reloading.'),
timeout:5,
timeouthandler:function() {
console.log('reloading');
window.location.href = OC.linkTo('contacts', 'index.php');
},
clickhandler:function() {
console.log('reloading cancelled');
OC.notify({cancel:true});
}
});
}
retries = aid = 0;
$progressbar.fadeOut();
setTimeout(function() {
$status.fadeOut('slow');
$('.import-upload').show();
}, 3000);
} else {
setTimeout(function() {
waitForImport();
}, 1000);
}
};
var doImport = function(file, aid, cb) {
$.post(OC.filePath('contacts', '', 'import.php'), { id: aid, file: file, fstype: 'OC_FilesystemView' },
function(jsondata) {
if(jsondata.status != 'success') {
importError = true;
OC.notify({message:jsondata.data.message});
}
if(typeof cb == 'function') {
cb(jsondata);
}
});
return false;
};
var importFiles = function(aid, uploadingFiles) {
console.log('importFiles', aid, uploadingFiles);
if(numfiles != uploadedfiles) {
OC.notify({message:t('contacts', 'Not all files uploaded. Retrying...')});
retries += 1;
if(retries > 3) {
numfiles = uploadedfiles = retries = aid = 0;
uploadingFiles = {};
$progressbar.fadeOut();
OC.dialogs.alert(t('contacts', 'Something went wrong with the upload, please retry.'), t('contacts', 'Error'));
return;
}
setTimeout(function() { // Just to let any uploads finish
importFiles(aid, uploadingFiles);
}, 1000);
}
$progressbar.progressbar('value', 50);
var todo = uploadedfiles;
$.each(uploadingFiles, function(fileName, data) {
$status.text(t('contacts', 'Importing from {filename}...', {filename:fileName})).fadeIn();
doImport(fileName, aid, function(response) {
if(response.status === 'success') {
$status.text(t('contacts', '{success} imported, {failed} failed.',
{success:response.data.imported, failed:response.data.failed})).fadeIn();
}
delete uploadingFiles[fileName];
numfiles -= 1; uploadedfiles -= 1;
$progressbar.progressbar('value',50+(50/(todo-uploadedfiles)));
});
})
//$status.text(t('contacts', 'Importing...')).fadeIn();
waitForImport();
};
// Start the actual import.
$('.doImport').on('click keypress', function(event) {
if(wrongKey(event)) {
return;
}
aid = $(this).prev('select').val();
$('.import-select').hide();
importFiles(aid, uploadingFiles);
});
$('#import_fileupload').fileupload({
acceptFileTypes: /^text\/(directory|vcard|x-vcard)$/i,
add: function(e, data) {
var files = data.files;
var totalSize=0;
if(files) {
numfiles += files.length; uploadedfiles = 0;
for(var i=0;i<files.length;i++) {
if(files[i].size ==0 && files[i].type== '') {
OC.dialogs.alert(t('files', 'Unable to upload your file as it is a directory or has 0 bytes'), t('files', 'Upload Error'));
return;
}
totalSize+=files[i].size;
}
}
if(totalSize>$('#max_upload').val()) {
OC.dialogs.alert(t('contacts','The file you are trying to upload exceed the maximum size for file uploads on this server.'), t('contacts','Upload too large'));
numfiles = uploadedfiles = retries = aid = 0;
uploadingFiles = {};
return;
} else {
if($.support.xhrFileUpload) {
$.each(files, function(i, file) {
var fileName = file.name;
console.log('file.name', file.name);
var jqXHR = $('#import_fileupload').fileupload('send',
{
files: file,
formData: function(form) {
var formArray = form.serializeArray();
formArray['aid'] = aid;
return formArray;
}})
.success(function(response, textStatus, jqXHR) {
if(response.status == 'success') {
// import the file
uploadedfiles += 1;
} else {
OC.notify({message:response.data.message});
}
return false;
})
.error(function(jqXHR, textStatus, errorThrown) {
console.log(textStatus);
OC.notify({message:errorThrown + ': ' + textStatus,});
});
uploadingFiles[fileName] = jqXHR;
});
} else {
data.submit().success(function(data, status) {
response = jQuery.parseJSON(data[0].body.innerText);
if(response[0] != undefined && response[0].status == 'success') {
var file=response[0];
delete uploadingFiles[file.name];
$('tr').filterAttr('data-file',file.name).data('mime',file.mime);
var size = $('tr').filterAttr('data-file',file.name).find('td.filesize').text();
if(size==t('files','Pending')){
$('tr').filterAttr('data-file',file.name).find('td.filesize').text(file.size);
}
FileList.loadingDone(file.name);
} else {
OC.notify({message:response.data.message});
}
});
}
}
},
fail: function(e, data) {
console.log('fail');
OC.notify({message:data.errorThrown + ': ' + data.textStatus});
// TODO: Remove file from upload queue.
},
progressall: function(e, data) {
var progress = (data.loaded/data.total)*50;
$progressbar.progressbar('value',progress);
},
start: function(e, data) {
$progressbar.progressbar({value:0});
$progressbar.fadeIn();
if(data.dataType != 'iframe ') {
$('#upload input.stop').show();
}
},
stop: function(e, data) {
console.log('stop, data', data);
// stop only gets fired once so we collect uploaded items here.
$('.import-upload').hide();
$('.import-select').show();
if(data.dataType != 'iframe ') {
$('#upload input.stop').hide();
}
}
})
});
$(document).on('keypress', function(event) {
if(!$(event.target).is('body')) {
return;
}
var keyCode = Math.max(event.keyCode, event.which);
// TODO: This should go in separate method
console.log(event, keyCode + ' ' + event.target.nodeName);
/**
* To add:
* Shift-a: add addressbook
* u (85): hide/show leftcontent
* f (70): add field
*/
switch(keyCode) {
case 13: // Enter?
console.log('Enter?');
if(!self.currentid && self.currentlistid) {
self.openContact(self.currentlistid);
}
break;
case 27: // Esc
if(self.$ninjahelp.is(':visible')) {
self.$ninjahelp.hide();
} else if(self.currentid) {
self.closeContact(self.currentid);
}
break;
case 46: // Delete
if(event.shiftKey) {
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();
}
break;
case 65: // a
if(event.shiftKey) {
console.log('add group?');
break;
}
self.addContact();
break;
case 38: // up
case 75: // k
console.log('previous');
if(!self.currentid && self.currentlistid) {
self.contacts.contacts[self.currentlistid].prev();
}
break;
case 34: // PageDown
case 78: // n
console.log('page down')
break;
case 79: // o
console.log('open contact?');
break;
case 33: // PageUp
case 80: // p
// prev addressbook
//OC.contacts.contacts.previousAddressbook();
break;
case 82: // r
console.log('refresh - what?');
break;
case 63: // ? German.
if(event.shiftKey) {
self.$ninjahelp.toggle('fast');
}
break;
case 171: // ? Danish
case 191: // ? Standard qwerty
self.$ninjahelp.toggle('fast').position({my: "center",at: "center",of: "#content"});
break;
}
});
// find all with a title attribute and tipsy them
$('.tooltipped.downwards:not(.onfocus)').tipsy({gravity: 'n'});
$('.tooltipped.upwards:not(.onfocus)').tipsy({gravity: 's'});
$('.tooltipped.rightwards:not(.onfocus)').tipsy({gravity: 'w'});
$('.tooltipped.leftwards:not(.onfocus)').tipsy({gravity: 'e'});
$('.tooltipped.downwards.onfocus').tipsy({trigger: 'focus', gravity: 'n'});
$('.tooltipped.rightwards.onfocus').tipsy({trigger: 'focus', gravity: 'w'});
},
addGroup: function(cb) {
var self = this;
$('body').append('<div id="add_group_dialog"></div>');
if(!this.$addGroupTmpl) {
this.$addGroupTmpl = $('#addGroupTemplate');
}
var $dlg = this.$addGroupTmpl.octemplate();
$('#add_group_dialog').html($dlg).dialog({
modal: true,
closeOnEscape: true,
title: t('contacts', 'Add group'),
height: 'auto', width: 'auto',
buttons: {
'Ok':function() {
self.groups.addGroup(
{name:$dlg.find('input:text').val()},
function(response) {
if(typeof cb === 'function') {
cb(response);
} else {
if(response.status !== 'success') {
OC.notify({message: response.message});
}
}
});
$(this).dialog('close');
},
'Cancel':function() {
$(this).dialog('close');
return false;
}
},
close: function(event, ui) {
$(this).dialog('destroy').remove();
$('#add_group_dialog').remove();
},
open: function(event, ui) {
$dlg.find('input').focus();
},
});
},
setAllChecked: function(checked) {
var selector = checked ? 'input:checkbox:visible:not(checked)' : 'input:checkbox:visible:checked';
$.each(self.$contactList.find(selector), function() {
$(this).prop('checked', checked);
});
},
jumpToContact: function(id) {
this.$rightContent.scrollTop(this.contacts.contactPos(id)+10);
},
closeContact: function(id) {
if(typeof this.currentid === 'number') {
var contact = this.contacts.findById(id);
if(contact && contact.close()) {
this.$contactList.show();
this.jumpToContact(id);
}
} else if(this.currentid === 'new') {
this.tmpcontact.remove();
this.$contactList.show();
}
this.$contactList.removeClass('dim');
delete this.currentid;
this.showActions(['add']);
this.$groups.find('optgroup,option:not([value="-1"])').remove();
},
openContact: function(id) {
console.log('Contacts.openContact', id);
if(this.currentid) {
this.closeContact(this.currentid);
}
this.currentid = parseInt(id);
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);
// 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, groupprops);
var self = this;
var $contact = $contactelem.find('#contact');
var adjustElems = function() {
var maxheight = document.documentElement.clientHeight - 200; // - ($contactelem.offset().top+70);
console.log('contact maxheight', maxheight);
$contactelem.find('ul').first().css({'max-height': maxheight, 'overflow-y': 'auto', 'overflow-x': 'hidden'});
};
$(window).resize(adjustElems);
//$contact.resizable({ minWidth: 400, minHeight: 400, maxHeight: maxheight});
this.$rightContent.prepend($contactelem);
adjustElems();
},
update: function() {
console.log('update');
},
uploadPhoto:function(filelist) {
var self = this;
if(!filelist) {
OC.notify({message:t('contacts','No files selected for upload.')});
return;
}
var file = filelist[0];
var target = $('#file_upload_target');
var form = $('#file_upload_form');
var totalSize=0;
if(file.size > $('#max_upload').val()){
OC.notify({
message:t(
'contacts',
'The file you are trying to upload exceed the maximum size for file uploads on this server.'),
});
return;
} else {
target.load(function() {
var response=jQuery.parseJSON(target.contents().text());
if(response != undefined && response.status == 'success') {
console.log('response', response);
self.editPhoto(self.currentid, response.data.tmp);
//alert('File: ' + file.tmp + ' ' + file.name + ' ' + file.mime);
} else {
OC.notify({message:response.data.message});
}
});
form.submit();
}
},
cloudPhotoSelected:function(id, path) {
var self = this;
console.log('cloudPhotoSelected, id', id)
$.getJSON(OC.filePath('contacts', 'ajax', 'oc_photo.php'),
{path: path, id: id},function(jsondata) {
if(jsondata.status == 'success') {
//alert(jsondata.data.page);
self.editPhoto(jsondata.data.id, jsondata.data.tmp)
$('#edit_photo_dialog_img').html(jsondata.data.page);
}
else{
OC.notify({message: jsondata.data.message});
}
});
},
editCurrentPhoto:function(id) {
var self = this;
$.getJSON(OC.filePath('contacts', 'ajax', 'currentphoto.php'),
{id: id}, function(jsondata) {
if(jsondata.status == 'success') {
//alert(jsondata.data.page);
self.editPhoto(jsondata.data.id, jsondata.data.tmp)
$('#edit_photo_dialog_img').html(jsondata.data.page);
}
else{
OC.notify({message: jsondata.data.message});
}
});
},
editPhoto:function(id, tmpkey) {
console.log('editPhoto', id, tmpkey)
$('.tipsy').remove();
// Simple event handler, called from onChange and onSelect
// event handlers, as per the Jcrop invocation above
var showCoords = function(c) {
$('#x1').val(c.x);
$('#y1').val(c.y);
$('#x2').val(c.x2);
$('#y2').val(c.y2);
$('#w').val(c.w);
$('#h').val(c.h);
};
var clearCoords = function() {
$('#coords input').val('');
};
var self = this;
if(!this.$cropBoxTmpl) {
this.$cropBoxTmpl = $('#cropBoxTemplate');
}
$('body').append('<div id="edit_photo_dialog"></div>');
var $dlg = this.$cropBoxTmpl.octemplate({id: id, tmpkey: tmpkey});
var cropphoto = new Image();
$(cropphoto).load(function () {
$(this).attr('id', 'cropbox');
$(this).prependTo($dlg).fadeIn();
$(this).Jcrop({
onChange: showCoords,
onSelect: showCoords,
onRelease: clearCoords,
maxSize: [399, 399],
bgColor: 'black',
bgOpacity: .4,
boxWidth: 400,
boxHeight: 400,
setSelect: [ 100, 130, 50, 50 ]//,
//aspectRatio: 0.8
});
$('#edit_photo_dialog').html($dlg).dialog({
modal: true,
closeOnEscape: true,
title: t('contacts', 'Edit profile picture'),
height: 'auto', width: 'auto',
buttons: {
'Ok':function() {
self.savePhoto($(this));
$(this).dialog('close');
},
'Cancel':function() { $(this).dialog('close'); }
},
close: function(event, ui) {
$(this).dialog('destroy').remove();
$('#edit_photo_dialog').remove();
},
open: function(event, ui) {
// Jcrop maybe?
}
});
}).error(function () {
OC.notify({message:t('contacts','Error loading profile picture.')});
}).attr('src', OC.linkTo('contacts', 'tmpphoto.php')+'?tmpkey='+tmpkey);
},
savePhoto:function($dlg) {
var form = $dlg.find('#cropform');
q = form.serialize();
console.log('savePhoto', q);
$.post(OC.filePath('contacts', 'ajax', 'savecrop.php'), q, function(response) {
var jsondata = $.parseJSON(response);
console.log('savePhoto, jsondata', typeof jsondata);
if(jsondata && jsondata.status === 'success') {
// load cropped photo.
$(document).trigger('status.contact.photoupdated', {
id: jsondata.data.id,
});
} else {
if(!jsondata) {
OC.notify({message:t('contacts', 'Network or server error. Please inform administrator.')});
} else {
OC.notify({message: jsondata.data.message});
}
}
});
},
// NOTE: Deprecated
addAddressbook:function(data, cb) {
$.ajax({
type:'POST',
async:false,
url:OC.filePath('contacts', 'ajax', 'addressbook/add.php'),
data:{ name: data.name, description: data.description },
success:function(jsondata) {
if(jsondata.status == 'success') {
if(typeof cb === 'function') {
cb({
status:'success',
addressbook: jsondata.data.addressbook,
});
}
} else {
if(typeof cb === 'function') {
cb({status:'error', message:jsondata.data.message});
}
}
}});
},
// NOTE: Deprecated
selectAddressbook:function(cb) {
var self = this;
var jqxhr = $.get(OC.filePath('contacts', 'templates', 'selectaddressbook.html'), function(data) {
$('body').append('<div id="addressbook_dialog"></div>');
var $dlg = $('#addressbook_dialog').html(data).octemplate({
nameplaceholder: t('contacts', 'Enter name'),
descplaceholder: t('contacts', 'Enter description'),
}).dialog({
modal: true, height: 'auto', width: 'auto',
title: t('contacts', 'Select addressbook'),
buttons: {
'Ok':function() {
aid = $(this).find('input:checked').val();
if(aid == 'new') {
var displayname = $(this).find('input.name').val();
var description = $(this).find('input.desc').val();
if(!displayname.trim()) {
OC.dialogs.alert(t('contacts', 'The address book name cannot be empty.'), t('contacts', 'Error'));
return false;
}
console.log('ID, name and desc', aid, displayname, description);
if(typeof cb === 'function') {
// TODO: Create addressbook
var data = {name:displayname, description:description};
self.addAddressbook(data, function(data) {
if(data.status === 'success') {
cb({
status:'success',
addressbook:data.addressbook,
});
} else {
cb({status:'error'});
}
});
}
$(this).dialog('close');
} else {
console.log('aid ' + aid);
if(typeof cb === 'function') {
cb({
status:'success',
addressbook:self.contacts.addressbooks[parseInt(aid)],
});
}
$(this).dialog('close');
}
},
'Cancel':function() {
$(this).dialog('close');
}
},
close: function(event, ui) {
$(this).dialog('destroy').remove();
$('#addressbook_dialog').remove();
},
open: function(event, ui) {
console.log('open', $(this));
var $lastrow = $(this).find('tr.new');
$.each(self.contacts.addressbooks, function(i, book) {
console.log('book', i, book);
if(book.owner === OC.currentUser
|| (book.permissions & OC.PERMISSION_UPDATE
|| book.permissions & OC.PERMISSION_CREATE
|| book.permissions & OC.PERMISSION_DELETE)) {
var row = '<tr><td><input id="book_{id}" name="book" type="radio" value="{id}"</td>'
+ '<td><label for="book_{id}">{displayname}</label></td>'
+ '<td>{description}</td></tr>'
var $row = $(row).octemplate({
id:book.id,
displayname:book.displayname,
description:book.description
});
$lastrow.before($row);
}
});
$(this).find('input[type="radio"]').first().prop('checked', true);
$lastrow.find('input.name,input.desc').on('focus', function(e) {
$lastrow.find('input[type="radio"]').prop('checked', true);
});
},
});
}).error(function() {
OC.notify({message: t('contacts', 'Network or server error. Please inform administrator.')});
});
},
};
(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
*/
var Template = {
init: function(options, elem) {
// Mix in the passed in options with the default options
this.options = $.extend({},this.options,options);
// Save the element reference, both as a jQuery
// reference and a normal reference
this.elem = elem;
this.$elem = $(elem);
var _html = this._build(this.options);
//console.log('html', this.$elem.html());
return $(_html);
},
// 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.outerHTML();
return data.replace(/{([^{}]*)}/g,
function (a, b) {
var r = o[b];
return typeof r === 'string' || typeof r === 'number' ? r : a;
}
);
},
options: {
},
};
$.fn.octemplate = function(options) {
if ( this.length ) {
var _template = Object.create(Template);
return _template.init(options, this);
}
};
})( jQuery );
$(document).ready(function() {
OC.Contacts.init(id);
});

View File

@ -1,2267 +1,1576 @@
function ucwords (str) {
return (str + '').replace(/^([a-z])|\s+([a-z])/g, function ($1) {
return $1.toUpperCase();
});
}
OC.Contacts = OC.Contacts || {};
String.prototype.strip_tags = function(){
tags = this;
stripped = tags.replace(/<(.|\n)*?>/g, '');
return stripped;
};
OC.Contacts={
(function(window, $, OC) {
'use strict';
/**
* Arguments:
* message: The text message to show.
* timeout: The timeout in seconds before the notification disappears. Default 10.
* timeouthandler: A function to run on timeout.
* clickhandler: A function to run on click. If a timeouthandler is given it will be cancelled.
* data: An object that will be passed as argument to the timeouthandler and clickhandler functions.
* cancel: If set cancel all ongoing timer events and hide the notification.
*/
notify:function(params) {
var self = this;
if(!self.notifier) {
self.notifier = $('#notification');
* An item which binds the appropriate html and event handlers
* @param parent the parent ContactList
* @param id The integer contact id.
* @param access An access object containing and 'owner' string variable and an integer 'permissions' variable.
* @param data the data used to populate the contact
* @param listtemplate the jquery object used to render the contact list item
* @param fulltemplate the jquery object used to render the entire contact
* @param detailtemplates A map of jquery objects used to render the contact parts e.g. EMAIL, TEL etc.
*/
var Contact = function(parent, id, access, data, listtemplate, fulltemplate, detailtemplates) {
//console.log('contact:', id, access); //parent, id, data, listtemplate, fulltemplate);
this.parent = parent,
this.id = id,
this.access = access,
this.data = data,
this.$listTemplate = listtemplate,
this.$fullTemplate = fulltemplate;
this.detailTemplates = detailtemplates;
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();
}
if(params.cancel) {
self.notifier.off('click');
for(var id in self.notifier.data()) {
if($.isNumeric(id)) {
clearTimeout(parseInt(id));
}
}
self.notifier.text('').fadeOut().removeData();
}
Contact.prototype.setAsSaving = function(obj, state) {
if(!obj) {
return;
}
self.notifier.text(params.message);
self.notifier.fadeIn();
self.notifier.on('click', function() { $(this).fadeOut();});
var timer = setTimeout(function() {
if(!self || !self.notifier) {
var self = OC.Contacts;
self.notifier = $('#notification');
}
self.notifier.fadeOut();
if(params.timeouthandler && $.isFunction(params.timeouthandler)) {
params.timeouthandler(self.notifier.data(dataid));
self.notifier.off('click');
self.notifier.removeData(dataid);
}
}, params.timeout && $.isNumeric(params.timeout) ? parseInt(params.timeout)*1000 : 10000);
var dataid = timer.toString();
if(params.data) {
self.notifier.data(dataid, params.data);
}
if(params.clickhandler && $.isFunction(params.clickhandler)) {
self.notifier.on('click', function() {
if(!self || !self.notifier) {
var self = OC.Contacts;
self.notifier = $(this);
}
clearTimeout(timer);
self.notifier.off('click');
params.clickhandler(self.notifier.data(dataid));
self.notifier.removeData(dataid);
});
}
},
notImplemented:function() {
OC.dialogs.alert(t('contacts', 'Sorry, this functionality has not been implemented yet'), t('contacts', 'Not implemented'));
},
searchOSM:function(obj) {
var adr = OC.Contacts.propertyContainerFor(obj).find('.adr').val();
if(adr == undefined) {
OC.dialogs.alert(t('contacts', 'Couldn\'t get a valid address.'), t('contacts', 'Error'));
return;
}
// FIXME: I suck at regexp. /Tanghus
var adrarr = adr.split(';');
var adrstr = '';
if(adrarr[2].trim() != '') {
adrstr = adrstr + adrarr[2].trim() + ',';
}
if(adrarr[3].trim() != '') {
adrstr = adrstr + adrarr[3].trim() + ',';
}
if(adrarr[4].trim() != '') {
adrstr = adrstr + adrarr[4].trim() + ',';
}
if(adrarr[5].trim() != '') {
adrstr = adrstr + adrarr[5].trim() + ',';
}
if(adrarr[6].trim() != '') {
adrstr = adrstr + adrarr[6].trim();
}
adrstr = encodeURIComponent(adrstr);
var uri = 'http://open.mapquestapi.com/nominatim/v1/search.php?q=' + adrstr + '&limit=10&addressdetails=1&polygon=1&zoom=';
var newWindow = window.open(uri,'_blank');
newWindow.focus();
},
mailTo:function(obj) {
var adr = OC.Contacts.propertyContainerFor($(obj)).find('input[type="email"]').val().trim();
if(adr == '') {
OC.dialogs.alert(t('contacts', 'Please enter an email address.'), t('contacts', 'Error'));
return;
}
window.location.href='mailto:' + adr;
},
propertyContainerFor:function(obj) {
return $(obj).parents('.propertycontainer').first();
},
checksumFor:function(obj) {
return $(obj).parents('.propertycontainer').first().data('checksum');
},
propertyTypeFor:function(obj) {
return $(obj).parents('.propertycontainer').first().data('element');
},
loading:function(obj, state) {
if(state) {
$(obj).prop('disabled', state);
$(obj).toggleClass('loading', state);
/*if(state) {
$(obj).addClass('loading');
} else {
$(obj).removeClass('loading');
}
},
showCardDAVUrl:function(username, bookname){
$('#carddav_url').val(totalurl + '/' + username + '/' + decodeURIComponent(bookname));
$('#carddav_url').show();
$('#carddav_url_close').show();
},
loadListHandlers:function() {
$('.propertylist li a.delete').unbind('click');
$('.propertylist li a.delete').unbind('keydown');
var deleteItem = function(obj) {
obj.tipsy('hide');
OC.Contacts.Card.deleteProperty(obj, 'list');
}
$('.propertylist li a.delete, .addresscard .delete').click(function() { deleteItem($(this)) });
$('.propertylist li a.delete, .addresscard .delete').keydown(function() { deleteItem($(this)) });
$('.addresscard .globe').click(function() { $(this).tipsy('hide');OC.Contacts.searchOSM(this); });
$('.addresscard .globe').keydown(function() { $(this).tipsy('hide');OC.Contacts.searchOSM(this); });
$('.addresscard .edit').click(function() { $(this).tipsy('hide');OC.Contacts.Card.editAddress(this, false); });
$('.addresscard .edit').keydown(function() { $(this).tipsy('hide');OC.Contacts.Card.editAddress(this, false); });
$('.addresscard,.propertylist li,.propertycontainer').hover(
function () {
$(this).find('.globe,.mail,.delete,.edit').animate({ opacity: 1.0 }, 200, function() {});
},
function () {
$(this).find('.globe,.mail,.delete,.edit').animate({ opacity: 0.1 }, 200, function() {});
}
);
},
loadHandlers:function() {
var deleteItem = function(obj) {
obj.tipsy('hide');
OC.Contacts.Card.deleteProperty(obj, 'single');
}
var goToUrl = function(obj) {
var url = OC.Contacts.propertyContainerFor(obj).find('#url').val().toString();
// Check if the url is valid
if(new RegExp("[a-zA-Z0-9]+://([a-zA-Z0-9_]+:[a-zA-Z0-9_]+@)?([a-zA-Z0-9.-]+\\.[A-Za-z]{2,4})(:[0-9]+)?(/.*)?").test(url)) {
var newWindow = window.open(url,'_blank');
newWindow.focus();
}
}
$('#identityprops a.delete').click( function() { deleteItem($(this)) });
$('#identityprops a.delete').keydown( function() { deleteItem($(this)) });
$('#categories_value a.edit').click( function() { $(this).tipsy('hide');OCCategories.edit(); } );
$('#categories_value a.edit').keydown( function() { $(this).tipsy('hide');OCCategories.edit(); } );
$('#url_value a.globe').click( function() { $(this).tipsy('hide');goToUrl($(this)); } );
$('#url_value a.globe').keydown( function() { $(this).tipsy('hide');goToUrl($(this)); } );
$('#fn_select').combobox({
'id': 'fn',
'name': 'value',
'classes': ['contacts_property', 'nonempty', 'huge', 'tip', 'float'],
'attributes': {'placeholder': t('contacts', 'Enter name')},
'title': t('contacts', 'Format custom, Short name, Full name, Reverse or Reverse with comma')});
$('#bday').datepicker({
dateFormat : 'dd-mm-yy'
});
// Style phone types
$('#phonelist').find('select.contacts_property').multiselect({
noneSelectedText: t('contacts', 'Select type'),
header: false,
selectedList: 4,
classes: 'typelist'
});
$('#edit_name').click(function(){OC.Contacts.Card.editName()});
$('#edit_name').keydown(function(){OC.Contacts.Card.editName()});
$('#phototools li a').click(function() {
$(this).tipsy('hide');
});
$('#contacts_details_photo_wrapper').hover(
function () {
$('#phototools').slideDown(200);
},
function () {
$('#phototools').slideUp(200);
}
);
$('#phototools').hover(
function () {
$(this).removeClass('transparent');
},
function () {
$(this).addClass('transparent');
}
);
$('#phototools .upload').click(function() {
$('#file_upload_start').trigger('click');
});
$('#phototools .cloud').click(function() {
OC.dialogs.filepicker(t('contacts', 'Select photo'), OC.Contacts.Card.cloudPhotoSelected, false, 'image', true);
});
/* Initialize the photo edit dialog */
$('#edit_photo_dialog').dialog({
autoOpen: false, modal: true, height: 'auto', width: 'auto'
});
$('#edit_photo_dialog' ).dialog( 'option', 'buttons', [
{
text: "Ok",
click: function() {
OC.Contacts.Card.savePhoto(this);
$(this).dialog('close');
}
},
{
text: "Cancel",
click: function() { $(this).dialog('close'); }
}
] );
// Name has changed. Update it and reorder.
$('#fn').change(function(){
var name = $('#fn').val().strip_tags();
var item = $('.contacts li[data-id="'+OC.Contacts.Card.id+'"]').detach();
$(item).find('a').html(name);
OC.Contacts.Card.fn = name;
OC.Contacts.Contacts.insertContact({contact:item});
OC.Contacts.Contacts.scrollTo(OC.Contacts.Card.id);
});
$('#contacts_deletecard').click( function() { OC.Contacts.Card.delayedDelete();return false;} );
$('#contacts_deletecard').keydown( function(event) {
if(event.which == 13 || event.which == 32) {
OC.Contacts.Card.delayedDelete();
}
return false;
});
$('#contacts_downloadcard').click( function() { OC.Contacts.Card.doExport();return false;} );
$('#contacts_downloadcard').keydown( function(event) {
if(event.which == 13 || event.which == 32) {
OC.Contacts.Card.doExport();
}
return false;
});
// Profile picture upload handling
// New profile picture selected
$('#file_upload_start').change(function(){
OC.Contacts.Card.uploadPhoto(this.files);
});
$('#contacts_details_photo_wrapper').bind('dragover',function(event){
$(event.target).addClass('droppable');
event.stopPropagation();
event.preventDefault();
});
$('#contacts_details_photo_wrapper').bind('dragleave',function(event){
$(event.target).removeClass('droppable');
});
$('#contacts_details_photo_wrapper').bind('drop',function(event){
event.stopPropagation();
event.preventDefault();
$(event.target).removeClass('droppable');
$.fileUpload(event.originalEvent.dataTransfer.files);
});
$('#categories').multiple_autocomplete({source: categories});
$('#contacts_deletecard').tipsy({gravity: 'ne'});
$('#contacts_downloadcard').tipsy({gravity: 'ne'});
$('#contacts_propertymenu_button').tipsy();
$('#bottomcontrols button').tipsy({gravity: 'sw'});
$('body').click(function(e){
if(!$(e.target).is('#contacts_propertymenu_button')) {
$('#contacts_propertymenu_dropdown').hide();
}
});
function propertyMenu(){
var menu = $('#contacts_propertymenu_dropdown');
if(menu.is(':hidden')) {
menu.show();
menu.find('li').first().focus();
} else {
menu.hide();
}
}
$('#contacts_propertymenu_button').click(propertyMenu);
$('#contacts_propertymenu_button').keydown(propertyMenu);
function propertyMenuItem(){
var type = $(this).data('type');
OC.Contacts.Card.addProperty(type);
$('#contacts_propertymenu_dropdown').hide();
}
$('#contacts_propertymenu_dropdown a').click(propertyMenuItem);
$('#contacts_propertymenu_dropdown a').keydown(propertyMenuItem);
},
Card:{
update:function(params) { // params {cid:int, aid:int}
if(!params) { params = {}; }
$('#contacts li,#contacts h3').removeClass('active');
//console.log('Card, cid: ' + params.cid + ' aid: ' + params.aid);
var newid, bookid, firstitem;
if(!parseInt(params.cid) && !parseInt(params.aid)) {
firstitem = $('#contacts ul').find('li:first-child');
if(firstitem.length > 0) {
if(firstitem.length > 1) {
firstitem = firstitem.first();
}
newid = parseInt(firstitem.data('id'));
bookid = parseInt(firstitem.data('bookid'));
}
} else if(!parseInt(params.cid) && parseInt(params.aid)) {
bookid = parseInt(params.aid);
newid = parseInt($('#contacts').find('li[data-bookid="'+bookid+'"]').first().data('id'));
} else if(parseInt(params.cid) && !parseInt(params.aid)) {
newid = parseInt(params.cid);
var listitem = OC.Contacts.Contacts.getContact(newid); //$('#contacts li[data-id="'+newid+'"]');
//console.log('Is contact in list? ' + listitem.length);
if(listitem.length) {
//bookid = parseInt($('#contacts li[data-id="'+newid+'"]').data('bookid'));
bookid = parseInt(OC.Contacts.Contacts.getContact(newid).data('bookid'));
} else { // contact isn't in list yet.
bookid = 'unknown';
}
} else {
newid = parseInt(params.cid);
bookid = parseInt(params.aid);
}
if(!bookid || !newid) {
bookid = parseInt($('#contacts h3').first().data('id'));
newid = parseInt($('#contacts').find('li[data-bookid="'+bookid+'"]').first().data('id'));
}
//console.log('newid: ' + newid + ' bookid: ' +bookid);
var localLoadContact = function(newid, bookid) {
if($('.contacts li').length > 0) {
$.getJSON(OC.filePath('contacts', 'ajax', 'contact/details.php'),{'id':newid},function(jsondata){
if(jsondata.status == 'success'){
if(bookid == 'unknown') {
bookid = jsondata.data.addressbookid;
var contact = OC.Contacts.Contacts.insertContact({
contactlist:$('#contacts ul[data-id="'+bookid+'"]'),
data:jsondata.data
});
}
$('#contacts li[data-id="'+newid+'"],#contacts h3[data-id="'+bookid+'"]').addClass('active');
$('#contacts ul[data-id="'+bookid+'"]').slideDown(300);
OC.Contacts.Card.loadContact(jsondata.data, bookid);
OC.Contacts.Contacts.scrollTo(newid);
} else {
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
}
});
}
}
// Make sure proper DOM is loaded.
if(newid) {
//console.log('Loading card DOM');
localLoadContact(newid, bookid);
$('#firstrun').hide();
$('#card').show();
} else if(!newid) {
//console.log('Loading intro');
// show intro page
$('#firstrun').show();
$('#card').hide();
}
$('#contacts h3[data-id="'+bookid+'"]').addClass('active');
},
setEnabled:function(enabled) {
//console.log('setEnabled', enabled);
$('.contacts_property,.action').each(function () {
$(this).prop('disabled', !enabled);
OC.Contacts.Card.enabled = enabled;
});
},
doExport:function() {
document.location.href = OC.linkTo('contacts', 'export.php') + '?contactid=' + this.id;
},
editNew:function(){ // add a new contact
var book = $('#contacts h3.active');
var permissions = parseInt(book.data('permissions'));
if(permissions == 0
|| permissions & OC.PERMISSION_UPDATE
|| permissions & OC.PERMISSION_DELETE) {
with(this) {
delete id; delete fn; delete fullname; delete givname; delete famname;
delete addname; delete honpre; delete honsuf;
}
this.bookid = book.data('id');
OC.Contacts.Card.add(';;;;;', '', '', true);
} else {
OC.dialogs.alert(t('contacts', 'You do not have permission to add contacts to ')
+ book.text() + '. ' + t('contacts', 'Please select one of your own address books.'), t('contacts', 'Permission error'));
}
return false;
},
add:function(n, fn, aid, isnew) { // add a new contact
//console.log('Adding ' + fn);
$('#firstrun').hide();
$('#card').show();
aid = aid?aid:$('#contacts h3.active').first().data('id');
$.post(OC.filePath('contacts', 'ajax', 'contact/add.php'), { n: n, fn: fn, aid: aid, isnew: isnew },
function(jsondata) {
if (jsondata.status == 'success'){
$('#rightcontent').data('id',jsondata.data.id);
var id = jsondata.data.id;
var aid = jsondata.data.aid;
$.getJSON(OC.filePath('contacts', 'ajax', 'contact/details.php'),{'id':id},function(jsondata){
if(jsondata.status == 'success'){
OC.Contacts.Card.loadContact(jsondata.data, aid);
var item = OC.Contacts.Contacts.insertContact({data:jsondata.data});
$('#contacts li').removeClass('active');
item.addClass('active');
if(isnew) { // add some default properties
OC.Contacts.Card.addProperty('EMAIL');
OC.Contacts.Card.addProperty('TEL');
$('#fn').focus();
}
}
else{
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
}
});
$('#contact_identity').show();
$('#actionbar').show();
}
else{
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
}
});
},
delayedDelete:function() {
$('#contacts_deletecard').tipsy('hide');
var newid = '', bookid;
var curlistitem = OC.Contacts.Contacts.getContact(this.id);
curlistitem.removeClass('active');
var newlistitem = curlistitem.prev('li');
if(!newlistitem) {
newlistitem = curlistitem.next('li');
}
curlistitem.detach();
if($(newlistitem).is('li')) {
newid = newlistitem.data('id');
bookid = newlistitem.data('bookid');
}
$('#rightcontent').data('id', newid);
OC.Contacts.Contacts.deletionQueue.push(parseInt(this.id));
if(!window.onbeforeunload) {
window.onbeforeunload = OC.Contacts.Contacts.warnNotDeleted;
}
with(this) {
delete id; delete fn; delete fullname; delete shortname; delete famname;
delete givname; delete addname; delete honpre; delete honsuf; delete data;
}
if($('.contacts li').length > 0) {
OC.Contacts.Card.update({cid:newid, aid:bookid});
} else {
// load intro page
$('#firstrun').show();
$('#card').hide();
}
OC.Contacts.notify({
data:curlistitem,
message:t('contacts','Click to undo deletion of "') + curlistitem.find('a').text() + '"',
//timeout:5,
timeouthandler:function(contact) {
//console.log('timeout');
OC.Contacts.Card.doDelete(contact.data('id'), true, function(res) {
if(!res) {
OC.Contacts.Contacts.insertContact({contact:contact});
} else {
delete contact;
}
});
},
clickhandler:function(contact) {
OC.Contacts.Contacts.insertContact({contact:contact});
OC.Contacts.notify({message:t('contacts', 'Cancelled deletion of: "') + curlistitem.find('a').text() + '"'});
window.onbeforeunload = null;
}
});
},
doDelete:function(id, removeFromQueue, cb) {
var updateQueue = function(id, remove) {
if(removeFromQueue) {
OC.Contacts.Contacts.deletionQueue.splice(OC.Contacts.Contacts.deletionQueue.indexOf(parseInt(id)), 1);
}
if(OC.Contacts.Contacts.deletionQueue.length == 0) {
window.onbeforeunload = null;
}
}
if(OC.Contacts.Contacts.deletionQueue.indexOf(parseInt(id)) == -1 && removeFromQueue) {
//console.log('returning');
updateQueue(id, removeFromQueue);
if(typeof cb == 'function') {
cb(true);
}
return;
}
$.post(OC.filePath('contacts', 'ajax', 'contact/delete.php'), {'id':id},function(jsondata) {
if(jsondata.status == 'error'){
OC.Contacts.notify({message:jsondata.data.message});
if(typeof cb == 'function') {
cb(false);
}
}
updateQueue(id, removeFromQueue);
});
if(typeof cb == 'function') {
cb(true);
}
},
loadContact:function(jsondata, bookid){
this.data = jsondata;
this.id = this.data.id;
this.bookid = bookid;
$('#rightcontent').data('id',this.id);
this.populateNameFields();
this.loadPhoto();
this.loadMails();
this.loadPhones();
this.loadIMs();
this.loadAddresses();
this.loadSingleProperties();
OC.Contacts.loadListHandlers();
var note = $('#note');
if(this.data.NOTE) {
note.data('checksum', this.data.NOTE[0]['checksum']);
var textarea = note.find('textarea');
var txt = this.data.NOTE[0]['value'];
var nheight = txt.split('\n').length > 4 ? txt.split('\n').length+2 : 5;
textarea.css('min-height', nheight+'em');
textarea.attr('rows', nheight);
textarea.val(txt);
$('#contact_note').show();
textarea.expandingTextarea();
$('#contacts_propertymenu_dropdown a[data-type="NOTE"]').parent().hide();
} else {
note.removeData('checksum');
note.find('textarea').val('');
$('#contact_note').hide();
$('#contacts_propertymenu_dropdown a[data-type="NOTE"]').parent().show();
}
var permissions = OC.Contacts.Card.permissions = parseInt(this.data.permissions);
//console.log('permissions', permissions);
this.setEnabled(permissions == 0
|| permissions & OC.PERMISSION_UPDATE
|| permissions & OC.PERMISSION_DELETE);
},
loadSingleProperties:function() {
var props = ['BDAY', 'NICKNAME', 'ORG', 'URL', 'CATEGORIES'];
// Clear all elements
$('#ident .propertycontainer').each(function(){
if(props.indexOf($(this).data('element')) > -1) {
$(this).data('checksum', '');
$(this).find('input').val('');
$(this).hide();
$(this).prev().hide();
}
});
for(var prop in props) {
var propname = props[prop];
if(this.data[propname] != undefined) {
$('#contacts_propertymenu_dropdown a[data-type="'+propname+'"]').parent().hide();
var property = this.data[propname][0];
var value = property['value'], checksum = property['checksum'];
if(propname == 'BDAY') {
var val = $.datepicker.parseDate('yy-mm-dd', value.substring(0, 10));
value = $.datepicker.formatDate('dd-mm-yy', val);
}
var identcontainer = $('#contact_identity');
identcontainer.find('#'+propname.toLowerCase()).val(value);
identcontainer.find('#'+propname.toLowerCase()+'_value').data('checksum', checksum);
identcontainer.find('#'+propname.toLowerCase()+'_label').show();
identcontainer.find('#'+propname.toLowerCase()+'_value').show();
} else {
$('#contacts_propertymenu_dropdown a[data-type="'+propname+'"]').parent().show();
}
}
},
populateNameFields:function() {
var props = ['FN', 'N'];
// Clear all elements
$('#ident .propertycontainer').each(function(){
if(props.indexOf($(this).data('element')) > -1) {
$(this).data('checksum', '');
$(this).find('input').val('');
}
});
with(this) {
delete fn; delete fullname; delete givname; delete famname;
delete addname; delete honpre; delete honsuf;
}
if(this.data.FN) {
this.fn = this.data.FN[0]['value'];
}
else {
this.fn = '';
}
if(this.data.N == undefined) {
narray = [this.fn,'','','','']; // Checking for non-existing 'N' property :-P
} else {
narray = this.data.N[0]['value'];
}
this.famname = narray[0] || '';
this.givname = narray[1] || '';
this.addname = narray[2] || '';
this.honpre = narray[3] || '';
this.honsuf = narray[4] || '';
if(this.honpre.length > 0) {
this.fullname += this.honpre + ' ';
}
if(this.givname.length > 0) {
this.fullname += ' ' + this.givname;
}
if(this.addname.length > 0) {
this.fullname += ' ' + this.addname;
}
if(this.famname.length > 0) {
this.fullname += ' ' + this.famname;
}
if(this.honsuf.length > 0) {
this.fullname += ', ' + this.honsuf;
}
$('#n').val(narray.join(';'));
$('#fn_select option').remove();
var names = [this.fn, this.fullname, this.givname + ' ' + this.famname, this.famname + ' ' + this.givname, this.famname + ', ' + this.givname];
if(this.data.ORG) {
names[names.length]=this.data.ORG[0].value;
}
$.each(names, function(key, value) {
$('#fn_select')
.append($('<option></option>')
.text(value));
});
$('#fn_select').combobox('value', this.fn);
$('#contact_identity').find('*[data-element="N"]').data('checksum', this.data.N[0]['checksum']);
if(this.data.FN) {
$('#contact_identity').find('*[data-element="FN"]').data('checksum', this.data.FN[0]['checksum']);
}
$('#contact_identity').show();
},
hasCategory:function(category) {
if(this.data.CATEGORIES) {
var categories = this.data.CATEGORIES[0]['value'].split(/,\s*/);
for(var c in categories) {
var cat = this.data.CATEGORIES[0]['value'][c];
if(typeof cat === 'string' && (cat.toUpperCase() === category.toUpperCase())) {
return true;
}
}
}
return false;
},
categoriesChanged:function(newcategories) { // Categories added/deleted.
categories = $.map(newcategories, function(v) {return v;});
$('#categories').multiple_autocomplete('option', 'source', categories);
var categorylist = $('#categories_value').find('input');
$.getJSON(OC.filePath('contacts', 'ajax', 'categories/categoriesfor.php'),{'id':OC.Contacts.Card.id},function(jsondata){
if(jsondata.status == 'success'){
$('#categories_value').data('checksum', jsondata.data.checksum);
categorylist.val(jsondata.data.value);
} else {
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
}
});
},
savePropertyInternal:function(name, fields, oldchecksum, checksum) {
// TODO: Add functionality for new fields.
//console.log('savePropertyInternal: ' + name + ', fields: ' + fields + 'checksum: ' + checksum);
//console.log('savePropertyInternal: ' + this.data[name]);
var multivalue = ['CATEGORIES'];
var params = {};
var value = multivalue.indexOf(name) != -1 ? new Array() : undefined;
jQuery.each(fields, function(i, field){
//.substring(11,'parameters[TYPE][]'.indexOf(']'))
if(field.name.substring(0, 5) === 'value') {
if(multivalue.indexOf(name) != -1) {
value.push(field.value);
} else {
value = field.value;
}
} else if(field.name.substring(0, 10) === 'parameters') {
var p = field.name.substring(11,'parameters[TYPE][]'.indexOf(']'));
if(!(p in params)) {
params[p] = [];
}
params[p].push(field.value);
}
});
for(var i in this.data[name]) {
if(this.data[name][i]['checksum'] == oldchecksum) {
this.data[name][i]['checksum'] = checksum;
this.data[name][i]['value'] = value;
this.data[name][i]['parameters'] = params;
}
}
},
saveProperty:function(obj) {
if(!$(obj).hasClass('contacts_property')) {
return false;
}
if($(obj).hasClass('nonempty') && $(obj).val().trim() == '') {
OC.dialogs.alert(t('contacts', 'This property has to be non-empty.'), t('contacts', 'Error'));
return false;
}
container = $(obj).parents('.propertycontainer').first(); // get the parent holding the metadata.
OC.Contacts.loading(obj, true);
var checksum = container.data('checksum');
var name = container.data('element');
var fields = container.find('input.contacts_property,select.contacts_property').serializeArray();
switch(name) {
case 'FN':
var nempty = true;
for(var i in OC.Contacts.Card.data.N[0]['value']) {
if(OC.Contacts.Card.data.N[0]['value'][i] != '') {
nempty = false;
break;
}
}
if(nempty) {
$('#n').val(fields[0].value + ';;;;');
OC.Contacts.Card.data.N[0]['value'] = Array(fields[0].value, '', '', '', '');
setTimeout(function() {OC.Contacts.Card.saveProperty($('#n'))}, 500);
}
break;
}
var q = container.find('input.contacts_property,select.contacts_property,textarea.contacts_property').serialize();
if(q == '' || q == undefined) {
OC.dialogs.alert(t('contacts', 'Couldn\'t serialize elements.'), t('contacts', 'Error'));
OC.Contacts.loading(obj, false);
return false;
}
q = q + '&id=' + this.id + '&name=' + name;
if(checksum != undefined && checksum != '') { // save
q = q + '&checksum=' + checksum;
//console.log('Saving: ' + q);
$(obj).attr('disabled', 'disabled');
$.post(OC.filePath('contacts', 'ajax', 'contact/saveproperty.php'),q,function(jsondata){
if(!jsondata) {
OC.dialogs.alert(t('contacts', 'Unknown error. Please check logs.'), t('contacts', 'Error'));
OC.Contacts.loading(obj, false);
$(obj).removeAttr('disabled');
OC.Contacts.Card.update({cid:OC.Contacts.Card.id});
return false;
}
if(jsondata.status == 'success'){
container.data('checksum', jsondata.data.checksum);
OC.Contacts.Card.savePropertyInternal(name, fields, checksum, jsondata.data.checksum);
OC.Contacts.loading(obj, false);
$(obj).removeAttr('disabled');
return true;
}
else{
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
OC.Contacts.loading(obj, false);
$(obj).removeAttr('disabled');
OC.Contacts.Card.update({cid:OC.Contacts.Card.id});
return false;
}
},'json');
} else { // add
//console.log('Adding: ' + q);
$(obj).attr('disabled', 'disabled');
$.post(OC.filePath('contacts', 'ajax', 'contact/addproperty.php'),q,function(jsondata){
if(jsondata.status == 'success'){
container.data('checksum', jsondata.data.checksum);
// TODO: savePropertyInternal doesn't know about new fields
//OC.Contacts.Card.savePropertyInternal(name, fields, checksum, jsondata.data.checksum);
OC.Contacts.loading(obj, false);
$(obj).removeAttr('disabled');
return true;
}
else{
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
OC.Contacts.loading(obj, false);
$(obj).removeAttr('disabled');
OC.Contacts.Card.update({cid:OC.Contacts.Card.id});
return false;
}
},'json');
}
},
addProperty:function(type) {
if(!this.enabled) {
return;
}
switch (type) {
case 'NOTE':
$('#contacts_propertymenu_dropdown a[data-type="'+type+'"]').parent().hide();
$('#note').find('textarea').expandingTextarea().show().focus();
$('#contact_note').show();
break;
case 'EMAIL':
if($('#emaillist>li').length == 1) {
$('#emails').show();
}
OC.Contacts.Card.addMail();
break;
case 'TEL':
if($('#phonelist>li').length == 1) {
$('#phones').show();
}
OC.Contacts.Card.addPhone();
break;
case 'IMPP':
if($('#imlist>li').length == 1) {
$('#ims').show();
}
OC.Contacts.Card.addIM();
break;
case 'ADR':
if($('addresses>dl').length == 1) {
$('#addresses').show();
}
OC.Contacts.Card.editAddress('new', true);
break;
case 'NICKNAME':
case 'URL':
case 'ORG':
case 'BDAY':
case 'CATEGORIES':
$('dl dt[data-element="'+type+'"],dd[data-element="'+type+'"]').show();
$('dd[data-element="'+type+'"]').find('input').focus();
$('#contacts_propertymenu_dropdown a[data-type="'+type+'"]').parent().hide();
break;
}
},
deleteProperty:function(obj, type) {
//console.log('deleteProperty');
if(!this.enabled) {
return;
}
OC.Contacts.loading(obj, true);
var checksum = OC.Contacts.checksumFor(obj);
if(checksum) {
$.post(OC.filePath('contacts', 'ajax', 'contact/deleteproperty.php'),{'id': this.id, 'checksum': checksum },function(jsondata){
if(jsondata.status == 'success'){
if(type == 'list') {
OC.Contacts.propertyContainerFor(obj).remove();
} else if(type == 'single') {
var proptype = OC.Contacts.propertyTypeFor(obj);
OC.Contacts.Card.data[proptype] = null;
var othertypes = ['NOTE', 'PHOTO'];
if(othertypes.indexOf(proptype) != -1) {
OC.Contacts.propertyContainerFor(obj).data('checksum', '');
if(proptype == 'PHOTO') {
OC.Contacts.Contacts.refreshThumbnail(OC.Contacts.Card.id);
OC.Contacts.Card.loadPhoto();
} else if(proptype == 'NOTE') {
$('#note').find('textarea').val('');
$('#contact_note').hide();
OC.Contacts.propertyContainerFor(obj).hide();
}
} else {
$('dl dt[data-element="'+proptype+'"],dd[data-element="'+proptype+'"]').hide();
$('dl dd[data-element="'+proptype+'"]').data('checksum', '').find('input').val('');
}
$('#contacts_propertymenu_dropdown a[data-type="'+proptype+'"]').parent().show();
OC.Contacts.loading(obj, false);
} else {
OC.dialogs.alert(t('contacts', '\'deleteProperty\' called without type argument. Please report at bugs.owncloud.org'), t('contacts', 'Error'));
OC.Contacts.loading(obj, false);
}
}
else{
OC.Contacts.loading(obj, false);
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
}
});
} else { // Property hasn't been saved so there's nothing to delete.
if(type == 'list') {
OC.Contacts.propertyContainerFor(obj).remove();
} else if(type == 'single') {
var proptype = OC.Contacts.propertyTypeFor(obj);
$('dl dt[data-element="'+proptype+'"],dd[data-element="'+proptype+'"]').hide();
$('#contacts_propertymenu_dropdown a[data-type="'+proptype+'"]').parent().show();
OC.Contacts.loading(obj, false);
} else {
OC.dialogs.alert(t('contacts', '\'deleteProperty\' called without type argument. Please report at bugs.owncloud.org'), t('contacts', 'Error'));
}
}
},
editName:function() {
if(!this.enabled) {
return;
}
var params = {id: this.id};
/* Initialize the name edit dialog */
if($('#edit_name_dialog').dialog('isOpen') == true) {
$('#edit_name_dialog').dialog('moveToTop');
} else {
$.getJSON(OC.filePath('contacts', 'ajax', 'editname.php'),{id: this.id},function(jsondata) {
if(jsondata.status == 'success') {
$('body').append('<div id="name_dialog"></div>');
$('#name_dialog').html(jsondata.data.page).find('#edit_name_dialog' ).dialog({
modal: true,
closeOnEscape: true,
title: t('contacts', 'Edit name'),
height: 'auto', width: 'auto',
buttons: {
'Ok':function() {
OC.Contacts.Card.saveName(this);
$(this).dialog('close');
},
'Cancel':function() { $(this).dialog('close'); }
},
close: function(event, ui) {
$(this).dialog('destroy').remove();
$('#name_dialog').remove();
},
open: function(event, ui) {
// load 'N' property - maybe :-P
}
});
} else {
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
}
});
}
},
saveName:function(dlg) {
if(!this.enabled) {
return;
}
//console.log('saveName, id: ' + this.id);
var n = new Array($(dlg).find('#fam').val().strip_tags(),$(dlg).find('#giv').val().strip_tags(),$(dlg).find('#add').val().strip_tags(),$(dlg).find('#pre').val().strip_tags(),$(dlg).find('#suf').val().strip_tags());
this.famname = n[0];
this.givname = n[1];
this.addname = n[2];
this.honpre = n[3];
this.honsuf = n[4];
this.fullname = '';
$('#n').val(n.join(';'));
if(n[3].length > 0) {
this.fullname = n[3] + ' ';
}
this.fullname += n[1] + ' ' + n[2] + ' ' + n[0];
if(n[4].length > 0) {
this.fullname += ', ' + n[4];
}
$('#fn_select option').remove();
//$('#fn_select').combobox('value', this.fn);
var tmp = [this.fullname, this.givname + ' ' + this.famname, this.famname + ' ' + this.givname, this.famname + ', ' + this.givname];
var names = new Array();
for(var name in tmp) {
if(names.indexOf(tmp[name]) == -1) {
names.push(tmp[name]);
}
}
$.each(names, function(key, value) {
$('#fn_select')
.append($('<option></option>')
.text(value));
});
if(this.id == '') {
var aid = $(dlg).find('#aid').val();
OC.Contacts.Card.add(n.join(';'), $('#short').text(), aid);
} else {
OC.Contacts.Card.saveProperty($('#n'));
}
},
loadAddresses:function() {
$('#addresses').hide();
$('#addresses dl.propertycontainer').remove();
var addresscontainer = $('#addresses');
for(var adr in this.data.ADR) {
addresscontainer.find('dl').first().clone().insertAfter($('#addresses dl').last()).show();
addresscontainer.find('dl').last().removeClass('template').addClass('propertycontainer');
addresscontainer.find('dl').last().data('checksum', this.data.ADR[adr]['checksum']);
var adrarray = this.data.ADR[adr]['value'];
var adrtxt = '';
if(adrarray[0] && adrarray[0].length > 0) {
adrtxt = adrtxt + '<li>' + adrarray[0].strip_tags() + '</li>';
}
if(adrarray[1] && adrarray[1].length > 0) {
adrtxt = adrtxt + '<li>' + adrarray[1].strip_tags() + '</li>';
}
if(adrarray[2] && adrarray[2].length > 0) {
adrtxt = adrtxt + '<li>' + adrarray[2].strip_tags() + '</li>';
}
if((3 in adrarray && 5 in adrarray) && adrarray[3].length > 0 || adrarray[5].length > 0) {
adrtxt = adrtxt + '<li>' + adrarray[5].strip_tags() + ' ' + adrarray[3].strip_tags() + '</li>';
}
if(adrarray[4] && adrarray[4].length > 0) {
adrtxt = adrtxt + '<li>' + adrarray[4].strip_tags() + '</li>';
}
if(adrarray[6] && adrarray[6].length > 0) {
adrtxt = adrtxt + '<li>' + adrarray[6].strip_tags() + '</li>';
}
addresscontainer.find('dl').last().find('.addresslist').html(adrtxt);
var types = new Array();
var ttypes = new Array();
for(var param in this.data.ADR[adr]['parameters']) {
if(param.toUpperCase() == 'TYPE') {
types.push(t('contacts', ucwords(this.data.ADR[adr]['parameters'][param].toLowerCase())));
ttypes.push(this.data.ADR[adr]['parameters'][param]);
}
}
addresscontainer.find('dl').last().find('.adr_type_label').text(types.join('/'));
addresscontainer.find('dl').last().find('.adr_type').val(ttypes.join(','));
addresscontainer.find('dl').last().find('.adr').val(adrarray.join(';'));
addresscontainer.find('dl').last().data('checksum', this.data.ADR[adr]['checksum']);
}
if(addresscontainer.find('dl').length > 1) {
$('#addresses').show();
}
return false;
},
editAddress:function(obj, isnew){
if(!this.enabled) {
return;
}
var container = undefined;
var params = {id: this.id};
if(obj === 'new') {
isnew = true;
$('#addresses dl').first().clone(true).insertAfter($('#addresses dl').last()).show();
container = $('#addresses dl').last();
container.removeClass('template').addClass('propertycontainer');
} else {
params['checksum'] = OC.Contacts.checksumFor(obj);
}
/* Initialize the address edit dialog */
if($('#edit_address_dialog').dialog('isOpen') == true){
$('#edit_address_dialog').dialog('moveToTop');
}else{
$.getJSON(OC.filePath('contacts', 'ajax', 'editaddress.php'),params,function(jsondata){
if(jsondata.status == 'success'){
$('body').append('<div id="address_dialog"></div>');
$('#address_dialog').html(jsondata.data.page).find('#edit_address_dialog' ).dialog({
height: 'auto', width: 'auto',
buttons: {
'Ok':function() {
if(isnew) {
OC.Contacts.Card.saveAddress(this, $('#addresses dl:last-child').find('input').first(), isnew);
} else {
OC.Contacts.Card.saveAddress(this, obj, isnew);
}
$(this).dialog('close');
},
'Cancel':function() {
$(this).dialog('close');
if(isnew) {
container.remove();
}
}
},
close : function(event, ui) {
$(this).dialog('destroy').remove();
$('#address_dialog').remove();
},
open : function(event, ui) {
$( "#adr_city" ).autocomplete({
source: function( request, response ) {
$.ajax({
url: "http://ws.geonames.org/searchJSON",
dataType: "jsonp",
data: {
featureClass: "P",
style: "full",
maxRows: 12,
lang: lang,
name_startsWith: request.term
},
success: function( data ) {
response( $.map( data.geonames, function( item ) {
return {
label: item.name + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName,
value: item.name,
country: item.countryName
}
}));
}
});
},
minLength: 2,
select: function( event, ui ) {
if(ui.item && $('#adr_country').val().trim().length == 0) {
$('#adr_country').val(ui.item.country);
}
},
open: function() {
$( this ).removeClass( "ui-corner-all" ).addClass( "ui-corner-top" );
},
close: function() {
$( this ).removeClass( "ui-corner-top" ).addClass( "ui-corner-all" );
}
});
$('#adr_country').autocomplete({
source: function( request, response ) {
$.ajax({
url: "http://ws.geonames.org/searchJSON",
dataType: "jsonp",
data: {
/*featureClass: "A",*/
featureCode: "PCLI",
/*countryBias: "true",*/
/*style: "full",*/
lang: lang,
maxRows: 12,
name_startsWith: request.term
},
success: function( data ) {
response( $.map( data.geonames, function( item ) {
return {
label: item.name,
value: item.name
}
}));
}
});
},
minLength: 2,
select: function( event, ui ) {
/*if(ui.item) {
$('#adr_country').val(ui.item.country);
}
log( ui.item ?
"Selected: " + ui.item.label :
"Nothing selected, input was " + this.value);*/
},
open: function() {
$( this ).removeClass( "ui-corner-all" ).addClass( "ui-corner-top" );
},
close: function() {
$( this ).removeClass( "ui-corner-top" ).addClass( "ui-corner-all" );
}
});
}
});
} else {
alert(jsondata.data.message);
}
});
}
},
saveAddress:function(dlg, obj, isnew){
if(!this.enabled) {
return;
}
if(isnew) {
container = $('#addresses dl').last();
obj = container.find('input').first();
} else {
checksum = OC.Contacts.checksumFor(obj);
container = OC.Contacts.propertyContainerFor(obj);
}
var adr = new Array(
$(dlg).find('#adr_pobox').val().strip_tags(),
$(dlg).find('#adr_extended').val().strip_tags(),
$(dlg).find('#adr_street').val().strip_tags(),
$(dlg).find('#adr_city').val().strip_tags(),
$(dlg).find('#adr_region').val().strip_tags(),
$(dlg).find('#adr_zipcode').val().strip_tags(),
$(dlg).find('#adr_country').val().strip_tags()
);
container.find('.adr').val(adr.join(';'));
container.find('.adr_type').val($(dlg).find('#adr_type').val());
container.find('.adr_type_label').html(t('contacts',ucwords($(dlg).find('#adr_type').val().toLowerCase())));
OC.Contacts.Card.saveProperty($(container).find('input').first());
var adrtxt = '';
if(adr[0].length > 0) {
adrtxt = adrtxt + '<li>' + adr[0] + '</li>';
}
if(adr[1].length > 0) {
adrtxt = adrtxt + '<li>' + adr[1] + '</li>';
}
if(adr[2].length > 0) {
adrtxt = adrtxt + '<li>' + adr[2] + '</li>';
}
if(adr[3].length > 0 || adr[5].length > 0) {
adrtxt = adrtxt + '<li>' + adr[5] + ' ' + adr[3] + '</li>';
}
if(adr[4].length > 0) {
adrtxt = adrtxt + '<li>' + adr[4] + '</li>';
}
if(adr[6].length > 0) {
adrtxt = adrtxt + '<li>' + adr[6] + '</li>';
}
container.find('.addresslist').html(adrtxt);
$('#addresses').show();
container.show();
},
uploadPhoto:function(filelist) {
if(!this.enabled) {
return;
}
if(!filelist) {
OC.dialogs.alert(t('contacts','No files selected for upload.'), t('contacts', 'Error'));
return;
}
var file = filelist[0];
var target = $('#file_upload_target');
var form = $('#file_upload_form');
var totalSize=0;
if(file.size > $('#max_upload').val()){
OC.dialogs.alert(t('contacts','The file you are trying to upload exceed the maximum size for file uploads on this server.'), t('contacts', 'Error'));
return;
} else {
target.load(function(){
var response=jQuery.parseJSON(target.contents().text());
if(response != undefined && response.status == 'success'){
OC.Contacts.Card.editPhoto(response.data.id, response.data.tmp);
//alert('File: ' + file.tmp + ' ' + file.name + ' ' + file.mime);
}else{
OC.dialogs.alert(response.data.message, t('contacts', 'Error'));
}
});
form.submit();
}
},
loadPhotoHandlers:function() {
var phototools = $('#phototools');
phototools.find('li a').tipsy('hide');
phototools.find('li a').tipsy();
if(this.data.PHOTO) {
phototools.find('.delete').click(function() {
$(this).tipsy('hide');
OC.Contacts.Card.deleteProperty($('#contacts_details_photo'), 'single');
$(this).hide();
});
phototools.find('.edit').click(function() {
$(this).tipsy('hide');
OC.Contacts.Card.editCurrentPhoto();
});
phototools.find('.delete').show();
phototools.find('.edit').show();
} else {
phototools.find('.delete').hide();
phototools.find('.edit').hide();
}
},
cloudPhotoSelected:function(path){
$.getJSON(OC.filePath('contacts', 'ajax', 'oc_photo.php'),{'path':path,'id':OC.Contacts.Card.id},function(jsondata){
if(jsondata.status == 'success'){
//alert(jsondata.data.page);
OC.Contacts.Card.editPhoto(jsondata.data.id, jsondata.data.tmp)
$('#edit_photo_dialog_img').html(jsondata.data.page);
}
else{
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
}
});
},
loadPhoto:function(){
var self = this;
var refreshstr = '&refresh='+Math.random();
$('#phototools li a').tipsy('hide');
var wrapper = $('#contacts_details_photo_wrapper');
wrapper.addClass('loading').addClass('wait');
delete this.photo;
this.photo = new Image();
$(this.photo).load(function () {
$('img.contacts_details_photo').remove()
$(this).addClass('contacts_details_photo');
wrapper.css('width', $(this).get(0).width + 10);
wrapper.removeClass('loading').removeClass('wait');
$(this).insertAfter($('#phototools')).fadeIn();
}).error(function () {
// notify the user that the image could not be loaded
OC.Contacts.notify({message:t('contacts','Error loading profile picture.')});
}).attr('src', OC.linkTo('contacts', 'photo.php')+'?id='+self.id+refreshstr);
this.loadPhotoHandlers()
},
editCurrentPhoto:function(){
if(!this.enabled) {
return;
}
$.getJSON(OC.filePath('contacts', 'ajax', 'currentphoto.php'),{'id':this.id},function(jsondata){
if(jsondata.status == 'success'){
//alert(jsondata.data.page);
OC.Contacts.Card.editPhoto(jsondata.data.id, jsondata.data.tmp)
$('#edit_photo_dialog_img').html(jsondata.data.page);
}
else{
wrapper.removeClass('wait');
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
}
});
},
editPhoto:function(id, tmpkey){
if(!this.enabled) {
return;
}
//alert('editPhoto: ' + tmpkey);
$.getJSON(OC.filePath('contacts', 'ajax', 'cropphoto.php'),{'tmpkey':tmpkey,'id':this.id, 'requesttoken':oc_requesttoken},function(jsondata){
if(jsondata.status == 'success'){
//alert(jsondata.data.page);
$('#edit_photo_dialog_img').html(jsondata.data.page);
}
else{
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
}
});
if($('#edit_photo_dialog').dialog('isOpen') == true){
$('#edit_photo_dialog').dialog('moveToTop');
} else {
$('#edit_photo_dialog').dialog('open');
}
},
savePhoto:function() {
if(!this.enabled) {
return;
}
var target = $('#crop_target');
var form = $('#cropform');
var wrapper = $('#contacts_details_photo_wrapper');
var self = this;
wrapper.addClass('wait');
form.submit();
target.load(function(){
var response=jQuery.parseJSON(target.contents().text());
if(response != undefined && response.status == 'success'){
// load cropped photo.
self.loadPhoto();
OC.Contacts.Card.data.PHOTO = true;
}else{
OC.dialogs.alert(response.data.message, t('contacts', 'Error'));
wrapper.removeClass('wait');
}
});
OC.Contacts.Contacts.refreshThumbnail(this.id);
},
addIM:function() {
//alert('addMail');
var imlist = $('#imlist');
imlist.find('li.template:first-child').clone(true).appendTo(imlist).show().find('a .tip').tipsy();
imlist.find('li.template:last-child').find('select').addClass('contacts_property');
imlist.find('li.template:last-child').removeClass('template').addClass('propertycontainer');
imlist.find('li:last-child').find('input[type="text"]').focus();
return false;
},
loadIMs:function() {
//console.log('loadIMs');
$('#ims').hide();
$('#imlist li.propertycontainer').remove();
var imlist = $('#imlist');
for(var im in this.data.IMPP) {
this.addIM();
var curim = imlist.find('li.propertycontainer:last-child');
if(typeof this.data.IMPP[im].label != 'undefined') {
curim.prepend('<label class="xab">'+this.data.IMPP[im].label+'</label>');
}
curim.data('checksum', this.data.IMPP[im]['checksum'])
curim.find('input[type="text"]').val(this.data.IMPP[im]['value'].split(':').pop());
for(var param in this.data.IMPP[im]['parameters']) {
if(param.toUpperCase() == 'PREF') {
curim.find('input[type="checkbox"]').attr('checked', 'checked')
}
else if(param.toUpperCase() == 'TYPE') {
if(typeof this.data.IMPP[im]['parameters'][param] == 'string') {
var found = false;
var imt = this.data.IMPP[im]['parameters'][param];
curim.find('select.types option').each(function(){
if($(this).val().toUpperCase() == imt.toUpperCase()) {
$(this).attr('selected', 'selected');
found = true;
}
});
if(!found) {
curim.find('select.type option:last-child').after('<option value="'+imt+'" selected="selected">'+imt+'</option>');
}
} else if(typeof this.data.IMPP[im]['parameters'][param] == 'object') {
for(imtype in this.data.IMPP[im]['parameters'][param]) {
var found = false;
var imt = this.data.IMPP[im]['parameters'][param][imtype];
curim.find('select.types option').each(function(){
if($(this).val().toUpperCase() == imt.toUpperCase().split(',')) {
$(this).attr('selected', 'selected');
found = true;
}
});
if(!found) {
curim.find('select.type option:last-child').after('<option value="'+imt+'" selected="selected">'+imt+'</option>');
}
}
}
}
else if(param.toUpperCase() == 'X-SERVICE-TYPE') {
curim.find('select.impp').val(this.data.IMPP[im]['parameters'][param].toLowerCase());
}
}
}
if($('#imlist li').length > 1) {
$('#ims').show();
}
return false;
},
addMail:function() {
var emaillist = $('#emaillist');
emaillist.find('li.template:first-child').clone(true).appendTo(emaillist).show().find('a .tip').tipsy();
emaillist.find('li.template:last-child').find('select').addClass('contacts_property');
emaillist.find('li.template:last-child').removeClass('template').addClass('propertycontainer');
var current = emaillist.find('li.propertycontainer:last-child');
current.find('input[type="email"]').focus();
current.find('select').multiselect({
noneSelectedText: t('contacts', 'Select type'),
header: false,
selectedList: 4,
classes: 'typelist'
});
current.find('a.mail').click(function() { OC.Contacts.mailTo(this) });
current.find('a.mail').keydown(function() { OC.Contacts.mailTo(this) });
return false;
},
loadMails:function() {
$('#emails').hide();
$('#emaillist li.propertycontainer').remove();
var emaillist = $('#emaillist');
for(var mail in this.data.EMAIL) {
this.addMail();
emaillist.find('li:last-child').find('select').multiselect('destroy');
var curemail = emaillist.find('li.propertycontainer:last-child');
if(typeof this.data.EMAIL[mail].label != 'undefined') {
curemail.prepend('<label class="xab">'+this.data.EMAIL[mail].label+'</label>');
}
curemail.data('checksum', this.data.EMAIL[mail]['checksum'])
curemail.find('input[type="email"]').val(this.data.EMAIL[mail]['value']);
for(var param in this.data.EMAIL[mail]['parameters']) {
if(param.toUpperCase() == 'PREF') {
curemail.find('input[type="checkbox"]').attr('checked', 'checked')
}
else if(param.toUpperCase() == 'TYPE') {
for(etype in this.data.EMAIL[mail]['parameters'][param]) {
var found = false;
var et = this.data.EMAIL[mail]['parameters'][param][etype];
curemail.find('select option').each(function(){
if($.inArray($(this).val().toUpperCase(), et.toUpperCase().split(',')) > -1) {
$(this).attr('selected', 'selected');
found = true;
}
});
if(!found) {
curemail.find('select option:last-child').after('<option value="'+et+'" selected="selected">'+et+'</option>');
}
}
}
}
curemail.find('select').multiselect({
noneSelectedText: t('contacts', 'Select type'),
header: false,
selectedList: 4,
classes: 'typelist'
});
}
if($('#emaillist li').length > 1) {
$('#emails').show();
}
$('#emaillist li:last-child').find('input[type="text"]').focus();
return false;
},
addPhone:function() {
var phonelist = $('#phonelist');
phonelist.find('li.template:first-child').clone(true).appendTo(phonelist); //.show();
phonelist.find('li.template:last-child').find('select').addClass('contacts_property');
phonelist.find('li.template:last-child').removeClass('template').addClass('propertycontainer');
phonelist.find('li:last-child').find('input[type="text"]').focus();
phonelist.find('li:last-child').find('select').multiselect({
noneSelectedText: t('contacts', 'Select type'),
header: false,
selectedList: 4,
classes: 'typelist'
});
phonelist.find('li:last-child').show();
return false;
},
loadPhones:function() {
$('#phones').hide();
$('#phonelist li.propertycontainer').remove();
var phonelist = $('#phonelist');
for(var phone in this.data.TEL) {
this.addPhone();
var curphone = phonelist.find('li.propertycontainer:last-child');
if(typeof this.data.TEL[phone].label != 'undefined') {
curphone.prepend('<label class="xab">'+this.data.TEL[phone].label+'</label>');
}
curphone.find('select').multiselect('destroy');
curphone.data('checksum', this.data.TEL[phone]['checksum'])
curphone.find('input[type="text"]').val(this.data.TEL[phone]['value']);
for(var param in this.data.TEL[phone]['parameters']) {
if(param.toUpperCase() == 'PREF') {
curphone.find('input[type="checkbox"]').attr('checked', 'checked');
}
else if(param.toUpperCase() == 'TYPE') {
for(ptype in this.data.TEL[phone]['parameters'][param]) {
var found = false;
var pt = this.data.TEL[phone]['parameters'][param][ptype];
curphone.find('select option').each(function() {
//if ($(this).val().toUpperCase() == pt.toUpperCase()) {
if ($.inArray($(this).val().toUpperCase(), pt.toUpperCase().split(',')) > -1) {
$(this).attr('selected', 'selected');
found = true;
}
});
if(!found) {
curphone.find('select option:last-child').after('<option class="custom" value="'+pt+'" selected="selected">'+pt+'</option>');
}
}
}
}
curphone.find('select').multiselect({
noneSelectedText: t('contacts', 'Select type'),
header: false,
selectedList: 4,
classes: 'typelist'
});
}
if(phonelist.find('li').length > 1) {
$('#phones').show();
}
return false;
},
},
Contacts:{
contacts:{},
deletionQueue:[],
batchnum:50,
warnNotDeleted:function(e) {
e = e || window.event;
var warn = t('contacts', 'Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted.');
if (e) {
e.returnValue = String(warn);
}
if(OC.Contacts.Contacts.deletionQueue.length > 0) {
setTimeout(OC.Contacts.Contacts.deleteFilesInQueue, 1);
}
return warn;
},
deleteFilesInQueue:function() {
var queue = OC.Contacts.Contacts.deletionQueue;
if(queue.length > 0) {
OC.Contacts.notify({cancel:true});
while(queue.length > 0) {
var id = queue.pop();
if(id) {
OC.Contacts.Card.doDelete(id, false);
}
}
}
},
getContact:function(id) {
if(!this.contacts[id]) {
this.contacts[id] = $('#contacts li[data-id="'+id+'"]');
if(!this.contacts[id]) {
self = this;
$.getJSON(OC.filePath('contacts', 'ajax', 'contactdetails.php'),{'id':id},function(jsondata){
if(jsondata.status == 'success'){
self.contacts[id] = self.insertContact({data:jsondata.data});
}
else{
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
}
});
}
}
return this.contacts[id];
},
drop:function(event, ui) {
var dragitem = ui.draggable, droptarget = $(this);
if(dragitem.is('li')) {
OC.Contacts.Contacts.dropContact(event, dragitem, droptarget);
} else {
OC.Contacts.Contacts.dropAddressbook(event, dragitem, droptarget);
}
},
dropContact:function(event, dragitem, droptarget) {
if(dragitem.data('bookid') == droptarget.data('id')) {
return false;
}
var droplist = (droptarget.is('ul')) ? droptarget : droptarget.next();
$.post(OC.filePath('contacts', 'ajax', 'contact/move.php'),
{
id: dragitem.data('id'),
aid: droptarget.data('id')
},
function(jsondata){
if(jsondata.status == 'success'){
dragitem.attr('data-bookid', droptarget.data('id'))
dragitem.data('bookid', droptarget.data('id'));
OC.Contacts.Contacts.insertContact({
contactlist:droplist,
contact:dragitem.detach()
});
OC.Contacts.Contacts.scrollTo(dragitem.data('id'));
} else {
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
}
});
},
dropAddressbook:function(event, dragitem, droptarget) {
if(confirm(t('contacts', 'Do you want to merge these address books?'))) {
if(dragitem.data('bookid') == droptarget.data('id')) {
return false;
}
var droplist = (droptarget.is('ul')) ? droptarget : droptarget.next();
$.post(OC.filePath('contacts', 'ajax', 'contact/move.php'),
{
id: dragitem.data('id'),
aid: droptarget.data('id'),
isaddressbook: 1
},
function(jsondata){
if(jsondata.status == 'success'){
OC.Contacts.Contacts.update(); // Easier to refresh the whole bunch.
} else {
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
}
});
} else {
return false;
}
},
/**
* @params params An object with the properties 'contactlist':a jquery object of the ul to insert into,
* 'contacts':a jquery object of all items in the list and either 'data': an object with the properties
* id, addressbookid and displayname or 'contact': a listitem to be inserted directly.
* If 'contactlist' or 'contacts' aren't defined they will be search for based in the properties in 'data'.
*/
insertContact:function(params) {
var id, bookid;
if(!params.contactlist) {
// FIXME: Check if contact really exists.
bookid = params.data ? params.data.addressbookid : params.contact.data('bookid');
id = params.data ? params.data.id : params.contact.data('id');
params.contactlist = $('#contacts ul[data-id="'+bookid+'"]');
}
if(!params.contacts) {
bookid = params.data ? params.data.addressbookid : params.contact.data('bookid');
id = params.data ? params.data.id : params.contact.data('id');
params.contacts = $('#contacts ul[data-id="'+bookid+'"] li');
}
var contact = params.data
? $('<li data-id="'+params.data.id+'" data-bookid="'+params.data.addressbookid
+ '" role="button"><a href="'+OC.linkTo('contacts', 'index.php')+'?id='
+ params.data.id+'" style="background: url('+OC.filePath('contacts', '', 'thumbnail.php')
+ '?id='+params.data.id+') no-repeat scroll 0% 0% transparent;">'
+ params.data.displayname+'</a></li>')
: params.contact;
var added = false;
var name = params.data ? params.data.displayname.toLowerCase() : contact.find('a').text().toLowerCase();
if(params.contacts) {
params.contacts.each(function() {
if ($(this).text().toLowerCase().localeCompare(name) > 0) {
$(this).before(contact);
added = true;
return false;
}
});
}
if(!added || !params.contacts) {
params.contactlist.append(contact);
}
//this.contacts[id] = contact;
return contact;
},
addAddressbook:function(name, description, cb) {
$.post(OC.filePath('contacts', 'ajax/addressbook', 'add.php'), { name: name, description: description, active: true },
function(jsondata) {
if(jsondata.status == 'success'){
if(cb && typeof cb == 'function') {
cb(jsondata.data.addressbook);
}
} else {
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
return false;
}
});
},
doImport:function(file, aid, cb) {
$.post(OC.filePath('contacts', '', 'import.php'), { id: aid, file: file, fstype: 'OC_FilesystemView' },
function(jsondata) {
if(jsondata.status != 'success'){
OC.Contacts.notify({message:jsondata.data.message});
}
if(typeof cb == 'function') {
cb();
}
});
return false;
},
next:function(reverse) {
var curlistitem = this.getContact(OC.Contacts.Card.id);
var newlistitem = reverse ? curlistitem.prev('li') : curlistitem.next('li');
if(newlistitem) {
curlistitem.removeClass('active');
OC.Contacts.Card.update({
cid:newlistitem.data('id'),
aid:newlistitem.data('bookid')
});
}
},
previous:function() {
this.next(true);
},
nextAddressbook:function(reverse) {
//console.log('nextAddressbook', reverse);
var curlistitem = this.getContact(OC.Contacts.Card.id);
var parent = curlistitem.parent('ul');
var newparent = reverse
? parent.prevAll('ul').first()
: parent.nextAll('ul').first();
if(newparent) {
newlistitem = newparent.find('li:first-child');
if(newlistitem) {
parent.slideUp().prev('h3').removeClass('active');
newparent.slideDown().prev('h3').addClass('active');
curlistitem.removeClass('active');
OC.Contacts.Card.update({
cid:newlistitem.data('id'),
aid:newlistitem.data('bookid')
});
}
}
},
previousAddressbook:function() {
//console.log('previousAddressbook');
this.nextAddressbook(true);
},
// Reload the contacts list.
update:function(params){
if(!params) { params = {}; }
if(!params.start) {
if(params.aid) {
$('#contacts h3[data-id="'+params.aid+'"],#contacts ul[data-id="'+params.aid+'"]').remove();
} else {
$('#contacts').empty();
}
}
self = this;
//console.log('update: ' + params.cid + ' ' + params.aid + ' ' + params.start);
var firstrun = false;
var opts = {};
opts['startat'] = (params.start?params.start:0);
if(params.aid) {
opts['aid'] = params.aid;
}
$.getJSON(OC.filePath('contacts', 'ajax', 'contact/list.php'),opts,function(jsondata){
if(jsondata.status == 'success'){
var books = jsondata.data.entries;
$.each(books, function(b, book) {
if($('#contacts h3[data-id="'+b+'"]').length == 0) {
firstrun = true;
var sharedindicator = book.owner == OC.currentUser ? ''
: '<img class="shared svg" src="'+OC.imagePath('core', 'actions/shared')+'" title="'+t('contacts', 'Shared by ')+book.owner+'" />'
if($('#contacts h3').length == 0) {
$('#contacts').html('<h3 class="addressbook" data-id="'
+ b + '" data-permissions="' + book.permissions + '">' + book.displayname
+ sharedindicator + '</h3><ul class="contacts hidden" data-id="'+b+'" data-permissions="'
+ book.permissions + '"></ul>');
} else {
if(!$('#contacts h3[data-id="' + b + '"]').length) {
var item = $('<h3 class="addressbook" data-id="'
+ b + '" data-permissions="' + book.permissions + '">'
+ book.displayname+sharedindicator+'</h3><ul class="contacts hidden" data-id="' + b
+ '" data-permissions="' + book.permissions + '"></ul>');
var added = false;
$('#contacts h3').each(function(){
if ($(this).text().toLowerCase().localeCompare(book.displayname.toLowerCase()) > 0) {
$(this).before(item).fadeIn('fast');
added = true;
return false;
}
});
if(!added) {
$('#contacts').append(item);
}
}
}
$('#contacts h3[data-id="'+b+'"]').on('click', function(event) {
$('#contacts h3').removeClass('active');
$(this).addClass('active');
$('#contacts ul[data-id="'+b+'"]').slideToggle(300);
return false;
});
var accept = 'li:not([data-bookid="'+b+'"]),h3:not([data-id="'+b+'"])';
$('#contacts h3[data-id="'+b+'"],#contacts ul[data-id="'+b+'"]').droppable({
drop: OC.Contacts.Contacts.drop,
activeClass: 'ui-state-hover',
accept: accept
});
}
var contactlist = $('#contacts ul[data-id="'+b+'"]');
var contacts = $('#contacts ul[data-id="'+b+'"] li');
for(var c in book.contacts) {
if(book.contacts[c].id == undefined) { continue; }
if(!$('#contacts li[data-id="'+book.contacts[c]['id']+'"]').length) {
var contact = OC.Contacts.Contacts.insertContact({contactlist:contactlist, contacts:contacts, data:book.contacts[c]});
if(c == self.batchnum-10) {
contact.bind('inview', function(event, isInView, visiblePartX, visiblePartY) {
$(this).unbind(event);
var bookid = $(this).data('bookid');
var numsiblings = $('.contacts li[data-bookid="'+bookid+'"]').length;
if (isInView && numsiblings >= self.batchnum) {
//console.log('This would be a good time to load more contacts.');
OC.Contacts.Contacts.update({cid:params.cid, aid:bookid, start:$('#contacts li[data-bookid="'+bookid+'"]').length});
}
});
}
}
}
});
$('#contacts h3 img.shared').tipsy()
if($('#contacts h3').length > 1) {
$('#contacts li,#contacts h3').draggable({
distance: 10,
revert: 'invalid',
axis: 'y', containment: '#contacts',
scroll: true, scrollSensitivity: 40,
opacity: 0.7, helper: 'clone'
});
} else {
$('#contacts h3').first().addClass('active');
}
if(opts['startat'] == 0) { // only update card on first load.
OC.Contacts.Card.update(params);
}
} else {
OC.Contacts.notify({message:t('contacts', 'Error')+': '+jsondata.data.message});
}
});
},
refreshThumbnail:function(id){
var item = $('.contacts li[data-id="'+id+'"]').find('a');
item.html(OC.Contacts.Card.fn);
item.css('background','url('+OC.filePath('contacts', '', 'thumbnail.php')+'?id='+id+'&refresh=1'+Math.random()+') no-repeat');
},
scrollTo:function(id){
var item = $('#contacts li[data-id="'+id+'"]');
if(item && $.isNumeric(item.offset().top)) {
//console.log('scrollTo ' + parseInt(item.offset().top));
$('#contacts').animate({
scrollTop: parseInt(item.offset()).top-40}, 'slow','swing');
}
}
}*/
}
}
$(document).ready(function(){
OCCategories.changed = OC.Contacts.Card.categoriesChanged;
OCCategories.app = 'contacts';
var ninjahelp = $('#ninjahelp');
$('#bottomcontrols .settings').on('click keydown', function() {
try {
ninjahelp.hide();
OC.appSettings({appid:'contacts', loadJS:true, cache:false});
} catch(e) {
console.log('error:', e.message);
Contact.prototype.addProperty = function($option, name) {
console.log('Contact.addProperty', name)
switch(name) {
case 'NICKNAME':
case 'TITLE':
case 'ORG':
case 'BDAY':
case 'NOTE':
this.$fullelem.find('[data-element="' + name.toLowerCase() + '"]').addClass('new').show();
$option.prop('disabled', true);
break;
case 'TEL':
case 'URL':
case 'EMAIL':
var $elem = this.renderStandardProperty(name.toLowerCase());
var $list = this.$fullelem.find('ul.' + name.toLowerCase());
$list.show();
$list.append($elem);
$elem.find('input.value').addClass('new');
break;
case 'ADR':
var $elem = this.renderAddressProperty();
var $list = this.$fullelem.find('ul.' + name.toLowerCase());
$list.show();
$list.append($elem);
$elem.find('.display').trigger('click');
$elem.find('input.value').addClass('new');
break;
case 'IMPP':
var $elem = this.renderIMProperty();
var $list = this.$fullelem.find('ul.' + name.toLowerCase());
$list.show();
$list.append($elem);
$elem.find('input.value').addClass('new');
break;
}
});
$('#bottomcontrols .import').click(function() {
$('#import_upload_start').trigger('click');
});
$('#contacts_newcontact').on('click keydown', OC.Contacts.Card.editNew);
$elem.find('select.type[name="parameters[TYPE][]"]')
.combobox({
singleclick: true,
classes: ['propertytype', 'float', 'label'],
});
}
ninjahelp.find('.close').on('click keydown',function() {
ninjahelp.hide();
});
$(document).on('keyup', function(event) {
if(event.target.nodeName.toUpperCase() != 'BODY'
|| $('#contacts li').length == 0
|| !OC.Contacts.Card.id) {
Contact.prototype.deleteProperty = function(params) {
var obj = params.obj;
if(!this.enabled) {
return;
}
//console.log(event.which + ' ' + event.target.nodeName);
/**
* To add:
* Shift-a: add addressbook
* u (85): hide/show leftcontent
* f (70): add field
*/
switch(event.which) {
case 27: // Esc
ninjahelp.hide();
break;
case 46: // Delete
if(event.shiftKey) {
OC.Contacts.Card.delayedDelete();
}
break;
case 40: // down
case 74: // j
OC.Contacts.Contacts.next();
break;
case 65: // a
if(event.shiftKey) {
// add addressbook
OC.Contacts.notImplemented();
break;
}
OC.Contacts.Card.editNew();
break;
case 38: // up
case 75: // k
OC.Contacts.Contacts.previous();
break;
case 34: // PageDown
case 78: // n
// next addressbook
OC.Contacts.Contacts.nextAddressbook();
break;
case 79: // o
var aid = $('#contacts h3.active').first().data('id');
if(aid) {
$('#contacts ul[data-id="'+aid+'"]').slideToggle(300);
}
break;
case 33: // PageUp
case 80: // p
// prev addressbook
OC.Contacts.Contacts.previousAddressbook();
break;
case 82: // r
OC.Contacts.Contacts.update({cid:OC.Contacts.Card.id});
break;
case 63: // ? German.
if(event.shiftKey) {
ninjahelp.toggle('fast');
}
break;
case 171: // ? Danish
case 191: // ? Standard qwerty
ninjahelp.toggle('fast');
break;
var element = this.propertyTypeFor(obj);
var $container = this.propertyContainerFor(obj);
console.log('Contact.deleteProperty, element', element, $container);
var params = {
name: element,
id: this.id
};
if(this.multi_properties.indexOf(element) !== -1) {
params['checksum'] = this.checksumFor(obj);
if(params['checksum'] === 'new' && this.valueFor(obj).trim() === '') {
$container.remove();
return;
}
}
this.setAsSaving(obj, true);
var self = this;
$.post(OC.filePath('contacts', 'ajax', 'contact/deleteproperty.php'), params, function(jsondata) {
if(!jsondata) {
$(document).trigger('status.contact.error', {
status: 'error',
message: t('contacts', 'Network or server error. Please inform administrator.'),
});
self.setAsSaving(obj, false);
return false;
}
if(jsondata.status == 'success') {
// TODO: Test if removing from internal data structure works
if(self.multi_properties.indexOf(element) !== -1) {
// First find out if an existing element by looking for checksum
var checksum = self.checksumFor(obj);
if(checksum) {
for(var i in self.data[element]) {
if(self.data[element][i].checksum === checksum) {
// Found it
self.data[element].splice(self.data[element].indexOf(self.data[element][i]), 1);
break;
}
}
}
$container.remove();
} else {
self.setAsSaving(obj, false);
self.$fullelem.find('[data-element="' + element.toLowerCase() + '"]').hide();
$container.find('input.value').val('');
self.$addMenu.find('option[value="' + element.toUpperCase() + '"]').prop('disabled', false);
}
return true;
} else {
$(document).trigger('status.contact.error', {
status: 'error',
message: jsondata.data.message,
});
self.setAsSaving(obj, false);
return false;
}
},'json');
}
});
//$(window).on('beforeunload', OC.Contacts.Contacts.deleteFilesInQueue);
// Load a contact.
$('.contacts').keydown(function(event) {
if(event.which == 13 || event.which == 32) {
$('.contacts').click();
/**
* @brief Act on change of a property.
* If this is a new contact it will first be saved to the datastore and a
* new datastructure will be added to the object. FIXME: Not implemented yet.
* If the obj argument is not provided 'name' and 'value' MUST be provided
* and this is only allowed for single elements like N, FN, CATEGORIES.
* @param obj. The form form field that has changed.
* @param name. The optional name of the element.
* @param value. The optional value.
*/
Contact.prototype.saveProperty = function(params) {
console.log('Contact.saveProperty', params);
if(!this.id) {
var self = this;
this.add({isnew:true}, function(response) {
if(!response || response.status === 'error') {
console.warn('No response object');
return false;
}
self.saveProperty(params);
self.showActions(['close', 'add', 'export', 'delete']);
});
return;
}
});
$(document).on('click', '#contacts', function(event){
var $tgt = $(event.target);
if ($tgt.is('li') || $tgt.is('a')) {
var item = $tgt.is('li')?$($tgt):($tgt).parent();
var id = item.data('id');
var bookid = item.data('bookid');
item.addClass('active');
var oldid = $('#rightcontent').data('id');
if(oldid != 0){
var olditem = $('.contacts li[data-id="'+oldid+'"]');
var oldbookid = olditem.data('bookid');
olditem.removeClass('active');
if(oldbookid != bookid) {
$('#contacts h3[data-id="'+oldbookid+'"]').removeClass('active');
$('#contacts h3[data-id="'+bookid+'"]').addClass('active');
var obj = null;
var element = null;
var q = '';
if(params.obj) {
obj = params.obj;
q = this.queryStringFor(obj);
element = this.propertyTypeFor(obj);
} else {
element = params.name;
var value = utils.isArray(params.value)
? $.param(params.value)
: encodeURIComponent(params.value);
q = 'id=' + this.id + '&value=' + value + '&name=' + element;
}
console.log('q', q);
var self = this;
this.setAsSaving(obj, true);
$.post(OC.filePath('contacts', 'ajax', 'contact/saveproperty.php'), q, function(jsondata){
if(!jsondata) {
$(document).trigger('status.contact.error', {
status: 'error',
message: t('contacts', 'Network or server error. Please inform administrator.'),
});
$(obj).addClass('error');
self.setAsSaving(obj, false);
return false;
}
if(jsondata.status == 'success') {
if(!self.data[element]) {
self.data[element] = [];
}
if(self.multi_properties.indexOf(element) !== -1) {
// First find out if an existing element by looking for checksum
var checksum = self.checksumFor(obj);
if(checksum) {
for(var i in self.data[element]) {
if(self.data[element][i].checksum === checksum) {
self.data[element][i] = {
name: element,
value: self.valueFor(obj),
parameters: self.parametersFor(obj),
checksum: jsondata.data.checksum,
}
break;
}
}
} else {
$(obj).removeClass('new');
self.data[element].push({
name: element,
value: self.valueFor(obj),
parameters: self.parametersFor(obj),
checksum: jsondata.data.checksum,
});
}
self.propertyContainerFor(obj).data('checksum', jsondata.data.checksum);
} else {
// Save value and parameters internally
var value = obj ? self.valueFor(obj) : params.value;
switch(element) {
case 'CATEGORIES':
// We deal with this in addToGroup()
break;
case 'FN':
if(!self.data.FN || !self.data.FN.length) {
self.data.FN = [{name:'FN', value:'', parameters:[]}]
}
self.data.FN[0]['value'] = value;
// Update the list element
self.$listelem.find('.nametext').text(value);
var nempty = true;
if(!self.data.N) {
// TODO: Maybe add a method for constructing new elements?
self.data.N = [{name:'N',value:['', '', '', '', ''],parameters:[]}];
}
$.each(self.data.N[0]['value'], function(idx, val) {
if(val) {
nempty = false;
return false;
}
});
if(nempty) {
self.data.N[0]['value'] = ['', '', '', '', ''];
var nvalue = value.split(' ');
// Very basic western style parsing. I'm not gonna implement
// https://github.com/android/platform_packages_providers_contactsprovider/blob/master/src/com/android/providers/contacts/NameSplitter.java ;)
self.data.N[0]['value'][0] = nvalue.length > 2 && nvalue.slice(nvalue.length-1).toString() || nvalue[1] || '';
self.data.N[0]['value'][1] = nvalue[0] || '';
self.data.N[0]['value'][2] = nvalue.length > 2 && nvalue.slice(1, nvalue.length-1).join(' ') || '';
setTimeout(function() {
// TODO: Hint to user to check if name is properly formatted
//console.log('auto creating N', self.data.N[0].value)
self.saveProperty({name:'N', value:self.data.N[0].value.join(';')});
setTimeout(function() {
self.$fullelem.find('.fullname').next('.action.edit').trigger('click');
OC.notify({message:t('contacts', 'Is this correct?')});
}
, 1000);
}
, 500);
}
$(document).trigger('status.contact.renamed', {
id: self.id,
contact: self,
});
break;
case 'N':
if(!utils.isArray(value)) {
value = value.split(';');
// Then it is auto-generated from FN.
var $nelems = self.$fullelem.find('.n.editor input');
$.each(value, function(idx, val) {
self.$fullelem.find('#n_' + idx).val(val);
});
}
case 'NICKNAME':
case 'BDAY':
case 'ORG':
case 'TITLE':
case 'NOTE':
self.data[element][0] = {
name: element,
value: value,
parameters: self.parametersFor(obj),
checksum: jsondata.data.checksum,
};
break;
default:
break;
}
}
self.setAsSaving(obj, false);
return true;
} else {
$(document).trigger('status.contact.error', {
status: 'error',
message: jsondata.data.message,
});
self.setAsSaving(obj, false);
return false;
}
},'json');
}
/**
* Hide contact list element.
*/
Contact.prototype.hide = function() {
this.getListItemElement().hide();
}
/**
* Remove any open contact from the DOM.
*/
Contact.prototype.close = function() {
console.log('Contact.close', this);
if(this.$fullelem) {
this.$fullelem.remove();
return true;
} else {
return false;
}
}
/**
* Remove any open contact from the DOM and detach it's list
* element from the DOM.
* @returns The contact object.
*/
Contact.prototype.detach = function() {
if(this.$fullelem) {
this.$fullelem.remove();
}
if(this.$listelem) {
this.$listelem.detach();
return this;
}
}
/**
* Set a contacts list element as (un)checked
* @returns The contact object.
*/
Contact.prototype.setChecked = function(checked) {
if(this.$listelem) {
this.$listelem.find('input:checkbox').prop('checked', checked);
return this;
}
}
/**
* Set a contact to en/disabled depending on its permissions.
* @param boolean enabled
*/
Contact.prototype.setEnabled = function(enabled) {
if(enabled) {
this.$fullelem.find('#addproperty').show();
} else {
this.$fullelem.find('#addproperty').hide();
}
this.enabled = enabled;
this.$fullelem.find('.value,.action,.parameter').each(function () {
$(this).prop('disabled', !enabled);
});
$(document).trigger('status.contact.enabled', enabled);
}
/**
* Add a contact from data store and remove it from the DOM
* @params params. An object which can contain the optional properties:
* aid: The id of the addressbook to add the contact to. Per default it will be added to the first.
* fn: The formatted name of the contact.
* @param cb Optional callback function which
* @returns The callback gets an object as argument with a variable 'status' of either 'success'
* or 'error'. On success the 'data' property of that object contains the contact id as 'id', the
* addressbook id as 'aid' and the contact data structure as 'details'.
*/
Contact.prototype.add = function(params, cb) {
var self = this;
$.post(OC.filePath('contacts', 'ajax', 'contact/add.php'),
params, function(jsondata) {
if(!jsondata) {
$(document).trigger('status.contact.error', {
status: 'error',
message: t('contacts', 'Network or server error. Please inform administrator.'),
});
return false;
}
if(jsondata.status === 'success') {
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,
});
}
if(typeof cb == 'function') {
cb(jsondata);
}
});
}
/**
* Delete contact from data store and remove it from the DOM
* @param cb Optional callback function which
* @returns An object with a variable 'status' of either success
* or 'error'
*/
Contact.prototype.destroy = function(cb) {
var self = this;
$.post(OC.filePath('contacts', 'ajax', 'contact/delete.php'),
{id: this.id}, function(jsondata) {
if(jsondata && jsondata.status === 'success') {
if(self.$listelem) {
self.$listelem.remove();
}
if(self.$fullelem) {
self.$fullelem.remove();
}
}
$.getJSON(OC.filePath('contacts', 'ajax', 'contact/details.php'),{'id':id},function(jsondata){
if(jsondata.status == 'success'){
OC.Contacts.Card.loadContact(jsondata.data, bookid);
if(typeof cb == 'function') {
var retval = {status: jsondata ? jsondata.status : 'error'};
if(jsondata) {
if(jsondata.status === 'success') {
retval['id'] = jsondata.id;
} else {
retval['message'] = jsondata.message;
}
} else {
retval['message'] = t('contacts', 'There was an unknown error when trying to delete this contact');
retval['id'] = self.id;
}
else{
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
cb(retval);
}
});
}
Contact.prototype.queryStringFor = function(obj) {
var q = 'id=' + this.id;
var ptype = this.propertyTypeFor(obj);
q += '&name=' + ptype;
if(this.multi_properties.indexOf(ptype) !== -1) {
q += '&checksum=' + this.checksumFor(obj);
}
if($(obj).hasClass('propertycontainer')) {
q += '&value=' + encodeURIComponent($(obj).val());
} else {
var $elements = this.propertyContainerFor(obj)
.find('input.value,select.value,textarea.value,.parameter');
if($elements.length > 1) {
q += '&' + $elements.serialize();
} else {
q += '&value=' + encodeURIComponent($elements.val());
}
}
return q;
}
Contact.prototype.propertyContainerFor = function(obj) {
return $(obj).hasClass('propertycontainer')
? $(obj)
: $(obj).parents('.propertycontainer').first();
}
Contact.prototype.checksumFor = function(obj) {
return this.propertyContainerFor(obj).data('checksum');
}
Contact.prototype.valueFor = function(obj) {
var $container = this.propertyContainerFor(obj);
console.assert($container.length > 0, 'Couldn\'t find container for ' + $(obj))
return $container.is('input')
? $container.val()
: (function() {
var $elem = $container.find('textarea.value,input.value:not(:checkbox)');
console.assert($elem.length > 0, 'Couldn\'t find value for ' + $container.data('element'));
if($elem.length === 1) {
return $elem.val();
} else if($elem.length > 1) {
var retval = [];
$.each($elem, function(idx, e) {
retval.push($(e).val());
});
return retval;
}
})();
}
Contact.prototype.parametersFor = function(obj, asText) {
var parameters = [];
$.each(this.propertyContainerFor(obj).find('select.parameter,input:checkbox:checked.parameter,textarea'), function(i, elem) {
var $elem = $(elem);
var paramname = $elem.data('parameter');
if(!parameters[paramname]) {
parameters[paramname] = [];
}
var val;
if(asText) {
if($elem.is(':checkbox')) {
val = $elem.attr('title');
} else if($elem.is('select')) {
val = $elem.find(':selected').text();
}
} else {
val = $elem.val();
}
parameters[paramname].push(val);
});
return parameters;
}
Contact.prototype.propertyTypeFor = function(obj) {
var ptype = this.propertyContainerFor(obj).data('element');
return ptype ? ptype.toUpperCase() : null;
}
/**
* Render the list item
* @return A jquery object to be inserted in the DOM
*/
Contact.prototype.renderListItem = function() {
this.$listelem = this.$listTemplate.octemplate({
id: this.id,
name: this.getPreferredValue('FN', ''),
email: this.getPreferredValue('EMAIL', ''),
tel: this.getPreferredValue('TEL', ''),
adr: this.getPreferredValue('ADR', []).clean('').join(', '),
categories: this.getPreferredValue('CATEGORIES', [])
.clean('').join(' / '),
});
if(this.access.owner !== OC.currentUser
&& !(this.access.permissions & OC.PERMISSION_UPDATE
|| this.access.permissions & OC.PERMISSION_DELETE)) {
this.$listelem.find('input:checkbox').prop('disabled', true).css('opacity', '0');
}
return this.$listelem;
}
/**
* Render the full contact
* @return A jquery object to be inserted in the DOM
*/
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: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', ''),
title: this.getPreferredValue('TITLE', ''),
org: this.getPreferredValue('ORG', []).clean('').join(', '), // TODO Add parts if more than one.
bday: this.getPreferredValue('BDAY', '').length >= 10
? $.datepicker.formatDate('dd-mm-yy',
$.datepicker.parseDate('yy-mm-dd',
this.getPreferredValue('BDAY', '').substring(0, 10)))
: '',
note: this.getPreferredValue('NOTE', ''),
}
: {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;
});
this.$addMenu = this.$fullelem.find('#addproperty');
this.$addMenu.on('change', function(event) {
//console.log('add', $(this).val());
var $opt = $(this).find('option:selected');
self.addProperty($opt, $(this).val());
$(this).val('');
});
var $fullname = this.$fullelem.find('.fullname');
this.$fullelem.find('.singleproperties').on('mouseenter', function() {
$fullname.next('.edit').css('opacity', '1');
}).on('mouseleave', function() {
$fullname.next('.edit').css('opacity', '0');
});
$fullname.next('.edit').on('click keydown', function(event) {
//console.log('edit name', event);
$('.tipsy').remove();
if(wrongKey(event)) {
return;
}
$(this).css('opacity', '0');
var $editor = $(this).next('.n.editor').first();
var bodyListener = function(e) {
if($editor.find($(e.target)).length == 0) {
$editor.toggle('blind');
$('body').unbind('click', bodyListener);
}
}
$editor.toggle('blind', function() {
$('body').bind('click', bodyListener);
});
});
this.$fullelem.on('click keydown', '.delete', function(event) {
$('.tipsy').remove();
if(wrongKey(event)) {
return;
}
self.deleteProperty({obj:event.target});
});
this.$footer.on('click keydown', 'button', function(event) {
$('.tipsy').remove();
if(wrongKey(event)) {
return;
}
if($(this).is('.close') || $(this).is('.cancel')) {
$(document).trigger('request.contact.close', {
id: self.id,
});
} else if($(this).is('.export')) {
$(document).trigger('request.contact.export', {
id: self.id,
});
} else if($(this).is('.delete')) {
$(document).trigger('request.contact.delete', {
id: self.id,
});
}
return false;
});
this.$fullelem.on('keypress', '.value,.parameter', function(event) {
if(event.keyCode === 13 && $(this).is('input')) {
$(this).trigger('change');
// Prevent a second save on blur.
this.defaultValue = this.value;
return false;
} else if(event.keyCode === 27) {
$(document).trigger('request.contact.close', {
id: self.id,
});
}
});
this.$fullelem.on('change', '.value,.parameter', function(event) {
if(this.value === this.defaultValue) {
return;
}
self.saveProperty({obj:event.target});
});
this.$fullelem.find('[data-element="bday"]')
.find('input').datepicker({
dateFormat : 'dd-mm-yy'
});
this.$fullelem.find('.favorite').on('click', function () {
var state = $(this).hasClass('active');
if(!this.data) {
return;
}
if(state) {
$(this).switchClass('active', 'inactive');
} else {
$(this).switchClass('inactive', 'active');
}
$(document).trigger('request.contact.setasfavorite', {
id: self.id,
state: !state,
});
});
this.loadPhoto();
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
// element, if set disable the add menu entry.
$.each(values, function(name, value) {
if(typeof value === 'undefined') {
return true; //continue
}
value = value.toString();
if(self.multi_properties.indexOf(value.toUpperCase()) === -1) {
if(!value.length) {
self.$fullelem.find('[data-element="' + name + '"]').hide();
} else {
self.$addMenu.find('option[value="' + name.toUpperCase() + '"]').prop('disabled', true);
}
}
});
$.each(this.multi_properties, function(idx, name) {
if(self.data[name]) {
var $list = self.$fullelem.find('ul.' + name.toLowerCase());
$list.show();
for(var p in self.data[name]) {
if(typeof self.data[name][p] === 'object') {
var property = self.data[name][p];
//console.log(name, p, property);
var $property = null;
switch(name) {
case 'TEL':
case 'URL':
case 'EMAIL':
$property = self.renderStandardProperty(name.toLowerCase(), property);
if(self.data[name].length >= 1) {
$property.find('input:checkbox[value="PREF"]').hide();
}
break;
case 'ADR':
$property = self.renderAddressProperty(idx, property);
break;
case 'IMPP':
$property = self.renderIMProperty(property);
break;
}
if(!$property) {
continue;
}
//console.log('$property', $property);
var meta = [];
if(property.label) {
if(!property.parameters['TYPE']) {
property.parameters['TYPE'] = [];
}
property.parameters['TYPE'].push(property.label);
meta.push(property.label);
}
for(var param in property.parameters) {
//console.log('param', param);
if(param.toUpperCase() == 'PREF') {
var $cb = $property.find('input[type="checkbox"]');
$cb.attr('checked', 'checked')
meta.push($cb.attr('title'));
}
else if(param.toUpperCase() == 'TYPE') {
for(var etype in property.parameters[param]) {
var found = false;
var et = property.parameters[param][etype];
if(typeof et !== 'string') {
continue;
}
//console.log('et', et);
if(et.toUpperCase() === 'INTERNET') {
continue;
}
$property.find('select.type option').each(function() {
if($(this).val().toUpperCase() === et.toUpperCase()) {
$(this).attr('selected', 'selected');
meta.push($(this).text());
found = true;
}
});
if(!found) {
$property.find('select.type option:last-child').after('<option value="'+et+'" selected="selected">'+et+'</option>');
}
}
}
else if(param.toUpperCase() == 'X-SERVICE-TYPE') {
//console.log('setting', $property.find('select.impp'), 'to', property.parameters[param].toLowerCase());
$property.find('select.impp').val(property.parameters[param].toLowerCase());
}
}
var $meta = $property.find('.meta');
if($meta.length) {
$meta.html(meta.join('/'));
}
if(self.access.owner === OC.currentUser
|| self.access.permissions & OC.PERMISSION_UPDATE
|| self.access.permissions & OC.PERMISSION_DELETE) {
$property.find('select.type[name="parameters[TYPE][]"]')
.combobox({
singleclick: true,
classes: ['propertytype', 'float', 'label'],
});
}
$list.append($property);
}
}
}
});
if(this.access.owner !== OC.currentUser
&& !(this.access.permissions & OC.PERMISSION_UPDATE
|| this.access.permissions & OC.PERMISSION_DELETE)) {
this.setEnabled(false);
this.showActions(['close', 'export']);
} else {
this.setEnabled(true);
this.showActions(['close', 'add', 'export', 'delete']);
}
return this.$fullelem;
}
Contact.prototype.isEditable = function() {
return ((this.access.owner === OC.currentUser)
|| (this.access.permissions & OC.PERMISSION_UPDATE
|| this.access.permissions & OC.PERMISSION_DELETE));
}
/**
* Render a simple property. Used for EMAIL and TEL.
* @return A jquery object to be injected in the DOM
*/
Contact.prototype.renderStandardProperty = function(name, property) {
if(!this.detailTemplates[name]) {
console.error('No template for', name);
return;
}
var values = property
? { value: property.value, checksum: property.checksum }
: { value: '', checksum: 'new' };
return this.detailTemplates[name].octemplate(values);
}
/**
* Render an ADR (address) property.
* @return A jquery object to be injected in the DOM
*/
Contact.prototype.renderAddressProperty = function(idx, property) {
if(!this.detailTemplates['adr']) {
console.warn('No template for adr', this.detailTemplates);
return;
}
if(typeof idx === 'undefined') {
if(this.data && this.data.ADR && this.data.ADR.length > 0) {
idx = this.data.ADR.length - 1;
} else {
idx = 0;
}
}
var values = property ? {
value: property.value.clean('').join(', '),
checksum: property.checksum,
adr0: property.value[0] || '',
adr1: property.value[1] || '',
adr2: property.value[2] || '',
adr3: property.value[3] || '',
adr4: property.value[4] || '',
adr5: property.value[5] || '',
adr6: property.value[6] || '',
idx: idx,
}
: {value:'', checksum:'new', adr0:'', adr1:'', adr2:'', adr3:'', adr4:'', adr5:'', adr6:'', idx: idx};
var $elem = this.detailTemplates['adr'].octemplate(values);
var self = this;
$elem.find('.tooltipped.downwards:not(.onfocus)').tipsy({gravity: 'n'});
$elem.find('.tooltipped.rightwards.onfocus').tipsy({trigger: 'focus', gravity: 'w'});
$elem.find('.display').on('click', function() {
$(this).next('.listactions').hide();
var $editor = $(this).siblings('.adr.editor').first();
var $viewer = $(this);
var bodyListener = function(e) {
if($editor.find($(e.target)).length == 0) {
$editor.toggle('blind');
$viewer.slideDown(400, function() {
var input = $editor.find('input').first();
var val = self.valueFor(input);
var params = self.parametersFor(input, true);
$(this).find('.meta').html(params['TYPE'].join('/'));
$(this).find('.adr').html(escapeHTML(self.valueFor($editor.find('input').first()).clean('').join(', ')));
$(this).next('.listactions').css('display', 'inline-block');
$('body').unbind('click', bodyListener);
});
}
}
$viewer.slideUp();
$editor.toggle('blind', function() {
$('body').bind('click', bodyListener);
});
});
$elem.find('.value.city')
.autocomplete({
source: function( request, response ) {
$.ajax({
url: "http://ws.geonames.org/searchJSON",
dataType: "jsonp",
data: {
featureClass: "P",
style: "full",
maxRows: 12,
lang: lang,
name_startsWith: request.term
},
success: function( data ) {
response( $.map( data.geonames, function( item ) {
return {
label: item.name + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName,
value: item.name,
country: item.countryName
}
}));
}
});
},
minLength: 2,
select: function( event, ui ) {
if(ui.item && $elem.find('.value.country').val().trim().length == 0) {
$elem.find('.value.country').val(ui.item.country);
}
},
});
$elem.find('.value.country')
.autocomplete({
source: function( request, response ) {
$.ajax({
url: "http://ws.geonames.org/searchJSON",
dataType: "jsonp",
data: {
/*featureClass: "A",*/
featureCode: "PCLI",
/*countryBias: "true",*/
/*style: "full",*/
lang: lang,
maxRows: 12,
name_startsWith: request.term
},
success: function( data ) {
response( $.map( data.geonames, function( item ) {
return {
label: item.name,
value: item.name
}
}));
}
});
},
minLength: 2,
});
return $elem;
}
/**
* Render an IMPP (Instant Messaging) property.
* @return A jquery object to be injected in the DOM
*/
Contact.prototype.renderIMProperty = function(property) {
if(!this.detailTemplates['impp']) {
console.warn('No template for impp', this.detailTemplates);
return;
}
var values = property ? {
value: property.value,
checksum: property.checksum,
} : {value: '', checksum: 'new'};
return this.detailTemplates['impp'].octemplate(values);
}
/**
* Render the PHOTO property.
*/
Contact.prototype.loadPhoto = function(dontloadhandlers) {
var self = this;
var id = this.id || 'new';
var refreshstr = '&refresh='+Math.random();
this.$photowrapper = this.$fullelem.find('#photowrapper');
this.$photowrapper.addClass('loading').addClass('wait');
var $phototools = this.$fullelem.find('#phototools');
delete this.photo;
$('img.contactphoto').remove()
this.photo = new Image();
$(this.photo).load(function () {
$(this).addClass('contactphoto');
self.$photowrapper.css({width: $(this).get(0).width + 10, height: $(this).get(0).height + 10});
self.$photowrapper.removeClass('loading').removeClass('wait');
$(this).insertAfter($phototools).fadeIn();
}).error(function () {
OC.notify({message:t('contacts','Error loading profile picture.')});
}).attr('src', OC.linkTo('contacts', 'photo.php')+'?id='+id+refreshstr);
if(!dontloadhandlers && this.isEditable()) {
this.$photowrapper.on('mouseenter', function(event) {
if($(event.target).is('.favorite') || !self.data) {
return;
}
$phototools.slideDown(200);
}).on('mouseleave', function() {
$phototools.slideUp(200);
});
$phototools.hover( function () {
$(this).removeClass('transparent');
}, function () {
$(this).addClass('transparent');
});
$phototools.find('li a').tipsy();
$phototools.find('.edit').on('click', function() {
$(document).trigger('request.edit.contactphoto', {
id: self.id,
});
});
$phototools.find('.cloud').on('click', function() {
$(document).trigger('request.select.contactphoto.fromcloud', {
id: self.id,
});
});
$phototools.find('.upload').on('click', function() {
$(document).trigger('request.select.contactphoto.fromlocal', {
id: self.id,
});
});
if(this.data && this.data.PHOTO) {
$phototools.find('.delete').show();
$phototools.find('.edit').show();
} else {
$phototools.find('.delete').hide();
$phototools.find('.edit').hide();
}
$(document).bind('status.contact.photoupdated', function(e, result) {
self.loadPhoto(true);
var refreshstr = '&refresh='+Math.random();
self.getListItemElement().find('td.name')
.css('background', 'url(' + OC.filePath('', '', 'remote.php')+'/contactthumbnail?id='+self.id+refreshstr + ')');
});
}
}
/**
* Get the jquery element associated with this object
*/
Contact.prototype.getListItemElement = function() {
if(!this.$listelem) {
this.renderListItem();
}
return this.$listelem;
}
/**
* Get the preferred value for a property.
* If a preferred value is not found the first one will be returned.
* @param string name The name of the property like EMAIL, TEL or ADR.
* @param def A default value to return if nothing is found.
*/
Contact.prototype.getPreferredValue = function(name, def) {
var pref = def, found = false;
if(this.data && this.data[name]) {
var props = this.data[name];
//console.log('props', props);
$.each(props, function( i, prop ) {
//console.log('prop:', i, prop);
if(i === 0) { // Choose first to start with
pref = prop.value;
}
for(var param in prop.parameters) {
if(param.toUpperCase() == 'PREF') {
found = true; //
break;
}
}
if(found) {
return false; // break out of loop
}
});
}
return false;
});
$('.contacts_property').live('change', function(){
OC.Contacts.Card.saveProperty(this);
});
$(function() {
// Upload function for dropped contact photos files. Should go in the Contacts class/object.
$.fileUpload = function(files){
var file = files[0];
if(file.size > $('#max_upload').val()){
OC.dialogs.alert(t('contacts','The file you are trying to upload exceed the maximum size for file uploads on this server.'), t('contacts','Upload too large'));
return;
}
if (file.type.indexOf("image") != 0) {
OC.dialogs.alert(t('contacts','Only image files can be used as profile picture.'), t('contacts','Wrong file type'));
return;
}
var xhr = new XMLHttpRequest();
if (!xhr.upload) {
OC.dialogs.alert(t('contacts', 'Your browser doesn\'t support AJAX upload. Please click on the profile picture to select a photo to upload.'), t('contacts', 'Error'))
}
fileUpload = xhr.upload,
xhr.onreadystatechange = function() {
if (xhr.readyState == 4){
response = $.parseJSON(xhr.responseText);
if(response.status == 'success') {
if(xhr.status == 200) {
OC.Contacts.Card.editPhoto(response.data.id, response.data.tmp);
} else {
OC.dialogs.alert(xhr.status + ': ' + xhr.responseText, t('contacts', 'Error'));
}
} else {
OC.dialogs.alert(response.data.message, t('contacts', 'Error'));
}
}
};
fileUpload.onprogress = function(e){
if (e.lengthComputable){
var _progress = Math.round((e.loaded * 100) / e.total);
//if (_progress != 100){
//}
}
};
xhr.open('POST', OC.filePath('contacts', 'ajax', 'uploadphoto.php')+'?id='+OC.Contacts.Card.id+'&requesttoken='+oc_requesttoken+'&imagefile='+encodeURIComponent(file.name), true);
xhr.setRequestHeader('Cache-Control', 'no-cache');
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.setRequestHeader('X_FILE_NAME', encodeURIComponent(file.name));
xhr.setRequestHeader('X-File-Size', file.size);
xhr.setRequestHeader('Content-Type', file.type);
xhr.send(file);
}
});
$(document).bind('drop dragover', function (e) {
e.preventDefault(); // prevent browser from doing anything, if file isn't dropped in dropZone
});
//add multiply file upload attribute to all browsers except konqueror (which crashes when it's used)
if(navigator.userAgent.search(/konqueror/i)==-1){
$('#import_upload_start').attr('multiple','multiple')
return pref;
}
// Import using jquery.fileupload
$(function() {
var uploadingFiles = {}, numfiles = 0, uploadedfiles = 0, retries = 0;
var aid;
$('#import_upload_start').fileupload({
dropZone: $('#contacts'), // restrict dropZone to contacts list.
acceptFileTypes: /^text\/(directory|vcard|x-vcard)$/i,
add: function(e, data) {
var files = data.files;
var totalSize=0;
if(files) {
numfiles += files.length; uploadedfiles = 0;
for(var i=0;i<files.length;i++) {
if(files[i].size ==0 && files[i].type== '') {
OC.dialogs.alert(t('files', 'Unable to upload your file as it is a directory or has 0 bytes'), t('files', 'Upload Error'));
return;
}
totalSize+=files[i].size;
}
}
if(totalSize>$('#max_upload').val()){
OC.dialogs.alert(t('contacts','The file you are trying to upload exceed the maximum size for file uploads on this server.'), t('contacts','Upload too large'));
numfiles = uploadedfiles = retries = aid = 0;
uploadingFiles = {};
return;
}else{
if($.support.xhrFileUpload) {
for(var i=0;i<files.length;i++){
var fileName = files[i].name;
var dropTarget;
if($(e.originalEvent.target).is('h3')) {
dropTarget = $(e.originalEvent.target).next('ul');
} else {
dropTarget = $(e.originalEvent.target).closest('ul');
}
if(dropTarget && dropTarget.hasClass('contacts')) { // TODO: More thorough check for where we are.
aid = dropTarget.attr('data-id');
} else {
aid = undefined;
}
var jqXHR = $('#import_upload_start').fileupload('send', {files: files[i],
formData: function(form) {
var formArray = form.serializeArray();
formArray['aid'] = aid;
return formArray;
}})
.success(function(result, textStatus, jqXHR) {
if(result.status == 'success') {
// import the file
uploadedfiles += 1;
} else {
OC.Contacts.notify({message:jsondata.data.message});
}
return false;
})
.error(function(jqXHR, textStatus, errorThrown) {
//console.log(textStatus);
OC.Contacts.notify({message:errorThrown + ': ' + textStatus,});
});
uploadingFiles[fileName] = jqXHR;
}
} else {
data.submit().success(function(data, status) {
response = jQuery.parseJSON(data[0].body.innerText);
if(response[0] != undefined && response[0].status == 'success') {
var file=response[0];
delete uploadingFiles[file.name];
$('tr').filterAttr('data-file',file.name).data('mime',file.mime);
var size = $('tr').filterAttr('data-file',file.name).find('td.filesize').text();
if(size==t('files','Pending')){
$('tr').filterAttr('data-file',file.name).find('td.filesize').text(file.size);
}
FileList.loadingDone(file.name);
} else {
OC.Contacts.notify({message:response.data.message});
}
});
}
}
},
fail: function(e, data) {
//console.log('fail');
OC.Contacts.notify({message:data.errorThrown + ': ' + data.textStatus});
// TODO: Remove file from upload queue.
},
progressall: function(e, data) {
var progress = (data.loaded/data.total)*50;
$('#uploadprogressbar').progressbar('value',progress);
},
start: function(e, data) {
$('#uploadprogressbar').progressbar({value:0});
$('#uploadprogressbar').fadeIn();
if(data.dataType != 'iframe ') {
$('#upload input.stop').show();
}
},
stop: function(e, data) {
// stop only gets fired once so we collect uploaded items here.
var waitForImport = function() {
if(numfiles == 0 && uploadedfiles == 0) {
$('#uploadprogressbar').progressbar('value',100);
OC.Contacts.notify({message:t('contacts', 'Import done')});
OC.Contacts.Contacts.update({aid:aid});
retries = aid = 0;
$('#uploadprogressbar').fadeOut();
} else {
setTimeout(function() { //
waitForImport();
}, 1000);
}
}
var importFiles = function(aid, fileList) {
// Create a closure that can be called from different places.
if(numfiles != uploadedfiles) {
OC.Contacts.notify({message:t('contacts', 'Not all files uploaded. Retrying...')});
retries += 1;
if(retries > 3) {
numfiles = uploadedfiles = retries = aid = 0;
uploadingFiles = {};
$('#uploadprogressbar').fadeOut();
OC.dialogs.alert(t('contacts', 'Something went wrong with the upload, please retry.'), t('contacts', 'Error'));
return;
}
setTimeout(function() { // Just to let any uploads finish
importFiles(aid, uploadingFiles);
}, 1000);
}
$('#uploadprogressbar').progressbar('value',50);
var todo = uploadedfiles;
$.each(fileList, function(fileName, data) {
OC.Contacts.Contacts.doImport(fileName, aid, function() {
delete fileList[fileName];
numfiles -= 1; uploadedfiles -= 1;
$('#uploadprogressbar').progressbar('value',50+(50/(todo-uploadedfiles)));
});
})
OC.Contacts.notify({message:t('contacts', 'Importing...'), timeout:20});
waitForImport();
}
if(!aid) {
// Either selected with filepicker or dropped outside of an address book.
$.getJSON(OC.filePath('contacts', 'ajax', 'selectaddressbook.php'),{},function(jsondata) {
if(jsondata.status == 'success') {
if($('#selectaddressbook_dialog').dialog('isOpen') == true) {
$('#selectaddressbook_dialog').dialog('moveToTop');
} else {
$('#dialog_holder').html(jsondata.data.page).ready(function($) {
var select_dlg = $('#selectaddressbook_dialog');
select_dlg.dialog({
modal: true, height: 'auto', width: 'auto',
buttons: {
'Ok':function() {
aid = select_dlg.find('input:checked').val();
if(aid == 'new') {
var displayname = select_dlg.find('input.name').val();
var description = select_dlg.find('input.desc').val();
if(!displayname.trim()) {
OC.dialogs.alert(t('contacts', 'The address book name cannot be empty.'), t('contacts', 'Error'));
return false;
}
$(this).dialog('close');
OC.Contacts.Contacts.addAddressbook(displayname, description, function(addressbook) {
aid = addressbook.id;
setTimeout(function() {
importFiles(aid, uploadingFiles);
}, 500);
//console.log('aid ' + aid);
});
} else {
setTimeout(function() {
importFiles(aid, uploadingFiles);
}, 500);
//console.log('aid ' + aid);
$(this).dialog('close');
}
},
'Cancel':function() {
$(this).dialog('close');
numfiles = uploadedfiles = retries = aid = 0;
uploadingFiles = {};
$('#uploadprogressbar').fadeOut();
}
},
close: function(event, ui) {
// TODO: If numfiles != 0 delete tmp files after a timeout.
$(this).dialog('destroy').remove();
}
});
});
}
} else {
$('#uploadprogressbar').fadeOut();
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
}
});
/**
* Returns true/false depending on the contact being in the
* specified group.
* @param String name The group name (not case-sensitive)
* @returns Boolean
*/
Contact.prototype.inGroup = function(name) {
if(!this.data.CATEGORIES) {
return false;
}
categories = this.data.CATEGORIES[0].value;
for(var i in categories) {
if(typeof categories[i] === 'string' && (name.toLowerCase() === categories[i].toLowerCase())) {
return true;
}
};
return false;
}
/**
* Add this contact to a group
* @param String name The group name
*/
Contact.prototype.addToGroup = function(name) {
console.log('addToGroup', name);
if(!this.data.CATEGORIES) {
this.data.CATEGORIES = [{value:[name]},];
} else {
if(this.inGroup(name)) {
return;
}
this.data.CATEGORIES[0].value.push(name);
if(this.$listelem) {
this.$listelem.find('td.categories')
.text(this.getPreferredValue('CATEGORIES', []).clean('').join(' / '));
}
}
this.saveProperty({name:'CATEGORIES', value:this.data.CATEGORIES[0].value.join(',') });
}
/**
* Remove this contact to a group
* @param String name The group name
*/
Contact.prototype.removeFromGroup = function(name) {
console.log('removeFromGroup', name);
if(!this.data.CATEGORIES) {
return;
} else {
var found = false;
var categories = [];
$.each(this.data.CATEGORIES[0].value, function(idx, category) {
if(name.toLowerCase() === category.toLowerCase()) {
found = true;
} else {
// Dropped on an address book or it's list.
setTimeout(function() { // Just to let any uploads finish
importFiles(aid, uploadingFiles);
}, 1000);
categories.push(category);
}
if(data.dataType != 'iframe ') {
$('#upload input.stop').hide();
});
if(!found) {
return;
}
this.data.CATEGORIES[0].value = categories;
//this.data.CATEGORIES[0].value.splice(this.data.CATEGORIES[0].value.indexOf(name), 1);
if(this.$listelem) {
this.$listelem.find('td.categories')
.text(categories.join(' / '));
}
}
this.saveProperty({name:'CATEGORIES', value:this.data.CATEGORIES[0].value.join(',') });
}
Contact.prototype.setCurrent = function(on) {
if(on) {
this.$listelem.addClass('active');
} else {
this.$listelem.removeClass('active');
}
$(document).trigger('status.contact.currentlistitem', {
id: this.id,
pos: Math.round(this.$listelem.position().top),
height: Math.round(this.$listelem.height()),
});
}
Contact.prototype.next = function() {
var $next = this.$listelem.next('tr');
if($next.length > 0) {
this.$listelem.removeClass('active');
$next.addClass('active');
$(document).trigger('status.contact.currentlistitem', {
id: parseInt($next.data('id')),
pos: Math.round($next.position().top),
height: Math.round($next.height()),
});
}
}
Contact.prototype.prev = function() {
var $prev = this.$listelem.prev('tr');
if($prev.length > 0) {
this.$listelem.removeClass('active');
$prev.addClass('active');
$(document).trigger('status.contact.currentlistitem', {
id: parseInt($prev.data('id')),
pos: Math.round($prev.position().top),
height: Math.round($prev.height()),
});
}
}
var ContactList = function(contactlist, contactlistitemtemplate, contactfulltemplate, contactdetailtemplates) {
//console.log('ContactList', contactlist, contactlistitemtemplate, contactfulltemplate, contactdetailtemplates);
var self = this;
this.length = 0;
this.contacts = {};
this.deletionQueue = [];
this.$contactList = contactlist;
this.$contactListItemTemplate = contactlistitemtemplate;
this.$contactFullTemplate = contactfulltemplate;
this.contactDetailTemplates = contactdetailtemplates;
this.$contactList.scrollTop(0);
this.loadContacts(0);
$(document).bind('status.contact.added', function(e, data) {
self.contacts[parseInt(data.id)] = data.contact;
self.insertContact(data.contact.renderListItem());
});
$(document).bind('status.contact.renamed', function(e, data) {
self.insertContact(data.contact.getListItemElement().detach());
});
}
/**
* Show/hide contacts belonging to an addressbook.
* @param int aid. Addressbook id.
* @param boolean show. Whether to show or hide.
* @param boolean hideothers. Used when showing shared addressbook as a group.
*/
ContactList.prototype.showFromAddressbook = function(aid, show, hideothers) {
console.log('ContactList.showFromAddressbook', aid, show);
aid = parseInt(aid);
for(var contact in this.contacts) {
if(this.contacts[contact].access.id === aid) {
this.contacts[contact].getListItemElement().toggle(show);
} else if(hideothers) {
this.contacts[contact].getListItemElement().hide();
}
}
}
/**
* Show/hide contacts belonging to shared addressbooks.
* @param boolean show. Whether to show or hide.
*/
ContactList.prototype.showSharedAddressbooks = function(show) {
console.log('ContactList.showSharedAddressbooks', show);
for(var contact in this.contacts) {
if(this.contacts[contact].access.owner !== OC.currentUser) {
if(show) {
this.contacts[contact].getListItemElement().show();
} else {
this.contacts[contact].getListItemElement().hide();
}
}
})
});
}
}
OC.Contacts.loadHandlers();
OC.Contacts.Contacts.update({cid:id});
});
/**
* Show contacts in list
* @param Array contacts. A list of contact ids.
*/
ContactList.prototype.showContacts = function(contacts) {
if(contacts.length === 0) {
// ~5 times faster
$('tr:visible.contact').hide();
return;
}
if(contacts === 'all') {
// ~2 times faster
$('tr.contact:not(:visible)').show();
return;
}
for(var contact in this.contacts) {
contact = parseInt(contact);
if(contacts.indexOf(contact) === -1) {
this.contacts[contact].getListItemElement().hide();
} else {
this.contacts[contact].getListItemElement().show();
}
}
}
ContactList.prototype.contactPos = function(id) {
if(!id) {
console.warn('id missing');
return false;
}
var $elem = this.contacts[parseInt(id)].getListItemElement();
var pos = $elem.offset().top - this.$contactList.offset().top + this.$contactList.scrollTop();
return pos;
}
ContactList.prototype.hideContact = function(id) {
this.contacts[parseInt(id)].hide();
}
ContactList.prototype.closeContact = function(id) {
this.contacts[parseInt(id)].close();
}
/**
* Returns a Contact object by searching for its id
* @param id the id of the node
* @return the Contact object or undefined if not found.
* FIXME: If continious loading is reintroduced this will have
* to load the requested contact if not in list.
*/
ContactList.prototype.findById = function(id) {
return this.contacts[parseInt(id)];
};
ContactList.prototype.delayedDelete = function(id) {
var self = this;
if(utils.isUInt(id)) {
this.currentContact = null;
self.$contactList.show();
this.deletionQueue.push(id);
} else if(utils.isArray(id)) {
$.extend(this.deletionQueue, id);
} else {
throw { name: 'WrongParameterType', message: 'ContactList.delayedDelete only accept integers or arrays.'}
}
$.each(this.deletionQueue, function(idx, id) {
self.contacts[id].detach().setChecked(false);
});
console.log('deletionQueue', this.deletionQueue);
if(!window.onbeforeunload) {
window.onbeforeunload = function(e) {
e = e || window.event;
var warn = t('contacts', 'Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted.');
if (e) {
e.returnValue = String(warn);
}
return warn;
}
}
if(this.$contactList.find('tr:visible').length === 0) {
$(document).trigger('status.visiblecontacts');
}
OC.notify({
message:t('contacts','Click to undo deletion of {num} contacts', {num: self.deletionQueue.length}),
//timeout:5,
timeouthandler:function() {
console.log('timeout');
// Don't fire all deletes at once
self.deletionTimer = setInterval('self.deleteContacts()', 500);
},
clickhandler:function() {
console.log('clickhandler');
$.each(self.deletionQueue, function(idx, id) {
self.insertContact(self.contacts[id].getListItemElement());
});
OC.notify({cancel:true});
OC.notify({message:t('contacts', 'Cancelled deletion of {num}', {num: self.deletionQueue.length})});
self.deletionQueue = [];
window.onbeforeunload = null;
}
});
}
/**
* Delete a contact with this id
* @param id the id of the contact
*/
ContactList.prototype.deleteContacts = function() {
var self = this;
console.log('ContactList.deleteContacts, deletionQueue', this.deletionQueue);
if(typeof this.deletionTimer === 'undefined') {
console.log('No deletion timer!');
window.onbeforeunload = null;
return;
}
var id = this.deletionQueue.shift();
if(typeof id === 'undefined') {
clearInterval(this.deletionTimer);
delete this.deletionTimer;
window.onbeforeunload = null;
return;
}
// Let contact remove itself.
self.contacts[id].destroy(function(response) {
console.log('deleteContact', response);
if(response.status === 'success') {
delete self.contacts[id];
$(document).trigger('status.contact.deleted', {
id: id,
});
self.length -= 1;
if(self.length === 0) {
$(document).trigger('status.nomorecontacts');
}
} else {
OC.notify({message:response.message});
}
});
}
/**
* Opens the contact with this id in edit mode
* @param id the id of the contact
* @returns A jquery object to be inserted in the DOM.
*/
ContactList.prototype.showContact = function(id, props) {
console.assert(typeof id === 'number', 'ContactList.showContact called with a non-number');
this.currentContact = id;
console.log('Contacts.showContact', id, this.contacts[this.currentContact], this.contacts)
return this.contacts[this.currentContact].renderContact(props);
};
/**
* Insert a rendered contact list item into the list
* @param contact jQuery object.
*/
ContactList.prototype.insertContact = function($contact) {
$contact.draggable({
distance: 10,
revert: 'invalid',
//containment: '#content',
opacity: 0.8, helper: 'clone',
zIndex: 1000,
});
var name = $contact.find('.nametext').text().toLowerCase();
var added = false
this.$contactList.find('tr').each(function() {
if ($(this).find('.nametext').text().toLowerCase().localeCompare(name) > 0) {
$(this).before($contact);
added = true;
return false;
}
});
if(!added) {
this.$contactList.append($contact);
}
$contact.show();
return $contact;
}
/**
* Add contact
* @param object props
*/
ContactList.prototype.addContact = function(props) {
var contact = new Contact(
this,
null,
{owner:OC.currentUser, permissions: 31},
null,
this.$contactListItemTemplate,
this.$contactFullTemplate,
this.contactDetailTemplates
);
if(this.currentContact) {
console.assert(typeof this.currentContact == 'number', 'this.currentContact is not a number');
this.contacts[this.currentContact].close();
}
return contact.renderContact(props);
}
/**
* Get contacts selected in list
*
* @returns array of integer contact ids.
*/
ContactList.prototype.getSelectedContacts = function() {
var contacts = [];
$.each(this.$contactList.find('tr > td > input:checkbox:visible:checked'), function(a, b) {
contacts.push(parseInt($(b).parents('tr').first().data('id')));
});
return contacts;
}
ContactList.prototype.setCurrent = function(id, deselect_other) {
self = this;
if(deselect_other === true) {
$.each(this.contacts, function(contact) {
self.contacts[contact].setCurrent(false);
});
}
this.contacts[parseInt(id)].setCurrent(true);
}
// Should only be neccesary with progressive loading, but it's damn fast, so... ;)
ContactList.prototype.doSort = function() {
var self = this;
var rows = this.$contactList.find('tr').get();
rows.sort(function(a, b) {
return $(a).find('td.name').text().toUpperCase().localeCompare($(b).find('td.name').text().toUpperCase());
});
$.each(rows, function(index, row) {
self.$contactList.append(row);
});
}
/**
* Save addressbook data
* @param int id
*/
ContactList.prototype.unsetAddressbook = function(id) {
delete this.addressbooks[id];
}
/**
* Save addressbook data
* @param object book
*/
ContactList.prototype.setAddressbook = function(book) {
this.addressbooks[parseInt(book.id)] = {
owner: book.userid,
uri: book.uri,
permissions: parseInt(book.permissions),
id: parseInt(book.id),
displayname: book.displayname,
description: book.description,
active: Boolean(parseInt(book.active)),
};
}
/**
* Load contacts
* @param int offset
*/
ContactList.prototype.loadContacts = function(offset, cb) {
var self = this;
// Should the actual ajax call be in the controller?
$.getJSON(OC.filePath('contacts', 'ajax', 'contact/list.php'), {offset: offset}, function(jsondata) {
if (jsondata && jsondata.status == 'success') {
//console.log('ContactList.loadContacts', jsondata.data);
self.addressbooks = {};
$.each(jsondata.data.addressbooks, function(i, book) {
self.setAddressbook(book);
});
$.each(jsondata.data.contacts, function(c, contact) {
self.contacts[parseInt(contact.id)]
= new Contact(
self,
contact.id,
self.addressbooks[parseInt(contact.aid)],
contact.data,
self.$contactListItemTemplate,
self.$contactFullTemplate,
self.contactDetailTemplates
);
self.length +=1;
var $item = self.contacts[parseInt(contact.id)].renderListItem();
$item.draggable({
distance: 10,
revert: 'invalid',
//containment: '#content',
opacity: 0.8, helper: 'clone',
zIndex: 1000,
});
self.$contactList.append($item);
//self.insertContact(item);
});
self.doSort();
$(document).trigger('status.contacts.loaded', {
status: true,
numcontacts: jsondata.data.contacts.length
});
self.setCurrent(self.$contactList.find('tr:first-child').data('id'), false);
}
if(typeof cb === 'function') {
cb();
}
});
}
OC.Contacts.ContactList = ContactList;
})(window, jQuery, OC);

View File

@ -6,18 +6,21 @@
$.widget('ui.combobox', {
options: {
id: null,
name: null,
showButton: false,
editable: true
editable: true,
singleclick: false,
},
_create: function() {
var self = this,
select = this.element.hide(),
selected = select.children(':selected'),
value = selected.val() ? selected.text() : '';
var input = this.input = $('<input type="text">')
var name = this.element.attr('name');
//this.element.attr('name', 'old_' + name)
var input = this.input = $('<input type="text" />')
.insertAfter( select )
.val( value )
//.attr('name', name)
.autocomplete({
delay: 0,
minLength: 0,
@ -80,10 +83,20 @@
self._setOption(key, value);
});
input.dblclick(function() {
// pass empty string as value to search for, displaying all results
input.autocomplete('search', '');
});
var clickHandler = function(e) {
var w = self.input.autocomplete('widget');
if(w.is(':visible')) {
self.input.autocomplete('close');
} else {
input.autocomplete('search', '');
}
}
if(this.options['singleclick'] === true) {
input.click(clickHandler);
} else {
input.dblclick(clickHandler);
}
if(this.options['showButton']) {
this.button = $('<button type="button">&nbsp;</button>')
@ -128,10 +141,6 @@
this.options['id'] = value;
this.input.attr('id', value);
break;
case 'name':
this.options['name'] = value;
this.input.attr('name', value);
break;
case 'attributes':
var input = this.input;
$.each(this.options['attributes'], function(key, value) {

View File

@ -76,6 +76,15 @@ Contacts_Import={
});
}
}
var openContact = function(id) {
if(typeof OC.Contacts !== 'undefined') {
OC.Contacts.openContact(id);
} else {
window.location.href = OC.linkTo('contacts', 'index.php') + '?id=' + id;
}
}
$(document).ready(function(){
if(typeof FileActions !== 'undefined'){
FileActions.register('text/vcard','importaddressbook', OC.PERMISSION_READ, '', Contacts_Import.importdialog);

1394
js/modernizr.js Normal file
View File

@ -0,0 +1,1394 @@
/*!
* Modernizr v2.6.3pre
* www.modernizr.com
*
* Copyright (c) Faruk Ates, Paul Irish, Alex Sexton
* Available under the BSD and MIT licenses: www.modernizr.com/license/
*/
/*
* Modernizr tests which native CSS3 and HTML5 features are available in
* the current UA and makes the results available to you in two ways:
* as properties on a global Modernizr object, and as classes on the
* <html> element. This information allows you to progressively enhance
* your pages with a granular level of control over the experience.
*
* Modernizr has an optional (not included) conditional resource loader
* called Modernizr.load(), based on Yepnope.js (yepnopejs.com).
* To get a build that includes Modernizr.load(), as well as choosing
* which tests to include, go to www.modernizr.com/download/
*
* Authors Faruk Ates, Paul Irish, Alex Sexton
* Contributors Ryan Seddon, Ben Alman
*/
window.Modernizr = (function( window, document, undefined ) {
var version = '2.6.3pre',
Modernizr = {},
/*>>cssclasses*/
// option for enabling the HTML classes to be added
enableClasses = true,
/*>>cssclasses*/
docElement = document.documentElement,
/**
* Create our "modernizr" element that we do most feature tests on.
*/
mod = 'modernizr',
modElem = document.createElement(mod),
mStyle = modElem.style,
/**
* Create the input element for various Web Forms feature tests.
*/
inputElem /*>>inputelem*/ = document.createElement('input') /*>>inputelem*/ ,
/*>>smile*/
smile = ':)',
/*>>smile*/
toString = {}.toString,
// TODO :: make the prefixes more granular
/*>>prefixes*/
// List of property values to set for css tests. See ticket #21
prefixes = ' -webkit- -moz- -o- -ms- '.split(' '),
/*>>prefixes*/
/*>>domprefixes*/
// Following spec is to expose vendor-specific style properties as:
// elem.style.WebkitBorderRadius
// and the following would be incorrect:
// elem.style.webkitBorderRadius
// Webkit ghosts their properties in lowercase but Opera & Moz do not.
// Microsoft uses a lowercase `ms` instead of the correct `Ms` in IE8+
// erik.eae.net/archives/2008/03/10/21.48.10/
// More here: github.com/Modernizr/Modernizr/issues/issue/21
omPrefixes = 'Webkit Moz O ms',
cssomPrefixes = omPrefixes.split(' '),
domPrefixes = omPrefixes.toLowerCase().split(' '),
/*>>domprefixes*/
/*>>ns*/
ns = {'svg': 'http://www.w3.org/2000/svg'},
/*>>ns*/
tests = {},
inputs = {},
attrs = {},
classes = [],
slice = classes.slice,
featureName, // used in testing loop
/*>>teststyles*/
// Inject element with style element and some CSS rules
injectElementWithStyles = function( rule, callback, nodes, testnames ) {
var style, ret, node, docOverflow,
div = document.createElement('div'),
// After page load injecting a fake body doesn't work so check if body exists
body = document.body,
// IE6 and 7 won't return offsetWidth or offsetHeight unless it's in the body element, so we fake it.
fakeBody = body || document.createElement('body');
if ( parseInt(nodes, 10) ) {
// In order not to give false positives we create a node for each test
// This also allows the method to scale for unspecified uses
while ( nodes-- ) {
node = document.createElement('div');
node.id = testnames ? testnames[nodes] : mod + (nodes + 1);
div.appendChild(node);
}
}
// <style> elements in IE6-9 are considered 'NoScope' elements and therefore will be removed
// when injected with innerHTML. To get around this you need to prepend the 'NoScope' element
// with a 'scoped' element, in our case the soft-hyphen entity as it won't mess with our measurements.
// msdn.microsoft.com/en-us/library/ms533897%28VS.85%29.aspx
// Documents served as xml will throw if using &shy; so use xml friendly encoded version. See issue #277
style = ['&#173;','<style id="s', mod, '">', rule, '</style>'].join('');
div.id = mod;
// IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody.
// Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270
(body ? div : fakeBody).innerHTML += style;
fakeBody.appendChild(div);
if ( !body ) {
//avoid crashing IE8, if background image is used
fakeBody.style.background = '';
//Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and scrollbars are visible
fakeBody.style.overflow = 'hidden';
docOverflow = docElement.style.overflow;
docElement.style.overflow = 'hidden';
docElement.appendChild(fakeBody);
}
ret = callback(div, rule);
// If this is done after page load we don't want to remove the body so check if body exists
if ( !body ) {
fakeBody.parentNode.removeChild(fakeBody);
docElement.style.overflow = docOverflow;
} else {
div.parentNode.removeChild(div);
}
return !!ret;
},
/*>>teststyles*/
/*>>mq*/
// adapted from matchMedia polyfill
// by Scott Jehl and Paul Irish
// gist.github.com/786768
testMediaQuery = function( mq ) {
var matchMedia = window.matchMedia || window.msMatchMedia;
if ( matchMedia ) {
return matchMedia(mq).matches;
}
var bool;
injectElementWithStyles('@media ' + mq + ' { #' + mod + ' { position: absolute; } }', function( node ) {
bool = (window.getComputedStyle ?
getComputedStyle(node, null) :
node.currentStyle)['position'] == 'absolute';
});
return bool;
},
/*>>mq*/
/*>>hasevent*/
//
// isEventSupported determines if a given element supports the given event
// kangax.github.com/iseventsupported/
//
// The following results are known incorrects:
// Modernizr.hasEvent("webkitTransitionEnd", elem) // false negative
// Modernizr.hasEvent("textInput") // in Webkit. github.com/Modernizr/Modernizr/issues/333
// ...
isEventSupported = (function() {
var TAGNAMES = {
'select': 'input', 'change': 'input',
'submit': 'form', 'reset': 'form',
'error': 'img', 'load': 'img', 'abort': 'img'
};
function isEventSupported( eventName, element ) {
element = element || document.createElement(TAGNAMES[eventName] || 'div');
eventName = 'on' + eventName;
// When using `setAttribute`, IE skips "unload", WebKit skips "unload" and "resize", whereas `in` "catches" those
var isSupported = eventName in element;
if ( !isSupported ) {
// If it has no `setAttribute` (i.e. doesn't implement Node interface), try generic element
if ( !element.setAttribute ) {
element = document.createElement('div');
}
if ( element.setAttribute && element.removeAttribute ) {
element.setAttribute(eventName, '');
isSupported = is(element[eventName], 'function');
// If property was created, "remove it" (by setting value to `undefined`)
if ( !is(element[eventName], 'undefined') ) {
element[eventName] = undefined;
}
element.removeAttribute(eventName);
}
}
element = null;
return isSupported;
}
return isEventSupported;
})(),
/*>>hasevent*/
// TODO :: Add flag for hasownprop ? didn't last time
// hasOwnProperty shim by kangax needed for Safari 2.0 support
_hasOwnProperty = ({}).hasOwnProperty, hasOwnProp;
if ( !is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined') ) {
hasOwnProp = function (object, property) {
return _hasOwnProperty.call(object, property);
};
}
else {
hasOwnProp = function (object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */
return ((property in object) && is(object.constructor.prototype[property], 'undefined'));
};
}
// Adapted from ES5-shim https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js
// es5.github.com/#x15.3.4.5
if (!Function.prototype.bind) {
Function.prototype.bind = function bind(that) {
var target = this;
if (typeof target != "function") {
throw new TypeError();
}
var args = slice.call(arguments, 1),
bound = function () {
if (this instanceof bound) {
var F = function(){};
F.prototype = target.prototype;
var self = new F();
var result = target.apply(
self,
args.concat(slice.call(arguments))
);
if (Object(result) === result) {
return result;
}
return self;
} else {
return target.apply(
that,
args.concat(slice.call(arguments))
);
}
};
return bound;
};
}
/**
* setCss applies given styles to the Modernizr DOM node.
*/
function setCss( str ) {
mStyle.cssText = str;
}
/**
* setCssAll extrapolates all vendor-specific css strings.
*/
function setCssAll( str1, str2 ) {
return setCss(prefixes.join(str1 + ';') + ( str2 || '' ));
}
/**
* is returns a boolean for if typeof obj is exactly type.
*/
function is( obj, type ) {
return typeof obj === type;
}
/**
* contains returns a boolean for if substr is found within str.
*/
function contains( str, substr ) {
return !!~('' + str).indexOf(substr);
}
/*>>testprop*/
// testProps is a generic CSS / DOM property test.
// In testing support for a given CSS property, it's legit to test:
// `elem.style[styleName] !== undefined`
// If the property is supported it will return an empty string,
// if unsupported it will return undefined.
// We'll take advantage of this quick test and skip setting a style
// on our modernizr element, but instead just testing undefined vs
// empty string.
// Because the testing of the CSS property names (with "-", as
// opposed to the camelCase DOM properties) is non-portable and
// non-standard but works in WebKit and IE (but not Gecko or Opera),
// we explicitly reject properties with dashes so that authors
// developing in WebKit or IE first don't end up with
// browser-specific content by accident.
function testProps( props, prefixed ) {
for ( var i in props ) {
var prop = props[i];
if ( !contains(prop, "-") && mStyle[prop] !== undefined ) {
return prefixed == 'pfx' ? prop : true;
}
}
return false;
}
/*>>testprop*/
// TODO :: add testDOMProps
/**
* testDOMProps is a generic DOM property test; if a browser supports
* a certain property, it won't return undefined for it.
*/
function testDOMProps( props, obj, elem ) {
for ( var i in props ) {
var item = obj[props[i]];
if ( item !== undefined) {
// return the property name as a string
if (elem === false) return props[i];
// let's bind a function (and it has a bind method -- certain native objects that report that they are a
// function don't [such as webkitAudioContext])
if (is(item, 'function') && 'bind' in item){
// default to autobind unless override
return item.bind(elem || obj);
}
// return the unbound function or obj or value
return item;
}
}
return false;
}
/*>>testallprops*/
/**
* testPropsAll tests a list of DOM properties we want to check against.
* We specify literally ALL possible (known and/or likely) properties on
* the element including the non-vendor prefixed one, for forward-
* compatibility.
*/
function testPropsAll( prop, prefixed, elem ) {
var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1),
props = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' ');
// did they call .prefixed('boxSizing') or are we just testing a prop?
if(is(prefixed, "string") || is(prefixed, "undefined")) {
return testProps(props, prefixed);
// otherwise, they called .prefixed('requestAnimationFrame', window[, elem])
} else {
props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' ');
return testDOMProps(props, prefixed, elem);
}
}
/*>>testallprops*/
/**
* Tests
* -----
*/
// The *new* flexbox
// dev.w3.org/csswg/css3-flexbox
tests['flexbox'] = function() {
return testPropsAll('flexWrap');
};
// The *old* flexbox
// www.w3.org/TR/2009/WD-css3-flexbox-20090723/
tests['flexboxlegacy'] = function() {
return testPropsAll('boxDirection');
};
// On the S60 and BB Storm, getContext exists, but always returns undefined
// so we actually have to call getContext() to verify
// github.com/Modernizr/Modernizr/issues/issue/97/
tests['canvas'] = function() {
var elem = document.createElement('canvas');
return !!(elem.getContext && elem.getContext('2d'));
};
tests['canvastext'] = function() {
return !!(Modernizr['canvas'] && is(document.createElement('canvas').getContext('2d').fillText, 'function'));
};
// webk.it/70117 is tracking a legit WebGL feature detect proposal
// We do a soft detect which may false positive in order to avoid
// an expensive context creation: bugzil.la/732441
tests['webgl'] = function() {
return !!window.WebGLRenderingContext;
};
/*
* The Modernizr.touch test only indicates if the browser supports
* touch events, which does not necessarily reflect a touchscreen
* device, as evidenced by tablets running Windows 7 or, alas,
* the Palm Pre / WebOS (touch) phones.
*
* Additionally, Chrome (desktop) used to lie about its support on this,
* but that has since been rectified: crbug.com/36415
*
* We also test for Firefox 4 Multitouch Support.
*
* For more info, see: modernizr.github.com/Modernizr/touch.html
*/
tests['touch'] = function() {
var bool;
if(('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch) {
bool = true;
} else {
injectElementWithStyles(['@media (',prefixes.join('touch-enabled),('),mod,')','{#modernizr{top:9px;position:absolute}}'].join(''), function( node ) {
bool = node.offsetTop === 9;
});
}
return bool;
};
// geolocation is often considered a trivial feature detect...
// Turns out, it's quite tricky to get right:
//
// Using !!navigator.geolocation does two things we don't want. It:
// 1. Leaks memory in IE9: github.com/Modernizr/Modernizr/issues/513
// 2. Disables page caching in WebKit: webk.it/43956
//
// Meanwhile, in Firefox < 8, an about:config setting could expose
// a false positive that would throw an exception: bugzil.la/688158
tests['geolocation'] = function() {
return 'geolocation' in navigator;
};
tests['postmessage'] = function() {
return !!window.postMessage;
};
// Chrome incognito mode used to throw an exception when using openDatabase
// It doesn't anymore.
tests['websqldatabase'] = function() {
return !!window.openDatabase;
};
// Vendors had inconsistent prefixing with the experimental Indexed DB:
// - Webkit's implementation is accessible through webkitIndexedDB
// - Firefox shipped moz_indexedDB before FF4b9, but since then has been mozIndexedDB
// For speed, we don't test the legacy (and beta-only) indexedDB
tests['indexedDB'] = function() {
return !!testPropsAll("indexedDB", window);
};
// documentMode logic from YUI to filter out IE8 Compat Mode
// which false positives.
tests['hashchange'] = function() {
return isEventSupported('hashchange', window) && (document.documentMode === undefined || document.documentMode > 7);
};
// Per 1.6:
// This used to be Modernizr.historymanagement but the longer
// name has been deprecated in favor of a shorter and property-matching one.
// The old API is still available in 1.6, but as of 2.0 will throw a warning,
// and in the first release thereafter disappear entirely.
tests['history'] = function() {
return !!(window.history && history.pushState);
};
tests['draganddrop'] = function() {
var div = document.createElement('div');
return ('draggable' in div) || ('ondragstart' in div && 'ondrop' in div);
};
// FF3.6 was EOL'ed on 4/24/12, but the ESR version of FF10
// will be supported until FF19 (2/12/13), at which time, ESR becomes FF17.
// FF10 still uses prefixes, so check for it until then.
// for more ESR info, see: mozilla.org/en-US/firefox/organizations/faq/
tests['websockets'] = function() {
return 'WebSocket' in window || 'MozWebSocket' in window;
};
// css-tricks.com/rgba-browser-support/
tests['rgba'] = function() {
// Set an rgba() color and check the returned value
setCss('background-color:rgba(150,255,150,.5)');
return contains(mStyle.backgroundColor, 'rgba');
};
tests['hsla'] = function() {
// Same as rgba(), in fact, browsers re-map hsla() to rgba() internally,
// except IE9 who retains it as hsla
setCss('background-color:hsla(120,40%,100%,.5)');
return contains(mStyle.backgroundColor, 'rgba') || contains(mStyle.backgroundColor, 'hsla');
};
tests['multiplebgs'] = function() {
// Setting multiple images AND a color on the background shorthand property
// and then querying the style.background property value for the number of
// occurrences of "url(" is a reliable method for detecting ACTUAL support for this!
setCss('background:url(https://),url(https://),red url(https://)');
// If the UA supports multiple backgrounds, there should be three occurrences
// of the string "url(" in the return value for elemStyle.background
return (/(url\s*\(.*?){3}/).test(mStyle.background);
};
// this will false positive in Opera Mini
// github.com/Modernizr/Modernizr/issues/396
tests['backgroundsize'] = function() {
return testPropsAll('backgroundSize');
};
tests['borderimage'] = function() {
return testPropsAll('borderImage');
};
// Super comprehensive table about all the unique implementations of
// border-radius: muddledramblings.com/table-of-css3-border-radius-compliance
tests['borderradius'] = function() {
return testPropsAll('borderRadius');
};
// WebOS unfortunately false positives on this test.
tests['boxshadow'] = function() {
return testPropsAll('boxShadow');
};
// FF3.0 will false positive on this test
tests['textshadow'] = function() {
return document.createElement('div').style.textShadow === '';
};
tests['opacity'] = function() {
// Browsers that actually have CSS Opacity implemented have done so
// according to spec, which means their return values are within the
// range of [0.0,1.0] - including the leading zero.
setCssAll('opacity:.55');
// The non-literal . in this regex is intentional:
// German Chrome returns this value as 0,55
// github.com/Modernizr/Modernizr/issues/#issue/59/comment/516632
return (/^0.55$/).test(mStyle.opacity);
};
// Note, Android < 4 will pass this test, but can only animate
// a single property at a time
// daneden.me/2011/12/putting-up-with-androids-bullshit/
tests['cssanimations'] = function() {
return testPropsAll('animationName');
};
tests['csscolumns'] = function() {
return testPropsAll('columnCount');
};
tests['cssgradients'] = function() {
/**
* For CSS Gradients syntax, please see:
* webkit.org/blog/175/introducing-css-gradients/
* developer.mozilla.org/en/CSS/-moz-linear-gradient
* developer.mozilla.org/en/CSS/-moz-radial-gradient
* dev.w3.org/csswg/css3-images/#gradients-
*/
var str1 = 'background-image:',
str2 = 'gradient(linear,left top,right bottom,from(#9f9),to(white));',
str3 = 'linear-gradient(left top,#9f9, white);';
setCss(
// legacy webkit syntax (FIXME: remove when syntax not in use anymore)
(str1 + '-webkit- '.split(' ').join(str2 + str1) +
// standard syntax // trailing 'background-image:'
prefixes.join(str3 + str1)).slice(0, -str1.length)
);
return contains(mStyle.backgroundImage, 'gradient');
};
tests['cssreflections'] = function() {
return testPropsAll('boxReflect');
};
tests['csstransforms'] = function() {
return !!testPropsAll('transform');
};
tests['csstransforms3d'] = function() {
var ret = !!testPropsAll('perspective');
// Webkit's 3D transforms are passed off to the browser's own graphics renderer.
// It works fine in Safari on Leopard and Snow Leopard, but not in Chrome in
// some conditions. As a result, Webkit typically recognizes the syntax but
// will sometimes throw a false positive, thus we must do a more thorough check:
if ( ret && 'webkitPerspective' in docElement.style ) {
// Webkit allows this media query to succeed only if the feature is enabled.
// `@media (transform-3d),(-webkit-transform-3d){ ... }`
injectElementWithStyles('@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}', function( node, rule ) {
ret = node.offsetLeft === 9 && node.offsetHeight === 3;
});
}
return ret;
};
tests['csstransitions'] = function() {
return testPropsAll('transition');
};
/*>>fontface*/
// @font-face detection routine by Diego Perini
// javascript.nwbox.com/CSSSupport/
// false positives:
// WebOS github.com/Modernizr/Modernizr/issues/342
// WP7 github.com/Modernizr/Modernizr/issues/538
tests['fontface'] = function() {
var bool;
injectElementWithStyles('@font-face {font-family:"font";src:url("https://")}', function( node, rule ) {
var style = document.getElementById('smodernizr'),
sheet = style.sheet || style.styleSheet,
cssText = sheet ? (sheet.cssRules && sheet.cssRules[0] ? sheet.cssRules[0].cssText : sheet.cssText || '') : '';
bool = /src/i.test(cssText) && cssText.indexOf(rule.split(' ')[0]) === 0;
});
return bool;
};
/*>>fontface*/
// CSS generated content detection
tests['generatedcontent'] = function() {
var bool;
injectElementWithStyles(['#',mod,'{font:0/0 a}#',mod,':after{content:"',smile,'";visibility:hidden;font:3px/1 a}'].join(''), function( node ) {
bool = node.offsetHeight >= 3;
});
return bool;
};
// These tests evaluate support of the video/audio elements, as well as
// testing what types of content they support.
//
// We're using the Boolean constructor here, so that we can extend the value
// e.g. Modernizr.video // true
// Modernizr.video.ogg // 'probably'
//
// Codec values from : github.com/NielsLeenheer/html5test/blob/9106a8/index.html#L845
// thx to NielsLeenheer and zcorpan
// Note: in some older browsers, "no" was a return value instead of empty string.
// It was live in FF3.5.0 and 3.5.1, but fixed in 3.5.2
// It was also live in Safari 4.0.0 - 4.0.4, but fixed in 4.0.5
tests['video'] = function() {
var elem = document.createElement('video'),
bool = false;
// IE9 Running on Windows Server SKU can cause an exception to be thrown, bug #224
try {
if ( bool = !!elem.canPlayType ) {
bool = new Boolean(bool);
bool.ogg = elem.canPlayType('video/ogg; codecs="theora"') .replace(/^no$/,'');
// Without QuickTime, this value will be `undefined`. github.com/Modernizr/Modernizr/issues/546
bool.h264 = elem.canPlayType('video/mp4; codecs="avc1.42E01E"') .replace(/^no$/,'');
bool.webm = elem.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/^no$/,'');
}
} catch(e) { }
return bool;
};
tests['audio'] = function() {
var elem = document.createElement('audio'),
bool = false;
try {
if ( bool = !!elem.canPlayType ) {
bool = new Boolean(bool);
bool.ogg = elem.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,'');
bool.mp3 = elem.canPlayType('audio/mpeg;') .replace(/^no$/,'');
// Mimetypes accepted:
// developer.mozilla.org/En/Media_formats_supported_by_the_audio_and_video_elements
// bit.ly/iphoneoscodecs
bool.wav = elem.canPlayType('audio/wav; codecs="1"') .replace(/^no$/,'');
bool.m4a = ( elem.canPlayType('audio/x-m4a;') ||
elem.canPlayType('audio/aac;')) .replace(/^no$/,'');
}
} catch(e) { }
return bool;
};
// In FF4, if disabled, window.localStorage should === null.
// Normally, we could not test that directly and need to do a
// `('localStorage' in window) && ` test first because otherwise Firefox will
// throw bugzil.la/365772 if cookies are disabled
// Also in iOS5 Private Browsing mode, attempting to use localStorage.setItem
// will throw the exception:
// QUOTA_EXCEEDED_ERRROR DOM Exception 22.
// Peculiarly, getItem and removeItem calls do not throw.
// Because we are forced to try/catch this, we'll go aggressive.
// Just FWIW: IE8 Compat mode supports these features completely:
// www.quirksmode.org/dom/html5.html
// But IE8 doesn't support either with local files
tests['localstorage'] = function() {
try {
localStorage.setItem(mod, mod);
localStorage.removeItem(mod);
return true;
} catch(e) {
return false;
}
};
tests['sessionstorage'] = function() {
try {
sessionStorage.setItem(mod, mod);
sessionStorage.removeItem(mod);
return true;
} catch(e) {
return false;
}
};
tests['webworkers'] = function() {
return !!window.Worker;
};
tests['applicationcache'] = function() {
return !!window.applicationCache;
};
// Thanks to Erik Dahlstrom
tests['svg'] = function() {
return !!document.createElementNS && !!document.createElementNS(ns.svg, 'svg').createSVGRect;
};
// specifically for SVG inline in HTML, not within XHTML
// test page: paulirish.com/demo/inline-svg
tests['inlinesvg'] = function() {
var div = document.createElement('div');
div.innerHTML = '<svg/>';
return (div.firstChild && div.firstChild.namespaceURI) == ns.svg;
};
// SVG SMIL animation
tests['smil'] = function() {
return !!document.createElementNS && /SVGAnimate/.test(toString.call(document.createElementNS(ns.svg, 'animate')));
};
// This test is only for clip paths in SVG proper, not clip paths on HTML content
// demo: srufaculty.sru.edu/david.dailey/svg/newstuff/clipPath4.svg
// However read the comments to dig into applying SVG clippaths to HTML content here:
// github.com/Modernizr/Modernizr/issues/213#issuecomment-1149491
tests['svgclippaths'] = function() {
return !!document.createElementNS && /SVGClipPath/.test(toString.call(document.createElementNS(ns.svg, 'clipPath')));
};
/*>>webforms*/
// input features and input types go directly onto the ret object, bypassing the tests loop.
// Hold this guy to execute in a moment.
function webforms() {
/*>>input*/
// Run through HTML5's new input attributes to see if the UA understands any.
// We're using f which is the <input> element created early on
// Mike Taylr has created a comprehensive resource for testing these attributes
// when applied to all input types:
// miketaylr.com/code/input-type-attr.html
// spec: www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary
// Only input placeholder is tested while textarea's placeholder is not.
// Currently Safari 4 and Opera 11 have support only for the input placeholder
// Both tests are available in feature-detects/forms-placeholder.js
Modernizr['input'] = (function( props ) {
for ( var i = 0, len = props.length; i < len; i++ ) {
attrs[ props[i] ] = !!(props[i] in inputElem);
}
if (attrs.list){
// safari false positive's on datalist: webk.it/74252
// see also github.com/Modernizr/Modernizr/issues/146
attrs.list = !!(document.createElement('datalist') && window.HTMLDataListElement);
}
return attrs;
})('autocomplete autofocus list placeholder max min multiple pattern required step'.split(' '));
/*>>input*/
/*>>inputtypes*/
// Run through HTML5's new input types to see if the UA understands any.
// This is put behind the tests runloop because it doesn't return a
// true/false like all the other tests; instead, it returns an object
// containing each input type with its corresponding true/false value
// Big thanks to @miketaylr for the html5 forms expertise. miketaylr.com/
Modernizr['inputtypes'] = (function(props) {
for ( var i = 0, bool, inputElemType, defaultView, len = props.length; i < len; i++ ) {
inputElem.setAttribute('type', inputElemType = props[i]);
bool = inputElem.type !== 'text';
// We first check to see if the type we give it sticks..
// If the type does, we feed it a textual value, which shouldn't be valid.
// If the value doesn't stick, we know there's input sanitization which infers a custom UI
if ( bool ) {
inputElem.value = smile;
inputElem.style.cssText = 'position:absolute;visibility:hidden;';
if ( /^range$/.test(inputElemType) && inputElem.style.WebkitAppearance !== undefined ) {
docElement.appendChild(inputElem);
defaultView = document.defaultView;
// Safari 2-4 allows the smiley as a value, despite making a slider
bool = defaultView.getComputedStyle &&
defaultView.getComputedStyle(inputElem, null).WebkitAppearance !== 'textfield' &&
// Mobile android web browser has false positive, so must
// check the height to see if the widget is actually there.
(inputElem.offsetHeight !== 0);
docElement.removeChild(inputElem);
} else if ( /^(search|tel)$/.test(inputElemType) ){
// Spec doesn't define any special parsing or detectable UI
// behaviors so we pass these through as true
// Interestingly, opera fails the earlier test, so it doesn't
// even make it here.
} else if ( /^(url|email)$/.test(inputElemType) ) {
// Real url and email support comes with prebaked validation.
bool = inputElem.checkValidity && inputElem.checkValidity() === false;
} else {
// If the upgraded input compontent rejects the :) text, we got a winner
bool = inputElem.value != smile;
}
}
inputs[ props[i] ] = !!bool;
}
return inputs;
})('search tel url email datetime date month week time datetime-local number range color'.split(' '));
/*>>inputtypes*/
}
/*>>webforms*/
// End of test definitions
// -----------------------
// Run through all tests and detect their support in the current UA.
// todo: hypothetically we could be doing an array of tests and use a basic loop here.
for ( var feature in tests ) {
if ( hasOwnProp(tests, feature) ) {
// run the test, throw the return value into the Modernizr,
// then based on that boolean, define an appropriate className
// and push it into an array of classes we'll join later.
featureName = feature.toLowerCase();
Modernizr[featureName] = tests[feature]();
classes.push((Modernizr[featureName] ? '' : 'no-') + featureName);
}
}
/*>>webforms*/
// input tests need to run.
Modernizr.input || webforms();
/*>>webforms*/
/**
* addTest allows the user to define their own feature tests
* the result will be added onto the Modernizr object,
* as well as an appropriate className set on the html element
*
* @param feature - String naming the feature
* @param test - Function returning true if feature is supported, false if not
*/
Modernizr.addTest = function ( feature, test ) {
if ( typeof feature == 'object' ) {
for ( var key in feature ) {
if ( hasOwnProp( feature, key ) ) {
Modernizr.addTest( key, feature[ key ] );
}
}
} else {
feature = feature.toLowerCase();
if ( Modernizr[feature] !== undefined ) {
// we're going to quit if you're trying to overwrite an existing test
// if we were to allow it, we'd do this:
// var re = new RegExp("\\b(no-)?" + feature + "\\b");
// docElement.className = docElement.className.replace( re, '' );
// but, no rly, stuff 'em.
return Modernizr;
}
test = typeof test == 'function' ? test() : test;
if (typeof enableClasses !== "undefined" && enableClasses) {
docElement.className += ' ' + (test ? '' : 'no-') + feature;
}
Modernizr[feature] = test;
}
return Modernizr; // allow chaining.
};
// Reset modElem.cssText to nothing to reduce memory footprint.
setCss('');
modElem = inputElem = null;
/*>>shiv*/
/*! HTML5 Shiv v3.6.1 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed */
;(function(window, document) {
/*jshint evil:true */
/** Preset options */
var options = window.html5 || {};
/** Used to skip problem elements */
var reSkip = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i;
/** Not all elements can be cloned in IE **/
var saveClones = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i;
/** Detect whether the browser supports default html5 styles */
var supportsHtml5Styles;
/** Name of the expando, to work with multiple documents or to re-shiv one document */
var expando = '_html5shiv';
/** The id for the the documents expando */
var expanID = 0;
/** Cached data for each document */
var expandoData = {};
/** Detect whether the browser supports unknown elements */
var supportsUnknownElements;
(function() {
try {
var a = document.createElement('a');
a.innerHTML = '<xyz></xyz>';
//if the hidden property is implemented we can assume, that the browser supports basic HTML5 Styles
supportsHtml5Styles = ('hidden' in a);
supportsUnknownElements = a.childNodes.length == 1 || (function() {
// assign a false positive if unable to shiv
(document.createElement)('a');
var frag = document.createDocumentFragment();
return (
typeof frag.cloneNode == 'undefined' ||
typeof frag.createDocumentFragment == 'undefined' ||
typeof frag.createElement == 'undefined'
);
}());
} catch(e) {
supportsHtml5Styles = true;
supportsUnknownElements = true;
}
}());
/*--------------------------------------------------------------------------*/
/**
* Creates a style sheet with the given CSS text and adds it to the document.
* @private
* @param {Document} ownerDocument The document.
* @param {String} cssText The CSS text.
* @returns {StyleSheet} The style element.
*/
function addStyleSheet(ownerDocument, cssText) {
var p = ownerDocument.createElement('p'),
parent = ownerDocument.getElementsByTagName('head')[0] || ownerDocument.documentElement;
p.innerHTML = 'x<style>' + cssText + '</style>';
return parent.insertBefore(p.lastChild, parent.firstChild);
}
/**
* Returns the value of `html5.elements` as an array.
* @private
* @returns {Array} An array of shived element node names.
*/
function getElements() {
var elements = html5.elements;
return typeof elements == 'string' ? elements.split(' ') : elements;
}
/**
* Returns the data associated to the given document
* @private
* @param {Document} ownerDocument The document.
* @returns {Object} An object of data.
*/
function getExpandoData(ownerDocument) {
var data = expandoData[ownerDocument[expando]];
if (!data) {
data = {};
expanID++;
ownerDocument[expando] = expanID;
expandoData[expanID] = data;
}
return data;
}
/**
* returns a shived element for the given nodeName and document
* @memberOf html5
* @param {String} nodeName name of the element
* @param {Document} ownerDocument The context document.
* @returns {Object} The shived element.
*/
function createElement(nodeName, ownerDocument, data){
if (!ownerDocument) {
ownerDocument = document;
}
if(supportsUnknownElements){
return ownerDocument.createElement(nodeName);
}
if (!data) {
data = getExpandoData(ownerDocument);
}
var node;
if (data.cache[nodeName]) {
node = data.cache[nodeName].cloneNode();
} else if (saveClones.test(nodeName)) {
node = (data.cache[nodeName] = data.createElem(nodeName)).cloneNode();
} else {
node = data.createElem(nodeName);
}
// Avoid adding some elements to fragments in IE < 9 because
// * Attributes like `name` or `type` cannot be set/changed once an element
// is inserted into a document/fragment
// * Link elements with `src` attributes that are inaccessible, as with
// a 403 response, will cause the tab/window to crash
// * Script elements appended to fragments will execute when their `src`
// or `text` property is set
return node.canHaveChildren && !reSkip.test(nodeName) ? data.frag.appendChild(node) : node;
}
/**
* returns a shived DocumentFragment for the given document
* @memberOf html5
* @param {Document} ownerDocument The context document.
* @returns {Object} The shived DocumentFragment.
*/
function createDocumentFragment(ownerDocument, data){
if (!ownerDocument) {
ownerDocument = document;
}
if(supportsUnknownElements){
return ownerDocument.createDocumentFragment();
}
data = data || getExpandoData(ownerDocument);
var clone = data.frag.cloneNode(),
i = 0,
elems = getElements(),
l = elems.length;
for(;i<l;i++){
clone.createElement(elems[i]);
}
return clone;
}
/**
* Shivs the `createElement` and `createDocumentFragment` methods of the document.
* @private
* @param {Document|DocumentFragment} ownerDocument The document.
* @param {Object} data of the document.
*/
function shivMethods(ownerDocument, data) {
if (!data.cache) {
data.cache = {};
data.createElem = ownerDocument.createElement;
data.createFrag = ownerDocument.createDocumentFragment;
data.frag = data.createFrag();
}
ownerDocument.createElement = function(nodeName) {
//abort shiv
if (!html5.shivMethods) {
return data.createElem(nodeName);
}
return createElement(nodeName, ownerDocument, data);
};
ownerDocument.createDocumentFragment = Function('h,f', 'return function(){' +
'var n=f.cloneNode(),c=n.createElement;' +
'h.shivMethods&&(' +
// unroll the `createElement` calls
getElements().join().replace(/\w+/g, function(nodeName) {
data.createElem(nodeName);
data.frag.createElement(nodeName);
return 'c("' + nodeName + '")';
}) +
');return n}'
)(html5, data.frag);
}
/*--------------------------------------------------------------------------*/
/**
* Shivs the given document.
* @memberOf html5
* @param {Document} ownerDocument The document to shiv.
* @returns {Document} The shived document.
*/
function shivDocument(ownerDocument) {
if (!ownerDocument) {
ownerDocument = document;
}
var data = getExpandoData(ownerDocument);
if (html5.shivCSS && !supportsHtml5Styles && !data.hasCSS) {
data.hasCSS = !!addStyleSheet(ownerDocument,
// corrects block display not defined in IE6/7/8/9
'article,aside,figcaption,figure,footer,header,hgroup,nav,section{display:block}' +
// adds styling not present in IE6/7/8/9
'mark{background:#FF0;color:#000}'
);
}
if (!supportsUnknownElements) {
shivMethods(ownerDocument, data);
}
return ownerDocument;
}
/*--------------------------------------------------------------------------*/
/**
* The `html5` object is exposed so that more elements can be shived and
* existing shiving can be detected on iframes.
* @type Object
* @example
*
* // options can be changed before the script is included
* html5 = { 'elements': 'mark section', 'shivCSS': false, 'shivMethods': false };
*/
var html5 = {
/**
* An array or space separated string of node names of the elements to shiv.
* @memberOf html5
* @type Array|String
*/
'elements': options.elements || 'abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video',
/**
* A flag to indicate that the HTML5 style sheet should be inserted.
* @memberOf html5
* @type Boolean
*/
'shivCSS': (options.shivCSS !== false),
/**
* Is equal to true if a browser supports creating unknown/HTML5 elements
* @memberOf html5
* @type boolean
*/
'supportsUnknownElements': supportsUnknownElements,
/**
* A flag to indicate that the document's `createElement` and `createDocumentFragment`
* methods should be overwritten.
* @memberOf html5
* @type Boolean
*/
'shivMethods': (options.shivMethods !== false),
/**
* A string to describe the type of `html5` object ("default" or "default print").
* @memberOf html5
* @type String
*/
'type': 'default',
// shivs the document according to the specified `html5` object options
'shivDocument': shivDocument,
//creates a shived element
createElement: createElement,
//creates a shived documentFragment
createDocumentFragment: createDocumentFragment
};
/*--------------------------------------------------------------------------*/
// expose html5
window.html5 = html5;
// shiv the document
shivDocument(document);
}(this, document));
/*>>shiv*/
// Assign private properties to the return object with prefix
Modernizr._version = version;
// expose these for the plugin API. Look in the source for how to join() them against your input
/*>>prefixes*/
Modernizr._prefixes = prefixes;
/*>>prefixes*/
/*>>domprefixes*/
Modernizr._domPrefixes = domPrefixes;
Modernizr._cssomPrefixes = cssomPrefixes;
/*>>domprefixes*/
/*>>mq*/
// Modernizr.mq tests a given media query, live against the current state of the window
// A few important notes:
// * If a browser does not support media queries at all (eg. oldIE) the mq() will always return false
// * A max-width or orientation query will be evaluated against the current state, which may change later.
// * You must specify values. Eg. If you are testing support for the min-width media query use:
// Modernizr.mq('(min-width:0)')
// usage:
// Modernizr.mq('only screen and (max-width:768)')
Modernizr.mq = testMediaQuery;
/*>>mq*/
/*>>hasevent*/
// Modernizr.hasEvent() detects support for a given event, with an optional element to test on
// Modernizr.hasEvent('gesturestart', elem)
Modernizr.hasEvent = isEventSupported;
/*>>hasevent*/
/*>>testprop*/
// Modernizr.testProp() investigates whether a given style property is recognized
// Note that the property names must be provided in the camelCase variant.
// Modernizr.testProp('pointerEvents')
Modernizr.testProp = function(prop){
return testProps([prop]);
};
/*>>testprop*/
/*>>testallprops*/
// Modernizr.testAllProps() investigates whether a given style property,
// or any of its vendor-prefixed variants, is recognized
// Note that the property names must be provided in the camelCase variant.
// Modernizr.testAllProps('boxSizing')
Modernizr.testAllProps = testPropsAll;
/*>>testallprops*/
/*>>teststyles*/
// Modernizr.testStyles() allows you to add custom styles to the document and test an element afterwards
// Modernizr.testStyles('#modernizr { position:absolute }', function(elem, rule){ ... })
Modernizr.testStyles = injectElementWithStyles;
/*>>teststyles*/
/*>>prefixed*/
// Modernizr.prefixed() returns the prefixed or nonprefixed property name variant of your input
// Modernizr.prefixed('boxSizing') // 'MozBoxSizing'
// Properties must be passed as dom-style camelcase, rather than `box-sizing` hypentated style.
// Return values will also be the camelCase variant, if you need to translate that to hypenated style use:
//
// str.replace(/([A-Z])/g, function(str,m1){ return '-' + m1.toLowerCase(); }).replace(/^ms-/,'-ms-');
// If you're trying to ascertain which transition end event to bind to, you might do something like...
//
// var transEndEventNames = {
// 'WebkitTransition' : 'webkitTransitionEnd',
// 'MozTransition' : 'transitionend',
// 'OTransition' : 'oTransitionEnd',
// 'msTransition' : 'MSTransitionEnd',
// 'transition' : 'transitionend'
// },
// transEndEventName = transEndEventNames[ Modernizr.prefixed('transition') ];
Modernizr.prefixed = function(prop, obj, elem){
if(!obj) {
return testPropsAll(prop, 'pfx');
} else {
// Testing DOM property e.g. Modernizr.prefixed('requestAnimationFrame', window) // 'mozRequestAnimationFrame'
return testPropsAll(prop, obj, elem);
}
};
/*>>prefixed*/
/*>>cssclasses*/
// Remove "no-js" class from <html> element, if it exists:
docElement.className = docElement.className.replace(/(^|\s)no-js(\s|$)/, '$1$2') +
// Add the new classes to the <html> element.
(enableClasses ? ' js ' + classes.join(' ') : '');
/*>>cssclasses*/
return Modernizr;
})(this, this.document);

282
js/multiselect.js Normal file
View File

@ -0,0 +1,282 @@
/**
* @param 'createCallback' A function to be called when a new entry is created. Two arguments are supplied to this function:
* The select element used and the value of the option. If the function returns false addition will be cancelled. If it returns
* anything else it will be used as the value of the newly added option.
* @param 'createText' The placeholder text for the create action.
* @param 'title' The title to show if no options are selected.
* @param 'checked' An array containing values for options that should be checked. Any options which are already selected will be added to this array.
* @param 'labels' The corresponding labels to show for the checked items.
* @param 'oncheck' Callback function which will be called when a checkbox/radiobutton is selected. If the function returns false the input will be unchecked.
* @param 'onuncheck' @see 'oncheck'.
* @param 'singleSelect' If true radiobuttons will be used instead of checkboxes.
*/
(function( $ ){
var multiSelectId=-1;
$.fn.multiSelect=function(options) {
multiSelectId++;
var settings = {
'createCallback':false,
'createText':false,
'singleSelect':false,
'title':this.attr('title'),
'checked':[],
'labels':[],
'oncheck':false,
'onuncheck':false,
'minWidth': 'default;',
};
$(this).attr('data-msid', multiSelectId);
$.extend(settings,options);
$.each(this.children(),function(i,option) {
// If the option is selected, but not in the checked array, add it.
if($(option).attr('selected') && settings.checked.indexOf($(option).val()) === -1) {
settings.checked.push($(option).val());
settings.labels.push($(option).text().trim());
}
// If the option is in the checked array but not selected, select it.
else if(settings.checked.indexOf($(option).val()) !== -1 && !$(option).attr('selected')) {
$(option).attr('selected', 'selected');
settings.labels.push($(option).text().trim());
}
});
var button=$('<div class="multiselect button"><span>'+settings.title+'</span><span>▾</span></div>');
var span=$('<span/>');
span.append(button);
button.data('id',multiSelectId);
button.selectedItems=[];
this.hide();
this.before(span);
if(settings.minWidth=='default') {
settings.minWidth=button.width();
}
button.css('min-width',settings.minWidth);
settings.minOuterWidth=button.outerWidth()-2;
button.data('settings',settings);
if(!settings.singleSelect && settings.checked.length>0) {
button.children('span').first().text(settings.labels.join(', '));
} else if(settings.singleSelect) {
button.children('span').first().text(this.find(':selected').text());
}
var self = this;
self.menuDirection = 'down';
button.click(function(event){
var button=$(this);
if(button.parent().children('ul').length>0) {
if(self.menuDirection === 'down') {
button.parent().children('ul').slideUp(400,function() {
button.parent().children('ul').remove();
button.removeClass('active');
});
} else {
button.parent().children('ul').fadeOut(400,function() {
button.parent().children('ul').remove();
button.removeClass('active').removeClass('up');
});
}
return;
}
var lists=$('ul.multiselectoptions');
lists.slideUp(400,function(){
lists.remove();
$('div.multiselect').removeClass('active');
button.addClass('active');
});
button.addClass('active');
event.stopPropagation();
var options=$(this).parent().next().children();
var list=$('<ul class="multiselectoptions"/>').hide().appendTo($(this).parent());
var inputType = settings.singleSelect ? 'radio' : 'checkbox';
function createItem(element, checked){
element=$(element);
var item=element.val();
var id='ms'+multiSelectId+'-option-'+item;
var input=$('<input type="' + inputType + '"/>');
input.attr('id',id);
if(settings.singleSelect) {
input.attr('name', 'ms'+multiSelectId+'-option');
}
var label=$('<label/>');
label.attr('for',id);
label.text(element.text() || item);
if(settings.checked.indexOf(item)!=-1 || checked) {
input.attr('checked', true);
}
if(checked){
if(settings.singleSelect) {
settings.checked = [item];
settings.labels = [item];
} else {
settings.checked.push(item);
settings.labels.push(item);
}
}
input.change(function(){
var value = $(this).attr('id').substring(String('ms'+multiSelectId+'-option').length+1);
var label = $(this).next().text().trim();
if($(this).is(':checked')) {
if(settings.singleSelect) {
settings.checked = [];
settings.labels = [];
$.each(self.find('option'), function() {
$(this).removeAttr('selected');
});
}
element.attr('selected','selected');
if(typeof settings.oncheck === 'function') {
if(settings.oncheck(value)===false) {
$(this).attr('checked', false);
return;
}
}
settings.checked.push(value);
settings.labels.push(label);
} else {
var index=settings.checked.indexOf(value);
element.attr('selected',null);
if(typeof settings.onuncheck === 'function') {
if(settings.onuncheck(value)===false) {
$(this).attr('checked',true);
return;
}
}
settings.checked.splice(index,1);
settings.labels.splice(index,1);
}
var oldWidth=button.width();
button.children('span').first().text(settings.labels.length > 0
? settings.labels.join(', ')
: settings.title);
var newOuterWidth=Math.max((button.outerWidth()-2),settings.minOuterWidth)+'px';
var newWidth=Math.max(button.width(),settings.minWidth);
var pos=button.position();
button.css('height',button.height());
button.css('white-space','nowrap');
button.css('width',oldWidth);
button.animate({'width':newWidth},undefined,undefined,function(){
button.css('width','');
});
list.animate({'width':newOuterWidth,'left':pos.left+3});
});
var li=$('<li></li>');
li.append(input).append(label);
return li;
}
$.each(options,function(index,item){
list.append(createItem(item));
});
button.parent().data('preventHide',false);
if(settings.createText){
var li=$('<li>+ <em>'+settings.createText+'<em></li>');
li.click(function(event){
li.empty();
var input=$('<input class="new">');
li.append(input);
input.focus();
input.css('width',button.innerWidth());
button.parent().data('preventHide',true);
input.keypress(function(event) {
if(event.keyCode == 13) {
event.preventDefault();
event.stopPropagation();
var value = $(this).val();
var exists = false;
$.each(options,function(index, item) {
if ($(item).val() == value || $(item).text() == value) {
exists = true;
return false;
}
});
if (exists) {
return false;
}
var li=$(this).parent();
var val = $(this).val()
var select=button.parent().next();
if(typeof settings.createCallback === 'function') {
var response = settings.createCallback(select, val);
console.log('response', response);
if(response === false) {
return false;
} else if(typeof response !== 'undefined') {
val = response;
}
}
if(settings.singleSelect) {
$.each(select.find('option:selected'), function() {
$(this).removeAttr('selected');
});
}
$(this).remove();
li.text('+ '+settings.createText);
li.before(createItem(this));
var option=$('<option selected="selected"/>');
option.text($(this).val()).val(val).attr('selected', 'selected');
select.append(option);
li.prev().children('input').prop('checked', true).trigger('change');
button.parent().data('preventHide',false);
button.children('span').first().text(settings.labels.length > 0
? settings.labels.join(', ')
: settings.title);
if(self.menuDirection === 'up') {
var list = li.parent();
list.css('top', list.position().top-li.outerHeight());
}
}
});
input.blur(function() {
event.preventDefault();
event.stopPropagation();
$(this).remove();
li.text('+ '+settings.createText);
setTimeout(function(){
button.parent().data('preventHide',false);
},100);
});
});
list.append(li);
}
var pos=button.position();
if($(document).height() > button.offset().top+button.outerHeight() + list.children().length * button.height()) {
list.css('top',pos.top+button.outerHeight()-5);
list.css('left',pos.left+3);
list.css('width',(button.outerWidth()-2)+'px');
list.addClass('down');
button.addClass('down');
list.slideDown();
} else {
list.css('top', pos.top - list.height());
list.css('left', pos.left+3);
list.css('width',(button.outerWidth()-2)+'px');
list.detach().insertBefore($(this));
list.addClass('up');
button.addClass('up');
list.fadeIn();
self.menuDirection = 'up';
}
list.click(function(event) {
event.stopPropagation();
});
});
$(window).click(function() {
if(!button.parent().data('preventHide')) {
// How can I save the effect in a var?
if(self.menuDirection === 'down') {
button.parent().children('ul').slideUp(400,function() {
button.parent().children('ul').remove();
button.removeClass('active').removeClass('down');
});
} else {
button.parent().children('ul').fadeOut(400,function() {
button.parent().children('ul').remove();
button.removeClass('active').removeClass('up');
});
}
}
});
return span;
};
})( jQuery );

View File

@ -0,0 +1,212 @@
/**
* HTML5 placeholder polyfill
* @requires jQuery - tested with 1.6.2 but might as well work with older versions
*
* code: https://github.com/ginader/HTML5-placeholder-polyfill
* please report issues at: https://github.com/ginader/HTML5-placeholder-polyfill/issues
*
* Copyright (c) 2012 Dirk Ginader (ginader.de)
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
* Version: 2.0.3
*
* History:
* * 1.0 initial release
* * 1.1 added support for multiline placeholders in textareas
* * 1.2 Allow label to wrap the input element by noah https://github.com/ginader/HTML5-placeholder-polyfill/pull/1
* * 1.3 New option to read placeholder to Screenreaders. Turned on by default
* * 1.4 made placeholder more rubust to allow labels being offscreen + added minified version of the 3rd party libs
* * 1.5 emptying the native placeholder to prevent double rendering in Browsers with partial support
* * 1.6 optional reformat when a textarea is being resized - requires http://benalman.com/projects/jquery-resize-plugin/
* * 1.7 feature detection is now included in the polyfill so you can simply include it without the need for Modernizr
* * 1.8 replacing the HTML5 Boilerplate .visuallyhidden technique with one that still allows the placeholder to be rendered
* * 1.8.1 bugfix for implicit labels
* * 1.9 New option "hideOnFocus" which, if set to false will mimic the behavior of mobile safari and chrome (remove label when typed instead of onfocus)
* * 1.9.1 added reformat event on window resize
* * 1.9.2 more flexible way to "fix" labels that are hidden using clip() thanks to grahambates: https://github.com/ginader/HTML5-placeholder-polyfill/issues/12
* * 2.0 new easier configuration technique and new options forceApply and AutoInit and support for setters and getters
* * 2.0.1 changed check for empty field so a space character is no longer ignored
* * 2.0.2 allow rerun of the placeholder() to cover generated elements - existing polyfilled placeholder will be repositioned. Fixing: https://github.com/ginader/HTML5-placeholder-polyfill/issues/15
* * 2.0.3 turn debugging of for production. fix https://github.com/ginader/HTML5-placeholder-polyfill/issues/18
*/
(function($) {
var debug = false,
animId;
function showPlaceholderIfEmpty(input,options) {
if( input.val() === '' ){
input.data('placeholder').removeClass(options.hideClass);
}else{
input.data('placeholder').addClass(options.hideClass);
}
}
function hidePlaceholder(input,options){
input.data('placeholder').addClass(options.hideClass);
}
function positionPlaceholder(placeholder,input){
var ta = input.is('textarea');
placeholder.css({
width : input.innerWidth()-(ta ? 20 : 4),
height : input.innerHeight()-6,
lineHeight : input.css('line-height'),
whiteSpace : ta ? 'normal' : 'nowrap',
overflow : 'hidden'
}).offset(input.offset());
}
function startFilledCheckChange(input,options){
var input = input,
val = input.val();
(function checkloop(){
animId = requestAnimationFrame(checkloop);
if(input.val() != val){
hidePlaceholder(input,options);
stopCheckChange();
startEmptiedCheckChange(input,options);
}
})();
}
function startEmptiedCheckChange(input,options){
var input = input,
val = input.val();
(function checkloop(){
animId = requestAnimationFrame(checkloop);
showPlaceholderIfEmpty(input,options);
})();
}
function stopCheckChange(){
cancelAnimationFrame(animId);
}
function log(msg){
if(debug && window.console && window.console.log){
window.console.log(msg);
}
}
$.fn.placeHolder = function(config) {
log('init placeHolder');
var o = this;
var l = $(this).length;
this.options = $.extend({
className: 'placeholder', // css class that is used to style the placeholder
visibleToScreenreaders : true, // expose the placeholder text to screenreaders or not
visibleToScreenreadersHideClass : 'placeholder-hide-except-screenreader', // css class is used to visually hide the placeholder
visibleToNoneHideClass : 'placeholder-hide', // css class used to hide the placeholder for all
hideOnFocus : false, // either hide the placeholder on focus or on type
removeLabelClass : 'visuallyhidden', // remove this class from a label (to fix hidden labels)
hiddenOverrideClass : 'visuallyhidden-with-placeholder', // replace the label above with this class
forceHiddenOverride : true, // allow the replace of the removeLabelClass with hiddenOverrideClass or not
forceApply : false, // apply the polyfill even for browser with native support
autoInit : true // init automatically or not
}, config);
this.options.hideClass = this.options.visibleToScreenreaders ? this.options.visibleToScreenreadersHideClass : this.options.visibleToNoneHideClass;
return $(this).each(function(index) {
var input = $(this),
text = input.attr('placeholder'),
id = input.attr('id'),
label,placeholder,titleNeeded,polyfilled;
label = input.closest('label');
input.removeAttr('placeholder');
if(!label.length && !id){
log('the input element with the placeholder needs an id!');
return;
}
label = label.length ? label : $('label[for="'+id+'"]').first();
if(!label.length){
log('the input element with the placeholder needs a label!');
return;
}
polyfilled = $(label).find('.placeholder');
if(polyfilled.length) {
//log('the input element already has a polyfilled placeholder!');
positionPlaceholder(polyfilled,input);
return input;
}
if(label.hasClass(o.options.removeLabelClass)){
label.removeClass(o.options.removeLabelClass)
.addClass(o.options.hiddenOverrideClass);
}
placeholder = $('<span class="'+o.options.className+'">'+text+'</span>').appendTo(label);
titleNeeded = (placeholder.width() > input.width());
if(titleNeeded){
placeholder.attr('title',text);
}
positionPlaceholder(placeholder,input);
input.data('placeholder',placeholder);
placeholder.data('input',placeholder);
placeholder.click(function(){
$(this).data('input').focus();
});
input.focusin(function() {
if(!o.options.hideOnFocus && window.requestAnimationFrame){
startFilledCheckChange(input,o.options);
}else{
hidePlaceholder(input,o.options);
}
});
input.focusout(function(){
showPlaceholderIfEmpty($(this),o.options);
if(!o.options.hideOnFocus && window.cancelAnimationFrame){
stopCheckChange();
}
});
showPlaceholderIfEmpty(input,o.options);
// reformat on window resize and optional reformat on font resize - requires: http://www.tomdeater.com/jquery/onfontresize/
$(document).bind("fontresize resize", function(){
positionPlaceholder(placeholder,input);
});
// optional reformat when a textarea is being resized - requires http://benalman.com/projects/jquery-resize-plugin/
if($.event.special.resize){
$("textarea").bind("resize", function(e){
positionPlaceholder(placeholder,input);
});
}else{
// we simply disable the resizeablilty of textareas when we can't react on them resizing
$("textarea").css('resize','none');
}
if(index >= l-1){
$.attrHooks.placeholder = {
get: function(elem) {
if (elem.nodeName.toLowerCase() == 'input' || elem.nodeName.toLowerCase() == 'textarea') {
if( $(elem).data('placeholder') ){
// has been polyfilled
return $( $(elem).data('placeholder') ).text();
}else{
// native / not yet polyfilled
return $(elem)[0].placeholder;
}
}else{
return undefined;
}
},
set: function(elem, value){
return $( $(elem).data('placeholder') ).text(value);
}
};
}
});
};
$(function(){
var config = window.placeHolderConfig || {};
if(config.autoInit === false){
log('placeholder:abort because autoInit is off');
return
}
if('placeholder' in $('<input>')[0] && !config.forceApply){ // don't run the polyfill when the browser has native support
log('placeholder:abort because browser has native support');
return;
}
$('input[placeholder], textarea[placeholder]').placeHolder(config);
});
})(jQuery);

View File

@ -15,12 +15,11 @@ OC.Contacts.Settings = OC.Contacts.Settings || {
var active = tgt.is(':checked');
//console.log('doActivate: ', id, active);
$.post(OC.filePath('contacts', 'ajax', 'addressbook/activate.php'), {id: id, active: Number(active)}, function(jsondata) {
if (jsondata.status == 'success'){
if(!active) {
$('#contacts h3[data-id="'+id+'"],#contacts ul[data-id="'+id+'"]').remove();
} else {
OC.Contacts.Contacts.update();
}
if (jsondata.status == 'success') {
$(document).trigger('request.addressbook.activate', {
id: id,
activate: active,
});
} else {
//console.log('Error:', jsondata.data.message);
OC.Contacts.notify(t('contacts', 'Error') + ': ' + jsondata.data.message);
@ -41,7 +40,7 @@ OC.Contacts.Settings = OC.Contacts.Settings || {
$('#contacts h3[data-id="'+id+'"],#contacts ul[data-id="'+id+'"]').remove();
row.remove()
OC.Contacts.Settings.Addressbook.showActions(['new',]);
OC.Contacts.Contacts.update();
OC.Contacts.update();
} else {
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
}
@ -108,7 +107,7 @@ OC.Contacts.Settings = OC.Contacts.Settings || {
row.find('td.name').text(jsondata.data.addressbook.displayname);
row.find('td.description').text(jsondata.data.addressbook.description);
}
OC.Contacts.Contacts.update();
OC.Contacts.update();
} else {
OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error'));
}
@ -157,11 +156,9 @@ $(document).ready(function() {
event.preventDefault();
if(OC.Contacts.Settings.Addressbook.adrsettings.is(':visible')) {
OC.Contacts.Settings.Addressbook.adrsettings.slideUp();
OC.Contacts.Settings.Addressbook.adrsettings.prev('dt').hide();
moreless.text(t('contacts', 'More...'));
} else {
OC.Contacts.Settings.Addressbook.adrsettings.slideDown();
OC.Contacts.Settings.Addressbook.adrsettings.prev('dt').show();
moreless.text(t('contacts', 'Less...'));
}
});

View File

@ -1,42 +1,58 @@
<?php $TRANSLATIONS = array(
"Error (de)activating addressbook." => "خطء خلال توقيف كتاب العناوين.",
"Cannot add empty property." => "لا يمكنك اضافه صفه خاليه.",
"At least one of the address fields has to be filled out." => "يجب ملء على الاقل خانه واحده من العنوان.",
"Information about vCard is incorrect. Please reload the page." => "المعلومات الموجودة في ال vCard غير صحيحة. الرجاء إعادة تحديث الصفحة.",
"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",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "حجم الملف الذي تريد ترفيعه أعلى مما MAX_FILE_SIZE يسمح به في واجهة ال HTML.",
"The uploaded file was only partially uploaded" => "تم ترفيع جزء من الملفات الذي تريد ترفيعها فقط",
"No file was uploaded" => "لم يتم ترفيع أي من الملفات",
"Missing a temporary folder" => "المجلد المؤقت غير موجود",
"Contacts" => "المعارف",
"Upload too large" => "حجم الترفيع أعلى من المسموح",
"Download" => "انزال",
"Edit" => "تعديل",
"Delete" => "حذف",
"Cancel" => "الغاء",
"This is not your addressbook." => "هذا ليس دفتر عناوينك.",
"Contact could not be found." => "لم يتم العثور على الشخص.",
"Work" => "الوظيفة",
"Home" => "البيت",
"Other" => "شيء آخر",
"Mobile" => "الهاتف المحمول",
"Text" => "معلومات إضافية",
"Voice" => "صوت",
"Fax" => "الفاكس",
"Video" => "الفيديو",
"Pager" => "الرنان",
"Birthday" => "تاريخ الميلاد",
"Contact" => "معرفه",
"Add Contact" => "أضف شخص ",
"Settings" => "اعدادات",
"Import" => "إدخال",
"Groups" => "مجموعات",
"Close" => "اغلق",
"Title" => "عنوان",
"Organization" => "المؤسسة",
"Preferred" => "مفضل",
"Birthday" => "تاريخ الميلاد",
"Add" => "اضف",
"Phone" => "الهاتف",
"Email" => "البريد الالكتروني",
"Address" => "عنوان",
"Download contact" => "انزال المعرفه",
"Delete contact" => "امحي المعرفه",
"Preferred" => "مفضل",
"City" => "المدينة",
"Country" => "البلد",
"Share" => "شارك",
"Export" => "تصدير المعلومات",
"Add Contact" => "أضف شخص ",
"Download contact" => "انزال المعرفه",
"Type" => "نوع",
"PO Box" => "العنوان البريدي",
"Extended" => "إضافة",
"City" => "المدينة",
"Region" => "المنطقة",
"Zipcode" => "رقم المنطقة",
"Country" => "البلد",
"Addressbook" => "كتاب العناوين",
"more info" => "مزيد من المعلومات",
"Primary address (Kontact et al)" => "العنوان الرئيسي (جهات الإتصال)",
"iOS/OS X" => "ط ن ت/ ن ت 10",
"Addressbooks" => "كتب العناوين",
"New Address Book" => "كتاب عناوين جديد",
"Name" => "اسم",
"Save" => "حفظ"
);

26
l10n/bg_BG.php Normal file
View File

@ -0,0 +1,26 @@
<?php $TRANSLATIONS = array(
"No categories selected for deletion." => "Няма избрани категории за изтриване",
"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",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Файлът който се опитвате да качите надвишава стойностите в MAX_FILE_SIZE в HTML формата.",
"The uploaded file was only partially uploaded" => "Файлът е качен частично",
"No file was uploaded" => "Фахлът не бе качен",
"Missing a temporary folder" => "Липсва временната папка",
"Error" => "Грешка",
"Upload Error" => "Грешка при качване",
"Download" => "Изтегляне",
"Delete" => "Изтриване",
"Cancel" => "Отказ",
"Work" => "Работа",
"Other" => "Друго",
"Import" => "Внасяне",
"Groups" => "Групи",
"Title" => "Заглавие",
"Birthday" => "Роджен ден",
"Add" => "Добавяне",
"Email" => "Е-поща",
"Address" => "Адрес",
"Share" => "Споделяне",
"Export" => "Изнасяне",
"Save" => "Запис"
);

View File

@ -2,24 +2,24 @@
"Error (de)activating addressbook." => "Error en (des)activar la llibreta d'adreces.",
"id is not set." => "no s'ha establert la id.",
"Cannot update addressbook with an empty name." => "No es pot actualitzar la llibreta d'adreces amb un nom buit",
"No category name given." => "No heu facilitat cap nom de categoria.",
"Error adding group." => "Error en afegir grup.",
"Group ID missing from request." => "La ID del grup s'ha perdut en el requeriment.",
"Contact ID missing from request." => "La ID del contacte s'ha perdut en el requeriment.",
"No ID provided" => "No heu facilitat cap ID",
"Error setting checksum." => "Error en establir la suma de verificació.",
"No categories selected for deletion." => "No heu seleccionat les categories a eliminar.",
"No address books found." => "No s'han trobat llibretes d'adreces.",
"No contacts found." => "No s'han trobat contactes.",
"element name is not set." => "no s'ha establert el nom de l'element.",
"Could not parse contact: " => "No s'ha pogut processar el contacte:",
"Cannot add empty property." => "No es pot afegir una propietat buida.",
"At least one of the address fields has to be filled out." => "Almenys heu d'omplir un dels camps d'adreça.",
"Trying to add duplicate property: " => "Esteu intentant afegir una propietat duplicada:",
"Missing IM parameter." => "Falta el paràmetre IM.",
"Unknown IM: " => "IM desconegut:",
"Information about vCard is incorrect. Please reload the page." => "La informació de la vCard és incorrecta. Carregueu la pàgina de nou.",
"Missing ID" => "Falta la ID",
"Error parsing VCard for ID: \"" => "Error en analitzar la ID de la VCard: \"",
"checksum is not set." => "no s'ha establert la suma de verificació.",
"Information about vCard is incorrect. Please reload the page." => "La informació de la vCard és incorrecta. Carregueu la pàgina de nou.",
"Couldn't find vCard for %d." => "No s'ha trobat la vCard per %d.",
"Information about vCard is incorrect. Please reload the page: " => "La informació de la vCard és incorrecta. Carregueu de nou la pàgina:",
"Something went FUBAR. " => "Alguna cosa ha anat FUBAR.",
"Cannot save property of type \"%s\" as array" => "No es pot desar la propietat del tipus \"%s\" com una matriu",
"Missing IM parameter." => "Falta el paràmetre IM.",
"Unknown IM: " => "IM desconegut:",
"No contact ID was submitted." => "No s'ha tramès cap ID de contacte.",
"Error reading contact photo." => "Error en llegir la foto del contacte.",
"Error saving temporary file." => "Error en desar el fitxer temporal.",
@ -35,6 +35,9 @@
"Error cropping image" => "Error en retallar la imatge",
"Error creating temporary image" => "Error en crear la imatge temporal",
"Error finding image: " => "Error en trobar la imatge:",
"Key is not set for: " => "No s'ha establert la clau per:",
"Value is not set for: " => "No s'ha establert el valor per:",
"Could not set preference: " => "No s'ha pogut establir la preferència:",
"Error uploading contacts to storage." => "Error en carregar contactes a l'emmagatzemament.",
"There is no error, the file uploaded with success" => "No hi ha errors, el fitxer s'ha carregat correctament",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "El fitxer carregat supera la directiva upload_max_filesize de php.ini",
@ -46,43 +49,53 @@
"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",
"Sorry, this functionality has not been implemented yet" => "Aquesta funcionalitat encara no està implementada",
"Not implemented" => "No implementada",
"Couldn't get a valid address." => "No s'ha pogut obtenir una adreça vàlida.",
"Error" => "Error",
"Please enter an email address." => "Si us plau, introdueixi una adreça de correu electrònic.",
"Enter name" => "Escriviu un nom",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format personalitzat, Nom curt, Nom sencer, Invertit o Invertit amb coma",
"Select type" => "Seleccioneu un tipus",
"%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}",
"Indexing contacts" => "Indexant contactes",
"Add to..." => "Afegeix a...",
"Remove from..." => "Elimina des de...",
"Add group..." => "Afegeix grup...",
"Select photo" => "Selecciona una foto",
"You do not have permission to add contacts to " => "No teniu permisos per afegir contactes a ",
"Please select one of your own address books." => "Seleccioneu una de les vostres llibretes d'adreces",
"Permission error" => "Error de permisos",
"Click to undo deletion of \"" => "Feu clic per desfer l'eliminació de \"",
"Cancelled deletion of: \"" => "Eliminació Cancel·lada : \"",
"This property has to be non-empty." => "Aquesta propietat no pot ser buida.",
"Couldn't serialize elements." => "No s'han pogut serialitzar els elements.",
"Unknown error. Please check logs." => "Error desconegut. Si us plau, revisa els registres.",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' s'ha cridat sense argument de tipus. Informeu-ne a bugs.owncloud.org",
"Edit name" => "Edita el nom",
"No files selected for upload." => "No s'han seleccionat fitxers per a la pujada.",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "El fitxer que intenteu pujar excedeix la mida màxima de pujada en aquest servidor.",
"Error loading profile picture." => "Error en carregar la imatge de perfil.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Heu marcat eliminar alguns contactes, però encara no s'han eliminat. Espereu mentre s'esborren.",
"Do you want to merge these address books?" => "Voleu fusionar aquestes llibretes d'adreces?",
"Shared by " => "Compartit per",
"Upload too large" => "La pujada és massa gran",
"Only image files can be used as profile picture." => "Només els arxius d'imatge es poden utilitzar com a foto de perfil.",
"Wrong file type" => "Tipus d'arxiu incorrecte",
"Your browser doesn't support AJAX upload. Please click on the profile picture to select a photo to upload." => "El seu navegador no suporta la càrrega de AJAX. Feu clic a la foto de perfil per seleccionar la foto que voleu carregar.",
"Unable to upload your file as it is a directory or has 0 bytes" => "No es pot pujar el fitxer perquè és una carpeta o té 0 bytes",
"Upload Error" => "Error en la pujada",
"Pending" => "Pendent",
"Import done" => "S'ha importat",
"Network or server error. Please inform administrator." => "Error de xarxa o del servidor. Informeu a l'administrador.",
"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",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "El fitxer que intenteu pujar excedeix la mida màxima de pujada en aquest servidor.",
"Upload too large" => "La pujada és massa gran",
"Pending" => "Pendent",
"Add group" => "Afegeix grup",
"No files selected for upload." => "No s'han seleccionat fitxers per a la pujada.",
"Edit profile picture" => "Edita la fotografia de perfil",
"Error loading profile picture." => "Error en carregar la imatge de perfil.",
"Enter name" => "Escriviu un nom",
"Enter description" => "Escriviu una descripció",
"Select addressbook" => "Selecciona la llibreta d'adreces",
"The address book name cannot be empty." => "El nom de la llibreta d'adreces no pot ser buit.",
"Is this correct?" => "És correcte?",
"There was an unknown error when trying to delete this contact" => "S'ha produït un error en intentar esborrat aquest contacte",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Heu marcat eliminar alguns contactes, però encara no s'han eliminat. Espereu mentre s'esborren.",
"Click to undo deletion of {num} contacts" => "Feu clic a desfés eliminació de {num} contactes",
"Cancelled deletion of {num}" => "S'ha cancel·lat l'eliminació de {num}",
"Result: " => "Resultat: ",
" imported, " => " importat, ",
" failed." => " fallada.",
@ -100,9 +113,6 @@
"There was an error updating the addressbook." => "S'ha produït un error en actualitzar la llibreta d'adreces.",
"You do not have the permissions to delete this addressbook." => "No teniu permisos per eliminar aquesta llibreta d'adreces",
"There was an error deleting this addressbook." => "S'ha produït un error en eliminar la llibreta d'adreces",
"Addressbook not found: " => "No s'ha trobat la llibreta d'adreces: ",
"This is not your addressbook." => "Aquesta no és la vostra llibreta d'adreces",
"Contact could not be found." => "No s'ha trobat el contacte.",
"Jabber" => "Jabber",
"AIM" => "AIM",
"MSN" => "MSN",
@ -126,19 +136,9 @@
"Video" => "Vídeo",
"Pager" => "Paginador",
"Internet" => "Internet",
"Birthday" => "Aniversari",
"Business" => "Negocis",
"Call" => "Trucada",
"Clients" => "Clients",
"Deliverer" => "Emissari",
"Holidays" => "Vacances",
"Ideas" => "Idees",
"Journey" => "Viatge",
"Jubilee" => "Aniversari",
"Meeting" => "Reunió",
"Personal" => "Personal",
"Projects" => "Projectes",
"Questions" => "Preguntes",
"Friends" => "Amics",
"Family" => "Familia",
"There was an error deleting properties for this contact." => "S'ha produït un error en eliminar les propietats d'aquest contacte.",
"{name}'s Birthday" => "Aniversari de {name}",
"Contact" => "Contacte",
"You do not have the permissions to add contacts to this addressbook." => "No teniu permisos per afegir contactes a aquesta llibreta d'adreces.",
@ -148,9 +148,22 @@
"Could not find the Addressbook with ID: " => "No s'ha trobat la llibreta d'adreces amb ID:",
"You do not have the permissions to delete this contact." => "No teniu permisos per esborrar aquest contacte",
"There was an error deleting this contact." => "S'ha produït un error en eliminar aquest contacte.",
"Add Contact" => "Afegeix un contacte",
"Import" => "Importa",
"Contact not found." => "No s'ha trobat el contacte",
"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(s)" => "Baixa contacte(s)",
"Groups" => "Grups",
"Favorite" => "Preferits",
"Delete Contact" => "Elimina contacte",
"Close" => "Tanca",
"Keyboard shortcuts" => "Dreceres de teclat",
"Navigation" => "Navegació",
@ -164,56 +177,83 @@
"Add new contact" => "Afegeix un contacte nou",
"Add new addressbook" => "Afegeix una llibreta d'adreces nova",
"Delete current contact" => "Esborra el contacte",
"Drop photo to upload" => "Elimina la foto a carregar",
"<h3>You have no contacts in your addressbook.</h3><p>Add a new contact or import existing contacts from a VCF file.</p>" => "<h3>No teniu contactes a la llibreta d'adreces.</h3><p>afegiu contactes nous o importeu-los contactes des d'un fitxer VCF.</p>",
"Add contact" => "Afegeix un contacte",
"Compose mail" => "Redacta un correu electrónic",
"Delete group" => "Elimina grup",
"Delete current photo" => "Elimina la foto actual",
"Edit current photo" => "Edita la foto actual",
"Upload new photo" => "Carrega una foto nova",
"Select photo from ownCloud" => "Selecciona una foto de ownCloud",
"Edit name details" => "Edita detalls del nom",
"Organization" => "Organització",
"First name" => "Nom",
"Additional names" => "Noms addicionals",
"Last name" => "Cognom",
"Nickname" => "Sobrenom",
"Enter nickname" => "Escriviu el sobrenom",
"Web site" => "Adreça web",
"http://www.somesite.com" => "http://www.somesite.com",
"Go to web site" => "Vés a la web",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Groups" => "Grups",
"Separate groups with commas" => "Separeu els grups amb comes",
"Edit groups" => "Edita els grups",
"Preferred" => "Preferit",
"Please specify a valid email address." => "Especifiqueu una adreça de correu electrònic correcta",
"Enter email address" => "Escriviu una adreça de correu electrònic",
"Mail to address" => "Envia per correu electrònic a l'adreça",
"Delete email address" => "Elimina l'adreça de correu electrònic",
"Enter phone number" => "Escriviu el número de telèfon",
"Delete phone number" => "Elimina el número de telèfon",
"Instant Messenger" => "Instant Messenger",
"Delete IM" => "Elimina IM",
"View on map" => "Visualitza al mapa",
"Edit address details" => "Edita els detalls de l'adreça",
"Add notes here." => "Afegiu notes aquí.",
"Add field" => "Afegeix un camp",
"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",
"Instant Messaging" => "Missatgeria instantània",
"Address" => "Adreça",
"Note" => "Nota",
"Download contact" => "Baixa el contacte",
"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",
"Mail to address" => "Envia per correu electrònic a l'adreça",
"Delete email address" => "Elimina l'adreça de correu electrònic",
"Enter phone number" => "Escriviu el número de telèfon",
"Delete phone number" => "Elimina el número de telèfon",
"Go to web site" => "Vés a la web",
"Delete URL" => "Elimina URL",
"View on map" => "Visualitza al mapa",
"Delete address" => "Elimina l'adreça",
"1 Main Street" => "Carrer major, 1",
"Street address" => "Adreça",
"12345" => "12123",
"Postal code" => "Codi postal",
"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",
"Edit name details" => "Edita detalls del nom",
"http://www.somesite.com" => "http://www.somesite.com",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Separate groups with commas" => "Separeu els grups amb comes",
"Edit groups" => "Edita els grups",
"Enter email address" => "Escriviu una adreça de correu electrònic",
"Edit address details" => "Edita els detalls de l'adreça",
"Add notes here." => "Afegiu notes aquí.",
"Add field" => "Afegeix un camp",
"Download contact" => "Baixa el contacte",
"The temporary image has been removed from cache." => "La imatge temporal ha estat eliminada de la memòria de cau.",
"Edit address" => "Edita l'adreça",
"Type" => "Tipus",
"PO Box" => "Adreça postal",
"Street address" => "Adreça",
"Street and number" => "Carrer i número",
"Extended" => "Addicional",
"Apartment number etc." => "Número d'apartament, etc.",
"City" => "Ciutat",
"Region" => "Comarca",
"E.g. state or province" => "p. ex. Estat o província ",
"Zipcode" => "Codi postal",
"Postal code" => "Codi postal",
"Country" => "País",
"Addressbook" => "Llibreta d'adreces",
"Hon. prefixes" => "Prefix honorífic:",
"Miss" => "Srta",
@ -223,7 +263,6 @@
"Mrs" => "Sra",
"Dr" => "Dr",
"Given name" => "Nom específic",
"Additional names" => "Noms addicionals",
"Family name" => "Nom de familia",
"Hon. suffixes" => "Sufix honorífic:",
"J.D." => "J.D.",
@ -240,15 +279,12 @@
"Name of new addressbook" => "Nom de la nova llibreta d'adreces",
"Importing contacts" => "S'estan important contactes",
"<h3>You have no contacts in your addressbook.</h3><p>You can import VCF files by dragging them to the contacts list and either drop them on an addressbook to import into it, or on an empty spot to create a new addressbook and import into that.<br />You can also import by clicking on the import button at the bottom of the list.</p>" => "<h3>No teniu contactes a la llibreta d'adreces.</h3><p>Podeu importar fitxers VCF arrossegant-los a la llista de contactes i deixant-los, o bé en una llibreta d'adreces per importar-les allà, o en un espai buit per crear una llibreta d'adreces nova i importar-les allà.<br />També podeu fer clic al botó per importar al final de la lliesta.</p>",
"Add contact" => "Afegeix un contacte",
"Select Address Books" => "Selecccioneu llibretes d'adreces",
"Enter description" => "Escriviu una descripció",
"CardDAV syncing addresses" => "Adreces de sincronització CardDAV",
"more info" => "més informació",
"Primary address (Kontact et al)" => "Adreça primària (Kontact i al)",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "Llibretes d'adreces",
"Share" => "Comparteix",
"New Address Book" => "Nova llibreta d'adreces",
"Name" => "Nom",
"Description" => "Descripció",

View File

@ -2,24 +2,24 @@
"Error (de)activating addressbook." => "Chyba při (de)aktivaci knihy adres.",
"id is not set." => "id není nastaveno.",
"Cannot update addressbook with an empty name." => "Nelze aktualizovat knihu adres s prázdným názvem.",
"No category name given." => "Nezadán žádný název kategorie.",
"Error adding group." => "Chyba při přidávání skupiny.",
"Group ID missing from request." => "V požadavku schází ID skupiny.",
"Contact ID missing from request." => "V požadavku schází ID kontaktu.",
"No ID provided" => "Žádné ID nezadáno",
"Error setting checksum." => "Chyba při nastavování kontrolního součtu.",
"No categories selected for deletion." => "Žádné kategorie nebyly vybrány k smazání.",
"No address books found." => "Žádná kniha adres nenalezena.",
"No contacts found." => "Žádné kontakty nenalezeny.",
"element name is not set." => "název prvku není nastaven.",
"Could not parse contact: " => "Nelze zpracovat kontakt: ",
"Cannot add empty property." => "Nelze přidat prázdnou vlastnost.",
"At least one of the address fields has to be filled out." => "Musí být vyplněn alespoň jeden z adresních údajů.",
"Trying to add duplicate property: " => "Pokoušíte se přidat duplicitní vlastnost: ",
"Missing IM parameter." => "Chybějící parametr komunikátoru.",
"Unknown IM: " => "Neznámý komunikátor: ",
"Information about vCard is incorrect. Please reload the page." => "Informace o vCard je neplatná. Obnovte, prosím, stránku.",
"Missing ID" => "Chybí ID",
"Error parsing VCard for ID: \"" => "Chyba při zpracování VCard pro ID: \"",
"checksum is not set." => "kontrolní součet není nastaven.",
"Information about vCard is incorrect. Please reload the page." => "Informace o vCard je neplatná. Obnovte, prosím, stránku.",
"Couldn't find vCard for %d." => "Nelze najít vCard pro %d.",
"Information about vCard is incorrect. Please reload the page: " => "Informace o vCard je neplatná. Obnovte, prosím, stránku: ",
"Something went FUBAR. " => "Něco se pokazilo. ",
"Cannot save property of type \"%s\" as array" => "Nelze uložit vlastnost typu \"%s\" jako pole",
"Missing IM parameter." => "Chybějící parametr komunikátoru.",
"Unknown IM: " => "Neznámý komunikátor: ",
"No contact ID was submitted." => "Nebylo odesláno ID kontaktu.",
"Error reading contact photo." => "Chyba při čtení fotky kontaktu.",
"Error saving temporary file." => "Chyba při ukládání dočasného souboru.",
@ -35,6 +35,9 @@
"Error cropping image" => "Chyba při ořezávání obrázku.",
"Error creating temporary image" => "Chyba při vytváření dočasného obrázku.",
"Error finding image: " => "Chyba při hledání obrázku: ",
"Key is not set for: " => "Klíč nenastaven pro:",
"Value is not set for: " => "Hodnota nezadána pro:",
"Could not set preference: " => "Nelze nastavit předvolby:",
"Error uploading contacts to storage." => "Chyba při odesílání kontaktů do úložiště.",
"There is no error, the file uploaded with success" => "Soubor byl odeslán úspěšně",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Odeslaný soubor přesáhl svou velikostí parametr upload_max_filesize v php.ini",
@ -46,43 +49,53 @@
"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",
"Sorry, this functionality has not been implemented yet" => "Bohužel, tato funkce nebyla ještě implementována",
"Not implemented" => "Neimplementováno",
"Couldn't get a valid address." => "Nelze získat platnou adresu.",
"Error" => "Chyba",
"Please enter an email address." => "Zadejte, prosím, adresu e-mailu.",
"Enter name" => "Zadejte jméno",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formát vlastní, křestní jméno, celé jméno, obráceně, nebo obráceně oddělené čárkami",
"Select type" => "Vybrat typ",
"%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ů.",
"Contact is not in this group." => "Kontakt není v této skupině.",
"Contacts are not in this group." => "Kontakty nejsou v této skupině.",
"A group named {group} already exists" => "Skupina s názvem {group} již existuje",
"You can drag groups to\narrange them as you like." => "Můžete přesouvat skupiny, pro\nsnadné seřazení dle vašich potřeb.",
"All" => "Vše",
"Favorites" => "Oblíbené",
"Shared by {owner}" => "Sdílí {owner}",
"Indexing contacts" => "Indexuji kontakty",
"Add to..." => "Přidat do...",
"Remove from..." => "Odebrat z...",
"Add group..." => "Přidat skupinu...",
"Select photo" => "Vybrat fotku",
"You do not have permission to add contacts to " => "Nemáte práva přidat kontakt do ",
"Please select one of your own address books." => "Prosím vyberte jedu z Vašich knih adres.",
"Permission error" => "Chyba přístupových práv",
"Click to undo deletion of \"" => "Klikněte pro zrušení smazání \"",
"Cancelled deletion of: \"" => "Zrušeno mazání: \"",
"This property has to be non-empty." => "Tato vlastnost musí být zadána.",
"Couldn't serialize elements." => "Prvky nelze převést.",
"Unknown error. Please check logs." => "Neznámá chyba. Zkontrolujte záznamy.",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' voláno bez argumentu. Prosím oznamte chybu na bugs.owncloud.org",
"Edit name" => "Upravit jméno",
"No files selected for upload." => "Žádné soubory nebyly vybrány k nahrání.",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Soubor, který se pokoušíte odeslat, přesahuje maximální povolenou velikost.",
"Error loading profile picture." => "Chyba při načítání obrázku profilu.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Některé kontakty jsou označeny ke smazání, ale nejsou smazány. Počkejte, prosím, na dokončení operace.",
"Do you want to merge these address books?" => "Chcete spojit tyto knihy adres?",
"Shared by " => "Sdílí",
"Upload too large" => "Odesílaný soubor je příliš velký",
"Only image files can be used as profile picture." => "Jako profilový obrázek lze použít pouze soubory obrázků.",
"Wrong file type" => "Špatný typ souboru",
"Your browser doesn't support AJAX upload. Please click on the profile picture to select a photo to upload." => "Váš prohlížeč nepodporuje odesílání skrze AJAX. Prosím klikněte na profilový obrázek pro výběr fotografie k odeslání.",
"Unable to upload your file as it is a directory or has 0 bytes" => "Nelze odeslat Váš soubor, protože je to adresář, nebo je jeho velikost 0 bajtů",
"Upload Error" => "Chyba odesílání",
"Pending" => "Nevyřízené",
"Import done" => "Import dokončen",
"Network or server error. Please inform administrator." => "Chyba sítě, či serveru. Kontaktujte prosím správce.",
"Error adding to group." => "Chyba při přidávání do skupiny",
"Error removing from group." => "Chyba při odebírání ze skupiny",
"There was an error opening a mail composer." => "Nastala chyba při otevírání editoru emalů.",
"Deleting done. Click here to cancel reloading." => "Mazání dokončeno. Klikněte zde pro zrušení přenačtení.",
"Add address book" => "Přidat knihu adres",
"Import done. Click here to cancel reloading." => "Import dokončen. Klikněte zde pro zrušení přenačtení.",
"Not all files uploaded. Retrying..." => "Všechny soubory nebyly odeslány. Opakuji...",
"Something went wrong with the upload, please retry." => "Něco se stalo špatně s odesílaným souborem, zkuste jej, prosím, odeslat znovu.",
"Error" => "Chyba",
"Importing from {filename}..." => "Importuji z {filename}...",
"{success} imported, {failed} failed." => "{success} importováno, {failed} selhalo.",
"Importing..." => "Importuji...",
"Unable to upload your file as it is a directory or has 0 bytes" => "Nelze odeslat Váš soubor, protože je to adresář, nebo je jeho velikost 0 bajtů",
"Upload Error" => "Chyba odesílání",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Soubor, který se pokoušíte odeslat, přesahuje maximální povolenou velikost.",
"Upload too large" => "Odesílaný soubor je příliš velký",
"Pending" => "Nevyřízené",
"Add group" => "Přidat skupinu",
"No files selected for upload." => "Žádné soubory nebyly vybrány k nahrání.",
"Edit profile picture" => "Upravit obrázek profilu",
"Error loading profile picture." => "Chyba při načítání obrázku profilu.",
"Enter name" => "Zadejte jméno",
"Enter description" => "Zadejte popis",
"Select addressbook" => "Vybrat knihu adres",
"The address book name cannot be empty." => "Název knihy adres nemůže být prázdný.",
"Is this correct?" => "Je to správně?",
"There was an unknown error when trying to delete this contact" => "Nastala neznámá chyba při mazání tohoto kontaktu",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Některé kontakty jsou označeny ke smazání, ale nejsou smazány. Počkejte, prosím, na dokončení operace.",
"Click to undo deletion of {num} contacts" => "Klikněte pro navrácení mazání {num} kontaktů",
"Cancelled deletion of {num}" => "Mazání {num} položek zrušeno",
"Result: " => "Výsledek: ",
" imported, " => " importováno, ",
" failed." => " selhalo.",
@ -100,9 +113,6 @@
"There was an error updating the addressbook." => "Nastala chyba při aktualizaci knihy adres.",
"You do not have the permissions to delete this addressbook." => "Nemáte práva pro odstranění této knihy adres.",
"There was an error deleting this addressbook." => "Nastala chyba při odstranění knihy adres.",
"Addressbook not found: " => "Kniha adres nenalezena: ",
"This is not your addressbook." => "Toto není Vaše kniha adres.",
"Contact could not be found." => "Kontakt nebyl nalezen.",
"Jabber" => "Jabber",
"AIM" => "AIM",
"MSN" => "MSN",
@ -126,19 +136,9 @@
"Video" => "Video",
"Pager" => "Pager",
"Internet" => "Internet",
"Birthday" => "Narozeniny",
"Business" => "Pracovní",
"Call" => "Volat",
"Clients" => "Klienti",
"Deliverer" => "Dodavatel",
"Holidays" => "Svátky",
"Ideas" => "Nápady",
"Journey" => "Cestování",
"Jubilee" => "Jubileum",
"Meeting" => "Schůze",
"Personal" => "Osobní",
"Projects" => "Projekty",
"Questions" => "Otázky",
"Friends" => "Přátelé",
"Family" => "Rodina",
"There was an error deleting properties for this contact." => "Nastala chyba při mazání vlastností tohoto kontatku.",
"{name}'s Birthday" => "Narozeniny {name}",
"Contact" => "Kontakt",
"You do not have the permissions to add contacts to this addressbook." => "Nemáte práva pro přidání kontaktů do této knihy adres.",
@ -148,9 +148,22 @@
"Could not find the Addressbook with ID: " => "Nelze nalézt Addressbook s ID: ",
"You do not have the permissions to delete this contact." => "Nemáte práva smazat tento kontakt.",
"There was an error deleting this contact." => "Nastala chyba při mazání tohoto kontaktu.",
"Add Contact" => "Přidat kontakt",
"Import" => "Importovat",
"Contact not found." => "Kontakt nenalezen.",
"HomePage" => "Domovská stránka",
"New Group" => "Nová skupina",
"Settings" => "Nastavení",
"Address books" => "Knihy adres",
"Import" => "Importovat",
"Select files to import" => "Vybrat soubory pro import",
"Select files" => "Vybrat soubory",
"Import into:" => "Importovat do:",
"OK" => "OK",
"(De-)select all" => "Vybrat (odznačit) vše",
"New Contact" => "Nový kontakt",
"Download Contact(s)" => "Stáhnout kontakt(y)",
"Groups" => "Skupiny",
"Favorite" => "Oblíbit",
"Delete Contact" => "Smazat kontakt",
"Close" => "Zavřít",
"Keyboard shortcuts" => "Klávesové zkratky",
"Navigation" => "Navigace",
@ -164,56 +177,83 @@
"Add new contact" => "Přidat nový kontakt",
"Add new addressbook" => "Předat novou knihu adres",
"Delete current contact" => "Odstranit současný kontakt",
"Drop photo to upload" => "Přetáhněte sem fotku pro nahrání",
"<h3>You have no contacts in your addressbook.</h3><p>Add a new contact or import existing contacts from a VCF file.</p>" => "<h3>Ve vaší knize adres nemáte žádné kontakty.</h3><p>Přidejte nový kontakt, nebo importujte existující ze souboru VCF.</p>",
"Add contact" => "Přidat kontakt",
"Compose mail" => "Napsat email",
"Delete group" => "Smazat skupinu",
"Delete current photo" => "Smazat současnou fotku",
"Edit current photo" => "Upravit současnou fotku",
"Upload new photo" => "Nahrát novou fotku",
"Select photo from ownCloud" => "Vybrat fotku z ownCloudu",
"Edit name details" => "Upravit podrobnosti jména",
"Organization" => "Organizace",
"First name" => "Křestní jméno",
"Additional names" => "Další jména",
"Last name" => "Příjmení",
"Nickname" => "Přezdívka",
"Enter nickname" => "Zadejte přezdívku",
"Web site" => "Webová stránka",
"http://www.somesite.com" => "http://www.somesite.com",
"Go to web site" => "Přejít na webovou stránku",
"dd-mm-yyyy" => "dd. mm. yyyy",
"Groups" => "Skupiny",
"Separate groups with commas" => "Oddělte skupiny čárkami",
"Edit groups" => "Upravit skupiny",
"Preferred" => "Preferované",
"Please specify a valid email address." => "Prosím zadejte platnou e-mailovou adresu",
"Enter email address" => "Zadat e-mailovou adresu",
"Mail to address" => "Odeslat na adresu",
"Delete email address" => "Smazat adresu e-mailu",
"Enter phone number" => "Zadat telefonní číslo",
"Delete phone number" => "Smazat telefonní číslo",
"Instant Messenger" => "Komunikátor",
"Delete IM" => "Smazat komunikátor",
"View on map" => "Zobrazit na mapě",
"Edit address details" => "Upravit podrobnosti adresy",
"Add notes here." => "Zde přidejte poznámky.",
"Add field" => "Přidat pole",
"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",
"Instant Messaging" => "Komunikátor",
"Address" => "Adresa",
"Note" => "Poznámka",
"Download contact" => "Stáhnout kontakt",
"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",
"Mail to address" => "Odeslat na adresu",
"Delete email address" => "Smazat adresu e-mailu",
"Enter phone number" => "Zadat telefonní číslo",
"Delete phone number" => "Smazat telefonní číslo",
"Go to web site" => "Přejít na webovou stránku",
"Delete URL" => "Smazat URL",
"View on map" => "Zobrazit na mapě",
"Delete address" => "Smazat adresu",
"1 Main Street" => "1 Hlavní ulice",
"Street address" => "Ulice",
"12345" => "12345",
"Postal code" => "Směrovací číslo",
"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",
"Delete IM" => "Smazat komunikátor",
"Share" => "Sdílet",
"Export" => "Exportovat",
"CardDAV link" => "Odkaz CardDAV",
"Add Contact" => "Přidat kontakt",
"Drop photo to upload" => "Přetáhněte sem fotku pro nahrání",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formát vlastní, křestní jméno, celé jméno, obráceně, nebo obráceně oddělené čárkami",
"Edit name details" => "Upravit podrobnosti jména",
"http://www.somesite.com" => "http://www.somesite.com",
"dd-mm-yyyy" => "dd. mm. yyyy",
"Separate groups with commas" => "Oddělte skupiny čárkami",
"Edit groups" => "Upravit skupiny",
"Enter email address" => "Zadat e-mailovou adresu",
"Edit address details" => "Upravit podrobnosti adresy",
"Add notes here." => "Zde přidejte poznámky.",
"Add field" => "Přidat pole",
"Download contact" => "Stáhnout 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",
"PO Box" => "PO box",
"Street address" => "Ulice",
"Street and number" => "Ulice a číslo",
"Extended" => "Rozšířené",
"Apartment number etc." => "Číslo bytu atd.",
"City" => "Město",
"Region" => "Kraj",
"E.g. state or province" => "Např. stát nebo provincie",
"Zipcode" => "PSČ",
"Postal code" => "Směrovací číslo",
"Country" => "Země",
"Addressbook" => "Kniha adres",
"Hon. prefixes" => "Tituly před jménem",
"Miss" => "Slečna",
@ -223,7 +263,6 @@
"Mrs" => "Paní",
"Dr" => "Dr",
"Given name" => "Křestní jméno",
"Additional names" => "Další jména",
"Family name" => "Příjmení",
"Hon. suffixes" => "Tituly za",
"J.D." => "JUDr.",
@ -240,15 +279,12 @@
"Name of new addressbook" => "Jméno nové knihy adres",
"Importing contacts" => "Probíhá import kontaktů",
"<h3>You have no contacts in your addressbook.</h3><p>You can import VCF files by dragging them to the contacts list and either drop them on an addressbook to import into it, or on an empty spot to create a new addressbook and import into that.<br />You can also import by clicking on the import button at the bottom of the list.</p>" => "<h3>Ve Vaší knize adres nemáte žádné kontakty.</h3><p>Můžete importovat soubory VCF přetažením na seznam kontaktů a upuštěním na knihu adres pro přidání, nebo do prázdného místa pro vytvoření nové knihy adres.<br />Můžete také importovat kliknutím na tlačítko Importovat na konci seznamu.</p>",
"Add contact" => "Přidat kontakt",
"Select Address Books" => "Vybrat knihu adres",
"Enter description" => "Zadejte popis",
"CardDAV syncing addresses" => "Adresy pro synchronizaci pomocí CardDAV",
"more info" => "víc informací",
"Primary address (Kontact et al)" => "Hlavní adresa (Kontakt etc.)",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "Knihy adres",
"Share" => "Sdílet",
"New Address Book" => "Nová kniha adres",
"Name" => "Název",
"Description" => "Popis",

View File

@ -8,18 +8,12 @@
"No address books found." => "Der blev ikke fundet nogen adressebøger.",
"No contacts found." => "Der blev ikke fundet nogen kontaktpersoner.",
"element name is not set." => "Elementnavnet er ikke medsendt.",
"Could not parse contact: " => "Kunne ikke indlæse kontaktperson",
"Cannot add empty property." => "Kan ikke tilføje en egenskab uden indhold.",
"At least one of the address fields has to be filled out." => "Der skal udfyldes mindst et adressefelt.",
"Trying to add duplicate property: " => "Kan ikke tilføje overlappende element.",
"Missing IM parameter." => "Manglende IM parameter.",
"Unknown IM: " => "Ukendt IM:",
"Information about vCard is incorrect. Please reload the page." => "Informationen om vCard er forkert. Genindlæs siden.",
"Missing ID" => "Manglende ID",
"Error parsing VCard for ID: \"" => "Kunne ikke indlæse VCard med ID'et: \"",
"checksum is not set." => "Checksum er ikke medsendt.",
"Information about vCard is incorrect. Please reload the page." => "Informationen om vCard er forkert. Genindlæs siden.",
"Information about vCard is incorrect. Please reload the page: " => "Informationen om dette VCard stemmer ikke. Genindlæs venligst siden: ",
"Something went FUBAR. " => "Noget gik grueligt galt. ",
"Missing IM parameter." => "Manglende IM parameter.",
"Unknown IM: " => "Ukendt IM:",
"No contact ID was submitted." => "Ingen ID for kontakperson medsendt.",
"Error reading contact photo." => "Kunne ikke indlæse foto for kontakperson.",
"Error saving temporary file." => "Kunne ikke gemme midlertidig fil.",
@ -46,43 +40,22 @@
"Couldn't load temporary image: " => "Kunne ikke indlæse midlertidigt billede",
"No file was uploaded. Unknown error" => "Ingen fil blev uploadet. Ukendt fejl.",
"Contacts" => "Kontaktpersoner",
"Sorry, this functionality has not been implemented yet" => "Denne funktion er desværre ikke implementeret endnu",
"Not implemented" => "Ikke implementeret",
"Couldn't get a valid address." => "Kunne ikke finde en gyldig adresse.",
"Error" => "Fejl",
"Please enter an email address." => "Indtast venligst en email adresse",
"Enter name" => "Indtast navn",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formatter som valgfrit, fuldt navn, efternavn først eller efternavn først med komma",
"Select type" => "Vælg type",
"Select photo" => "Vælg foto",
"You do not have permission to add contacts to " => "Du har ikke rettigheder til at tilføje kontaktpersoner til ",
"Please select one of your own address books." => "Vælg venligst en af dine egne adressebøger.",
"Permission error" => "Manglende rettigheder",
"Click to undo deletion of \"" => "Klik for at fortryde sletning af \"",
"Cancelled deletion of: \"" => "Annullerede sletning af: \"",
"This property has to be non-empty." => "Dette felt må ikke være tomt.",
"Couldn't serialize elements." => "Kunne ikke serialisere elementerne.",
"Unknown error. Please check logs." => "Ukendt fejl. Tjek venligst log.",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' kaldet uden typeargument. Indrapporter fejl på bugs.owncloud.org",
"Edit name" => "Rediger navn",
"No files selected for upload." => "Der er ikke valgt nogen filer at uploade.",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Dr.",
"Error loading profile picture." => "Fejl ved indlæsning af profilbillede",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Nogle kontakter er markeret til sletning, men er endnu ikke slettet. Vent venligst på, at de bliver slettet.",
"Do you want to merge these address books?" => "Vil du fusionere disse adressebøger?",
"Shared by " => "Delt af",
"Upload too large" => "Upload er for stor",
"Only image files can be used as profile picture." => "Kun billedfiler kan bruges som profilbilleder",
"Wrong file type" => "Forkert filtype",
"Your browser doesn't support AJAX upload. Please click on the profile picture to select a photo to upload." => "Din browser understøtter ikke AJAX upload. Tryk venligst på profilbilledet for at vælge et billede som skal uploades.",
"Unable to upload your file as it is a directory or has 0 bytes" => "Kan ikke uploade din fil - det er enten en mappe eller en fil med et indhold på 0 bytes.",
"Upload Error" => "Fejl i upload",
"Pending" => "Afventer",
"Import done" => "Import fuldført",
"Not all files uploaded. Retrying..." => "Nogle filer blev ikke uploadet. Forsøger igen...",
"Something went wrong with the upload, please retry." => "Der opstod en fejl under upload. Forsøg igen.",
"Error" => "Fejl",
"Importing..." => "Importerer...",
"Unable to upload your file as it is a directory or has 0 bytes" => "Kan ikke uploade din fil - det er enten en mappe eller en fil med et indhold på 0 bytes.",
"Upload Error" => "Fejl i upload",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Dr.",
"Upload too large" => "Upload er for stor",
"Pending" => "Afventer",
"No files selected for upload." => "Der er ikke valgt nogen filer at uploade.",
"Error loading profile picture." => "Fejl ved indlæsning af profilbillede",
"Enter name" => "Indtast navn",
"Enter description" => "Indtast beskrivelse",
"The address book name cannot be empty." => "Adressebogens navn kan ikke være tomt.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Nogle kontakter er markeret til sletning, men er endnu ikke slettet. Vent venligst på, at de bliver slettet.",
"Result: " => "Resultat:",
" imported, " => " importeret ",
" failed." => " fejl.",
@ -100,9 +73,6 @@
"There was an error updating the addressbook." => "Du har ikke rettigheder til at opdatere denne kontaktperson",
"You do not have the permissions to delete this addressbook." => "Du har ikke rettigheder til at slette denne adressebog",
"There was an error deleting this addressbook." => "Der opstod en fejl ved sletning af denne adressebog.",
"Addressbook not found: " => "Adressebog ikke fundet:",
"This is not your addressbook." => "Dette er ikke din adressebog.",
"Contact could not be found." => "Kontaktperson kunne ikke findes.",
"Jabber" => "Jabber",
"AIM" => "AIM",
"MSN" => "MSN",
@ -126,19 +96,6 @@
"Video" => "Video",
"Pager" => "Personsøger",
"Internet" => "Internet",
"Birthday" => "Fødselsdag",
"Business" => "Firma",
"Call" => "Ring op",
"Clients" => "Klienter",
"Deliverer" => "Udbringer",
"Holidays" => "Ferie",
"Ideas" => "Ideer",
"Journey" => "Rejse",
"Jubilee" => "Jubilæum",
"Meeting" => "Møde",
"Personal" => "Personligt",
"Projects" => "Projekter",
"Questions" => "Spørgsmål",
"{name}'s Birthday" => "{name}s fødselsdag",
"Contact" => "Kontaktperson",
"You do not have the permissions to add contacts to this addressbook." => "Du har ikke rettigheder til at tilføje kontaktpersoner til denne adressebog",
@ -148,9 +105,10 @@
"Could not find the Addressbook with ID: " => "Kunne ikke finde adressebogen med ID.",
"You do not have the permissions to delete this contact." => "Du har ikke rettigheder til at slette denne kontaktperson",
"There was an error deleting this contact." => "Der opstod en fejl ved sletning af denne kontakt.",
"Add Contact" => "Tilføj kontaktperson",
"Import" => "Importer",
"Settings" => "Indstillinger",
"Import" => "Importer",
"OK" => "OK",
"Groups" => "Grupper",
"Close" => "Luk",
"Keyboard shortcuts" => "Tastaturgenveje",
"Navigation" => "Navigering",
@ -164,56 +122,64 @@
"Add new contact" => "Tilføj ny kontaktperson",
"Add new addressbook" => "Tilføj ny adressebog",
"Delete current contact" => "Slet aktuelle kontaktperson",
"Drop photo to upload" => "Drop foto for at uploade",
"Add contact" => "Tilføj kontaktpeson.",
"Delete current photo" => "Slet nuværende foto",
"Edit current photo" => "Rediger nuværende foto",
"Upload new photo" => "Upload nyt foto",
"Select photo from ownCloud" => "Vælg foto fra ownCloud",
"Edit name details" => "Rediger navnedetaljer.",
"Organization" => "Organisation",
"Additional names" => "Mellemnavne",
"Nickname" => "Kaldenavn",
"Enter nickname" => "Indtast kaldenavn",
"Web site" => "Hjemmeside",
"http://www.somesite.com" => "http://www.somesite.com",
"Go to web site" => "Gå til web site",
"dd-mm-yyyy" => "dd-mm-åååå",
"Groups" => "Grupper",
"Separate groups with commas" => "Opdel gruppenavne med kommaer",
"Edit groups" => "Rediger grupper",
"Preferred" => "Foretrukken",
"Please specify a valid email address." => "Indtast venligst en gyldig email-adresse.",
"Enter email address" => "Indtast email-adresse",
"Mail to address" => "Send mail til adresse",
"Delete email address" => "Slet email-adresse",
"Enter phone number" => "Indtast telefonnummer",
"Delete phone number" => "Slet telefonnummer",
"Instant Messenger" => "Instant Messenger",
"Delete IM" => "Slet IM",
"View on map" => "Vis på kort",
"Edit address details" => "Rediger adresse detaljer",
"Add notes here." => "Tilføj noter her.",
"Add field" => "Tilføj element",
"Title" => "Titel",
"Organization" => "Organisation",
"Birthday" => "Fødselsdag",
"Add" => "Tilføj",
"Phone" => "Telefon",
"Email" => "Email",
"Instant Messaging" => "Instant Messaging",
"Address" => "Adresse",
"Note" => "Note",
"Download contact" => "Download kontaktperson",
"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",
"Delete email address" => "Slet email-adresse",
"Enter phone number" => "Indtast telefonnummer",
"Delete phone number" => "Slet telefonnummer",
"Go to web site" => "Gå til web site",
"View on map" => "Vis på kort",
"Street address" => "Gade",
"Postal code" => "Postnummer",
"City" => "By",
"Country" => "Land",
"Instant Messenger" => "Instant Messenger",
"Delete IM" => "Slet IM",
"Share" => "Del",
"Export" => "Exporter",
"Add Contact" => "Tilføj kontaktperson",
"Drop photo to upload" => "Drop foto for at uploade",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formatter som valgfrit, fuldt navn, efternavn først eller efternavn først med komma",
"Edit name details" => "Rediger navnedetaljer.",
"http://www.somesite.com" => "http://www.somesite.com",
"dd-mm-yyyy" => "dd-mm-åååå",
"Separate groups with commas" => "Opdel gruppenavne med kommaer",
"Edit groups" => "Rediger grupper",
"Enter email address" => "Indtast email-adresse",
"Edit address details" => "Rediger adresse detaljer",
"Add notes here." => "Tilføj noter her.",
"Add field" => "Tilføj element",
"Download contact" => "Download kontaktperson",
"The temporary image has been removed from cache." => "Det midlertidige billede er ikke længere tilgængeligt.",
"Edit address" => "Rediger adresse",
"Type" => "Type",
"PO Box" => "Postboks",
"Street address" => "Gade",
"Street and number" => "Gade og nummer",
"Extended" => "Udvidet",
"Apartment number etc." => "Etage, side osv.",
"City" => "By",
"Region" => "Region",
"E.g. state or province" => "F.eks. stat eller provins",
"Zipcode" => "Postnummer",
"Postal code" => "Postnummer",
"Country" => "Land",
"Addressbook" => "Adressebog",
"Hon. prefixes" => "Foranstillede titler",
"Miss" => "Frøken",
@ -223,7 +189,6 @@
"Mrs" => "Fru",
"Dr" => "Dr.",
"Given name" => "Fornavn",
"Additional names" => "Mellemnavne",
"Family name" => "Efternavn",
"Hon. suffixes" => "Efterstillede titler",
"J.D." => "Cand. Jur.",
@ -240,15 +205,12 @@
"Name of new addressbook" => "Navn på ny adressebog",
"Importing contacts" => "Importerer kontaktpersoner",
"<h3>You have no contacts in your addressbook.</h3><p>You can import VCF files by dragging them to the contacts list and either drop them on an addressbook to import into it, or on an empty spot to create a new addressbook and import into that.<br />You can also import by clicking on the import button at the bottom of the list.</p>" => "<h3>Du har ingen kontakter i din adressebog.</h3><p>Du kan importere VCF-filer ved at trække dem gil kontaktlisten og enten slippe dem på en adressebog for at importere ind i den eller udenfor listen for at oprette en ny med kontaktoplysningerne fra filen.<br />Du kan også importere ved at klikke på importknappen under listen.</p>",
"Add contact" => "Tilføj kontaktpeson.",
"Select Address Books" => "Vælg adressebog",
"Enter description" => "Indtast beskrivelse",
"CardDAV syncing addresses" => "CardDAV synkroniserings adresse",
"more info" => "mere info",
"Primary address (Kontact et al)" => "Primær adresse (Kontak m. fl.)",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "Adressebøger",
"Share" => "Del",
"New Address Book" => "Ny adressebog",
"Name" => "Navn",
"Description" => "Beskrivelse",

View File

@ -2,24 +2,24 @@
"Error (de)activating addressbook." => "(De-)Aktivierung des Adressbuches fehlgeschlagen",
"id is not set." => "ID ist nicht angegeben.",
"Cannot update addressbook with an empty name." => "Das Adressbuch kann nicht mit einem leeren Namen aktualisiert werden.",
"No category name given." => "Kein Kategrie-Name angegeben.",
"Error adding group." => "Fehler beim Hinzufügen einer Gruppe.",
"Group ID missing from request." => "Bei der Anfrage fehlt die Gruppen-ID.",
"Contact ID missing from request." => "Bei der Anfrage fehlt die Kontakt-ID.",
"No ID provided" => "Keine ID angegeben",
"Error setting checksum." => "Fehler beim Setzen der Prüfsumme.",
"No categories selected for deletion." => "Keine Kategorien zum Löschen ausgewählt.",
"No address books found." => "Keine Adressbücher gefunden.",
"No contacts found." => "Keine Kontakte gefunden.",
"element name is not set." => "Kein Name für das Element angegeben.",
"Could not parse contact: " => "Konnte folgenden Kontakt nicht verarbeiten:",
"Cannot add empty property." => "Feld darf nicht leer sein.",
"At least one of the address fields has to be filled out." => "Mindestens eines der Adressfelder muss ausgefüllt werden.",
"Trying to add duplicate property: " => "Versuche doppelte Eigenschaft hinzuzufügen: ",
"Missing IM parameter." => "IM-Parameter fehlt.",
"Unknown IM: " => "IM unbekannt:",
"Information about vCard is incorrect. Please reload the page." => "Die Information der vCard ist fehlerhaft. Bitte aktualisiere die Seite.",
"Missing ID" => "Fehlende ID",
"Error parsing VCard for ID: \"" => "Fehler beim Einlesen der VCard für die ID: \"",
"checksum is not set." => "Keine Prüfsumme angegeben.",
"Information about vCard is incorrect. Please reload the page." => "Die Information der vCard ist fehlerhaft. Bitte aktualisiere die Seite.",
"Couldn't find vCard for %d." => "vCard für %d konnte nicht gefunden werden.",
"Information about vCard is incorrect. Please reload the page: " => "Die Informationen zur vCard sind fehlerhaft. Bitte Seite neu laden: ",
"Something went FUBAR. " => "Irgendwas ist hier so richtig schiefgelaufen. ",
"Cannot save property of type \"%s\" as array" => "Eigenschaft vom Typ \"%s\" konnte nicht als Array gespeichert werden.",
"Missing IM parameter." => "IM-Parameter fehlt.",
"Unknown IM: " => "IM unbekannt:",
"No contact ID was submitted." => "Es wurde keine Kontakt-ID übermittelt.",
"Error reading contact photo." => "Fehler beim Auslesen des Kontaktfotos.",
"Error saving temporary file." => "Fehler beim Speichern der temporären Datei.",
@ -35,6 +35,9 @@
"Error cropping image" => "Fehler beim Zuschneiden des Bildes",
"Error creating temporary image" => "Fehler beim Erstellen des temporären Bildes",
"Error finding image: " => "Fehler beim Suchen des Bildes: ",
"Key is not set for: " => "Schlüssel konnte nicht gesetzt werden:",
"Value is not set for: " => "Wert konnte nicht gesetzt werden:",
"Could not set preference: " => "Einstellung konnte nicht gesetzt werden:",
"Error uploading contacts to storage." => "Übertragen der Kontakte fehlgeschlagen.",
"There is no error, the file uploaded with success" => "Es ist kein Fehler aufgetreten. Die Datei wurde erfolgreich übertragen.",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Die Datei ist größer, als durch die upload_max_filesize Direktive in php.ini erlaubt",
@ -46,43 +49,52 @@
"Couldn't load temporary image: " => "Konnte das temporäre Bild nicht laden:",
"No file was uploaded. Unknown error" => "Keine Datei hochgeladen. Unbekannter Fehler",
"Contacts" => "Kontakte",
"Sorry, this functionality has not been implemented yet" => "Diese Funktion steht leider noch nicht zur Verfügung",
"Not implemented" => "Nicht verfügbar",
"Couldn't get a valid address." => "Konnte keine gültige Adresse abrufen.",
"Error" => "Fehler",
"Please enter an email address." => "Bitte gib eine E-Mailadresse an.",
"Enter name" => "Name eingeben",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format benutzerdefiniert, Kurzname, voller Name, Rückwärts oder Rückwärts mit Komma",
"Select type" => "Wähle Typ",
"Contact is already in this group." => "Kontakt ist bereits in dieser Gruppe.",
"Contacts are already in this group." => "Kontakte sind bereits in dieser Gruppe.",
"Couldn't get contact list." => "Kontaktliste konnte nicht ermittelt werden.",
"Contact is not in this group." => "Kontakt ist nicht in dieser Gruppe.",
"Contacts are not in this group." => "Kontakte sind nicht in dieser Gruppe.",
"A group named {group} already exists" => "Eine Gruppe mit dem Namen {group} existiert bereits.",
"You can drag groups to\narrange them as you like." => "Per \"Drag & Drop\" kannst Du Gruppen nach Deinen Wünschen anordnen.",
"All" => "Alle",
"Favorites" => "Favoriten",
"Shared by {owner}" => "Geteilt von {owner}",
"Indexing contacts" => "Kontakte Indizieren",
"Add to..." => "Hinzufügen zu ...",
"Remove from..." => "Entfernen von ...",
"Add group..." => "Gruppe hinzufügen ...",
"Select photo" => "Wähle ein Foto",
"You do not have permission to add contacts to " => "Du besitzt nicht die erforderlichen Rechte, um Kontakte hinzuzufügen",
"Please select one of your own address books." => "Bitte wähle eines Deiner Adressbücher aus.",
"Permission error" => "Berechtigungsfehler",
"Click to undo deletion of \"" => "Klicke hier für die Wiederherstellung von \"",
"Cancelled deletion of: \"" => "Abbrechen des Löschens von: \"",
"This property has to be non-empty." => "Dieses Feld darf nicht leer sein.",
"Couldn't serialize elements." => "Konnte Elemente nicht serialisieren",
"Unknown error. Please check logs." => "Unbekannter Fehler. Bitte Logs überprüfen",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' wurde ohne Argumente aufgerufen. Bitte melde dies auf bugs.owncloud.org",
"Edit name" => "Name ändern",
"No files selected for upload." => "Keine Datei(en) zum Hochladen ausgewählt.",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Die Datei, die Du hochladen möchtest, überschreitet die maximale Größe für Datei-Uploads auf diesem Server.",
"Error loading profile picture." => "Fehler beim Laden des Profilbildes.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Einige zum Löschen vorgemerkte Kontakte wurden noch nicht gelöscht. Bitte warten.",
"Do you want to merge these address books?" => "Möchtest Du diese Adressbücher zusammenführen?",
"Shared by " => "Freigegeben von ",
"Upload too large" => "Die hochgeladene Datei ist zu groß",
"Only image files can be used as profile picture." => "Nur Bilder können als Profilbild genutzt werden.",
"Wrong file type" => "Falscher Dateityp",
"Your browser doesn't support AJAX upload. Please click on the profile picture to select a photo to upload." => "Der verwendete Browser unterstützt keinen Upload via AJAX. Bitte das Profilbild anklicken um ein Foto hochzuladen. ",
"Unable to upload your file as it is a directory or has 0 bytes" => "Deine Datei konnte nicht hochgeladen werden, weil es sich um einen Ordner handelt oder die Datei leer ist.",
"Upload Error" => "Fehler beim Hochladen",
"Pending" => "Ausstehend",
"Import done" => "Import ausgeführt",
"Network or server error. Please inform administrator." => "Netzwerk- oder Serverfehler. Bitte Administrator informieren.",
"Error adding to group." => "Fehler beim Hinzufügen zur Gruppe.",
"Error removing from group." => "Fehler beim Entfernen aus Gruppe.",
"There was an error opening a mail composer." => "Fehler beim Öffnen des Mail-Editors",
"Deleting done. Click here to cancel reloading." => "Gelöscht. Klicke hier, um das Neuladen abzubrechen",
"Add address book" => "Adressbuch hinzufügen",
"Import done. Click here to cancel reloading." => "Import abgeschlossen. Klicken Sie hier, um das Neuladen abzubrechen",
"Not all files uploaded. Retrying..." => "Es wurden nicht alle Dateien hochgeladen. Versuche erneut...",
"Something went wrong with the upload, please retry." => "Beim Hochladen ist etwas schiefgegangen. Bitte versuche es erneut.",
"Error" => "Fehler",
"Importing from {filename}..." => "Importiere von {filename}",
"{success} imported, {failed} failed." => "{success} importiert, {failed} fehlgeschlagen.",
"Importing..." => "Importiere...",
"Unable to upload your file as it is a directory or has 0 bytes" => "Deine Datei kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist.",
"Upload Error" => "Fehler beim Hochladen",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Die Datei, die Du hochladen möchtest, überschreitet die maximale Größe für Datei-Uploads auf diesem Server.",
"Upload too large" => "Der Upload ist zu groß",
"Pending" => "Ausstehend",
"Add group" => "Gruppe hinzufügen",
"No files selected for upload." => "Keine Datei(en) zum Hochladen ausgewählt.",
"Edit profile picture" => "Profilbild bearbeiten",
"Error loading profile picture." => "Fehler beim Laden des Profilbildes.",
"Enter name" => "Name eingeben",
"Enter description" => "Beschreibung eingeben",
"Select addressbook" => "Adressbuch auswählen",
"The address book name cannot be empty." => "Der Name des Adressbuches darf nicht leer sein.",
"Is this correct?" => "Ist dies korrekt?",
"There was an unknown error when trying to delete this contact" => "Es ist ein unbekannter Fehler beim Löschen des Kontakts aufgetreten.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Einige zum Löschen vorgemerkte Kontakte wurden noch nicht gelöscht. Bitte warten.",
"Click to undo deletion of {num} contacts" => "Klicken um das Löschen von {num} Kontakten rückgängig zu machen.",
"Cancelled deletion of {num}" => "Löschen von {num} abgebrochen.",
"Result: " => "Ergebnis: ",
" imported, " => " importiert, ",
" failed." => " fehlgeschlagen.",
@ -100,9 +112,6 @@
"There was an error updating the addressbook." => "Ein Fehler ist bei der Aktualisierung des Adressbuches aufgetreten.",
"You do not have the permissions to delete this addressbook." => "Du besitzt nicht die erforderlichen Rechte, dieses Adressbuch zu löschen.",
"There was an error deleting this addressbook." => "Beim Löschen des Adressbuches ist ein Fehler aufgetreten.",
"Addressbook not found: " => "Adressbuch nicht gefunden:",
"This is not your addressbook." => "Dies ist nicht Dein Adressbuch.",
"Contact could not be found." => "Kontakt konnte nicht gefunden werden.",
"Jabber" => "Jabber",
"AIM" => "AIM",
"MSN" => "MSN",
@ -126,19 +135,9 @@
"Video" => "Video",
"Pager" => "Pager",
"Internet" => "Internet",
"Birthday" => "Geburtstag",
"Business" => "Geschäftlich",
"Call" => "Anruf",
"Clients" => "Kunden",
"Deliverer" => "Lieferant",
"Holidays" => "Feiertage",
"Ideas" => "Ideen",
"Journey" => "Reise",
"Jubilee" => "Jubiläum",
"Meeting" => "Besprechung",
"Personal" => "Persönlich",
"Projects" => "Projekte",
"Questions" => "Fragen",
"Friends" => "Freunde",
"Family" => "Familie",
"There was an error deleting properties for this contact." => "Es ist ein Fehler beim Löschen der Einsellungen für diesen Kontakt aufgetreten.",
"{name}'s Birthday" => "Geburtstag von {name}",
"Contact" => "Kontakt",
"You do not have the permissions to add contacts to this addressbook." => "Du besitzt nicht die erforderlichen Rechte, diesem Adressbuch Kontakte hinzuzufügen.",
@ -148,9 +147,21 @@
"Could not find the Addressbook with ID: " => "Konnte das Adressbuch mit der folgenden ID nicht finden:",
"You do not have the permissions to delete this contact." => "Du besitzt nicht die erforderlichen Rechte, um diesen Kontakte zu löschen.",
"There was an error deleting this contact." => "Beim Löschen des Kontaktes ist ein Fehler aufgetreten.",
"Add Contact" => "Kontakt hinzufügenff",
"Import" => "Importieren",
"Contact not found." => "Kontakt nicht gefunden",
"HomePage" => "Startseite",
"New Group" => "Neue Gruppe",
"Settings" => "Einstellungen",
"Address books" => "Adressbücher",
"Import" => "Importieren",
"Select files to import" => "Dateien für den Import auswählen",
"Select files" => "Dateien auswählen",
"Import into:" => "Importieren nach:",
"OK" => "OK",
"(De-)select all" => "Alle (nicht) auswählen",
"New Contact" => "Neuer Kontakt",
"Groups" => "Gruppen",
"Favorite" => "Favorit",
"Delete Contact" => "Kontakt löschen",
"Close" => "Schließen",
"Keyboard shortcuts" => "Tastaturbefehle",
"Navigation" => "Navigation",
@ -164,56 +175,82 @@
"Add new contact" => "Neuen Kontakt hinzufügen",
"Add new addressbook" => "Neues Adressbuch hinzufügen",
"Delete current contact" => "Aktuellen Kontakt löschen",
"Drop photo to upload" => "Ziehe ein Foto hierher, um es hochzuladen",
"<h3>You have no contacts in your addressbook.</h3><p>Add a new contact or import existing contacts from a VCF file.</p>" => "<h3>Du hast keinen Kontakt in deinem Adressbuch.</h3><p>Füge einen neuen Kontakt hinzu oder importiere bestehende Kontakte aus einer VCF-Datei.</p>",
"Add contact" => "Kontakt hinzufügen",
"Compose mail" => "E-Mail schreiben",
"Delete group" => "Gruppe löschen",
"Delete current photo" => "Derzeitiges Foto löschen",
"Edit current photo" => "Derzeitiges Foto ändern",
"Upload new photo" => "Neues Foto hochladen",
"Select photo from ownCloud" => "Foto aus der ownCloud auswählen",
"Edit name details" => "Name ändern",
"Organization" => "Organisation",
"First name" => "Vorname",
"Additional names" => "Zusätzliche Namen",
"Last name" => "Nachname",
"Nickname" => "Spitzname",
"Enter nickname" => "Spitzname angeben",
"Web site" => "Webseite",
"http://www.somesite.com" => "http://www.somesite.com",
"Go to web site" => "Webseite aufrufen",
"dd-mm-yyyy" => "dd.mm.yyyy",
"Groups" => "Gruppen",
"Separate groups with commas" => "Gruppen mit Komma getrennt",
"Edit groups" => "Gruppen editieren",
"Preferred" => "Bevorzugt",
"Please specify a valid email address." => "Bitte trage eine gültige E-Mail-Adresse ein.",
"Enter email address" => "E-Mail-Adresse angeben",
"Mail to address" => "E-Mail an diese Adresse schicken",
"Delete email address" => "E-Mail-Adresse löschen",
"Enter phone number" => "Telefonnummer angeben",
"Delete phone number" => "Telefonnummer löschen",
"Instant Messenger" => "Instant Messenger",
"Delete IM" => "IM löschen",
"View on map" => "Auf der Karte zeigen",
"Edit address details" => "Adressinformationen ändern",
"Add notes here." => "Füge hier Notizen ein.",
"Add field" => "Feld hinzufügen",
"Title" => "Titel",
"Enter title" => "Titel eingeben",
"Organization" => "Organisation",
"Enter organization" => "Organisation eingeben",
"Birthday" => "Geburtstag",
"Notes go here..." => "Notizen hier hinein...",
"Add" => "Hinzufügen",
"Phone" => "Telefon",
"Email" => "E-Mail",
"Instant Messaging" => "Instant Messaging",
"Address" => "Adresse",
"Note" => "Notiz",
"Download contact" => "Kontakt herunterladen",
"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",
"Mail to address" => "E-Mail an diese Adresse schicken",
"Delete email address" => "E-Mail-Adresse löschen",
"Enter phone number" => "Telefonnummer angeben",
"Delete phone number" => "Telefonnummer löschen",
"Go to web site" => "Webseite aufrufen",
"Delete URL" => "URL löschen",
"View on map" => "Auf der Karte zeigen",
"Delete address" => "Adresse löschen",
"1 Main Street" => "Musterstraße 1",
"Street address" => "Straßenanschrift",
"12345" => "12345",
"Postal code" => "Postleitzahl",
"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",
"Delete IM" => "IM löschen",
"Share" => "Teilen",
"Export" => "Exportieren",
"CardDAV link" => "CardDAV Verbindung",
"Add Contact" => "Kontakt hinzufügen",
"Drop photo to upload" => "Ziehe ein Foto hierher, um es hochzuladen",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format benutzerdefiniert, Kurzname, voller Name, Rückwärts oder Rückwärts mit Komma",
"Edit name details" => "Name ändern",
"http://www.somesite.com" => "http://www.somesite.com",
"dd-mm-yyyy" => "dd.mm.yyyy",
"Separate groups with commas" => "Gruppen mit Komma getrennt",
"Edit groups" => "Gruppen editieren",
"Enter email address" => "E-Mail-Adresse angeben",
"Edit address details" => "Adressinformationen ändern",
"Add notes here." => "Füge hier Notizen ein.",
"Add field" => "Feld hinzufügen",
"Download contact" => "Kontakt herunterladen",
"The temporary image has been removed from cache." => "Das temporäre Bild wurde aus dem Cache gelöscht.",
"Edit address" => "Adresse ändern",
"Type" => "Typ",
"PO Box" => "Postfach",
"Street address" => "Straßenanschrift",
"Street and number" => "Straße und Hausnummer",
"Extended" => "Erweitert",
"Apartment number etc." => "Wohnungsnummer usw.",
"City" => "Stadt",
"Region" => "Region",
"E.g. state or province" => "Z.B. Staat oder Bezirk",
"Zipcode" => "Postleitzahl",
"Postal code" => "Postleitzahl",
"Country" => "Land",
"Addressbook" => "Adressbuch",
"Hon. prefixes" => "Höflichkeitspräfixe",
"Miss" => "Frau",
@ -223,7 +260,6 @@
"Mrs" => "Frau",
"Dr" => "Dr.",
"Given name" => "Vorname",
"Additional names" => "Zusätzliche Namen",
"Family name" => "Familienname",
"Hon. suffixes" => "Höflichkeitssuffixe",
"J.D." => "Dr. Jur.",
@ -240,15 +276,12 @@
"Name of new addressbook" => "Name des neuen Adressbuchs",
"Importing contacts" => "Kontakte werden importiert",
"<h3>You have no contacts in your addressbook.</h3><p>You can import VCF files by dragging them to the contacts list and either drop them on an addressbook to import into it, or on an empty spot to create a new addressbook and import into that.<br />You can also import by clicking on the import button at the bottom of the list.</p>" => "<h3>Du hast noch keine Kontaktdaten in Deinem Adressbuch.</h3><p>Du kannst VCF-Dateien importieren, indem Du diese herein ziehst und entweder \nauf einem bestehenden Adressbuch fallen lässt, um die Dateien in dieses Adressbuch zu importieren, oder auf einen freien Bereich, um ein neues Adressbuch anzulegen und die Dateien dort zu importieren.<br />Du kannst auch den Knopf 'Importieren' am Ende der Liste drücken.</p>",
"Add contact" => "Kontakt hinzufügen",
"Select Address Books" => "Wähle Adressbuch",
"Enter description" => "Beschreibung eingeben",
"CardDAV syncing addresses" => "CardDAV Sync-Adressen",
"more info" => "weitere Informationen",
"Primary address (Kontact et al)" => "Primäre Adresse (für Kontakt o.ä.)",
"iOS/OS X" => "iOS / OS X",
"Addressbooks" => "Adressbücher",
"Share" => "Teilen",
"New Address Book" => "Neues Adressbuch",
"Name" => "Name",
"Description" => "Beschreibung",

View File

@ -2,24 +2,24 @@
"Error (de)activating addressbook." => "(De-)Aktivierung des Adressbuches fehlgeschlagen",
"id is not set." => "ID ist nicht angegeben.",
"Cannot update addressbook with an empty name." => "Das Adressbuch kann nicht mit einem leeren Namen aktualisiert werden.",
"No category name given." => "Kein Kategoriename angegeben.",
"Error adding group." => "Fehler beim Hinzufügen der Gruppe.",
"Group ID missing from request." => "Gruppen-ID fehlt in der Anfrage.",
"Contact ID missing from request." => "Kontakt-ID fehlt in der Anfrage.",
"No ID provided" => "Keine ID angegeben",
"Error setting checksum." => "Fehler beim Setzen der Prüfsumme.",
"No categories selected for deletion." => "Keine Kategorien zum Löschen ausgewählt.",
"No address books found." => "Keine Adressbücher gefunden.",
"No contacts found." => "Keine Kontakte gefunden.",
"element name is not set." => "Kein Name für das Element angegeben.",
"Could not parse contact: " => "Konnte folgenden Kontakt nicht verarbeiten:",
"Cannot add empty property." => "Feld darf nicht leer sein.",
"At least one of the address fields has to be filled out." => "Mindestens eines der Adressfelder muss ausgefüllt werden.",
"Trying to add duplicate property: " => "Versuche doppelte Eigenschaft hinzuzufügen: ",
"Missing IM parameter." => "IM-Parameter fehlt.",
"Unknown IM: " => "IM unbekannt:",
"Information about vCard is incorrect. Please reload the page." => "Die Information der vCard ist fehlerhaft. Bitte aktualisieren Sie die Seite.",
"Missing ID" => "Fehlende ID",
"Error parsing VCard for ID: \"" => "Fehler beim Einlesen der VCard für die ID: \"",
"checksum is not set." => "Keine Prüfsumme angegeben.",
"Information about vCard is incorrect. Please reload the page." => "Die Information der vCard ist fehlerhaft. Bitte aktualisieren Sie die Seite.",
"Couldn't find vCard for %d." => "Konnte die vCard von %d nicht finden.",
"Information about vCard is incorrect. Please reload the page: " => "Die Informationen zur vCard sind fehlerhaft. Bitte Seite neu laden: ",
"Something went FUBAR. " => "Irgendwas ist hier so richtig schiefgelaufen. ",
"Cannot save property of type \"%s\" as array" => "Eigenschaften vom Typ \"%s\" können nicht als Array gespeichert werden",
"Missing IM parameter." => "IM-Parameter fehlt.",
"Unknown IM: " => "IM unbekannt:",
"No contact ID was submitted." => "Es wurde keine Kontakt-ID übermittelt.",
"Error reading contact photo." => "Fehler beim Auslesen des Kontaktfotos.",
"Error saving temporary file." => "Fehler beim Speichern der temporären Datei.",
@ -35,6 +35,9 @@
"Error cropping image" => "Fehler beim Zuschneiden des Bildes",
"Error creating temporary image" => "Fehler beim Erstellen des temporären Bildes",
"Error finding image: " => "Fehler beim Suchen des Bildes: ",
"Key is not set for: " => "Der Schlüssel ist nicht gesetzt für:",
"Value is not set for: " => "Der Wert ist nicht angegeben für:",
"Could not set preference: " => "Fehler beim Speichern der Einstellung:",
"Error uploading contacts to storage." => "Übertragen der Kontakte fehlgeschlagen.",
"There is no error, the file uploaded with success" => "Es ist kein Fehler aufgetreten. Die Datei wurde erfolgreich übertragen.",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Die Datei ist größer, als durch die upload_max_filesize Direktive in php.ini erlaubt",
@ -46,43 +49,52 @@
"Couldn't load temporary image: " => "Konnte das temporäre Bild nicht laden:",
"No file was uploaded. Unknown error" => "Keine Datei hochgeladen. Unbekannter Fehler",
"Contacts" => "Kontakte",
"Sorry, this functionality has not been implemented yet" => "Diese Funktion steht leider noch nicht zur Verfügung",
"Not implemented" => "Nicht verfügbar",
"Couldn't get a valid address." => "Konnte keine gültige Adresse abrufen.",
"Error" => "Fehler",
"Please enter an email address." => "Bitte geben Sie eine E-Mailadresse an.",
"Enter name" => "Name eingeben",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format benutzerdefiniert, Kurzname, voller Name, Rückwärts oder Rückwärts mit Komma",
"Select type" => "Typ wählen",
"Contact is already in this group." => "Kontakt ist schon in der Gruppe.",
"Contacts are already in this group." => "Kontakte sind schon in der Gruppe.",
"Couldn't get contact list." => "Kontaktliste konnte nicht ermittelt werden.",
"Contact is not in this group." => "Kontakt ist nicht in der Gruppe.",
"Contacts are not in this group." => "Kontakte sind nicht in der Gruppe.",
"A group named {group} already exists" => "Eine Gruppe mit dem Namen {group} ist schon vorhanden.",
"You can drag groups to\narrange them as you like." => "Per \"Drag & Drop\" können Sie Gruppen nach Ihren Wünschen anordnen.",
"All" => "Alle",
"Favorites" => "Favoriten",
"Shared by {owner}" => "Geteilt von {owner}",
"Indexing contacts" => "Indiziere Kontakte",
"Add to..." => "Füge hinzu...",
"Remove from..." => "Entferne von...",
"Add group..." => "Füge Gruppe hinzu...",
"Select photo" => "Wählen Sie ein Foto",
"You do not have permission to add contacts to " => "Sie besitzen nicht die erforderlichen Rechte, um Kontakte hinzuzufügen",
"Please select one of your own address books." => "Bitte wählen Sie eines Ihrer Adressbücher aus.",
"Permission error" => "Berechtigungsfehler",
"Click to undo deletion of \"" => "Klicken Sie hier für die Wiederherstellung von \"",
"Cancelled deletion of: \"" => "Abbrechen des Löschens von: \"",
"This property has to be non-empty." => "Dieses Feld darf nicht leer sein.",
"Couldn't serialize elements." => "Konnte Elemente nicht serialisieren",
"Unknown error. Please check logs." => "Unbekannter Fehler. Bitte Logs überprüfen",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' wurde ohne Argumente aufgerufen. Bitte melden Sie dies auf bugs.owncloud.org",
"Edit name" => "Name ändern",
"No files selected for upload." => "Keine Datei(en) zum Hochladen ausgewählt.",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Die Datei, die Sie hochladen möchten, überschreitet die maximale Größe für Datei-Uploads auf diesem Server.",
"Error loading profile picture." => "Fehler beim Laden des Profilbildes.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Einige zum Löschen vorgemerkte Kontakte wurden noch nicht gelöscht. Bitte warten.",
"Do you want to merge these address books?" => "Möchten Sie diese Adressbücher zusammenführen?",
"Shared by " => "Freigegeben von ",
"Upload too large" => "Die hochgeladene Datei ist zu groß",
"Only image files can be used as profile picture." => "Nur Bilder können als Profilbild genutzt werden.",
"Wrong file type" => "Falscher Dateityp",
"Your browser doesn't support AJAX upload. Please click on the profile picture to select a photo to upload." => "Der verwendete Browser unterstützt keinen Upload via AJAX. Bitte das Profilbild anklicken um ein Foto hochzuladen. ",
"Unable to upload your file as it is a directory or has 0 bytes" => "Ihre Datei konnte nicht hochgeladen werden, weil es sich um einen Ordner handelt oder die Datei leer ist.",
"Upload Error" => "Fehler beim Hochladen",
"Pending" => "Ausstehend",
"Import done" => "Import ausgeführt",
"Network or server error. Please inform administrator." => "Netzwerk- oder Serverfehler. Bitte informieren Sie den Administrator.",
"Error adding to group." => "Fehler beim Hinzufügen zur Gruppe.",
"Error removing from group." => "Fehler beim Löschen aus der Gruppe.",
"There was an error opening a mail composer." => "Fehler beim Öffnen des Mail-Editors",
"Deleting done. Click here to cancel reloading." => "Gelöscht. Klicken Sie hier, um das Neuladen abzubrechen",
"Add address book" => "Adressbuch hinzufügen",
"Import done. Click here to cancel reloading." => "Import abgeschlossen. Klicke hier, um das Neuladen abzubrechen",
"Not all files uploaded. Retrying..." => "Es wurden nicht alle Dateien hochgeladen. Versuche erneut...",
"Something went wrong with the upload, please retry." => "Beim Hochladen ist etwas schiefgegangen. Bitte versuchen Sie es erneut.",
"Error" => "Fehler",
"Importing from {filename}..." => "Importiere von {filename}",
"{success} imported, {failed} failed." => "{success} importiert, {failed} fehlgeschlagen.",
"Importing..." => "Importiere...",
"Unable to upload your file as it is a directory or has 0 bytes" => "Ihre Datei kann nicht hochgeladen werden, weil es sich um einen Ordner handelt oder 0 Bytes groß ist.",
"Upload Error" => "Fehler beim Hochladen",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Die Datei, die Sie hochladen möchten, überschreitet die maximale Größe für Datei-Uploads auf diesem Server.",
"Upload too large" => "Der Upload ist zu groß",
"Pending" => "Ausstehend",
"Add group" => "Fügen Sie eine Gruppe hinzu",
"No files selected for upload." => "Keine Datei(en) zum Hochladen ausgewählt.",
"Edit profile picture" => "Profilbild bearbeiten",
"Error loading profile picture." => "Fehler beim Laden des Profilbildes.",
"Enter name" => "Name eingeben",
"Enter description" => "Beschreibung eingeben",
"Select addressbook" => "Adressbuch wählen",
"The address book name cannot be empty." => "Der Name des Adressbuches darf nicht leer sein.",
"Is this correct?" => "Ist das richtig?",
"There was an unknown error when trying to delete this contact" => "Beim Löschen des Kontakts trat ein unbekannten Fehler auf.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Einige zum Löschen vorgemerkte Kontakte wurden noch nicht gelöscht. Bitte warten.",
"Click to undo deletion of {num} contacts" => "Klicken Sie hier um das Löschen von {num} Kontakten rückgängig zu machen",
"Cancelled deletion of {num}" => "Das Löschen von {num} wurde abgebrochen.",
"Result: " => "Ergebnis: ",
" imported, " => " importiert, ",
" failed." => " fehlgeschlagen.",
@ -100,9 +112,6 @@
"There was an error updating the addressbook." => "Ein Fehler ist bei der Aktualisierung des Adressbuches aufgetreten.",
"You do not have the permissions to delete this addressbook." => "Sie besitzen nicht die erforderlichen Rechte, dieses Adressbuch zu löschen.",
"There was an error deleting this addressbook." => "Beim Löschen des Adressbuches ist ein Fehler aufgetreten.",
"Addressbook not found: " => "Adressbuch nicht gefunden:",
"This is not your addressbook." => "Dies ist nicht Ihr Adressbuch.",
"Contact could not be found." => "Kontakt konnte nicht gefunden werden.",
"Jabber" => "Jabber",
"AIM" => "AIM",
"MSN" => "MSN",
@ -126,19 +135,9 @@
"Video" => "Video",
"Pager" => "Pager",
"Internet" => "Internet",
"Birthday" => "Geburtstag",
"Business" => "Geschäftlich",
"Call" => "Anruf",
"Clients" => "Kunden",
"Deliverer" => "Lieferant",
"Holidays" => "Feiertage",
"Ideas" => "Ideen",
"Journey" => "Reise",
"Jubilee" => "Jubiläum",
"Meeting" => "Besprechung",
"Personal" => "Persönlich",
"Projects" => "Projekte",
"Questions" => "Fragen",
"Friends" => "Freunde",
"Family" => "Familie",
"There was an error deleting properties for this contact." => "Es gab einen Fehler beim Löschen der Eigenschaften dieses Kontakts.",
"{name}'s Birthday" => "Geburtstag von {name}",
"Contact" => "Kontakt",
"You do not have the permissions to add contacts to this addressbook." => "Sie besitzen nicht die erforderlichen Rechte, diesem Adressbuch Kontakte hinzuzufügen.",
@ -148,9 +147,22 @@
"Could not find the Addressbook with ID: " => "Konnte das Adressbuch mit der folgenden ID nicht finden:",
"You do not have the permissions to delete this contact." => "Sie besitzen nicht die erforderlichen Rechte, um diesen Kontakte zu löschen.",
"There was an error deleting this contact." => "Beim Löschen des Kontaktes ist ein Fehler aufgetreten.",
"Add Contact" => "Kontakt hinzufügenff",
"Import" => "Importieren",
"Contact not found." => "Kontakt nicht gefunden.",
"HomePage" => "Internetseite",
"New Group" => "Neue Gruppe",
"Settings" => "Einstellungen",
"Address books" => "Adressbücher",
"Import" => "Importieren",
"Select files to import" => "Dateien für den Import auswählen",
"Select files" => "Dateien auswählen",
"Import into:" => "Importiere in:",
"OK" => "OK",
"(De-)select all" => "Alle (ab-)wählen",
"New Contact" => "Neuer Kontakt",
"Download Contact(s)" => "Kontakte herunterladen",
"Groups" => "Gruppen",
"Favorite" => "Favorit",
"Delete Contact" => "Kontakt löschen",
"Close" => "Schließen",
"Keyboard shortcuts" => "Tastaturbefehle",
"Navigation" => "Navigation",
@ -164,56 +176,83 @@
"Add new contact" => "Neuen Kontakt hinzufügen",
"Add new addressbook" => "Neues Adressbuch hinzufügen",
"Delete current contact" => "Aktuellen Kontakt löschen",
"Drop photo to upload" => "Ziehen Sie ein Foto hierher, um es hochzuladen",
"<h3>You have no contacts in your addressbook.</h3><p>Add a new contact or import existing contacts from a VCF file.</p>" => "<h3>Sie haben keine Kontakte in Ihrem Adressbuch.</h3><p>Fügen Sie einen neuen hinzu oder importieren Sie existierende Kontakte aus einer VCF-Datei.</p>",
"Add contact" => "Kontakt hinzufügen",
"Compose mail" => "E-Mail schreiben",
"Delete group" => "Gruppe löschen",
"Delete current photo" => "Derzeitiges Foto löschen",
"Edit current photo" => "Derzeitiges Foto ändern",
"Upload new photo" => "Neues Foto hochladen",
"Select photo from ownCloud" => "Foto aus der ownCloud auswählen",
"Edit name details" => "Name ändern",
"Organization" => "Organisation",
"First name" => "Vorname",
"Additional names" => "Zusätzliche Namen",
"Last name" => "Nachname",
"Nickname" => "Spitzname",
"Enter nickname" => "Spitzname angeben",
"Web site" => "Webseite",
"http://www.somesite.com" => "http://www.somesite.com",
"Go to web site" => "Webseite aufrufen",
"dd-mm-yyyy" => "dd.mm.yyyy",
"Groups" => "Gruppen",
"Separate groups with commas" => "Gruppen mit Komma getrennt",
"Edit groups" => "Gruppen editieren",
"Preferred" => "Bevorzugt",
"Please specify a valid email address." => "Bitte tragen Sie eine gültige E-Mail-Adresse ein.",
"Enter email address" => "E-Mail-Adresse angeben",
"Mail to address" => "E-Mail an diese Adresse schicken",
"Delete email address" => "E-Mail-Adresse löschen",
"Enter phone number" => "Telefonnummer angeben",
"Delete phone number" => "Telefonnummer löschen",
"Instant Messenger" => "Instant Messenger",
"Delete IM" => "IM löschen",
"View on map" => "Auf der Karte zeigen",
"Edit address details" => "Adressinformationen ändern",
"Add notes here." => "Fügen Sie hier Notizen ein.",
"Add field" => "Feld hinzufügen",
"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",
"Instant Messaging" => "Instant Messaging",
"Address" => "Adresse",
"Note" => "Notiz",
"Download contact" => "Kontakt herunterladen",
"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",
"Mail to address" => "E-Mail an diese Adresse schicken",
"Delete email address" => "E-Mail-Adresse löschen",
"Enter phone number" => "Telefonnummer angeben",
"Delete phone number" => "Telefonnummer löschen",
"Go to web site" => "Webseite aufrufen",
"Delete URL" => "Lösche URL",
"View on map" => "Auf der Karte zeigen",
"Delete address" => "Lösche Adresse",
"1 Main Street" => "Hauptstraße 1",
"Street address" => "Straßenanschrift",
"12345" => "12345",
"Postal code" => "Postleitzahl",
"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",
"Delete IM" => "IM löschen",
"Share" => "Teilen",
"Export" => "Exportieren",
"CardDAV link" => "CardDAV Verbindung",
"Add Contact" => "Kontakt hinzufügen",
"Drop photo to upload" => "Ziehen Sie ein Foto hierher, um es hochzuladen",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format benutzerdefiniert, Kurzname, voller Name, Rückwärts oder Rückwärts mit Komma",
"Edit name details" => "Name ändern",
"http://www.somesite.com" => "http://www.somesite.com",
"dd-mm-yyyy" => "dd.mm.yyyy",
"Separate groups with commas" => "Gruppen mit Komma getrennt",
"Edit groups" => "Gruppen editieren",
"Enter email address" => "E-Mail-Adresse angeben",
"Edit address details" => "Adressinformationen ändern",
"Add notes here." => "Fügen Sie hier Notizen ein.",
"Add field" => "Feld hinzufügen",
"Download contact" => "Kontakt herunterladen",
"The temporary image has been removed from cache." => "Das temporäre Bild wurde aus dem Cache gelöscht.",
"Edit address" => "Adresse ändern",
"Type" => "Typ",
"PO Box" => "Postfach",
"Street address" => "Straßenanschrift",
"Street and number" => "Straße und Hausnummer",
"Extended" => "Erweitert",
"Apartment number etc." => "Wohnungsnummer usw.",
"City" => "Stadt",
"Region" => "Region",
"E.g. state or province" => "Z.B. Staat oder Bezirk",
"Zipcode" => "Postleitzahl",
"Postal code" => "Postleitzahl",
"Country" => "Land",
"Addressbook" => "Adressbuch",
"Hon. prefixes" => "Höflichkeitspräfixe",
"Miss" => "Frau",
@ -223,7 +262,6 @@
"Mrs" => "Frau",
"Dr" => "Dr.",
"Given name" => "Vorname",
"Additional names" => "Zusätzliche Namen",
"Family name" => "Familienname",
"Hon. suffixes" => "Höflichkeitssuffixe",
"J.D." => "Dr. Jur.",
@ -240,15 +278,12 @@
"Name of new addressbook" => "Name des neuen Adressbuchs",
"Importing contacts" => "Kontakte werden importiert",
"<h3>You have no contacts in your addressbook.</h3><p>You can import VCF files by dragging them to the contacts list and either drop them on an addressbook to import into it, or on an empty spot to create a new addressbook and import into that.<br />You can also import by clicking on the import button at the bottom of the list.</p>" => "<h3>Sie habent noch keine Kontaktdaten in Ihrem Adressbuch.</h3><p>Sie können VCF-Dateien importieren, indem Sie diese herein ziehen und entweder \nauf einem bestehenden Adressbuch fallen lassen, um die Dateien in dieses Adressbuch zu importieren, oder auf einen freien Bereich, um ein neues Adressbuch anzulegen und die Dateien dort zu importieren.<br />Sie können auch den Knopf 'Importieren' am Ende der Liste drücken.</p>",
"Add contact" => "Kontakt hinzufügen",
"Select Address Books" => "Wählen sie ein Adressbuch",
"Enter description" => "Beschreibung eingeben",
"CardDAV syncing addresses" => "CardDAV Sync-Adressen",
"more info" => "weitere Informationen",
"Primary address (Kontact et al)" => "Primäre Adresse (für Kontakt o.ä.)",
"iOS/OS X" => "iOS / OS X",
"Addressbooks" => "Adressbücher",
"Share" => "Teilen",
"New Address Book" => "Neues Adressbuch",
"Name" => "Name",
"Description" => "Beschreibung",

View File

@ -2,24 +2,19 @@
"Error (de)activating addressbook." => "Σφάλμα (απ)ενεργοποίησης βιβλίου διευθύνσεων",
"id is not set." => "δεν ορίστηκε id",
"Cannot update addressbook with an empty name." => "Δε μπορεί να γίνει αλλαγή βιβλίου διευθύνσεων χωρίς όνομα",
"Error adding group." => "Σφάλμα κατά την προσθήκη ομάδας.",
"No ID provided" => "Δε δόθηκε ID",
"Error setting checksum." => "Λάθος κατά τον ορισμό checksum ",
"No categories selected for deletion." => "Δε επελέγησαν κατηγορίες για διαγραφή",
"No address books found." => "Δε βρέθηκε βιβλίο διευθύνσεων",
"No contacts found." => "Δεν βρέθηκαν επαφές",
"element name is not set." => "δεν ορίστηκε όνομα στοιχείου",
"Could not parse contact: " => "Δε αναγνώστηκε η επαφή",
"Cannot add empty property." => "Αδύνατη προσθήκη κενής ιδιότητας.",
"At least one of the address fields has to be filled out." => "Πρέπει να συμπληρωθεί τουλάχιστον ένα από τα παιδία διεύθυνσης.",
"Trying to add duplicate property: " => "Προσπάθεια προσθήκης διπλότυπης ιδιότητας:",
"Missing IM parameter." => "Λείπει IM παράμετρος.",
"Unknown IM: " => "Άγνωστο IM:",
"Information about vCard is incorrect. Please reload the page." => "Οι πληροφορίες σχετικά με vCard είναι εσφαλμένες. Παρακαλώ επαναφορτώστε τη σελίδα.",
"Missing ID" => "Λείπει ID",
"Error parsing VCard for ID: \"" => "Σφάλμα κατά την ανάγνωση του VCard για το ID:\"",
"checksum is not set." => "δε ορίστηκε checksum ",
"Information about vCard is incorrect. Please reload the page." => "Οι πληροφορίες σχετικά με vCard είναι εσφαλμένες. Παρακαλώ επαναφορτώστε τη σελίδα.",
"Information about vCard is incorrect. Please reload the page: " => "Οι πληροφορίες για τη vCard είναι λανθασμένες.Παρακαλώ ξαναφορτώστε τη σελίδα: ",
"Something went FUBAR. " => "Κάτι χάθηκε στο άγνωστο. ",
"Missing IM parameter." => "Λείπει IM παράμετρος.",
"Unknown IM: " => "Άγνωστο IM:",
"No contact ID was submitted." => "Δε υπεβλήθει ID επαφής",
"Error reading contact photo." => "Σφάλμα ανάγνωσης εικόνας επαφής",
"Error saving temporary file." => "Σφάλμα αποθήκευσης προσωρινού αρχείου",
@ -46,43 +41,35 @@
"Couldn't load temporary image: " => "Δεν ήταν δυνατή η φόρτωση της προσωρινής εικόνας: ",
"No file was uploaded. Unknown error" => "Δεν ανέβηκε κάποιο αρχείο. Άγνωστο σφάλμα",
"Contacts" => "Επαφές",
"Sorry, this functionality has not been implemented yet" => "Λυπούμαστε, αυτή η λειτουργία δεν έχει υλοποιηθεί ακόμα",
"Not implemented" => "Δεν έχει υλοποιηθεί",
"Couldn't get a valid address." => "Αδυναμία λήψης έγκυρης διεύθυνσης",
"Error" => "Σφάλμα",
"Please enter an email address." => "Παρακαλώ εισάγεται μια διεύθυνση ηλ. ταχυδρομείου",
"Enter name" => "Εισαγωγή ονόματος",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format custom, Όνομα, Επώνυμο, Αντίστροφο ή Αντίστροφο με κόμμα",
"Select type" => "Επιλογή τύπου",
"Contact is already in this group." => "Η επαφή είναι ήδη σε αυτήν την ομάδα.",
"Contacts are already in this group." => "Οι επαφές είναι ήδη σε αυτήν την ομάδα.",
"All" => "Όλες",
"Favorites" => "Αγαπημένες",
"Add to..." => "Προσθήκη στο...",
"Remove from..." => "Αφαίρεση από το...",
"Add group..." => "Προσθήκη ομάδας...",
"Select photo" => "Επέλεξε φωτογραφία",
"You do not have permission to add contacts to " => "Δεν έχετε επαρκή δικαιώματα για προσθέσετε επαφές στο ",
"Please select one of your own address books." => "Παρακαλούμε επιλέξτε ένα από τα δικάς σας βιβλία διευθύνσεων.",
"Permission error" => "Σφάλμα δικαιωμάτων",
"Click to undo deletion of \"" => "Επιλογή για αναίρεση της διαγραφής του \"",
"Cancelled deletion of: \"" => "Ακύρωση διαγραφής του: \"",
"This property has to be non-empty." => "Το πεδίο δεν πρέπει να είναι άδειο.",
"Couldn't serialize elements." => "Αδύνατο να μπουν σε σειρά τα στοιχεία",
"Unknown error. Please check logs." => "Άγνωστο σφάλμα.Παρακαλώ έλεγξε το αρχείο καταγραφής.",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "το 'deleteProperty' καλέστηκε χωρίς without type argument. Παρακαλώ αναφέρατε στο bugs.owncloud.org",
"Edit name" => "Αλλαγή ονόματος",
"No files selected for upload." => "Δεν επιλέχτηκαν αρχεία για μεταφόρτωση",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Το αρχείο που προσπαθείτε να ανεβάσετε υπερβαίνει το μέγιστο μέγεθος για τις προσθήκες αρχείων σε αυτόν τον server.",
"Error loading profile picture." => "Σφάλμα στην φόρτωση εικόνας προφίλ.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Κάποιες επαφές σημειώθηκαν προς διαγραφή,δεν έχουν διαγραφεί ακόμα. Παρακαλώ περιμένετε μέχρι να διαγραφούν.",
"Do you want to merge these address books?" => "Επιθυμείτε να συγχωνεύσετε αυτά τα δύο βιβλία διευθύνσεων?",
"Shared by " => "Μοιράστηκε από",
"Upload too large" => "Πολύ μεγάλο αρχείο για μεταφόρτωση",
"Only image files can be used as profile picture." => "Μόνο αρχεία εικόνας μπορούν να χρησιμοποιηθούν σαν εικόνα προφίλ.",
"Wrong file type" => "Λάθος τύπος αρχείου",
"Your browser doesn't support AJAX upload. Please click on the profile picture to select a photo to upload." => "Ο περιηγητής σας δεν υποστηρίζει μεταφόρτωση σε AJAX. Παρακαλώ κάντε κλικ πάνω στην εικόνα προφίλ για να επιλέξετε μια φωτογραφία για να την ανεβάσετε.",
"Unable to upload your file as it is a directory or has 0 bytes" => "Αδυναμία μεταφόρτωσης του αρχείου σας διότι είναι κατάλογος ή έχει μέγεθος 0 bytes",
"Upload Error" => "Σφάλμα Μεταφόρτωσης",
"Pending" => "Εκκρεμεί",
"Import done" => "Η εισαγωγή ολοκληρώθηκε",
"Error adding to group." => "Σφάλμα κατά την προσθήκη σε ομάδα.",
"Error removing from group." => "Σφάλμα κατά την αφαίρεση από ομάδα.",
"There was an error opening a mail composer." => "Υπήρχε ένα σφάλμα στο άνοιγμα μίας σύνθεσης μηνύματος.",
"Not all files uploaded. Retrying..." => "Δεν μεταφορτώθηκαν όλα τα αρχεία. Προσπάθεια ξανά...",
"Something went wrong with the upload, please retry." => "Κάτι πήγε στραβά με την μεταφόρτωση, παρακαλώ προσπαθήστε ξανά.",
"Error" => "Σφάλμα",
"Importing..." => "Γίνεται εισαγωγή...",
"Unable to upload your file as it is a directory or has 0 bytes" => "Αδυναμία στην αποστολή του αρχείου σας αφού είναι φάκελος ή έχει 0 bytes",
"Upload Error" => "Σφάλμα Αποστολής",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Το αρχείο που προσπαθείτε να ανεβάσετε υπερβαίνει το μέγιστο μέγεθος για τις προσθήκες αρχείων σε αυτόν τον server.",
"Upload too large" => "Πολύ μεγάλο αρχείο προς αποστολή",
"Pending" => "Εκκρεμεί",
"Add group" => "Προσθήκη ομάδας",
"No files selected for upload." => "Δεν επιλέχτηκαν αρχεία για μεταφόρτωση",
"Edit profile picture" => "Επεξεργασία εικόνας προφίλ",
"Error loading profile picture." => "Σφάλμα στην φόρτωση εικόνας προφίλ.",
"Enter name" => "Εισαγωγή ονόματος",
"Enter description" => "Εισαγωγή περιγραφής",
"Select addressbook" => "Επιλογή βιβλίου επαφών",
"The address book name cannot be empty." => "Το όνομα του βιβλίου διευθύνσεων δεν πρέπει να είναι κενό.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Κάποιες επαφές σημειώθηκαν προς διαγραφή,δεν έχουν διαγραφεί ακόμα. Παρακαλώ περιμένετε μέχρι να διαγραφούν.",
"Result: " => "Αποτέλεσμα: ",
" imported, " => " εισάγεται,",
" failed." => " απέτυχε.",
@ -100,9 +87,6 @@
"There was an error updating the addressbook." => "Υπήρξε σφάλμα κατά την ενημέρωση του βιβλίου διευθύνσεων.",
"You do not have the permissions to delete this addressbook." => "Δεν έχετε δικαιώματα να διαγράψετε αυτό το βιβλίο διευθύνσεων.",
"There was an error deleting this addressbook." => "Υπήρξε σφάλμα κατά την διαγραφή αυτού του βιβλίου διευθύνσεων",
"Addressbook not found: " => "Το βιβλίο διευθύνσεων δεν βρέθηκε:",
"This is not your addressbook." => "Αυτό δεν είναι το βιβλίο διευθύνσεων σας.",
"Contact could not be found." => "Η επαφή δεν μπόρεσε να βρεθεί.",
"Jabber" => "Jabber",
"AIM" => "AIM",
"MSN" => "MSN",
@ -126,19 +110,8 @@
"Video" => "Βίντεο",
"Pager" => "Βομβητής",
"Internet" => "Διαδίκτυο",
"Birthday" => "Γενέθλια",
"Business" => "Επιχείρηση",
"Call" => "Κάλεσε",
"Clients" => "Πελάτες",
"Deliverer" => "Προμηθευτής",
"Holidays" => "Διακοπές",
"Ideas" => "Ιδέες",
"Journey" => "Ταξίδι",
"Jubilee" => "Ιωβηλαίο",
"Meeting" => "Συνάντηση",
"Personal" => "Προσωπικό",
"Projects" => "Έργα",
"Questions" => "Ερωτήσεις",
"Friends" => "Φίλοι",
"Family" => "Οικογένεια",
"{name}'s Birthday" => "Τα Γεννέθλια του/της {name}",
"Contact" => "Επαφή",
"You do not have the permissions to add contacts to this addressbook." => "Δεν έχετε δικαιώματα να προσθέσετε επαφές σε αυτό το βιβλίο διευθύνσεων.",
@ -148,9 +121,15 @@
"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." => "Υπήρξε σφάλμα κατά την διαγραφή αυτής της επαφής.",
"Add Contact" => "Προσθήκη επαφής",
"Import" => "Εισαγωγή",
"Contact not found." => "Δεν βρέθηκε επαφή.",
"New Group" => "Νέα Ομάδα",
"Settings" => "Ρυθμίσεις",
"Import" => "Εισαγωγή",
"Import into:" => "Εισαγωγή από:",
"OK" => "ΟΚ",
"New Contact" => "Νέα επαφή",
"Groups" => "Ομάδες",
"Delete Contact" => "Διαγραφή επαφής",
"Close" => "Κλείσιμο ",
"Keyboard shortcuts" => "Συντομεύσεις πλητρολογίου",
"Navigation" => "Πλοήγηση",
@ -164,56 +143,74 @@
"Add new contact" => "Προσθήκη νέας επαφής",
"Add new addressbook" => "Προσθήκη νέου βιβλίου επαφών",
"Delete current contact" => "Διαγραφή τρέχουσας επαφής",
"Drop photo to upload" => "Ρίξε μια φωτογραφία για ανέβασμα",
"Add contact" => "Προσθήκη επαφής",
"Compose mail" => "Σύνθεση μηνύματος",
"Delete group" => "Διαγραφή ομάδας",
"Delete current photo" => "Διαγραφή τρέχουσας φωτογραφίας",
"Edit current photo" => "Επεξεργασία τρέχουσας φωτογραφίας",
"Upload new photo" => "Ανέβασε νέα φωτογραφία",
"Select photo from ownCloud" => "Επέλεξε φωτογραφία από το ownCloud",
"Edit name details" => "Αλλάξτε τις λεπτομέρειες ονόματος",
"Organization" => "Οργανισμός",
"First name" => "Όνομα",
"Additional names" => "Επιπλέον ονόματα",
"Last name" => "Επώνυμο",
"Nickname" => "Παρατσούκλι",
"Enter nickname" => "Εισάγετε παρατσούκλι",
"Web site" => "Ιστότοπος",
"http://www.somesite.com" => "http://www.somesite.com",
"Go to web site" => "Πήγαινε στον ιστότοπο",
"dd-mm-yyyy" => "ΗΗ-ΜΜ-ΕΕΕΕ",
"Groups" => "Ομάδες",
"Separate groups with commas" => "Διαχώρισε τις ομάδες με κόμμα ",
"Edit groups" => "Επεξεργασία ομάδων",
"Preferred" => "Προτιμώμενο",
"Please specify a valid email address." => "Παρακαλώ εισήγαγε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου",
"Enter email address" => "Εισήγαγε διεύθυνση ηλεκτρονικού ταχυδρομείου",
"Mail to address" => "Αποστολή σε διεύθυνση",
"Delete email address" => "Διαγραφή διεύθυνση email",
"Enter phone number" => "Εισήγαγε αριθμό τηλεφώνου",
"Delete phone number" => "Διέγραψε αριθμό τηλεφώνου",
"Instant Messenger" => "Instant Messenger",
"Delete IM" => "Διαγραφή IM",
"View on map" => "Προβολή στο χάρτη",
"Edit address details" => "Επεξεργασία λεπτομερειών διεύθυνσης",
"Add notes here." => "Πρόσθεσε τις σημειώσεις εδώ",
"Add field" => "Προσθήκη πεδίου",
"Title" => "Τίτλος",
"Organization" => "Οργανισμός",
"Birthday" => "Γενέθλια",
"Add" => "Προσθήκη",
"Phone" => "Τηλέφωνο",
"Email" => "Email",
"Instant Messaging" => "Άμεσα μυνήματα",
"Address" => "Διεύθυνση",
"Note" => "Σημείωση",
"Download contact" => "Λήψη επαφής",
"Web site" => "Ιστότοπος",
"Delete contact" => "Διαγραφή επαφής",
"Preferred" => "Προτιμώμενο",
"Please specify a valid email address." => "Παρακαλώ εισήγαγε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου",
"someone@example.com" => "someone@example.com",
"Mail to address" => "Αποστολή σε διεύθυνση",
"Delete email address" => "Διαγραφή διεύθυνση email",
"Enter phone number" => "Εισήγαγε αριθμό τηλεφώνου",
"Delete phone number" => "Διέγραψε αριθμό τηλεφώνου",
"Go to web site" => "Πήγαινε στον ιστότοπο",
"Delete URL" => "Διαγραφή URL",
"View on map" => "Προβολή στο χάρτη",
"Delete address" => "Διαγραφή διεύθυνσης",
"Street address" => "Διεύθυνση οδού",
"12345" => "12345",
"Postal code" => "Ταχυδρομικός Κωδικός",
"Your city" => "Η πόλη σας",
"City" => "Πόλη",
"Your country" => "Η χώρα σας",
"Country" => "Χώρα",
"Instant Messenger" => "Instant Messenger",
"Delete IM" => "Διαγραφή IM",
"Share" => "Μοιράσου",
"Export" => "Εξαγωγή",
"Add Contact" => "Προσθήκη επαφής",
"Drop photo to upload" => "Ρίξε μια φωτογραφία για ανέβασμα",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format custom, Όνομα, Επώνυμο, Αντίστροφο ή Αντίστροφο με κόμμα",
"Edit name details" => "Αλλάξτε τις λεπτομέρειες ονόματος",
"http://www.somesite.com" => "http://www.somesite.com",
"dd-mm-yyyy" => "ΗΗ-ΜΜ-ΕΕΕΕ",
"Separate groups with commas" => "Διαχώρισε τις ομάδες με κόμμα ",
"Edit groups" => "Επεξεργασία ομάδων",
"Enter email address" => "Εισήγαγε διεύθυνση ηλεκτρονικού ταχυδρομείου",
"Edit address details" => "Επεξεργασία λεπτομερειών διεύθυνσης",
"Add notes here." => "Πρόσθεσε τις σημειώσεις εδώ",
"Add field" => "Προσθήκη πεδίου",
"Download contact" => "Λήψη επαφής",
"The temporary image has been removed from cache." => "Η προσωρινή εικόνα αφαιρέθηκε από την κρυφή μνήμη.",
"Edit address" => "Επεξεργασία διεύθυνσης",
"Type" => "Τύπος",
"PO Box" => "Ταχ. Θυρίδα",
"Street address" => "Διεύθυνση οδού",
"Street and number" => "Οδός και αριθμός",
"Extended" => "Εκτεταμένη",
"Apartment number etc." => "Αριθμός διαμερίσματος",
"City" => "Πόλη",
"Region" => "Περιοχή",
"E.g. state or province" => "Π.χ. Πολιτεία ή επαρχεία",
"Zipcode" => "Τ.Κ.",
"Postal code" => "Ταχυδρομικός Κωδικός",
"Country" => "Χώρα",
"Addressbook" => "Βιβλίο διευθύνσεων",
"Hon. prefixes" => "προθέματα",
"Miss" => "Δις",
@ -223,7 +220,6 @@
"Mrs" => "Κα",
"Dr" => "Δρ.",
"Given name" => "Όνομα",
"Additional names" => "Επιπλέον ονόματα",
"Family name" => "Επώνυμο",
"Hon. suffixes" => "καταλήξεις",
"J.D." => "J.D.",
@ -240,15 +236,12 @@
"Name of new addressbook" => "Όνομα νέου βιβλίου διευθύνσεων",
"Importing contacts" => "Εισαγωγή επαφών",
"<h3>You have no contacts in your addressbook.</h3><p>You can import VCF files by dragging them to the contacts list and either drop them on an addressbook to import into it, or on an empty spot to create a new addressbook and import into that.<br />You can also import by clicking on the import button at the bottom of the list.</p>" => "<h3>Δεν έχετε επαφές στο βιβλίο διευθύνσεων.</h3><p>Μπορείτε να εισάγετε αρχεία VCF σύροντάς τα στην λίστα επαφών και είτε αφήνοντάς τα στο βιβλίο διευθύνσεων ώστε να εισαχθούν σε αυτό, είτε σε κάποιο κενό σημείο ώστε να δημιουργηθεί νέο βιβλίο διευθύνσεων και να εισαχθούν σε αυτό.<br />Μπορείτε επίσης να τα εισάγετε κάνοντας κλικ στο κουμπί εισαγωγής στο κάτω μέρος της λίστας.</p>",
"Add contact" => "Προσθήκη επαφής",
"Select Address Books" => "Επέλεξε βιβλίο διευθύνσεων",
"Enter description" => "Εισαγωγή περιγραφής",
"CardDAV syncing addresses" => "συγχρονισμός διευθύνσεων μέσω CardDAV ",
"more info" => "περισσότερες πληροφορίες",
"Primary address (Kontact et al)" => "Κύρια διεύθυνση",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "Βιβλία διευθύνσεων",
"Share" => "Μοιράσου",
"New Address Book" => "Νέο βιβλίο διευθύνσεων",
"Name" => "Όνομα",
"Description" => "Περιγραφή",

View File

@ -2,22 +2,24 @@
"Error (de)activating addressbook." => "Eraro dum (mal)aktivigo de adresaro.",
"id is not set." => "identigilo ne agordiĝis.",
"Cannot update addressbook with an empty name." => "Ne eblas ĝisdatigi adresaron kun malplena nomo.",
"No category name given." => "Ne doniĝis nomo de kategorio.",
"Error adding group." => "Eraro dum aldono de grupo.",
"Group ID missing from request." => "Grupidentigilo mankas en peto.",
"Contact ID missing from request." => "Kontaktidentigilo mankas en peto.",
"No ID provided" => "Neniu identigilo proviziĝis.",
"Error setting checksum." => "Eraro dum agordado de kontrolsumo.",
"No categories selected for deletion." => "Neniu kategorio elektiĝis por forigi.",
"No address books found." => "Neniu adresaro troviĝis.",
"No contacts found." => "Neniu kontakto troviĝis.",
"element name is not set." => "eronomo ne agordiĝis.",
"Could not parse contact: " => "Ne eblis analizi kontakton:",
"Cannot add empty property." => "Ne eblas aldoni malplenan propraĵon.",
"At least one of the address fields has to be filled out." => "Almenaŭ unu el la adreskampoj necesas pleniĝi.",
"Trying to add duplicate property: " => "Provante aldoni duobligitan propraĵon:",
"Information about vCard is incorrect. Please reload the page." => "Informo pri vCard estas malĝusta. Bonvolu reŝargi la paĝon.",
"Missing ID" => "Mankas identigilo",
"Error parsing VCard for ID: \"" => "Eraro dum analizo de VCard por identigilo:",
"checksum is not set." => "kontrolsumo ne agordiĝis.",
"Information about vCard is incorrect. Please reload the page." => "Informo pri vCard estas malĝusta. Bonvolu reŝargi la paĝon.",
"Couldn't find vCard for %d." => "Ne troviĝis vCard-on por %d.",
"Information about vCard is incorrect. Please reload the page: " => "Informo pri vCard malĝustas. Bonvolu reŝargi la paĝon:",
"Something went FUBAR. " => "Io FUBAR-is.",
"Cannot save property of type \"%s\" as array" => "Ne povis konserviĝi propraĵo \"%s\"-tipa kiel matrico",
"Missing IM parameter." => "Mankas tujmesaĝada parametro.",
"Unknown IM: " => "Nekonata tujmesaĝado:",
"No contact ID was submitted." => "Neniu kontaktidentigilo sendiĝis.",
"Error reading contact photo." => "Eraro dum lego de kontakta foto.",
"Error saving temporary file." => "Eraro dum konservado de provizora dosiero.",
@ -33,6 +35,9 @@
"Error cropping image" => "Eraro dum stuciĝis bildo.",
"Error creating temporary image" => "Eraro dum kreiĝis provizora bildo.",
"Error finding image: " => "Eraro dum serĉo de bildo: ",
"Key is not set for: " => "Klavo ne agordiĝis por:",
"Value is not set for: " => "Valoro ne agordiĝis por:",
"Could not set preference: " => "Ne eblis agordi preferon:",
"Error uploading contacts to storage." => "Eraro dum alŝutiĝis kontaktoj al konservejo.",
"There is no error, the file uploaded with success" => "Ne estas eraro, la dosiero alŝutiĝis sukcese.",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "La alŝutita dosiero transpasas la preskribon upload_max_filesize en php.ini",
@ -44,43 +49,50 @@
"Couldn't load temporary image: " => "Ne eblis ŝargi provizoran bildon: ",
"No file was uploaded. Unknown error" => "Neniu dosiero alŝutiĝis. Nekonata eraro.",
"Contacts" => "Kontaktoj",
"Sorry, this functionality has not been implemented yet" => "Pardonu, ĉi tiu funkcio ankoraŭ ne estas realigita.",
"Not implemented" => "Ne disponebla",
"Couldn't get a valid address." => "Ne eblis ekhavi validan adreson.",
"Error" => "Eraro",
"Please enter an email address." => "Bonvolu enigi retpoŝtadreson.",
"Enter name" => "Enigu nomon",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Propra formo, Mallonga nomo, Longa nomo, Inversa aŭ Inversa kun komo",
"Select type" => "Elektu tipon",
"Contact is already in this group." => "La kontakto jam estas en ĉi tiu grupo.",
"Contacts are already in this group." => "La kontaktoj jam estas en ĉi tiu grupo.",
"Couldn't get contact list." => "Ne eblis ekhavi kontaktoliston.",
"Contact is not in this group." => "La kontakto ne estas en ĉi tiu grupo.",
"Contacts are not in this group." => "La kontaktoj ne estas en ĉi tiu grupo.",
"A group named {group} already exists" => "Grupo nomata {group} jam ekzistas",
"All" => "Ĉio",
"Favorites" => "Favoratoj",
"Shared by {owner}" => "Kunhavigita de {owner}",
"Indexing contacts" => "Indeksante kontaktojn",
"Add to..." => "Aldoni al...",
"Remove from..." => "Forigi el...",
"Add group..." => "Aldoni grupon...",
"Select photo" => "Elekti foton",
"You do not have permission to add contacts to " => "Vi ne havas permeson aldoni kontaktojn al",
"Please select one of your own address books." => "Bonvolu elekti unu el viaj propraj adresaroj.",
"Permission error" => "Permesa eraro",
"Click to undo deletion of \"" => "Klaku por malfari forigon de \"",
"Cancelled deletion of: \"" => "Nuliĝis forigo de: \"",
"This property has to be non-empty." => "Ĉi tiu propraĵo devas ne esti malplena.",
"Couldn't serialize elements." => "Ne eblis seriigi erojn.",
"Unknown error. Please check logs." => "Nekonata eraro. Bonvolu kontroli protokolajn informojn.",
"Edit name" => "Redakti nomon",
"No files selected for upload." => "Neniu dosiero elektita por alŝuto.",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "La dosiero, kiun vi provas alŝuti, transpasas la maksimuman grandon por dosieraj alŝutoj en ĉi tiu servilo.",
"Error loading profile picture." => "Eraro dum ŝargado de profila bildo.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Iuj kontaktoj estas markitaj por forigo, sed ankoraŭ ne forigitaj. Bonvolu atendi ĝis ili foriĝos.",
"Shared by " => "Kunhavigita de",
"Upload too large" => "Alŝuto tro larĝa",
"Only image files can be used as profile picture." => "Nur bildodosieroj povas uziĝi kiel profilbildoj.",
"Wrong file type" => "Malĝusta dosiertipo",
"Your browser doesn't support AJAX upload. Please click on the profile picture to select a photo to upload." => "Via foliumilo ne kongruas kun AJAX-alŝutado. Bonvolu klaki la profilbildon por elekti foton alŝutotan.",
"Unable to upload your file as it is a directory or has 0 bytes" => "Ne eblis alŝuti vian dosieron ĉar ĝi estas dosierujo aŭ havas 0 duumokojn",
"Upload Error" => "Eraro dum alŝuto",
"Import done" => "Enporto plenumiĝis",
"Network or server error. Please inform administrator." => "Reta aŭ servila eraro. Bonvolu sciigi al la administranto.",
"Error adding to group." => "Eraro dum aldono al grupo.",
"Error removing from group." => "Eraro dum forigo el grupo.",
"There was an error opening a mail composer." => "Eraro okazis dum malfermo de retpoŝtomesaĝoredaktilo.",
"Not all files uploaded. Retrying..." => "Ne ĉiuj dosieroj alŝutiĝis. Reprovante...",
"Something went wrong with the upload, please retry." => "Io malsukcesis dum alŝuto, bonvolu reprovi.",
"Error" => "Eraro",
"Importing..." => "Enportante...",
"Unable to upload your file as it is a directory or has 0 bytes" => "Ne eblis alŝuti vian dosieron ĉar ĝi estas dosierujo aŭ havas 0 duumokojn",
"Upload Error" => "Eraro dum alŝuto",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "La dosiero, kiun vi provas alŝuti, transpasas la maksimuman grandon por dosieraj alŝutoj en ĉi tiu servilo.",
"Upload too large" => "Alŝuto tro larĝa",
"Pending" => "Traktotaj",
"Add group" => "Aldoni grupon",
"No files selected for upload." => "Neniu dosiero elektita por alŝuto.",
"Edit profile picture" => "Redakti profilbildon",
"Error loading profile picture." => "Eraro dum ŝargado de profila bildo.",
"Enter name" => "Enigu nomon",
"Enter description" => "Enigu priskribon",
"Select addressbook" => "Elekti adresaron",
"The address book name cannot be empty." => "La nomo de la adresaro ne povas esti malplena.",
"Is this correct?" => "Ĉu ĉi tio ĝustas?",
"There was an unknown error when trying to delete this contact" => "Nekonata eraro okazis dum provo forigi ĉi tiun kontakton",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Iuj kontaktoj estas markitaj por forigo, sed ankoraŭ ne forigitaj. Bonvolu atendi ĝis ili foriĝos.",
"Click to undo deletion of {num} contacts" => "Klaku por malfari forigon de {num} kontaktoj",
"Cancelled deletion of {num}" => "Nuliĝis forigo de {num}",
"Result: " => "Rezulto: ",
" imported, " => " enportoj, ",
" failed." => "malsukcesoj.",
"Displayname cannot be empty." => "Montronomo devas ne esti malplena.",
"Show CardDav link" => "Montri CardDav-ligilon",
"Show read-only VCF link" => "Montri nur legeblan VCF-ligilon",
"Download" => "Elŝuti",
@ -94,9 +106,6 @@
"There was an error updating the addressbook." => "Eraro okazis dum ĝisdatiĝis la adresaro.",
"You do not have the permissions to delete this addressbook." => "Vi ne havas la permeson forigi ĉi tiun adresaron.",
"There was an error deleting this addressbook." => "Eraro okazis dum foriĝis ĉi tiu adresaro.",
"Addressbook not found: " => "Adresaro ne troviĝis:",
"This is not your addressbook." => "Ĉi tiu ne estas via adresaro.",
"Contact could not be found." => "Ne eblis trovi la kontakton.",
"Jabber" => "Jabber",
"AIM" => "AIM",
"MSN" => "MSN",
@ -120,28 +129,30 @@
"Video" => "Videaĵo",
"Pager" => "Televokilo",
"Internet" => "Interreto",
"Birthday" => "Naskiĝotago",
"Business" => "Negoco",
"Call" => "Voko",
"Clients" => "Klientoj",
"Deliverer" => "Liveranto",
"Holidays" => "Ferioj",
"Ideas" => "Ideoj",
"Journey" => "Vojaĝo",
"Jubilee" => "Jubileo",
"Meeting" => "Kunveno",
"Personal" => "Persona",
"Projects" => "Projektoj",
"Questions" => "Demandoj",
"Friends" => "Amikoj",
"Family" => "Familio",
"There was an error deleting properties for this contact." => "Eraro okazis dum forigo de propraĵoj de tiu ĉi kontakto.",
"{name}'s Birthday" => "Naskiĝtago de {name}",
"Contact" => "Kontakto",
"You do not have the permissions to add contacts to this addressbook." => "Vi ne havas la permeson aldoni kontaktojn al ĉi tiu adresaro.",
"Could not find the vCard with ID." => "Ne troviĝis vCard kun tiu identigilo.",
"You do not have the permissions to edit this contact." => "Vi ne havas permeson redakti ĉi tiun kontakton.",
"Could not find the vCard with ID: " => "Ne troviĝis vCard kun ĉi tiu identigilo:",
"Could not find the Addressbook with ID: " => "Ne troviĝis adresaro kun ĉi tiu identigilo:",
"You do not have the permissions to delete this contact." => "Vi ne havas permeson forigi ĉi tiun kontakton.",
"There was an error deleting this contact." => "Eraro okazis dum foriĝis ĉi tiu kontakto.",
"Add Contact" => "Aldoni kontakton",
"Import" => "Enporti",
"Contact not found." => "Kontakto ne troviĝis.",
"HomePage" => "Hejmpaĝo",
"New Group" => "Nova grupo",
"Settings" => "Agordo",
"Import" => "Enporti",
"Import into:" => "Enporti en:",
"OK" => "Akcepti",
"(De-)select all" => "(Mal)elekti ĉion",
"New Contact" => "Nova kontakto",
"Groups" => "Grupoj",
"Favorite" => "Favorato",
"Delete Contact" => "Forigi kontakton",
"Close" => "Fermi",
"Keyboard shortcuts" => "Fulmoklavoj",
"Navigation" => "Navigado",
@ -155,55 +166,78 @@
"Add new contact" => "Aldoni novan kontakton",
"Add new addressbook" => "Aldoni novan adresaron",
"Delete current contact" => "Forigi la nunan kontakton",
"Drop photo to upload" => "Demeti foton por alŝuti",
"<h3>You have no contacts in your addressbook.</h3><p>Add a new contact or import existing contacts from a VCF file.</p>" => "<h3>Vi havas neniun kontakton en via adresaro.</h3><p>Aldonu novan kontakton aŭ enporti ekzistantajn kontaktojn el VCF-dosiero.</p>",
"Add contact" => "Aldoni kontakton",
"Compose mail" => "Redakti retpoŝtomesaĝon",
"Delete group" => "Forigi grupon",
"Delete current photo" => "Forigi nunan foton",
"Edit current photo" => "Redakti nunan foton",
"Upload new photo" => "Alŝuti novan foton",
"Select photo from ownCloud" => "Elekti foton el ownCloud",
"Edit name details" => "Redakti detalojn de nomo",
"Organization" => "Organizaĵo",
"First name" => "Persona nomo",
"Additional names" => "Pliaj nomoj",
"Last name" => "Familia nomo",
"Nickname" => "Kromnomo",
"Enter nickname" => "Enigu kromnomon",
"Web site" => "TTT-ejo",
"http://www.somesite.com" => "http://www.iuejo.com",
"Go to web site" => "Iri al TTT-ejon",
"dd-mm-yyyy" => "yyyy-mm-dd",
"Groups" => "Grupoj",
"Separate groups with commas" => "Disigi grupojn per komoj",
"Edit groups" => "Redakti grupojn",
"Preferred" => "Preferata",
"Please specify a valid email address." => "Bonvolu specifi validan retpoŝtadreson.",
"Enter email address" => "Enigi retpoŝtadreson",
"Mail to address" => "Retpoŝtmesaĝo al adreso",
"Delete email address" => "Forigi retpoŝþadreson",
"Enter phone number" => "Enigi telefonnumeron",
"Delete phone number" => "Forigi telefonnumeron",
"Instant Messenger" => "Tujmesaĝilo",
"View on map" => "Vidi en mapo",
"Edit address details" => "Redakti detalojn de adreso",
"Add notes here." => "Aldoni notojn ĉi tie.",
"Add field" => "Aldoni kampon",
"Title" => "Titolo",
"Organization" => "Organizaĵo",
"Birthday" => "Naskiĝotago",
"Notes go here..." => "Notoj iras tie ĉi...",
"Add" => "Aldoni",
"Phone" => "Telefono",
"Email" => "Retpoŝtadreso",
"Instant Messaging" => "Tujmesaĝado",
"Address" => "Adreso",
"Note" => "Noto",
"Download contact" => "Elŝuti kontakton",
"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",
"Mail to address" => "Retpoŝtmesaĝo al adreso",
"Delete email address" => "Forigi retpoŝþadreson",
"Enter phone number" => "Enigi telefonnumeron",
"Delete phone number" => "Forigi telefonnumeron",
"Go to web site" => "Iri al TTT-ejon",
"Delete URL" => "Forigi URL-on",
"View on map" => "Vidi en mapo",
"Delete address" => "Forigi adreson",
"1 Main Street" => "1 Ĉefa Strato",
"Street address" => "Stratadreso",
"12345" => "12345",
"Postal code" => "Poŝtkodo",
"Your city" => "Via urbo",
"City" => "Urbo",
"Some region" => "Iu regiono",
"Your country" => "Via lando",
"Country" => "Lando",
"Instant Messenger" => "Tujmesaĝilo",
"Delete IM" => "Forigi tujmesaĝadon",
"Share" => "Kunhavigi",
"Export" => "Elporti",
"Add Contact" => "Aldoni kontakton",
"Drop photo to upload" => "Demeti foton por alŝuti",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Propra formo, Mallonga nomo, Longa nomo, Inversa aŭ Inversa kun komo",
"Edit name details" => "Redakti detalojn de nomo",
"http://www.somesite.com" => "http://www.iuejo.com",
"dd-mm-yyyy" => "yyyy-mm-dd",
"Separate groups with commas" => "Disigi grupojn per komoj",
"Edit groups" => "Redakti grupojn",
"Enter email address" => "Enigi retpoŝtadreson",
"Edit address details" => "Redakti detalojn de adreso",
"Add notes here." => "Aldoni notojn ĉi tie.",
"Add field" => "Aldoni kampon",
"Download contact" => "Elŝuti kontakton",
"The temporary image has been removed from cache." => "La provizora bildo estas forigita de la kaŝmemoro.",
"Edit address" => "Redakti adreson",
"Type" => "Tipo",
"PO Box" => "Abonkesto",
"Street address" => "Stratadreso",
"Street and number" => "Strato kaj numero",
"Extended" => "Etendita",
"Apartment number etc." => "Apartamenta numero, ktp.",
"City" => "Urbo",
"Region" => "Regiono",
"E.g. state or province" => "Ekz.: subŝtato aŭ provinco",
"Zipcode" => "Poŝtokodo",
"Postal code" => "Poŝtkodo",
"Country" => "Lando",
"Addressbook" => "Adresaro",
"Hon. prefixes" => "Honoraj antaŭmetaĵoj",
"Miss" => "f-ino",
@ -213,7 +247,6 @@
"Mrs" => "s-ino",
"Dr" => "d-ro",
"Given name" => "Persona nomo",
"Additional names" => "Pliaj nomoj",
"Family name" => "Familia nomo",
"Hon. suffixes" => "Honoraj postmetaĵoj",
"Import a contacts file" => "Enporti kontaktodosieron",
@ -221,15 +254,12 @@
"create a new addressbook" => "krei novan adresaron",
"Name of new addressbook" => "Nomo de nova adresaro",
"Importing contacts" => "Enportante kontaktojn",
"Add contact" => "Aldoni kontakton",
"Select Address Books" => "Elektu adresarojn",
"Enter description" => "Enigu priskribon",
"CardDAV syncing addresses" => "adresoj por CardDAV-sinkronigo",
"more info" => "pli da informo",
"Primary address (Kontact et al)" => "Ĉefa adreso (por Kontakt kaj aliaj)",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "Adresaroj",
"Share" => "Kunhavigi",
"New Address Book" => "Nova adresaro",
"Name" => "Nomo",
"Description" => "Priskribo",

View File

@ -2,24 +2,24 @@
"Error (de)activating addressbook." => "Error al (des)activar libreta de direcciones.",
"id is not set." => "no se ha puesto ninguna ID.",
"Cannot update addressbook with an empty name." => "No se puede actualizar una libreta de direcciones sin nombre.",
"No category name given." => "No se a dado un nombre a la categoría.",
"Error adding group." => "Error al añadir el grupo",
"Group ID missing from request." => "ID de grupo faltante en la solicitud",
"Contact ID missing from request." => "ID de contacto faltante en la solicitud",
"No ID provided" => "No se ha proporcionado una ID",
"Error setting checksum." => "Error al establecer la suma de verificación.",
"No categories selected for deletion." => "No se seleccionaron categorías para borrar.",
"No address books found." => "No se encontraron libretas de direcciones.",
"No contacts found." => "No se encontraron contactos.",
"element name is not set." => "no se ha puesto ningún nombre de elemento.",
"Could not parse contact: " => "No puedo pasar el contacto",
"Cannot add empty property." => "No se puede añadir una propiedad vacía.",
"At least one of the address fields has to be filled out." => "Al menos uno de los campos de direcciones se tiene que rellenar.",
"Trying to add duplicate property: " => "Intentando añadir una propiedad duplicada: ",
"Missing IM parameter." => "Falta un parámetro del MI.",
"Unknown IM: " => "MI desconocido:",
"Information about vCard is incorrect. Please reload the page." => "La información sobre el vCard es incorrecta. Por favor vuelve a cargar la página.",
"Missing ID" => "Falta la ID",
"Error parsing VCard for ID: \"" => "Error al analizar el VCard para la ID: \"",
"checksum is not set." => "no se ha puesto ninguna suma de comprobación.",
"Information about vCard is incorrect. Please reload the page." => "La información sobre el vCard es incorrecta. Por favor vuelve a cargar la página.",
"Couldn't find vCard for %d." => "No se pudo encontra la vCard para %d",
"Information about vCard is incorrect. Please reload the page: " => "La información sobre la vCard es incorrecta. Por favor, recarga la página:",
"Something went FUBAR. " => "Plof. Algo ha fallado.",
"Cannot save property of type \"%s\" as array" => "No se puede guardar la propiedad del tipo \"%s\" como un arreglo",
"Missing IM parameter." => "Falta un parámetro del MI.",
"Unknown IM: " => "MI desconocido:",
"No contact ID was submitted." => "No se ha mandado ninguna ID de contacto.",
"Error reading contact photo." => "Error leyendo fotografía del contacto.",
"Error saving temporary file." => "Error al guardar archivo temporal.",
@ -35,6 +35,9 @@
"Error cropping image" => "Fallo al cortar el tamaño de la foto",
"Error creating temporary image" => "Fallo al crear la foto temporal",
"Error finding image: " => "Fallo al encontrar la imagen",
"Key is not set for: " => "Clave no establecida para:",
"Value is not set for: " => "Valor no establecido para:",
"Could not set preference: " => "No se pudo establecer la preferencia:",
"Error uploading contacts to storage." => "Error al subir contactos al almacenamiento.",
"There is no error, the file uploaded with success" => "No hay ningún error, el archivo se ha subido con éxito",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "El archivo subido sobrepasa la directiva upload_max_filesize de php.ini",
@ -46,43 +49,52 @@
"Couldn't load temporary image: " => "Fallo no pudo cargara de una imagen temporal",
"No file was uploaded. Unknown error" => "Fallo no se subió el fichero",
"Contacts" => "Contactos",
"Sorry, this functionality has not been implemented yet" => "Perdón esta función no esta aún implementada",
"Not implemented" => "No esta implementada",
"Couldn't get a valid address." => "Fallo : no hay dirección valida",
"Error" => "Fallo",
"Please enter an email address." => "Por favor introduzca una dirección de e-mail",
"Enter name" => "Introducir nombre",
"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",
"Select type" => "Selecciona el tipo",
"Contact is already in this group." => "El contacto ya se encuentra en este grupo.",
"Contacts are already in this group." => "Los contactos ya se encuentran es este grupo.",
"Couldn't get contact list." => "No se pudo obtener la lista de contactos.",
"Contact is not in this group." => "El contacto no se encuentra en este grupo.",
"Contacts are not in this group." => "Los contactos no se encuentran en este grupo.",
"A group named {group} already exists" => "Un grupo llamado {group} ya existe.",
"You can drag groups to\narrange them as you like." => "Puede arrastrar grupos para\narreglarlos como usted quiera.",
"All" => "Todos",
"Favorites" => "Favoritos",
"Shared by {owner}" => "Compartido por {owner}",
"Indexing contacts" => "Indexando contactos",
"Add to..." => "Añadir a...",
"Remove from..." => "Remover de...",
"Add group..." => "Añadir grupo...",
"Select photo" => "eccionar una foto",
"You do not have permission to add contacts to " => "No tiene permisos para añadir contactos a",
"Please select one of your own address books." => "Por favor, selecciona una de sus libretas de direcciones.",
"Permission error" => "Error de permisos",
"Click to undo deletion of \"" => "Click para deshacer el borrado de \"",
"Cancelled deletion of: \"" => "Cancelado el borrado de: \"",
"This property has to be non-empty." => "Este campo no puede estar vacío.",
"Couldn't serialize elements." => "Fallo no podido ordenar los elementos",
"Unknown error. Please check logs." => "Error desconocido. Por favor revise el log.",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "La propiedad de \"borrar\" se llamado sin argumentos envia fallos a\nbugs.owncloud.org",
"Edit name" => "Edita el Nombre",
"No files selected for upload." => "No hay ficheros seleccionados para subir",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "El fichero que quieres subir excede el tamaño máximo permitido en este servidor.",
"Error loading profile picture." => "Error cargando la imagen del perfil.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Algunos contactos están marcados para su eliminación, pero no eliminados todavía. Por favor, espere a que sean eliminados.",
"Do you want to merge these address books?" => "¿Quieres mezclar estas libretas de direcciones?",
"Shared by " => "compartido por",
"Upload too large" => "bida demasido grande",
"Only image files can be used as profile picture." => "Solamente archivos de imagen pueden ser usados como imagen del perfil ",
"Wrong file type" => "Tipo de archivo incorrecto",
"Your browser doesn't support AJAX upload. Please click on the profile picture to select a photo to upload." => "Su explorador no soporta subidas AJAX. Por favor haga click en la imagen del perfil para seleccionar una foto para subir.",
"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",
"Pending" => "Pendientes",
"Import done" => "Importación realizada",
"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",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "El fichero que quieres subir excede el tamaño máximo permitido en este servidor.",
"Upload too large" => "bida demasido grande",
"Pending" => "Pendientes",
"Add group" => "Añadir grupo",
"No files selected for upload." => "No hay ficheros seleccionados para subir",
"Edit profile picture" => "Editar imagen de perfil.",
"Error loading profile picture." => "Error cargando la imagen del perfil.",
"Enter name" => "Introducir nombre",
"Enter description" => "Introducir descripción",
"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",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Algunos contactos están marcados para su eliminación, pero no eliminados todavía. Por favor, espere a que sean eliminados.",
"Click to undo deletion of {num} contacts" => "Pulse para deshacer la eliminación de {num} contactos",
"Cancelled deletion of {num}" => "La eliminación de {num} fue cancelada",
"Result: " => "Resultado :",
" imported, " => "Importado.",
" failed." => "Fallo.",
@ -100,9 +112,6 @@
"There was an error updating the addressbook." => "Hubo un error actualizando la libreta de direcciones.",
"You do not have the permissions to delete this addressbook." => "No tienes permisos para eliminar esta libreta de direcciones.",
"There was an error deleting this addressbook." => "Hubo un error eliminando esta libreta de direcciones.",
"Addressbook not found: " => "Libreta de direcciones no encontrada:",
"This is not your addressbook." => "Esta no es tu agenda de contactos.",
"Contact could not be found." => "No se ha podido encontrar el contacto.",
"Jabber" => "Jabber",
"AIM" => "AIM",
"MSN" => "MSN",
@ -126,19 +135,9 @@
"Video" => "Vídeo",
"Pager" => "Localizador",
"Internet" => "Internet",
"Birthday" => "Cumpleaños",
"Business" => "Negocio",
"Call" => "Llamada",
"Clients" => "Clientes",
"Deliverer" => "Mensajero",
"Holidays" => "Vacaciones",
"Ideas" => "Ideas",
"Journey" => "Jornada",
"Jubilee" => "Aniversario",
"Meeting" => "Reunión",
"Personal" => "Personal",
"Projects" => "Proyectos",
"Questions" => "Preguntas",
"Friends" => "Amigos",
"Family" => "Familia",
"There was an error deleting properties for this contact." => "Hubo un error al eliminar las propiedades de este contacto.",
"{name}'s Birthday" => "Cumpleaños de {name}",
"Contact" => "Contacto",
"You do not have the permissions to add contacts to this addressbook." => "No tiene permisos para añadir contactos a esta libreta de direcciones.",
@ -148,15 +147,27 @@
"Could not find the Addressbook with ID: " => "No se puede encontrar la libreta de direcciones con ID:",
"You do not have the permissions to delete this contact." => "No tiene permisos para eliminar este contacto.",
"There was an error deleting this contact." => "Hubo un error eliminando este contacto.",
"Add Contact" => "Añadir contacto",
"Import" => "Importar",
"Contact not found." => "Contacto no encontrado.",
"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",
"Groups" => "Grupos",
"Favorite" => "Favorito",
"Delete Contact" => "Eliminar contacto",
"Close" => "Cierra.",
"Keyboard shortcuts" => "Atajos de teclado",
"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",
@ -164,56 +175,83 @@
"Add new contact" => "Añadir un nuevo contacto",
"Add new addressbook" => "Añadir nueva libreta de direcciones",
"Delete current contact" => "Eliminar contacto actual",
"Drop photo to upload" => "Suelta una foto para subirla",
"<h3>You have no contacts in your addressbook.</h3><p>Add a new contact or import existing contacts from a VCF file.</p>" => "<h3>No tiene ningún contacto.</h3><p>Agregue uno nuevo or importe contactos existentes de un archivo VCF.</p>",
"Add contact" => "Añadir contacto",
"Compose mail" => "Redactar mensaje",
"Delete group" => "Eliminar grupo",
"Delete current photo" => "Eliminar fotografía actual",
"Edit current photo" => "Editar fotografía actual",
"Upload new photo" => "Subir nueva fotografía",
"Select photo from ownCloud" => "Seleccionar fotografía desde ownCloud",
"Edit name details" => "Editar los detalles del nombre",
"Organization" => "Organización",
"First name" => "Nombre",
"Additional names" => "Nombres adicionales",
"Last name" => "Apellido",
"Nickname" => "Alias",
"Enter nickname" => "Introduce un alias",
"Web site" => "Sitio Web",
"http://www.somesite.com" => "http://www.unsitio.com",
"Go to web site" => "Ir al sitio Web",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Groups" => "Grupos",
"Separate groups with commas" => "Separa los grupos con comas",
"Edit groups" => "Editar grupos",
"Preferred" => "Preferido",
"Please specify a valid email address." => "Por favor especifica una dirección de correo electrónico válida.",
"Enter email address" => "Introduce una dirección de correo electrónico",
"Mail to address" => "Enviar por correo a la dirección",
"Delete email address" => "Eliminar dirección de correo electrónico",
"Enter phone number" => "Introduce un número de teléfono",
"Delete phone number" => "Eliminar número de teléfono",
"Instant Messenger" => "Mensajero instantáneo",
"Delete IM" => "Eliminar IM",
"View on map" => "Ver en el mapa",
"Edit address details" => "Editar detalles de la dirección",
"Add notes here." => "Añade notas aquí.",
"Add field" => "Añadir campo",
"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",
"Instant Messaging" => "Mensajería instantánea",
"Address" => "Dirección",
"Note" => "Nota",
"Download contact" => "Descargar contacto",
"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",
"Mail to address" => "Enviar por correo a la dirección",
"Delete email address" => "Eliminar dirección de correo electrónico",
"Enter phone number" => "Introduce un número de teléfono",
"Delete phone number" => "Eliminar número de teléfono",
"Go to web site" => "Ir al sitio Web",
"Delete URL" => "Eliminar URL",
"View on map" => "Ver en el mapa",
"Delete address" => "Eliminar dirección",
"1 Main Street" => "1 Calle Principal",
"Street address" => "Calle",
"12345" => "12345",
"Postal code" => "Código postal",
"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",
"Edit name details" => "Editar los detalles del nombre",
"http://www.somesite.com" => "http://www.unsitio.com",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Separate groups with commas" => "Separa los grupos con comas",
"Edit groups" => "Editar grupos",
"Enter email address" => "Introduce una dirección de correo electrónico",
"Edit address details" => "Editar detalles de la dirección",
"Add notes here." => "Añade notas aquí.",
"Add field" => "Añadir campo",
"Download contact" => "Descargar contacto",
"The temporary image has been removed from cache." => "La foto temporal se ha borrado del cache.",
"Edit address" => "Editar dirección",
"Type" => "Tipo",
"PO Box" => "Código postal",
"Street address" => "Calle",
"Street and number" => "Calle y número",
"Extended" => "Extendido",
"Apartment number etc." => "Número del apartamento, etc.",
"City" => "Ciudad",
"Region" => "Región",
"E.g. state or province" => "Ej: región o provincia",
"Zipcode" => "Código postal",
"Postal code" => "Código postal",
"Country" => "País",
"Addressbook" => "Libreta de direcciones",
"Hon. prefixes" => "Prefijos honoríficos",
"Miss" => "Srta",
@ -223,7 +261,6 @@
"Mrs" => "Sra",
"Dr" => "Dr",
"Given name" => "Nombre",
"Additional names" => "Nombres adicionales",
"Family name" => "Apellido",
"Hon. suffixes" => "Sufijos honoríficos",
"J.D." => "J.D.",
@ -240,15 +277,12 @@
"Name of new addressbook" => "Nombre de la nueva agenda",
"Importing contacts" => "Importando contactos",
"<h3>You have no contacts in your addressbook.</h3><p>You can import VCF files by dragging them to the contacts list and either drop them on an addressbook to import into it, or on an empty spot to create a new addressbook and import into that.<br />You can also import by clicking on the import button at the bottom of the list.</p>" => "<h3>No tiene contactos en su libreta de direcciones.</h3><p>Puede importar archivos VCF arrastrándolos a la lista de contactos y soltándolos en una libreta de direcciones, o sobre un espacio vacío para crear una nueva libreta de direcciones e importar dentro de ésta.<br />Tambien puede realizar la importación haciendo clic en el botón de importar en la parte inferior de la lista.</p>",
"Add contact" => "Añadir contacto",
"Select Address Books" => "Seleccionar Agenda",
"Enter description" => "Introducir descripción",
"CardDAV syncing addresses" => "Sincronizando direcciones",
"more info" => "más información",
"Primary address (Kontact et al)" => "Dirección primaria (Kontact et al)",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "Libretas de direcciones",
"Share" => "Compartir",
"New Address Book" => "Nueva libreta de direcciones",
"Name" => "Nombre",
"Description" => "Descripción",

View File

@ -1,25 +1,25 @@
<?php $TRANSLATIONS = array(
"Error (de)activating addressbook." => "Error al (des)activar la agenda con direcciones.",
"Error (de)activating addressbook." => "Error al (des)activar la agenda.",
"id is not set." => "La ID no fue asignada.",
"Cannot update addressbook with an empty name." => "No se puede actualizar una libreta de direcciones sin nombre.",
"No category name given." => "No se a dado un nombre a la categoría.",
"Error adding group." => "Error al añadir grupo",
"Group ID missing from request." => "ID de grupo faltante en la solicitud.",
"Contact ID missing from request." => "ID de contacto faltante en la solicitud.",
"No ID provided" => "No fue proporcionada una ID",
"Error setting checksum." => "Error al establecer la suma de verificación -checksum-.",
"No categories selected for deletion." => "No se seleccionaron categorías para borrar.",
"No address books found." => "No se encontraron agendas.",
"No contacts found." => "No se encontraron contactos.",
"element name is not set." => "el nombre del elemento no fue asignado.",
"Could not parse contact: " => "No fue posible analizar la sintaxis del contacto",
"Cannot add empty property." => "No se puede añadir una propiedad vacía.",
"At least one of the address fields has to be filled out." => "Se tiene que rellenar al menos uno de los campos de direcciones.",
"Trying to add duplicate property: " => "Estás intentando añadir una propiedad duplicada: ",
"Missing IM parameter." => "Falta un parámetro del MI.",
"Unknown IM: " => "MI desconocido:",
"Information about vCard is incorrect. Please reload the page." => "La información sobre la vCard es incorrecta. Por favor, cargá nuevamente la página",
"Missing ID" => "Falta la ID",
"Error parsing VCard for ID: \"" => "Error al analizar la vCard para la ID: \"",
"checksum is not set." => "la suma de comprobación no fue asignada.",
"Information about vCard is incorrect. Please reload the page." => "La información sobre la vCard es incorrecta. Por favor, cargá nuevamente la página",
"Couldn't find vCard for %d." => "No se pudo encontrar vCard para %d",
"Information about vCard is incorrect. Please reload the page: " => "La información sobre la vCard es incorrecta. Por favor, recargá la página:",
"Something went FUBAR. " => "Hubo un error irreparable.",
"Cannot save property of type \"%s\" as array" => "No se puede guardar la propiedad del tipo \"%s\" como un arreglo",
"Missing IM parameter." => "Falta un parámetro del MI.",
"Unknown IM: " => "MI desconocido:",
"No contact ID was submitted." => "No se mandó ninguna ID de contacto.",
"Error reading contact photo." => "Error leyendo la imagen del contacto.",
"Error saving temporary file." => "Error al guardar archivo temporal.",
@ -35,6 +35,9 @@
"Error cropping image" => "Error al recortar la imagen",
"Error creating temporary image" => "Error al crear una imagen temporal",
"Error finding image: " => "Error al encontrar la imagen",
"Key is not set for: " => "La clave no esta asignada para:",
"Value is not set for: " => "El valor no esta asignado para:",
"Could not set preference: " => "No se pudo asignar la preferencia:",
"Error uploading contacts to storage." => "Error al subir contactos al almacenamiento.",
"There is no error, the file uploaded with success" => "No hay errores, el archivo fue subido con éxito",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "El archivo subido excede el valor 'upload_max_filesize' del archivo de configuración php.ini",
@ -46,43 +49,52 @@
"Couldn't load temporary image: " => "No se pudo cargar la imagen temporal",
"No file was uploaded. Unknown error" => "El archivo no fue subido. Error desconocido",
"Contacts" => "Contactos",
"Sorry, this functionality has not been implemented yet" => "Perdoná, esta función no está implementada todavía",
"Not implemented" => "No implementado",
"Couldn't get a valid address." => "No fue posible obtener una dirección válida",
"Error" => "Error",
"Please enter an email address." => "Por favor, escribí una dirección de e-mail",
"Enter name" => "Escribir nombre",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formato personalizado, nombre abreviado, nombre completo, invertido, o invertido con coma",
"Select type" => "Seleccionar el tipo",
"Contact is already in this group." => "El contacto ya se encuentra en este grupo",
"Contacts are already in this group." => "Los contactos ya se encuentran en este grupo",
"Couldn't get contact list." => "No se pudo obtener la lista de contactos.",
"Contact is not in this group." => "El contacto no se encuentra en este grupo.",
"Contacts are not in this group." => "Los contactos ya se encuentran en este grupo. ",
"A group named {group} already exists" => "Un grupo llamado {grup} ya existe",
"You can drag groups to\narrange them as you like." => "Podés arrastrar los grupos para \narreglarlos como quieras.",
"All" => "Todos",
"Favorites" => "Favoritos",
"Shared by {owner}" => "Compartidos por {owner}",
"Indexing contacts" => "Indexando contactos",
"Add to..." => "Añadir a...",
"Remove from..." => "Borrar de...",
"Add group..." => "Añadir grupo",
"Select photo" => "Seleccionar una imagen",
"You do not have permission to add contacts to " => "No tenés permisos para añadir contactos a",
"Please select one of your own address books." => "Por favor, elegí una de tus agendas.",
"Permission error" => "Error de permisos",
"Click to undo deletion of \"" => "Hacé click para deshacer el borrado de \"",
"Cancelled deletion of: \"" => "Se canceló el borrado de: \"",
"This property has to be non-empty." => "Este campo no puede quedar vacío.",
"Couldn't serialize elements." => "No fue posible transcribir los elementos",
"Unknown error. Please check logs." => "Error desconocido. Revisá el log.",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "el método \"deleteProperty\" fue llamado sin argumentos. Por favor, reportá el error en bugs.owncloud.org",
"Edit name" => "Editar el nombre",
"No files selected for upload." => "No hay archivos seleccionados para subir",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "El archivo que querés subir supera el tamaño máximo permitido en este servidor.",
"Error loading profile picture." => "Error al cargar la imagen del perfil.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Algunos contactos fuero marcados para ser borrados, pero no fueron borrados todavía. Esperá que lo sean.",
"Do you want to merge these address books?" => "¿Querés unir estas libretas de direcciones?",
"Shared by " => "compartido por",
"Upload too large" => "El tamaño del archivo que querés subir es demasiado grande",
"Only image files can be used as profile picture." => "Solamente archivos de imagen pueden ser usados como imagen del perfil ",
"Wrong file type" => "Tipo de archivo incorrecto",
"Your browser doesn't support AJAX upload. Please click on the profile picture to select a photo to upload." => "Tu navegador no soporta subidas AJAX. Por favor hacé click en la imagen del perfil para seleccionar una imagen que quieras subir.",
"Unable to upload your file as it is a directory or has 0 bytes" => "No es posible subir tu archivo porque es un directorio o porque ocupa 0 bytes",
"Upload Error" => "Error al subir",
"Pending" => "Pendientes",
"Import done" => "Importación completada",
"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 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. Haga click para cancerla la recarga. ",
"Add address book" => "Añadir agenda",
"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",
"Importing from {filename}..." => "Importando de {filename}...",
"{success} imported, {failed} failed." => "{success} importados, {failed} fallidos.",
"Importing..." => "Importando...",
"The address book name cannot be empty." => "El nombre de la libreta de direcciones no puede estar vacío.",
"Unable to upload your file as it is a directory or has 0 bytes" => "No fue posible subir el archivo porque es un directorio o porque su tamaño es 0 bytes",
"Upload Error" => "Error al subir",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "El archivo que querés subir supera el tamaño máximo permitido en este servidor.",
"Upload too large" => "El tamaño del archivo que querés subir es demasiado grande",
"Pending" => "Pendientes",
"Add group" => "Agregar grupo",
"No files selected for upload." => "No hay archivos seleccionados para subir",
"Edit profile picture" => "Editar foto de perfil",
"Error loading profile picture." => "Error al cargar la imagen del perfil.",
"Enter name" => "Escribir nombre",
"Enter description" => "Escribir descripción",
"Select addressbook" => "Seleccionar agenda",
"The address book name cannot be empty." => "El nombre de la agenda no puede estar vacío.",
"Is this correct?" => "¿Es esto correcto?",
"There was an unknown error when trying to delete this contact" => "Hubo un error desconocido tratando de borrar este contacto",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Algunos contactos fuero marcados para ser borrados, pero no fueron borrados todavía. Esperá que lo sean.",
"Click to undo deletion of {num} contacts" => "Click para deshacer el borrado de {num} contactos",
"Cancelled deletion of {num}" => "Cancelado el borrado de {num}",
"Result: " => "Resultado:",
" imported, " => "Importado.",
" failed." => "error.",
@ -100,9 +112,6 @@
"There was an error updating the addressbook." => "Hubo un error mientras se actualizaba la agenda.",
"You do not have the permissions to delete this addressbook." => "No tenés permisos para borrar esta agenda.",
"There was an error deleting this addressbook." => "Hubo un error mientras se borraba esta agenda.",
"Addressbook not found: " => "La agenda no fue encontrada",
"This is not your addressbook." => "Esta no es tu agenda de contactos.",
"Contact could not be found." => "No fue posible encontrar el contacto.",
"Jabber" => "Jabber",
"AIM" => "AIM",
"MSN" => "MSN",
@ -126,19 +135,9 @@
"Video" => "Video",
"Pager" => "Pager",
"Internet" => "Internet",
"Birthday" => "Cumpleaños",
"Business" => "Negocio",
"Call" => "Llamar",
"Clients" => "Clientes",
"Deliverer" => "Distribuidor",
"Holidays" => "Vacaciones",
"Ideas" => "Ideas",
"Journey" => "Viaje",
"Jubilee" => "Aniversario",
"Meeting" => "Reunión",
"Personal" => "Personal",
"Projects" => "Proyectos",
"Questions" => "Preguntas",
"Friends" => "Amigos",
"Family" => "Familia",
"There was an error deleting properties for this contact." => "Hubo un error al borrar las propiedades de este contacto",
"{name}'s Birthday" => "Cumpleaños de {name}",
"Contact" => "Contacto",
"You do not have the permissions to add contacts to this addressbook." => "No tenés permisos para agregar contactos a esta agenda.",
@ -148,9 +147,21 @@
"Could not find the Addressbook with ID: " => "No fue posible encontrar la agenda con ID:",
"You do not have the permissions to delete this contact." => "No tenés permisos para borrar este contacto.",
"There was an error deleting this contact." => "Hubo un error mientras se borraba este contacto.",
"Add Contact" => "Agregar contacto",
"Import" => "Importar",
"Contact not found." => "No se pudo encontrar el contacto",
"HomePage" => "Pagina de inicio",
"New Group" => "Nuevo grupo",
"Settings" => "Configuración",
"Address books" => "Agendas",
"Import" => "Importar",
"Select files to import" => "Seleccionar archivos para importar",
"Select files" => "Seleccionar archivos",
"Import into:" => "Importar a:",
"OK" => "Aceptar",
"(De-)select all" => "(De)selecionar todos",
"New Contact" => "Nuevo contato",
"Groups" => "Grupos",
"Favorite" => "Favorito",
"Delete Contact" => "Borrar contacto",
"Close" => "cerrar",
"Keyboard shortcuts" => "Atajos de teclado",
"Navigation" => "Navegación",
@ -164,56 +175,83 @@
"Add new contact" => "Agregar un nuevo contacto",
"Add new addressbook" => "Agregar nueva agenda",
"Delete current contact" => "Borrar el contacto seleccionado",
"Drop photo to upload" => "Arrastrá y soltá una imagen para subirla",
"<h3>You have no contacts in your addressbook.</h3><p>Add a new contact or import existing contacts from a VCF file.</p>" => "<h3> No tenes contactos en tu agenda.</h3><p>Agregá un nuevo contacto o importalo desde un contacto existente en un archivo VCF.</p>",
"Add contact" => "Agregar contacto",
"Compose mail" => "Escribir un correo",
"Delete group" => "Borrar grupo",
"Delete current photo" => "Eliminar imagen actual",
"Edit current photo" => "Editar imagen actual",
"Upload new photo" => "Subir nueva imagen",
"Select photo from ownCloud" => "Seleccionar imagen desde ownCloud",
"Edit name details" => "Editar los detalles del nombre",
"Organization" => "Organización",
"First name" => "Nombre",
"Additional names" => "Segundo nombre",
"Last name" => "Apellido",
"Nickname" => "Sobrenombre",
"Enter nickname" => "Escribí un sobrenombre",
"Web site" => "Página web",
"http://www.somesite.com" => "http://www.somesite.com",
"Go to web site" => "Ir al sitio web",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Groups" => "Grupos",
"Separate groups with commas" => "Separá los grupos con comas",
"Edit groups" => "Editar grupos",
"Preferred" => "Preferido",
"Please specify a valid email address." => "Por favor, escribí una dirección de e-mail válida.",
"Enter email address" => "Escribí una dirección de correo electrónico",
"Mail to address" => "Enviar por e-mail a la dirección",
"Delete email address" => "Eliminar dirección de correo electrónico",
"Enter phone number" => "Escribí un número de teléfono",
"Delete phone number" => "Eliminar número de teléfono",
"Instant Messenger" => "Mensajero instantáneo",
"Delete IM" => "Eliminar IM",
"View on map" => "Ver en el mapa",
"Edit address details" => "Editar detalles de la dirección",
"Add notes here." => "Agregá notas acá.",
"Add field" => "Agregar campo",
"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" => "e-mail",
"Email" => "Correo Electrónico",
"Instant Messaging" => "Mensajería instantánea",
"Address" => "Dirección",
"Note" => "Nota",
"Download contact" => "Descargar contacto",
"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",
"Mail to address" => "Enviar por correo electrónico a la dirección",
"Delete email address" => "Eliminar dirección de correo electrónico",
"Enter phone number" => "Escribí un número de teléfono",
"Delete phone number" => "Eliminar número de teléfono",
"Go to web site" => "Ir al sitio web",
"Delete URL" => "Borrar URL",
"View on map" => "Ver en el mapa",
"Delete address" => "Borrar dirección",
"1 Main Street" => "Calle principal 1",
"Street address" => "Calle de la dirección",
"12345" => "12345",
"Postal code" => "Código postal",
"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",
"Delete IM" => "Eliminar IM",
"Share" => "Compartir",
"Export" => "Exportar",
"CardDAV link" => "Enlace a CardDAV",
"Add Contact" => "Agregar contacto",
"Drop photo to upload" => "Arrastrá y soltá una imagen para subirla",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formato personalizado, nombre abreviado, nombre completo, invertido, o invertido con coma",
"Edit name details" => "Editar los detalles del nombre",
"http://www.somesite.com" => "http://www.somesite.com",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Separate groups with commas" => "Separá los grupos con comas",
"Edit groups" => "Editar grupos",
"Enter email address" => "Escribí una dirección de correo electrónico",
"Edit address details" => "Editar detalles de la dirección",
"Add notes here." => "Agregá notas acá.",
"Add field" => "Agregar campo",
"Download contact" => "Descargar contacto",
"The temporary image has been removed from cache." => "La imagen temporal fue borrada de la caché",
"Edit address" => "Editar dirección",
"Type" => "Tipo",
"PO Box" => "Código postal",
"Street address" => "Calle de la dirección",
"Street and number" => "Calle y número",
"Extended" => "Extendido",
"Apartment number etc." => "Número de departamento, etc.",
"City" => "Ciudad",
"Region" => "Provincia",
"E.g. state or province" => "Eg. provincia o estado",
"Zipcode" => "Código postal",
"Postal code" => "Código postal",
"Country" => "País",
"Addressbook" => "Agenda",
"Hon. prefixes" => "Prefijos honoríficos",
"Miss" => "Srta.",
@ -223,7 +261,6 @@
"Mrs" => "Sra.",
"Dr" => "Dr.",
"Given name" => "Nombre",
"Additional names" => "Segundo nombre",
"Family name" => "Apellido",
"Hon. suffixes" => "Sufijos honoríficos",
"J.D." => "J.D.",
@ -237,18 +274,15 @@
"Import a contacts file" => "Importar archivo de contactos",
"Please choose the addressbook" => "Elegí la agenda",
"create a new addressbook" => "crear una nueva agenda",
"Name of new addressbook" => "Nombre de la nueva agenda",
"Name of new addressbook" => "Nombre de la agenda nueva",
"Importing contacts" => "Importando contactos",
"<h3>You have no contacts in your addressbook.</h3><p>You can import VCF files by dragging them to the contacts list and either drop them on an addressbook to import into it, or on an empty spot to create a new addressbook and import into that.<br />You can also import by clicking on the import button at the bottom of the list.</p>" => "<h3>No tenés contactos en tu agenda.</h3><p> Podés importar archivos VCF arrastrando los contactos a la agenda.<br />También podés realizar la importación haciendo click en el botón de Importar, en la parte inferior de la lista.</p>",
"Add contact" => "Agregar contacto",
"Select Address Books" => "Seleccionar agendas",
"Enter description" => "Escribir descripción",
"CardDAV syncing addresses" => "CardDAV está sincronizando direcciones",
"more info" => "más información",
"Primary address (Kontact et al)" => "Dirección primaria (Kontact y semejantes)",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "Agendas",
"Share" => "Compartir",
"New Address Book" => "Nueva agenda",
"Name" => "Nombre",
"Description" => "Descripción",

View File

@ -2,24 +2,23 @@
"Error (de)activating addressbook." => "Viga aadressiraamatu (de)aktiveerimisel.",
"id is not set." => "ID on määramata.",
"Cannot update addressbook with an empty name." => "Tühja nimega aadressiraamatut ei saa uuendada.",
"No category name given." => "Kategooria nime pole sisestatud.",
"Error adding group." => "Viga grupi lisamisel.",
"Group ID missing from request." => "Päringust puudub Grupi ID.",
"Contact ID missing from request." => "Päringust puudub kontakti ID.",
"No ID provided" => "ID-d pole sisestatud",
"Error setting checksum." => "Viga kontrollsumma määramisel.",
"No categories selected for deletion." => "Kustutamiseks pole valitud ühtegi kategooriat.",
"No address books found." => "Ei leitud ühtegi aadressiraamatut.",
"No contacts found." => "Ühtegi kontakti ei leitud.",
"element name is not set." => "elemendi nime pole määratud.",
"Could not parse contact: " => "Kontakti parsimine ebaõnnestus: ",
"Cannot add empty property." => "Tühja omadust ei saa lisada.",
"At least one of the address fields has to be filled out." => "Vähemalt üks aadressiväljadest peab olema täidetud.",
"Trying to add duplicate property: " => "Proovitakse lisada topeltomadust: ",
"Missing IM parameter." => "Puuduv IM parameeter",
"Unknown IM: " => "Tundmatu IM:",
"Information about vCard is incorrect. Please reload the page." => "Visiitkaardi info pole korrektne. Palun lae leht uuesti.",
"Missing ID" => "Puudub ID",
"Error parsing VCard for ID: \"" => "Viga VCard-ist ID parsimisel: \"",
"checksum is not set." => "kontrollsummat pole määratud.",
"Information about vCard is incorrect. Please reload the page." => "Visiitkaardi info pole korrektne. Palun lae leht uuesti.",
"Couldn't find vCard for %d." => "%d visiitkaarti ei leitud.",
"Information about vCard is incorrect. Please reload the page: " => "vCard info pole korrektne. Palun lae lehekülg uuesti: ",
"Something went FUBAR. " => "Midagi läks tõsiselt metsa.",
"Missing IM parameter." => "Puuduv IM parameeter",
"Unknown IM: " => "Tundmatu IM:",
"No contact ID was submitted." => "Kontakti ID-d pole sisestatud.",
"Error reading contact photo." => "Viga kontakti foto lugemisel.",
"Error saving temporary file." => "Viga ajutise faili salvestamisel.",
@ -35,6 +34,9 @@
"Error cropping image" => "Viga pildi lõikamisel",
"Error creating temporary image" => "Viga ajutise pildi loomisel",
"Error finding image: " => "Viga pildi leidmisel: ",
"Key is not set for: " => "Võtit pole määratud:",
"Value is not set for: " => "Väärtust pole määratud:",
"Could not set preference: " => "Eelistust ei saa määrata:",
"Error uploading contacts to storage." => "Viga kontaktide üleslaadimisel kettale.",
"There is no error, the file uploaded with success" => "Ühtegi tõrget polnud, fail on üles laetud",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Üleslaetud fail ületab php.ini failis määratud upload_max_filesize suuruse",
@ -46,43 +48,46 @@
"Couldn't load temporary image: " => "Ajutise pildi laadimine ebaõnnestus: ",
"No file was uploaded. Unknown error" => "Ühtegi faili ei laetud üles. Tundmatu viga",
"Contacts" => "Kontaktid",
"Sorry, this functionality has not been implemented yet" => "Vabandust, aga see funktsioon pole veel valmis",
"Not implemented" => "Pole implementeeritud",
"Couldn't get a valid address." => "Kehtiva aadressi hankimine ebaõnnestus",
"Error" => "Viga",
"Please enter an email address." => "Palun sisesta e-posti aadress.",
"Enter name" => "Sisesta nimi",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Kohandatud vorming, Lühike nimi, Täielik nimi, vastupidine või vastupidine komadega",
"Select type" => "Vali tüüp",
"Contact is already in this group." => "Kontakt juba on selles grupis.",
"Contacts are already in this group." => "Kontaktid juba on selles grupis.",
"Couldn't get contact list." => "Kontaktide nimekirja hankimine ebaõnnestus.",
"Contact is not in this group." => "Kontakt pole selles grupis.",
"Contacts are not in this group." => "Kontaktid pole selles grupis.",
"A group named {group} already exists" => "Grupp nimega {group} on juba olemas",
"All" => "Kõik",
"Favorites" => "Lemmikud",
"Shared by {owner}" => "Jagas {owner}",
"Indexing contacts" => "Kontaktide indekseerimine",
"Add to..." => "Lisa...",
"Remove from..." => "Eemalda...",
"Add group..." => "Lisa gruppi...",
"Select photo" => "Vali foto",
"You do not have permission to add contacts to " => "Sul pole luba lisada kontakti aadressiraamatusse",
"Please select one of your own address books." => "Palun vali üks oma aadressiraamatutest.",
"Permission error" => "Õiguse viga",
"Click to undo deletion of \"" => "Kliki kustutamise tühistamiseks \"",
"Cancelled deletion of: \"" => "Kustutamine tühistati: \"",
"This property has to be non-empty." => "See omadus ei tohi olla tühi.",
"Couldn't serialize elements." => "Elemente ei saa sarjana esitleda.",
"Unknown error. Please check logs." => "Tundmatu viga. Palun kontrolli vealogisid.",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' kutsuti välja ilma tüübi argumendita. Palun teavita leitud veast aadressil bugs.owncloud.org",
"Edit name" => "Muuda nime",
"No files selected for upload." => "Üleslaadimiseks pole faile valitud.",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Fail , mida sa proovid üles laadida ületab sinu serveri poolt määratud maksimaalse üleslaadimise limiidi.",
"Error loading profile picture." => "Viga profiilipildi laadimisel",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Mõned kontaktid on märgitud kustutamiseks, aga pole veel kustutatud. Palun oota, kuni need kustutatakse.",
"Do you want to merge these address books?" => "Kas sa soovid liita neid aadressiraamatuid?",
"Shared by " => "Jagas",
"Upload too large" => "Üleslaadimine on liiga suur",
"Only image files can be used as profile picture." => "Profiilipildina saab kasutada ainult pilte.",
"Wrong file type" => "Vale failitüüp",
"Your browser doesn't support AJAX upload. Please click on the profile picture to select a photo to upload." => "Sinu veebilehitseja ei toeta AJAX-põhist üleslaadimist. Palun kliki profiili pildil, et valida üleslaetav foto.",
"Unable to upload your file as it is a directory or has 0 bytes" => "Faili ei saa üles laadida, kuna see on kaust või selle suurus on 0 baiti",
"Upload Error" => "Üleslaadimise viga",
"Pending" => "Ootel",
"Import done" => "Importimine on tehtud",
"Network or server error. Please inform administrator." => "Võrgu või serveri viga. Palun informeeri administraatorit.",
"Error adding to group." => "Viga gruppi lisamisel.",
"Error removing from group." => "Viga grupist eemaldamisel.",
"There was an error opening a mail composer." => "Meiliprogrammi avamisel tekkis viga.",
"Not all files uploaded. Retrying..." => "Kõiki faile ei laetud üles. Proovime uuesti...",
"Something went wrong with the upload, please retry." => "Midagi läks üleslaadimisega valesti, palun proovi uuesti.",
"Error" => "Viga",
"Importing..." => "Importimine...",
"Unable to upload your file as it is a directory or has 0 bytes" => "Faili ei saa üles laadida, kuna see on kaust või selle suurus on 0 baiti",
"Upload Error" => "Üleslaadimise viga",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Fail , mida sa proovid üles laadida ületab sinu serveri poolt määratud maksimaalse üleslaadimise limiidi.",
"Upload too large" => "Üleslaadimine on liiga suur",
"Pending" => "Ootel",
"Add group" => "Lisa grupp",
"No files selected for upload." => "Üleslaadimiseks pole faile valitud.",
"Edit profile picture" => "Muuda profiili pilti",
"Error loading profile picture." => "Viga profiilipildi laadimisel",
"Enter name" => "Sisesta nimi",
"Enter description" => "Sisesta kirjeldus",
"Select addressbook" => "Vali aadressiraamat",
"The address book name cannot be empty." => "Aadressiraamatu nimi ei saa olla tühi.",
"Is this correct?" => "Kas see on õige?",
"There was an unknown error when trying to delete this contact" => "Selle kontakti kustutamisel tekkis viga",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Mõned kontaktid on märgitud kustutamiseks, aga pole veel kustutatud. Palun oota, kuni need kustutatakse.",
"Click to undo deletion of {num} contacts" => "Kliki, et tühistada {num} kontakti kustutamine",
"Cancelled deletion of {num}" => "{num} kustutamine tühistati",
"Result: " => "Tulemus: ",
" imported, " => " imporditud, ",
" failed." => " ebaõnnestus.",
@ -100,9 +105,6 @@
"There was an error updating the addressbook." => "Aadressiraamatu uuendamisel tekkis viga.",
"You do not have the permissions to delete this addressbook." => "Sul pole õigusi selle aadressiraamatu kustutamiseks.",
"There was an error deleting this addressbook." => "Selle aadressiraamatu kustutamisel tekkis viga.",
"Addressbook not found: " => "Aadressiraamatut ei leitud:",
"This is not your addressbook." => "See pole sinu aadressiraamat.",
"Contact could not be found." => "Kontakti ei leitud.",
"Jabber" => "Jabber",
"AIM" => "AIM",
"MSN" => "MSN",
@ -126,19 +128,9 @@
"Video" => "Video",
"Pager" => "Piipar",
"Internet" => "Internet",
"Birthday" => "Sünnipäev",
"Business" => "Ettevõte",
"Call" => "Helista",
"Clients" => "Kliendid",
"Deliverer" => "Kohaletoimetaja",
"Holidays" => "Puhkused",
"Ideas" => "Ideed",
"Journey" => "Teekond",
"Jubilee" => "Juubel",
"Meeting" => "Kohtumine",
"Personal" => "Isiklik",
"Projects" => "Projektid",
"Questions" => "Küsimused",
"Friends" => "Sõbrad",
"Family" => "Pereliikmed",
"There was an error deleting properties for this contact." => "Selle kontakti omaduste kustutamisel tekkis viga.",
"{name}'s Birthday" => "{name} sünnipäev",
"Contact" => "Kontakt",
"You do not have the permissions to add contacts to this addressbook." => "Sul pole õigusi sellesse aadressiraamatusse kontaktide lisamiseks.",
@ -148,9 +140,18 @@
"Could not find the Addressbook with ID: " => "Ei leitud aadressiraamatut ID-ga:",
"You do not have the permissions to delete this contact." => "Sul pole selle kontakti kustutamiseks õigusi.",
"There was an error deleting this contact." => "Selle kontakti kustutamisel tekkis viga.",
"Add Contact" => "Lisa kontakt",
"Import" => "Impordi",
"Contact not found." => "Kontakti ei leitud.",
"HomePage" => "Koduleht",
"New Group" => "Uus grupp",
"Settings" => "Seaded",
"Import" => "Impordi",
"Import into:" => "Impordi:",
"OK" => "OK",
"(De-)select all" => "(Ära) vali kõik",
"New Contact" => "Uus kontakt",
"Groups" => "Grupid",
"Favorite" => "Lemmik",
"Delete Contact" => "Kustuta kontakt",
"Close" => "Sule",
"Keyboard shortcuts" => "Klvaiatuuri otseteed",
"Navigation" => "Navigeerimine",
@ -164,56 +165,78 @@
"Add new contact" => "Lisa uus kontakt",
"Add new addressbook" => "Lisa uus aadressiraamat",
"Delete current contact" => "Kustuta praegune kontakt",
"Drop photo to upload" => "Lohista üleslaetav foto siia",
"<h3>You have no contacts in your addressbook.</h3><p>Add a new contact or import existing contacts from a VCF file.</p>" => "<h3>Sul pole aadressiraamatus ühtegi kontakti.</h3><p>Lisa uus kontakt või impordi olemasolevad kontaktid VCF failist.</p>",
"Add contact" => "Lisa kontakt",
"Compose mail" => "Koosta kiri",
"Delete group" => "Kustuta grupp",
"Delete current photo" => "Kustuta praegune foto",
"Edit current photo" => "Muuda praegust pilti",
"Upload new photo" => "Lae üles uus foto",
"Select photo from ownCloud" => "Vali foto ownCloudist",
"Edit name details" => "Muuda nime üksikasju",
"Organization" => "Organisatsioon",
"First name" => "Eesnimi",
"Additional names" => "Lisanimed",
"Last name" => "Perekonnanimi",
"Nickname" => "Hüüdnimi",
"Enter nickname" => "Sisesta hüüdnimi",
"Web site" => "Veebisait",
"http://www.somesite.com" => "http://www.mingisait.ee",
"Go to web site" => "Mine veebisaidile",
"dd-mm-yyyy" => "dd.mm.yyyy",
"Groups" => "Grupid",
"Separate groups with commas" => "Eralda grupid komadega",
"Edit groups" => "Muuda gruppe",
"Preferred" => "Eelistatud",
"Please specify a valid email address." => "Palun sisesta korrektne e-posti aadress.",
"Enter email address" => "Sisesta e-posti aadress",
"Mail to address" => "Kiri aadressile",
"Delete email address" => "Kustuta e-posti aadress",
"Enter phone number" => "Sisesta telefoninumber",
"Delete phone number" => "Kustuta telefoninumber",
"Instant Messenger" => "Kiirsõnum",
"Delete IM" => "Kustuta IM",
"View on map" => "Vaata kaardil",
"Edit address details" => "Muuda aaressi infot",
"Add notes here." => "Lisa märkmed siia.",
"Add field" => "Lisa väli",
"Title" => "Pealkiri",
"Organization" => "Organisatsioon",
"Birthday" => "Sünnipäev",
"Notes go here..." => "Märkmed lähevad siia..",
"Add" => "Lisa",
"Phone" => "Telefon",
"Email" => "E-post",
"Instant Messaging" => "Kiirsõnumid",
"Address" => "Aadress",
"Note" => "Märkus",
"Download contact" => "Lae kontakt alla",
"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",
"Mail to address" => "Kiri aadressile",
"Delete email address" => "Kustuta e-posti aadress",
"Enter phone number" => "Sisesta telefoninumber",
"Delete phone number" => "Kustuta telefoninumber",
"Go to web site" => "Mine veebisaidile",
"Delete URL" => "Kustuta URL",
"View on map" => "Vaata kaardil",
"Delete address" => "Kustuta aadress",
"1 Main Street" => "Peatänav 1",
"Street address" => "Tänava aadress",
"12345" => "12345",
"Postal code" => "Postiindeks",
"Your city" => "Sinu linn",
"City" => "Linn",
"Some region" => "Mingi regioon",
"Your country" => "Sinu riik",
"Country" => "Riik",
"Instant Messenger" => "Kiirsõnum",
"Delete IM" => "Kustuta IM",
"Share" => "Jaga",
"Export" => "Ekspordi",
"Add Contact" => "Lisa kontakt",
"Drop photo to upload" => "Lohista üleslaetav foto siia",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Kohandatud vorming, Lühike nimi, Täielik nimi, vastupidine või vastupidine komadega",
"Edit name details" => "Muuda nime üksikasju",
"http://www.somesite.com" => "http://www.mingisait.ee",
"dd-mm-yyyy" => "dd.mm.yyyy",
"Separate groups with commas" => "Eralda grupid komadega",
"Edit groups" => "Muuda gruppe",
"Enter email address" => "Sisesta e-posti aadress",
"Edit address details" => "Muuda aaressi infot",
"Add notes here." => "Lisa märkmed siia.",
"Add field" => "Lisa väli",
"Download contact" => "Lae kontakt alla",
"The temporary image has been removed from cache." => "Ajutine pilt on puhvrist eemaldatud.",
"Edit address" => "Muuda aadressi",
"Type" => "Tüüp",
"PO Box" => "Postkontori postkast",
"Street address" => "Tänava aadress",
"Street and number" => "Tänav ja number",
"Extended" => "Laiendatud",
"Apartment number etc." => "Korteri nr jne.",
"City" => "Linn",
"Region" => "Piirkond",
"E.g. state or province" => "Näiteks maakond või piirkond",
"Zipcode" => "Postiindeks",
"Postal code" => "Postiindeks",
"Country" => "Riik",
"Addressbook" => "Aadressiraamat",
"Hon. prefixes" => "Eesliited",
"Miss" => "Preili",
@ -223,7 +246,6 @@
"Mrs" => "Proua",
"Dr" => "Dr",
"Given name" => "Eesnimi",
"Additional names" => "Lisanimed",
"Family name" => "Perekonnanimi",
"Hon. suffixes" => "Järelliited",
"J.D." => "J.D.",
@ -240,15 +262,12 @@
"Name of new addressbook" => "Uue aadressiraamatu nimi",
"Importing contacts" => "Kontaktide importimine",
"<h3>You have no contacts in your addressbook.</h3><p>You can import VCF files by dragging them to the contacts list and either drop them on an addressbook to import into it, or on an empty spot to create a new addressbook and import into that.<br />You can also import by clicking on the import button at the bottom of the list.</p>" => "<h3>Sinu aadressiraamatus pole ühtegi kontakti.</h3><p>Sa võid importida VCF faile lohistades neid kontaktide nimekirja sellele aadressiraamatule, millesse sa soovid neid importida või tühjale kohale, et luua uus aadressiraamat, millesse importida.<br />Sa võid importida ka kasutades nimekirja all olevat nuppu Impordi.</p>",
"Add contact" => "Lisa kontakt",
"Select Address Books" => "Vali aadressiraamatud",
"Enter description" => "Sisesta kirjeldus",
"CardDAV syncing addresses" => "CardDAV sünkroniseerimise aadressid",
"more info" => "lisainfo",
"Primary address (Kontact et al)" => "Peamine aadress",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "Aadressiraamatud",
"Share" => "Jaga",
"New Address Book" => "Uus aadressiraamat",
"Name" => "Nimi",
"Description" => "Kirjeldus",

View File

@ -2,23 +2,23 @@
"Error (de)activating addressbook." => "Errore bat egon da helbide-liburua (des)gaitzen",
"id is not set." => "IDa ez da ezarri.",
"Cannot update addressbook with an empty name." => "Ezin da helbide liburua eguneratu izen huts batekin.",
"No category name given." => "Ez da kategoriaren izena eman.",
"Error adding group." => "Errore bat izan da taldea gehitzean.",
"Group ID missing from request." => "Taldearen IDa falta da eskarian.",
"Contact ID missing from request." => "Kontaktuaren IDa falta da eskarian.",
"No ID provided" => "Ez da IDrik eman",
"Error setting checksum." => "Errorea kontrol-batura ezartzean.",
"No categories selected for deletion." => "Ez dira ezabatzeko kategoriak hautatu.",
"No address books found." => "Ez da helbide libururik aurkitu.",
"No contacts found." => "Ez da kontakturik aurkitu.",
"element name is not set." => "elementuaren izena ez da ezarri.",
"Could not parse contact: " => "Ezin izan da kontaktua analizatu:",
"Cannot add empty property." => "Ezin da propieta hutsa gehitu.",
"At least one of the address fields has to be filled out." => "Behintzat helbide eremuetako bat bete behar da.",
"Trying to add duplicate property: " => "Propietate bikoiztuta gehitzen saiatzen ari zara:",
"checksum is not set." => "Kontrol-batura ezarri gabe dago.",
"Information about vCard is incorrect. Please reload the page." => "vCard-aren inguruko informazioa okerra da. Mesedez birkargatu orrialdea.",
"Couldn't find vCard for %d." => "Ezin izan da %drentzako vCarda aurkitu.",
"Information about vCard is incorrect. Please reload the page: " => "vCard honen informazioa ez da zuzena.Mezedez birkargatu orria:",
"Cannot save property of type \"%s\" as array" => "Ezin da \"%s\" motako propietatea taula moduan gorde.",
"Missing IM parameter." => "BM parametroa falta da.",
"Unknown IM: " => "BM ezezaguna:",
"Information about vCard is incorrect. Please reload the page." => "vCard-aren inguruko informazioa okerra da. Mesedez birkargatu orrialdea.",
"Missing ID" => "ID falta da",
"Error parsing VCard for ID: \"" => "Errorea VCard analizatzean hurrengo IDrako: \"",
"checksum is not set." => "Kontrol-batura ezarri gabe dago.",
"Information about vCard is incorrect. Please reload the page: " => "vCard honen informazioa ez da zuzena.Mezedez birkargatu orria:",
"No contact ID was submitted." => "Ez da kontaktuaren IDrik eman.",
"Error reading contact photo." => "Errore bat izan da kontaktuaren argazkia igotzerakoan.",
"Error saving temporary file." => "Errore bat izan da aldi bateko fitxategia gordetzerakoan.",
@ -34,6 +34,9 @@
"Error cropping image" => "Errore bat izan da irudia mozten",
"Error creating temporary image" => "Errore bat izan da aldi bateko irudia sortzen",
"Error finding image: " => "Ezin izan da irudia aurkitu:",
"Key is not set for: " => "Gakoa ez da zehaztu hemen:",
"Value is not set for: " => "Balioa ez da zehaztu hemen:",
"Could not set preference: " => "Ezin izan da lehentasuna ezarri:",
"Error uploading contacts to storage." => "Errore bat egon da kontaktuak biltegira igotzerakoan.",
"There is no error, the file uploaded with success" => "Ez da errorerik egon, fitxategia ongi igo da",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Igotako fitxategia php.ini fitxategiko upload_max_filesize direktiba baino handiagoa da",
@ -45,42 +48,49 @@
"Couldn't load temporary image: " => "Ezin izan da aldi bateko irudia kargatu:",
"No file was uploaded. Unknown error" => "Ez da fitxategirik igo. Errore ezezaguna",
"Contacts" => "Kontaktuak",
"Sorry, this functionality has not been implemented yet" => "Barkatu, aukera hau ez da oriandik inplementatu",
"Not implemented" => "Inplementatu gabe",
"Couldn't get a valid address." => "Ezin izan da eposta baliagarri bat hartu.",
"Error" => "Errorea",
"Please enter an email address." => "Mesedez sartu eposta helbidea.",
"Enter name" => "Sartu izena",
"Select type" => "Hautatu mota",
"Contact is already in this group." => "Kontaktua dagoeneko talde honetan dago.",
"Contacts are already in this group." => "Kontaktuak dagoeneko talde honetan daude.",
"Couldn't get contact list." => "Ezin izan da kontaktuen zerrenda lortu.",
"Contact is not in this group." => "Kontaktua ez dago talde honetan.",
"Contacts are not in this group." => "Kontaktuak ez daude talde honetan.",
"A group named {group} already exists" => "{group} izeneko taldea dagoeneko existitzen da",
"All" => "Denak",
"Favorites" => "Gogokoak",
"Shared by {owner}" => "{owner}-k partekatuta",
"Indexing contacts" => "Kontaktuak indexatzen",
"Add to..." => "Gehitu hemen...",
"Remove from..." => "Ezabatu hemendik...",
"Add group..." => "Gehitu taldea...",
"Select photo" => "Hautatu argazkia",
"You do not have permission to add contacts to " => "Ez duzu baimenik gehitzeko kontaktuak hona",
"Please select one of your own address books." => "Mesedez hautatu zure helbide-liburu bat.",
"Permission error" => "Baimen errorea.",
"Click to undo deletion of \"" => "Klikatu honen ezabaketa desegiteko \"",
"Cancelled deletion of: \"" => "Honen ezabaketa bertan behera utzi da: \"",
"This property has to be non-empty." => "Propietate hau ezin da hutsik egon.",
"Couldn't serialize elements." => "Ezin izan dira elementuak serializatu.",
"Unknown error. Please check logs." => "Errore ezezaguna. Mesedez begiratu log-ak.",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' argumenturik gabe deitu da. Mezedez abisatu bugs.owncloud.org-en",
"Edit name" => "Editatu izena",
"No files selected for upload." => "Ez duzu igotzeko fitxategirik hautatu.",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Igo nahi duzun fitxategia zerbitzariak onartzen duen tamaina baino handiagoa da.",
"Error loading profile picture." => "Errorea profilaren irudia kargatzean.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Kontaktu batzuk ezabatzeko markatuta daude, baina oraindik ez dira ezabatu. Mesedez itxoin ezabatu arte.",
"Do you want to merge these address books?" => "Helbide-liburu hauek elkartu nahi dituzu?",
"Shared by " => "Honek partekatuta: ",
"Upload too large" => "Igoera handiegia da",
"Only image files can be used as profile picture." => "Bakarrik irudiak erabil daitezke profil irudietan.",
"Wrong file type" => "Fitxategi mota ez-egokia",
"Your browser doesn't support AJAX upload. Please click on the profile picture to select a photo to upload." => "Zure arakatzaileak ez du AJAX bidezko igoera onartzen. Mesedez kilikatu profilaren irudian igotzeko irudi bat hautatzeko.",
"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",
"Pending" => "Zain",
"Import done" => "Inportazioa burutua",
"Network or server error. Please inform administrator." => "Errore bat izan da sare edo zerbitzarian. Mesedez abisatu administradorea.",
"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",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Igo nahi duzun fitxategia zerbitzariak onartzen duen tamaina baino handiagoa da.",
"Upload too large" => "Igoera handiegia da",
"Pending" => "Zain",
"Add group" => "Gehitu taldea",
"No files selected for upload." => "Ez duzu igotzeko fitxategirik hautatu.",
"Edit profile picture" => "Editatu profilaren argazkia",
"Error loading profile picture." => "Errorea profilaren irudia kargatzean.",
"Enter name" => "Sartu izena",
"Enter description" => "Sartu deskribapena",
"Select addressbook" => "Hautatu helbide-liburua",
"The address book name cannot be empty." => "Helbide-liburuaren izena ezin da hutsik egon.",
"Is this correct?" => "Hau zuzena al da?",
"There was an unknown error when trying to delete this contact" => "Errore ezezagun bat izan da kontaktu hau ezabatzeko orduan",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Kontaktu batzuk ezabatzeko markatuta daude, baina oraindik ez dira ezabatu. Mesedez itxoin ezabatu arte.",
"Click to undo deletion of {num} contacts" => "Klikatu {num} kontaktuen ezabaketa desegiteko",
"Cancelled deletion of {num}" => "{num}en ezabaketa ezeztatuta",
"Result: " => "Emaitza:",
" imported, " => " inportatua, ",
" failed." => "huts egin du.",
@ -98,9 +108,6 @@
"There was an error updating the addressbook." => "Errore bat izan da helbide-liburua eguneratzean.",
"You do not have the permissions to delete this addressbook." => "Ez duzu helbide-liburu hau ezabatzeko baimenik.",
"There was an error deleting this addressbook." => "Errore bat izan da helbide-liburu hau ezabatzean.",
"Addressbook not found: " => "Helbide-liburua ez da aurkitu:",
"This is not your addressbook." => "Hau ez da zure helbide liburua.",
"Contact could not be found." => "Ezin izan da kontaktua aurkitu.",
"Jabber" => "Jabber",
"AIM" => "AIM",
"MSN" => "MSN",
@ -124,19 +131,9 @@
"Video" => "Bideoa",
"Pager" => "Bilagailua",
"Internet" => "Internet",
"Birthday" => "Jaioteguna",
"Business" => "Negozioak",
"Call" => "Deia",
"Clients" => "Bezeroak",
"Deliverer" => "Banatzailea",
"Holidays" => "Oporrak",
"Ideas" => "Ideiak",
"Journey" => "Bidaia",
"Jubilee" => "Urteurrenak",
"Meeting" => "Bilera",
"Personal" => "Pertsonala",
"Projects" => "Proiektuak",
"Questions" => "Galderak",
"Friends" => "Lagunak",
"Family" => "Familia",
"There was an error deleting properties for this contact." => "Errore bat izan da kontaktu honen propietateak ezabatzerakoan.",
"{name}'s Birthday" => "{name}ren jaioteguna",
"Contact" => "Kontaktua",
"You do not have the permissions to add contacts to this addressbook." => "Ez duzu helbide-liburu honetara kontaktuak gehitzeko baimenik.",
@ -146,9 +143,20 @@
"Could not find the Addressbook with ID: " => "Ezin izan da hurrengo IDa duen helbide-liburua aurkitu:",
"You do not have the permissions to delete this contact." => "Ez duzu kontaktu hau ezabatzeko baimenik.",
"There was an error deleting this contact." => "Errore bat izan da kontaktua ezabatzean.",
"Add Contact" => "Gehitu kontaktua",
"Import" => "Inportatu",
"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",
"Groups" => "Taldeak",
"Favorite" => "Gogokoa",
"Delete Contact" => "Ezabatu kontaktua",
"Close" => "Itxi",
"Keyboard shortcuts" => "Teklatuaren lasterbideak",
"Navigation" => "Nabigazioa",
@ -162,60 +170,85 @@
"Add new contact" => "Gehitu kontaktu berria",
"Add new addressbook" => "Gehitu helbide-liburu berria",
"Delete current contact" => "Ezabatu uneko kontaktuak",
"Drop photo to upload" => "Askatu argazkia igotzeko",
"<h3>You have no contacts in your addressbook.</h3><p>Add a new contact or import existing contacts from a VCF file.</p>" => "<h3>Ez duzu kontakturik helbide-liburuan.</h3><p>Gehitu kontaktu berri bat edo inportatu VCF fitxategi batetatik.</p>",
"Add contact" => "Gehitu kontaktua",
"Compose mail" => "Idatzi eposta",
"Delete group" => "Ezabatu taldea",
"Delete current photo" => "Ezabatu oraingo argazkia",
"Edit current photo" => "Editatu oraingo argazkia",
"Upload new photo" => "Igo argazki berria",
"Select photo from ownCloud" => "Hautatu argazki bat ownCloudetik",
"Edit name details" => "Editatu izenaren zehaztasunak",
"Organization" => "Erakundea",
"First name" => "Izena",
"Additional names" => "Tarteko izenak",
"Last name" => "Abizena",
"Nickname" => "Ezizena",
"Enter nickname" => "Sartu ezizena",
"Web site" => "Web orria",
"http://www.somesite.com" => "http://www.webgunea.com",
"Go to web site" => "Web orrira joan",
"dd-mm-yyyy" => "yyyy-mm-dd",
"Groups" => "Taldeak",
"Separate groups with commas" => "Banatu taldeak komekin",
"Edit groups" => "Editatu taldeak",
"Preferred" => "Hobetsia",
"Please specify a valid email address." => "Mesedez sartu eposta helbide egoki bat",
"Enter email address" => "Sartu eposta helbidea",
"Mail to address" => "Bidali helbidera",
"Delete email address" => "Ezabatu eposta helbidea",
"Enter phone number" => "Sartu telefono zenbakia",
"Delete phone number" => "Ezabatu telefono zenbakia",
"Instant Messenger" => "Instant Messenger",
"Delete IM" => "Ezabatu BM",
"View on map" => "Ikusi mapan",
"Edit address details" => "Editatu helbidearen zehaztasunak",
"Add notes here." => "Gehitu oharrak hemen.",
"Add field" => "Gehitu eremua",
"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",
"Instant Messaging" => "Berehalako mezularitza",
"Address" => "Helbidea",
"Note" => "Oharra",
"Download contact" => "Deskargatu kontaktua",
"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",
"Delete phone number" => "Ezabatu telefono zenbakia",
"Go to web site" => "Web orrira joan",
"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",
"http://www.somesite.com" => "http://www.webgunea.com",
"dd-mm-yyyy" => "yyyy-mm-dd",
"Separate groups with commas" => "Banatu taldeak komekin",
"Edit groups" => "Editatu taldeak",
"Enter email address" => "Sartu eposta helbidea",
"Edit address details" => "Editatu helbidearen zehaztasunak",
"Add notes here." => "Gehitu oharrak hemen.",
"Add field" => "Gehitu eremua",
"Download contact" => "Deskargatu kontaktua",
"The temporary image has been removed from cache." => "Aldi bateko irudia cachetik ezabatu da.",
"Edit address" => "Editatu helbidea",
"Type" => "Mota",
"PO Box" => "Posta kutxa",
"Street address" => "Kalearen helbidea",
"Street and number" => "Kalea eta zenbakia",
"Extended" => "Hedatua",
"Apartment number etc." => "Etxe zenbakia eab.",
"City" => "Hiria",
"Region" => "Eskualdea",
"E.g. state or province" => "adb. estatu edo herrialdea",
"Zipcode" => "Posta kodea",
"Postal code" => "Posta kodea",
"Country" => "Herrialdea",
"Addressbook" => "Helbide-liburua",
"Hon. prefixes" => "Ohorezko aurrizkiak",
"Given name" => "Izena",
"Additional names" => "Tarteko izenak",
"Family name" => "Abizena(k)",
"Hon. suffixes" => "Ohorezko atzizkiak",
"Import a contacts file" => "Inporatu kontaktuen fitxategia",
@ -224,15 +257,12 @@
"Name of new addressbook" => "Helbide liburuaren izena",
"Importing contacts" => "Kontaktuak inportatzen",
"<h3>You have no contacts in your addressbook.</h3><p>You can import VCF files by dragging them to the contacts list and either drop them on an addressbook to import into it, or on an empty spot to create a new addressbook and import into that.<br />You can also import by clicking on the import button at the bottom of the list.</p>" => "<h3>Ez duzu kontakturik zure helbide-liburuan.</h3><p>VCF fitxategiak inportatu ditzakezu kontaktu zerrendara arrastratuz eta helbide-liburu batean askatuz bertan inportatzeko, edo hutsune batera helbide-liburu berri bat sortzeko eta bertara inportatzeko.<br />Zerrendaren azpian dagoen inportatu botoia sakatuz ere inportatu dezakezu.</p>",
"Add contact" => "Gehitu kontaktua",
"Select Address Books" => "Hautatu helbide-liburuak",
"Enter description" => "Sartu deskribapena",
"CardDAV syncing addresses" => "CardDAV sinkronizazio helbideak",
"more info" => "informazio gehiago",
"Primary address (Kontact et al)" => "Helbide nagusia",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "Helbide Liburuak",
"Share" => "Partekatu",
"New Address Book" => "Helbide-liburu berria",
"Name" => "Izena",
"Description" => "Deskribapena",

View File

@ -8,13 +8,8 @@
"No address books found." => "هیچ کتابچه نشانی پیدا نشد",
"No contacts found." => "هیچ شخصی پیدا نشد",
"element name is not set." => "نام اصلی تنظیم نشده است",
"Cannot add empty property." => "نمیتوان یک خاصیت خالی ایجاد کرد",
"At least one of the address fields has to be filled out." => "At least one of the address fields has to be filled out. ",
"Trying to add duplicate property: " => "امتحان کردن برای وارد کردن مشخصات تکراری",
"Information about vCard is incorrect. Please reload the page." => "اطلاعات درمورد vCard شما اشتباه است لطفا صفحه را دوباره بار گذاری کنید",
"Missing ID" => "نشانی گم شده",
"Error parsing VCard for ID: \"" => "خطا در تجزیه کارت ویزا برای شناسه:",
"checksum is not set." => "checksum تنظیم شده نیست",
"Information about vCard is incorrect. Please reload the page." => "اطلاعات درمورد vCard شما اشتباه است لطفا صفحه را دوباره بار گذاری کنید",
"Information about vCard is incorrect. Please reload the page: " => "اطلاعات کارت ویزا شما غلط است لطفا صفحه را دوباره بارگزاری کنید",
"Something went FUBAR. " => "چند چیز به FUBAR رفتند",
"No contact ID was submitted." => "هیچ اطلاعاتی راجع به شناسه ارسال نشده",
@ -43,29 +38,25 @@
"Couldn't load temporary image: " => "قابلیت بارگذاری تصویر موقت وجود ندارد:",
"No file was uploaded. Unknown error" => "هیچ فایلی آپلود نشد.خطای ناشناس",
"Contacts" => "اشخاص",
"Sorry, this functionality has not been implemented yet" => "با عرض پوزش،این قابلیت هنوز اجرا نشده است",
"Not implemented" => "انجام نشد",
"Couldn't get a valid address." => "Couldn't get a valid address.",
"Select photo" => "تصویر را انتخاب کنید",
"Error" => "خطا",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format custom, Short name, Full name, Reverse or Reverse with comma",
"Select type" => "نوع را انتخاب کنید",
"This property has to be non-empty." => "این ویژگی باید به صورت غیر تهی عمل کند",
"Couldn't serialize elements." => "قابلیت مرتب سازی عناصر وجود ندارد",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "پاک کردن ویژگی بدون استدلال انجام شده.لطفا این مورد را گزارش دهید:bugs.owncloud.org",
"Edit name" => "نام تغییر",
"No files selected for upload." => "هیچ فایلی برای آپلود انتخاب نشده است",
"Unable to upload your file as it is a directory or has 0 bytes" => "ناتوان در بارگذاری یا فایل یک پوشه است یا 0بایت دارد",
"Upload Error" => "خطا در بار گذاری",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "حجم فایل بسیار بیشتر از حجم تنظیم شده در تنظیمات سرور است",
"Upload too large" => "سایز فایل برای آپلود زیاد است(م.تنظیمات در php.ini)",
"Pending" => "در انتظار",
"No files selected for upload." => "هیچ فایلی برای آپلود انتخاب نشده است",
"Result: " => "نتیجه:",
" imported, " => "وارد شد،",
" failed." => "ناموفق",
"Displayname cannot be empty." => "اسم نمایشی نمی تواند خالی باشد",
"Download" => "بارگیری",
"Edit" => "ویرایش",
"Delete" => "پاک کردن",
"Cancel" => "انصراف",
"This is not your addressbook." => "این کتابچه ی نشانه های شما نیست",
"Contact could not be found." => "اتصال ویا تماسی یافت نشد",
"Work" => "کار",
"Home" => "خانه",
"Other" => "دیگر",
"Mobile" => "موبایل",
"Text" => "متن",
"Voice" => "صدا",
@ -74,51 +65,60 @@
"Video" => "رسانه تصویری",
"Pager" => "صفحه",
"Internet" => "اینترنت",
"Birthday" => "روزتولد",
"{name}'s Birthday" => "روز تولد {name} است",
"Contact" => "اشخاص",
"Add Contact" => "افزودن اطلاعات شخص مورد نظر",
"Settings" => "تنظیمات",
"Import" => "وارد کردن",
"OK" => "باشه",
"Groups" => "گروه ها",
"Close" => "بستن",
"Drop photo to upload" => "تصویر را به اینجا بکشید تا بار گذازی شود",
"Add contact" => "افزودن اطلاعات شخص مورد نظر",
"Delete current photo" => "پاک کردن تصویر کنونی",
"Edit current photo" => "ویرایش تصویر کنونی",
"Upload new photo" => "بار گذاری یک تصویر جدید",
"Select photo from ownCloud" => "انتخاب یک تصویر از ابر های شما",
"Edit name details" => "ویرایش نام جزئیات",
"Organization" => "نهاد(ارگان)",
"Additional names" => "نام های دیگر",
"Nickname" => "نام مستعار",
"Enter nickname" => "یک نام مستعار وارد کنید",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Groups" => "گروه ها",
"Separate groups with commas" => "جدا کردن گروه ها به وسیله درنگ نما",
"Edit groups" => "ویرایش گروه ها",
"Title" => "عنوان",
"Organization" => "نهاد(ارگان)",
"Birthday" => "روزتولد",
"Add" => "افزودن",
"Phone" => "شماره تلفن",
"Email" => "نشانی پست الکترنیک",
"Address" => "نشانی",
"Note" => "یادداشت",
"Delete contact" => "پاک کردن اطلاعات شخص مورد نظر",
"Preferred" => "مقدم",
"Please specify a valid email address." => "لطفا یک پست الکترونیکی معتبر وارد کنید",
"Enter email address" => "یک پست الکترونیکی وارد کنید",
"Mail to address" => "به نشانی ارسال شد",
"Delete email address" => "پاک کردن نشانی پست الکترونیکی",
"Enter phone number" => "شماره تلفن راوارد کنید",
"Delete phone number" => "پاک کردن شماره تلفن",
"View on map" => "دیدن روی نقشه",
"City" => "شهر",
"Country" => "کشور",
"Share" => "اشتراک‌گزاری",
"Export" => "خروجی گرفتن",
"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",
"Edit name details" => "ویرایش نام جزئیات",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Separate groups with commas" => "جدا کردن گروه ها به وسیله درنگ نما",
"Edit groups" => "ویرایش گروه ها",
"Enter email address" => "یک پست الکترونیکی وارد کنید",
"Edit address details" => "ویرایش جزئیات نشانی ها",
"Add notes here." => "اینجا یادداشت ها را بیافزایید",
"Add field" => "اضافه کردن فیلد",
"Phone" => "شماره تلفن",
"Email" => "نشانی پست الکترنیک",
"Address" => "نشانی",
"Note" => "یادداشت",
"Download contact" => "دانلود مشخصات اشخاص",
"Delete contact" => "پاک کردن اطلاعات شخص مورد نظر",
"The temporary image has been removed from cache." => "تصویر موقت از کش پاک شد.",
"Edit address" => "ویرایش نشانی",
"Type" => "نوع",
"PO Box" => "صندوق پستی",
"Extended" => "تمدید شده",
"City" => "شهر",
"Region" => "ناحیه",
"Zipcode" => "کد پستی",
"Country" => "کشور",
"Addressbook" => "کتابچه ی نشانی ها",
"Hon. prefixes" => "پیشوند های محترمانه",
"Miss" => "خانم",
@ -128,7 +128,6 @@
"Mrs" => "خانم",
"Dr" => "دکتر",
"Given name" => "نام معلوم",
"Additional names" => "نام های دیگر",
"Family name" => "نام خانوادگی",
"Hon. suffixes" => "پسوند های محترم",
"J.D." => "J.D.",
@ -144,12 +143,12 @@
"create a new addressbook" => "یک کتابچه نشانی بسازید",
"Name of new addressbook" => "نام کتابچه نشانی جدید",
"Importing contacts" => "وارد کردن اشخاص",
"Add contact" => "افزودن اطلاعات شخص مورد نظر",
"CardDAV syncing addresses" => "CardDAV syncing addresses ",
"more info" => "اطلاعات بیشتر",
"Primary address (Kontact et al)" => "نشانی اولیه",
"iOS/OS X" => "iOS/OS X ",
"Addressbooks" => "کتابچه ی نشانی ها",
"New Address Book" => "کتابچه نشانه های جدید",
"Name" => "نام",
"Save" => "ذخیره سازی"
);

View File

@ -8,18 +8,12 @@
"No address books found." => "Osoitekirjoja ei löytynyt.",
"No contacts found." => "Yhteystietoja ei löytynyt.",
"element name is not set." => "kohteen nimeä ei ole asetettu.",
"Could not parse contact: " => "Ei kyetä tulkitsemaan yhteystietoa:",
"Cannot add empty property." => "Tyhjää ominaisuutta ei voi lisätä.",
"At least one of the address fields has to be filled out." => "Vähintään yksi osoitekenttä tulee täyttää.",
"Trying to add duplicate property: " => "Yritetään lisätä kaksinkertainen ominaisuus",
"Missing IM parameter." => "Puuttuva IM-arvo.",
"Unknown IM: " => "Tuntematon IM-arvo.",
"Information about vCard is incorrect. Please reload the page." => "vCardin tiedot eivät kelpaa. Lataa sivu uudelleen.",
"Missing ID" => "Puuttuva tunniste (ID)",
"Error parsing VCard for ID: \"" => "Virhe jäsennettäessä vCardia tunnisteelle: \"",
"checksum is not set." => "tarkistussummaa ei ole asetettu.",
"Information about vCard is incorrect. Please reload the page." => "vCardin tiedot eivät kelpaa. Lataa sivu uudelleen.",
"Information about vCard is incorrect. Please reload the page: " => "vCard osoitetietueen tiedot ovat virheelliset. Virkistä sivu uudestaan: ",
"Something went FUBAR. " => "Jokin meni pahasti pieleen.",
"Missing IM parameter." => "Puuttuva IM-arvo.",
"Unknown IM: " => "Tuntematon IM-arvo.",
"No contact ID was submitted." => "Yhteystiedon tunnistetta (ID) ei lähetetty.",
"Error reading contact photo." => "Virhe yhteystiedon kuvan lukemisessa.",
"Error saving temporary file." => "Virhe tallennettaessa tilapäistiedostoa.",
@ -46,40 +40,41 @@
"Couldn't load temporary image: " => "Väliaikaiskuvan lataus epäonnistui:",
"No file was uploaded. Unknown error" => "Tiedostoa ei lähetetty. Tuntematon virhe",
"Contacts" => "Yhteystiedot",
"Sorry, this functionality has not been implemented yet" => "Sori, tätä toiminnallisuutta ei ole vielä toteutettu",
"Not implemented" => "Ei toteutettu",
"Couldn't get a valid address." => "Ei kyetä saamaan kelvollista osoitetta.",
"Error" => "Virhe",
"Please enter an email address." => "Anna sähköpostiosoite.",
"Enter name" => "Anna nimi",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Itsemääritelty muoto, lyhyt nimi, pitkä nimi, vastakkainen tai vastakkainen pilkun kanssa",
"Select type" => "Valitse tyyppi",
"Contact is already in this group." => "Yhteystieto kuuluu jo tähän ryhmään.",
"Contacts are already in this group." => "Yhteystiedot kuuluvat jo tähän ryhmään.",
"Contact is not in this group." => "Yhteystieto ei ole tässä ryhmässä.",
"Contacts are not in this group." => "Yhteystiedot eivät ole tässä ryhmässä.",
"A group named {group} already exists" => "Ryhmä nimeltä {group} on jo olemassa",
"All" => "Kaikki",
"Favorites" => "Suosikit",
"Add group..." => "Lisää ryhmä...",
"Select photo" => "Valitse valokuva",
"You do not have permission to add contacts to " => "Sinulla ei ole oikeuksia lisätä yhteystietoja tänne:",
"Please select one of your own address books." => "Valitse jokin omista osoitekirjoistasi.",
"Permission error" => "Käyttöoikeusvirhe",
"This property has to be non-empty." => "Tämä ominaisuus ei saa olla tyhjä.",
"Couldn't serialize elements." => "Ei kyetä sarjallistamaan elementtejä.",
"Unknown error. Please check logs." => "Tuntematon virhe. Tarkista lokitiedostot.",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'poistaOminaisuus' kutsuttu ilman tyyppiä. Kerro virheestä bugs.owncloud.org",
"Edit name" => "Muokkaa nimeä",
"No files selected for upload." => "Tiedostoja ei ole valittu lähetettäväksi.",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Tiedosto, jota yrität ladata ylittää suurimman sallitun koon tällä palvelimella.",
"Error loading profile picture." => "Virhe profiilikuvaa ladatessa.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Jotkin yhteystiedot on merkitty poistettaviksi, mutta niitä ei ole vielä poistettu. Odota hetki, että kyseiset yhteystiedot poistetaan.",
"Do you want to merge these address books?" => "Haluatko yhdistää nämä osoitekirjat?",
"Upload too large" => "Lähetettävä tiedosto on liian suuri",
"Only image files can be used as profile picture." => "Profiilikuvaksi voi asettaa vain kuvatiedostoja.",
"Wrong file type" => "Väärä tiedostotyyppi",
"Your browser doesn't support AJAX upload. Please click on the profile picture to select a photo to upload." => "Selaimesi ei tue AJAX-lähetyksiä. Napsauta profiilikuvaa valitaksesi lähetettävän valokuvan.",
"Unable to upload your file as it is a directory or has 0 bytes" => "Tiedoston lähetys epäonnistui, koska sen koko on 0 tavua tai kyseessä on kansio.",
"Upload Error" => "Lähetysvirhe",
"Pending" => "Odottaa",
"Import done" => "Tuonti valmis",
"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",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Tiedosto, jota yrität ladata ylittää suurimman sallitun koon tällä palvelimella.",
"Upload too large" => "Lähetettävä tiedosto on liian suuri",
"Pending" => "Odottaa",
"Add group" => "Lisää ryhmä",
"No files selected for upload." => "Tiedostoja ei ole valittu lähetettäväksi.",
"Edit profile picture" => "Muokkaa profiilikuvaa",
"Error loading profile picture." => "Virhe profiilikuvaa ladatessa.",
"Enter name" => "Anna nimi",
"Enter description" => "Anna kuvaus",
"Select addressbook" => "Valitse osoitekirja",
"The address book name cannot be empty." => "Osoitekirjan nimi ei voi olla tyhjä",
"Is this correct?" => "Onko tämä oikein?",
"There was an unknown error when trying to delete this contact" => "Tätä yhteystietoa poistaessa tapahtui tuntematon virhe",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Jotkin yhteystiedot on merkitty poistettaviksi, mutta niitä ei ole vielä poistettu. Odota hetki, että kyseiset yhteystiedot poistetaan.",
"Result: " => "Tulos: ",
" imported, " => " tuotu, ",
" failed." => " epäonnistui.",
@ -97,9 +92,6 @@
"There was an error updating the addressbook." => "Virhe osoitekirjaa päivittäessä.",
"You do not have the permissions to delete this addressbook." => "Oikeutesi eivät riitä tämän osoitekirjan poistamiseen.",
"There was an error deleting this addressbook." => "Virhe osoitekirjaa poistaessa.",
"Addressbook not found: " => "Osoitekirjaa ei löytynyt:",
"This is not your addressbook." => "Tämä ei ole osoitekirjasi.",
"Contact could not be found." => "Yhteystietoa ei löytynyt.",
"Jabber" => "Jabber",
"AIM" => "AIM",
"MSN" => "MSN",
@ -123,19 +115,8 @@
"Video" => "Video",
"Pager" => "Hakulaite",
"Internet" => "Internet",
"Birthday" => "Syntymäpäivä",
"Business" => "Työ",
"Call" => "Kutsu",
"Clients" => "Asiakkaat",
"Deliverer" => "Toimittaja",
"Holidays" => "Vapaapäivät",
"Ideas" => "Ideat",
"Journey" => "Matka",
"Jubilee" => "Juhla",
"Meeting" => "Kokous",
"Personal" => "Henkilökohtainen",
"Projects" => "Projektit",
"Questions" => "Kysymykset",
"Friends" => "Kaverit",
"Family" => "Perhe",
"{name}'s Birthday" => "Henkilön {name} syntymäpäivä",
"Contact" => "Yhteystieto",
"You do not have the permissions to add contacts to this addressbook." => "Sinulla ei ole oikeuksia lisätä yhteystietoja tähän osoitekirjaan.",
@ -145,9 +126,19 @@
"Could not find the Addressbook with ID: " => "Ei löydy osoitekirjaa, jossa on tunniste ID:",
"You do not have the permissions to delete this contact." => "Käyttöoikeutesi eivät riitä tämän yhteystiedon poistamiseen.",
"There was an error deleting this contact." => "Tämän yhteystiedon poistamisessa tapahtui virhe",
"Add Contact" => "Lisää yhteystieto",
"Import" => "Tuo",
"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",
"Groups" => "Ryhmät",
"Favorite" => "Suosikki",
"Delete Contact" => "Poista yhteystieto",
"Close" => "Sulje",
"Keyboard shortcuts" => "Pikanäppäimet",
"Navigation" => "Suunnistus",
@ -161,56 +152,73 @@
"Add new contact" => "Lisää uusi yhteystieto",
"Add new addressbook" => "Lisää uusi osoitekirja",
"Delete current contact" => "Poista nykyinen yhteystieto",
"Drop photo to upload" => "Ladataksesi pudota kuva",
"Add contact" => "Lisää yhteystieto",
"Compose mail" => "Lähetä sähköpostia",
"Delete group" => "Poista ryhmä",
"Delete current photo" => "Poista nykyinen valokuva",
"Edit current photo" => "Muokkaa nykyistä valokuvaa",
"Upload new photo" => "Lähetä uusi valokuva",
"Select photo from ownCloud" => "Valitse valokuva ownCloudista",
"Edit name details" => "Muokkaa nimitietoja",
"Organization" => "Organisaatio",
"First name" => "Etunimi",
"Additional names" => "Lisänimet",
"Last name" => "Sukunimi",
"Nickname" => "Kutsumanimi",
"Enter nickname" => "Anna kutsumanimi",
"Web site" => "Verkkosivu",
"http://www.somesite.com" => "http://www.somesite.com",
"Go to web site" => "Siirry verkkosivulle",
"dd-mm-yyyy" => "pp-kk-vvvv",
"Groups" => "Ryhmät",
"Separate groups with commas" => "Erota ryhmät pilkuilla",
"Edit groups" => "Muokkaa ryhmiä",
"Preferred" => "Ensisijainen",
"Please specify a valid email address." => "Anna kelvollinen sähköpostiosoite.",
"Enter email address" => "Anna sähköpostiosoite",
"Mail to address" => "Lähetä sähköpostia",
"Delete email address" => "Poista sähköpostiosoite",
"Enter phone number" => "Anna puhelinnumero",
"Delete phone number" => "Poista puhelinnumero",
"Instant Messenger" => "Pikaviestin",
"Delete IM" => "Poista IM",
"View on map" => "Näytä kartalla",
"Edit address details" => "Muokkaa osoitetietoja",
"Add notes here." => "Lisää huomiot tähän.",
"Add field" => "Lisää kenttä",
"Title" => "Otsikko",
"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",
"Instant Messaging" => "Pikaviestintä",
"Address" => "Osoite",
"Note" => "Huomio",
"Download contact" => "Lataa yhteystieto",
"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",
"Delete email address" => "Poista sähköpostiosoite",
"Enter phone number" => "Anna puhelinnumero",
"Delete phone number" => "Poista puhelinnumero",
"Go to web site" => "Siirry verkkosivulle",
"View on map" => "Näytä kartalla",
"Delete address" => "Poista osoite",
"Street address" => "Katuosoite",
"12345" => "12345",
"Postal code" => "Postinumero",
"City" => "Paikkakunta",
"Country" => "Maa",
"Instant Messenger" => "Pikaviestin",
"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",
"Edit name details" => "Muokkaa nimitietoja",
"http://www.somesite.com" => "http://www.somesite.com",
"dd-mm-yyyy" => "pp-kk-vvvv",
"Separate groups with commas" => "Erota ryhmät pilkuilla",
"Edit groups" => "Muokkaa ryhmiä",
"Enter email address" => "Anna sähköpostiosoite",
"Edit address details" => "Muokkaa osoitetietoja",
"Add notes here." => "Lisää huomiot tähän.",
"Add field" => "Lisää kenttä",
"Download contact" => "Lataa yhteystieto",
"The temporary image has been removed from cache." => "Väliaikainen kuva on poistettu välimuistista.",
"Edit address" => "Muokkaa osoitetta",
"Type" => "Tyyppi",
"PO Box" => "Postilokero",
"Street address" => "Katuosoite",
"Street and number" => "Katu ja numero",
"Extended" => "Laajennettu",
"Apartment number etc." => "Asunnon numero jne.",
"City" => "Paikkakunta",
"Region" => "Alue",
"E.g. state or province" => "Esim. maakunta tai alue",
"Zipcode" => "Postinumero",
"Postal code" => "Postinumero",
"Country" => "Maa",
"Addressbook" => "Osoitekirja",
"Hon. prefixes" => "Kunnianarvoisa etuliite",
"Miss" => "Neiti",
@ -220,7 +228,6 @@
"Mrs" => "Rouva",
"Dr" => "Tohtori",
"Given name" => "Etunimi",
"Additional names" => "Lisänimet",
"Family name" => "Sukunimi",
"Hon. suffixes" => "Kunnianarvoisa jälkiliite",
"J.D." => "J.D.",
@ -236,15 +243,13 @@
"create a new addressbook" => "luo uusi osoitekirja",
"Name of new addressbook" => "Uuden osoitekirjan nimi",
"Importing contacts" => "Tuodaan yhteystietoja",
"Add contact" => "Lisää yhteystieto",
"<h3>You have no contacts in your addressbook.</h3><p>You can import VCF files by dragging them to the contacts list and either drop them on an addressbook to import into it, or on an empty spot to create a new addressbook and import into that.<br />You can also import by clicking on the import button at the bottom of the list.</p>" => "<h3>Osoitekirjassasi ei ole yhteystietoja.</h3><p>Voit tuoda VCF-tiedostoja vetämällä ne yhteystietoluetteloon ja pudottamalla ne haluamaasi osoitekirjaan, tai lisätä yhteystiedon uuteen osoitekirjaan pudottamalla sen tyhjään tilaan.<br />Vaihtoehtoisesti voit myös napsauttaa Tuo-painiketta luettelon alaosassa.</p>",
"Select Address Books" => "Valitse osoitekirjat",
"Enter description" => "Anna kuvaus",
"CardDAV syncing addresses" => "CardDAV-synkronointiosoitteet",
"more info" => "lisää tietoa",
"Primary address (Kontact et al)" => "Varsinainen osoite (yhteystiedot jne.)",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "Osoitekirjat",
"Share" => "Jaa",
"New Address Book" => "Uusi osoitekirja",
"Name" => "Nimi",
"Description" => "Kuvaus",

View File

@ -2,24 +2,24 @@
"Error (de)activating addressbook." => "Des erreurs se sont produites lors de l'activation/désactivation du carnet d'adresses.",
"id is not set." => "L'ID n'est pas défini.",
"Cannot update addressbook with an empty name." => "Impossible de mettre à jour le carnet d'adresses avec un nom vide.",
"No category name given." => "Aucun nom de catégorie n'a été spécifié.",
"Error adding group." => "Erreur lors de l'ajout du groupe.",
"Group ID missing from request." => "Identifiant du groupe manquant dans la requête.",
"Contact ID missing from request." => "Identifiant du contact manquant dans la requête.",
"No ID provided" => "Aucun ID fourni",
"Error setting checksum." => "Erreur lors du paramétrage du hachage.",
"No categories selected for deletion." => "Pas de catégories sélectionnées pour la suppression.",
"No address books found." => "Pas de carnet d'adresses trouvé.",
"No contacts found." => "Aucun contact trouvé.",
"element name is not set." => "Le champ Nom n'est pas défini.",
"Could not parse contact: " => "Impossible de lire le contact :",
"Cannot add empty property." => "Impossible d'ajouter un champ vide.",
"At least one of the address fields has to be filled out." => "Au moins un des champs d'adresses doit être complété.",
"Trying to add duplicate property: " => "Ajout d'une propriété en double:",
"Missing IM parameter." => "Paramètre de messagerie instantanée manquants.",
"Unknown IM: " => "Messagerie instantanée inconnue",
"Information about vCard is incorrect. Please reload the page." => "Les informations relatives à cette vCard sont incorrectes. Veuillez recharger la page.",
"Missing ID" => "ID manquant",
"Error parsing VCard for ID: \"" => "Erreur lors de l'analyse du VCard pour l'ID: \"",
"checksum is not set." => "L'hachage n'est pas défini.",
"Information about vCard is incorrect. Please reload the page." => "Les informations relatives à cette vCard sont incorrectes. Veuillez recharger la page.",
"Couldn't find vCard for %d." => "Impossible de trouver une vCard pour %d.",
"Information about vCard is incorrect. Please reload the page: " => "Les informations relatives à cette vCard sont incorrectes. Veuillez recharger la page :",
"Something went FUBAR. " => "Quelque chose est FUBAR.",
"Cannot save property of type \"%s\" as array" => "Impossible de sauvegarder la propriété du type \"%s\" sous forme de tableau",
"Missing IM parameter." => "Paramètre de messagerie instantanée manquants.",
"Unknown IM: " => "Messagerie instantanée inconnue",
"No contact ID was submitted." => "Aucun ID de contact envoyé",
"Error reading contact photo." => "Erreur de lecture de la photo du contact.",
"Error saving temporary file." => "Erreur de sauvegarde du fichier temporaire.",
@ -35,6 +35,9 @@
"Error cropping image" => "Erreur lors du rognage de l'image",
"Error creating temporary image" => "Erreur de création de l'image temporaire",
"Error finding image: " => "Erreur pour trouver l'image :",
"Key is not set for: " => "La clé n'est pas spécifiée pour :",
"Value is not set for: " => "La valeur n'est pas spécifiée pour :",
"Could not set preference: " => "Impossible de spécifier le paramètre :",
"Error uploading contacts to storage." => "Erreur lors de l'envoi des contacts vers le stockage.",
"There is no error, the file uploaded with success" => "Il n'y a pas d'erreur, le fichier a été envoyé avec succes.",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Le fichier envoyé dépasse la directive upload_max_filesize dans php.ini",
@ -46,43 +49,46 @@
"Couldn't load temporary image: " => "Impossible de charger l'image temporaire :",
"No file was uploaded. Unknown error" => "Aucun fichier n'a été chargé. Erreur inconnue",
"Contacts" => "Contacts",
"Sorry, this functionality has not been implemented yet" => "Désolé cette fonctionnalité n'a pas encore été implémentée",
"Not implemented" => "Pas encore implémenté",
"Couldn't get a valid address." => "Impossible de trouver une adresse valide.",
"Error" => "Erreur",
"Please enter an email address." => "Veuillez entrer une adresse e-mail.",
"Enter name" => "Saisissez le nom",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formatage personnalisé, Nom court, Nom complet, Inversé, Inversé avec virgule",
"Select type" => "Sélectionner un type",
"Contact is already in this group." => "Ce contact est déjà présent dans le groupe.",
"Contacts are already in this group." => "Ces contacts sont déjà présents dans le groupe.",
"Couldn't get contact list." => "Impossible d'obtenir la liste des contacts.",
"Contact is not in this group." => "Ce contact n'est pas présent dans le groupe.",
"Contacts are not in this group." => "Ces contacts ne sont pas présents dans le groupe.",
"A group named {group} already exists" => "Un groupe nommé {group} existe déjà",
"All" => "Tous",
"Favorites" => "Favoris",
"Shared by {owner}" => "Partagé par {owner}",
"Indexing contacts" => "Indexation des contacts",
"Add to..." => "Ajouter à…",
"Remove from..." => "Retirer de…",
"Add group..." => "Ajouter un groupe…",
"Select photo" => "Sélectionner une photo",
"You do not have permission to add contacts to " => "Vous n'avez pas l'autorisation d'ajouter des contacts à",
"Please select one of your own address books." => "Veuillez sélectionner l'un de vos carnets d'adresses.",
"Permission error" => "Erreur de permission",
"Click to undo deletion of \"" => "Cliquez pour annuler la suppression de \"",
"Cancelled deletion of: \"" => "Suppression annulée pour : \"",
"This property has to be non-empty." => "Cette valeur ne doit pas être vide",
"Couldn't serialize elements." => "Impossible de sérialiser les éléments.",
"Unknown error. Please check logs." => "Erreur inconnue. Veuillez consulter les logs.",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' a été appelé sans type d'argument. Merci de rapporter cette anomalie à bugs.owncloud.org",
"Edit name" => "Éditer le nom",
"No files selected for upload." => "Aucun fichiers choisis pour être chargés",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Le fichier que vous tentez de charger dépasse la taille maximum de fichier autorisée sur ce serveur.",
"Error loading profile picture." => "Erreur pendant le chargement de la photo de profil.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Certains contacts sont marqués pour être supprimés, mais ne le sont pas encore. Veuillez attendre que l'opération se termine.",
"Do you want to merge these address books?" => "Voulez-vous fusionner ces carnets d'adresses ?",
"Shared by " => "Partagé par",
"Upload too large" => "Téléversement trop volumineux",
"Only image files can be used as profile picture." => "Seuls les fichiers images peuvent être utilisés pour la photo de profil.",
"Wrong file type" => "Mauvais type de fichier",
"Your browser doesn't support AJAX upload. Please click on the profile picture to select a photo to upload." => "Votre navigateur ne supporte pas le téléversement avec AJAX. Veuillez cliquer sur l'image du profil pour sélectionner une photo à téléverser.",
"Unable to upload your file as it is a directory or has 0 bytes" => "Impossible de téléverser votre fichier dans la mesure où il s'agit d'un répertoire ou d'un fichier de taille nulle",
"Upload Error" => "Erreur lors du téléversement",
"Pending" => "En attente",
"Import done" => "Fichiers importés",
"Network or server error. Please inform administrator." => "Erreur de serveur ou du réseau. Veuillez contacter votre administrateur.",
"Error adding to group." => "Erreur lors de l'ajout au groupe.",
"Error removing from group." => "Erreur lors du retrait du groupe.",
"There was an error opening a mail composer." => "Une erreur s'est produite lors de louverture d'un outil de composition email.",
"Not all files uploaded. Retrying..." => "Tous les fichiers n'ont pas pu être téléversés. Nouvel essai…",
"Something went wrong with the upload, please retry." => "Une erreur s'est produite pendant le téléversement, veuillez réessayer.",
"Error" => "Erreur",
"Importing..." => "Import en cours…",
"Unable to upload your file as it is a directory or has 0 bytes" => "Impossible de téléverser votre fichier dans la mesure où il s'agit d'un répertoire ou d'un fichier de taille nulle",
"Upload Error" => "Erreur lors du téléversement",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Le fichier que vous tentez de charger dépasse la taille maximum de fichier autorisée sur ce serveur.",
"Upload too large" => "Téléversement trop volumineux",
"Pending" => "En attente",
"Add group" => "Ajouter un groupe",
"No files selected for upload." => "Aucun fichiers choisis pour être chargés",
"Edit profile picture" => "Éditer l'image de profil",
"Error loading profile picture." => "Erreur pendant le chargement de la photo de profil.",
"Enter name" => "Saisissez le nom",
"Enter description" => "Saisissez une description",
"Select addressbook" => "Sélection d'un carnet d'adresses",
"The address book name cannot be empty." => "Le nom du carnet d'adresses ne peut être vide.",
"Is this correct?" => "Est-ce correct ?",
"There was an unknown error when trying to delete this contact" => "Une erreur inconnue s'est produite lors de la tentative de suppression du contact",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Certains contacts sont marqués pour être supprimés, mais ne le sont pas encore. Veuillez attendre que l'opération se termine.",
"Click to undo deletion of {num} contacts" => "Cliquer pour annuler la suppression de {num} contacts",
"Cancelled deletion of {num}" => "Suppression annulée pour {num} contacts",
"Result: " => "Résultat :",
" imported, " => "importé,",
" failed." => "échoué.",
@ -100,9 +106,6 @@
"There was an error updating the addressbook." => "Une erreur s'est produite pendant la mise à jour du carnet d'adresses.",
"You do not have the permissions to delete this addressbook." => "Vous n'avez pas les droits pour supprimer ce carnet d'adresses.",
"There was an error deleting this addressbook." => "Erreur lors de la suppression du carnet d'adresses.",
"Addressbook not found: " => "Carnet d'adresse introuvable : ",
"This is not your addressbook." => "Ce n'est pas votre carnet d'adresses.",
"Contact could not be found." => "Ce contact n'a pu être trouvé.",
"Jabber" => "Jabber",
"AIM" => "AOL Instant Messaging",
"MSN" => "MSN",
@ -126,19 +129,9 @@
"Video" => "Vidéo",
"Pager" => "Bipeur",
"Internet" => "Internet",
"Birthday" => "Anniversaire",
"Business" => "Business",
"Call" => "Appel",
"Clients" => "Clients",
"Deliverer" => "Livreur",
"Holidays" => "Vacances",
"Ideas" => "Idées",
"Journey" => "Trajet",
"Jubilee" => "Jubilé",
"Meeting" => "Rendez-vous",
"Personal" => "Personnel",
"Projects" => "Projets",
"Questions" => "Questions",
"Friends" => "Amis",
"Family" => "Famille",
"There was an error deleting properties for this contact." => "Une erreur s'est produite lors de la suppression des propriétés de ce contact.",
"{name}'s Birthday" => "Anniversaire de {name}",
"Contact" => "Contact",
"You do not have the permissions to add contacts to this addressbook." => "Vous n'avez pas les droits suffisants pour ajouter des contacts à ce carnet d'adresses.",
@ -148,9 +141,18 @@
"Could not find the Addressbook with ID: " => "Impossible de trouver le carnet d'adresses ayant l'ID :",
"You do not have the permissions to delete this contact." => "Vous n'avez pas l'autorisation de supprimer ce contact.",
"There was an error deleting this contact." => "Erreur lors de la suppression du contact.",
"Add Contact" => "Ajouter un Contact",
"Import" => "Importer",
"Contact not found." => "Contact introuvable.",
"HomePage" => "Page d'Accueil",
"New Group" => "Nouveau Groupe",
"Settings" => "Paramètres",
"Import" => "Importer",
"Import into:" => "Importer dans :",
"OK" => "OK",
"(De-)select all" => "(Dé-)sélectionner tout",
"New Contact" => "Nouveau Contact",
"Groups" => "Groupes",
"Favorite" => "Favoris",
"Delete Contact" => "Supprimer le Contact",
"Close" => "Fermer",
"Keyboard shortcuts" => "Raccourcis clavier",
"Navigation" => "Navigation",
@ -164,56 +166,78 @@
"Add new contact" => "Ajouter un nouveau contact",
"Add new addressbook" => "Ajouter un nouveau carnet d'adresses",
"Delete current contact" => "Effacer le contact sélectionné",
"Drop photo to upload" => "Glisser une photo pour l'envoi",
"<h3>You have no contacts in your addressbook.</h3><p>Add a new contact or import existing contacts from a VCF file.</p>" => "<h3>Vous n'avez aucun contact dans votre carnet d'adresses.</h3><p>Ajoutez un nouveau contact ou importez des contacts existants depuis un fichier VCF.</p>",
"Add contact" => "Ajouter un contact",
"Compose mail" => "Écrire un mail",
"Delete group" => "Effacer le groupe",
"Delete current photo" => "Supprimer la photo actuelle",
"Edit current photo" => "Editer la photo actuelle",
"Upload new photo" => "Envoyer une nouvelle photo",
"Select photo from ownCloud" => "Sélectionner une photo depuis ownCloud",
"Edit name details" => "Editer les noms",
"Organization" => "Société",
"First name" => "Prénom",
"Additional names" => "Nom supplémentaires",
"Last name" => "Nom",
"Nickname" => "Surnom",
"Enter nickname" => "Entrer un surnom",
"Web site" => "Page web",
"http://www.somesite.com" => "http://www.somesite.com",
"Go to web site" => "Allez à la page web",
"dd-mm-yyyy" => "jj-mm-aaaa",
"Groups" => "Groupes",
"Separate groups with commas" => "Séparer les groupes avec des virgules",
"Edit groups" => "Editer les groupes",
"Preferred" => "Préféré",
"Please specify a valid email address." => "Veuillez entrer une adresse e-mail valide.",
"Enter email address" => "Entrer une adresse e-mail",
"Mail to address" => "Envoyer à l'adresse",
"Delete email address" => "Supprimer l'adresse e-mail",
"Enter phone number" => "Entrer un numéro de téléphone",
"Delete phone number" => "Supprimer le numéro de téléphone",
"Instant Messenger" => "Instant Messenger",
"Delete IM" => "Supprimer la messagerie instantanée",
"View on map" => "Voir sur une carte",
"Edit address details" => "Editer les adresses",
"Add notes here." => "Ajouter des notes ici.",
"Add field" => "Ajouter un champ.",
"Title" => "Titre",
"Organization" => "Société",
"Birthday" => "Anniversaire",
"Notes go here..." => "Remarques…",
"Add" => "Ajouter",
"Phone" => "Téléphone",
"Email" => "E-mail",
"Instant Messaging" => "Messagerie instantanée",
"Address" => "Adresse",
"Note" => "Note",
"Download contact" => "Télécharger le contact",
"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",
"Mail to address" => "Envoyer à l'adresse",
"Delete email address" => "Supprimer l'adresse e-mail",
"Enter phone number" => "Entrer un numéro de téléphone",
"Delete phone number" => "Supprimer le numéro de téléphone",
"Go to web site" => "Allez à la page web",
"Delete URL" => "Effacer l'URL",
"View on map" => "Voir sur une carte",
"Delete address" => "Effacer l'adresse",
"1 Main Street" => "1 Rue Principale",
"Street address" => "Adresse postale",
"12345" => "12345",
"Postal code" => "Code postal",
"Your city" => "Votre Ville",
"City" => "Ville",
"Some region" => "Une Région",
"Your country" => "Votre Pays",
"Country" => "Pays",
"Instant Messenger" => "Instant Messenger",
"Delete IM" => "Supprimer la messagerie instantanée",
"Share" => "Partager",
"Export" => "Exporter",
"Add Contact" => "Ajouter un Contact",
"Drop photo to upload" => "Glisser une photo pour l'envoi",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formatage personnalisé, Nom court, Nom complet, Inversé, Inversé avec virgule",
"Edit name details" => "Editer les noms",
"http://www.somesite.com" => "http://www.somesite.com",
"dd-mm-yyyy" => "jj-mm-aaaa",
"Separate groups with commas" => "Séparer les groupes avec des virgules",
"Edit groups" => "Editer les groupes",
"Enter email address" => "Entrer une adresse e-mail",
"Edit address details" => "Editer les adresses",
"Add notes here." => "Ajouter des notes ici.",
"Add field" => "Ajouter un champ.",
"Download contact" => "Télécharger le contact",
"The temporary image has been removed from cache." => "L'image temporaire a été supprimée du cache.",
"Edit address" => "Editer l'adresse",
"Type" => "Type",
"PO Box" => "Boîte postale",
"Street address" => "Adresse postale",
"Street and number" => "Rue et numéro",
"Extended" => "Étendu",
"Apartment number etc." => "Numéro d'appartement, etc.",
"City" => "Ville",
"Region" => "Région",
"E.g. state or province" => "Ex: état ou province",
"Zipcode" => "Code postal",
"Postal code" => "Code postal",
"Country" => "Pays",
"Addressbook" => "Carnet d'adresses",
"Hon. prefixes" => "Préfixe hon.",
"Miss" => "Mlle",
@ -223,7 +247,6 @@
"Mrs" => "Mme",
"Dr" => "Dr",
"Given name" => "Prénom",
"Additional names" => "Nom supplémentaires",
"Family name" => "Nom de famille",
"Hon. suffixes" => "Suffixes hon.",
"J.D." => "J.D.",
@ -240,15 +263,12 @@
"Name of new addressbook" => "Nom du nouveau carnet d'adresses",
"Importing contacts" => "Importation des contacts",
"<h3>You have no contacts in your addressbook.</h3><p>You can import VCF files by dragging them to the contacts list and either drop them on an addressbook to import into it, or on an empty spot to create a new addressbook and import into that.<br />You can also import by clicking on the import button at the bottom of the list.</p>" => "<h3>Vous n'avez pas de contact dans ce carnet d'adresses.</h3><p>Vous pouvez importer un fichier VCF par simple glisser/déposer vers la liste de contacts, vers un carnet d'adresses existant (afin d'y importer les nouveaux contacts), ou encore vers un emplacement libre afin de créer un nouveau carnet d'adresses à partir des contacts contenus dans le fichier.<br />Vous pouvez également utiliser le bouton d'import en bas de la liste.</p>",
"Add contact" => "Ajouter un contact",
"Select Address Books" => "Choix du carnet d'adresses",
"Enter description" => "Saisissez une description",
"CardDAV syncing addresses" => "Synchronisation des contacts CardDAV",
"more info" => "Plus d'infos",
"Primary address (Kontact et al)" => "Adresse principale",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "Carnets d'adresses",
"Share" => "Partager",
"New Address Book" => "Nouveau Carnet d'adresses",
"Name" => "Nom",
"Description" => "Description",

View File

@ -1,21 +1,19 @@
<?php $TRANSLATIONS = array(
"Error (de)activating addressbook." => "Produciuse un erro (des)activando a axenda.",
"id is not set." => "non se estableceu o id.",
"Cannot update addressbook with an empty name." => "Non se pode actualizar a libreta de enderezos sen completar o nome.",
"No ID provided" => "Non se proveeu ID",
"Cannot update addressbook with an empty name." => "Non se pode actualizar a caderno de enderezos sen completar o nome.",
"No ID provided" => "Non se deu o ID ",
"Error setting checksum." => "Erro establecendo a suma de verificación",
"No categories selected for deletion." => "Non se seleccionaron categorías para borrado.",
"No address books found." => "Non se atoparon libretas de enderezos.",
"No address books found." => "Non se atoparon cadernos de enderezos.",
"No contacts found." => "Non se atoparon contactos.",
"element name is not set." => "non se nomeou o elemento.",
"Cannot add empty property." => "Non se pode engadir unha propiedade baleira.",
"At least one of the address fields has to be filled out." => "Polo menos un dos campos do enderezo ten que ser cuberto.",
"Trying to add duplicate property: " => "Tentando engadir propiedade duplicada: ",
"Information about vCard is incorrect. Please reload the page." => "A información sobre a vCard é incorrecta. Por favor volva cargar a páxina.",
"Missing ID" => "ID perdido",
"Error parsing VCard for ID: \"" => "Erro procesando a VCard para o ID: \"",
"checksum is not set." => "non se estableceu a suma de verificación.",
"Information about vCard is incorrect. Please reload the page: " => "A información sobre a vCard é incorrecta. Por favor, recargue a páxina: ",
"Information about vCard is incorrect. Please reload the page." => "A información sobre a vCard é incorrecta. Volva cargar a páxina.",
"Information about vCard is incorrect. Please reload the page: " => "A información sobre a vCard é incorrecta. Recargue a páxina: ",
"Something went FUBAR. " => "Algo se escangallou.",
"Missing IM parameter." => "Falta un parámetro do MI.",
"Unknown IM: " => "MI descoñecido:",
"No contact ID was submitted." => "Non se enviou ningún ID de contacto.",
"Error reading contact photo." => "Erro lendo a fotografía do contacto.",
"Error saving temporary file." => "Erro gardando o ficheiro temporal.",
@ -24,7 +22,7 @@
"No photo path was submitted." => "Non se enviou a ruta a unha foto.",
"File doesn't exist:" => "O ficheiro non existe:",
"Error loading image." => "Erro cargando imaxe.",
"Error getting contact object." => "Erro obtendo o obxeto contacto.",
"Error getting contact object." => "Erro obtendo o obxecto contacto.",
"Error getting PHOTO property." => "Erro obtendo a propiedade PHOTO.",
"Error saving contact." => "Erro gardando o contacto.",
"Error resizing image" => "Erro cambiando o tamaño da imaxe",
@ -32,39 +30,64 @@
"Error creating temporary image" => "Erro creando a imaxe temporal",
"Error finding image: " => "Erro buscando a imaxe: ",
"Error uploading contacts to storage." => "Erro subindo os contactos ao almacén.",
"There is no error, the file uploaded with success" => "Non houbo erros, o ficheiro subeuse con éxito",
"There is no error, the file uploaded with success" => "Non houbo erros, o ficheiro subiuse con éxito",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "O ficheiro subido supera a directiva upload_max_filesize no php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "O ficheiro subido supera a directiva MAX_FILE_SIZE especificada no formulario HTML",
"The uploaded file was only partially uploaded" => "O ficheiro so foi parcialmente subido",
"No file was uploaded" => "Non se subeu ningún ficheiro",
"No file was uploaded" => "Non se subiu ningún ficheiro",
"Missing a temporary folder" => "Falta o cartafol temporal",
"Couldn't save temporary image: " => "Non se puido gardar a imaxe temporal: ",
"Couldn't load temporary image: " => "Non se puido cargar a imaxe temporal: ",
"No file was uploaded. Unknown error" => "Non se subeu ningún ficheiro. Erro descoñecido.",
"No file was uploaded. Unknown error" => "Non se subiu ningún ficheiro. Erro descoñecido.",
"Contacts" => "Contactos",
"Sorry, this functionality has not been implemented yet" => "Sentímolo, esta función aínda non foi implementada.",
"Not implemented" => "Non implementada.",
"Couldn't get a valid address." => "Non se puido obter un enderezo de correo válido.",
"Select photo" => "Seleccione fotografía",
"Not all files uploaded. Retrying..." => "Non se subiron todos os ficheiros. Intentándoo de novo...",
"Something went wrong with the upload, please retry." => "Algo fallou na subida de ficheiros. Inténtao de novo.",
"Error" => "Erro",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formato personalizado, Nome corto, Nome completo, Inverso ou Inverso con coma",
"Select type" => "Seleccione tipo",
"This property has to be non-empty." => "Esta propiedade non pode quedar baldeira.",
"Couldn't serialize elements." => "Non se puido serializar os elementos.",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' chamado sen argumento. Por favor, informe en bugs.owncloud.org",
"Edit name" => "Editar nome",
"No files selected for upload." => "Sen ficheiros escollidos para subir.",
"Importing..." => "Importando...",
"Unable to upload your file as it is a directory or has 0 bytes" => "Non se puido subir o ficheiro pois ou é un directorio ou ten 0 bytes",
"Upload Error" => "Erro na subida",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "O ficheiro que tenta subir supera o tamaño máximo permitido neste servidor.",
"Upload too large" => "Subida demasiado grande",
"Pending" => "Pendentes",
"No files selected for upload." => "Sen ficheiros escollidos para subir.",
"Error loading profile picture." => "Erro ao cargar a imaxe de perfil.",
"Enter name" => "Indique o nome",
"Enter description" => "Introducir a descrición",
"The address book name cannot be empty." => "Non se pode deixar baleiro o nome do caderno de enderezos.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Algúns contactos están marcados para ser eliminados máis aínda non se eliminaron. Espera a que se eliminen.",
"Result: " => "Resultado: ",
" imported, " => " importado, ",
" failed." => " fallou.",
"Displayname cannot be empty." => "Displayname non pode estar baldeiro.",
"Show CardDav link" => "Mostrar a ligazón de CardDav",
"Show read-only VCF link" => "Mostrar as ligazóns a VCF de só lectura",
"Download" => "Descargar",
"Edit" => "Editar",
"Delete" => "Eliminar",
"Cancel" => "Cancelar",
"This is not your addressbook." => "Esta non é a súa axenda.",
"Contact could not be found." => "Non se atopou o contacto.",
"More..." => "Máis...",
"Less..." => "Menos...",
"You do not have the permissions to read this addressbook." => "Non tes permisos para ler este caderno de enderezos.",
"You do not have the permissions to update this addressbook." => "Non tes permisos para actualizar este caderno de enderezos.",
"There was an error updating the addressbook." => "Houbo un erro actualizando o caderno de enderezos.",
"You do not have the permissions to delete this addressbook." => "Non tes permisos para eliminar este caderno de enderezos.",
"There was an error deleting this addressbook." => "Houbo un erro borrando este caderno de enderezos.",
"Jabber" => "Jabber",
"AIM" => "AIM",
"MSN" => "MSN",
"Twitter" => "Twitter",
"GoogleTalk" => "Google Talk",
"Facebook" => "Facebook",
"XMPP" => "XMPP",
"ICQ" => "ICQ",
"Yahoo" => "Yahoo",
"Skype" => "Skype",
"QQ" => "QQ",
"GaduGadu" => "GaduGadu",
"Work" => "Traballo",
"Home" => "Casa",
"Other" => "Outro",
"Mobile" => "Móbil",
"Text" => "Texto",
"Voice" => "Voz",
@ -73,52 +96,93 @@
"Video" => "Vídeo",
"Pager" => "Paxinador",
"Internet" => "Internet",
"Birthday" => "Aniversario",
"{name}'s Birthday" => "Cumpleanos de {name}",
"Friends" => "Amigos",
"Family" => "Familia",
"{name}'s Birthday" => "Aniversario de {name}",
"Contact" => "Contacto",
"Add Contact" => "Engadir contacto",
"You do not have the permissions to add contacts to this addressbook." => "Non tes permisos para engadir contactos a este caderno de enderezos.",
"Could not find the vCard with ID." => "Non se atopa a vCard coa ID.",
"You do not have the permissions to edit this contact." => "Non tes permisos para editar este contacto.",
"Could not find the vCard with ID: " => "Non se atopa a vCard co ID:",
"Could not find the Addressbook with ID: " => "Non se pode atopar o caderno de enderezos coa ID:",
"You do not have the permissions to delete this contact." => "Non tes permisos para eliminar este contacto.",
"There was an error deleting this contact." => "Houbo un erro eliminando este contacto.",
"Settings" => "Preferencias",
"Import" => "Importar",
"OK" => "Aceptar",
"Groups" => "Grupos",
"Close" => "Pechar",
"Drop photo to upload" => "Solte a foto a subir",
"Keyboard shortcuts" => "Atallos de teclado",
"Navigation" => "Navegación",
"Next contact in list" => "Seguinte contacto na lista",
"Previous contact in list" => "Contacto anterior na lista",
"Expand/collapse current addressbook" => "Expandir/contraer o caderno de enderezos actual",
"Next addressbook" => "Seguinte caderno de enderezos",
"Previous addressbook" => "Anterior caderno de enderezos",
"Actions" => "Accións",
"Refresh contacts list" => "Anovar a lista de contactos",
"Add new contact" => "Engadir un contacto novo",
"Add new addressbook" => "Engadir un novo caderno de enderezos",
"Delete current contact" => "Eliminar o contacto actual",
"Add contact" => "Engadir contacto",
"Delete current photo" => "Borrar foto actual",
"Edit current photo" => "Editar a foto actual",
"Upload new photo" => "Subir unha nova foto",
"Select photo from ownCloud" => "Escoller foto desde ownCloud",
"Edit name details" => "Editar detalles do nome",
"Additional names" => "Nomes adicionais",
"Nickname" => "Alcume",
"Enter nickname" => "Introduza o alcume",
"Title" => "Título",
"Organization" => "Organización",
"Nickname" => "Apodo",
"Enter nickname" => "Introuza apodo",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Groups" => "Grupos",
"Separate groups with commas" => "Separe grupos con comas",
"Edit groups" => "Editar grupos",
"Preferred" => "Preferido",
"Please specify a valid email address." => "Por favor indique un enderezo de correo electrónico válido.",
"Enter email address" => "Introduza enderezo de correo electrónico",
"Mail to address" => "Correo ao enderezo",
"Delete email address" => "Borrar enderezo de correo electrónico",
"Enter phone number" => "Introducir número de teléfono",
"Delete phone number" => "Borrar número de teléfono",
"View on map" => "Ver no mapa",
"Edit address details" => "Editar detalles do enderezo",
"Add notes here." => "Engadir aquí as notas.",
"Add field" => "Engadir campo",
"Birthday" => "Aniversario",
"Add" => "Engadir",
"Phone" => "Teléfono",
"Email" => "Correo electrónico",
"Instant Messaging" => "Mensaxería instantánea",
"Address" => "Enderezo",
"Note" => "Nota",
"Download contact" => "Descargar contacto",
"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",
"Delete email address" => "Borrar o enderezo de correo electrónico",
"Enter phone number" => "Introducir número de teléfono",
"Delete phone number" => "Borrar número de teléfono",
"Go to web site" => "Ir ao sitio web",
"View on map" => "Ver no mapa",
"Street address" => "Enderezo da rúa",
"Postal code" => "Código Postal",
"City" => "Cidade",
"Country" => "País",
"Instant Messenger" => "Mensaxería instantánea",
"Delete IM" => "Eliminar o MI",
"Share" => "Compartir",
"Export" => "Exportar",
"Add Contact" => "Engadir contacto",
"Drop photo to upload" => "Solte a foto a subir",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formato personalizado, Nome corto, Nome completo, Inverso ou Inverso con coma",
"Edit name details" => "Editar detalles do nome",
"http://www.somesite.com" => "http://www.unhaligazon.net",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Separate groups with commas" => "Separe grupos con comas",
"Edit groups" => "Editar grupos",
"Enter email address" => "Introduza unha dirección de correo electrónico",
"Edit address details" => "Editar os detalles do enderezo",
"Add notes here." => "Engadir aquí as notas.",
"Add field" => "Engadir campo",
"Download contact" => "Descargar contacto",
"The temporary image has been removed from cache." => "A imaxe temporal foi eliminada da caché.",
"Edit address" => "Editar enderezo",
"Edit address" => "Editar o enderezo",
"Type" => "Escribir",
"PO Box" => "Apartado de correos",
"Street and number" => "Rúa e número",
"Extended" => "Ampliado",
"City" => "Cidade",
"Apartment number etc." => "Número de apartamento etc.",
"Region" => "Autonomía",
"E.g. state or province" => "P.ex estado ou provincia",
"Zipcode" => "Código postal",
"Country" => "País",
"Addressbook" => "Axenda",
"Addressbook" => "Caderno de enderezos",
"Hon. prefixes" => "Prefixos honoríficos",
"Miss" => "Srta",
"Ms" => "Sra/Srta",
@ -126,8 +190,7 @@
"Sir" => "Sir",
"Mrs" => "Sra",
"Dr" => "Dr",
"Given name" => "Apodo",
"Additional names" => "Nomes adicionais",
"Given name" => "Alcume",
"Family name" => "Nome familiar",
"Hon. suffixes" => "Sufixos honorarios",
"J.D." => "J.D.",
@ -139,16 +202,19 @@
"Jr." => "Jr.",
"Sn." => "Sn.",
"Import a contacts file" => "Importar un ficheiro de contactos",
"Please choose the addressbook" => "Por favor escolla unha libreta de enderezos",
"create a new addressbook" => "crear unha nova libreta de enderezos",
"Name of new addressbook" => "Nome da nova libreta de enderezos",
"Please choose the addressbook" => "Escolle o caderno de enderezos",
"create a new addressbook" => "crear un novo caderno de enderezos",
"Name of new addressbook" => "Nome do novo caderno de enderezos",
"Importing contacts" => "Importando contactos",
"Add contact" => "Engadir contacto",
"<h3>You have no contacts in your addressbook.</h3><p>You can import VCF files by dragging them to the contacts list and either drop them on an addressbook to import into it, or on an empty spot to create a new addressbook and import into that.<br />You can also import by clicking on the import button at the bottom of the list.</p>" => "<h3>Non tes contactos no teu caderno de enderezos.</h3><p>Podes importar ficheiros VCF arrastrándoos á lista de contactos ou ben tirándoos enriba do caderno de enderezos para importalos alí. Tamén arrastrándoos e deixándoos nun punto baleiro créase un novo caderno de enderezos e impórtanse alí.<br/>Igualmente podes empregar o botón de importar que tes no fondo da lista.</p>",
"Select Address Books" => "Escoller o cadernos de enderezos",
"CardDAV syncing addresses" => "Enderezos CardDAV a sincronizar",
"more info" => "máis información",
"Primary address (Kontact et al)" => "Enderezo primario (Kontact et al)",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "Axendas",
"New Address Book" => "Nova axenda",
"Addressbooks" => "Caderno de enderezos",
"New Address Book" => "Novo caderno de enderezos",
"Name" => "Nome",
"Description" => "Descrición",
"Save" => "Gardar"
);

View File

@ -8,13 +8,8 @@
"No address books found." => "לא נמצאו פנקסי כתובות.",
"No contacts found." => "לא נמצאו אנשי קשר.",
"element name is not set." => "שם האלמנט לא נקבע.",
"Cannot add empty property." => "לא ניתן להוסיף מאפיין ריק.",
"At least one of the address fields has to be filled out." => "יש למלא לפחות אחד משדות הכתובת.",
"Trying to add duplicate property: " => "ניסיון להוספת מאפיין כפול: ",
"Information about vCard is incorrect. Please reload the page." => "המידע אודות vCard אינו נכון. נא לטעון מחדש את הדף.",
"Missing ID" => "מזהה חסר",
"Error parsing VCard for ID: \"" => "שגיאה בפענוח ה VCard עבור מספר המזהה: \"",
"checksum is not set." => "סיכום ביקורת לא נקבע.",
"Information about vCard is incorrect. Please reload the page." => "המידע אודות vCard אינו נכון. נא לטעון מחדש את הדף.",
"Information about vCard is incorrect. Please reload the page: " => "המידע עבור ה vCard אינו נכון. אנא טען את העמוד: ",
"Something went FUBAR. " => "משהו לא התנהל כצפוי.",
"No contact ID was submitted." => "מספר מזהה של אישר הקשר לא נשלח.",
@ -37,14 +32,18 @@
"No file was uploaded" => "שום קובץ לא הועלה",
"Missing a temporary folder" => "תקיה זמנית חסרה",
"Contacts" => "אנשי קשר",
"Error" => "שגיאה",
"Unable to upload your file as it is a directory or has 0 bytes" => "לא יכול להעלות את הקובץ מכיוון שזו תקיה או שמשקל הקובץ 0 בתים",
"Upload Error" => "שגיאת העלאה",
"Upload too large" => "העלאה גדולה מידי",
"Pending" => "ממתין",
"Download" => "הורדה",
"Edit" => "עריכה",
"Delete" => "מחיקה",
"Cancel" => "ביטול",
"This is not your addressbook." => "זהו אינו ספר הכתובות שלך",
"Contact could not be found." => "לא ניתן לאתר איש קשר",
"Work" => "עבודה",
"Home" => "בית",
"Other" => "אחר",
"Mobile" => "נייד",
"Text" => "טקסט",
"Voice" => "קולי",
@ -53,49 +52,58 @@
"Video" => "וידאו",
"Pager" => "זימונית",
"Internet" => "אינטרנט",
"Birthday" => "יום הולדת",
"{name}'s Birthday" => "יום ההולדת של {name}",
"Contact" => "איש קשר",
"Add Contact" => "הוספת איש קשר",
"Settings" => "הגדרות",
"Import" => "יבא",
"Drop photo to upload" => "גרור ושחרר תמונה בשביל להעלות",
"OK" => "אישור",
"Groups" => "קבוצות",
"Close" => "סגירה",
"Add contact" => "הוסף איש קשר",
"Delete current photo" => "מחק תמונה נוכחית",
"Edit current photo" => "ערוך תמונה נוכחית",
"Upload new photo" => "העלה תמונה חדשה",
"Select photo from ownCloud" => "בחר תמונה מ ownCloud",
"Edit name details" => "ערוך פרטי שם",
"Organization" => "ארגון",
"Additional names" => "שמות נוספים",
"Nickname" => "כינוי",
"Enter nickname" => "הכנס כינוי",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Groups" => "קבוצות",
"Separate groups with commas" => "הפרד קבוצות עם פסיקים",
"Edit groups" => "ערוך קבוצות",
"Title" => "כותרת",
"Organization" => "ארגון",
"Birthday" => "יום הולדת",
"Add" => "הוספה",
"Phone" => "טלפון",
"Email" => "דואר אלקטרוני",
"Address" => "כתובת",
"Note" => "הערה",
"Delete contact" => "מחיקת איש קשר",
"Preferred" => "מועדף",
"Please specify a valid email address." => "אנא הזן כתובת דוא\"ל חוקית",
"Enter email address" => "הזן כתובת דוא\"ל",
"Mail to address" => "כתובת",
"Delete email address" => "מחק כתובת דוא\"ל",
"Enter phone number" => "הכנס מספר טלפון",
"Delete phone number" => "מחק מספר טלפון",
"View on map" => "ראה במפה",
"City" => "עיר",
"Country" => "מדינה",
"Share" => "שתף",
"Export" => "יצוא",
"Add Contact" => "הוספת איש קשר",
"Drop photo to upload" => "גרור ושחרר תמונה בשביל להעלות",
"Edit name details" => "ערוך פרטי שם",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Separate groups with commas" => "הפרד קבוצות עם פסיקים",
"Edit groups" => "ערוך קבוצות",
"Enter email address" => "הזן כתובת דוא\"ל",
"Edit address details" => "ערוך פרטי כתובת",
"Add notes here." => "הוסף הערות כאן.",
"Add field" => "הוסף שדה",
"Phone" => "טלפון",
"Email" => "דואר אלקטרוני",
"Address" => "כתובת",
"Note" => "הערה",
"Download contact" => "הורדת איש קשר",
"Delete contact" => "מחיקת איש קשר",
"Edit address" => "ערוך כתובת",
"Type" => "סוג",
"PO Box" => "תא דואר",
"Extended" => "מורחב",
"City" => "עיר",
"Region" => "אזור",
"Zipcode" => "מיקוד",
"Country" => "מדינה",
"Addressbook" => "פנקס כתובות",
"Hon. prefixes" => "קידומות שם",
"Miss" => "גב'",
@ -105,7 +113,6 @@
"Mrs" => "גב'",
"Dr" => "ד\"ר",
"Given name" => "שם",
"Additional names" => "שמות נוספים",
"Family name" => "שם משפחה",
"Hon. suffixes" => "סיומות שם",
"J.D." => "J.D.",
@ -121,12 +128,12 @@
"create a new addressbook" => "צור ספר כתובות חדש",
"Name of new addressbook" => "שם ספר כתובות החדש",
"Importing contacts" => "מיבא אנשי קשר",
"Add contact" => "הוסף איש קשר",
"CardDAV syncing addresses" => "CardDAV מסנכרן כתובות",
"more info" => "מידע נוסף",
"Primary address (Kontact et al)" => "כתובת ראשית",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "פנקסי כתובות",
"New Address Book" => "פנקס כתובות חדש",
"Name" => "שם",
"Save" => "שמירה"
);

View File

@ -8,13 +8,8 @@
"No address books found." => "Nema adresara.",
"No contacts found." => "Nema kontakata.",
"element name is not set." => "naziv elementa nije postavljen.",
"Cannot add empty property." => "Prazno svojstvo se ne može dodati.",
"At least one of the address fields has to be filled out." => "Morate ispuniti barem jedno od adresnih polja.",
"Trying to add duplicate property: " => "Pokušali ste dodati duplo svojstvo:",
"Information about vCard is incorrect. Please reload the page." => "Informacija o vCard je neispravna. Osvježite stranicu.",
"Missing ID" => "Nedostupan ID identifikator",
"Error parsing VCard for ID: \"" => "Pogreška pri raščlanjivanju VCard za ID:",
"checksum is not set." => "checksum nije postavljen.",
"Information about vCard is incorrect. Please reload the page." => "Informacija o vCard je neispravna. Osvježite stranicu.",
"Information about vCard is incorrect. Please reload the page: " => "Informacije o VCard su pogrešne. Molimo, učitajte ponovno stranicu:",
"Something went FUBAR. " => "Nešto je otišlo... krivo...",
"No contact ID was submitted." => "ID kontakta nije podnešen.",
@ -33,12 +28,15 @@
"No file was uploaded" => "Datoteka nije poslana",
"Missing a temporary folder" => "Nedostaje privremeni direktorij",
"Contacts" => "Kontakti",
"Error" => "Greška",
"Unable to upload your file as it is a directory or has 0 bytes" => "Nemoguće poslati datoteku jer je prazna ili je direktorij",
"Upload Error" => "Pogreška pri slanju",
"Upload too large" => "Prijenos je preobiman",
"Pending" => "U tijeku",
"Download" => "Preuzimanje",
"Edit" => "Uredi",
"Delete" => "Obriši",
"Cancel" => "Prekini",
"This is not your addressbook." => "Ovo nije vaš adresar.",
"Contact could not be found." => "Kontakt ne postoji.",
"Jabber" => "Jabber",
"AIM" => "AIM",
"MSN" => "MSN",
@ -52,6 +50,7 @@
"GaduGadu" => "GaduGadu",
"Work" => "Posao",
"Home" => "Kuća",
"Other" => "ostali",
"Mobile" => "Mobitel",
"Text" => "Tekst",
"Voice" => "Glasovno",
@ -60,57 +59,63 @@
"Video" => "Video",
"Pager" => "Pager",
"Internet" => "Internet",
"Birthday" => "Rođendan",
"{name}'s Birthday" => "{name} Rođendan",
"Contact" => "Kontakt",
"Add Contact" => "Dodaj kontakt",
"Settings" => "Postavke",
"Import" => "Uvezi",
"Groups" => "Grupe",
"Close" => "Zatvori",
"Drop photo to upload" => "Dovucite fotografiju za slanje",
"Add contact" => "Dodaj kontakt",
"Delete current photo" => "Izbriši trenutnu sliku",
"Edit current photo" => "Uredi trenutnu sliku",
"Upload new photo" => "Učitaj novu sliku",
"Edit name details" => "Uredi detalje imena",
"Organization" => "Organizacija",
"Additional names" => "sredenje ime",
"Nickname" => "Nadimak",
"Enter nickname" => "Unesi nadimank",
"http://www.somesite.com" => "http://www.somesite.com",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Groups" => "Grupe",
"Separate groups with commas" => "Razdvoji grupe sa zarezom",
"Edit groups" => "Uredi grupe",
"Preferred" => "Preferirano",
"Please specify a valid email address." => "Upiši važeću email adresu.",
"Enter email address" => "Unesi email adresu",
"Delete email address" => "Izbriši email adresu",
"Enter phone number" => "Unesi broj telefona",
"Delete phone number" => "Izbriši broj telefona",
"View on map" => "Prikaži na karti",
"Edit address details" => "Uredi detalje adrese",
"Add notes here." => "Dodaj bilješke ovdje.",
"Add field" => "Dodaj polje",
"Title" => "Naslov",
"Organization" => "Organizacija",
"Birthday" => "Rođendan",
"Add" => "Dodaj",
"Phone" => "Telefon",
"Email" => "E-mail",
"Address" => "Adresa",
"Note" => "Bilješka",
"Download contact" => "Preuzmi kontakt",
"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",
"Enter phone number" => "Unesi broj telefona",
"Delete phone number" => "Izbriši broj telefona",
"View on map" => "Prikaži na karti",
"City" => "Grad",
"Country" => "Država",
"Share" => "Podijeli",
"Export" => "Izvoz",
"Add Contact" => "Dodaj kontakt",
"Drop photo to upload" => "Dovucite fotografiju za slanje",
"Edit name details" => "Uredi detalje imena",
"http://www.somesite.com" => "http://www.somesite.com",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Separate groups with commas" => "Razdvoji grupe sa zarezom",
"Edit groups" => "Uredi grupe",
"Enter email address" => "Unesi email adresu",
"Edit address details" => "Uredi detalje adrese",
"Add notes here." => "Dodaj bilješke ovdje.",
"Add field" => "Dodaj polje",
"Download contact" => "Preuzmi kontakt",
"Edit address" => "Uredi adresu",
"Type" => "Tip",
"PO Box" => "Poštanski Pretinac",
"Extended" => "Prošireno",
"City" => "Grad",
"Region" => "Regija",
"Zipcode" => "Poštanski broj",
"Country" => "Država",
"Addressbook" => "Adresar",
"Given name" => "Ime",
"Additional names" => "sredenje ime",
"Family name" => "Prezime",
"Add contact" => "Dodaj kontakt",
"more info" => "više informacija",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "Adresari",
"New Address Book" => "Novi adresar",
"Name" => "Ime",
"Save" => "Spremi"
);

View File

@ -8,13 +8,8 @@
"No address books found." => "Nem található címlista",
"No contacts found." => "Nem található kontakt",
"element name is not set." => "az elem neve nincs beállítva",
"Cannot add empty property." => "Nem adható hozzá üres tulajdonság",
"At least one of the address fields has to be filled out." => "Legalább egy címmező kitöltendő",
"Trying to add duplicate property: " => "Kísérlet dupla tulajdonság hozzáadására: ",
"Information about vCard is incorrect. Please reload the page." => "A vCardról szóló információ helytelen. Töltsd újra az oldalt.",
"Missing ID" => "Hiányzó ID",
"Error parsing VCard for ID: \"" => "VCard elemzése sikertelen a következő ID-hoz: \"",
"checksum is not set." => "az ellenőrzőösszeg nincs beállítva",
"Information about vCard is incorrect. Please reload the page." => "A vCardról szóló információ helytelen. Töltsd újra az oldalt.",
"Information about vCard is incorrect. Please reload the page: " => "Helytelen információ a vCardról. Töltse újra az oldalt: ",
"Something went FUBAR. " => "Valami balul sült el.",
"No contact ID was submitted." => "Nincs ID megadva a kontakthoz",
@ -43,29 +38,25 @@
"Couldn't load temporary image: " => "Ideiglenes kép betöltése sikertelen",
"No file was uploaded. Unknown error" => "Nem történt feltöltés. Ismeretlen hiba",
"Contacts" => "Kapcsolatok",
"Sorry, this functionality has not been implemented yet" => "Sajnáljuk, ez a funkció még nem támogatott",
"Not implemented" => "Nem támogatott",
"Couldn't get a valid address." => "Érvényes cím lekérése sikertelen",
"Select photo" => "Fotó kiválasztása",
"Error" => "Hiba",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formátum egyedi, Rövid név, Teljes név, Visszafelé vagy Visszafelé vesszővel",
"Select type" => "Típus kiválasztása",
"This property has to be non-empty." => "Ezt a tulajdonságot muszáj kitölteni",
"Couldn't serialize elements." => "Sorbarakás sikertelen",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "A 'deleteProperty' argumentum nélkül lett meghívva. Kérjük, jelezze a hibát.",
"Edit name" => "Név szerkesztése",
"No files selected for upload." => "Nincs kiválasztva feltöltendő fájl",
"Unable to upload your file as it is a directory or has 0 bytes" => "Nem tölthető fel, mert mappa volt, vagy 0 byte méretű",
"Upload Error" => "Feltöltési hiba",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "A feltöltendő fájl mérete meghaladja a megengedett mértéket",
"Upload too large" => "A feltöltési méret túl nagy",
"Pending" => "Folyamatban",
"No files selected for upload." => "Nincs kiválasztva feltöltendő fájl",
"Result: " => "Eredmény: ",
" imported, " => " beimportálva, ",
" failed." => " sikertelen",
"Displayname cannot be empty." => "Megjelenített név kitöltendő",
"Download" => "Letöltés",
"Edit" => "Szerkesztés",
"Delete" => "Törlés",
"Cancel" => "Mégsem",
"This is not your addressbook." => "Ez nem a te címjegyzéked.",
"Contact could not be found." => "Kapcsolat nem található.",
"Work" => "Munkahelyi",
"Home" => "Otthoni",
"Other" => "Egyéb",
"Mobile" => "Mobiltelefonszám",
"Text" => "Szöveg",
"Voice" => "Hang",
@ -74,51 +65,60 @@
"Video" => "Video",
"Pager" => "Személyhívó",
"Internet" => "Internet",
"Birthday" => "Születésnap",
"{name}'s Birthday" => "{name} születésnapja",
"Contact" => "Kapcsolat",
"Add Contact" => "Kapcsolat hozzáadása",
"Settings" => "Beállítások",
"Import" => "Import",
"OK" => "OK",
"Groups" => "Csoportok",
"Close" => "Bezár",
"Drop photo to upload" => "Húzza ide a feltöltendő képet",
"Add contact" => "Kapcsolat hozzáadása",
"Delete current photo" => "Aktuális kép törlése",
"Edit current photo" => "Aktuális kép szerkesztése",
"Upload new photo" => "Új kép feltöltése",
"Select photo from ownCloud" => "Kép kiválasztása ownCloud-ból",
"Edit name details" => "Név részleteinek szerkesztése",
"Organization" => "Szervezet",
"Additional names" => "További nevek",
"Nickname" => "Becenév",
"Enter nickname" => "Becenév megadása",
"dd-mm-yyyy" => "yyyy-mm-dd",
"Groups" => "Csoportok",
"Separate groups with commas" => "Vesszővel válassza el a csoportokat",
"Edit groups" => "Csoportok szerkesztése",
"Title" => "Felirat",
"Organization" => "Szervezet",
"Birthday" => "Születésnap",
"Add" => "Hozzáad",
"Phone" => "Telefonszám",
"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",
"Enter email address" => "Adja meg az email címet",
"Mail to address" => "Postai cím",
"Delete email address" => "Email cím törlése",
"Enter phone number" => "Adja meg a telefonszámot",
"Delete phone number" => "Telefonszám törlése",
"View on map" => "Megtekintés a térképen",
"City" => "Város",
"Country" => "Ország",
"Share" => "Megosztás",
"Export" => "Exportálás",
"Add Contact" => "Kapcsolat hozzáadása",
"Drop photo to upload" => "Húzza ide a feltöltendő képet",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formátum egyedi, Rövid név, Teljes név, Visszafelé vagy Visszafelé vesszővel",
"Edit name details" => "Név részleteinek szerkesztése",
"dd-mm-yyyy" => "yyyy-mm-dd",
"Separate groups with commas" => "Vesszővel válassza el a csoportokat",
"Edit groups" => "Csoportok szerkesztése",
"Enter email address" => "Adja meg az email címet",
"Edit address details" => "Cím részleteinek szerkesztése",
"Add notes here." => "Megjegyzések",
"Add field" => "Mező hozzáadása",
"Phone" => "Telefonszám",
"Email" => "E-mail",
"Address" => "Cím",
"Note" => "Jegyzet",
"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",
"PO Box" => "Postafiók",
"Extended" => "Kiterjesztett",
"City" => "Város",
"Region" => "Megye",
"Zipcode" => "Irányítószám",
"Country" => "Ország",
"Addressbook" => "Címlista",
"Hon. prefixes" => "Előtag",
"Miss" => "Miss",
@ -128,7 +128,6 @@
"Mrs" => "Mrs",
"Dr" => "Dr.",
"Given name" => "Teljes név",
"Additional names" => "További nevek",
"Family name" => "Családnév",
"Hon. suffixes" => "Utótag",
"J.D." => "J.D.",
@ -144,12 +143,12 @@
"create a new addressbook" => "Címlista létrehozása",
"Name of new addressbook" => "Új címlista neve",
"Importing contacts" => "Kapcsolatok importálása",
"Add contact" => "Kapcsolat hozzáadása",
"CardDAV syncing addresses" => "CardDAV szinkronizációs címek",
"more info" => "további információ",
"Primary address (Kontact et al)" => "Elsődleges cím",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "Címlisták",
"New Address Book" => "Új címlista",
"Name" => "Név",
"Save" => "Mentés"
);

View File

@ -1,20 +1,20 @@
<?php $TRANSLATIONS = array(
"No address books found." => "Nulle adressario trovate",
"No contacts found." => "Nulle contactos trovate.",
"Cannot add empty property." => "Non pote adder proprietate vacue.",
"Error saving temporary file." => "Error durante le scriptura in le file temporari",
"Error loading image." => "Il habeva un error durante le cargamento del imagine.",
"The uploaded file was only partially uploaded" => "Le file incargate solmente esseva incargate partialmente",
"No file was uploaded" => "Nulle file esseva incargate.",
"Missing a temporary folder" => "Manca un dossier temporari",
"Contacts" => "Contactos",
"Upload too large" => "Incargamento troppo longe",
"Download" => "Discargar",
"Edit" => "Modificar",
"Delete" => "Deler",
"Cancel" => "Cancellar",
"This is not your addressbook." => "Iste non es tu libro de adresses",
"Contact could not be found." => "Contacto non poterea esser legite",
"Work" => "Travalio",
"Home" => "Domo",
"Other" => "Altere",
"Mobile" => "Mobile",
"Text" => "Texto",
"Voice" => "Voce",
@ -23,41 +23,49 @@
"Video" => "Video",
"Pager" => "Pager",
"Internet" => "Internet",
"Birthday" => "Anniversario",
"Contact" => "Contacto",
"Add Contact" => "Adder contacto",
"Settings" => "Configurationes",
"Import" => "Importar",
"Groups" => "Gruppos",
"Close" => "Clauder",
"Add contact" => "Adder adressario",
"Delete current photo" => "Deler photo currente",
"Edit current photo" => "Modificar photo currente",
"Upload new photo" => "Incargar nove photo",
"Select photo from ownCloud" => "Seliger photo ex ownCloud",
"Organization" => "Organisation",
"Additional names" => "Nomines additional",
"Nickname" => "Pseudonymo",
"Enter nickname" => "Inserer pseudonymo",
"Groups" => "Gruppos",
"Edit groups" => "Modificar gruppos",
"Preferred" => "Preferite",
"Enter email address" => "Entrar un adresse de e-posta",
"Delete email address" => "Deler adresse de E-posta",
"Enter phone number" => "Entrar un numero de telephono",
"Delete phone number" => "Deler numero de telephono",
"View on map" => "Vider in un carta",
"Add notes here." => "Adder notas hic",
"Add field" => "Adder campo",
"Title" => "Titulo",
"Organization" => "Organisation",
"Birthday" => "Anniversario",
"Add" => "Adder",
"Phone" => "Phono",
"Email" => "E-posta",
"Address" => "Adresse",
"Note" => "Nota",
"Download contact" => "Discargar contacto",
"Delete contact" => "Deler contacto",
"Preferred" => "Preferite",
"Delete email address" => "Deler adresse de E-posta",
"Enter phone number" => "Entrar un numero de telephono",
"Delete phone number" => "Deler numero de telephono",
"View on map" => "Vider in un carta",
"City" => "Citate",
"Country" => "Pais",
"Share" => "Compartir",
"Export" => "Exportar",
"Add Contact" => "Adder contacto",
"Edit groups" => "Modificar gruppos",
"Enter email address" => "Entrar un adresse de e-posta",
"Add notes here." => "Adder notas hic",
"Add field" => "Adder campo",
"Download contact" => "Discargar contacto",
"Edit address" => "Modificar adresses",
"Type" => "Typo",
"PO Box" => "Cassa postal",
"Extended" => "Extendite",
"City" => "Citate",
"Region" => "Region",
"Zipcode" => "Codice postal",
"Country" => "Pais",
"Addressbook" => "Adressario",
"Hon. prefixes" => "Prefixos honorific",
"Miss" => "Senioretta",
@ -65,17 +73,16 @@
"Mrs" => "Sra.",
"Dr" => "Dr.",
"Given name" => "Nomine date",
"Additional names" => "Nomines additional",
"Family name" => "Nomine de familia",
"Hon. suffixes" => "Suffixos honorific",
"Import a contacts file" => "Importar un file de contactos",
"Please choose the addressbook" => "Per favor selige le adressario",
"create a new addressbook" => "Crear un nove adressario",
"Name of new addressbook" => "Nomine del nove gruppo:",
"Add contact" => "Adder adressario",
"more info" => "plus info",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "Adressarios",
"New Address Book" => "Nove adressario",
"Name" => "Nomine",
"Save" => "Salveguardar"
);

View File

@ -1,15 +1,26 @@
<?php $TRANSLATIONS = array(
"No categories selected for deletion." => "Tidak ada kategori terpilih untuk penghapusan.",
"No contacts found." => "kontak tidak ditemukan",
"Cannot add empty property." => "tidak dapat menambahkan properti kosong",
"At least one of the address fields has to be filled out." => "setidaknya satu dari alamat wajib di isi",
"File doesn't exist:" => "file tidak ditemukan:",
"There is no error, the file uploaded with success" => "Tidak ada galat, berkas sukses diunggah",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "File yang diunggah melampaui directive upload_max_filesize di php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "File yang diunggah melampaui directive MAX_FILE_SIZE yang disebutan dalam form HTML.",
"The uploaded file was only partially uploaded" => "Berkas hanya diunggah sebagian",
"No file was uploaded" => "Tidak ada berkas yang diunggah",
"Missing a temporary folder" => "Kehilangan folder temporer",
"Contacts" => "kontak",
"Error" => "kesalahan",
"Importing..." => "mengimpor...",
"Unable to upload your file as it is a directory or has 0 bytes" => "Gagal mengunggah berkas anda karena berupa direktori atau mempunyai ukuran 0 byte",
"Upload Error" => "Terjadi Galat Pengunggahan",
"Pending" => "Menunggu",
"Download" => "unduh",
"Edit" => "ubah",
"Delete" => "hapus",
"Cancel" => "batal",
"Contact could not be found." => "kontak tidak dapat ditemukan",
"Work" => "pekerjaan",
"Home" => "rumah",
"Other" => "Lainnya",
"Mobile" => "ponsel",
"Text" => "teks",
"Voice" => "suara",
@ -18,30 +29,39 @@
"Video" => "video",
"Pager" => "pager",
"Internet" => "internet",
"Birthday" => "tanggal lahir",
"{name}'s Birthday" => "hari ulang tahun {name}",
"Contact" => "kontak",
"Add Contact" => "tambah kontak",
"Edit name details" => "ubah detail nama",
"Organization" => "organisasi",
"Settings" => "pengaturan",
"Import" => "impor",
"Groups" => "grup",
"Close" => "tutup",
"Nickname" => "nama panggilan",
"Enter nickname" => "masukkan nama panggilan",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Groups" => "grup",
"Separate groups with commas" => "pisahkan grup dengan tanda koma",
"Preferred" => "disarankan",
"Organization" => "organisasi",
"Birthday" => "tanggal lahir",
"Add" => "tambah",
"Phone" => "telefon",
"Email" => "surel",
"Address" => "alamat",
"Download contact" => "unduk kontak",
"Delete contact" => "hapus kontak",
"Preferred" => "disarankan",
"City" => "kota",
"Country" => "negara",
"Share" => "berbagi",
"Export" => "ekspor",
"Add Contact" => "tambah kontak",
"Edit name details" => "ubah detail nama",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Separate groups with commas" => "pisahkan grup dengan tanda koma",
"Download contact" => "unduk kontak",
"Type" => "tipe",
"PO Box" => "PO box",
"City" => "kota",
"Region" => "daerah",
"Zipcode" => "kodepos",
"Country" => "negara",
"Addressbook" => "buku alamat",
"more info" => "lebih lanjut",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "buku alamat",
"Name" => "nama",
"Save" => "simpan"
);

3
l10n/is.php Normal file
View File

@ -0,0 +1,3 @@
<?php $TRANSLATIONS = array(
"Add" => "Bæta"
);

View File

@ -2,24 +2,24 @@
"Error (de)activating addressbook." => "Errore nel (dis)attivare la rubrica.",
"id is not set." => "ID non impostato.",
"Cannot update addressbook with an empty name." => "Impossibile aggiornare una rubrica senza nome.",
"No category name given." => "Nessun nome di categoria specificato.",
"Error adding group." => "Errore durante l'aggiunta del gruppo.",
"Group ID missing from request." => "ID del gruppo mancante nella richiesta.",
"Contact ID missing from request." => "ID del contatta mancante nella richiesta.",
"No ID provided" => "Nessun ID fornito",
"Error setting checksum." => "Errore di impostazione del codice di controllo.",
"No categories selected for deletion." => "Nessuna categoria selezionata per l'eliminazione.",
"No address books found." => "Nessuna rubrica trovata.",
"No contacts found." => "Nessun contatto trovato.",
"element name is not set." => "il nome dell'elemento non è impostato.",
"Could not parse contact: " => "Impossibile elaborare il contatto: ",
"Cannot add empty property." => "Impossibile aggiungere una proprietà vuota.",
"At least one of the address fields has to be filled out." => "Deve essere inserito almeno un indirizzo.",
"Trying to add duplicate property: " => "P",
"Missing IM parameter." => "Parametro IM mancante.",
"Unknown IM: " => "IM sconosciuto:",
"Information about vCard is incorrect. Please reload the page." => "Informazioni sulla vCard non corrette. Ricarica la pagina.",
"Missing ID" => "ID mancante",
"Error parsing VCard for ID: \"" => "Errore in fase di elaborazione del file VCard per l'ID: \"",
"checksum is not set." => "il codice di controllo non è impostato.",
"Information about vCard is incorrect. Please reload the page." => "Informazioni sulla vCard non corrette. Ricarica la pagina.",
"Couldn't find vCard for %d." => "Impossibile trovare una vCard per %d.",
"Information about vCard is incorrect. Please reload the page: " => "Le informazioni della vCard non sono corrette. Ricarica la pagina: ",
"Something went FUBAR. " => "Qualcosa è andato storto. ",
"Cannot save property of type \"%s\" as array" => "Impossibile salvare la proprietà \"%s\" come array",
"Missing IM parameter." => "Parametro IM mancante.",
"Unknown IM: " => "IM sconosciuto:",
"No contact ID was submitted." => "Nessun ID di contatto inviato.",
"Error reading contact photo." => "Errore di lettura della foto del contatto.",
"Error saving temporary file." => "Errore di salvataggio del file temporaneo.",
@ -35,6 +35,9 @@
"Error cropping image" => "Errore di ritaglio dell'immagine",
"Error creating temporary image" => "Errore durante la creazione dell'immagine temporanea",
"Error finding image: " => "Errore durante la ricerca dell'immagine: ",
"Key is not set for: " => "Chiave non impostata per:",
"Value is not set for: " => "Valore non impostato per:",
"Could not set preference: " => "Impossibile impostare la preferenza:",
"Error uploading contacts to storage." => "Errore di invio dei contatti in archivio.",
"There is no error, the file uploaded with success" => "Non ci sono errori, il file è stato inviato correttamente",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Il file inviato supera la direttiva upload_max_filesize nel php.ini",
@ -46,43 +49,53 @@
"Couldn't load temporary image: " => "Impossibile caricare l'immagine temporanea: ",
"No file was uploaded. Unknown error" => "Nessun file è stato inviato. Errore sconosciuto",
"Contacts" => "Contatti",
"Sorry, this functionality has not been implemented yet" => "Siamo spiacenti, questa funzionalità non è stata ancora implementata",
"Not implemented" => "Non implementata",
"Couldn't get a valid address." => "Impossibile ottenere un indirizzo valido.",
"Error" => "Errore",
"Please enter an email address." => "Digita un indirizzo di posta elettronica.",
"Enter name" => "Inserisci il nome",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formato personalizzato, nome breve, nome completo, invertito o invertito con virgola",
"Select type" => "Seleziona tipo",
"%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.",
"Contact is not in this group." => "Il contatto non è in questo gruppo.",
"Contacts are not in this group." => "I contatti non sono in questo gruppo.",
"A group named {group} already exists" => "Un gruppo con nome {group} esiste già",
"You can drag groups to\narrange them as you like." => "Puoi trascinare i gruppi per\norganizzarli come preferisci.",
"All" => "Tutti",
"Favorites" => "Preferiti",
"Shared by {owner}" => "Condiviso da {owner}",
"Indexing contacts" => "Indicizzazione dei contatti",
"Add to..." => "Aggiungi a...",
"Remove from..." => "Rimuovi da...",
"Add group..." => "Aggiungi gruppo...",
"Select photo" => "Seleziona la foto",
"You do not have permission to add contacts to " => "Non hai i permessi per aggiungere contatti a",
"Please select one of your own address books." => "Seleziona una delle tue rubriche.",
"Permission error" => "Errore relativo ai permessi",
"Click to undo deletion of \"" => "Fai clic per annullare l'eliminazione di \"",
"Cancelled deletion of: \"" => "Eliminazione annullata di: \"",
"This property has to be non-empty." => "Questa proprietà non può essere vuota.",
"Couldn't serialize elements." => "Impossibile serializzare gli elementi.",
"Unknown error. Please check logs." => "Errore sconosciuto. Controlla i log.",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' invocata senza l'argomento di tipo. Segnalalo a bugs.owncloud.org",
"Edit name" => "Modifica il nome",
"No files selected for upload." => "Nessun file selezionato per l'invio",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Il file che stai cercando di inviare supera la dimensione massima per l'invio dei file su questo server.",
"Error loading profile picture." => "Errore durante il caricamento dell'immagine di profilo.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Alcuni contatti sono marcati per l'eliminazione, ma non sono stati ancora rimossi. Attendi fino al completamento dell'operazione.",
"Do you want to merge these address books?" => "Vuoi unire queste rubriche?",
"Shared by " => "Condiviso da",
"Upload too large" => "Caricamento troppo grande",
"Only image files can be used as profile picture." => "Per l'immagine del profilo possono essere utilizzati solo file di immagini.",
"Wrong file type" => "Tipo di file errato",
"Your browser doesn't support AJAX upload. Please click on the profile picture to select a photo to upload." => "Il tuo browser non supporta il caricamento AJAX. Fai clic sull'immagine del profilo per selezionare una foto da caricare.",
"Unable to upload your file as it is a directory or has 0 bytes" => "Impossibile caricare il file poiché è una cartella o ha una dimensione di 0 byte",
"Upload Error" => "Errore di caricamento",
"Pending" => "In corso",
"Import done" => "Importazione completata",
"Network or server error. Please inform administrator." => "Errore di rete o del server. Informa l'amministratore.",
"Error adding to group." => "Errore durante l'aggiunta al gruppo.",
"Error removing from group." => "Errore durante la rimozione dal gruppo.",
"There was an error opening a mail composer." => "Si è verificato un errore durante l'apertura del compositore.",
"Deleting done. Click here to cancel reloading." => "Eliminazione completata. Fai clic qui per annullare il ricaricamento.",
"Add address book" => "Aggiungi rubrica",
"Import done. Click here to cancel reloading." => "Importazione completata. Fai clic qui per annullare il ricaricamento.",
"Not all files uploaded. Retrying..." => "Non tutti i file sono stati caricati. Riprovo...",
"Something went wrong with the upload, please retry." => "Qualcosa non ha funzionato durante il caricamento. Prova ancora.",
"Error" => "Errore",
"Importing from {filename}..." => "Importazione da {filename} in corso...",
"{success} imported, {failed} failed." => "{success} importati, {failed} non riusciti.",
"Importing..." => "Importazione in corso...",
"Unable to upload your file as it is a directory or has 0 bytes" => "Impossibile caricare il file poiché è una cartella o ha una dimensione di 0 byte",
"Upload Error" => "Errore di caricamento",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Il file che stai cercando di inviare supera la dimensione massima per l'invio dei file su questo server.",
"Upload too large" => "Caricamento troppo grande",
"Pending" => "In corso",
"Add group" => "Aggiungi gruppo",
"No files selected for upload." => "Nessun file selezionato per l'invio",
"Edit profile picture" => "Modifica l'immagine del profilo",
"Error loading profile picture." => "Errore durante il caricamento dell'immagine di profilo.",
"Enter name" => "Inserisci il nome",
"Enter description" => "Inserisci una descrizione",
"Select addressbook" => "Seleziona rubrica",
"The address book name cannot be empty." => "Il nome della rubrica non può essere vuoto.",
"Is this correct?" => "È corretto?",
"There was an unknown error when trying to delete this contact" => "Si è verificato un errore durante il tentativo di eliminare il contatto.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Alcuni contatti sono marcati per l'eliminazione, ma non sono stati ancora rimossi. Attendi fino al completamento dell'operazione.",
"Click to undo deletion of {num} contacts" => "Un clic per annullare l'eliminazione di {num} contatti",
"Cancelled deletion of {num}" => "Eliminazione di {num} annullata",
"Result: " => "Risultato: ",
" imported, " => " importato, ",
" failed." => " non riuscito.",
@ -100,9 +113,6 @@
"There was an error updating the addressbook." => "Si è verificato un errore durante l'aggiornamento della rubrica.",
"You do not have the permissions to delete this addressbook." => "Non hai i permessi per eliminare questa rubrica.",
"There was an error deleting this addressbook." => "Si è verificato un errore durante l'eliminazione della rubrica.",
"Addressbook not found: " => "Rubrica non trovata:",
"This is not your addressbook." => "Questa non è la tua rubrica.",
"Contact could not be found." => "Il contatto non può essere trovato.",
"Jabber" => "Jabber",
"AIM" => "AIM",
"MSN" => "MSN",
@ -126,19 +136,9 @@
"Video" => "Video",
"Pager" => "Cercapersone",
"Internet" => "Internet",
"Birthday" => "Compleanno",
"Business" => "Lavoro",
"Call" => "Chiama",
"Clients" => "Client",
"Deliverer" => "Corriere",
"Holidays" => "Festività",
"Ideas" => "Idee",
"Journey" => "Viaggio",
"Jubilee" => "Anniversario",
"Meeting" => "Riunione",
"Personal" => "Personale",
"Projects" => "Progetti",
"Questions" => "Domande",
"Friends" => "Amici",
"Family" => "Famiglia",
"There was an error deleting properties for this contact." => "Si è verificato un errore durante l'eliminazione di proprietà del contatto.",
"{name}'s Birthday" => "Data di nascita di {name}",
"Contact" => "Contatto",
"You do not have the permissions to add contacts to this addressbook." => "Non hai i permessi per aggiungere contatti a questa rubrica.",
@ -148,9 +148,22 @@
"Could not find the Addressbook with ID: " => "Impossibile trovare la rubrica con ID:",
"You do not have the permissions to delete this contact." => "Non hai i permessi per eliminare questo contatto.",
"There was an error deleting this contact." => "Si è verificato un errore durante l'eliminazione di questo contatto.",
"Add Contact" => "Aggiungi contatto",
"Import" => "Importa",
"Contact not found." => "Contatto non trovato.",
"HomePage" => "Pagina principale",
"New Group" => "Nuovo gruppo",
"Settings" => "Impostazioni",
"Address books" => "Rubriche",
"Import" => "Importa",
"Select files to import" => "Seleziona i file da importare",
"Select files" => "Seleziona i file",
"Import into:" => "Importa in:",
"OK" => "OK",
"(De-)select all" => "(De)seleziona tutto",
"New Contact" => "Nuovo contatto",
"Download Contact(s)" => "Scarica contatto(i)",
"Groups" => "Gruppi",
"Favorite" => "Preferito",
"Delete Contact" => "Elimina contatto",
"Close" => "Chiudi",
"Keyboard shortcuts" => "Scorciatoie da tastiera",
"Navigation" => "Navigazione",
@ -164,56 +177,83 @@
"Add new contact" => "Aggiungi un nuovo contatto",
"Add new addressbook" => "Aggiungi una nuova rubrica",
"Delete current contact" => "Elimina il contatto corrente",
"Drop photo to upload" => "Rilascia una foto da inviare",
"<h3>You have no contacts in your addressbook.</h3><p>Add a new contact or import existing contacts from a VCF file.</p>" => "<h3>Non ci sono contatti nella tua rubrica.</h3><p>Aggiungi un nuovo contatto o importa contatti esistenti da un file VCF.</p>",
"Add contact" => "Aggiungi contatto",
"Compose mail" => "Componi messaggio",
"Delete group" => "Elimina gruppo",
"Delete current photo" => "Elimina la foto corrente",
"Edit current photo" => "Modifica la foto corrente",
"Upload new photo" => "Invia una nuova foto",
"Select photo from ownCloud" => "Seleziona la foto da ownCloud",
"Edit name details" => "Modifica dettagli del nome",
"Organization" => "Organizzazione",
"First name" => "Nome",
"Additional names" => "Nomi aggiuntivi",
"Last name" => "Cognome",
"Nickname" => "Pseudonimo",
"Enter nickname" => "Inserisci pseudonimo",
"Web site" => "Sito web",
"http://www.somesite.com" => "http://www.somesite.com",
"Go to web site" => "Vai al sito web",
"dd-mm-yyyy" => "gg-mm-aaaa",
"Groups" => "Gruppi",
"Separate groups with commas" => "Separa i gruppi con virgole",
"Edit groups" => "Modifica gruppi",
"Preferred" => "Preferito",
"Please specify a valid email address." => "Specifica un indirizzo email valido",
"Enter email address" => "Inserisci indirizzo email",
"Mail to address" => "Invia per email",
"Delete email address" => "Elimina l'indirizzo email",
"Enter phone number" => "Inserisci il numero di telefono",
"Delete phone number" => "Elimina il numero di telefono",
"Instant Messenger" => "Client di messaggistica istantanea",
"Delete IM" => "Elimina IM",
"View on map" => "Visualizza sulla mappa",
"Edit address details" => "Modifica dettagli dell'indirizzo",
"Add notes here." => "Aggiungi qui le note.",
"Add field" => "Aggiungi campo",
"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",
"Instant Messaging" => "Messaggistica istantanea",
"Address" => "Indirizzo",
"Note" => "Nota",
"Download contact" => "Scarica contatto",
"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",
"Mail to address" => "Invia per email",
"Delete email address" => "Elimina l'indirizzo email",
"Enter phone number" => "Inserisci il numero di telefono",
"Delete phone number" => "Elimina il numero di telefono",
"Go to web site" => "Vai al sito web",
"Delete URL" => "Elimina URL",
"View on map" => "Visualizza sulla mappa",
"Delete address" => "Elimina indirizzo",
"1 Main Street" => "Via principale 1",
"Street address" => "Indirizzo",
"12345" => "12345",
"Postal code" => "CAP",
"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",
"Delete IM" => "Elimina IM",
"Share" => "Condividi",
"Export" => "Esporta",
"CardDAV link" => "Collegamento CardDav",
"Add Contact" => "Aggiungi contatto",
"Drop photo to upload" => "Rilascia una foto da inviare",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formato personalizzato, nome breve, nome completo, invertito o invertito con virgola",
"Edit name details" => "Modifica dettagli del nome",
"http://www.somesite.com" => "http://www.somesite.com",
"dd-mm-yyyy" => "gg-mm-aaaa",
"Separate groups with commas" => "Separa i gruppi con virgole",
"Edit groups" => "Modifica gruppi",
"Enter email address" => "Inserisci indirizzo email",
"Edit address details" => "Modifica dettagli dell'indirizzo",
"Add notes here." => "Aggiungi qui le note.",
"Add field" => "Aggiungi campo",
"Download contact" => "Scarica contatto",
"The temporary image has been removed from cache." => "L'immagine temporanea è stata rimossa dalla cache.",
"Edit address" => "Modifica indirizzo",
"Type" => "Tipo",
"PO Box" => "Casella postale",
"Street address" => "Indirizzo",
"Street and number" => "Via e numero",
"Extended" => "Esteso",
"Apartment number etc." => "Numero appartamento ecc.",
"City" => "Città",
"Region" => "Regione",
"E.g. state or province" => "Ad es. stato o provincia",
"Zipcode" => "CAP",
"Postal code" => "CAP",
"Country" => "Stato",
"Addressbook" => "Rubrica",
"Hon. prefixes" => "Prefissi onorifici",
"Miss" => "Sig.na",
@ -223,7 +263,6 @@
"Mrs" => "Sig.ra",
"Dr" => "Dott.",
"Given name" => "Nome",
"Additional names" => "Nomi aggiuntivi",
"Family name" => "Cognome",
"Hon. suffixes" => "Suffissi onorifici",
"J.D." => "J.D.",
@ -240,15 +279,12 @@
"Name of new addressbook" => "Nome della nuova rubrica",
"Importing contacts" => "Importazione contatti",
"<h3>You have no contacts in your addressbook.</h3><p>You can import VCF files by dragging them to the contacts list and either drop them on an addressbook to import into it, or on an empty spot to create a new addressbook and import into that.<br />You can also import by clicking on the import button at the bottom of the list.</p>" => "<h3>Non hai contatti nella tua rubrica.</h3><p>Puoi importare file VCF trascinandoli sull'elenco dei contatti e rilasciandoli su una rubrica di destinazione o in un punto vuoto per creare una nuova rubrica.<br />Puoi inoltre importare facendo clic sul pulsante di importazione in fondo all'elenco.</p>",
"Add contact" => "Aggiungi contatto",
"Select Address Books" => "Seleziona rubriche",
"Enter description" => "Inserisci una descrizione",
"CardDAV syncing addresses" => "Indirizzi di sincronizzazione CardDAV",
"more info" => "altre informazioni",
"Primary address (Kontact et al)" => "Indirizzo principale (Kontact e altri)",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "Rubriche",
"Share" => "Condividi",
"New Address Book" => "Nuova rubrica",
"Name" => "Nome",
"Description" => "Descrizione",

View File

@ -2,24 +2,24 @@
"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." => "削除するカテゴリが選択されていません。",
"No address books found." => "アドレス帳が見つかりません。",
"No contacts found." => "連絡先が見つかりません。",
"element name is not set." => "要素名が設定されていません。",
"Could not parse contact: " => "連絡先を解析できませんでした:",
"Cannot add empty property." => "項目の新規追加に失敗しました。",
"At least one of the address fields has to be filled out." => "住所の項目のうち1つは入力して下さい。",
"Trying to add duplicate property: " => "重複する属性を追加: ",
"Missing IM parameter." => "IMのパラメータが不足しています。",
"Unknown IM: " => "不明なIM:",
"Information about vCard is incorrect. Please reload the page." => "vCardの情報に誤りがあります。ページをリロードして下さい。",
"Missing ID" => "IDが見つかりません",
"Error parsing VCard for ID: \"" => "VCardからIDの抽出エラー: \"",
"checksum is not set." => "チェックサムが設定されていません。",
"Information about vCard is incorrect. Please reload the page." => "vCardの情報に誤りがあります。ページをリロードして下さい。",
"Couldn't find vCard for %d." => "%d のvCardが見つかりませんでした。",
"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は登録されませんでした。",
"Error reading contact photo." => "連絡先写真の読み込みエラー。",
"Error saving temporary file." => "一時ファイルの保存エラー。",
@ -35,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" => "アップロードファイルは php.ini 内の upload_max_filesize の制限を超えています",
@ -46,43 +49,53 @@
"Couldn't load temporary image: " => "一時的な画像の読み込みができませんでした: ",
"No file was uploaded. Unknown error" => "ファイルは何もアップロードされていません。不明なエラー",
"Contacts" => "連絡先",
"Sorry, this functionality has not been implemented yet" => "申し訳ありません。この機能はまだ実装されていません",
"Not implemented" => "未実装",
"Couldn't get a valid address." => "有効なアドレスを取得できませんでした。",
"Error" => "エラー",
"Please enter an email address." => "メールアドレスを入力してください。",
"Enter name" => "名前を入力",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "編集フォーマット、ショートネーム、フルネーム、逆順、カンマ区切りの逆順",
"Select type" => "タイプを選択",
"%d_selected_contacts" => "%d個の選択された連絡先",
"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" => "写真を選択",
"You do not have permission to add contacts to " => "連絡先を追加する権限がありません",
"Please select one of your own address books." => "アドレス帳を一つ選択してください",
"Permission error" => "権限エラー",
"Click to undo deletion of \"" => "削除の取り消すためにクリックしてください: \"",
"Cancelled deletion of: \"" => "キャンセルされた削除: \"",
"This property has to be non-empty." => "この属性は空にできません。",
"Couldn't serialize elements." => "要素をシリアライズできませんでした。",
"Unknown error. Please check logs." => "不明なエラーです。ログを確認して下さい。",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' は型の引数無しで呼び出されました。bugs.owncloud.org へ報告してください。",
"Edit name" => "名前を編集",
"No files selected for upload." => "アップロードするファイルが選択されていません。",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "アップロードしようとしているファイルは、このサーバの最大ファイルアップロードサイズを超えています。",
"Error loading profile picture." => "プロファイルの画像の読み込みエラー",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "いくつかの連絡先が削除対象としてマークされていますが、まだ削除されていません。削除するまでお待ちください。",
"Do you want to merge these address books?" => "これらのアドレス帳をマージしてもよろしいですか?",
"Shared by " => "共有",
"Upload too large" => "アップロードには大きすぎます。",
"Only image files can be used as profile picture." => "画像ファイルのみがプロファイル写真として使用することができます。",
"Wrong file type" => "誤ったファイルタイプ",
"Your browser doesn't support AJAX upload. Please click on the profile picture to select a photo to upload." => "あなたのブラウザはAJAXのアップロードをサポートしていません。プロファイル写真をクリックしてアップロードする写真を選択してください。",
"Unable to upload your file as it is a directory or has 0 bytes" => "ディレクトリや0バイトのファイルはアップロードできません。",
"Upload Error" => "アップロードエラー",
"Pending" => "中断",
"Import done" => "インポート完了",
"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" => "アップロードエラー",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "アップロードしようとしているファイルは、このサーバの最大ファイルアップロードサイズを超えています。",
"Upload too large" => "アップロードには大きすぎます。",
"Pending" => "中断",
"Add group" => "グループを追加",
"No files selected for upload." => "アップロードするファイルが選択されていません。",
"Edit profile picture" => "プロフィール写真を編集",
"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,9 +113,6 @@
"There was an error updating the addressbook." => "アドレス帳を更新中にエラーが発生しました。",
"You do not have the permissions to delete this addressbook." => "アドレス帳を削除する権限がありません。",
"There was an error deleting this addressbook." => "アドレス帳を削除するときにエラーが発生しました。",
"Addressbook not found: " => "アドレス帳が見つかりません:",
"This is not your addressbook." => "これはあなたの電話帳ではありません。",
"Contact could not be found." => "連絡先を見つける事ができません。",
"Jabber" => "Jabber",
"AIM" => "AIM",
"MSN" => "MSN",
@ -126,19 +136,9 @@
"Video" => "テレビ電話",
"Pager" => "ポケベル",
"Internet" => "インターネット",
"Birthday" => "誕生日",
"Business" => "ビジネス",
"Call" => "電話",
"Clients" => "顧客",
"Deliverer" => "運送会社",
"Holidays" => "休日",
"Ideas" => "アイデア",
"Journey" => "旅行",
"Jubilee" => "記念祭",
"Meeting" => "打ち合わせ",
"Personal" => "個人",
"Projects" => "プロジェクト",
"Questions" => "質問",
"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." => "アドレスブックに連絡先を追加する権限がありません",
@ -148,9 +148,22 @@
"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." => "連絡先を削除するときにエラーが発生しました。",
"Add Contact" => "連絡先の追加",
"Import" => "インポート",
"Contact not found." => "連絡先が見つかりません。",
"HomePage" => "ホームページ",
"New Group" => "新しいグループ",
"Settings" => "設定",
"Address books" => "アドレスブック",
"Import" => "インポート",
"Select files to import" => "インポートするファイルを選択",
"Select files" => "ファイルを選択",
"Import into:" => "インポート情報:",
"OK" => "OK",
"(De-)select all" => "すべての選択を解除",
"New Contact" => "新しい連絡先",
"Download Contact(s)" => "連絡先をダウンロード",
"Groups" => "グループ",
"Favorite" => "お気に入り",
"Delete Contact" => "連絡先を削除",
"Close" => "閉じる",
"Keyboard shortcuts" => "キーボードショートカット",
"Navigation" => "ナビゲーション",
@ -164,56 +177,83 @@
"Add new contact" => "新しい連絡先を追加",
"Add new addressbook" => "新しいアドレス帳を追加",
"Delete current contact" => "現在の連絡先を削除",
"Drop photo to upload" => "写真をドロップしてアップロード",
"<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から写真を選択",
"Edit name details" => "名前の詳細を編集",
"Organization" => "所属",
"First name" => "",
"Additional names" => "ミドルネーム",
"Last name" => "",
"Nickname" => "ニックネーム",
"Enter nickname" => "ニックネームを入力",
"Web site" => "ウェブサイト",
"http://www.somesite.com" => "http://www.somesite.com",
"Go to web site" => "Webサイトへ移動",
"dd-mm-yyyy" => "yyyy-mm-dd",
"Groups" => "グループ",
"Separate groups with commas" => "コンマでグループを分割",
"Edit groups" => "グループを編集",
"Preferred" => "推奨",
"Please specify a valid email address." => "有効なメールアドレスを指定してください。",
"Enter email address" => "メールアドレスを入力",
"Mail to address" => "アドレスへメールを送る",
"Delete email address" => "メールアドレスを削除",
"Enter phone number" => "電話番号を入力",
"Delete phone number" => "電話番号を削除",
"Instant Messenger" => "インスタントメッセンジャー",
"Delete IM" => "IMを削除",
"View on map" => "地図で表示",
"Edit address details" => "住所の詳細を編集",
"Add notes here." => "ここにメモを追加。",
"Add field" => "項目を追加",
"Title" => "タイトル",
"Enter title" => "タイトルを入力",
"Organization" => "所属",
"Enter organization" => "組織を入力",
"Birthday" => "誕生日",
"Notes go here..." => "メモはここに...",
"Export as VCF" => "VCFとしてエクスポート",
"Add" => "追加",
"Phone" => "電話番号",
"Email" => "メールアドレス",
"Instant Messaging" => "インスタントメッセージ",
"Address" => "住所",
"Note" => "メモ",
"Download contact" => "連絡先のダウンロード",
"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" => "電話番号を入力",
"Delete phone number" => "電話番号を削除",
"Go to web site" => "Webサイトへ移動",
"Delete URL" => "URLを削除",
"View on map" => "地図で表示",
"Delete address" => "住所を削除",
"1 Main Street" => "番地",
"Street address" => "住所1",
"12345" => "12345",
"Postal code" => "郵便番号",
"Your city" => "",
"City" => "都市",
"Some region" => "都道府県",
"State or province" => "州/県",
"Your country" => "",
"Country" => "国名",
"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" => "編集フォーマット、ショートネーム、フルネーム、逆順、カンマ区切りの逆順",
"Edit name details" => "名前の詳細を編集",
"http://www.somesite.com" => "http://www.somesite.com",
"dd-mm-yyyy" => "yyyy-mm-dd",
"Separate groups with commas" => "コンマでグループを分割",
"Edit groups" => "グループを編集",
"Enter email address" => "メールアドレスを入力",
"Edit address details" => "住所の詳細を編集",
"Add notes here." => "ここにメモを追加。",
"Add field" => "項目を追加",
"Download contact" => "連絡先のダウンロード",
"The temporary image has been removed from cache." => "一時画像はキャッシュから削除されました。",
"Edit address" => "住所を編集",
"Type" => "種類",
"PO Box" => "私書箱",
"Street address" => "住所1",
"Street and number" => "番地",
"Extended" => "住所2",
"Apartment number etc." => "アパート名等",
"City" => "都市",
"Region" => "都道府県",
"E.g. state or province" => "例:東京都、大阪府",
"Zipcode" => "郵便番号",
"Postal code" => "郵便番号",
"Country" => "国名",
"Addressbook" => "アドレス帳",
"Hon. prefixes" => "敬称",
"Miss" => "Miss",
@ -223,7 +263,6 @@
"Mrs" => "Mrs",
"Dr" => "Dr",
"Given name" => "",
"Additional names" => "ミドルネーム",
"Family name" => "",
"Hon. suffixes" => "称号",
"J.D." => "J.D.",
@ -240,15 +279,12 @@
"Name of new addressbook" => "新しいアドレス帳の名前",
"Importing contacts" => "連絡先をインポート",
"<h3>You have no contacts in your addressbook.</h3><p>You can import VCF files by dragging them to the contacts list and either drop them on an addressbook to import into it, or on an empty spot to create a new addressbook and import into that.<br />You can also import by clicking on the import button at the bottom of the list.</p>" => "<h3>アドレス帳に連絡先がありません。</h3><p>連絡先リストにVCFファイルをドラッグするか、もしくは、アドレス帳にドラッグすることでインポートが可能です。新しいアドレス帳を作成してインポートする場合は、空白スペースにドラッグします。<br />リストの一番下のインポートボタンをクリックしてもインポートすることが可能です。</p>",
"Add contact" => "連絡先を追加",
"Select Address Books" => "アドレス帳を選択してください",
"Enter description" => "説明を入力してください",
"CardDAV syncing addresses" => "CardDAV同期アドレス",
"more info" => "詳細情報",
"Primary address (Kontact et al)" => "プライマリアドレスKontact 他)",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "アドレス帳",
"Share" => "共有",
"New Address Book" => "新規のアドレス帳",
"Name" => "名前",
"Description" => "説明",

View File

@ -1,11 +1,24 @@
<?php $TRANSLATIONS = array(
"No categories selected for deletion." => "სარედაქტირებელი კატეგორია არ არის არჩეული ",
"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 ფაილში",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "ატვირთული ფაილი აჭარბებს MAX_FILE_SIZE დირექტივას, რომელიც მითითებულია HTML ფორმაში",
"The uploaded file was only partially uploaded" => "ატვირთული ფაილი მხოლოდ ნაწილობრივ აიტვირთა",
"No file was uploaded" => "ფაილი არ აიტვირთა",
"Missing a temporary folder" => "დროებითი საქაღალდე არ არსებობს",
"Contacts" => "კონტაქტები",
"Error" => "შეცდომა",
"Unable to upload your file as it is a directory or has 0 bytes" => "თქვენი ფაილის ატვირთვა ვერ მოხერხდა. ის არის საქაღალდე და შეიცავს 0 ბაიტს",
"Upload Error" => "შეცდომა ატვირთვისას",
"Upload too large" => "ასატვირთი ფაილი ძალიან დიდია",
"Pending" => "მოცდის რეჟიმში",
"Download" => "ჩამოტვირთვა",
"Edit" => "რედაქტირება",
"Delete" => "წაშლა",
"Cancel" => "უარყოფა",
"Work" => "სამსახური",
"Home" => "სახლი",
"Other" => "სხვა",
"Mobile" => "მობილური",
"Text" => "ტექსტი",
"Voice" => "ხმა",
@ -14,45 +27,52 @@
"Video" => "ვიდეო",
"Pager" => "პეიჯერი",
"Internet" => "ინტერნეტი",
"Birthday" => "დაბადების დრე",
"Business" => "ბიზნესი",
"Clients" => "კლიენტები",
"Contact" => "კონტაქტი",
"Add Contact" => "კონტაქტის დამატება",
"Settings" => "პარამეტრები",
"Import" => "იმპორტი",
"Groups" => "ჯგუფები",
"Close" => "დახურვა",
"Add contact" => "კონტაქტის დამატება",
"Delete current photo" => "მიმდინარე სურათის წაშლა",
"Edit current photo" => "მიმდინარე სურათის რედაქტირება",
"Upload new photo" => "ახალი სურათის ატვირთვა",
"Select photo from ownCloud" => "აირჩიე სურათი ownCloud –იდან",
"Organization" => "ორგანიზაცია",
"Nickname" => "ნიკნეიმი",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Groups" => "ჯგუფები",
"Edit groups" => "ჯგუფების რედაქტირება",
"Enter email address" => "ჩაწერეთ იმეილ მისამართი",
"Add field" => "დაამატე ველი",
"Title" => "სახელი",
"Organization" => "ორგანიზაცია",
"Birthday" => "დაბადების დრე",
"Add" => "დამატება",
"Phone" => "ტელეფონი",
"Email" => "იმეილი",
"Address" => "მისამართი",
"Note" => "შენიშვნა",
"Download contact" => "კონტაქტის ჩამოტვირთვა",
"Delete contact" => "კონტაქტის წაშლა",
"City" => "ქალაქი",
"Country" => "ქვეყანა",
"Share" => "გაზიარება",
"Export" => "ექსპორტი",
"Add Contact" => "კონტაქტის დამატება",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Edit groups" => "ჯგუფების რედაქტირება",
"Enter email address" => "ჩაწერეთ იმეილ მისამართი",
"Add field" => "დაამატე ველი",
"Download contact" => "კონტაქტის ჩამოტვირთვა",
"Edit address" => "მისამართის რედაქტირება",
"Type" => "ტიპი",
"PO Box" => "PO ყუთი",
"Extended" => "Extended",
"City" => "ქალაქი",
"Region" => "რეგიონი",
"Zipcode" => "Zip კოდი",
"Country" => "ქვეყანა",
"Addressbook" => "მისამარტების ზიგნი",
"Miss" => "მისის",
"Ms" => "მის",
"Mr" => "მისტერ",
"Sir" => "სერ",
"Add contact" => "კონტაქტის დამატება",
"more info" => "უფრო მეტი ინფორმაცია",
"Primary address (Kontact et al)" => "პირველადი მისამართი (Kontact et al)",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "მისამართის წიგნები",
"New Address Book" => "ახალი მისამართების წიგნი",
"Name" => "სახელი",
"Save" => "შენახვა"
);

View File

@ -1,89 +1,122 @@
<?php $TRANSLATIONS = array(
"Error (de)activating addressbook." => "주소록을 (비)활성화하는 데 실패했습니다.",
"id is not set." => "아이디가 설정되어 있지 않습니다. ",
"Cannot update addressbook with an empty name." => "주소록에 이름란이 비어있으면 업데이트를 할 수 없습니다. ",
"No ID provided" => "제공되는 아이디 없음",
"Error setting checksum." => "오류 검사합계 설정",
"No categories selected for deletion." => "삭제 카테고리를 선택하지 않았습니다. ",
"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." => "삭제할 분류를 선택하지 않았습니다. ",
"No address books found." => "주소록을 찾을 수 없습니다.",
"No contacts found." => "연락처를 찾을 수 없습니다.",
"element name is not set." => "element 이름이 설정되지 않았습니다.",
"Could not parse contact: " => "연락처를 구분할 수 없습니다:",
"Cannot add empty property." => "빈 속성을 추가할 수 없습니다.",
"At least one of the address fields has to be filled out." => "최소한 하나의 주소록 항목을 입력해야 합니다.",
"Trying to add duplicate property: " => "중복 속성 추가 시도: ",
"Missing IM parameter." => "IM 매개 변수 분실.",
"Unknown IM: " => "알려지지 않은 IM:",
"Information about vCard is incorrect. Please reload the page." => "vCard 정보가 올바르지 않습니다. 페이지를 새로 고치십시오.",
"Missing ID" => "아이디 분실",
"Error parsing VCard for ID: \"" => "아이디에 대한 VCard 분석 오류",
"element name is not set." => "원소 이름이 설정되지 않았습니다.",
"checksum is not set." => "체크섬이 설정되지 않았습니다.",
"Information about vCard is incorrect. Please reload the page: " => " vCard에 대한 정보가 잘못되었습니다. 페이지를 다시 로드하세요:",
"Something went FUBAR. " => "무언가가 FUBAR로 감.",
"No contact ID was submitted." => "접속 아이디가 기입되지 않았습니다.",
"Error reading contact photo." => "사진 읽기 오류",
"Information about vCard is incorrect. Please reload the page." => "vCard 정보가 올바르지 않습니다. 페이지를 새로 고치십시오.",
"Couldn't find vCard for %d." => "%d의 vCard를 찾을 수 없습니다.",
"Information about vCard is incorrect. Please reload the page: " => " vCard 정보가 올바르지 않습니다. 페이지를 새로 고치십시오:",
"Something went FUBAR. " => "알 수 없는 오류가 발생하였습니다.",
"Cannot save property of type \"%s\" as array" => "\"%s\" 형식의 속성을 배열로 저장할 수 없습니다",
"Missing IM parameter." => "IM 매개 변수가 없습니다.",
"Unknown IM: " => "알 수 없는 IM:",
"No contact ID was submitted." => "연락처 ID가 지정되지 않았습니다.",
"Error reading contact photo." => "연락처 사진을 불러올 수 없습니다.",
"Error saving temporary file." => "임시 파일을 저장하는 동안 오류가 발생했습니다. ",
"The loading photo is not valid." => "로딩 사진이 유효하지 않습니다. ",
"Contact ID is missing." => "접속 아이디가 없습니다. ",
"No photo path was submitted." => "사진 경로가 제출되지 않았습니다. ",
"File doesn't exist:" => "파일이 존재하지 않습니다. ",
"Error loading image." => "로딩 이미지 오류입니다.",
"Error getting contact object." => "연락처 체를 가져오는 중 오류가 발생했습니다. ",
"The loading photo is not valid." => "로딩 사진이 올바르지 않습니다. ",
"Contact ID is missing." => "연락처 ID가 없습니다. ",
"No photo path was submitted." => "사진 경로가 지정되지 않았습니다. ",
"File doesn't exist:" => "파일이 존재하지 않습니다:",
"Error loading image." => "그림을 불러올 수 없습니다.",
"Error getting contact object." => "연락처 체를 가져오는 중 오류가 발생했습니다. ",
"Error getting PHOTO property." => "사진 속성을 가져오는 중 오류가 발생했습니다. ",
"Error saving contact." => "연락처 저장 중 오류가 발생했습니다.",
"Error resizing image" => "이미지 크기 조정 중 오류가 발생했습니다.",
"Error cropping image" => "이미지를 자르던 중 오류가 발생했습니다.",
"Error creating temporary image" => "임시 이미지를 생성 중 오류가 발생했습니다.",
"Error finding image: " => "이미지를 찾던 중 오류가 발생했습니다:",
"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" => "php.ini 형식으로 업로드 된 이 파일은 MAX_FILE_SIZE를 초과하였다.",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "HTML형식으로 업로드 된 이 파일은 MAX_FILE_SIZE를 초과하였다.",
"The uploaded file was only partially uploaded" => "이 업로드된 파일은 부분적으로만 업로드 되었습니다.",
"No file was uploaded" => "파일이 업로드 되어있지 않습니다",
"Missing a temporary folder" => "임시 폴더 분실",
"Couldn't save temporary image: " => "임시 이미지를 저장할 수 없습니다:",
"Couldn't load temporary image: " => "임시 이미지를 불러올 수 없습니다. ",
"No file was uploaded. Unknown error" => "파일이 업로드 되지 않았습니다. 알 수 없는 오류.",
"Error resizing image" => "그림 크기 조절 오류",
"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" => "업로드한 파일 크기가 php.ini의 upload_max_filesize보다 큼",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "업로드한 파일 크기가 HTML 폼의 MAX_FILE_SIZE보다 큼",
"The uploaded file was only partially uploaded" => "파일의 일부분만 업로드됨",
"No file was uploaded" => "파일이 업로드되지 않았음",
"Missing a temporary folder" => "임시 폴더가 없음",
"Couldn't save temporary image: " => "임시 그림을 저장할 수 없음:",
"Couldn't load temporary image: " => "임시 그림을 불러올 수 없음:",
"No file was uploaded. Unknown error" => "파일이 업로드되지 않았습니다. 알 수 없는 오류입니다",
"Contacts" => "연락처",
"Sorry, this functionality has not been implemented yet" => "죄송합니다. 이 기능은 아직 구현되지 않았습니다. ",
"Not implemented" => "구현되지 않음",
"Couldn't get a valid address." => "유효한 주소를 얻을 수 없습니다.",
"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" => "오류",
"Enter name" => "이름을 입력",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format custom, Short name, Full name, Reverse or Reverse with comma",
"Select type" => "유형 선택",
"You do not have permission to add contacts to " => "당신은 연락처를 추가 할 수 있는 권한이 없습니다. ",
"Please select one of your own address books." => "당신의 Own 주소록 중 하나만 선택 하세요.",
"Permission error" => "권한 에러",
"This property has to be non-empty." => "이 속성은 비어있어서는 안됩니다.",
"Couldn't serialize elements." => "요소를 직렬화 할 수 없습니다.",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty'가 문서형식이 없이 불려왔습니다. bugs.owncloud.org에 보고해주세요. ",
"Edit name" => "이름 편집",
"No files selected for upload." => "업로드를 위한 파일이 선택되지 않았습니다. ",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "이 파일은 이 서버 파일 업로드 최대 용량을 초과 합니다. ",
"Error loading profile picture." => "프로필 사진 로딩 에러",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "일부 연락처가 삭제 표시 되었으나 아직 삭제되지 않았습니다. 삭제가 끝날 때 까지 기다려 주세요.",
"Do you want to merge these address books?" => "이 주소록을 통합하고 싶으십니까?",
"Result: " => "결과:",
" imported, " => "불러오기,",
" failed." => "실패.",
"Displayname cannot be empty." => "디스플레이 이름은 비워둘 수 없습니다. ",
"Show CardDav link" => "CardDav 링크를 표시",
"Show read-only VCF link" => "읽기전용 VCF 링크 표시",
"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" => "디렉터리 및 빈 파일은 업로드할 수 없습니다",
"Upload Error" => "업로드 오류",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "업로드할 파일이 서버의 최대 업로드 파일 크기를 초과합니다.",
"Upload too large" => "업로드한 파일이 너무 큼",
"Pending" => "대기 중",
"Add group" => "그룹 추가",
"No files selected for upload." => "업로드할 파일이 선택되지 않았습니다.",
"Edit profile picture" => "프로필 사진 편집",
"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." => "개 항목 가져오기 실패.",
"Displayname cannot be empty." => "표시 이름을 입력해야 합니다.",
"Show CardDav link" => "CardDAV 링크 표시",
"Show read-only VCF link" => "읽기 전용 VCF 링크 표시",
"Download" => "다운로드",
"Edit" => "편집",
"Delete" => "삭제",
"Cancel" => "취소",
"More..." => "더...",
"Addressbook not found: " => "주소록을 찾지 못하였습니다:",
"This is not your addressbook." => "내 주소록이 아닙니다.",
"Contact could not be found." => "연락처를 찾을 수 없습니다.",
"More..." => "더 보기...",
"Less..." => "덜 보기...",
"You do not have the permissions to read this addressbook." => "이 주소록을 읽을 수 있는 권한이 없습니다.",
"You do not have the permissions to update this addressbook." => "이 주소록을 업데이트할 수 있는 권한이 없습니다.",
"There was an error updating the addressbook." => "주소록을 업데이트하는 중 오류가 발생하였습니다.",
"You do not have the permissions to delete this addressbook." => "이 주소록을 삭제할 수 있는 권한이 없습니다.",
"There was an error deleting this addressbook." => "이 주소록을 삭제하는 중 오류가 발생하였습니다.",
"Jabber" => "Jabber",
"AIM" => "AIM",
"MSN" => "MSN",
"Twitter" => "Twitter",
"GoogleTalk" => "GoogleTalk",
"GoogleTalk" => "Google 토크",
"Facebook" => "Facebook",
"XMPP" => "XMPP",
"ICQ" => "ICQ",
@ -92,111 +125,143 @@
"QQ" => "QQ",
"GaduGadu" => "GaduGadu",
"Work" => "직장",
"Home" => "자택",
"Other" => "그 외",
"Home" => "가정",
"Other" => "기타",
"Mobile" => "휴대폰",
"Text" => "문자 번호",
"Voice" => "음성 번호",
"Message" => "",
"Fax" => "팩스 번호",
"Video" => "영상 번호",
"Text" => "TTY TDD",
"Voice" => "음성 사서함",
"Message" => "",
"Fax" => "팩스",
"Video" => "화상 전화",
"Pager" => "호출기",
"Internet" => "인터넷",
"Birthday" => "생일",
"Business" => "비즈니스",
"Call" => "전화",
"Clients" => "고객",
"Deliverer" => "운송자",
"Holidays" => "휴가",
"Ideas" => "아이디어",
"Journey" => "여행",
"Jubilee" => "축제",
"Meeting" => "미팅",
"Personal" => "개인의",
"Projects" => "프로젝트",
"Questions" => "질문",
"{name}'s Birthday" => "{이름}의 생일",
"Friends" => "친구",
"Family" => "가족",
"There was an error deleting properties for this contact." => "이 연락처의 속성을 삭제하는 중 오류가 발생하였습니다.",
"{name}'s Birthday" => "{name}의 생일",
"Contact" => "연락처",
"You do not have the permissions to edit this contact." => "당신은 연락처를 수정할 권한이 없습니다. ",
"You do not have the permissions to delete this contact." => "당신은 연락처를 삭제할 권한이 없습니다. ",
"Add Contact" => "연락처 추가",
"Import" => "입력",
"You do not have the permissions to add contacts to this addressbook." => "이 주소록에 연락처를 추가할 수 있는 권한이 없습니다.",
"Could not find the vCard with ID." => "ID로 vCard를 찾을 수 없습니다.",
"You do not have the permissions to edit this contact." => "이 연락처를 수정할 수 있는 권한이 없습니다.",
"Could not find the vCard with ID: " => "다음 ID의 vCard를 찾을 수 없습니다:",
"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" => "단축키",
"Navigation" => "네비게이션",
"Next contact in list" => "목록에서의 다음 연락처",
"Previous contact in list" => "목록에서의 이전 연락처",
"Expand/collapse current addressbook" => "현재 주소록을 확장/축소",
"Keyboard shortcuts" => "키보드 단축키",
"Navigation" => "탐색",
"Next contact in list" => "목록의 다음 연락처",
"Previous contact in list" => "목록의 이전 연락처",
"Expand/collapse current addressbook" => "현재 주소록 펴기/접기",
"Next addressbook" => "다음 주소록",
"Previous addressbook" => "이전 주소록",
"Actions" => "작업",
"Actions" => "",
"Refresh contacts list" => "연락처 목록 새로 고침",
"Add new contact" => "새로운 연락처 추가",
"Add new addressbook" => "로운 주소록 추가",
"Add new contact" => " 연락처 추가",
"Add new addressbook" => " 주소록 추가",
"Delete current contact" => "현재 연락처 삭제",
"Drop photo to upload" => "Drop photo to upload",
"<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에서 사진 선택",
"Edit name details" => "이름 세부사항을 편집합니다. ",
"Organization" => "조직",
"First name" => "이름",
"Additional names" => "추가 이름",
"Last name" => "",
"Nickname" => "별명",
"Enter nickname" => "별명 입력",
"Title" => "직위",
"Enter title" => "제목 입력",
"Organization" => "조직",
"Enter organization" => "조직명 입력",
"Birthday" => "생일",
"Notes go here..." => "메모를 입력하십시오...",
"Add" => "추가",
"Phone" => "전화번호",
"Email" => "이메일",
"Instant Messaging" => "인스턴트 메시징",
"Address" => "주소",
"Note" => "메모",
"Web site" => "웹 사이트",
"http://www.somesite.com" => "http://www.somesite.com",
"Go to web site" => "웹 사이트로 가기",
"dd-mm-yyyy" => "일-월-년",
"Groups" => "그룹",
"Separate groups with commas" => "쉼표로 그룹 구분",
"Edit groups" => "그룹 편집",
"Delete contact" => "연락처 삭제",
"Preferred" => "선호함",
"Please specify a valid email address." => "올바른 이메일 주소를 입력하세요.",
"Enter email address" => "이메일 주소 입력",
"Mail to address" => "이메일 주소",
"Delete email address" => "이메일 주소 삭제",
"Please specify a valid email address." => "올바른 이메일 주소를 입력하십시오.",
"someone@example.com" => "someone@example.com",
"Mail to address" => "메일 보내기",
"Delete email address" => "메일 주소 삭제",
"Enter phone number" => "전화번호 입력",
"Delete phone number" => "전화번호 삭제",
"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" => "인스턴트 메신저",
"Delete IM" => "IM 삭제",
"View on map" => "지도에서 보기",
"Edit address details" => "상세 주소 수정",
"Add notes here." => "여기에 노트 추가.",
"Add field" => "파일 추가",
"Phone" => "전화 번호",
"Email" => "전자 우편",
"Instant Messaging" => "인스턴트 메세지",
"Address" => "주소",
"Note" => "노트",
"Share" => "공유",
"Export" => "내보내기",
"CardDAV link" => "CardDAV 링크",
"Add Contact" => "연락처 추가",
"Drop photo to upload" => "사진을 끌어다 놓아서 업로드",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "사용자 정의 형식,짧은 이름,이름 성,성 이름 및 쉼표로 구분된 성 이름",
"Edit name details" => "이름 정보 편집",
"http://www.somesite.com" => "http://www.somesite.com",
"dd-mm-yyyy" => "yyyy-mm-dd",
"Separate groups with commas" => "쉼표로 그룹 구분",
"Edit groups" => "그룹 편집",
"Enter email address" => "메일 주소 입력",
"Edit address details" => "자세한 정보 편집",
"Add notes here." => "여기에 메모를 추가하십시오.",
"Add field" => "항목 추가",
"Download contact" => "연락처 다운로드",
"Delete contact" => "연락처 삭제",
"The temporary image has been removed from cache." => "임시 이미지가 캐시에서 제거 되었습니다. ",
"Edit address" => "주소 수정",
"The temporary image has been removed from cache." => "임시 그림이 캐시에서 삭제되었습니다. ",
"Edit address" => "주소 편집",
"Type" => "종류",
"PO Box" => "사서함",
"Street address" => "번지",
"Street and number" => "거리와 번호",
"Extended" => "확장",
"Apartment number etc." => "아파트 호수 그 외.",
"City" => "도시",
"Street and number" => "거리 이름 및 번지",
"Extended" => "주소 2",
"Apartment number etc." => "아파트 호수 등",
"Region" => "지역",
"E.g. state or province" => "예를 들어 구 또는 도",
"Zipcode" => "우편 번호",
"Postal code" => "우편 번호",
"Country" => "국가",
"E.g. state or province" => "예: 주 또는 도",
"Zipcode" => "우편번호",
"Addressbook" => "주소록",
"Hon. prefixes" => "Hon. prefixes",
"Hon. prefixes" => "존칭 접두사",
"Miss" => "Miss",
"Ms" => "Ms",
"Mr" => "Mr",
"Sir" => "Sir",
"Mrs" => "Mrs",
"Dr" => "Dr",
"Given name" => "Given name",
"Additional names" => "추가 이름",
"Dr" => "박사",
"Given name" => "이름",
"Family name" => "",
"Hon. suffixes" => "Hon. suffixes",
"Hon. suffixes" => "존칭 접미사",
"J.D." => "J.D.",
"M.D." => "M.D.",
"D.O." => "D.O.",
@ -205,22 +270,20 @@
"Esq." => "Esq.",
"Jr." => "Jr.",
"Sn." => "Sn.",
"Import a contacts file" => "연락처 파일 입력",
"Please choose the addressbook" => "주소록 선택해 주세요.",
"Import a contacts file" => "연락처 파일 가져오기",
"Please choose the addressbook" => "주소록 선택",
"create a new addressbook" => "새 주소록 만들기",
"Name of new addressbook" => "새 주소록 이름",
"Importing contacts" => "연락처 입력",
"Add contact" => "연락처 추가",
"Importing contacts" => "연락처 가져오기",
"<h3>You have no contacts in your addressbook.</h3><p>You can import VCF files by dragging them to the contacts list and either drop them on an addressbook to import into it, or on an empty spot to create a new addressbook and import into that.<br />You can also import by clicking on the import button at the bottom of the list.</p>" => "<h3>현재 주소록에 연락처가 없습니다.</h3><p>주소록 상의 연락처 목록에 VCF 파일을 끌어다 놓아서 업로드하거나, 주소록 목록의 빈 곳에 끌어다 놓으면 주소록을 만들어서 업로드합니다.<br />목록 아래쪽의 가져오기 단추를 눌러서 가져올 수 있습니다.</p>",
"Select Address Books" => "주소록 선택",
"Enter description" => "설명을 입력",
"CardDAV syncing addresses" => "CardDAV 주소 동기화",
"CardDAV syncing addresses" => "CardDAV 동기화 주소",
"more info" => "더 많은 정보",
"Primary address (Kontact et al)" => "기본 주소 (Kontact et al)",
"Primary address (Kontact et al)" => "주 주소(Kontact 등)",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "주소록",
"Share" => "공유",
"New Address Book" => "새 주소록",
"New Address Book" => "새로운 주소록",
"Name" => "이름",
"Description" => "종류",
"Description" => "설명",
"Save" => "저장"
);

16
l10n/ku_IQ.php Normal file
View File

@ -0,0 +1,16 @@
<?php $TRANSLATIONS = array(
"File doesn't exist:" => "په‌ڕگه‌که‌ هه‌بوون نیه:",
"Error" => "هه‌ڵه",
"Importing..." => "ده‌هێنرێت...",
"Download" => "داگرتن",
"Settings" => "ده‌ستكاری",
"Import" => "هێنان",
"Close" => "داخستن",
"Title" => "ناونیشان",
"Add" => "زیادکردن",
"Email" => "ئیمه‌یل",
"Address" => "ناونیشان",
"Export" => "هه‌ناردن",
"Name" => "ناو",
"Save" => "پاشکه‌وتکردن"
);

View File

@ -6,10 +6,7 @@
"No categories selected for deletion." => "Keng Kategorien fir ze läschen ausgewielt.",
"No address books found." => "Keen Adressbuch fonnt.",
"No contacts found." => "Keng Kontakter fonnt.",
"Cannot add empty property." => "Ka keng eidel Proprietéit bäisetzen.",
"Trying to add duplicate property: " => "Probéieren duebel Proprietéit bäi ze setzen:",
"Information about vCard is incorrect. Please reload the page." => "Informatioun iwwert vCard ass net richteg. Lued d'Säit wegl nei.",
"Missing ID" => "ID fehlt",
"No contact ID was submitted." => "Kontakt ID ass net mat geschéckt ginn.",
"Error reading contact photo." => "Fehler beim liesen vun der Kontakt Photo.",
"Error saving temporary file." => "Fehler beim späicheren vum temporäre Fichier.",
@ -17,19 +14,25 @@
"Contact ID is missing." => "Kontakt ID fehlt.",
"File doesn't exist:" => "Fichier existéiert net:",
"Error loading image." => "Fehler beim lueden vum Bild.",
"There is no error, the file uploaded with success" => "Keen Feeler, Datei ass komplett ropgelueden ginn",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Déi ropgelueden Datei ass méi grouss wei d'upload_max_filesize Eegenschaft an der php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Déi ropgelueden Datei ass méi grouss wei d'MAX_FILE_SIZE Eegenschaft déi an der HTML form uginn ass",
"The uploaded file was only partially uploaded" => "Déi ropgelueden Datei ass nëmmen hallef ropgelueden ginn",
"No file was uploaded" => "Et ass kee Fichier ropgeluede ginn",
"Missing a temporary folder" => "Et feelt en temporären Dossier",
"Contacts" => "Kontakter",
"Error" => "Fehler",
"Unable to upload your file as it is a directory or has 0 bytes" => "Kann deng Datei net eroplueden well et en Dossier ass oder 0 byte grouss ass.",
"Upload Error" => "Fehler beim eroplueden",
"Result: " => "Resultat: ",
" imported, " => " importéiert, ",
"Download" => "Download",
"Edit" => "Editéieren",
"Delete" => "Läschen",
"Cancel" => "Ofbriechen",
"This is not your addressbook." => "Dat do ass net däin Adressbuch.",
"Contact could not be found." => "Konnt den Kontakt net fannen.",
"Work" => "Aarbecht",
"Home" => "Doheem",
"Other" => "Aner",
"Mobile" => "GSM",
"Text" => "SMS",
"Voice" => "Voice",
@ -38,41 +41,47 @@
"Video" => "Video",
"Pager" => "Pager",
"Internet" => "Internet",
"Birthday" => "Gebuertsdag",
"{name}'s Birthday" => "{name} säi Gebuertsdag",
"Contact" => "Kontakt",
"Add Contact" => "Kontakt bäisetzen",
"Settings" => "Astellungen",
"Import" => "Import",
"Groups" => "Gruppen",
"Close" => "Zoumaachen",
"Organization" => "Firma",
"Additional names" => "Weider Nimm",
"Nickname" => "Spëtznumm",
"Enter nickname" => "Gëff e Spëtznumm an",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Groups" => "Gruppen",
"Edit groups" => "Gruppen editéieren",
"Enter phone number" => "Telefonsnummer aginn",
"Delete phone number" => "Telefonsnummer läschen",
"View on map" => "Op da Kaart uweisen",
"Edit address details" => "Adress Detailer editéieren",
"Title" => "Titel",
"Organization" => "Firma",
"Birthday" => "Gebuertsdag",
"Add" => "Dobäisetzen",
"Phone" => "Telefon",
"Email" => "Email",
"Address" => "Adress",
"Note" => "Note",
"Download contact" => "Kontakt eroflueden",
"Delete contact" => "Kontakt läschen",
"Enter phone number" => "Telefonsnummer aginn",
"Delete phone number" => "Telefonsnummer läschen",
"View on map" => "Op da Kaart uweisen",
"City" => "Staat",
"Country" => "Land",
"Share" => "Deelen",
"Export" => "Export",
"Add Contact" => "Kontakt bäisetzen",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Edit groups" => "Gruppen editéieren",
"Edit address details" => "Adress Detailer editéieren",
"Download contact" => "Kontakt eroflueden",
"Type" => "Typ",
"PO Box" => "Postleetzuel",
"Extended" => "Erweidert",
"City" => "Staat",
"Region" => "Regioun",
"Zipcode" => "Postleetzuel",
"Country" => "Land",
"Addressbook" => "Adressbuch",
"Mr" => "M",
"Sir" => "Sir",
"Mrs" => "Mme",
"Dr" => "Dr",
"Given name" => "Virnumm",
"Additional names" => "Weider Nimm",
"Family name" => "Famillje Numm",
"Ph.D." => "Ph.D.",
"Jr." => "Jr.",
@ -80,5 +89,6 @@
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "Adressbicher ",
"New Address Book" => "Neit Adressbuch",
"Name" => "Numm",
"Save" => "Späicheren"
);

View File

@ -1,5 +1,6 @@
<?php $TRANSLATIONS = array(
"Error (de)activating addressbook." => "Klaida (de)aktyvuojant adresų knygą.",
"No categories selected for deletion." => "Trynimui nepasirinkta jokia kategorija.",
"No contacts found." => "Kontaktų nerasta.",
"Information about vCard is incorrect. Please reload the page." => "Informacija apie vCard yra neteisinga. ",
"Error reading contact photo." => "Klaida skaitant kontakto nuotrauką.",
@ -11,15 +12,21 @@
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Įkeliamo failo dydis viršija MAX_FILE_SIZE nustatymą, kuris naudojamas HTML formoje.",
"The uploaded file was only partially uploaded" => "Failas buvo įkeltas tik dalinai",
"No file was uploaded" => "Nebuvo įkeltas joks failas",
"Missing a temporary folder" => "Nėra laikinojo katalogo",
"Contacts" => "Kontaktai",
"Error" => "Klaida",
"Importing..." => "Importuojama...",
"Unable to upload your file as it is a directory or has 0 bytes" => "Neįmanoma įkelti failo - jo dydis gali būti 0 bitų arba tai katalogas",
"Upload Error" => "Įkėlimo klaida",
"Upload too large" => "Įkėlimui failas per didelis",
"Pending" => "Laukiantis",
"Download" => "Atsisiųsti",
"Edit" => "Keisti",
"Delete" => "Trinti",
"Cancel" => "Atšaukti",
"This is not your addressbook." => "Tai ne jūsų adresų knygelė.",
"Contact could not be found." => "Kontaktas nerastas",
"Work" => "Darbo",
"Home" => "Namų",
"Other" => "Kita",
"Mobile" => "Mobilusis",
"Text" => "Žinučių",
"Voice" => "Balso",
@ -28,25 +35,35 @@
"Video" => "Vaizdo",
"Pager" => "Pranešimų gaviklis",
"Internet" => "Internetas",
"Birthday" => "Gimtadienis",
"Contact" => "Kontaktas",
"Add Contact" => "Pridėti kontaktą",
"Organization" => "Organizacija",
"Settings" => "Nustatymai",
"Import" => "Importuoti",
"OK" => "Gerai",
"Groups" => "Grupės",
"Close" => "Užverti",
"Nickname" => "Slapyvardis",
"Enter nickname" => "Įveskite slapyvardį",
"Title" => "Pavadinimas",
"Organization" => "Organizacija",
"Birthday" => "Gimtadienis",
"Add" => "Pridėti",
"Phone" => "Telefonas",
"Email" => "El. paštas",
"Address" => "Adresas",
"Download contact" => "Atsisųsti kontaktą",
"Delete contact" => "Ištrinti kontaktą",
"City" => "Miestas",
"Country" => "Šalis",
"Share" => "Dalintis",
"Export" => "Eksportuoti",
"Add Contact" => "Pridėti kontaktą",
"Download contact" => "Atsisųsti kontaktą",
"Type" => "Tipas",
"PO Box" => "Pašto dėžutė",
"City" => "Miestas",
"Region" => "Regionas",
"Zipcode" => "Pašto indeksas",
"Country" => "Šalis",
"Addressbook" => "Adresų knyga",
"Addressbooks" => "Adresų knygos",
"New Address Book" => "Nauja adresų knyga",
"Name" => "Pavadinimas",
"Save" => "Išsaugoti"
);

20
l10n/lv.php Normal file
View File

@ -0,0 +1,20 @@
<?php $TRANSLATIONS = array(
"There is no error, the file uploaded with success" => "Viss kārtībā, augšupielāde veiksmīga",
"No file was uploaded" => "Neviens fails netika augšuplādēts",
"Missing a temporary folder" => "Trūkst pagaidu mapes",
"Error" => "Kļūme",
"Unable to upload your file as it is a directory or has 0 bytes" => "Nav iespējams augšuplādēt jūsu failu, jo tāds jau eksistē vai arī failam nav izmēra (0 baiti)",
"Upload Error" => "Augšuplādēšanas laikā radās kļūda",
"Upload too large" => "Fails ir par lielu lai to augšuplādetu",
"Pending" => "Gaida savu kārtu",
"Download" => "Lejuplādēt",
"Delete" => "Izdzēst",
"Other" => "Cits",
"Settings" => "Iestatījumi",
"Groups" => "Grupas",
"Title" => "Nosaukums",
"Email" => "Epasts",
"Share" => "Līdzdalīt",
"Name" => "Nosaukums",
"Save" => "Saglabāt"
);

View File

@ -8,13 +8,8 @@
"No address books found." => "Не се најдени адресари.",
"No contacts found." => "Не се најдени контакти.",
"element name is not set." => "име за елементот не е поставена.",
"Cannot add empty property." => "Неможе да се додаде празна вредност.",
"At least one of the address fields has to be filled out." => "Барем една од полињата за адреса треба да биде пополнето.",
"Trying to add duplicate property: " => "Се обидовте да внесете дупликат вредност:",
"Information about vCard is incorrect. Please reload the page." => "Информацијата за vCard не е точна. Ве молам превчитајте ја страницава.",
"Missing ID" => "Недостасува ИД",
"Error parsing VCard for ID: \"" => "Грешка при парсирање VCard за ИД: \"",
"checksum is not set." => "сумата за проверка не е поставена.",
"Information about vCard is incorrect. Please reload the page." => "Информацијата за vCard не е точна. Ве молам превчитајте ја страницава.",
"Information about vCard is incorrect. Please reload the page: " => "Информацијата за vCard не е точна. Ве молам превчитајте ја страницава:",
"Something went FUBAR. " => "Нешто се расипа.",
"No contact ID was submitted." => "Не беше доставено ИД за контакт.",
@ -43,29 +38,25 @@
"Couldn't load temporary image: " => "Не можеше да се вчита привремената фотографија:",
"No file was uploaded. Unknown error" => "Ниту еден фајл не се вчита. Непозната грешка",
"Contacts" => "Контакти",
"Sorry, this functionality has not been implemented yet" => "Жалам, оваа функционалност уште не е имплементирана",
"Not implemented" => "Не е имплементирано",
"Couldn't get a valid address." => "Не можев да добијам исправна адреса.",
"Select photo" => "Одбери фотографија",
"Error" => "Грешка",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Прилагоден формат, кратко име, цело име, обратно или обратно со запирка",
"Select type" => "Одбери тип",
"This property has to be non-empty." => "Својството не смее да биде празно.",
"Couldn't serialize elements." => "Не може да се серијализираат елементите.",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' повикан без тип на аргументот. Пријавете грешка/проблем на bugs.owncloud.org",
"Edit name" => "Уреди го името",
"No files selected for upload." => "Ниту еден фајл не е избран за вчитување.",
"Unable to upload your file as it is a directory or has 0 bytes" => "Не може да се преземе вашата датотека бидејќи фолдерот во кој се наоѓа фајлот има големина од 0 бајти",
"Upload Error" => "Грешка при преземање",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Датотеката која се обидувате да ја префрлите ја надминува максималната големина дефинирана за пренос на овој сервер.",
"Upload too large" => "Фајлот кој се вчитува е преголем",
"Pending" => "Чека",
"No files selected for upload." => "Ниту еден фајл не е избран за вчитување.",
"Result: " => "Резултат: ",
" imported, " => "увезено,",
" failed." => "неуспешно.",
"Displayname cannot be empty." => "Прикажаното име не може да биде празно.",
"Download" => "Преземи",
"Edit" => "Уреди",
"Delete" => "Избриши",
"Cancel" => "Откажи",
"This is not your addressbook." => "Ова не е во Вашиот адресар.",
"Contact could not be found." => "Контактот неможе да биде најден.",
"Work" => "Работа",
"Home" => "Дома",
"Other" => "Останато",
"Mobile" => "Мобилен",
"Text" => "Текст",
"Voice" => "Глас",
@ -74,51 +65,60 @@
"Video" => "Видео",
"Pager" => "Пејџер",
"Internet" => "Интернет",
"Birthday" => "Роденден",
"{name}'s Birthday" => "Роденден на {name}",
"Contact" => "Контакт",
"Add Contact" => "Додади контакт",
"Settings" => "Параметри",
"Import" => "Внеси",
"OK" => "Во ред",
"Groups" => "Групи",
"Close" => "Затвои",
"Drop photo to upload" => "Довлечкај фотографија за да се подигне",
"Add contact" => "Додади контакт",
"Delete current photo" => "Избриши моментална фотографија",
"Edit current photo" => "Уреди моментална фотографија",
"Upload new photo" => "Подигни нова фотографија",
"Select photo from ownCloud" => "Изберете фотографија од ownCloud",
"Edit name details" => "Уреди детали за име",
"Organization" => "Организација",
"Additional names" => "Дополнителни имиња",
"Nickname" => "Прекар",
"Enter nickname" => "Внеси прекар",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Groups" => "Групи",
"Separate groups with commas" => "Одвоете ги групите со запирка",
"Edit groups" => "Уреди групи",
"Title" => "Наслов",
"Organization" => "Организација",
"Birthday" => "Роденден",
"Add" => "Додади",
"Phone" => "Телефон",
"Email" => "Е-пошта",
"Address" => "Адреса",
"Note" => "Забелешка",
"Delete contact" => "Избриши го контактот",
"Preferred" => "Претпочитано",
"Please specify a valid email address." => "Ве молам внесете правилна адреса за е-пошта.",
"Enter email address" => "Внесете е-пошта",
"Mail to address" => "Прати порака до адреса",
"Delete email address" => "Избриши адреса за е-пошта",
"Enter phone number" => "Внесете телефонски број",
"Delete phone number" => "Избриши телефонски број",
"View on map" => "Погледајте на мапа",
"City" => "Град",
"Country" => "Држава",
"Share" => "Сподели",
"Export" => "Извези",
"Add Contact" => "Додади контакт",
"Drop photo to upload" => "Довлечкај фотографија за да се подигне",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Прилагоден формат, кратко име, цело име, обратно или обратно со запирка",
"Edit name details" => "Уреди детали за име",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Separate groups with commas" => "Одвоете ги групите со запирка",
"Edit groups" => "Уреди групи",
"Enter email address" => "Внесете е-пошта",
"Edit address details" => "Уреди детали за адреса",
"Add notes here." => "Внесете забелешки тука.",
"Add field" => "Додади поле",
"Phone" => "Телефон",
"Email" => "Е-пошта",
"Address" => "Адреса",
"Note" => "Забелешка",
"Download contact" => "Преземи го контактот",
"Delete contact" => "Избриши го контактот",
"The temporary image has been removed from cache." => "Привремената слика е отстранета од кешот.",
"Edit address" => "Уреди адреса",
"Type" => "Тип",
"PO Box" => "Поштенски фах",
"Extended" => "Дополнително",
"City" => "Град",
"Region" => "Регион",
"Zipcode" => "Поштенски код",
"Country" => "Држава",
"Addressbook" => "Адресар",
"Hon. prefixes" => "Префикси за титула",
"Miss" => "Г-ца",
@ -128,7 +128,6 @@
"Mrs" => "Г-ѓа",
"Dr" => "Др",
"Given name" => "Лично име",
"Additional names" => "Дополнителни имиња",
"Family name" => "Презиме",
"Hon. suffixes" => "Суфикси за титула",
"J.D." => "J.D.",
@ -144,12 +143,12 @@
"create a new addressbook" => "креирај нов адресар",
"Name of new addressbook" => "Име на новиот адресар",
"Importing contacts" => "Внесување контакти",
"Add contact" => "Додади контакт",
"CardDAV syncing addresses" => "Адреса за синхронизација со CardDAV",
"more info" => "повеќе информации",
"Primary address (Kontact et al)" => "Примарна адреса",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "Адресари",
"New Address Book" => "Нов адресар",
"Name" => "Име",
"Save" => "Сними"
);

View File

@ -8,13 +8,8 @@
"No address books found." => "Tiada buku alamat dijumpai.",
"No contacts found." => "Tiada kenalan dijumpai.",
"element name is not set." => "nama elemen tidak ditetapkan.",
"Cannot add empty property." => "Tidak boleh menambah ruang kosong.",
"At least one of the address fields has to be filled out." => "Sekurangnya satu ruangan alamat perlu diisikan.",
"Trying to add duplicate property: " => "Cuba untuk letak nilai duplikasi:",
"Information about vCard is incorrect. Please reload the page." => "Maklumat vCard tidak tepat. Sila reload semula halaman ini.",
"Missing ID" => "ID Hilang",
"Error parsing VCard for ID: \"" => "Ralat VCard untuk ID: \"",
"checksum is not set." => "checksum tidak ditetapkan.",
"Information about vCard is incorrect. Please reload the page." => "Maklumat vCard tidak tepat. Sila reload semula halaman ini.",
"Information about vCard is incorrect. Please reload the page: " => "Maklumat tentang vCard tidak betul.",
"Something went FUBAR. " => "Sesuatu tidak betul.",
"No contact ID was submitted." => "Tiada ID kenalan yang diberi.",
@ -43,30 +38,25 @@
"Couldn't load temporary image: " => "Tidak boleh membuka imej sementara: ",
"No file was uploaded. Unknown error" => "Tiada fail dimuatnaik. Ralat tidak diketahui.",
"Contacts" => "Hubungan-hubungan",
"Sorry, this functionality has not been implemented yet" => "Maaf, fungsi ini masih belum boleh diguna lagi",
"Not implemented" => "Tidak digunakan",
"Couldn't get a valid address." => "Tidak boleh mendapat alamat yang sah.",
"Select photo" => "Pilih foto",
"Error" => "Ralat",
"Enter name" => "Masukkan nama",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format bebas, Nama pendek, Nama penuh, Unduran dengan koma",
"Select type" => "PIlih jenis",
"This property has to be non-empty." => "Nilai ini tidak boleh kosong.",
"Couldn't serialize elements." => "Tidak boleh menggabungkan elemen.",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' dipanggil tanpa argumen taip. Sila maklumkan di bugs.owncloud.org",
"Edit name" => "Ubah nama",
"No files selected for upload." => "Tiada fail dipilih untuk muatnaik.",
"Unable to upload your file as it is a directory or has 0 bytes" => "Tidak boleh memuatnaik fail anda kerana mungkin ianya direktori atau saiz fail 0 bytes",
"Upload Error" => "Muat naik ralat",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Fail yang ingin dimuatnaik melebihi saiz yang dibenarkan.",
"Upload too large" => "Muatnaik terlalu besar",
"Pending" => "Dalam proses",
"No files selected for upload." => "Tiada fail dipilih untuk muatnaik.",
"Enter name" => "Masukkan nama",
"Enter description" => "Masukkan keterangan",
"Result: " => "Hasil: ",
" imported, " => " import, ",
" failed." => " gagal.",
"Displayname cannot be empty." => "Nama paparan tidak boleh kosong",
"Download" => "Muat naik",
"Edit" => "Sunting",
"Delete" => "Padam",
"Cancel" => "Batal",
"More..." => "Lagi...",
"Addressbook not found: " => "Buku alamat tidak ditemui:",
"This is not your addressbook." => "Ini bukan buku alamat anda.",
"Contact could not be found." => "Hubungan tidak dapat ditemui",
"Work" => "Kerja",
"Home" => "Rumah",
"Other" => "Lain",
@ -78,63 +68,61 @@
"Video" => "Video",
"Pager" => "Alat Kelui",
"Internet" => "Internet",
"Birthday" => "Hari lahir",
"Business" => "Perniagaan",
"Clients" => "klien",
"Holidays" => "Hari kelepasan",
"Ideas" => "Idea",
"Journey" => "Perjalanan",
"Jubilee" => "Jubli",
"Meeting" => "Mesyuarat",
"Personal" => "Peribadi",
"Projects" => "Projek",
"{name}'s Birthday" => "Hari Lahir {name}",
"Contact" => "Hubungan",
"Add Contact" => "Tambah kenalan",
"Import" => "Import",
"Settings" => "Tetapan",
"Import" => "Import",
"OK" => "OK",
"Groups" => "Kumpulan",
"Close" => "Tutup",
"Next addressbook" => "Buku alamat seterusnya",
"Previous addressbook" => "Buku alamat sebelumnya",
"Drop photo to upload" => "Letak foto disini untuk muatnaik",
"Add contact" => "Letak kenalan",
"Delete current photo" => "Padam foto semasa",
"Edit current photo" => "Ubah foto semasa",
"Upload new photo" => "Muatnaik foto baru",
"Select photo from ownCloud" => "Pilih foto dari ownCloud",
"Edit name details" => "Ubah butiran nama",
"Organization" => "Organisasi",
"Additional names" => "Nama tambahan",
"Nickname" => "Nama Samaran",
"Enter nickname" => "Masukkan nama samaran",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Groups" => "Kumpulan",
"Separate groups with commas" => "Asingkan kumpulan dengan koma",
"Edit groups" => "Ubah kumpulan",
"Organization" => "Organisasi",
"Birthday" => "Hari lahir",
"Add" => "Tambah",
"Phone" => "Telefon",
"Email" => "Emel",
"Address" => "Alamat",
"Note" => "Nota",
"Delete contact" => "Padam hubungan",
"Preferred" => "Pilihan",
"Please specify a valid email address." => "Berikan alamat emel yang sah.",
"Enter email address" => "Masukkan alamat emel",
"Mail to address" => "Hantar ke alamat",
"Delete email address" => "Padam alamat emel",
"Enter phone number" => "Masukkan nombor telefon",
"Delete phone number" => "Padam nombor telefon",
"View on map" => "Lihat pada peta",
"City" => "bandar",
"Country" => "Negara",
"Share" => "Kongsi",
"Export" => "Export",
"Add Contact" => "Tambah kenalan",
"Drop photo to upload" => "Letak foto disini untuk muatnaik",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format bebas, Nama pendek, Nama penuh, Unduran dengan koma",
"Edit name details" => "Ubah butiran nama",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Separate groups with commas" => "Asingkan kumpulan dengan koma",
"Edit groups" => "Ubah kumpulan",
"Enter email address" => "Masukkan alamat emel",
"Edit address details" => "Ubah butiran alamat",
"Add notes here." => "Letak nota disini.",
"Add field" => "Letak ruangan",
"Phone" => "Telefon",
"Email" => "Emel",
"Address" => "Alamat",
"Note" => "Nota",
"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",
"PO Box" => "Peti surat",
"Extended" => "Sambungan",
"City" => "bandar",
"Region" => "Wilayah",
"Zipcode" => "Poskod",
"Country" => "Negara",
"Addressbook" => "Buku alamat",
"Hon. prefixes" => "Awalan nama",
"Miss" => "Cik",
@ -144,7 +132,6 @@
"Mrs" => "Puan",
"Dr" => "Dr",
"Given name" => "Nama diberi",
"Additional names" => "Nama tambahan",
"Family name" => "Nama keluarga",
"Hon. suffixes" => "Awalan nama",
"J.D." => "J.D.",
@ -160,9 +147,7 @@
"create a new addressbook" => "Cipta buku alamat baru",
"Name of new addressbook" => "Nama buku alamat",
"Importing contacts" => "Import senarai kenalan",
"Add contact" => "Letak kenalan",
"Select Address Books" => "Pilih Buku Alamat",
"Enter description" => "Masukkan keterangan",
"CardDAV syncing addresses" => "alamat selarian CardDAV",
"more info" => "maklumat lanjut",
"Primary address (Kontact et al)" => "Alamat utama",

View File

@ -3,14 +3,15 @@
"id is not set." => "id er ikke satt.",
"Cannot update addressbook with an empty name." => "Kan ikke oppdatere adressebøker uten navn.",
"No ID provided" => "Ingen ID angitt",
"Error setting checksum." => "Feil under skriving av sjekksum",
"No categories selected for deletion." => "Ingen kategorier valgt for sletting.",
"No address books found." => "Ingen adressebok funnet.",
"No contacts found." => "Ingen kontakter funnet.",
"Cannot add empty property." => "Kan ikke legge til tomt felt.",
"At least one of the address fields has to be filled out." => "Minst en av adressefeltene må oppgis.",
"element name is not set." => "navn på elementet er ikke satt.",
"checksum is not set." => "sjekksumm er ikke satt.",
"Information about vCard is incorrect. Please reload the page." => "Informasjonen om vCard-filen er ikke riktig. Last inn siden på nytt.",
"Missing ID" => "Manglende ID",
"Something went FUBAR. " => "Noe gikk fryktelig galt.",
"No contact ID was submitted." => "Ingen kontakt ID ble gitt",
"Error reading contact photo." => "Klarte ikke å lese kontaktbilde.",
"Error saving temporary file." => "Klarte ikke å lagre midlertidig fil.",
"The loading photo is not valid." => "Bildet som lastes inn er ikke gyldig.",
@ -18,6 +19,8 @@
"No photo path was submitted." => "Ingen filsti ble lagt inn.",
"File doesn't exist:" => "Filen eksisterer ikke:",
"Error loading image." => "Klarte ikke å laste bilde.",
"Error getting contact object." => "Feil ved henting av kontakt objektet.",
"Error getting PHOTO property." => "Feil ved henting av foto verdi.",
"Error saving contact." => "Klarte ikke å lagre kontakt.",
"Error resizing image" => "Klarte ikke å endre størrelse på bildet",
"Error cropping image" => "Klarte ikke å beskjære bildet",
@ -34,11 +37,15 @@
"Couldn't load temporary image: " => "Kunne ikke laste midlertidig bilde:",
"No file was uploaded. Unknown error" => "Ingen filer ble lastet opp. Ukjent feil.",
"Contacts" => "Kontakter",
"Select photo" => "Velg bilde",
"Error" => "Feil",
"Select type" => "Velg type",
"Edit name" => "Endre navn",
"No files selected for upload." => "Ingen filer valgt for opplasting.",
"Importing..." => "Importerer...",
"Unable to upload your file as it is a directory or has 0 bytes" => "Kan ikke laste opp filen din siden det er en mappe eller den har 0 bytes",
"Upload Error" => "Opplasting feilet",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Filen du prøver å laste opp er for stor.",
"Upload too large" => "Filen er for stor",
"Pending" => "Ventende",
"No files selected for upload." => "Ingen filer valgt for opplasting.",
"Result: " => "Resultat:",
" imported, " => "importert,",
" failed." => "feilet.",
@ -46,10 +53,14 @@
"Edit" => "Rediger",
"Delete" => "Slett",
"Cancel" => "Avbryt",
"This is not your addressbook." => "Dette er ikke dine adressebok.",
"Contact could not be found." => "Kontakten ble ikke funnet.",
"Less..." => "Mindre...",
"You do not have the permissions to delete this addressbook." => "Du har ikke tilgang til å slette denne adresseboken",
"There was an error deleting this addressbook." => "Det oppstod en feil under sletting av denne adresseboken",
"Yahoo" => "Yahoo",
"Skype" => "Skype",
"Work" => "Arbeid",
"Home" => "Hjem",
"Other" => "Annet",
"Mobile" => "Mobil",
"Text" => "Tekst",
"Voice" => "Svarer",
@ -58,51 +69,73 @@
"Video" => "Video",
"Pager" => "Pager",
"Internet" => "Internett",
"Birthday" => "Bursdag",
"{name}'s Birthday" => "{name}s bursdag",
"Contact" => "Kontakt",
"Add Contact" => "Ny kontakt",
"Could not find the vCard with ID." => "Kunne ikke finne vCard med denne IDen",
"You do not have the permissions to edit this contact." => "Du har ikke tilgang til å endre denne kontakten.",
"You do not have the permissions to delete this contact." => "Du har ikke tilgang til å slette denne kontakten.",
"There was an error deleting this contact." => "Det oppstod en feil ved sletting av denne kontakten",
"Settings" => "Innstillinger",
"Import" => "Importer",
"OK" => "OK",
"Groups" => "Grupper",
"Close" => "Lukk",
"Drop photo to upload" => "Dra bilder hit for å laste opp",
"Keyboard shortcuts" => "Tastatur snarveier",
"Navigation" => "Navigasjon",
"Next contact in list" => "Neste kontakt i listen",
"Previous contact in list" => "Forrige kontakt i listen",
"Expand/collapse current addressbook" => "Vis/skjul adresseboken",
"Add new contact" => "Legg til ny kontakt",
"Add new addressbook" => "Legg til ny adressebok",
"Delete current contact" => "Slett kontakten",
"Add contact" => "Ny kontakt",
"Delete current photo" => "Fjern nåværende bilde",
"Edit current photo" => "Rediger nåværende bilde",
"Upload new photo" => "Last opp nytt bilde",
"Select photo from ownCloud" => "Velg bilde fra ownCloud",
"Edit name details" => "Endre detaljer rundt navn",
"Organization" => "Organisasjon",
"Additional names" => "Ev. mellomnavn",
"Nickname" => "Kallenavn",
"Enter nickname" => "Skriv inn kallenavn",
"dd-mm-yyyy" => "dd-mm-åååå",
"Groups" => "Grupper",
"Separate groups with commas" => "Skill gruppene med komma",
"Edit groups" => "Endre grupper",
"Title" => "Tittel",
"Organization" => "Organisasjon",
"Birthday" => "Bursdag",
"Add" => "Legg til",
"Phone" => "Telefon",
"Email" => "E-post",
"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.",
"Enter email address" => "Skriv inn e-postadresse",
"Mail to address" => "Send e-post til adresse",
"Delete email address" => "Fjern e-postadresse",
"Enter phone number" => "Skriv inn telefonnummer",
"Delete phone number" => "Fjern telefonnummer",
"View on map" => "Se på kart",
"City" => "By",
"Country" => "Land",
"Share" => "Del",
"Export" => "Eksporter",
"Add Contact" => "Ny kontakt",
"Drop photo to upload" => "Dra bilder hit for å laste opp",
"Edit name details" => "Endre detaljer rundt navn",
"http://www.somesite.com" => "http://www.domene.no",
"dd-mm-yyyy" => "dd-mm-åååå",
"Separate groups with commas" => "Skill gruppene med komma",
"Edit groups" => "Endre grupper",
"Enter email address" => "Skriv inn e-postadresse",
"Edit address details" => "Endre detaljer rundt adresse",
"Add notes here." => "Legg inn notater her.",
"Add field" => "Legg til felt",
"Phone" => "Telefon",
"Email" => "E-post",
"Address" => "Adresse",
"Note" => "Notat",
"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",
"PO Box" => "Postboks",
"Extended" => "Utvidet",
"City" => "By",
"Region" => "Området",
"Zipcode" => "Postnummer",
"Country" => "Land",
"Addressbook" => "Adressebok",
"Hon. prefixes" => "Ærestitler",
"Miss" => "Frøken",
@ -110,7 +143,6 @@
"Mrs" => "Fru",
"Dr" => "Dr",
"Given name" => "Fornavn",
"Additional names" => "Ev. mellomnavn",
"Family name" => "Etternavn",
"Hon. suffixes" => "Titler",
"Ph.D." => "Stipendiat",
@ -121,11 +153,12 @@
"create a new addressbook" => "Lag ny adressebok",
"Name of new addressbook" => "Navn på ny adressebok",
"Importing contacts" => "Importerer kontakter",
"Add contact" => "Ny kontakt",
"CardDAV syncing addresses" => "Synkroniseringsadresse for CardDAV",
"more info" => "mer info",
"Primary address (Kontact et al)" => "Primær adresse (kontakt osv)",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "Adressebøker",
"New Address Book" => "Ny adressebok",
"Name" => "Navn",
"Save" => "Lagre"
);

View File

@ -2,24 +2,24 @@
"Error (de)activating addressbook." => "Fout bij het (de)activeren van het adresboek.",
"id is not set." => "id is niet ingesteld.",
"Cannot update addressbook with an empty name." => "Kan adresboek zonder naam niet wijzigen",
"No category name given." => "Geen categorienaam opgegeven.",
"Error adding group." => "Fout bij toevoegen groep",
"Group ID missing from request." => "Groep ID niet opgegeven",
"Contact ID missing from request." => "Contact ID niet opgegeven",
"No ID provided" => "Geen ID opgegeven",
"Error setting checksum." => "Instellen controlegetal mislukt",
"No categories selected for deletion." => "Geen categorieën geselecteerd om te verwijderen.",
"No address books found." => "Geen adresboek gevonden",
"No contacts found." => "Geen contracten gevonden",
"element name is not set." => "onderdeel naam is niet opgegeven.",
"Could not parse contact: " => "Kon het contact niet verwerken",
"Cannot add empty property." => "Kan geen lege eigenschap toevoegen.",
"At least one of the address fields has to be filled out." => "Minstens één van de adresvelden moet ingevuld worden.",
"Trying to add duplicate property: " => "Eigenschap bestaat al: ",
"Missing IM parameter." => "IM parameter ontbreekt",
"Unknown IM: " => "Onbekende IM:",
"Information about vCard is incorrect. Please reload the page." => "Informatie over de vCard is onjuist. Herlaad de pagina.",
"Missing ID" => "Ontbrekend ID",
"Error parsing VCard for ID: \"" => "Fout bij inlezen VCard voor ID: \"",
"checksum is not set." => "controlegetal is niet opgegeven.",
"Information about vCard is incorrect. Please reload the page." => "Informatie over de vCard is onjuist. Herlaad de pagina.",
"Couldn't find vCard for %d." => "Kan geen vCard vinden voor %d.",
"Information about vCard is incorrect. Please reload the page: " => "Informatie over vCard is fout. Herlaad de pagina: ",
"Something went FUBAR. " => "Er ging iets totaal verkeerd. ",
"Cannot save property of type \"%s\" as array" => "Kan waarde van type \"%s\" niet opslaan als array",
"Missing IM parameter." => "IM parameter ontbreekt",
"Unknown IM: " => "Onbekende IM:",
"No contact ID was submitted." => "Geen contact ID opgestuurd.",
"Error reading contact photo." => "Lezen van contact foto mislukt.",
"Error saving temporary file." => "Tijdelijk bestand opslaan mislukt.",
@ -35,6 +35,9 @@
"Error cropping image" => "Fout tijdens aanpassen plaatje",
"Error creating temporary image" => "Fout om een tijdelijk plaatje te maken",
"Error finding image: " => "Fout kan plaatje niet vinden:",
"Key is not set for: " => "Sleutel niet bekend:",
"Value is not set for: " => "Waarde niet bekend:",
"Could not set preference: " => "Kan voorkeur niet opslaan:",
"Error uploading contacts to storage." => "Fout bij opslaan van contacten.",
"There is no error, the file uploaded with success" => "De upload van het bestand is goedgegaan.",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Het bestand overschrijdt de upload_max_filesize instelling in php.ini",
@ -46,43 +49,45 @@
"Couldn't load temporary image: " => "Kan tijdelijk plaatje niet op laden:",
"No file was uploaded. Unknown error" => "Er was geen bestand geladen. Onbekende fout",
"Contacts" => "Contacten",
"Sorry, this functionality has not been implemented yet" => "Sorry, deze functionaliteit is nog niet geïmplementeerd",
"Not implemented" => "Niet geïmplementeerd",
"Couldn't get a valid address." => "Kan geen geldig adres krijgen",
"Error" => "Fout",
"Please enter an email address." => "Voer een emailadres in",
"Enter name" => "Naam",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formateer aangepast, Korte naam, Volledige naam, Achteruit of Achteruit met komma",
"Select type" => "Selecteer type",
"Contact is already in this group." => "De contactpersoon bevindt zich al in deze groep.",
"Contacts are already in this group." => "De contactpersonen bevinden zich al in deze groep.",
"Couldn't get contact list." => "Kan de contactenlijst niet ophalen.",
"Contact is not in this group." => "De contactpersoon bevindt zich niet in deze groep",
"Contacts are not in this group." => "De contactpersonen bevinden zich niet in deze groep",
"A group named {group} already exists" => "Er bestaat al een groep {group}",
"All" => "Alle",
"Favorites" => "Favorieten",
"Shared by {owner}" => "Gedeeld door {owner}",
"Indexing contacts" => "Bezig met indexeren van contactpersonen",
"Add to..." => "Toevoegen aan...",
"Remove from..." => "Verwijderen uit...",
"Add group..." => "Nieuwe groep...",
"Select photo" => "Selecteer een foto",
"You do not have permission to add contacts to " => "U hebt geen permissie om contacten toe te voegen aan",
"Please select one of your own address books." => "Selecteer één van uw eigen adresboeken",
"Permission error" => "Permissie fout",
"Click to undo deletion of \"" => "Klik om de verwijdering ongedaan te maken van \"",
"Cancelled deletion of: \"" => "Verwijdering afgebroken van: \"",
"This property has to be non-empty." => "Dit veld mag niet leeg blijven",
"Couldn't serialize elements." => "Kan de elementen niet serializen",
"Unknown error. Please check logs." => "Onbekende fout. Controleer de logs.",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' aangeroepen zonder type argument. Rapporteer dit a.u.b. via http://bugs.owncloud.org",
"Edit name" => "Pas naam aan",
"No files selected for upload." => "Geen bestanden geselecteerd voor upload.",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Het bestand dat u probeert te uploaden overschrijdt de maximale bestand grootte voor bestand uploads voor deze server.",
"Error loading profile picture." => "Fout profiel plaatje kan niet worden geladen.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Enkele contacten zijn gemarkeerd om verwijderd te worden, maar zijn nog niet verwijderd. Wacht totdat ze zijn verwijderd.",
"Do you want to merge these address books?" => "Wilt u deze adresboeken samenvoegen?",
"Shared by " => "Gedeeld door",
"Upload too large" => "Upload is te groot",
"Only image files can be used as profile picture." => "Alleen afbeeldingsbestanden kunnen als profile afbeelding worden gebruikt.",
"Wrong file type" => "Verkeerde bestand type",
"Your browser doesn't support AJAX upload. Please click on the profile picture to select a photo to upload." => "Uw browser ondersteunt geen AJAX upload. Klik op de profiel afbeelding om een foto te selecteren en deze te uploaden.",
"Unable to upload your file as it is a directory or has 0 bytes" => "Het lukt niet om uw bestand te uploaded, omdat het een folder of 0 bytes is",
"Upload Error" => "Upload fout",
"Pending" => "In behandeling",
"Import done" => "Import uitgevoerd",
"Network or server error. Please inform administrator." => "Netwerk- of serverfout. Neem contact op met de beheerder.",
"Error adding to group." => "Fout bij het toevoegen aan de groep.",
"Error removing from group." => "Fout bij het verwijderen uit de groep.",
"There was an error opening a mail composer." => "Er is iets misgegaan tijdens het openen van een email programma.",
"Not all files uploaded. Retrying..." => "Nog niet alle bestanden zijn ge-upload. Nogmaals proberen...",
"Something went wrong with the upload, please retry." => "Er is iets fout gegaan met het uploaden. Probeer het nog eens.",
"Error" => "Fout",
"Importing..." => "Importeren...",
"Unable to upload your file as it is a directory or has 0 bytes" => "Het lukt niet om uw bestand te uploaded, omdat het een folder of 0 bytes is",
"Upload Error" => "Upload fout",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Het bestand dat u probeert te uploaden overschrijdt de maximale bestand grootte voor bestand uploads voor deze server.",
"Upload too large" => "Upload is te groot",
"Pending" => "In behandeling",
"No files selected for upload." => "Geen bestanden geselecteerd voor upload.",
"Edit profile picture" => "Bewerk profielafbeelding",
"Error loading profile picture." => "Fout profiel plaatje kan niet worden geladen.",
"Enter name" => "Naam",
"Enter description" => "Beschrijving",
"Select addressbook" => "Kies een adresboek",
"The address book name cannot be empty." => "De naam van het adresboek mag niet leeg zijn.",
"Is this correct?" => "Is dit correct?",
"There was an unknown error when trying to delete this contact" => "Er is een onbekende fout opgetreden bij het verwijderen van deze contactpersoon",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Enkele contacten zijn gemarkeerd om verwijderd te worden, maar zijn nog niet verwijderd. Wacht totdat ze zijn verwijderd.",
"Click to undo deletion of {num} contacts" => "Klik om het verwijderen van {num} contactpersonen ongedaan te maken.",
"Cancelled deletion of {num}" => "Verwijderen geannuleerd van {num}",
"Result: " => "Resultaat:",
" imported, " => "geïmporteerd,",
" failed." => "gefaald.",
@ -100,9 +105,6 @@
"There was an error updating the addressbook." => "Er is een fout opgetreden bij het bijwerken van het adresboek.",
"You do not have the permissions to delete this addressbook." => "U heeft onvoldoende rechten om dit adresboek te verwijderen.",
"There was an error deleting this addressbook." => "Er is een fout opgetreden bij het verwijderen van dit adresboek.",
"Addressbook not found: " => "Adresboek niet gevonden:",
"This is not your addressbook." => "Dit is niet uw adresboek.",
"Contact could not be found." => "Contact kon niet worden gevonden.",
"Jabber" => "Jabber",
"AIM" => "AIM",
"MSN" => "MSN",
@ -126,19 +128,9 @@
"Video" => "Video",
"Pager" => "Pieper",
"Internet" => "Internet",
"Birthday" => "Verjaardag",
"Business" => "Business",
"Call" => "Bel",
"Clients" => "Klanten",
"Deliverer" => "Leverancier",
"Holidays" => "Vakanties",
"Ideas" => "Ideeën",
"Journey" => "Reis",
"Jubilee" => "Jubileum",
"Meeting" => "Vergadering",
"Personal" => "Persoonlijk",
"Projects" => "Projecten",
"Questions" => "Vragen",
"Friends" => "Vrienden",
"Family" => "Familie",
"There was an error deleting properties for this contact." => "Er is iets misgegaan tijdens het verwijderen van de eigenschappen van dit contact.",
"{name}'s Birthday" => "{name}'s verjaardag",
"Contact" => "Contact",
"You do not have the permissions to add contacts to this addressbook." => "U kunt geen contact personen toevoegen aan dit adresboek.",
@ -148,9 +140,18 @@
"Could not find the Addressbook with ID: " => "Kan het adresboek niet vinden met ID:",
"You do not have the permissions to delete this contact." => "U heeft geen permissie om dit contact te verwijderen.",
"There was an error deleting this contact." => "Er is een fout opgetreden bij het verwijderen van dit contact persoon.",
"Add Contact" => "Contact toevoegen",
"Import" => "Importeer",
"Contact not found." => "Contact niet gevonden.",
"HomePage" => "HomePage",
"New Group" => "Nieuwe Groep",
"Settings" => "Instellingen",
"Import" => "Importeer",
"Import into:" => "Importeer naar:",
"OK" => "OK",
"(De-)select all" => "(De-)selecteer alle",
"New Contact" => "Nieuw Contact",
"Groups" => "Groepen",
"Favorite" => "Favoriet",
"Delete Contact" => "Verwijder Contact",
"Close" => "Sluiten",
"Keyboard shortcuts" => "Sneltoetsen",
"Navigation" => "Navigatie",
@ -164,56 +165,74 @@
"Add new contact" => "Voeg nieuw contact toe",
"Add new addressbook" => "Voeg nieuw adresboek toe",
"Delete current contact" => "Verwijder huidig contact",
"Drop photo to upload" => "Verwijder foto uit upload",
"<h3>You have no contacts in your addressbook.</h3><p>Add a new contact or import existing contacts from a VCF file.</p>" => "<h3>Je hebt geen contacten in je addresboek.</h3><p>Voeg een nieuw contact toe of importeer bestaande contacten met een VCF bestand.</p>",
"Add contact" => "Contactpersoon toevoegen",
"Compose mail" => "Schrijf email",
"Delete group" => "Verwijder groep",
"Delete current photo" => "Verwijdere huidige foto",
"Edit current photo" => "Wijzig huidige foto",
"Upload new photo" => "Upload nieuwe foto",
"Select photo from ownCloud" => "Selecteer foto uit ownCloud",
"Edit name details" => "Wijzig naam gegevens",
"Organization" => "Organisatie",
"First name" => "Voornaam",
"Additional names" => "Extra namen",
"Last name" => "Achternaam",
"Nickname" => "Roepnaam",
"Enter nickname" => "Voer roepnaam in",
"Web site" => "Website",
"http://www.somesite.com" => "http://www.willekeurigesite.com",
"Go to web site" => "Ga naar website",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Groups" => "Groepen",
"Separate groups with commas" => "Gebruik komma bij meerder groepen",
"Edit groups" => "Wijzig groepen",
"Preferred" => "Voorkeur",
"Please specify a valid email address." => "Geef een geldig email adres op.",
"Enter email address" => "Voer email adres in",
"Mail to address" => "Mail naar adres",
"Delete email address" => "Verwijder email adres",
"Enter phone number" => "Voer telefoonnummer in",
"Delete phone number" => "Verwijdere telefoonnummer",
"Instant Messenger" => "Instant Messenger",
"Delete IM" => "Verwijder IM",
"View on map" => "Bekijk op een kaart",
"Edit address details" => "Wijzig adres gegevens",
"Add notes here." => "Voeg notitie toe",
"Add field" => "Voeg veld toe",
"Title" => "Titel",
"Organization" => "Organisatie",
"Birthday" => "Verjaardag",
"Notes go here..." => "Hier de notities...",
"Add" => "Toevoegen",
"Phone" => "Telefoon",
"Email" => "E-mail",
"Instant Messaging" => "Instant Messaging",
"Address" => "Adres",
"Note" => "Notitie",
"Download contact" => "Download contact",
"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",
"Mail to address" => "Mail naar adres",
"Delete email address" => "Verwijder email adres",
"Enter phone number" => "Voer telefoonnummer in",
"Delete phone number" => "Verwijdere telefoonnummer",
"Go to web site" => "Ga naar website",
"Delete URL" => "Verwijder URL",
"View on map" => "Bekijk op een kaart",
"Delete address" => "Verwijder adres",
"Street address" => "Adres",
"12345" => "12345",
"Postal code" => "Postcode",
"City" => "Stad",
"Country" => "Land",
"Instant Messenger" => "Instant Messenger",
"Delete IM" => "Verwijder IM",
"Share" => "Deel",
"Export" => "Exporteer",
"Add Contact" => "Contact toevoegen",
"Drop photo to upload" => "Verwijder foto uit upload",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formateer aangepast, Korte naam, Volledige naam, Achteruit of Achteruit met komma",
"Edit name details" => "Wijzig naam gegevens",
"http://www.somesite.com" => "http://www.willekeurigesite.com",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Separate groups with commas" => "Gebruik komma bij meerder groepen",
"Edit groups" => "Wijzig groepen",
"Enter email address" => "Voer email adres in",
"Edit address details" => "Wijzig adres gegevens",
"Add notes here." => "Voeg notitie toe",
"Add field" => "Voeg veld toe",
"Download contact" => "Download contact",
"The temporary image has been removed from cache." => "Het tijdelijke plaatje is uit de cache verwijderd.",
"Edit address" => "Wijzig adres",
"Type" => "Type",
"PO Box" => "Postbus",
"Street address" => "Adres",
"Street and number" => "Straat en nummer",
"Extended" => "Uitgebreide",
"Apartment number etc." => "Apartement nummer",
"City" => "Stad",
"Region" => "Regio",
"E.g. state or province" => "Provincie",
"Zipcode" => "Postcode",
"Postal code" => "Postcode",
"Country" => "Land",
"Addressbook" => "Adresboek",
"Hon. prefixes" => "Hon. prefixes",
"Miss" => "Mw",
@ -223,7 +242,6 @@
"Mrs" => "Mw",
"Dr" => "M",
"Given name" => "Voornaam",
"Additional names" => "Extra namen",
"Family name" => "Achternaam",
"Hon. suffixes" => "Honorabele",
"J.D." => "Jurist",
@ -240,15 +258,12 @@
"Name of new addressbook" => "Naam van nieuw adresboek",
"Importing contacts" => "Importeren van contacten",
"<h3>You have no contacts in your addressbook.</h3><p>You can import VCF files by dragging them to the contacts list and either drop them on an addressbook to import into it, or on an empty spot to create a new addressbook and import into that.<br />You can also import by clicking on the import button at the bottom of the list.</p>" => "<h3>U heeft geen contacten in uw adresboek.</h3><p>U kunt VCF bestanden importeren door ze naar de contactenlijst te slepen en ze daar op een adresboek los te laten om ze in het desbetreffende adresboek op te nemen of laat ze op het lege gedeelte los om een nieuw adresboek te maken met de contacten uit het bestand.<br />Uw kunt ook importeren door op de import knop te klikken aan de onderkant van de lijst.</p>",
"Add contact" => "Contactpersoon toevoegen",
"Select Address Books" => "Selecteer adresboeken",
"Enter description" => "Beschrijving",
"CardDAV syncing addresses" => "CardDAV synchroniseert de adressen",
"more info" => "meer informatie",
"Primary address (Kontact et al)" => "Standaardadres",
"iOS/OS X" => "IOS/OS X",
"Addressbooks" => "Adresboeken",
"Share" => "Deel",
"New Address Book" => "Nieuw Adresboek",
"Name" => "Naam",
"Description" => "Beschrijving",

View File

@ -1,42 +1,55 @@
<?php $TRANSLATIONS = array(
"Error (de)activating addressbook." => "Ein feil oppstod ved (de)aktivering av adressebok.",
"Cannot add empty property." => "Kan ikkje leggja til tomt felt.",
"At least one of the address fields has to be filled out." => "Minst eit av adressefelta må fyllast ut.",
"Information about vCard is incorrect. Please reload the page." => "Informasjonen om vCard-et er feil, ver venleg og last sida på nytt.",
"There is no error, the file uploaded with success" => "Ingen feil, fila vart lasta opp",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Den opplasta fila er større enn variabelen upload_max_filesize i php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Den opplasta fila er større enn variabelen MAX_FILE_SIZE i HTML-skjemaet",
"The uploaded file was only partially uploaded" => "Fila vart berre delvis lasta opp",
"No file was uploaded" => "Ingen filer vart lasta opp",
"Missing a temporary folder" => "Manglar ei mellombels mappe",
"Contacts" => "Kotaktar",
"Error" => "Feil",
"Upload too large" => "For stor opplasting",
"Download" => "Last ned",
"Edit" => "Endra",
"Delete" => "Slett",
"Cancel" => "Kanseller",
"This is not your addressbook." => "Dette er ikkje di adressebok.",
"Contact could not be found." => "Fann ikkje kontakten.",
"Work" => "Arbeid",
"Home" => "Heime",
"Other" => "Anna",
"Mobile" => "Mobil",
"Text" => "Tekst",
"Voice" => "Tale",
"Fax" => "Faks",
"Video" => "Video",
"Pager" => "Personsøkjar",
"Birthday" => "Bursdag",
"Contact" => "Kontakt",
"Add Contact" => "Legg til kontakt",
"Settings" => "Innstillingar",
"Import" => "Importer",
"Groups" => "Grupper",
"Close" => "Lukk",
"Title" => "Tittel",
"Organization" => "Organisasjon",
"Preferred" => "Føretrekt",
"Birthday" => "Bursdag",
"Add" => "Legg til",
"Phone" => "Telefonnummer",
"Email" => "Epost",
"Address" => "Adresse",
"Download contact" => "Last ned kontakt",
"Delete contact" => "Slett kontakt",
"Preferred" => "Føretrekt",
"City" => "Stad",
"Country" => "Land",
"Export" => "Eksporter",
"Add Contact" => "Legg til kontakt",
"Download contact" => "Last ned kontakt",
"Type" => "Skriv",
"PO Box" => "Postboks",
"Extended" => "Utvida",
"City" => "Stad",
"Region" => "Region/fylke",
"Zipcode" => "Postnummer",
"Country" => "Land",
"Addressbook" => "Adressebok",
"Addressbooks" => "Adressebøker",
"New Address Book" => "Ny adressebok",
"Name" => "Namn",
"Save" => "Lagre"
);

36
l10n/oc.php Normal file
View File

@ -0,0 +1,36 @@
<?php $TRANSLATIONS = array(
"No categories selected for deletion." => "Pas de categorias seleccionadas per escafar.",
"There is no error, the file uploaded with success" => "Amontcargament capitat, pas d'errors",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Lo fichièr amontcargat es tròp bèl per la directiva «upload_max_filesize » del php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Lo fichièr amontcargat es mai gròs que la directiva «MAX_FILE_SIZE» especifiada dins lo formulari HTML",
"The uploaded file was only partially uploaded" => "Lo fichièr foguèt pas completament amontcargat",
"No file was uploaded" => "Cap de fichièrs son estats amontcargats",
"Missing a temporary folder" => "Un dorsièr temporari manca",
"Contacts" => "Contactes",
"Error" => "Error",
"Unable to upload your file as it is a directory or has 0 bytes" => "Impossible d'amontcargar lo teu fichièr qu'es un repertòri o que ten pas que 0 octet.",
"Upload Error" => "Error d'amontcargar",
"Upload too large" => "Amontcargament tròp gròs",
"Pending" => "Al esperar",
"Download" => "Avalcarga",
"Edit" => "Editar",
"Delete" => "Escafa",
"Cancel" => "Annula",
"Work" => "Trabalh",
"Other" => "Autres",
"Settings" => "Configuracion",
"Import" => "Importa",
"OK" => "D'accòrdi",
"Groups" => "Grops",
"Title" => "Títol",
"Birthday" => "Anniversari",
"Add" => "Ajusta",
"Email" => "Corrièl",
"Share" => "Parteja",
"Export" => "Exporta",
"more info" => "mai d'entresenhes",
"Primary address (Kontact et al)" => "Adreiças primarias (Kontact et al)",
"iOS/OS X" => "iOS/OS X",
"Name" => "Nom",
"Save" => "Enregistra"
);

View File

@ -2,24 +2,24 @@
"Error (de)activating addressbook." => "Błąd (de)aktywowania książki adresowej.",
"id is not set." => "id nie ustawione.",
"Cannot update addressbook with an empty name." => "Nie można zaktualizować książki adresowej z pustą nazwą.",
"No category name given." => "Nie nadano nazwy kategorii",
"Error adding group." => "Błąd dodania grupy.",
"Group ID missing from request." => "Brakuje wymaganego ID grupy",
"Contact ID missing from request." => "Brakuje wymaganego ID kontaktu ",
"No ID provided" => "Brak opatrzonego ID ",
"Error setting checksum." => "Błąd ustawień sumy kontrolnej",
"No categories selected for deletion." => "Nie zaznaczono kategorii do usunięcia",
"No address books found." => "Nie znaleziono książek adresowych",
"No contacts found." => "Nie znaleziono kontaktów.",
"element name is not set." => "nazwa elementu nie jest ustawiona.",
"Could not parse contact: " => "Nie można parsować kontaktu:",
"Cannot add empty property." => "Nie można dodać pustego elementu.",
"At least one of the address fields has to be filled out." => "Należy wypełnić przynajmniej jedno pole adresu.",
"Trying to add duplicate property: " => "Próba dodania z duplikowanej właściwości:",
"Missing IM parameter." => "Brak parametru komunikator",
"Unknown IM: " => "Nieznany Komunikator",
"Information about vCard is incorrect. Please reload the page." => "Informacje o vCard są nieprawidłowe. Proszę odświeżyć stronę.",
"Missing ID" => "Brak ID",
"Error parsing VCard for ID: \"" => "Wystąpił błąd podczas przetwarzania VCard ID: \"",
"checksum is not set." => "checksum-a nie ustawiona",
"Information about vCard is incorrect. Please reload the page." => "Informacje o vCard są nieprawidłowe. Proszę odświeżyć stronę.",
"Couldn't find vCard for %d." => "Nie można znaleźć vCard dla %d.",
"Information about vCard is incorrect. Please reload the page: " => "Informacje na temat vCard są niepoprawne. Proszę przeładuj stronę:",
"Something went FUBAR. " => "Gdyby coś poszło FUBAR.",
"Cannot save property of type \"%s\" as array" => "Nie można zapisać właściwości typu \"%s\" jako tablicy",
"Missing IM parameter." => "Brak parametru komunikator",
"Unknown IM: " => "Nieznany Komunikator",
"No contact ID was submitted." => "ID kontaktu nie został utworzony.",
"Error reading contact photo." => "Błąd odczytu zdjęcia kontaktu.",
"Error saving temporary file." => "Wystąpił błąd podczas zapisywania pliku tymczasowego.",
@ -35,6 +35,9 @@
"Error cropping image" => "Błąd przycinania obrazu",
"Error creating temporary image" => "Błąd utworzenia obrazu tymczasowego",
"Error finding image: " => "Błąd znajdowanie obrazu: ",
"Key is not set for: " => "Klucz nie ustawiony dla:",
"Value is not set for: " => "Wartość nie ustawiona dla:",
"Could not set preference: " => "Nie można ustawić preferencji: ",
"Error uploading contacts to storage." => "Wystąpił błąd podczas wysyłania kontaktów do magazynu.",
"There is no error, the file uploaded with success" => "Nie było błędów, plik wyczytano poprawnie.",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Załadowany plik przekracza wielkość upload_max_filesize w php.ini ",
@ -46,43 +49,52 @@
"Couldn't load temporary image: " => "Nie można wczytać obrazu tymczasowego: ",
"No file was uploaded. Unknown error" => "Plik nie został załadowany. Nieznany błąd",
"Contacts" => "Kontakty",
"Sorry, this functionality has not been implemented yet" => "Niestety, ta funkcja nie została jeszcze zaimplementowana",
"Not implemented" => "Nie wdrożono",
"Couldn't get a valid address." => "Nie można pobrać prawidłowego adresu.",
"Error" => "Błąd",
"Please enter an email address." => "Podaj adres email",
"Enter name" => "Wpisz nazwę",
"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",
"Select type" => "Wybierz typ",
"Contact is already in this group." => "Kontakt jest już w tej grupie.",
"Contacts are already in this group." => "Kontakty są już w tej grupie.",
"Couldn't get contact list." => "Nie można pobrać listy kontaktów.",
"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}",
"Indexing contacts" => "Indeksuj kontakty",
"Add to..." => "Dodaj do...",
"Remove from..." => "Usuń z...",
"Add group..." => "Dodaje grupę....",
"Select photo" => "Wybierz zdjęcie",
"You do not have permission to add contacts to " => "Nie masz uprawnień dodawania kontaktów do",
"Please select one of your own address books." => "Wybierz własną książkę adresową.",
"Permission error" => "Błąd uprawnień",
"Click to undo deletion of \"" => "Kliknij aby cofnąć usunięcie \"",
"Cancelled deletion of: \"" => "Anulowane usunięcie :\"",
"This property has to be non-empty." => "Ta właściwość nie może być pusta.",
"Couldn't serialize elements." => "Nie można serializować elementów.",
"Unknown error. Please check logs." => "Nieznany błąd. Sprawdź logi",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "\"deleteProperty' wywołana bez argumentu typu. Proszę raportuj na bugs.owncloud.org",
"Edit name" => "Zmień nazwę",
"No files selected for upload." => "Żadne pliki nie zostały zaznaczone do wysłania.",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Plik, który próbujesz wysłać przekracza maksymalny rozmiar pliku przekazywania na tym serwerze.",
"Error loading profile picture." => "Błąd wczytywania zdjęcia profilu.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Niektóre kontakty są zaznaczone do usunięcia, ale nie są usunięte jeszcze. Proszę czekać na ich usunięcie.",
"Do you want to merge these address books?" => "Czy chcesz scalić te książki adresowe?",
"Shared by " => "Udostępniane przez",
"Upload too large" => "Załadunek za duży",
"Only image files can be used as profile picture." => "Tylko obrazki mogą być użyte jako zdjęcie profilowe.",
"Wrong file type" => "Zły typ pliku",
"Your browser doesn't support AJAX upload. Please click on the profile picture to select a photo to upload." => "Twoja przeglądarka nie obsługuje wczytywania AJAX. Proszę kliknąć na zdjęcie profilu, aby wybrać zdjęcie do wgrania.",
"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",
"Pending" => "W toku",
"Import done" => "Import zakończony",
"Network or server error. Please inform administrator." => "Błąd połączenia lub serwera. Skontaktuj sie z administratorem.",
"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",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Plik, który próbujesz wysłać przekracza maksymalny rozmiar pliku przekazywania na tym serwerze.",
"Upload too large" => "Załadunek za duży",
"Pending" => "W toku",
"Add group" => "Dodaj drupę",
"No files selected for upload." => "Żadne pliki nie zostały zaznaczone do wysłania.",
"Edit profile picture" => "Edytuj zdjęcie profilu",
"Error loading profile picture." => "Błąd wczytywania zdjęcia profilu.",
"Enter name" => "Wpisz nazwę",
"Enter description" => "Wprowadź opis",
"Select addressbook" => "Wybierz książkę adresową",
"The address book name cannot be empty." => "Nazwa książki adresowej nie może być pusta.",
"Is this correct?" => "Jest to prawidłowe?",
"There was an unknown error when trying to delete this contact" => "Wystąpił nieznany błąd podczas próby usunięcia tego kontaktu",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Niektóre kontakty są zaznaczone do usunięcia, ale nie są usunięte jeszcze. Proszę czekać na ich usunięcie.",
"Click to undo deletion of {num} contacts" => "Kliknij aby cofnąć usunięcie {num} kontaktów",
"Cancelled deletion of {num}" => "Usunięcie Anulowane {num}",
"Result: " => "Wynik: ",
" imported, " => " importowane, ",
" failed." => " nie powiodło się.",
@ -100,9 +112,6 @@
"There was an error updating the addressbook." => "Wystąpił błąd podczas aktualizowania książki adresowej.",
"You do not have the permissions to delete this addressbook." => "Nie masz uprawnień do usunięcia tej książki adresowej.",
"There was an error deleting this addressbook." => "Wystąpił błąd podczas usuwania tej książki adresowej",
"Addressbook not found: " => "Nie znaleziono książki adresowej:",
"This is not your addressbook." => "To nie jest Twoja książka adresowa.",
"Contact could not be found." => "Nie można odnaleźć kontaktu.",
"Jabber" => "Jabber",
"AIM" => "AIM",
"MSN" => "MSN",
@ -126,19 +135,9 @@
"Video" => "Połączenie wideo",
"Pager" => "Pager",
"Internet" => "Internet",
"Birthday" => "Urodziny",
"Business" => "Biznesowe",
"Call" => "Wywołanie",
"Clients" => "Klienci",
"Deliverer" => "Doręczanie",
"Holidays" => "Święta",
"Ideas" => "Pomysły",
"Journey" => "Podróż",
"Jubilee" => "Jubileusz",
"Meeting" => "Spotkanie",
"Personal" => "Osobiste",
"Projects" => "Projekty",
"Questions" => "Pytania",
"Friends" => "Przyjaciele",
"Family" => "Rodzina",
"There was an error deleting properties for this contact." => "Wystąpił błąd podczas usuwania właściwości dla tego kontaktu.",
"{name}'s Birthday" => "{name} Urodzony",
"Contact" => "Kontakt",
"You do not have the permissions to add contacts to this addressbook." => "Nie masz uprawnień do dodawania kontaktów do tej książki adresowej.",
@ -148,9 +147,21 @@
"Could not find the Addressbook with ID: " => "Nie można odnaleźć książki adresowej z ID.",
"You do not have the permissions to delete this contact." => "Nie masz uprawnień kasowania kontaktów.",
"There was an error deleting this contact." => "Wystąpił błąd podczas usuwania tego kontaktu.",
"Add Contact" => "Dodaj kontakt",
"Import" => "Import",
"Contact not found." => "Kontaktu nie znaleziono.",
"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",
"Groups" => "Grupy",
"Favorite" => "Ulubione",
"Delete Contact" => "Usuń kontakt",
"Close" => "Zamknij",
"Keyboard shortcuts" => "Skróty klawiatury",
"Navigation" => "Nawigacja",
@ -164,56 +175,83 @@
"Add new contact" => "Dodaj nowy kontakt",
"Add new addressbook" => "Dodaj nowa książkę adresową",
"Delete current contact" => "Usuń obecny kontakt",
"Drop photo to upload" => "Upuść fotografię aby załadować",
"<h3>You have no contacts in your addressbook.</h3><p>Add a new contact or import existing contacts from a VCF file.</p>" => "<h3>Nie masz żadnych kontaktów w Twojej książce adresowej.</h3><p>Dodaj nowy kontakt lub zaimportuj istniejące kontakty z pliku VCF.</p>",
"Add contact" => "Dodaj kontakt",
"Compose mail" => "Tworzenie wiadomości",
"Delete group" => "Usuń grupę",
"Delete current photo" => "Usuń aktualne zdjęcie",
"Edit current photo" => "Edytuj aktualne zdjęcie",
"Upload new photo" => "Wczytaj nowe zdjęcie",
"Select photo from ownCloud" => "Wybierz zdjęcie z ownCloud",
"Edit name details" => "Edytuj szczegóły nazwy",
"Organization" => "Organizacja",
"First name" => "Imię",
"Additional names" => "Dodatkowe nazwy",
"Last name" => "Nazwisko",
"Nickname" => "Nazwa",
"Enter nickname" => "Wpisz nazwę",
"Web site" => "Strona www",
"http://www.somesite.com" => "http://www.jakasstrona.pl",
"Go to web site" => "Idż do strony www",
"dd-mm-yyyy" => "dd-mm-rrrr",
"Groups" => "Grupy",
"Separate groups with commas" => "Oddziel grupy przecinkami",
"Edit groups" => "Edytuj grupy",
"Preferred" => "Preferowane",
"Please specify a valid email address." => "Określ prawidłowy adres e-mail.",
"Enter email address" => "Wpisz adres email",
"Mail to address" => "Mail na adres",
"Delete email address" => "Usuń adres mailowy",
"Enter phone number" => "Wpisz numer telefonu",
"Delete phone number" => "Usuń numer telefonu",
"Instant Messenger" => "Komunikator",
"Delete IM" => "Usuń Komunikator",
"View on map" => "Zobacz na mapie",
"Edit address details" => "Edytuj szczegóły adresu",
"Add notes here." => "Dodaj notatkę tutaj.",
"Add field" => "Dodaj pole",
"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",
"Instant Messaging" => "Komunikator",
"Address" => "Adres",
"Note" => "Uwaga",
"Download contact" => "Pobiera kontakt",
"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",
"Mail to address" => "Mail na adres",
"Delete email address" => "Usuń adres mailowy",
"Enter phone number" => "Wpisz numer telefonu",
"Delete phone number" => "Usuń numer telefonu",
"Go to web site" => "Idż do strony www",
"Delete URL" => "Usuń URL",
"View on map" => "Zobacz na mapie",
"Delete address" => "Usuń adres",
"1 Main Street" => "1 główna ulica",
"Street address" => "Ulica",
"12345" => "12345",
"Postal code" => "Kod pocztowy",
"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",
"Edit name details" => "Edytuj szczegóły nazwy",
"http://www.somesite.com" => "http://www.jakasstrona.pl",
"dd-mm-yyyy" => "dd-mm-rrrr",
"Separate groups with commas" => "Oddziel grupy przecinkami",
"Edit groups" => "Edytuj grupy",
"Enter email address" => "Wpisz adres email",
"Edit address details" => "Edytuj szczegóły adresu",
"Add notes here." => "Dodaj notatkę tutaj.",
"Add field" => "Dodaj pole",
"Download contact" => "Pobiera 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",
"PO Box" => "Skrzynka pocztowa",
"Street address" => "Ulica",
"Street and number" => "Ulica i numer",
"Extended" => "Rozszerzony",
"Apartment number etc." => "Numer lokalu",
"City" => "Miasto",
"Region" => "Region",
"E.g. state or province" => "Np. stanu lub prowincji",
"Zipcode" => "Kod pocztowy",
"Postal code" => "Kod pocztowy",
"Country" => "Kraj",
"Addressbook" => "Książka adresowa",
"Hon. prefixes" => "Prefiksy Hon.",
"Miss" => "Panna",
@ -223,7 +261,6 @@
"Mrs" => "Pani",
"Dr" => "Dr",
"Given name" => "Podaj imię",
"Additional names" => "Dodatkowe nazwy",
"Family name" => "Nazwa rodziny",
"Hon. suffixes" => "Sufiksy Hon.",
"J.D." => "J.D.",
@ -240,15 +277,12 @@
"Name of new addressbook" => "Nazwa nowej książki adresowej",
"Importing contacts" => "importuj kontakty",
"<h3>You have no contacts in your addressbook.</h3><p>You can import VCF files by dragging them to the contacts list and either drop them on an addressbook to import into it, or on an empty spot to create a new addressbook and import into that.<br />You can also import by clicking on the import button at the bottom of the list.</p>" => "<h3>Nie masz kontaktów w książce adresowej.</h3><p>Możesz zaimportować pliki VCF poprzez przeciągnięcie ich do listy kontaktów i albo upuścić je na książce adresowej w celu zaimportowanie ich do niej lub na pustym miejscu, aby utworzyć nowych nową książke adresową i zaimportować je do niej.<br/>Możesz również także zaimportować, klikając przycisk Importuj na dole listy.</p>",
"Add contact" => "Dodaj kontakt",
"Select Address Books" => "Wybierz książki adresowe",
"Enter description" => "Wprowadź opis",
"CardDAV syncing addresses" => "adres do synchronizacji CardDAV",
"more info" => "więcej informacji",
"Primary address (Kontact et al)" => "Pierwszy adres",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "Książki adresowe",
"Share" => "Udostępnij",
"New Address Book" => "Nowa książka adresowa",
"Name" => "Nazwa",
"Description" => "Opis",

View File

@ -1,3 +1,7 @@
<?php $TRANSLATIONS = array(
"<h3>You have no contacts in your addressbook.</h3><p>You can import VCF files by dragging them to the contacts list and either drop them on an addressbook to import into it, or on an empty spot to create a new addressbook and import into that.<br />You can also import by clicking on the import button at the bottom of the list.</p>" => "<h3>Nie masz kontaktów w książce adresowej.</h3><p>Możesz zaimportować pliki VCF poprzez przeciągnięcie ich do listy kontaktów i albo upuścić je na książce adresowej w celu zaimportowanie ich do niej lub na pustym miejscu, aby utworzyć nowych nową książke adresową i zaimportować je do niej.<br/>Możesz również także zaimportować, klikając przycisk Importuj na dole listy.</p>"
"Settings" => "Ustawienia",
"Title" => "Tytuł",
"Email" => "Email",
"<h3>You have no contacts in your addressbook.</h3><p>You can import VCF files by dragging them to the contacts list and either drop them on an addressbook to import into it, or on an empty spot to create a new addressbook and import into that.<br />You can also import by clicking on the import button at the bottom of the list.</p>" => "<h3>Nie masz kontaktów w książce adresowej.</h3><p>Możesz zaimportować pliki VCF poprzez przeciągnięcie ich do listy kontaktów i albo upuścić je na książce adresowej w celu zaimportowanie ich do niej lub na pustym miejscu, aby utworzyć nowych nową książke adresową i zaimportować je do niej.<br/>Możesz również także zaimportować, klikając przycisk Importuj na dole listy.</p>",
"Save" => "Zapisz"
);

View File

@ -2,24 +2,24 @@
"Error (de)activating addressbook." => "Erro ao (des)ativar agenda.",
"id is not set." => "ID não definido.",
"Cannot update addressbook with an empty name." => "Não é possível atualizar sua agenda com um nome em branco.",
"No category name given." => "Nenhum nome de categoria foi dado.",
"Error adding group." => "Erro ao adicionar grupo.",
"Group ID missing from request." => "O ID do grupo requisitado não foi encontrado.",
"Contact ID missing from request." => "O ID do contato requisitado não foi encontrado.",
"No ID provided" => "Nenhum ID fornecido",
"Error setting checksum." => "Erro ajustando checksum.",
"No categories selected for deletion." => "Nenhum categoria selecionada para remoção.",
"No address books found." => "Nenhuma agenda de endereços encontrada.",
"No contacts found." => "Nenhum contato encontrado.",
"element name is not set." => "nome do elemento não definido.",
"Could not parse contact: " => "Incapaz de analisar contato:",
"Cannot add empty property." => "Não é possível adicionar propriedade vazia.",
"At least one of the address fields has to be filled out." => "Pelo menos um dos campos de endereço tem que ser preenchido.",
"Trying to add duplicate property: " => "Tentando adiciona propriedade duplicada:",
"Missing IM parameter." => "Faltando parâmetro de IM.",
"Unknown IM: " => "IM desconhecido:",
"Information about vCard is incorrect. Please reload the page." => "Informações sobre vCard é incorreta. Por favor, recarregue a página.",
"Missing ID" => "Faltando ID",
"Error parsing VCard for ID: \"" => "Erro de identificação VCard para ID:",
"checksum is not set." => "checksum não definido.",
"Information about vCard is incorrect. Please reload the page." => "Informações sobre vCard é incorreta. Por favor, recarregue a página.",
"Couldn't find vCard for %d." => "Não foi possível encontrar o vCard %d.",
"Information about vCard is incorrect. Please reload the page: " => "Informação sobre vCard incorreto. Por favor, recarregue a página:",
"Something went FUBAR. " => "Something went FUBAR. ",
"Cannot save property of type \"%s\" as array" => "Não foi possível salvar a propriedade od tipo \"%s\" como um array",
"Missing IM parameter." => "Faltando parâmetro de IM.",
"Unknown IM: " => "IM desconhecido:",
"No contact ID was submitted." => "Nenhum ID do contato foi submetido.",
"Error reading contact photo." => "Erro de leitura na foto do contato.",
"Error saving temporary file." => "Erro ao salvar arquivo temporário.",
@ -46,43 +46,29 @@
"Couldn't load temporary image: " => "Não foi possível carregar a imagem temporária:",
"No file was uploaded. Unknown error" => "Nenhum arquivo foi transferido. Erro desconhecido",
"Contacts" => "Contatos",
"Sorry, this functionality has not been implemented yet" => "Desculpe, esta funcionalidade não foi implementada ainda",
"Not implemented" => "não implementado",
"Couldn't get a valid address." => "Não foi possível obter um endereço válido.",
"Error" => "Erro",
"Please enter an email address." => "Por favor digite um endereço de e-mail",
"Enter name" => "Digite o nome",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formato personalizado, Nome curto, Nome completo, Inverter ou Inverter com vírgula",
"Select type" => "Selecione o tipo",
"Contact is already in this group." => "O contato já pertence ao grupo.",
"Contacts are already in this group." => "Os contatos já pertencem ao grupo.",
"A group named {group} already exists" => "Já existe um grupo com o nome {group}",
"All" => "Todos",
"Favorites" => "Favoritos",
"Shared by {owner}" => "Compartilhado por {owner}",
"Add group..." => "Adicionar grupo...",
"Select photo" => "Selecione foto",
"You do not have permission to add contacts to " => "Você não tem permissão para adicionar contatos a",
"Please select one of your own address books." => "Por favor selecione uma das suas próprias agendas.",
"Permission error" => "Erro de permissão",
"Click to undo deletion of \"" => "Clique para desfazer remoção de \"",
"Cancelled deletion of: \"" => "Remoção desfeita de: \"",
"This property has to be non-empty." => "Esta propriedade não pode estar vazia.",
"Couldn't serialize elements." => "Não foi possível serializar elementos.",
"Unknown error. Please check logs." => "Erro desconhecido. Por favor verifique os logs.",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "\"deleteProperty\" chamado sem argumento de tipo. Por favor, informe a bugs.owncloud.org",
"Edit name" => "Editar nome",
"No files selected for upload." => "Nenhum arquivo selecionado para carregar.",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "O arquivo que você está tentando carregar excede o tamanho máximo para este servidor.",
"Error loading profile picture." => "Erro ao carregar imagem de perfil.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Alguns contatos foram marcados para remoção, mas não foram removidos ainda. Por favor aguarde a remoção desses contatos.",
"Do you want to merge these address books?" => "Você deseja unir essas agendas?",
"Shared by " => "Compartilhado por",
"Upload too large" => "Upload muito grande",
"Only image files can be used as profile picture." => "Somente imagens podem ser usadas como foto de perfil.",
"Wrong file type" => "Tipo de arquivo errado",
"Your browser doesn't support AJAX upload. Please click on the profile picture to select a photo to upload." => "Seu navegador não suporta upload via AJAX. Por favor clique na foto de perfil e selecione uma foto para enviar.",
"Unable to upload your file as it is a directory or has 0 bytes" => "Incapaz de enviar seu arquivo pois ele é um diretório, ou ele tem 0 bytes",
"Upload Error" => "Erro de Upload",
"Pending" => "Pendente",
"Import done" => "Importação concluída",
"Not all files uploaded. Retrying..." => "Nem todos os arquivos foram enviados. Tentando novamente...",
"Something went wrong with the upload, please retry." => "Algo errado ocorreu com o envio, por favor tente novamente.",
"Error" => "Erro",
"Importing..." => "Importando...",
"Unable to upload your file as it is a directory or has 0 bytes" => "Incapaz de enviar seu arquivo pois ele é um diretório, ou ele tem 0 bytes",
"Upload Error" => "Erro de Upload",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "O arquivo que você está tentando carregar excede o tamanho máximo para este servidor.",
"Upload too large" => "Upload muito grande",
"Pending" => "Pendente",
"No files selected for upload." => "Nenhum arquivo selecionado para carregar.",
"Error loading profile picture." => "Erro ao carregar imagem de perfil.",
"Enter name" => "Digite o nome",
"Enter description" => "Digite a descrição",
"The address book name cannot be empty." => "O nome da agenda não pode ficar em branco.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Alguns contatos foram marcados para remoção, mas não foram removidos ainda. Por favor aguarde a remoção desses contatos.",
"Result: " => "Resultado:",
" imported, " => "importado,",
" failed." => "falhou.",
@ -100,9 +86,6 @@
"There was an error updating the addressbook." => "Houve um erro ao atualizar a agenda.",
"You do not have the permissions to delete this addressbook." => "Você não tem permissão para remover essa agenda.",
"There was an error deleting this addressbook." => "Houve um erro ao remover essa agenda.",
"Addressbook not found: " => "Agenda não encontrada:",
"This is not your addressbook." => "Esta não é a sua agenda de endereços.",
"Contact could not be found." => "Contato não pôde ser encontrado.",
"Jabber" => "Jabber",
"AIM" => "AIM",
"MSN" => "MSN",
@ -126,19 +109,8 @@
"Video" => "Vídeo",
"Pager" => "Pager",
"Internet" => "Internet",
"Birthday" => "Aniversário",
"Business" => "Trabalho",
"Call" => "Chamar",
"Clients" => "Clientes",
"Deliverer" => "Entrega",
"Holidays" => "Feriados",
"Ideas" => "Idéias",
"Journey" => "Jornada",
"Jubilee" => "Jubileu",
"Meeting" => "Reunião",
"Personal" => "Pessoal",
"Projects" => "Projetos",
"Questions" => "Perguntas",
"Friends" => "Amigos",
"Family" => "Família",
"{name}'s Birthday" => "Aniversário de {name}",
"Contact" => "Contato",
"You do not have the permissions to add contacts to this addressbook." => "Você não tem permissões para adicionar contatos a essa agenda.",
@ -148,9 +120,10 @@
"Could not find the Addressbook with ID: " => "Não pôde encontrar a Agenda com ID:",
"You do not have the permissions to delete this contact." => "Você não tem permissão para remover esse contato.",
"There was an error deleting this contact." => "Houve um erro ao remover esse contato.",
"Add Contact" => "Adicionar Contato",
"Import" => "Importar",
"Settings" => "Ajustes",
"Import" => "Importar",
"OK" => "OK",
"Groups" => "Grupos",
"Close" => "Fechar.",
"Keyboard shortcuts" => "Atalhos do teclado",
"Navigation" => "Navegação",
@ -164,56 +137,64 @@
"Add new contact" => "Adicionar novo contato",
"Add new addressbook" => "Adicionar nova agenda",
"Delete current contact" => "Remover contato atual",
"Drop photo to upload" => "Arraste a foto para ser carregada",
"Add contact" => "Adicionar contatos",
"Delete current photo" => "Deletar imagem atual",
"Edit current photo" => "Editar imagem atual",
"Upload new photo" => "Carregar nova foto",
"Select photo from ownCloud" => "Selecionar foto do OwnCloud",
"Edit name details" => "Editar detalhes do nome",
"Organization" => "Organização",
"Additional names" => "Segundo Nome",
"Nickname" => "Apelido",
"Enter nickname" => "Digite o apelido",
"Web site" => "Web site",
"http://www.somesite.com" => "http://www.qualquersite.com",
"Go to web site" => "Ir para web site",
"dd-mm-yyyy" => "dd-mm-aaaa",
"Groups" => "Grupos",
"Separate groups with commas" => "Separe grupos por virgula",
"Edit groups" => "Editar grupos",
"Preferred" => "Preferido",
"Please specify a valid email address." => "Por favor, especifique um email válido.",
"Enter email address" => "Digite um endereço de email",
"Mail to address" => "Correio para endereço",
"Delete email address" => "Remover endereço de email",
"Enter phone number" => "Digite um número de telefone",
"Delete phone number" => "Remover número de telefone",
"Instant Messenger" => "Mensageiro Instantâneo",
"Delete IM" => "Delete IM",
"View on map" => "Visualizar no mapa",
"Edit address details" => "Editar detalhes de endereço",
"Add notes here." => "Adicionar notas",
"Add field" => "Adicionar campo",
"Title" => "Título",
"Organization" => "Organização",
"Birthday" => "Aniversário",
"Add" => "Adicionar",
"Phone" => "Telefone",
"Email" => "E-mail",
"Instant Messaging" => "Mensagem Instantânea",
"Address" => "Endereço",
"Note" => "Nota",
"Download contact" => "Baixar contato",
"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",
"Delete email address" => "Remover endereço de email",
"Enter phone number" => "Digite um número de telefone",
"Delete phone number" => "Remover número de telefone",
"Go to web site" => "Ir para web site",
"View on map" => "Visualizar no mapa",
"Street address" => "Endereço da rua",
"Postal code" => "Código postal",
"City" => "Cidade",
"Country" => "País",
"Instant Messenger" => "Mensageiro Instantâneo",
"Delete IM" => "Delete IM",
"Share" => "Compartilhar",
"Export" => "Exportar",
"Add Contact" => "Adicionar Contato",
"Drop photo to upload" => "Arraste a foto para ser carregada",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formato personalizado, Nome curto, Nome completo, Inverter ou Inverter com vírgula",
"Edit name details" => "Editar detalhes do nome",
"http://www.somesite.com" => "http://www.qualquersite.com",
"dd-mm-yyyy" => "dd-mm-aaaa",
"Separate groups with commas" => "Separe grupos por virgula",
"Edit groups" => "Editar grupos",
"Enter email address" => "Digite um endereço de email",
"Edit address details" => "Editar detalhes de endereço",
"Add notes here." => "Adicionar notas",
"Add field" => "Adicionar campo",
"Download contact" => "Baixar contato",
"The temporary image has been removed from cache." => "A imagem temporária foi removida cache.",
"Edit address" => "Editar endereço",
"Type" => "Digite",
"PO Box" => "Caixa Postal",
"Street address" => "Endereço da rua",
"Street and number" => "Logradouro e número",
"Extended" => "Estendido",
"Apartment number etc." => "Número do apartamento, etc.",
"City" => "Cidade",
"Region" => "Região",
"E.g. state or province" => "Estado ou província",
"Zipcode" => "CEP",
"Postal code" => "Código postal",
"Country" => "País",
"Addressbook" => "Agenda de Endereço",
"Hon. prefixes" => "Exmo. Prefixos ",
"Miss" => "Senhorita",
@ -223,7 +204,6 @@
"Mrs" => "Sra.",
"Dr" => "Dr",
"Given name" => "Primeiro Nome",
"Additional names" => "Segundo Nome",
"Family name" => "Sobrenome",
"Hon. suffixes" => "Exmo. Sufixos",
"J.D." => "J.D.",
@ -240,15 +220,12 @@
"Name of new addressbook" => "Nome da nova agenda de endereços",
"Importing contacts" => "Importar contatos",
"<h3>You have no contacts in your addressbook.</h3><p>You can import VCF files by dragging them to the contacts list and either drop them on an addressbook to import into it, or on an empty spot to create a new addressbook and import into that.<br />You can also import by clicking on the import button at the bottom of the list.</p>" => "<h3>Você não tem contatos em sua agenda de endereços.</h3><p>Você pode importar arquivos VCF arrastando-os para a lista de contatos ou para uma agenda para importar para ela, ou em um local vazio para criar uma nova agenda e importar para ela.<br />Você também pode importar, clicando no botão importar na parte inferior da lista.</p>",
"Add contact" => "Adicionar contatos",
"Select Address Books" => "Selecione Agendas",
"Enter description" => "Digite a descrição",
"CardDAV syncing addresses" => "Sincronizando endereços CardDAV",
"more info" => "leia mais",
"Primary address (Kontact et al)" => "Endereço primário(Kontact et al)",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "Agendas de Endereço",
"Share" => "Compartilhar",
"New Address Book" => "Nova agenda",
"Name" => "Nome",
"Description" => "Descrição",

View File

@ -2,24 +2,24 @@
"Error (de)activating addressbook." => "Erro a (des)ativar o livro de endereços",
"id is not set." => "id não está definido",
"Cannot update addressbook with an empty name." => "Não é possivel actualizar o livro de endereços com o nome vazio.",
"No category name given." => "Categoria sem nome",
"Error adding group." => "Erro a adicionar o grupo",
"Group ID missing from request." => "Falta o ID do grupo no pedido",
"Contact ID missing from request." => "Falta o ID do contacto no pedido",
"No ID provided" => "Nenhum ID inserido",
"Error setting checksum." => "Erro a definir checksum.",
"No categories selected for deletion." => "Nenhuma categoria selecionada para eliminar.",
"No address books found." => "Nenhum livro de endereços encontrado.",
"No contacts found." => "Nenhum contacto encontrado.",
"element name is not set." => "o nome do elemento não está definido.",
"Could not parse contact: " => "Incapaz de processar contacto",
"Cannot add empty property." => "Não é possivel adicionar uma propriedade vazia",
"At least one of the address fields has to be filled out." => "Pelo menos um dos campos de endereço precisa de estar preenchido",
"Trying to add duplicate property: " => "A tentar adicionar propriedade duplicada: ",
"Missing IM parameter." => "Falta o parâmetro de mensagens instantâneas (IM)",
"Unknown IM: " => "Mensagens instantâneas desconhecida (IM)",
"Information about vCard is incorrect. Please reload the page." => "A informação sobre o vCard está incorreta. Por favor refresque a página",
"Missing ID" => "Falta ID",
"Error parsing VCard for ID: \"" => "Erro a analisar VCard para o ID: \"",
"checksum is not set." => "Checksum não está definido.",
"Information about vCard is incorrect. Please reload the page." => "A informação sobre o vCard está incorreta. Por favor recarregue a página",
"Couldn't find vCard for %d." => "Não foi possível encontrar o vCard para %d.",
"Information about vCard is incorrect. Please reload the page: " => "A informação sobre o VCard está incorrecta. Por favor refresque a página: ",
"Something went FUBAR. " => "Algo provocou um FUBAR. ",
"Cannot save property of type \"%s\" as array" => "Não foi possível guardar a propriedade do tipo \"%s\" como vector",
"Missing IM parameter." => "Falta o parâmetro de mensagens instantâneas (IM)",
"Unknown IM: " => "Mensagens instantâneas desconhecida (IM)",
"No contact ID was submitted." => "Nenhum ID de contacto definido.",
"Error reading contact photo." => "Erro a ler a foto do contacto.",
"Error saving temporary file." => "Erro a guardar ficheiro temporário.",
@ -35,6 +35,9 @@
"Error cropping image" => "Erro a recorar a imagem",
"Error creating temporary image" => "Erro a criar a imagem temporária",
"Error finding image: " => "Erro enquanto pesquisava pela imagem: ",
"Key is not set for: " => "A chave não está definida para:",
"Value is not set for: " => "O valor não está definido para:",
"Could not set preference: " => "Não foi possível definir as preferencias:",
"Error uploading contacts to storage." => "Erro a carregar os contactos para o armazenamento.",
"There is no error, the file uploaded with success" => "Não ocorreu erros, o ficheiro foi submetido com sucesso",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "O tamanho do ficheiro carregado excede o parametro upload_max_filesize em php.ini",
@ -46,43 +49,52 @@
"Couldn't load temporary image: " => "Não é possível carregar a imagem temporária: ",
"No file was uploaded. Unknown error" => "Nenhum ficheiro foi carregado. Erro desconhecido",
"Contacts" => "Contactos",
"Sorry, this functionality has not been implemented yet" => "Desculpe, esta funcionalidade ainda não está implementada",
"Not implemented" => "Não implementado",
"Couldn't get a valid address." => "Não foi possível obter um endereço válido.",
"Error" => "Erro",
"Please enter an email address." => "Por favor escreva um endereço de email.",
"Enter name" => "Introduzir nome",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formate personalizado, Nome curto, Nome completo, Reverso ou Reverso com virgula",
"Select type" => "Seleccionar tipo",
"Contact is already in this group." => "O contacto já está neste grupo.",
"Contacts are already in this group." => "Os contactos já estão neste grupo",
"Couldn't get contact list." => "Não foi possível ler a lista de contactos",
"Contact is not in this group." => "O contacto não está neste grupo",
"Contacts are not in this group." => "Os contactos não estão neste grupo",
"A group named {group} already exists" => "Um grupo com o nome {group} já existe",
"You can drag groups to\narrange them as you like." => "Pode arrastar grupos para\ncolocá-los como desejar.",
"All" => "Todos",
"Favorites" => "Favoritos",
"Shared by {owner}" => "Partilhado por {owner}",
"Indexing contacts" => "A indexar os contactos",
"Add to..." => "Adicionar a...",
"Remove from..." => "Remover de...",
"Add group..." => "Adicionar grupo...",
"Select photo" => "Seleccione uma fotografia",
"You do not have permission to add contacts to " => "Não tem permissão para acrescentar contactos a",
"Please select one of your own address books." => "Por favor escolha uma das suas listas de contactos.",
"Permission error" => "Erro de permissão",
"Click to undo deletion of \"" => "Click para recuperar \"",
"Cancelled deletion of: \"" => "Cancelou o apagar de: \"",
"This property has to be non-empty." => "Esta propriedade não pode estar vazia.",
"Couldn't serialize elements." => "Não foi possivel serializar os elementos",
"Unknown error. Please check logs." => "Erro desconhecido. Por favor verifique os logs.",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' chamada sem argumento definido. Por favor report o problema em bugs.owncloud.org",
"Edit name" => "Editar nome",
"No files selected for upload." => "Nenhum ficheiro seleccionado para enviar.",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "O tamanho do ficheiro que está a tentar carregar ultrapassa o limite máximo definido para ficheiros no servidor.",
"Error loading profile picture." => "Erro ao carregar imagem de perfil.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Alguns contactos forma marcados para apagar, mas ainda não foram apagados. Por favor espere que ele sejam apagados.",
"Do you want to merge these address books?" => "Quer fundir estes Livros de endereços?",
"Shared by " => "Partilhado por",
"Upload too large" => "Upload muito grande",
"Only image files can be used as profile picture." => "Apenas ficheiros de imagens podem ser usados como fotografias de perfil.",
"Wrong file type" => "Tipo de ficheiro errado",
"Your browser doesn't support AJAX upload. Please click on the profile picture to select a photo to upload." => "O seu navegador não suporta o upload por AJAX. Por favor click na imagem de perfil para seleccionar uma fotografia para enviar.",
"Unable to upload your file as it is a directory or has 0 bytes" => "Foi impossível enviar o seu ficheiro, pois é uma directoria ou tem 0 bytes.",
"Upload Error" => "Erro de upload",
"Pending" => "Pendente",
"Import done" => "Importação terminada",
"Network or server error. Please inform administrator." => "Erro de rede ou do servidor. Por favor, informe o administrador.",
"Error adding to group." => "Erro a adicionar ao grupo.",
"Error removing from group." => "Erro a remover do grupo.",
"There was an error opening a mail composer." => "Houve um erro a abrir o editor de e-mail.",
"Deleting done. Click here to cancel reloading." => "A eliminação foi concluída com sucesso. Clique aqui para cancelar o refrescamento.",
"Add address book" => "Adicionar livro de endereços.",
"Import done. Click here to cancel reloading." => "Importação concluída com sucesso. Clique aqui para cancelar o refrescamento.",
"Not all files uploaded. Retrying..." => "Nem todos os ficheiros foram enviados. A tentar de novo...",
"Something went wrong with the upload, please retry." => "Algo correu mal ao enviar, por favor tente de novo.",
"Error" => "Erro",
"Importing from {filename}..." => "A importar de {filename}...",
"{success} imported, {failed} failed." => "{sucess} importados, {failed} não importados.",
"Importing..." => "A importar...",
"Unable to upload your file as it is a directory or has 0 bytes" => "Não é possível fazer o envio do ficheiro devido a ser uma pasta ou ter 0 bytes",
"Upload Error" => "Erro no envio",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "O tamanho do ficheiro que está a tentar carregar ultrapassa o limite máximo definido para ficheiros no servidor.",
"Upload too large" => "Upload muito grande",
"Pending" => "Pendente",
"Add group" => "Adicionar grupo",
"No files selected for upload." => "Nenhum ficheiro seleccionado para enviar.",
"Edit profile picture" => "Editar a fotografia de perfil.",
"Error loading profile picture." => "Erro ao carregar imagem de perfil.",
"Enter name" => "Introduzir nome",
"Enter description" => "Introduzir descrição",
"Select addressbook" => "Selecionar livro de endereços",
"The address book name cannot be empty." => "O nome do livro de endereços não pode estar vazio.",
"Is this correct?" => "Isto está correcto?",
"There was an unknown error when trying to delete this contact" => "Houve um erro desconhecido enquanto tentava eliminar este contacto.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Alguns contactos forma marcados para apagar, mas ainda não foram apagados. Por favor espere que ele sejam apagados.",
"Click to undo deletion of {num} contacts" => "Clique para desfazer a eliminar de {num} contactos",
"Cancelled deletion of {num}" => "Cancelada a eliminação de {num} contactos",
"Result: " => "Resultado: ",
" imported, " => " importado, ",
" failed." => " falhou.",
@ -100,9 +112,6 @@
"There was an error updating the addressbook." => "Ocorreu um erro ao actualizar o livro de endereços.",
"You do not have the permissions to delete this addressbook." => "Não tem permissões para apagar esta lista de contactos.",
"There was an error deleting this addressbook." => "Ocorreu um erro ao apagar esta lista de contactos.",
"Addressbook not found: " => "Livro de endereços não encontrado.",
"This is not your addressbook." => "Esta não é a sua lista de contactos",
"Contact could not be found." => "O contacto não foi encontrado",
"Jabber" => "Jabber",
"AIM" => "AIM",
"MSN" => "MSN",
@ -118,7 +127,7 @@
"Work" => "Emprego",
"Home" => "Casa",
"Other" => "Outro",
"Mobile" => "Telemovel",
"Mobile" => "Telemóvel",
"Text" => "Texto",
"Voice" => "Voz",
"Message" => "Mensagem",
@ -126,19 +135,9 @@
"Video" => "Vídeo",
"Pager" => "Pager",
"Internet" => "Internet",
"Birthday" => "Aniversário",
"Business" => "Empresa",
"Call" => "Telefonar",
"Clients" => "Clientes",
"Deliverer" => "Fornecedor",
"Holidays" => "Férias",
"Ideas" => "Ideias",
"Journey" => "Viagem",
"Jubilee" => "Jubileu",
"Meeting" => "Encontro",
"Personal" => "Pessoal",
"Projects" => "Projectos",
"Questions" => "Questões",
"Friends" => "Amigos",
"Family" => "Familia",
"There was an error deleting properties for this contact." => "Houve um erro a eliminar as propriedades deste contacto",
"{name}'s Birthday" => "Aniversário de {name}",
"Contact" => "Contacto",
"You do not have the permissions to add contacts to this addressbook." => "Não tem permissões para acrescentar contactos a este livro de endereços.",
@ -148,9 +147,21 @@
"Could not find the Addressbook with ID: " => "Não foi possível encontrar a lista de contactos com o ID:",
"You do not have the permissions to delete this contact." => "Não tem permissões para apagar este contacto.",
"There was an error deleting this contact." => "Ocorreu um erro ao apagar este contacto.",
"Add Contact" => "Adicionar Contacto",
"Import" => "Importar",
"Contact not found." => "Contacto não encontrado",
"HomePage" => "Página Inicial",
"New Group" => "Novo Grupo",
"Settings" => "Configurações",
"Address books" => "Livro de endereços.",
"Import" => "Importar",
"Select files to import" => "Seleccione ficheiros para importar.",
"Select files" => "Seleccione os ficheiros.",
"Import into:" => "Importar para:",
"OK" => "OK",
"(De-)select all" => "(Des)seleccionar todos",
"New Contact" => "Novo Contacto",
"Groups" => "Grupos",
"Favorite" => "Favorito",
"Delete Contact" => "Eliminar o Contacto",
"Close" => "Fechar",
"Keyboard shortcuts" => "Atalhos de teclado",
"Navigation" => "Navegação",
@ -164,56 +175,79 @@
"Add new contact" => "Adicionar novo contacto",
"Add new addressbook" => "Adicionar novo Livro de endereços",
"Delete current contact" => "Apagar o contacto atual",
"Drop photo to upload" => "Arraste e solte fotos para carregar",
"<h3>You have no contacts in your addressbook.</h3><p>Add a new contact or import existing contacts from a VCF file.</p>" => "<h3>A sua lista de contactos está vazia.</h3><p>Adicione novos contactos ou importe de um ficheiro VCF.</p>",
"Add contact" => "Adicionar contacto",
"Compose mail" => "Escrever e-mail.",
"Delete group" => "Eliminar grupo",
"Delete current photo" => "Eliminar a foto actual",
"Edit current photo" => "Editar a foto actual",
"Upload new photo" => "Carregar nova foto",
"Select photo from ownCloud" => "Selecionar uma foto da ownCloud",
"Edit name details" => "Editar detalhes do nome",
"Organization" => "Organização",
"First name" => "Primeiro Nome",
"Additional names" => "Nomes adicionais",
"Last name" => "Ultimo Nome",
"Nickname" => "Alcunha",
"Enter nickname" => "Introduza alcunha",
"Web site" => "Página web",
"http://www.somesite.com" => "http://www.somesite.com",
"Go to web site" => "Ir para página web",
"dd-mm-yyyy" => "dd-mm-aaaa",
"Groups" => "Grupos",
"Separate groups with commas" => "Separe os grupos usando virgulas",
"Edit groups" => "Editar grupos",
"Preferred" => "Preferido",
"Please specify a valid email address." => "Por favor indique um endereço de correio válido",
"Enter email address" => "Introduza endereço de email",
"Mail to address" => "Enviar correio para o endereço",
"Delete email address" => "Eliminar o endereço de correio",
"Enter phone number" => "Insira o número de telefone",
"Delete phone number" => "Eliminar o número de telefone",
"Instant Messenger" => "Mensageiro instantâneo",
"Delete IM" => "Apagar mensageiro instantâneo (IM)",
"View on map" => "Ver no mapa",
"Edit address details" => "Editar os detalhes do endereço",
"Add notes here." => "Insira notas aqui.",
"Add field" => "Adicionar campo",
"Title" => "Titulo ",
"Organization" => "Organização",
"Birthday" => "Aniversário",
"Notes go here..." => "As notas ficam aqui:",
"Add" => "Adicionar",
"Phone" => "Telefone",
"Email" => "Email",
"Instant Messaging" => "Mensagens Instantâneas",
"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",
"Mail to address" => "Enviar correio para o endereço",
"Delete email address" => "Eliminar o endereço de correio",
"Enter phone number" => "Insira o número de telefone",
"Delete phone number" => "Eliminar o número de telefone",
"Go to web site" => "Ir para página web",
"Delete URL" => "Eliminar Endereço (URL)",
"View on map" => "Ver no mapa",
"Delete address" => "Eliminar endereço",
"1 Main Street" => "1 Rua Princial",
"Street address" => "Endereço da Rua",
"12345" => "12345",
"Postal code" => "Código Postal",
"Your city" => "Cidade",
"City" => "Cidade",
"Some region" => "Região (Distrito)",
"Your country" => "País",
"Country" => "País",
"Instant Messenger" => "Mensageiro instantâneo",
"Delete IM" => "Apagar mensageiro instantâneo (IM)",
"Share" => "Partilhar",
"Export" => "Exportar",
"CardDAV link" => "Link CardDAV",
"Add Contact" => "Adicionar Contacto",
"Drop photo to upload" => "Arraste e solte fotos para carregar",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formate personalizado, Nome curto, Nome completo, Reverso ou Reverso com virgula",
"Edit name details" => "Editar detalhes do nome",
"http://www.somesite.com" => "http://www.somesite.com",
"dd-mm-yyyy" => "dd-mm-aaaa",
"Separate groups with commas" => "Separe os grupos usando virgulas",
"Edit groups" => "Editar grupos",
"Enter email address" => "Introduza endereço de email",
"Edit address details" => "Editar os detalhes do endereço",
"Add notes here." => "Insira notas aqui.",
"Add field" => "Adicionar campo",
"Download contact" => "Transferir contacto",
"Delete contact" => "Apagar contato",
"The temporary image has been removed from cache." => "A imagem temporária foi retirada do cache.",
"Edit address" => "Editar endereço",
"Type" => "Tipo",
"PO Box" => "Apartado",
"Street address" => "Endereço da Rua",
"Street and number" => "Rua e número",
"Extended" => "Extendido",
"Apartment number etc." => "Número de Apartamento, etc.",
"City" => "Cidade",
"Region" => "Região",
"E.g. state or province" => "Por Ex. Estado ou província",
"Zipcode" => "Código Postal",
"Postal code" => "Código Postal",
"Country" => "País",
"Addressbook" => "Livro de endereços",
"Hon. prefixes" => "Prefixos honoráveis",
"Miss" => "Menina",
@ -223,7 +257,6 @@
"Mrs" => "Senhora",
"Dr" => "Dr",
"Given name" => "Nome introduzido",
"Additional names" => "Nomes adicionais",
"Family name" => "Nome de familia",
"Hon. suffixes" => "Sufixos Honoráveis",
"J.D." => "D.J.",
@ -240,15 +273,12 @@
"Name of new addressbook" => "Nome do novo livro de endereços",
"Importing contacts" => "A importar os contactos",
"<h3>You have no contacts in your addressbook.</h3><p>You can import VCF files by dragging them to the contacts list and either drop them on an addressbook to import into it, or on an empty spot to create a new addressbook and import into that.<br />You can also import by clicking on the import button at the bottom of the list.</p>" => "<h3>Não tem contactos no seu livro de endereços.</h3> Pode importar ficheiros VCF arrastando-os para a lista de contactos e largá-los num livro de endereços onde os queira importar, ou num lugar vazio para criar um novo livro de endereços e importar aí.<br/>Pode também importar clickando no botão de importar no fundo da lista.</p>",
"Add contact" => "Adicionar contacto",
"Select Address Books" => "Selecionar Livros de contactos",
"Enter description" => "Introduzir descrição",
"CardDAV syncing addresses" => "CardDAV a sincronizar endereços",
"more info" => "mais informação",
"Primary address (Kontact et al)" => "Endereço primario (Kontact et al)",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "Livros de endereços",
"Share" => "Partilhar",
"New Address Book" => "Novo livro de endereços",
"Name" => "Nome",
"Description" => "Descrição",

View File

@ -7,13 +7,8 @@
"No address books found." => "Nici o carte de adrese găsită",
"No contacts found." => "Nici un contact găsit",
"element name is not set." => "numele elementului nu este stabilit.",
"Cannot add empty property." => "Nu se poate adăuga un câmp gol.",
"At least one of the address fields has to be filled out." => "Cel puțin unul din câmpurile adresei trebuie completat.",
"Trying to add duplicate property: " => "Se încearcă adăugarea unei proprietăți duplicat:",
"Information about vCard is incorrect. Please reload the page." => "Informațiile cărții de vizită sunt incorecte. Te rog reîncarcă pagina.",
"Missing ID" => "ID lipsă",
"Error parsing VCard for ID: \"" => "Eroare la prelucrarea VCard-ului pentru ID:\"",
"checksum is not set." => "suma de control nu este stabilită.",
"Information about vCard is incorrect. Please reload the page." => "Informațiile cărții de vizită sunt incorecte. Te rog reîncarcă pagina.",
"Information about vCard is incorrect. Please reload the page: " => "Informația despre vCard este incorectă. Te rugăm să reîncarci pagina:",
"No contact ID was submitted." => "Nici un ID de contact nu a fost transmis",
"Error reading contact photo." => "Eroare la citerea fotografiei de contact",
@ -25,15 +20,21 @@
"Error loading image." => "Eroare la încărcarea imaginii.",
"Error uploading contacts to storage." => "Eroare la încărcarea contactelor.",
"There is no error, the file uploaded with success" => "Nu a apărut nici o eroare, fișierul a fost încărcat cu succes",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Fișierul are o dimensiune mai mare decât cea specificată în variabila upload_max_filesize din php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Fișierul are o dimensiune mai mare decât variabile MAX_FILE_SIZE specificată în formularul HTML",
"The uploaded file was only partially uploaded" => "Fișierul a fost încărcat doar parțial",
"No file was uploaded" => "Nu a fost încărcat nici un fișier",
"Missing a temporary folder" => "Lipsește un director temporar",
"No file was uploaded. Unknown error" => "Nici un fișier nu a fost încărcat. Eroare necunoscută",
"Contacts" => "Contacte",
"Error" => "Eroare",
"Importing..." => "Se importă...",
"Unable to upload your file as it is a directory or has 0 bytes" => "Nu s-a putut încărca fișierul tău deoarece pare să fie un director sau are 0 bytes.",
"Upload Error" => "Eroare la încărcare",
"Upload too large" => "Fișierul încărcat este prea mare",
"Pending" => "În așteptare",
"Enter name" => "Specifică nume",
"Select type" => "Selectează tip",
"Edit name" => "Editează nume",
"Enter description" => "Specifică descriere",
"Result: " => "Rezultat:",
" imported, " => "importat,",
"Show CardDav link" => "Arată legătură CardDav",
@ -42,8 +43,6 @@
"Delete" => "Șterge",
"Cancel" => "Anulează",
"More..." => "Mai multe...",
"This is not your addressbook." => "Nu se găsește în agendă.",
"Contact could not be found." => "Contactul nu a putut fi găsit.",
"Work" => "Servicu",
"Home" => "Acasă",
"Other" => "Altele",
@ -55,20 +54,12 @@
"Video" => "Video",
"Pager" => "Pager",
"Internet" => "Internet",
"Birthday" => "Zi de naștere",
"Business" => "Companie",
"Call" => "Sună",
"Clients" => "Clienți",
"Ideas" => "Idei",
"Meeting" => "Întâlnire",
"Personal" => "Personal",
"Projects" => "Proiecte",
"Questions" => "Întrebări",
"{name}'s Birthday" => "Ziua de naștere a {name}",
"Contact" => "Contact",
"Add Contact" => "Adaugă contact",
"Import" => "Importă",
"Settings" => "Setări",
"Import" => "Importă",
"OK" => "OK",
"Groups" => "Grupuri",
"Close" => "Închide",
"Keyboard shortcuts" => "Scurtături din tastatură",
"Navigation" => "Navigare",
@ -77,51 +68,57 @@
"Actions" => "Acțiuni",
"Add new contact" => "Adaugă contact nou",
"Delete current contact" => "Șterge contactul curent",
"Add contact" => "Adaugă contact",
"Delete current photo" => "Șterge poza curentă",
"Edit current photo" => "Editează poza curentă",
"Upload new photo" => "Încarcă poză nouă",
"Select photo from ownCloud" => "Selectează poză din ownCloud",
"Edit name details" => "Introdu detalii despre nume",
"Organization" => "Organizație",
"Nickname" => "Pseudonim",
"Enter nickname" => "Introdu pseudonim",
"Web site" => "Site web",
"Go to web site" => "Vizitează site-ul",
"dd-mm-yyyy" => "zz-ll-aaaa",
"Groups" => "Grupuri",
"Separate groups with commas" => "Separă grupurile cu virgule",
"Edit groups" => "Editează grupuri",
"Preferred" => "Preferat",
"Please specify a valid email address." => "Te rog să specifici un e-mail corect",
"Enter email address" => "Introdu adresa de e-mail",
"Mail to address" => "Trimite mesaj la e-mail",
"Delete email address" => "Șterge e-mail",
"Enter phone number" => "Specifică numărul de telefon",
"Delete phone number" => "Șterge numărul de telefon",
"View on map" => "Vezi pe hartă",
"Edit address details" => "Editează detaliile adresei",
"Add notes here." => "Adaugă note",
"Add field" => "Adaugă câmp",
"Title" => "Titlu",
"Organization" => "Organizație",
"Birthday" => "Zi de naștere",
"Add" => "Adaugă",
"Phone" => "Telefon",
"Email" => "Email",
"Address" => "Adresă",
"Note" => "Notă",
"Download contact" => "Descarcă acest contact",
"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",
"Delete email address" => "Șterge e-mail",
"Enter phone number" => "Specifică numărul de telefon",
"Delete phone number" => "Șterge numărul de telefon",
"Go to web site" => "Vizitează site-ul",
"View on map" => "Vezi pe hartă",
"Street address" => "Adresa",
"Postal code" => "Codul poștal",
"City" => "Oraș",
"Country" => "Țară",
"Share" => "Partajează",
"Export" => "Exportă",
"Add Contact" => "Adaugă contact",
"Edit name details" => "Introdu detalii despre nume",
"dd-mm-yyyy" => "zz-ll-aaaa",
"Separate groups with commas" => "Separă grupurile cu virgule",
"Edit groups" => "Editează grupuri",
"Enter email address" => "Introdu adresa de e-mail",
"Edit address details" => "Editează detaliile adresei",
"Add notes here." => "Adaugă note",
"Add field" => "Adaugă câmp",
"Download contact" => "Descarcă acest contact",
"The temporary image has been removed from cache." => "Imaginea temporară a fost eliminată din cache.",
"Edit address" => "Editeză adresă",
"Type" => "Tip",
"PO Box" => "CP",
"Street address" => "Adresa",
"Street and number" => "Stradă și număr",
"Extended" => "Extins",
"Apartment number etc." => "Apartament etc.",
"City" => "Oraș",
"Region" => "Regiune",
"E.g. state or province" => "Ex. județ sau provincie",
"Zipcode" => "Cod poștal",
"Postal code" => "Codul poștal",
"Country" => "Țară",
"Addressbook" => "Agendă",
"Ms" => "Dna.",
"Mr" => "Dl.",
@ -129,8 +126,8 @@
"Family name" => "Nume",
"Import a contacts file" => "Importă un fișier cu contacte",
"Importing contacts" => "Se importă contactele",
"Add contact" => "Adaugă contact",
"Enter description" => "Specifică descriere",
"more info" => "mai multe informații",
"Primary address (Kontact et al)" => "Adresa primară (Kontact et al)",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "Agende",
"New Address Book" => "Agendă nouă",

Some files were not shown because too many files have changed in this diff Show More