1
0
mirror of https://github.com/owncloudarchive/contacts.git synced 2025-01-18 07:52:21 +01:00

merge master into filesystem

This commit is contained in:
Robin Appelman 2012-11-30 00:20:16 +01:00
commit f83a170f72
122 changed files with 10222 additions and 6463 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,25 +14,22 @@ $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 );
if(isset($vcard->CATEGORIES)) {
foreach($vcard->children as $property) {
if($property->name == 'CATEGORIES') {
$checksum = md5($property->serialize());
OCP\JSON::success(array(
'data' => array(
'value' => $property->value,
'checksum' => $checksum,
)));
exit();
}
$vcard = OCA\Contacts\App::getContactVCard( $id );
foreach($vcard->children as $property) {
if($property->name == 'CATEGORIES') {
$checksum = md5($property->serialize());
OCP\JSON::success(array(
'data' => array(
'value' => $property->value,
'checksum' => $checksum,
)));
exit();
}
OCP\JSON::error(array(
'data' => array(
'message' => OC_Contacts_App::$l10n->t('Error setting checksum.'))));
} else {
OCP\JSON::success();
}
}
OCP\JSON::error(array(
'data' => array(
'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.'));
$cards = array();
foreach($contacts as $contact) {
$cards[] = array($contact['id'], $contact['carddata']);
}
}
$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']);
}
debug('Before delete: '.print_r($categories, true));
$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,74 +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\PERMISSION_ALL;
$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,24 +8,25 @@
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));
}
@ -36,7 +37,7 @@ $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']
@ -47,34 +48,55 @@ foreach($active_addressbooks as $addressbook) {
= $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]';
@ -89,10 +111,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

@ -25,7 +25,7 @@ function cmpcontacts($a, $b)
OCP\JSON::checkLoggedIn();
OCP\JSON::checkAppEnabled('contacts');
$offset = isset($_GET['startat']) ? $_GET['startat'] : null;
$offset = isset($_GET['offset']) ? $_GET['offset'] : null;
$category = isset($_GET['category']) ? $_GET['category'] : null;
$list = array();
@ -36,19 +36,17 @@ if(is_null($category)) {
$categories = $catmgr->categories(OC_VCategories::FORMAT_MAP);
uasort($categories, 'cmpcategories');
foreach($categories as $category) {
$list[$category['id']] = array(
$list[] = array(
'name' => $category['name'],
'contacts' => $catmgr->itemsForCategory(
$category['name'],
array(
'tablename' => '*PREFIX*contacts_cards',
'fields' => array('id', 'addressbookid', 'fullname'),
),
50,
$offset)
'fields' => array('id',),
))
);
uasort($list[$category['id']]['contacts'], 'cmpcontacts');
}
uasort($list['contacts'], 'cmpcontacts');
} else {
$list[$category] = $catmgr->itemsForCategory(
$category,

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,91 +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]);
break;
case 'CATEGORIES':
debug('Setting string:'.$name.' '.$value);
$catmgr = OC_Contacts_App::getVCategories();
$catmgr->purgeObject($id, 'contact');
foreach(array_map('trim', explode(',', $value)) as $category) {
$catmgr->addToCategory($id, $category);
$vcard->BDAY = $value;
if(!isset($vcard->BDAY['VALUE'])) {
$vcard->BDAY->add('VALUE', 'DATE');
} else {
$vcard->BDAY->VALUE = 'DATE';
}
break;
case 'ADR':
case 'N':
if(is_array($value)) {
$property->setParts($value);
} else {
debug('Saving N ' . $value);
$vcard->N = $value;
}
$vcard->children[$line]->setValue($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\Files\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,20 @@
<?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['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 +24,6 @@ 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');

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,145 +1,170 @@
/*dl > dt {
font-weight: bold;
}*/
/* General element settings */
#content li { cursor: default; }
#content input[type=checkbox] {
height: 14px; width: 14px;
border: 1px solid #fff;
-moz-appearance:none; -webkit-appearance: none;
-moz-box-sizing:none; box-sizing: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; }
#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: -8px;
left: -6px;
}
#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; }
/* 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 a { display: inline-block; }
#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 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;*/ }
#groupactions { box-sizing: border-box; height: 4em; border-bottom: 1px solid #DDDDDD; }
#groupactions > button, .addcontact {
-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 { float: right; display: none; padding: 0; margin: auto; }
#grouplist h3:not([data-type="shared"]):hover .action.numcontacts, #grouplist h3:not([data-type="shared"]) .active.action.numcontacts { display: inline-block; }
#grouplist h3[data-type="category"]:hover .action.delete { display: inline-block; }
#grouplist h3 .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: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; }
#content input:not([type="checkbox"]), #content select, #content textarea {
background-color: #fefefe; border: 1px solid #fff !important;
-moz-appearance:none !important; -webkit-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;
}
#content input:invalid, #content input:hover:not([type="checkbox"]), #content input:active:not([type="checkbox"]), #content input:focus:not([type="checkbox"]), #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;
}
#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: inline-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 }
.form dd { display: table-cell; clear: right; float: left; margin: 0; padding: 0; white-space: nowrap; vertical-align: text-bottom; }
.action { display: inline-block; width: 20px; height: 20px; }
.action.share { height: 20px !important; width: 20px; float: right !important; clear: right; }
/* override the default margin on share dropdown */
#dropdown { margin: 1.5em 0; -moz-box-sizing: border-box; box-sizing: border-box; width: 100%; }
.add { background:url('%webroot%/core/img/actions/add.svg') no-repeat center; clear: both; }
.delete { background:url('%webroot%/core/img/actions/delete.svg') no-repeat center; }
.delete { background:url('%webroot%/core/img/actions/delete.png') no-repeat center; }
.edit { background:url('%webroot%/core/img/actions/rename.svg') no-repeat center; }
.share { background:url('%webroot%/core/img/actions/share.svg') no-repeat center; }
.mail { background:url('%webroot%/core/img/actions/mail.svg') no-repeat center; }
.upload { background:url('%webroot%/core/img/actions/upload.svg') no-repeat center; }
.download { background:url('%webroot%/core/img/actions/download.svg') no-repeat center; }
.cloud { background:url('%webroot%/core/img/places/picture.svg') no-repeat center; }
/*.globe { background:url('../img/globe.svg') no-repeat center; }*/
.globe { background:url('%webroot%/core/img/actions/public.svg') no-repeat center; }
.starred { display: inline-block; height: 22px; width: 22px; padding: 0; margin: 0; background:url('%appswebroot%/contacts/img/starred.png') no-repeat center; }
.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; }
.break { clear: both; }
.loading { background: url('%webroot%/core/img/loading.gif') no-repeat center !important; /*cursor: progress; */ 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; }
.fullname { font-weight:bold; font-size:1.5em; width: 17em; }
.singleproperties { display: inline-block; float: left; width: 30em;}
.singleproperties input.value { font-weight: bold; }
.singleproperties .action { float: left; width: 20px; height: 20px; }
.singleproperties .n input { width: 17em}
.singleproperties dl { min-width: 24em; }
.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 .listactions a { display: inline-block; float: left; clear: none; width: 20px; height: 20px; }
.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 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; direction: rtl; }
.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; max-width: 7em !important; border: 0; }
#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; }
@ -148,12 +173,170 @@ input[type="checkbox"] { width: 20px; height: 20px; vertical-align: bottom; }
.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 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: right;
background:url('%webroot%/core/img/actions/settings.svg') no-repeat center;
}
#contacts-settings.open {
height: auto;
}
#contacts-settings {
-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; }
/* Single elements */
#file_upload_target, #import_upload_target, #crop_target { display:none; }
#toggle_all { position: absolute; bottom: .5em; left: .8em; }
input.propertytype { float: left; font-size: .8em; width: 8em !important; direction: rtl;}
.contactphoto { float: left; display: inline-block; border-radius: 0.3em; border: thin solid #bbb; margin: 0.5em; background: url('%webroot%/core/img/loading.gif') no-repeat center center; -moz-box-shadow: 0 1px 3px #777; -webkit-box-shadow: 0 1px 3px #777; box-shadow: 0 1px 3px #777; opacity: 1; }
.contactphoto:hover { background: #fff; cursor: default; }
#photowrapper { display: inline-block; float: left; width: 150px; }
#photowrapper.wait { opacity: 0.6; filter:alpha(opacity=0.6); z-index:1000; background: url('%webroot%/core/img/loading.gif') no-repeat center; cursor: wait; }
#phototools { position:absolute; margin: 5px 0 0 10px; width:auto; height:22px; padding:0px; background-color:#fff; list-style-type:none; border-radius: 0.3em; -moz-box-shadow: 0 1px 3px #777; -webkit-box-shadow: 0 1px 3px #777; box-shadow: 0 1px 3px #777; }
#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; }
#contactphoto_fileupload, #import_fileupload { -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter:alpha(opacity=0); opacity:0; z-index:1001; width:0; height:0;}
.favorite { display: inline-block; float: left; height: 20px; width: 20px; background:url('%appswebroot%/contacts/img/inactive_star.png') no-repeat center; }
.favorite.active, .favorite:hover { background:url('%appswebroot%/contacts/img/active_star.png') no-repeat center; }
.favorite.inactive { background:url('%appswebroot%/contacts/img/inactive_star.png') no-repeat center; }
/* Header */
#contactsheader { position: fixed; 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 { padding: 0 0.5em; margin: 0 auto; height: 100%; width: 90%; }
#contactsheader button, #contactsheader select { position: relative; float: left; min-width: 26px; height: 26px; margin: .7em; padding: .2em; clear: none; }
#contactsheader .back { }
#contactsheader .import { background:url('%webroot%/core/img/actions/upload.svg') no-repeat center; }
#contactsheader .delete { background:url('%webroot%/core/img/actions/delete.svg') no-repeat center; }
#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.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 .adr { cursor: pointer; }
.adr.edit {
width: 20em;
border: 1px solid silver; -moz-border-radius:.3em; -webkit-border-radius:.3em; border-radius:.3em; outline:none;
}
.adr.edit ul {
-moz-column-count: 1;
-webkit-columns: 1;
-o-columns: 1;
columns: 1;
}
.adr.edit input.value { border: none; }
.adr.edit input.value:hover { border: none; }
.adr.edit input.value.street, ul.adr.edit input.value.country, ul.adr.edit input.value.region { width: 19em;}
.adr.edit input.value.zip { width: 5em; }
.adr.edit input.value.city { width: 10em; }
#rightcontent footer { padding: 1em; width: 100%; 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:22px; height:22px; z-index: 200; opacity: 0.6; background:url('%webroot%/core/img/actions/mail.svg') no-repeat center; }
#contactlist tr > td a.mailto:hover { opacity: 0.8; }
#contact figure img { -moz-border-radius:.3em; -webkit-border-radius:.3em; border-radius:.3em; border: thin solid #bbb; margin: 0.3em; background: url('%webroot%/core/img/loading.gif') no-repeat center center; -moz-box-shadow: 0 1px 3px #777; -webkit-box-shadow: 0 1px 3px #777; box-shadow: 0 1px 3px #777; opacity: 1; }
#contact 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; }
@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: 1400) {
#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; }
}

View File

@ -12,9 +12,20 @@ OCP\App::checkAppEnabled('contacts');
$bookid = isset($_GET['bookid']) ? $_GET['bookid'] : null;
$contactid = isset($_GET['contactid']) ? $_GET['contactid'] : 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); // is owner access check
} catch(Exception $e) {
OCP\JSON::error(
array(
'data' => array(
'message' => $e->getMessage(),
)
)
);
exit();
}
//$cardobjects = OCA\Contacts\VCard::all($bookid);
header('Content-Type: text/directory');
header('Content-Disposition: inline; filename='
. str_replace(' ', '_', $addressbook['displayname']) . '.vcf');
@ -23,14 +34,25 @@ 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)) {
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');

BIN
img/active_star.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 527 B

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

BIN
img/starred.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 727 B

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'));
@ -48,7 +49,10 @@ $maxUploadFilesize = min($maxUploadFilesize, $freeSpace);
OCP\Util::addscript('', 'jquery.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');
@ -60,15 +64,18 @@ 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->assign('is_indexed', OCP\Config::getUserValue(OCP\User::getUser(), 'contacts', 'contacts_indexed', 'no'));
$tmpl->printPage();

1716
js/app.js Normal file
View File

@ -0,0 +1,1716 @@
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');
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 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.addGroup = function(name, cb) {
console.log('GroupList.addGroup', 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 = (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());
}
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" />');
$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(['addcontact']);
OC.Share.loadIcons('addressbook');
// 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) {
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.outerHTML);
}
});
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');
},
// 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.showActions(['back', 'download', 'delete', 'groups', 'favorite']);
});
$(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', 'favorite']);
} else {
self.showActions(['back']);
}
if(self.Groups.isFavorite(self.currentid)) {
self.$header.find('.favorite').switchClass('inactive', 'active');
} else {
self.$header.find('.favorite').switchClass('active', 'inactive');
}
});
$(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.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.Contacts.jumpToContact(id);
}
self.$contactList.show();
self.$toggleAll.show();
self.showActions(['addcontact']);
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.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(['addcontact', 'groups', 'delete']);
} else {
self.showActions(['addcontact']);
}
});
this.$contactList.on('change', 'input:checkbox', function(event) {
if($(this).is(':checked')) {
if(self.$groups.find('option').length === 1) {
self.buildGroupSelect();
}
self.showActions(['addcontact', 'groups', 'delete']);
} else if(self.Contacts.getSelectedContacts().length === 0) {
self.showActions(['addcontact']);
}
});
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(['addcontact']);
}
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 return 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.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'));
});
$('.addcontact').on('click keydown', function(event) {
if(wrongKey(event)) {
return;
}
console.log('add');
self.$contactList.hide();
self.$toggleAll.hide();
$(this).hide();
self.currentid = 'new';
self.tmpcontact = self.Contacts.addContact();
self.$rightContent.prepend(self.tmpcontact);
self.showActions(['back']);
});
$('.import').on('click keydown', function(event) {
// NOTE: Test if document title changes. If so there's a fix in
// https://github.com/owncloud/apps/pull/212#issuecomment-10516723
if(wrongKey(event)) {
return;
}
console.log('import');
self.hideActions();
});
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('export');
$(this).parents('ul').first().find('ul:visible').slideUp();
$(this).next('ul').toggle('slow');
});
this.$header.on('click keydown', '.back', function(event) {
if(wrongKey(event)) {
return;
}
console.log('back');
self.closeContact(self.currentid);
self.$toggleAll.show();
self.showActions(['addcontact']);
});
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(['addcontact']);
});
this.$header.on('click keydown', '.download', function(event) {
if(wrongKey(event)) {
return;
}
console.log('download');
if(self.currentid) {
document.location.href = OC.linkTo('contacts', 'export.php') + '?contactid=' + self.currentid;
} else {
console.log('currentid is not set');
}
});
this.$header.on('click keydown', '.favorite', function(event) {
if(wrongKey(event)) {
return;
}
if(!utils.isUInt(self.currentid)) {
return;
}
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', 'inactive');
} else {
self.$header.find('.favorite').switchClass('inactive', '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);
});
$(document).on('keyup', function(event) {
if(event.target.nodeName.toUpperCase() != 'BODY') {
return;
}
// TODO: This should go in separate method
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 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;
}
});
$('#content > [title]').tipsy(); // find all with a title attribute and tipsy them
},
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(
$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));
},
closeContact: function(id) {
if(typeof this.currentid === 'number') {
if(this.Contacts.findById(id).close()) {
this.$contactList.show();
this.jumpToContact(id);
}
} else if(this.currentid === 'new') {
this.tmpcontact.remove();
this.$contactList.show();
}
delete this.currentid;
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);
this.setAllChecked(false);
this.$contactList.hide();
this.$toggleAll.hide();
var $contactelem = this.Contacts.showContact(this.currentid);
this.$rightContent.prepend($contactelem);
this.buildGroupSelect();
},
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});
}
}
});
},
addAddressbook:function(data, cb) {
$.post(OC.filePath('contacts', 'ajax', 'addressbook/add.php'), { name: data.name, description: data.description },
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'});
}
}
});
},
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( $ ) {
/**
* 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.get(0).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,2366 +1,1441 @@
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($) {
/**
* 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');
}
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();
* 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.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.addressbook').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.addressbook[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.addressbook[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.addressbook.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.push(this.data.ORG[0].value);
}
$.each($.unique(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;});
$('#contacts h3.category').each(function() {
if(categories.indexOf($(this).text()) === -1) {
$(this).next('ul').remove();
$(this).remove();
}
});
$('#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') {
if(jsondata.data) {
$('#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 'CATEGORIES':
OC.Contacts.Contacts.updateCategories(this.id, $('#categories').val());
break;
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(tmp[name] && names.indexOf(tmp[name]) == -1) {
names.push(tmp[name]);
}
}
$.each($.unique(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;
}
},
updateCategories:function(id, catstr) {
var categories = $.map(catstr.split(','), function(category) {return category.trim();});
// Not pretty, but only proof of concept
$('#contacts ul.category').each(function() {
if(categories.indexOf($(this).prev('h3').text()) === -1) {
$(this).find('li[data-id="' + id + '"]').remove();
} else {
if($(this).find('li[data-id="' + id + '"]').length === 0) {
var contacts = $(this).children();
var contact = $('<li data-id="'+id+'" data-categoryid="'+$(this).data('id')
+ '" role="button"><a href="'+OC.linkTo('contacts', 'index.php')+'&id='
+ id+'" style="background: url('+OC.filePath('contacts', '', 'thumbnail.php')
+ '?id='+id+') no-repeat scroll 0% 0% transparent;">'
+ OC.Contacts.Card.fn+'</a></li>');
var added = false;
contacts.each(function() {
if($(this).text().toLowerCase().localeCompare(OC.Contacts.Card.fn.toLowerCase()) > 0) {
$(this).before(contact);
added = true;
return false; // break out of loop
}
});
if(!added || !contacts.length) {
$(this).append(contact);
}
}
}
});
},
/**
* @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.addressbook[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.addressbook[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.addressbook').length == 0) {
$('#contacts').html('<h3 class="addressbook" data-id="'
+ b + '" data-permissions="' + book.permissions + '">' + book.displayname
+ sharedindicator + '</h3><ul class="contacts addressbook hidden" data-id="'+b+'" data-permissions="'
+ book.permissions + '"></ul>');
} else {
if(!$('#contacts h3.addressbook[data-id="' + b + '"]').length) {
var item = $('<h3 class="addressbook" data-id="'
+ b + '" data-permissions="' + book.permissions + '">'
+ book.displayname+sharedindicator+'</h3><ul class="contacts addressbook hidden" data-id="' + b
+ '" data-permissions="' + book.permissions + '"></ul>');
var added = false;
$('#contacts h3.addressbook').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.addressbook[data-id="'+b+'"]').on('click', function(event) {
$('#contacts h3.addressbook').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.addressbook[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});
}
$.getJSON(OC.filePath('contacts', 'ajax', 'contact/listbycategory.php'),opts,function(jsondata) {
if(jsondata.status == 'success') {
var categories = jsondata.data.categories;
$.each(categories, function(catid, category) {
console.log('category', catid, category.name);
if(!$('#contacts h3.category[data-id="' + catid + '"]').length) {
var item = $('<h3 class="category" data-id="' + catid + '">'
+ category.name + '</h3><ul class="contacts category hidden" data-id="' + catid + '"></ul>');
var added = false;
$('#contacts h3.category').each(function(){
if ($(this).text().toLowerCase().localeCompare(category.name.toLowerCase()) > 0) {
$(this).before(item).fadeIn('fast');
added = true;
return false;
}
});
if(!added) {
$('#contacts').append(item);
}
$('#contacts h3.category[data-id="'+catid+'"]').on('click', function(event) {
console.log('click');
$('#contacts h3.category').removeClass('active');
$(this).addClass('active');
$('#contacts ul.category[data-id="'+catid+'"]').slideToggle(300);
return false;
});
var contactlist = $('#contacts ul.category[data-id="'+catid+'"]');
var contacts = $('#contacts ul.category[data-id="'+catid+'"] li');
for(var c in category.contacts) {
if(category.contacts[c].id == undefined) { continue; }
if(!$('ul.category[data-id="'+catid+'"] li[data-id="'+category.contacts[c]['id']+'"]').length) {
var contact = $('<li data-id="'+category.contacts[c].id+'" data-categoryid="'+catid
+ '" role="button"><a href="'+OC.linkTo('contacts', 'index.php')+'&id='
+ category.contacts[c].id+'" style="background: url('+OC.filePath('contacts', '', 'thumbnail.php')
+ '?id='+category.contacts[c].id+') no-repeat scroll 0% 0% transparent;">'
+ category.contacts[c].fullname+'</a></li>');
var added = false;
var name = category.contacts[c].fullname.toLowerCase();
if(contacts.length) {
contacts.each(function() {
if ($(this).text().toLowerCase().localeCompare(name) > 0) {
$(this).before(contact);
added = true;
return false;
}
});
}
if(!added || !params.contacts) {
contactlist.append(contact);
}
}
}
}
});
}
});
});
},
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');
}
Contact.prototype.addProperty = function($option, name) {
console.log('Contact.addProperty', name)
switch(name) {
case 'NICKNAME':
case 'TITLE':
case 'ORG':
case 'BDAY':
this.$fullelem.find('[data-element="' + name.toLowerCase() + '"]').show();
$option.prop('disabled', true);
break;
case 'TEL':
case 'URL':
case 'EMAIL':
$elem = this.renderStandardProperty(name.toLowerCase());
var $list = this.$fullelem.find('ul.' + name.toLowerCase());
$list.show();
$list.append($elem);
break;
case 'ADR':
$elem = this.renderAddressProperty();
var $list = this.$fullelem.find('ul.' + name.toLowerCase());
$list.show();
$list.append($elem);
$elem.find('.adr.display').trigger('click');
break;
case 'IMPP':
$elem = this.renderIMProperty();
var $list = this.$fullelem.find('ul.' + name.toLowerCase());
$list.show();
$list.append($elem);
break;
}
}
}
$(document).ready(function(){
OCCategories.changed = OC.Contacts.Card.categoriesChanged;
OCCategories.app = 'contacts';
OCCategories.type = 'contact';
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);
}
});
$('#bottomcontrols .import').click(function() {
$('#import_upload_start').trigger('click');
});
$('#contacts_newcontact').on('click keydown', OC.Contacts.Card.editNew);
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.addressbook.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);
}
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
var prop = self.data[element][i];
self.data[element].splice(self.data[element].indexOf(prop), 1);
delete prop;
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.log('No response object');
return false;
}
console.log('Contact added.' + self.id);
self.saveProperty(params);
});
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.'),
});
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 {
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':
// 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'] = ['', '', '', '', ''];
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.edit input');
console.log('nelems', $nelems);
$.each(value, function(idx, val) {
console.log('nval', val);
self.$fullelem.find('#n_' + idx).val(val);
});
}
case 'NICKNAME':
case 'BDAY':
case 'ORG':
case 'TITLE':
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) {
console.log('setEnabled', enabled);
if(enabled) {
this.$fullelem.find('#addproperty').show();
} else {
this.$fullelem.find('#addproperty').hide();
}
this.enabled = enabled;
this.$fullelem.find('.value,.action').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;
$(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 {
q += '&' + this.propertyContainerFor(obj)
.find('input.value,select.value,textarea.value,.parameter').serialize();
}
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('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);
});
console.log('Contact.parametersFor', parameters);
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() {
var self = this;
var n = this.getPreferredValue('N', ['', '', '', '', '']);
console.log('renderContact', this.data);
var values = this.data
? {
id: this.id,
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)))
: '',
}
: {id: '', name: '', nickname: '', title: '', org: '', bday: '', n0: '', n1: '', n2: '', n3: '', n4: ''};
this.$fullelem = this.$fullTemplate.octemplate(values).data('contactobject', this);
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.edit').first();
var bodyListener = function(e) {
if($editor.find($(e.target)).length == 0) {
console.log('this', $(this));
$editor.toggle('blind');
$('body').unbind('click', bodyListener);
}
}
$editor.toggle('blind', function() {
$('body').bind('click', bodyListener);
});
});
var $singleelements = this.$fullelem.find('dd.propertycontainer');
$singleelements.find('.action').css('opacity', '0');
$singleelements.on('mouseenter', function() {
$(this).find('.action').css('opacity', '1');
}).on('mouseleave', function() {
$(this).find('.action').css('opacity', '0');
});
this.$fullelem.on('click keydown', '.delete', function(event) {
console.log('delete', event);
$('.tipsy').remove();
if(wrongKey(event)) {
return;
}
self.deleteProperty({obj:event.target});
});
this.$fullelem.on('change', '.value,.parameter', function(event) {
console.log('change', event);
self.saveProperty({obj:event.target});
});
this.$fullelem.find('form').on('submit', function(event) {
console.log('submit', this, event);
return false;
});
this.$fullelem.find('[data-element="bday"]')
.find('input').datepicker({
dateFormat : 'dd-mm-yy'
});
this.loadPhoto();
if(!this.data) {
// A new contact
this.setEnabled(true);
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) {
console.log('name', name, 'value', value);
if(typeof value === 'undefined') {
return true; //continue
}
if(self.multi_properties.indexOf(value.toUpperCase()) === -1) {
if(!value.length) {
console.log('hiding', name);
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);
$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(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'],
});
$property.on('mouseenter', function() {
$(this).find('.listactions').css('opacity', '1');
}).on('mouseleave', function() {
$(this).find('.listactions').css('opacity', '0');
});
}
$list.append($property);
}
}
}
});
if(this.access.owner !== OC.currentUser
&& !(this.access.permissions & OC.PERMISSION_UPDATE
|| this.access.permissions & OC.PERMISSION_DELETE)) {
this.setEnabled(false);
} else {
this.setEnabled(true);
}
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.log('No template for', name);
return;
}
var values = property
? { value: property.value, checksum: property.checksum }
: { value: '', checksum: 'new' };
$elem = this.detailTemplates[name].octemplate(values);
return $elem;
}
/**
* Render an ADR (address) property.
* @return A jquery object to be injected in the DOM
*/
Contact.prototype.renderAddressProperty = function(idx, property) {
console.log('Contact.renderAddressProperty', property)
if(!this.detailTemplates['adr']) {
console.log('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('.display').on('click', function() {
$(this).next('.listactions').hide();
var $editor = $(this).siblings('.adr.edit').first();
var $viewer = $(this);
var bodyListener = function(e) {
if($editor.find($(e.target)).length == 0) {
console.log('this', $(this));
$editor.toggle('blind');
$viewer.slideDown(400, function() {
var input = $editor.find('input').first();
console.log('input', input);
var val = self.valueFor(input);
var params = self.parametersFor(input, true);
console.log('val', val, 'params', params);
$(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);
});
});
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.log('No template for impp', this.detailTemplates);
return;
}
var values = property ? {
value: property.value,
checksum: property.checksum,
} : {value: '', checksum: 'new'};
$elem = this.detailTemplates['impp'].octemplate(values);
return $elem;
}
/**
* 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');
console.log('photowrapper', this.$photowrapper.length);
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);
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() {
$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() {
console.log('TODO: edit photo');
$(document).trigger('request.edit.contactphoto', {
id: self.id,
});
});
$phototools.find('.cloud').on('click', function() {
console.log('select photo from cloud');
$(document).trigger('request.select.contactphoto.fromcloud', {
id: self.id,
});
});
$phototools.find('.upload').on('click', function() {
console.log('select photo from local');
$(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) {
console.log('Contact - photoupdated')
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;
}
/**
* 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 {
var found = false;
$.each(this.data.CATEGORIES[0].value, function(idx, category) {
if(name.toLowerCase() === category.toLowerCase()) {
found = true;
return false;
}
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'));
}
});
});
if(found) {
return;
}
this.data.CATEGORIES[0].value.push(name);
console.log('listelem categories', this.getPreferredValue('CATEGORIES', []).clean('').join(' / '));
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.log('id missing');
return false;
}
var $elem = this.contacts[parseInt(id)].getListItemElement();
var pos = $elem.offset().top - this.$contactList.offset().top + this.$contactList.scrollTop();
console.log('pos', pos);
return pos;
}
ContactList.prototype.hideContact = function(id) {
this.contacts[parseInt(id)].hide();
}
ContactList.prototype.closeContact = function(id) {
this.contacts[parseInt(id)].close();
}
/**
* Jumps to an element in the contact list
* @param number the number of the item starting with 0
*/
ContactList.prototype.jumpToContact = function(id) {
var pos = this.contactPos(id);
console.log('scrollTop', pos);
this.$contactList.scrollTop(pos);
};
/**
* 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) {
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();
};
/**
* Insert a rendered contact list item into the list
* @param contact jQuery object.
*/
ContactList.prototype.insertContact = function($contact) {
console.log('insertContact', $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
*/
ContactList.prototype.addContact = function() {
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();
}
/**
* 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);
});
}
/**
* 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.addressbooks[parseInt(book.id)] = {
owner: book.userid,
permissions: parseInt(book.permissions),
id: parseInt(book.id),
displayname: book.displayname,
description: book.description,
active: Boolean(parseInt(book.active)),
};
});
$.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;
})( jQuery );

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

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,7 +1,5 @@
<?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",
@ -10,13 +8,10 @@
"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" => "شيء آخر",
@ -27,17 +22,21 @@
"Video" => "الفيديو",
"Pager" => "الرنان",
"Contact" => "معرفه",
"Add Contact" => "أضف شخص ",
"Import" => "إدخال",
"Settings" => "اعدادات",
"Import" => "إدخال",
"Export" => "تصدير المعلومات",
"Back" => "رجوع",
"Groups" => "مجموعات",
"Close" => "اغلق",
"Title" => "عنوان",
"Organization" => "المؤسسة",
"Birthday" => "تاريخ الميلاد",
"Groups" => "مجموعات",
"Preferred" => "مفضل",
"Add" => "اضف",
"Phone" => "الهاتف",
"Email" => "البريد الالكتروني",
"Address" => "عنوان",
"Preferred" => "مفضل",
"Add Contact" => "أضف شخص ",
"Download contact" => "انزال المعرفه",
"Delete contact" => "امحي المعرفه",
"Type" => "نوع",

View File

@ -7,15 +7,17 @@
"No file was uploaded" => "Фахлът не бе качен",
"Missing a temporary folder" => "Липсва временната папка",
"Error" => "Грешка",
"Upload Error" => "Грешка при качване",
"Download" => "Изтегляне",
"Delete" => "Изтриване",
"Cancel" => "Отказ",
"Work" => "Работа",
"Other" => "Друго",
"Import" => "Внасяне",
"Birthday" => "Роджен ден",
"Export" => "Изнасяне",
"Groups" => "Групи",
"Title" => "Заглавие",
"Birthday" => "Роджен ден",
"Add" => "Добавяне",
"Email" => "Е-поща",
"Address" => "Адрес",
"Share" => "Споделяне",

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,39 @@
"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",
"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",
"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",
"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.",
"Add group" => "Afegeix grup",
"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.",
"Edit profile picture" => "Edita la fotografia de perfil",
"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",
"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.",
"Importing..." => "Important...",
"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.",
"Error" => "Error",
"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 +99,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",
@ -128,6 +124,7 @@
"Internet" => "Internet",
"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.",
@ -137,9 +134,21 @@
"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ó",
"Share" => "Comparteix",
"Import" => "Importa",
"Import into:" => "Importa a:",
"Export" => "Exporta",
"(De-)select all" => "(Des-)selecciona'ls tots",
"New Contact" => "Contate nou",
"Back" => "Enrera",
"Download Contact" => "Baixa contacte",
"Delete Contact" => "Elimina contacte",
"Groups" => "Grups",
"Favorite" => "Preferits",
"Close" => "Tanca",
"Keyboard shortcuts" => "Dreceres de teclat",
"Navigation" => "Navegació",
@ -153,41 +162,60 @@
"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",
"Title" => "Títol",
"Organization" => "Organització",
"Birthday" => "Aniversari",
"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",
"Notes go here..." => "Escriviu notes aquí...",
"Add" => "Afegeix",
"Phone" => "Telèfon",
"Email" => "Correu electrònic",
"Instant Messaging" => "Missatgeria instantània",
"Address" => "Adreça",
"Note" => "Nota",
"Web site" => "Adreça web",
"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",
"12345" => "12123",
"Your city" => "Ciutat",
"Some region" => "Comarca",
"Your country" => "País",
"Instant Messenger" => "Instant Messenger",
"Delete IM" => "Elimina IM",
"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",
"Enter nickname" => "Escriviu el sobrenom",
"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",
"Delete contact" => "Suprimeix el contacte",
"The temporary image has been removed from cache." => "La imatge temporal ha estat eliminada de la memòria de cau.",
@ -213,7 +241,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.",
@ -230,15 +257,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,39 @@
"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",
"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",
"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",
"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ů.",
"Add group" => "Přidat skupinu",
"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.",
"Edit profile picture" => "Upravit obrázek profilu",
"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",
"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.",
"Importing..." => "Importuji...",
"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ý.",
"Error" => "Chyba",
"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 +99,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",
@ -128,6 +124,7 @@
"Internet" => "Internet",
"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.",
@ -137,9 +134,21 @@
"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í",
"Share" => "Sdílet",
"Import" => "Importovat",
"Import into:" => "Importovat do:",
"Export" => "Exportovat",
"(De-)select all" => "Vybrat (odznačit) vše",
"New Contact" => "Nový kontakt",
"Back" => "Zpět",
"Download Contact" => "Stáhnout kontakt",
"Delete Contact" => "Smazat kontakt",
"Groups" => "Skupiny",
"Favorite" => "Oblíbit",
"Close" => "Zavřít",
"Keyboard shortcuts" => "Klávesové zkratky",
"Navigation" => "Navigace",
@ -153,41 +162,60 @@
"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",
"Title" => "Název",
"Organization" => "Organizace",
"Birthday" => "Narozeniny",
"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",
"Notes go here..." => "Sem vložte poznámky...",
"Add" => "Přidat",
"Phone" => "Telefon",
"Email" => "E-mail",
"Instant Messaging" => "Komunikátor",
"Address" => "Adresa",
"Note" => "Poznámka",
"Web site" => "Webová stránka",
"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",
"12345" => "12345",
"Your city" => "Vaše město",
"Some region" => "Nějaký region",
"Your country" => "Váše země",
"Instant Messenger" => "Komunikátor",
"Delete IM" => "Smazat komunikátor",
"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",
"Enter nickname" => "Zadejte přezdívku",
"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",
"Delete contact" => "Smazat kontakt",
"The temporary image has been removed from cache." => "Obrázek byl odstraněn z vyrovnávací paměti.",
@ -213,7 +241,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.",
@ -230,15 +257,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,15 @@
"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.",
"Importing..." => "Importerer...",
"Enter name" => "Indtast navn",
"Enter description" => "Indtast beskrivelse",
"The address book name cannot be empty." => "Adressebogens navn kan ikke være tomt.",
"Error" => "Fejl",
"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 +66,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",
@ -135,9 +98,11 @@
"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",
"Export" => "Exporter",
"Back" => "Tilbage",
"Groups" => "Grupper",
"Close" => "Luk",
"Keyboard shortcuts" => "Tastaturgenveje",
"Navigation" => "Navigering",
@ -151,41 +116,46 @@
"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",
"Title" => "Titel",
"Organization" => "Organisation",
"Birthday" => "Fødselsdag",
"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",
"Add" => "Tilføj",
"Phone" => "Telefon",
"Email" => "Email",
"Instant Messaging" => "Instant Messaging",
"Address" => "Adresse",
"Note" => "Note",
"Web site" => "Hjemmeside",
"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",
"Instant Messenger" => "Instant Messenger",
"Delete IM" => "Slet IM",
"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.",
"Enter nickname" => "Indtast kaldenavn",
"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",
"Delete contact" => "Slet kontaktperson",
"The temporary image has been removed from cache." => "Det midlertidige billede er ikke længere tilgængeligt.",
@ -211,7 +181,6 @@
"Mrs" => "Fru",
"Dr" => "Dr.",
"Given name" => "Fornavn",
"Additional names" => "Mellemnavne",
"Family name" => "Efternavn",
"Hon. suffixes" => "Efterstillede titler",
"J.D." => "Cand. Jur.",
@ -228,9 +197,7 @@
"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.)",

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,39 @@
"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.",
"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",
"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",
"Add group" => "Gruppe hinzufügen",
"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.",
"Edit profile picture" => "Profilbild bearbeiten",
"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",
"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.",
"Importing..." => "Importiere...",
"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.",
"Error" => "Fehler",
"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 +99,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",
@ -128,6 +124,7 @@
"Internet" => "Internet",
"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.",
@ -137,9 +134,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",
"Share" => "Teilen",
"Import" => "Importieren",
"Import into:" => "Importieren nach:",
"Export" => "Exportieren",
"(De-)select all" => "Alle (nicht) auswählen",
"New Contact" => "Neuer Kontakt",
"Back" => "Zurück",
"Download Contact" => "Kontakt herunterladen",
"Delete Contact" => "Kontakt löschen",
"Groups" => "Gruppen",
"Favorite" => "Favorit",
"Close" => "Schließen",
"Keyboard shortcuts" => "Tastaturbefehle",
"Navigation" => "Navigation",
@ -153,41 +162,60 @@
"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",
"Title" => "Titel",
"Organization" => "Organisation",
"Birthday" => "Geburtstag",
"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",
"Notes go here..." => "Notizen hier hinein...",
"Add" => "Hinzufügen",
"Phone" => "Telefon",
"Email" => "E-Mail",
"Instant Messaging" => "Instant Messaging",
"Address" => "Adresse",
"Note" => "Notiz",
"Web site" => "Webseite",
"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",
"12345" => "12345",
"Your city" => "Deine Stadt",
"Some region" => "Eine Region",
"Your country" => "Dein Land",
"Instant Messenger" => "Instant Messenger",
"Delete IM" => "IM löschen",
"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",
"Enter nickname" => "Spitzname angeben",
"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",
"Delete contact" => "Kontakt löschen",
"The temporary image has been removed from cache." => "Das temporäre Bild wurde aus dem Cache gelöscht.",
@ -213,7 +241,6 @@
"Mrs" => "Frau",
"Dr" => "Dr.",
"Given name" => "Vorname",
"Additional names" => "Zusätzliche Namen",
"Family name" => "Familienname",
"Hon. suffixes" => "Höflichkeitssuffixe",
"J.D." => "Dr. Jur.",
@ -230,15 +257,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,39 @@
"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.",
"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",
"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",
"Add group" => "Fügen Sie eine Gruppe hinzu",
"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.",
"Edit profile picture" => "Profilbild bearbeiten",
"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",
"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.",
"Importing..." => "Importiere...",
"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.",
"Error" => "Fehler",
"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 +99,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",
@ -128,6 +124,7 @@
"Internet" => "Internet",
"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.",
@ -137,9 +134,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." => "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",
"Share" => "Teilen",
"Import" => "Importieren",
"Import into:" => "Importiere in:",
"Export" => "Exportieren",
"(De-)select all" => "Alle (ab-)wählen",
"New Contact" => "Neuer Kontakt",
"Back" => "Zurück",
"Download Contact" => "Kontakt herunterladen",
"Delete Contact" => "Kontakt löschen",
"Groups" => "Gruppen",
"Favorite" => "Favorit",
"Close" => "Schließen",
"Keyboard shortcuts" => "Tastaturbefehle",
"Navigation" => "Navigation",
@ -153,41 +162,60 @@
"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",
"Title" => "Titel",
"Organization" => "Organisation",
"Birthday" => "Geburtstag",
"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",
"Notes go here..." => "Notizen hier hinein...",
"Add" => "Hinzufügen",
"Phone" => "Telefon",
"Email" => "E-Mail",
"Instant Messaging" => "Instant Messaging",
"Address" => "Adresse",
"Note" => "Notiz",
"Web site" => "Webseite",
"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",
"12345" => "12345",
"Your city" => "Ihre Stadt",
"Some region" => "Eine Region",
"Your country" => "Ihr Land",
"Instant Messenger" => "Instant Messenger",
"Delete IM" => "IM löschen",
"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",
"Enter nickname" => "Spitzname angeben",
"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",
"Delete contact" => "Kontakt löschen",
"The temporary image has been removed from cache." => "Das temporäre Bild wurde aus dem Cache gelöscht.",
@ -213,7 +241,6 @@
"Mrs" => "Frau",
"Dr" => "Dr.",
"Given name" => "Vorname",
"Additional names" => "Zusätzliche Namen",
"Family name" => "Familienname",
"Hon. suffixes" => "Höflichkeitssuffixe",
"J.D." => "Dr. Jur.",
@ -230,15 +257,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,28 @@
"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" => "Αλλαγή ονόματος",
"Error adding to group." => "Σφάλμα κατά την προσθήκη σε ομάδα.",
"Error removing from group." => "Σφάλμα κατά την αφαίρεση από ομάδα.",
"There was an error opening a mail composer." => "Υπήρχε ένα σφάλμα στο άνοιγμα μίας σύνθεσης μηνύματος.",
"Add group" => "Προσθήκη ομάδας",
"No files selected for upload." => "Δεν επιλέχτηκαν αρχεία για μεταφόρτωση",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Το αρχείο που προσπαθείτε να ανεβάσετε υπερβαίνει το μέγιστο μέγεθος για τις προσθήκες αρχείων σε αυτόν τον server.",
"Edit profile picture" => "Επεξεργασία εικόνας προφίλ",
"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" => "Η εισαγωγή ολοκληρώθηκε",
"Not all files uploaded. Retrying..." => "Δεν μεταφορτώθηκαν όλα τα αρχεία. Προσπάθεια ξανά...",
"Something went wrong with the upload, please retry." => "Κάτι πήγε στραβά με την μεταφόρτωση, παρακαλώ προσπαθήστε ξανά.",
"Importing..." => "Γίνεται εισαγωγή...",
"Enter name" => "Εισαγωγή ονόματος",
"Enter description" => "Εισαγωγή περιγραφής",
"Select addressbook" => "Επιλογή βιβλίου επαφών",
"The address book name cannot be empty." => "Το όνομα του βιβλίου διευθύνσεων δεν πρέπει να είναι κενό.",
"Error" => "Σφάλμα",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Κάποιες επαφές σημειώθηκαν προς διαγραφή,δεν έχουν διαγραφεί ακόμα. Παρακαλώ περιμένετε μέχρι να διαγραφούν.",
"Result: " => "Αποτέλεσμα: ",
" imported, " => " εισάγεται,",
" failed." => " απέτυχε.",
@ -100,9 +80,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",
@ -137,9 +114,17 @@
"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" => "Ρυθμίσεις",
"Share" => "Μοιράσου",
"Import" => "Εισαγωγή",
"Import into:" => "Εισαγωγή από:",
"Export" => "Εξαγωγή",
"New Contact" => "Νέα επαφή",
"Back" => "Επιστροφή",
"Delete Contact" => "Διαγραφή επαφής",
"Groups" => "Ομάδες",
"Close" => "Κλείσιμο ",
"Keyboard shortcuts" => "Συντομεύσεις πλητρολογίου",
"Navigation" => "Πλοήγηση",
@ -153,41 +138,56 @@
"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" => "Πήγαινε στον ιστότοπο",
"Title" => "Τίτλος",
"Organization" => "Οργανισμός",
"Birthday" => "Γενέθλια",
"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" => "Προσθήκη πεδίου",
"Add" => "Προσθήκη",
"Phone" => "Τηλέφωνο",
"Email" => "Email",
"Instant Messaging" => "Άμεσα μυνήματα",
"Address" => "Διεύθυνση",
"Note" => "Σημείωση",
"Web site" => "Ιστότοπος",
"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" => "Διαγραφή διεύθυνσης",
"12345" => "12345",
"Your city" => "Η πόλη σας",
"Your country" => "Η χώρα σας",
"Instant Messenger" => "Instant Messenger",
"Delete IM" => "Διαγραφή IM",
"Add Contact" => "Προσθήκη επαφής",
"Drop photo to upload" => "Ρίξε μια φωτογραφία για ανέβασμα",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format custom, Όνομα, Επώνυμο, Αντίστροφο ή Αντίστροφο με κόμμα",
"Edit name details" => "Αλλάξτε τις λεπτομέρειες ονόματος",
"Enter nickname" => "Εισάγετε παρατσούκλι",
"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" => "Λήψη επαφής",
"Delete contact" => "Διαγραφή επαφής",
"The temporary image has been removed from cache." => "Η προσωρινή εικόνα αφαιρέθηκε από την κρυφή μνήμη.",
@ -213,7 +213,6 @@
"Mrs" => "Κα",
"Dr" => "Δρ.",
"Given name" => "Όνομα",
"Additional names" => "Επιπλέον ονόματα",
"Family name" => "Επώνυμο",
"Hon. suffixes" => "καταλήξεις",
"J.D." => "J.D.",
@ -230,15 +229,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

@ -8,14 +8,8 @@
"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.",
"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.",
"No contact ID was submitted." => "Neniu kontaktidentigilo sendiĝis.",
@ -44,41 +38,15 @@
"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",
"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",
"Pending" => "Traktotaj",
"Import done" => "Enporto plenumiĝis",
"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.",
"Importing..." => "Enportante...",
"Enter name" => "Enigu nomon",
"Enter description" => "Enigu priskribon",
"The address book name cannot be empty." => "La nomo de la adresaro ne povas esti malplena.",
"Error" => "Eraro",
"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.",
"Result: " => "Rezulto: ",
" imported, " => " enportoj, ",
" failed." => "malsukcesoj.",
@ -96,9 +64,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",
@ -128,9 +93,11 @@
"You do not have the permissions to edit this contact." => "Vi ne havas permeson redakti ĉi tiun kontakton.",
"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",
"Settings" => "Agordo",
"Import" => "Enporti",
"Export" => "Elporti",
"Back" => "Antaŭen",
"Groups" => "Grupoj",
"Close" => "Fermi",
"Keyboard shortcuts" => "Fulmoklavoj",
"Navigation" => "Navigado",
@ -144,40 +111,45 @@
"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",
"Add contact" => "Aldoni kontakton",
"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",
"Additional names" => "Pliaj nomoj",
"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",
"Title" => "Titolo",
"Organization" => "Organizaĵo",
"Birthday" => "Naskiĝotago",
"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",
"Add" => "Aldoni",
"Phone" => "Telefono",
"Email" => "Retpoŝtadreso",
"Instant Messaging" => "Tujmesaĝado",
"Address" => "Adreso",
"Note" => "Noto",
"Web site" => "TTT-ejo",
"Preferred" => "Preferata",
"Please specify a valid email address." => "Bonvolu specifi validan 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",
"Go to web site" => "Iri al TTT-ejon",
"View on map" => "Vidi en mapo",
"Instant Messenger" => "Tujmesaĝilo",
"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",
"Enter nickname" => "Enigu kromnomon",
"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",
"Delete contact" => "Forigi kontakton",
"The temporary image has been removed from cache." => "La provizora bildo estas forigita de la kaŝmemoro.",
@ -203,7 +175,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",
@ -211,9 +182,7 @@
"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)",

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 array",
"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,8 @@
"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",
"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 +48,38 @@
"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.",
"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",
"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.",
"Add group" => "Añadir grupo",
"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.",
"Edit profile picture" => "Editar imagen de perfil.",
"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",
"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.",
"Importing..." => "Importando...",
"Enter name" => "Introducir nombre",
"Enter description" => "Introducir descripción",
"Select addressbook" => "Seleccionar contactos",
"The address book name cannot be empty." => "El nombre de la libreta de direcciones no puede estar vacio.",
"Error" => "Fallo",
"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 +97,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",
@ -128,6 +122,7 @@
"Internet" => "Internet",
"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.",
@ -137,9 +132,21 @@
"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",
"Share" => "Compartir",
"Import" => "Importar",
"Import into:" => "Importar hacia:",
"Export" => "Exportar",
"(De-)select all" => "Seleccionar todos",
"New Contact" => "Nuevo contacto",
"Back" => "Atrás",
"Download Contact" => "Descargar contacto",
"Delete Contact" => "Eliminar contacto",
"Groups" => "Grupos",
"Favorite" => "Favorito",
"Close" => "Cierra.",
"Keyboard shortcuts" => "Atajos de teclado",
"Navigation" => "Navegación",
@ -153,41 +160,60 @@
"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",
"Title" => "Título",
"Organization" => "Organización",
"Birthday" => "Cumpleaños",
"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",
"Notes go here..." => "Las notas van acá...",
"Add" => "Añadir",
"Phone" => "Teléfono",
"Email" => "Correo electrónico",
"Instant Messaging" => "Mensajería instantánea",
"Address" => "Dirección",
"Note" => "Nota",
"Web site" => "Sitio Web",
"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",
"12345" => "12345",
"Your city" => "Su ciudad",
"Some region" => "Alguna región",
"Your country" => "Su país",
"Instant Messenger" => "Mensajero instantáneo",
"Delete IM" => "Eliminar IM",
"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",
"Enter nickname" => "Introduce un alias",
"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",
"Delete contact" => "Eliminar contacto",
"The temporary image has been removed from cache." => "La foto temporal se ha borrado del cache.",
@ -213,7 +239,6 @@
"Mrs" => "Sra",
"Dr" => "Dr",
"Given name" => "Nombre",
"Additional names" => "Nombres adicionales",
"Family name" => "Apellido",
"Hon. suffixes" => "Sufijos honoríficos",
"J.D." => "J.D.",
@ -230,15 +255,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

@ -8,18 +8,12 @@
"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",
"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.",
"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.",
@ -46,43 +40,16 @@
"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",
"A group named {group} already exists" => "Un grupo llamado {grupo} ya existe",
"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",
"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.",
"Importing..." => "Importando...",
"Enter name" => "Escribir nombre",
"Enter description" => "Escribir descripción",
"The address book name cannot be empty." => "El nombre de la libreta de direcciones no puede estar vacío.",
"Error" => "Error",
"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.",
"Result: " => "Resultado:",
" imported, " => "Importado.",
" failed." => "error.",
@ -100,9 +67,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",
@ -137,9 +101,10 @@
"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",
"Settings" => "Configuración",
"Import" => "Importar",
"Export" => "Exportar",
"Groups" => "Grupos",
"Close" => "cerrar",
"Keyboard shortcuts" => "Atajos de teclado",
"Navigation" => "Navegación",
@ -153,41 +118,46 @@
"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",
"Add contact" => "Agregar contacto",
"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",
"Additional names" => "Segundo nombre",
"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",
"Title" => "Título",
"Organization" => "Organización",
"Birthday" => "Cumpleaños",
"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",
"Add" => "Agregar",
"Phone" => "Teléfono",
"Email" => "e-mail",
"Instant Messaging" => "Mensajería instantánea",
"Address" => "Dirección",
"Note" => "Nota",
"Web site" => "Página web",
"Preferred" => "Preferido",
"Please specify a valid email address." => "Por favor, escribí una dirección de e-mail válida.",
"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",
"Go to web site" => "Ir al sitio web",
"View on map" => "Ver en el mapa",
"Instant Messenger" => "Mensajero instantáneo",
"Delete IM" => "Eliminar IM",
"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",
"Enter nickname" => "Escribí un sobrenombre",
"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",
"Delete contact" => "Borrar contacto",
"The temporary image has been removed from cache." => "La imagen temporal fue borrada de la caché",
@ -213,7 +183,6 @@
"Mrs" => "Sra.",
"Dr" => "Dr.",
"Given name" => "Nombre",
"Additional names" => "Segundo nombre",
"Family name" => "Apellido",
"Hon. suffixes" => "Sufijos honoríficos",
"J.D." => "J.D.",
@ -230,9 +199,7 @@
"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 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)",

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,39 @@
"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",
"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.",
"Add group" => "Lisa grupp",
"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.",
"Edit profile picture" => "Muuda profiili pilti",
"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",
"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.",
"Importing..." => "Importimine...",
"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.",
"Error" => "Viga",
"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 +98,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",
@ -128,6 +123,7 @@
"Internet" => "Internet",
"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.",
@ -137,9 +133,21 @@
"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",
"Share" => "Jaga",
"Import" => "Impordi",
"Import into:" => "Impordi:",
"Export" => "Ekspordi",
"(De-)select all" => "(Ära) vali kõik",
"New Contact" => "Uus kontakt",
"Back" => "Tagasi",
"Download Contact" => "Lae kontakt alla",
"Delete Contact" => "Kustuta kontakt",
"Groups" => "Grupid",
"Favorite" => "Lemmik",
"Close" => "Sule",
"Keyboard shortcuts" => "Klvaiatuuri otseteed",
"Navigation" => "Navigeerimine",
@ -153,41 +161,60 @@
"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",
"Title" => "Pealkiri",
"Organization" => "Organisatsioon",
"Birthday" => "Sünnipäev",
"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",
"Notes go here..." => "Märkmed lähevad siia..",
"Add" => "Lisa",
"Phone" => "Telefon",
"Email" => "E-post",
"Instant Messaging" => "Kiirsõnumid",
"Address" => "Aadress",
"Note" => "Märkus",
"Web site" => "Veebisait",
"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",
"12345" => "12345",
"Your city" => "Sinu linn",
"Some region" => "Mingi regioon",
"Your country" => "Sinu riik",
"Instant Messenger" => "Kiirsõnum",
"Delete IM" => "Kustuta IM",
"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",
"Enter nickname" => "Sisesta hüüdnimi",
"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",
"Delete contact" => "Kustuta kontakt",
"The temporary image has been removed from cache." => "Ajutine pilt on puhvrist eemaldatud.",
@ -213,7 +240,6 @@
"Mrs" => "Proua",
"Dr" => "Dr",
"Given name" => "Eesnimi",
"Additional names" => "Lisanimed",
"Family name" => "Perekonnanimi",
"Hon. suffixes" => "Järelliited",
"J.D." => "J.D.",
@ -230,15 +256,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,39 @@
"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",
"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 group" => "Gehitu taldea",
"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.",
"Edit profile picture" => "Editatu profilaren argazkia",
"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",
"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.",
"Importing..." => "Inportatzen",
"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.",
"Error" => "Errorea",
"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 +98,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,6 +121,9 @@
"Video" => "Bideoa",
"Pager" => "Bilagailua",
"Internet" => "Internet",
"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.",
@ -133,9 +133,19 @@
"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",
"Import" => "Inportatu",
"Import into:" => "Inportatu hemen:",
"Export" => "Exportatu",
"(De-)select all" => "(Ez-)Hautatu dena",
"New Contact" => "Kontaktu berria",
"Back" => "Atzera",
"Download Contact" => "Deskargatu kontaktua",
"Delete Contact" => "Ezabatu kontaktua",
"Groups" => "Taldeak",
"Favorite" => "Gogokoa",
"Close" => "Itxi",
"Keyboard shortcuts" => "Teklatuaren lasterbideak",
"Navigation" => "Nabigazioa",
@ -149,41 +159,56 @@
"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",
"Title" => "Izenburua",
"Organization" => "Erakundea",
"Birthday" => "Jaioteguna",
"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",
"Notes go here..." => "Idatzi oharrak hemen...",
"Add" => "Gehitu",
"Phone" => "Telefonoa",
"Email" => "Eposta",
"Instant Messaging" => "Berehalako mezularitza",
"Address" => "Helbidea",
"Note" => "Oharra",
"Web site" => "Web orria",
"Preferred" => "Hobetsia",
"Please specify a valid email address." => "Mesedez sartu eposta helbide egoki bat",
"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",
"12345" => "12345",
"Your city" => "Zure hiria",
"Your country" => "Zure herrialdea",
"Instant Messenger" => "Instant Messenger",
"Delete IM" => "Ezabatu BM",
"Add Contact" => "Gehitu kontaktua",
"Drop photo to upload" => "Askatu argazkia igotzeko",
"Edit name details" => "Editatu izenaren zehaztasunak",
"Enter nickname" => "Sartu ezizena",
"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",
"Delete contact" => "Ezabatu kontaktua",
"The temporary image has been removed from cache." => "Aldi bateko irudia cachetik ezabatu da.",
@ -203,7 +228,6 @@
"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",
@ -212,9 +236,7 @@
"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",

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,26 +38,10 @@
"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.",
"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" => "نوع را انتخاب کنید",
"Select photo" => "تصویر را انتخاب کنید",
"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." => "هیچ فایلی برای آپلود انتخاب نشده است",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "حجم فایل بسیار بیشتر از حجم تنظیم شده در تنظیمات سرور است",
"Upload too large" => "سایز فایل برای آپلود زیاد است(م.تنظیمات در php.ini)",
"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." => "مرورگر شما از آژاکس پشتیبانی نمی کند. لطفا از مرورگر بهتری استفاده کرده و یا بر روی تصویر پروفایل کلیک کنید تا تصوبر دیگری را جهت بارگذاری برگزینید",
"Unable to upload your file as it is a directory or has 0 bytes" => "ناتوان در بارگذاری یا فایل یک پوشه است یا 0بایت دارد",
"Upload Error" => "خطا در بار گذاری",
"Pending" => "در انتظار",
"Error" => "خطا",
"Result: " => "نتیجه:",
" imported, " => "وارد شد،",
" failed." => "ناموفق",
@ -71,8 +50,6 @@
"Edit" => "ویرایش",
"Delete" => "پاک کردن",
"Cancel" => "انصراف",
"This is not your addressbook." => "این کتابچه ی نشانه های شما نیست",
"Contact could not be found." => "اتصال ویا تماسی یافت نشد",
"Work" => "کار",
"Home" => "خانه",
"Other" => "دیگر",
@ -86,39 +63,46 @@
"Internet" => "اینترنت",
"{name}'s Birthday" => "روز تولد {name} است",
"Contact" => "اشخاص",
"Add Contact" => "افزودن اطلاعات شخص مورد نظر",
"Import" => "وارد کردن",
"Settings" => "تنظیمات",
"Import" => "وارد کردن",
"Export" => "خروجی گرفتن",
"Back" => "بازگشت",
"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" => "یک نام مستعار وارد کنید",
"Title" => "عنوان",
"Organization" => "نهاد(ارگان)",
"Birthday" => "روزتولد",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Groups" => "گروه ها",
"Separate groups with commas" => "جدا کردن گروه ها به وسیله درنگ نما",
"Edit groups" => "ویرایش گروه ها",
"Add" => "افزودن",
"Phone" => "شماره تلفن",
"Email" => "نشانی پست الکترنیک",
"Address" => "نشانی",
"Note" => "یادداشت",
"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" => "دیدن روی نقشه",
"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" => "ویرایش نام جزئیات",
"Enter nickname" => "یک نام مستعار وارد کنید",
"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." => "تصویر موقت از کش پاک شد.",
@ -139,7 +123,6 @@
"Mrs" => "خانم",
"Dr" => "دکتر",
"Given name" => "نام معلوم",
"Additional names" => "نام های دیگر",
"Family name" => "نام خانوادگی",
"Hon. suffixes" => "پسوند های محترم",
"J.D." => "J.D.",
@ -155,7 +138,6 @@
"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)" => "نشانی اولیه",

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,21 @@
"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",
"A group named {group} already exists" => "Ryhmä nimeltä {group} on jo olemassa",
"All" => "Kaikki",
"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ä",
"Add group" => "Lisää ryhmä",
"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.",
"Edit profile picture" => "Muokkaa profiilikuvaa",
"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",
"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.",
"Importing..." => "Tuodaan...",
"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ä",
"Error" => "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 +72,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",
@ -134,9 +106,13 @@
"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",
"New Group" => "Uusi ryhmä",
"Settings" => "Asetukset",
"Import" => "Tuo",
"Export" => "Vie",
"New Contact" => "Uusi yhteystieto",
"Back" => "Takaisin",
"Groups" => "Ryhmät",
"Close" => "Sulje",
"Keyboard shortcuts" => "Pikanäppäimet",
"Navigation" => "Suunnistus",
@ -150,41 +126,51 @@
"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",
"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",
"Title" => "Otsikko",
"Organization" => "Organisaatio",
"Birthday" => "Syntymäpäivä",
"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ä",
"Add" => "Lisää",
"Phone" => "Puhelin",
"Email" => "Sähköposti",
"Instant Messaging" => "Pikaviestintä",
"Address" => "Osoite",
"Note" => "Huomio",
"Web site" => "Verkkosivu",
"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",
"12345" => "12345",
"Instant Messenger" => "Pikaviestin",
"Delete IM" => "Poista IM",
"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",
"Enter nickname" => "Anna kutsumanimi",
"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",
"Delete contact" => "Poista yhteystieto",
"The temporary image has been removed from cache." => "Väliaikainen kuva on poistettu välimuistista.",
@ -210,7 +196,6 @@
"Mrs" => "Rouva",
"Dr" => "Tohtori",
"Given name" => "Etunimi",
"Additional names" => "Lisänimet",
"Family name" => "Sukunimi",
"Hon. suffixes" => "Kunnianarvoisa jälkiliite",
"J.D." => "J.D.",
@ -227,9 +212,7 @@
"Name of new addressbook" => "Uuden osoitekirjan nimi",
"Importing contacts" => "Tuodaan yhteystietoja",
"<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>",
"Add contact" => "Lisää yhteystieto",
"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.)",

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,39 @@
"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",
"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.",
"Add group" => "Ajouter un groupe",
"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.",
"Edit profile picture" => "Éditer l'image de profil",
"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",
"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.",
"Importing..." => "Import en cours…",
"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.",
"Error" => "Erreur",
"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 +99,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,6 +122,9 @@
"Video" => "Vidéo",
"Pager" => "Bipeur",
"Internet" => "Internet",
"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.",
@ -135,9 +134,21 @@
"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",
"Share" => "Partager",
"Import" => "Importer",
"Import into:" => "Importer dans :",
"Export" => "Exporter",
"(De-)select all" => "(Dé-)sélectionner tout",
"New Contact" => "Nouveau Contact",
"Back" => "Retour",
"Download Contact" => "Télécharger le Contact",
"Delete Contact" => "Supprimer le Contact",
"Groups" => "Groupes",
"Favorite" => "Favoris",
"Close" => "Fermer",
"Keyboard shortcuts" => "Raccourcis clavier",
"Navigation" => "Navigation",
@ -151,41 +162,60 @@
"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",
"Title" => "Titre",
"Organization" => "Société",
"Birthday" => "Anniversaire",
"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.",
"Notes go here..." => "Remarques…",
"Add" => "Ajouter",
"Phone" => "Téléphone",
"Email" => "E-mail",
"Instant Messaging" => "Messagerie instantanée",
"Address" => "Adresse",
"Note" => "Note",
"Web site" => "Page web",
"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",
"12345" => "12345",
"Your city" => "Votre Ville",
"Some region" => "Une Région",
"Your country" => "Votre Pays",
"Instant Messenger" => "Instant Messenger",
"Delete IM" => "Supprimer la messagerie instantanée",
"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",
"Enter nickname" => "Entrer un surnom",
"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",
"Delete contact" => "Supprimer le contact",
"The temporary image has been removed from cache." => "L'image temporaire a été supprimée du cache.",
@ -211,7 +241,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.",
@ -228,15 +257,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

@ -8,18 +8,12 @@
"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.",
"Could not parse contact: " => "Non se puido engadir o contacto: ",
"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: ",
"Missing IM parameter." => "Falta un parámetro do MI.",
"Unknown IM: " => "MI descoñecido:",
"Information about vCard is incorrect. Please reload the page." => "A información sobre a vCard é incorrecta. 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. 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.",
@ -46,43 +40,15 @@
"Couldn't load temporary image: " => "Non se puido cargar a imaxe temporal: ",
"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" => "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.",
"Error" => "Erro",
"Please enter an email address." => "Introduce unha dirección de correo electrónico.",
"Enter name" => "Indique o nome",
"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",
"Select photo" => "Seleccione fotografía",
"You do not have permission to add contacts to " => "Non tes permisos para engadir contactos a",
"Please select one of your own address books." => "Escolle un das túas axenda.",
"Permission error" => " Erro nos permisos ",
"Click to undo deletion of \"" => "Fai clic para desfacer que se eliminara \"",
"Cancelled deletion of: \"" => "Cancelar a eliminación de: \"",
"This property has to be non-empty." => "Esta propiedade non pode quedar baldeira.",
"Couldn't serialize elements." => "Non se puideron poñer os elementos en serie",
"Unknown error. Please check logs." => "Erro descoñecido. Comproba os rexistros log.",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' chamado sen argumento. Informe en bugs.owncloud.org",
"Edit name" => "Editar nome",
"No files selected for upload." => "Sen ficheiros escollidos para subir.",
"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.",
"Error loading profile picture." => "Erro ao cargar a imaxe de perfil.",
"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.",
"Do you want to merge these address books?" => "Queres combinar estes cadernos de enderezos?",
"Shared by " => "Compartido por",
"Upload too large" => "Subida demasiado grande",
"Only image files can be used as profile picture." => "Só se poden usar ficheiros de imaxe como foto de perfil.",
"Wrong file type" => "Tipo de ficheiro incorrecto",
"Your browser doesn't support AJAX upload. Please click on the profile picture to select a photo to upload." => "O teu navegador non soporta a subida AJAX. Fai clic na foto de perfil para seleccionar unha foto para subir.",
"Unable to upload your file as it is a directory or has 0 bytes" => "Non se puido subir o ficheiro pois ou é un directorio ou ten 0 bytes",
"Upload Error" => "Erro na subida",
"Pending" => "Pendentes",
"Import done" => "Importación realizada",
"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.",
"Importing..." => "Importando...",
"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.",
"Error" => "Erro",
"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.",
@ -100,9 +66,6 @@
"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.",
"Addressbook not found: " => "Non se atopou o caderno de enderezos:",
"This is not your addressbook." => "Esta non é a túa axenda.",
"Contact could not be found." => "Non se atopou o contacto.",
"Jabber" => "Jabber",
"AIM" => "AIM",
"MSN" => "MSN",
@ -137,9 +100,11 @@
"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.",
"Add Contact" => "Engadir contacto",
"Import" => "Importar",
"Settings" => "Preferencias",
"Import" => "Importar",
"Export" => "Exportar",
"Back" => "Atrás",
"Groups" => "Grupos",
"Close" => "Pechar",
"Keyboard shortcuts" => "Atallos de teclado",
"Navigation" => "Navegación",
@ -153,41 +118,46 @@
"Add new contact" => "Engadir un contacto novo",
"Add new addressbook" => "Engadir un novo caderno de enderezos",
"Delete current contact" => "Eliminar o contacto actual",
"Drop photo to upload" => "Solte a foto a subir",
"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",
"Organization" => "Organización",
"Additional names" => "Nomes adicionais",
"Nickname" => "Alcume",
"Enter nickname" => "Introduza o alcume",
"Web site" => "Sitio web",
"http://www.somesite.com" => "http://www.unhaligazon.net",
"Go to web site" => "Ir ao sitio web",
"Title" => "Título",
"Organization" => "Organización",
"Birthday" => "Aniversario",
"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." => "Indica unha dirección de correo electrónico válida.",
"Enter email address" => "Introduza unha dirección de correo electrónico",
"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",
"Instant Messenger" => "Mensaxería instantánea",
"Delete IM" => "Eliminar o MI",
"View on map" => "Ver no mapa",
"Edit address details" => "Editar os detalles do enderezo",
"Add notes here." => "Engadir aquí as notas.",
"Add field" => "Engadir campo",
"Add" => "Engadir",
"Phone" => "Teléfono",
"Email" => "Correo electrónico",
"Instant Messaging" => "Mensaxería instantánea",
"Address" => "Enderezo",
"Note" => "Nota",
"Web site" => "Sitio web",
"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",
"Instant Messenger" => "Mensaxería instantánea",
"Delete IM" => "Eliminar o MI",
"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",
"Enter nickname" => "Introduza o alcume",
"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",
"Delete contact" => "Borrar contacto",
"The temporary image has been removed from cache." => "A imaxe temporal foi eliminada da caché.",
@ -213,7 +183,6 @@
"Mrs" => "Sra",
"Dr" => "Dr",
"Given name" => "Alcume",
"Additional names" => "Nomes adicionais",
"Family name" => "Nome familiar",
"Hon. suffixes" => "Sufixos honorarios",
"J.D." => "J.D.",
@ -230,9 +199,7 @@
"Name of new addressbook" => "Nome do novo caderno de enderezos",
"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>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>",
"Add contact" => "Engadir contacto",
"Select Address Books" => "Escoller o cadernos de enderezos",
"Enter description" => "Introducir a descrición",
"CardDAV syncing addresses" => "Enderezos CardDAV a sincronizar",
"more info" => "máis información",
"Primary address (Kontact et al)" => "Enderezo primario (Kontact et al)",

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." => "מספר מזהה של אישר הקשר לא נשלח.",
@ -38,16 +33,10 @@
"Missing a temporary folder" => "תקיה זמנית חסרה",
"Contacts" => "אנשי קשר",
"Error" => "שגיאה",
"Upload too large" => "העלאה גדולה מידי",
"Unable to upload your file as it is a directory or has 0 bytes" => "לא יכול להעלות את הקובץ מכיוון שזו תקיה או שמשקל הקובץ 0 בתים",
"Upload Error" => "שגיאת העלאה",
"Pending" => "ממתין",
"Download" => "הורדה",
"Edit" => "עריכה",
"Delete" => "מחיקה",
"Cancel" => "ביטול",
"This is not your addressbook." => "זהו אינו ספר הכתובות שלך",
"Contact could not be found." => "לא ניתן לאתר איש קשר",
"Work" => "עבודה",
"Home" => "בית",
"Other" => "אחר",
@ -61,39 +50,45 @@
"Internet" => "אינטרנט",
"{name}'s Birthday" => "יום ההולדת של {name}",
"Contact" => "איש קשר",
"Add Contact" => "הוספת איש קשר",
"Import" => "יבא",
"Settings" => "הגדרות",
"Import" => "יבא",
"Export" => "יצוא",
"Back" => "אחורה",
"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" => "הכנס כינוי",
"Title" => "כותרת",
"Organization" => "ארגון",
"Birthday" => "יום הולדת",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Groups" => "קבוצות",
"Separate groups with commas" => "הפרד קבוצות עם פסיקים",
"Edit groups" => "ערוך קבוצות",
"Add" => "הוספה",
"Phone" => "טלפון",
"Email" => "דואר אלקטרוני",
"Address" => "כתובת",
"Note" => "הערה",
"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" => "ראה במפה",
"Add Contact" => "הוספת איש קשר",
"Drop photo to upload" => "גרור ושחרר תמונה בשביל להעלות",
"Edit name details" => "ערוך פרטי שם",
"Enter nickname" => "הכנס כינוי",
"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" => "ערוך כתובת",
@ -113,7 +108,6 @@
"Mrs" => "גב'",
"Dr" => "ד\"ר",
"Given name" => "שם",
"Additional names" => "שמות נוספים",
"Family name" => "שם משפחה",
"Hon. suffixes" => "סיומות שם",
"J.D." => "J.D.",
@ -129,7 +123,6 @@
"create a new addressbook" => "צור ספר כתובות חדש",
"Name of new addressbook" => "שם ספר כתובות החדש",
"Importing contacts" => "מיבא אנשי קשר",
"Add contact" => "הוסף איש קשר",
"CardDAV syncing addresses" => "CardDAV מסנכרן כתובות",
"more info" => "מידע נוסף",
"Primary address (Kontact et al)" => "כתובת ראשית",

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.",
@ -34,16 +29,10 @@
"Missing a temporary folder" => "Nedostaje privremeni direktorij",
"Contacts" => "Kontakti",
"Error" => "Greška",
"Upload too large" => "Prijenos je preobiman",
"Unable to upload your file as it is a directory or has 0 bytes" => "Nemoguće poslati datoteku jer je prazna ili je direktorij",
"Upload Error" => "Pogreška pri slanju",
"Pending" => "U tijeku",
"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",
@ -68,38 +57,44 @@
"Internet" => "Internet",
"{name}'s Birthday" => "{name} Rođendan",
"Contact" => "Kontakt",
"Add Contact" => "Dodaj kontakt",
"Import" => "Uvezi",
"Settings" => "Postavke",
"Import" => "Uvezi",
"Export" => "Izvoz",
"Back" => "Natrag",
"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",
"Title" => "Naslov",
"Organization" => "Organizacija",
"Birthday" => "Rođendan",
"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",
"Add" => "Dodaj",
"Phone" => "Telefon",
"Email" => "E-mail",
"Address" => "Adresa",
"Note" => "Bilješka",
"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",
"Add Contact" => "Dodaj kontakt",
"Drop photo to upload" => "Dovucite fotografiju za slanje",
"Edit name details" => "Uredi detalje imena",
"Enter nickname" => "Unesi nadimank",
"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",
"Delete contact" => "Izbriši kontakt",
"Edit address" => "Uredi adresu",
@ -112,9 +107,7 @@
"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",

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,26 +38,10 @@
"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",
"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",
"Select photo" => "Fotó 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",
"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",
"Only image files can be used as profile picture." => "Csak képfájl használható profilképnek",
"Wrong file type" => "Rossz fájltípus",
"Your browser doesn't support AJAX upload. Please click on the profile picture to select a photo to upload." => "Az Ön böngészője nem támogatja az AJAX feltöltést. Kérjük, kattintson a profilképre, hogy kiválaszthassa a feltöltendő képet.",
"Unable to upload your file as it is a directory or has 0 bytes" => "Nem tölthető fel, mert mappa volt, vagy 0 byte méretű",
"Upload Error" => "Feltöltési hiba",
"Pending" => "Folyamatban",
"Error" => "Hiba",
"Result: " => "Eredmény: ",
" imported, " => " beimportálva, ",
" failed." => " sikertelen",
@ -71,8 +50,6 @@
"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",
@ -86,39 +63,46 @@
"Internet" => "Internet",
"{name}'s Birthday" => "{name} születésnapja",
"Contact" => "Kapcsolat",
"Add Contact" => "Kapcsolat hozzáadása",
"Import" => "Import",
"Settings" => "Beállítások",
"Import" => "Import",
"Export" => "Exportálás",
"Back" => "Vissza",
"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",
"Title" => "Felirat",
"Organization" => "Szervezet",
"Birthday" => "Születésnap",
"dd-mm-yyyy" => "yyyy-mm-dd",
"Groups" => "Csoportok",
"Separate groups with commas" => "Vesszővel válassza el a csoportokat",
"Edit groups" => "Csoportok szerkesztése",
"Add" => "Hozzáad",
"Phone" => "Telefonszám",
"Email" => "E-mail",
"Address" => "Cím",
"Note" => "Jegyzet",
"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",
"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",
"Enter nickname" => "Becenév megadása",
"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",
@ -139,7 +123,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.",
@ -155,7 +138,6 @@
"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",

View File

@ -1,20 +1,16 @@
<?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",
@ -27,32 +23,38 @@
"Pager" => "Pager",
"Internet" => "Internet",
"Contact" => "Contacto",
"Add Contact" => "Adder contacto",
"Import" => "Importar",
"Settings" => "Configurationes",
"Import" => "Importar",
"Export" => "Exportar",
"Back" => "Retro",
"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",
"Title" => "Titulo",
"Organization" => "Organisation",
"Birthday" => "Anniversario",
"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",
"Add" => "Adder",
"Phone" => "Phono",
"Email" => "E-posta",
"Address" => "Adresse",
"Note" => "Nota",
"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",
"Add Contact" => "Adder contacto",
"Enter nickname" => "Inserer pseudonymo",
"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",
"Delete contact" => "Deler contacto",
"Edit address" => "Modificar adresses",
@ -70,14 +72,12 @@
"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",

View File

@ -1,8 +1,6 @@
<?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",
@ -12,15 +10,10 @@
"Missing a temporary folder" => "Kehilangan folder temporer",
"Contacts" => "kontak",
"Error" => "kesalahan",
"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",
"Importing..." => "mengimpor...",
"Download" => "unduh",
"Edit" => "ubah",
"Delete" => "hapus",
"Cancel" => "batal",
"Contact could not be found." => "kontak tidak dapat ditemukan",
"Work" => "pekerjaan",
"Home" => "rumah",
"Other" => "Lainnya",
@ -34,22 +27,25 @@
"Internet" => "internet",
"{name}'s Birthday" => "hari ulang tahun {name}",
"Contact" => "kontak",
"Add Contact" => "tambah kontak",
"Import" => "impor",
"Settings" => "pengaturan",
"Close" => "tutup",
"Edit name details" => "ubah detail nama",
"Organization" => "organisasi",
"Nickname" => "nama panggilan",
"Enter nickname" => "masukkan nama panggilan",
"Birthday" => "tanggal lahir",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Import" => "impor",
"Export" => "ekspor",
"Back" => "Kembali",
"Groups" => "grup",
"Separate groups with commas" => "pisahkan grup dengan tanda koma",
"Preferred" => "disarankan",
"Close" => "tutup",
"Nickname" => "nama panggilan",
"Organization" => "organisasi",
"Birthday" => "tanggal lahir",
"Add" => "tambah",
"Phone" => "telefon",
"Email" => "surel",
"Address" => "alamat",
"Preferred" => "disarankan",
"Add Contact" => "tambah kontak",
"Edit name details" => "ubah detail nama",
"Enter nickname" => "masukkan nama panggilan",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Separate groups with commas" => "pisahkan grup dengan tanda koma",
"Download contact" => "unduk kontak",
"Delete contact" => "hapus kontak",
"Type" => "tipe",

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,39 @@
"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",
"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à",
"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",
"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.",
"Add group" => "Aggiungi gruppo",
"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.",
"Edit profile picture" => "Modifica l'immagine del profilo",
"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",
"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.",
"Importing..." => "Importazione in corso...",
"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.",
"Error" => "Errore",
"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 +99,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",
@ -128,6 +124,7 @@
"Internet" => "Internet",
"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.",
@ -137,9 +134,21 @@
"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",
"Share" => "Condividi",
"Import" => "Importa",
"Import into:" => "Importa in:",
"Export" => "Esporta",
"(De-)select all" => "(De)seleziona tutto",
"New Contact" => "Nuovo contatto",
"Back" => "Indietro",
"Download Contact" => "Scarica contatto",
"Delete Contact" => "Elimina contatto",
"Groups" => "Gruppi",
"Favorite" => "Preferito",
"Close" => "Chiudi",
"Keyboard shortcuts" => "Scorciatoie da tastiera",
"Navigation" => "Navigazione",
@ -153,41 +162,60 @@
"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",
"Title" => "Titolo",
"Organization" => "Organizzazione",
"Birthday" => "Compleanno",
"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",
"Notes go here..." => "Le note vanno qui...",
"Add" => "Aggiungi",
"Phone" => "Telefono",
"Email" => "Email",
"Instant Messaging" => "Messaggistica istantanea",
"Address" => "Indirizzo",
"Note" => "Nota",
"Web site" => "Sito web",
"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",
"12345" => "12345",
"Your city" => "La tua città",
"Some region" => "Una regione",
"Your country" => "Il tuo paese",
"Instant Messenger" => "Client di messaggistica istantanea",
"Delete IM" => "Elimina IM",
"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",
"Enter nickname" => "Inserisci pseudonimo",
"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",
"Delete contact" => "Elimina contatto",
"The temporary image has been removed from cache." => "L'immagine temporanea è stata rimossa dalla cache.",
@ -213,7 +241,6 @@
"Mrs" => "Sig.ra",
"Dr" => "Dott.",
"Given name" => "Nome",
"Additional names" => "Nomi aggiuntivi",
"Family name" => "Cognome",
"Hon. suffixes" => "Suffissi onorifici",
"J.D." => "J.D.",
@ -230,15 +257,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,39 @@
"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" => "タイプを選択",
"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} のグループはすでに存在します",
"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" => "名前を編集",
"Network or server error. Please inform administrator." => "ネットワークもしくはサーバエラーです。管理者に連絡してください。",
"Error adding to group." => "グループに追加エラー。",
"Error removing from group." => "グループから削除エラー。",
"There was an error opening a mail composer." => "メールコンポーザの起動エラーが発生しました。",
"Add group" => "グループを追加",
"No files selected for upload." => "アップロードするファイルが選択されていません。",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "アップロードしようとしているファイルは、このサーバの最大ファイルアップロードサイズを超えています。",
"Edit profile picture" => "プロフィール写真を編集",
"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" => "インポート完了",
"Not all files uploaded. Retrying..." => "ファイルがアップロード出来ませんでした。再実行中...。",
"Something went wrong with the upload, please retry." => "アップロード中に不具合が発生しました、再実行してください。",
"Importing..." => "インポート中...",
"Enter name" => "名前を入力",
"Enter description" => "説明を入力してください",
"Select addressbook" => "アドレスブックを選択",
"The address book name cannot be empty." => "アドレス帳名は空に出来ません。",
"Error" => "エラー",
"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 +99,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",
@ -128,6 +124,7 @@
"Internet" => "インターネット",
"Friends" => "友達",
"Family" => "家族",
"There was an error deleting properties for this contact." => "この連絡先のプロパティの削除エラーが発生しました。",
"{name}'s Birthday" => "{name}の誕生日",
"Contact" => "連絡先",
"You do not have the permissions to add contacts to this addressbook." => "アドレスブックに連絡先を追加する権限がありません",
@ -137,9 +134,21 @@
"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" => "設定",
"Share" => "共有",
"Import" => "インポート",
"Import into:" => "インポート情報:",
"Export" => "エクスポート",
"(De-)select all" => "すべての選択を解除",
"New Contact" => "新しい連絡先",
"Back" => "戻る",
"Download Contact" => "連絡先をダウンロード",
"Delete Contact" => "連絡先を削除",
"Groups" => "グループ",
"Favorite" => "お気に入り",
"Close" => "閉じる",
"Keyboard shortcuts" => "キーボードショートカット",
"Navigation" => "ナビゲーション",
@ -153,41 +162,60 @@
"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サイトへ移動",
"Title" => "タイトル",
"Organization" => "所属",
"Birthday" => "誕生日",
"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" => "項目を追加",
"Notes go here..." => "メモはここに...",
"Add" => "追加",
"Phone" => "電話番号",
"Email" => "メールアドレス",
"Instant Messaging" => "インスタントメッセージ",
"Address" => "住所",
"Note" => "メモ",
"Web site" => "ウェブサイト",
"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" => "番地",
"12345" => "12345",
"Your city" => "",
"Some region" => "都道府県",
"Your country" => "",
"Instant Messenger" => "インスタントメッセンジャー",
"Delete IM" => "IMを削除",
"Add Contact" => "連絡先の追加",
"Drop photo to upload" => "写真をドロップしてアップロード",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "編集フォーマット、ショートネーム、フルネーム、逆順、カンマ区切りの逆順",
"Edit name details" => "名前の詳細を編集",
"Enter nickname" => "ニックネームを入力",
"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." => "一時画像はキャッシュから削除されました。",
@ -213,7 +241,6 @@
"Mrs" => "Mrs",
"Dr" => "Dr",
"Given name" => "",
"Additional names" => "ミドルネーム",
"Family name" => "",
"Hon. suffixes" => "称号",
"J.D." => "J.D.",
@ -230,15 +257,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

@ -8,10 +8,6 @@
"Missing a temporary folder" => "დროებითი საქაღალდე არ არსებობს",
"Contacts" => "კონტაქტები",
"Error" => "შეცდომა",
"Upload too large" => "ასატვირთი ფაილი ძალიან დიდია",
"Unable to upload your file as it is a directory or has 0 bytes" => "თქვენი ფაილის ატვირთვა ვერ მოხერხდა. ის არის საქაღალდე და შეიცავს 0 ბაიტს",
"Upload Error" => "შეცდომა ატვირთვისას",
"Pending" => "მოცდის რეჟიმში",
"Download" => "ჩამოტვირთვა",
"Edit" => "რედაქტირება",
"Delete" => "წაშლა",
@ -28,26 +24,30 @@
"Pager" => "პეიჯერი",
"Internet" => "ინტერნეტი",
"Contact" => "კონტაქტი",
"Add Contact" => "კონტაქტის დამატება",
"Import" => "იმპორტი",
"Settings" => "პარამეტრები",
"Import" => "იმპორტი",
"Export" => "ექსპორტი",
"Groups" => "ჯგუფები",
"Close" => "დახურვა",
"Add contact" => "კონტაქტის დამატება",
"Delete current photo" => "მიმდინარე სურათის წაშლა",
"Edit current photo" => "მიმდინარე სურათის რედაქტირება",
"Upload new photo" => "ახალი სურათის ატვირთვა",
"Select photo from ownCloud" => "აირჩიე სურათი ownCloud –იდან",
"Organization" => "ორგანიზაცია",
"Nickname" => "ნიკნეიმი",
"Title" => "სახელი",
"Organization" => "ორგანიზაცია",
"Birthday" => "დაბადების დრე",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Groups" => "ჯგუფები",
"Edit groups" => "ჯგუფების რედაქტირება",
"Enter email address" => "ჩაწერეთ იმეილ მისამართი",
"Add field" => "დაამატე ველი",
"Add" => "დამატება",
"Phone" => "ტელეფონი",
"Email" => "იმეილი",
"Address" => "მისამართი",
"Note" => "შენიშვნა",
"Add Contact" => "კონტაქტის დამატება",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Edit groups" => "ჯგუფების რედაქტირება",
"Enter email address" => "ჩაწერეთ იმეილ მისამართი",
"Add field" => "დაამატე ველი",
"Download contact" => "კონტაქტის ჩამოტვირთვა",
"Delete contact" => "კონტაქტის წაშლა",
"Edit address" => "მისამართის რედაქტირება",
@ -63,7 +63,6 @@
"Ms" => "მის",
"Mr" => "მისტერ",
"Sir" => "სერ",
"Add contact" => "კონტაქტის დამატება",
"more info" => "უფრო მეტი ინფორმაცია",
"Primary address (Kontact et al)" => "პირველადი მისამართი (Kontact et al)",
"iOS/OS X" => "iOS/OS X",

View File

@ -8,18 +8,12 @@
"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 분석 오류",
"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. " => "무언가가 FUBAR로 감.",
"Missing IM parameter." => "IM 매개 변수 분실.",
"Unknown IM: " => "알려지지 않은 IM:",
"No contact ID was submitted." => "접속 아이디가 기입되지 않았습니다.",
"Error reading contact photo." => "사진 읽기 오류",
"Error saving temporary file." => "임시 파일을 저장하는 동안 오류가 발생했습니다. ",
@ -46,43 +40,15 @@
"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, Short name, Full name, Reverse or Reverse with comma",
"Select type" => "유형 선택",
"Select photo" => "사진 선택",
"You do not have permission to add contacts to " => "당신은 연락처를 추가 할 수 있는 권한이 없습니다. ",
"Please select one of your own address books." => "당신의 Own 주소록 중 하나만 선택 하세요.",
"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 " => "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" => "가져오기 완료",
"Not all files uploaded. Retrying..." => "모든파일이 업로드되지 않았습니다. 재시도중...",
"Something went wrong with the upload, please retry." => "업로드 하는데 무언가 잘못되었습니다. 재시도 해주세요.",
"Importing..." => "가져오기중...",
"Enter name" => "이름을 입력",
"Enter description" => "설명을 입력",
"The address book name cannot be empty." => "주소록 이름은 비워둘 수 없습니다.",
"Error" => "오류",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "일부 연락처가 삭제 표시 되었으나 아직 삭제되지 않았습니다. 삭제가 끝날 때 까지 기다려 주세요.",
"Result: " => "결과:",
" imported, " => "불러오기,",
" failed." => "실패.",
@ -100,9 +66,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",
@ -137,9 +100,11 @@
"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" => "입력",
"Settings" => "설정",
"Import" => "입력",
"Export" => "내보내기",
"Back" => "뒤로",
"Groups" => "그룹",
"Close" => "닫기",
"Keyboard shortcuts" => "단축키",
"Navigation" => "네비게이션",
@ -153,41 +118,46 @@
"Add new contact" => "새로운 연락처 추가",
"Add new addressbook" => "새로운 주소록 추가",
"Delete current contact" => "현재 연락처 삭제",
"Drop photo to upload" => "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" => "별명 입력",
"Web site" => "웹 사이트",
"http://www.somesite.com" => "http://www.somesite.com",
"Go to web site" => "웹 사이트로 가기",
"Title" => "제목",
"Organization" => "조직",
"Birthday" => "생일",
"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" => "이메일 주소 삭제",
"Enter phone number" => "전화번호 입력",
"Delete phone number" => "전화번호 삭제",
"Instant Messenger" => "인스턴트 메신저",
"Delete IM" => "IM 삭제",
"View on map" => "지도에서 보기",
"Edit address details" => "상세 주소 수정",
"Add notes here." => "여기에 노트 추가.",
"Add field" => "파일 추가",
"Add" => "추가",
"Phone" => "전화 번호",
"Email" => "전자 우편",
"Instant Messaging" => "인스턴트 메세지",
"Address" => "주소",
"Note" => "노트",
"Web site" => "웹 사이트",
"Preferred" => "선호함",
"Please specify a valid email address." => "올바른 이메일 주소를 입력하세요.",
"Mail to address" => "이메일 주소",
"Delete email address" => "이메일 주소 삭제",
"Enter phone number" => "전화번호 입력",
"Delete phone number" => "전화번호 삭제",
"Go to web site" => "웹 사이트로 가기",
"View on map" => "지도에서 보기",
"Instant Messenger" => "인스턴트 메신저",
"Delete IM" => "IM 삭제",
"Add Contact" => "연락처 추가",
"Drop photo to upload" => "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" => "이름 세부사항을 편집합니다. ",
"Enter nickname" => "별명 입력",
"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" => "연락처 다운로드",
"Delete contact" => "연락처 삭제",
"The temporary image has been removed from cache." => "임시 이미지가 캐시에서 제거 되었습니다. ",
@ -213,7 +183,6 @@
"Mrs" => "Mrs",
"Dr" => "Dr",
"Given name" => "Given name",
"Additional names" => "추가 이름",
"Family name" => "",
"Hon. suffixes" => "Hon. suffixes",
"J.D." => "J.D.",
@ -230,9 +199,7 @@
"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 파일을 가져올 수 있습니다, or on an empty spot to create a new addressbook and import into that.<br />당신은 리스트 상단에 위치한 가져오기 버튼을 누름으로써 가져올수 있습니다.</p>",
"Add contact" => "연락처 추가",
"Select Address Books" => "주소록 선택",
"Enter description" => "설명을 입력",
"CardDAV syncing addresses" => "CardDAV 주소 동기화",
"more info" => "더 많은 정보",
"Primary address (Kontact et al)" => "기본 주소 (Kontact et al)",

View File

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

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.",
@ -25,16 +22,12 @@
"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",
@ -48,25 +41,30 @@
"Internet" => "Internet",
"{name}'s Birthday" => "{name} säi Gebuertsdag",
"Contact" => "Kontakt",
"Add Contact" => "Kontakt bäisetzen",
"Import" => "Import",
"Settings" => "Astellungen",
"Close" => "Zoumaachen",
"Organization" => "Firma",
"Nickname" => "Spëtznumm",
"Enter nickname" => "Gëff e Spëtznumm an",
"Birthday" => "Gebuertsdag",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Import" => "Import",
"Export" => "Export",
"Back" => "Zeréck",
"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",
"Close" => "Zoumaachen",
"Additional names" => "Weider Nimm",
"Nickname" => "Spëtznumm",
"Title" => "Titel",
"Organization" => "Firma",
"Birthday" => "Gebuertsdag",
"Add" => "Dobäisetzen",
"Phone" => "Telefon",
"Email" => "Email",
"Address" => "Adress",
"Note" => "Note",
"Enter phone number" => "Telefonsnummer aginn",
"Delete phone number" => "Telefonsnummer läschen",
"View on map" => "Op da Kaart uweisen",
"Add Contact" => "Kontakt bäisetzen",
"Enter nickname" => "Gëff e Spëtznumm an",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Edit groups" => "Gruppen editéieren",
"Edit address details" => "Adress Detailer editéieren",
"Download contact" => "Kontakt eroflueden",
"Delete contact" => "Kontakt läschen",
"Type" => "Typ",
@ -82,7 +80,6 @@
"Mrs" => "Mme",
"Dr" => "Dr",
"Given name" => "Virnumm",
"Additional names" => "Weider Nimm",
"Family name" => "Famillje Numm",
"Ph.D." => "Ph.D.",
"Jr." => "Jr.",

View File

@ -15,17 +15,10 @@
"Missing a temporary folder" => "Nėra laikinojo katalogo",
"Contacts" => "Kontaktai",
"Error" => "Klaida",
"Upload too large" => "Įkėlimui failas per didelis",
"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",
"Pending" => "Laukiantis",
"Importing..." => "Importuojama...",
"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",
@ -38,18 +31,22 @@
"Pager" => "Pranešimų gaviklis",
"Internet" => "Internetas",
"Contact" => "Kontaktas",
"Add Contact" => "Pridėti kontaktą",
"Import" => "Importuoti",
"Settings" => "Nustatymai",
"Close" => "Užverti",
"Organization" => "Organizacija",
"Nickname" => "Slapyvardis",
"Enter nickname" => "Įveskite slapyvardį",
"Birthday" => "Gimtadienis",
"Import" => "Importuoti",
"Export" => "Eksportuoti",
"Back" => "Atgal",
"Groups" => "Grupės",
"Close" => "Užverti",
"Nickname" => "Slapyvardis",
"Title" => "Pavadinimas",
"Organization" => "Organizacija",
"Birthday" => "Gimtadienis",
"Add" => "Pridėti",
"Phone" => "Telefonas",
"Email" => "El. paštas",
"Address" => "Adresas",
"Add Contact" => "Pridėti kontaktą",
"Enter nickname" => "Įveskite slapyvardį",
"Download contact" => "Atsisųsti kontaktą",
"Delete contact" => "Ištrinti kontaktą",
"Type" => "Tipas",

View File

@ -1,16 +1,16 @@
<?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",
"Upload too large" => "Fails ir par lielu lai to augšuplādetu",
"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",
"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"
"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,26 +38,10 @@
"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" => "Грешка",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Прилагоден формат, кратко име, цело име, обратно или обратно со запирка",
"Select type" => "Одбери тип",
"Select photo" => "Одбери фотографија",
"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." => "Датотеката која се обидувате да ја префрлите ја надминува максималната големина дефинирана за пренос на овој сервер.",
"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" => "Чека",
"Error" => "Грешка",
"Result: " => "Резултат: ",
" imported, " => "увезено,",
" failed." => "неуспешно.",
@ -71,8 +50,6 @@
"Edit" => "Уреди",
"Delete" => "Избриши",
"Cancel" => "Откажи",
"This is not your addressbook." => "Ова не е во Вашиот адресар.",
"Contact could not be found." => "Контактот неможе да биде најден.",
"Work" => "Работа",
"Home" => "Дома",
"Other" => "Останато",
@ -86,39 +63,46 @@
"Internet" => "Интернет",
"{name}'s Birthday" => "Роденден на {name}",
"Contact" => "Контакт",
"Add Contact" => "Додади контакт",
"Import" => "Внеси",
"Settings" => "Параметри",
"Import" => "Внеси",
"Export" => "Извези",
"Back" => "Назад",
"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" => "Внеси прекар",
"Title" => "Наслов",
"Organization" => "Организација",
"Birthday" => "Роденден",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Groups" => "Групи",
"Separate groups with commas" => "Одвоете ги групите со запирка",
"Edit groups" => "Уреди групи",
"Add" => "Додади",
"Phone" => "Телефон",
"Email" => "Е-пошта",
"Address" => "Адреса",
"Note" => "Забелешка",
"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" => "Погледајте на мапа",
"Add Contact" => "Додади контакт",
"Drop photo to upload" => "Довлечкај фотографија за да се подигне",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Прилагоден формат, кратко име, цело име, обратно или обратно со запирка",
"Edit name details" => "Уреди детали за име",
"Enter nickname" => "Внеси прекар",
"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." => "Привремената слика е отстранета од кешот.",
@ -139,7 +123,6 @@
"Mrs" => "Г-ѓа",
"Dr" => "Др",
"Given name" => "Лично име",
"Additional names" => "Дополнителни имиња",
"Family name" => "Презиме",
"Hon. suffixes" => "Суфикси за титула",
"J.D." => "J.D.",
@ -155,7 +138,6 @@
"create a new addressbook" => "креирај нов адресар",
"Name of new addressbook" => "Име на новиот адресар",
"Importing contacts" => "Внесување контакти",
"Add contact" => "Додади контакт",
"CardDAV syncing addresses" => "Адреса за синхронизација со CardDAV",
"more info" => "повеќе информации",
"Primary address (Kontact et al)" => "Примарна адреса",

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,27 +38,12 @@
"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.",
"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",
"Select photo" => "Pilih foto",
"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.",
"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",
"Only image files can be used as profile picture." => "Hanya fail imej boleh digunakan sebagai gambar profil.",
"Wrong file type" => "Salah jenis fail",
"Your browser doesn't support AJAX upload. Please click on the profile picture to select a photo to upload." => "Pelayar web anda tidak menyokong muatnaik AJAX. Sila klik pada gambar profil untuk memilih foto untuk dimuatnail.",
"Unable to upload your file as it is a directory or has 0 bytes" => "Tidak boleh memuatnaik fail anda kerana mungkin ianya direktori atau saiz fail 0 bytes",
"Upload Error" => "Muat naik ralat",
"Pending" => "Dalam proses",
"Enter name" => "Masukkan nama",
"Enter description" => "Masukkan keterangan",
"Error" => "Ralat",
"Result: " => "Hasil: ",
" imported, " => " import, ",
" failed." => " gagal.",
@ -73,9 +53,6 @@
"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",
@ -89,41 +66,47 @@
"Internet" => "Internet",
"{name}'s Birthday" => "Hari Lahir {name}",
"Contact" => "Hubungan",
"Add Contact" => "Tambah kenalan",
"Import" => "Import",
"Settings" => "Tetapan",
"Import" => "Import",
"Export" => "Export",
"Back" => "Kembali",
"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",
"Organization" => "Organisasi",
"Birthday" => "Hari lahir",
"dd-mm-yyyy" => "dd-mm-yyyy",
"Groups" => "Kumpulan",
"Separate groups with commas" => "Asingkan kumpulan dengan koma",
"Edit groups" => "Ubah kumpulan",
"Add" => "Tambah",
"Phone" => "Telefon",
"Email" => "Emel",
"Address" => "Alamat",
"Note" => "Nota",
"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",
"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",
"Enter nickname" => "Masukkan nama samaran",
"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.",
@ -144,7 +127,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 +142,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

@ -8,13 +8,8 @@
"No address books found." => "Ingen adressebok funnet.",
"No contacts found." => "Ingen kontakter funnet.",
"element name is not set." => "navn på elementet er ikke satt.",
"Could not parse contact: " => "Kunne ikke behandle kontakt:",
"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.",
"Trying to add duplicate property: " => "Prøver å legge til dobbel verdi:",
"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",
"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.",
"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.",
@ -42,28 +37,10 @@
"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",
"Sorry, this functionality has not been implemented yet" => "Beklager denne funksjonaliteten er ikke lagt inn enda.",
"Not implemented" => "Ikke implementert",
"Couldn't get a valid address." => "Kunne ikke hente en gyldig adresse",
"Error" => "Feil",
"Select type" => "Velg type",
"Select photo" => "Velg bilde",
"You do not have permission to add contacts to " => "Du har ikke tilgang til å legge inn kontakter i",
"Please select one of your own address books." => "Vennligst velg en av dine egne adressebøker",
"This property has to be non-empty." => "Denne verdien kan ikke være tom.",
"Unknown error. Please check logs." => "Ukjent feil. Vennligst sjekke loggene.",
"Edit name" => "Endre navn",
"No files selected for upload." => "Ingen filer valgt for opplasting.",
"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.",
"Shared by " => "Delt av",
"Upload too large" => "Filen er for stor",
"Only image files can be used as profile picture." => "Kun bildefiler kan bli brukt som profilbilde",
"Wrong file type" => "Feil filtype",
"Your browser doesn't support AJAX upload. Please click on the profile picture to select a photo to upload." => "Din nettleser støtter ikke opplasting med AJAX. Klikk på ønsket bilde for å laste opp.",
"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",
"Pending" => "Ventende",
"Importing..." => "Importerer...",
"Error" => "Feil",
"Result: " => "Resultat:",
" imported, " => "importert,",
" failed." => "feilet.",
@ -74,8 +51,6 @@
"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",
"This is not your addressbook." => "Dette er ikke dine adressebok.",
"Contact could not be found." => "Kontakten ble ikke funnet.",
"Yahoo" => "Yahoo",
"Skype" => "Skype",
"Work" => "Arbeid",
@ -95,9 +70,11 @@
"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",
"Add Contact" => "Ny kontakt",
"Import" => "Importer",
"Settings" => "Innstillinger",
"Import" => "Importer",
"Export" => "Eksporter",
"Back" => "Tilbake",
"Groups" => "Grupper",
"Close" => "Lukk",
"Keyboard shortcuts" => "Tastatur snarveier",
"Navigation" => "Navigasjon",
@ -107,37 +84,41 @@
"Add new contact" => "Legg til ny kontakt",
"Add new addressbook" => "Legg til ny adressebok",
"Delete current contact" => "Slett kontakten",
"Drop photo to upload" => "Dra bilder hit for å laste opp",
"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",
"Web site" => "Hjemmeside",
"http://www.somesite.com" => "http://www.domene.no",
"Title" => "Tittel",
"Organization" => "Organisasjon",
"Birthday" => "Bursdag",
"dd-mm-yyyy" => "dd-mm-åååå",
"Groups" => "Grupper",
"Separate groups with commas" => "Skill gruppene med komma",
"Edit groups" => "Endre grupper",
"Add" => "Legg til",
"Phone" => "Telefon",
"Email" => "E-post",
"Address" => "Adresse",
"Note" => "Notat",
"Web site" => "Hjemmeside",
"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",
"Add Contact" => "Ny kontakt",
"Drop photo to upload" => "Dra bilder hit for å laste opp",
"Edit name details" => "Endre detaljer rundt navn",
"Enter nickname" => "Skriv inn kallenavn",
"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.",
@ -156,7 +137,6 @@
"Mrs" => "Fru",
"Dr" => "Dr",
"Given name" => "Fornavn",
"Additional names" => "Ev. mellomnavn",
"Family name" => "Etternavn",
"Hon. suffixes" => "Titler",
"Ph.D." => "Stipendiat",
@ -167,7 +147,6 @@
"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)",

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,37 @@
"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",
"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.",
"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.",
"Edit profile picture" => "Bewerk profielafbeelding",
"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",
"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.",
"Importing..." => "Importeren...",
"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.",
"Error" => "Fout",
"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 +97,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",
@ -137,9 +131,12 @@
"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",
"Settings" => "Instellingen",
"Share" => "Deel",
"Import" => "Importeer",
"Export" => "Exporteer",
"Back" => "Terug",
"Groups" => "Groepen",
"Close" => "Sluiten",
"Keyboard shortcuts" => "Sneltoetsen",
"Navigation" => "Navigatie",
@ -153,41 +150,46 @@
"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",
"Add contact" => "Contactpersoon toevoegen",
"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",
"Additional names" => "Extra namen",
"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",
"Title" => "Titel",
"Organization" => "Organisatie",
"Birthday" => "Verjaardag",
"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",
"Add" => "Toevoegen",
"Phone" => "Telefoon",
"Email" => "E-mail",
"Instant Messaging" => "Instant Messaging",
"Address" => "Adres",
"Note" => "Notitie",
"Web site" => "Website",
"Preferred" => "Voorkeur",
"Please specify a valid email address." => "Geef een geldig email adres op.",
"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",
"View on map" => "Bekijk op een kaart",
"Instant Messenger" => "Instant Messenger",
"Delete IM" => "Verwijder IM",
"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",
"Enter nickname" => "Voer roepnaam in",
"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",
"Delete contact" => "Verwijder contact",
"The temporary image has been removed from cache." => "Het tijdelijke plaatje is uit de cache verwijderd.",
@ -213,7 +215,6 @@
"Mrs" => "Mw",
"Dr" => "M",
"Given name" => "Voornaam",
"Additional names" => "Extra namen",
"Family name" => "Achternaam",
"Hon. suffixes" => "Honorabele",
"J.D." => "Jurist",
@ -230,15 +231,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,7 +1,5 @@
<?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",
@ -11,13 +9,10 @@
"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",
@ -28,17 +23,21 @@
"Video" => "Video",
"Pager" => "Personsøkjar",
"Contact" => "Kontakt",
"Add Contact" => "Legg til kontakt",
"Import" => "Importer",
"Settings" => "Innstillingar",
"Import" => "Importer",
"Export" => "Eksporter",
"Back" => "Tilbake",
"Groups" => "Grupper",
"Close" => "Lukk",
"Title" => "Tittel",
"Organization" => "Organisasjon",
"Birthday" => "Bursdag",
"Groups" => "Grupper",
"Preferred" => "Føretrekt",
"Add" => "Legg til",
"Phone" => "Telefonnummer",
"Email" => "Epost",
"Address" => "Adresse",
"Preferred" => "Føretrekt",
"Add Contact" => "Legg til kontakt",
"Download contact" => "Last ned kontakt",
"Delete contact" => "Slett kontakt",
"Type" => "Skriv",

View File

@ -8,20 +8,19 @@
"Missing a temporary folder" => "Un dorsièr temporari manca",
"Contacts" => "Contactes",
"Error" => "Error",
"Upload too large" => "Amontcargament tròp gròs",
"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",
"Pending" => "Al esperar",
"Download" => "Avalcarga",
"Edit" => "Editar",
"Delete" => "Escafa",
"Cancel" => "Annula",
"Work" => "Trabalh",
"Other" => "Autres",
"Import" => "Importa",
"Settings" => "Configuracion",
"Birthday" => "Anniversari",
"Import" => "Importa",
"Export" => "Exporta",
"Groups" => "Grops",
"Title" => "Títol",
"Birthday" => "Anniversari",
"Add" => "Ajusta",
"Email" => "Corrièl",
"more info" => "mai d'entresenhes",
"Primary address (Kontact et al)" => "Adreiças primarias (Kontact et al)",

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,39 @@
"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",
"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ę",
"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.",
"Add group" => "Dodaj drupę",
"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.",
"Edit profile picture" => "Edytuj zdjęcie profilu",
"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",
"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.",
"Importing..." => "Importowanie...",
"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.",
"Error" => "Błąd",
"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 +99,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",
@ -128,6 +124,7 @@
"Internet" => "Internet",
"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.",
@ -137,9 +134,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",
"Share" => "Udostępnij",
"Import" => "Import",
"Import into:" => "Importuj do:",
"Export" => "Export",
"(De-)select all" => "Odznacz wszystkie",
"New Contact" => "Nowy kontakt",
"Back" => "Wróć",
"Download Contact" => "Pobierz kontakt",
"Delete Contact" => "Usuń kontakt",
"Groups" => "Grupy",
"Favorite" => "Ulubione",
"Close" => "Zamknij",
"Keyboard shortcuts" => "Skróty klawiatury",
"Navigation" => "Nawigacja",
@ -153,41 +162,60 @@
"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",
"Title" => "Tytuł",
"Organization" => "Organizacja",
"Birthday" => "Urodziny",
"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",
"Notes go here..." => "Notatki kliknij tutaj...",
"Add" => "Dodaj",
"Phone" => "Telefon",
"Email" => "E-mail",
"Instant Messaging" => "Komunikator",
"Address" => "Adres",
"Note" => "Uwaga",
"Web site" => "Strona www",
"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",
"12345" => "12345",
"Your city" => "Twoje miasto",
"Some region" => "Region",
"Your country" => "Twoje państwo",
"Instant Messenger" => "Komunikator",
"Delete IM" => "Usuń Komunikator",
"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",
"Enter nickname" => "Wpisz nazwę",
"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",
"Delete contact" => "Usuwa kontakt",
"The temporary image has been removed from cache." => "Tymczasowy obraz został usunięty z pamięci podręcznej.",
@ -213,7 +241,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.",
@ -230,15 +257,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,5 +1,6 @@
<?php $TRANSLATIONS = array(
"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

@ -8,18 +8,12 @@
"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.",
"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. ",
"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 +40,15 @@
"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",
"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.",
"Importing..." => "Importando...",
"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.",
"Error" => "Erro",
"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 +66,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",
@ -135,9 +98,11 @@
"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",
"Export" => "Exportar",
"Back" => "Voltar",
"Groups" => "Grupos",
"Close" => "Fechar.",
"Keyboard shortcuts" => "Atalhos do teclado",
"Navigation" => "Navegação",
@ -151,41 +116,46 @@
"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",
"Title" => "Título",
"Organization" => "Organização",
"Birthday" => "Aniversário",
"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",
"Add" => "Adicionar",
"Phone" => "Telefone",
"Email" => "E-mail",
"Instant Messaging" => "Mensagem Instantânea",
"Address" => "Endereço",
"Note" => "Nota",
"Web site" => "Web site",
"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",
"Instant Messenger" => "Mensageiro Instantâneo",
"Delete IM" => "Delete IM",
"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",
"Enter nickname" => "Digite o apelido",
"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",
"Delete contact" => "Apagar contato",
"The temporary image has been removed from cache." => "A imagem temporária foi removida cache.",
@ -211,7 +181,6 @@
"Mrs" => "Sra.",
"Dr" => "Dr",
"Given name" => "Primeiro Nome",
"Additional names" => "Segundo Nome",
"Family name" => "Sobrenome",
"Hon. suffixes" => "Exmo. Sufixos",
"J.D." => "J.D.",
@ -228,9 +197,7 @@
"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)",

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 recarregue 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,39 @@
"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",
"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",
"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.",
"Add group" => "Adicionar grupo",
"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.",
"Edit profile picture" => "Editar a fotografia de perfil.",
"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",
"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.",
"Importing..." => "A importar...",
"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.",
"Error" => "Erro",
"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 +99,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",
@ -128,6 +124,7 @@
"Internet" => "Internet",
"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.",
@ -137,9 +134,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",
"Share" => "Partilhar",
"Import" => "Importar",
"Import into:" => "Importar para:",
"Export" => "Exportar",
"(De-)select all" => "(Des)seleccionar todos",
"New Contact" => "Novo Contacto",
"Back" => "Voltar",
"Download Contact" => "Transferir o contacto",
"Delete Contact" => "Eliminar o Contacto",
"Groups" => "Grupos",
"Favorite" => "Favorito",
"Close" => "Fechar",
"Keyboard shortcuts" => "Atalhos de teclado",
"Navigation" => "Navegação",
@ -153,41 +162,60 @@
"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",
"Title" => "Titulo ",
"Organization" => "Organização",
"Birthday" => "Aniversário",
"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",
"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",
"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",
"12345" => "12345",
"Your city" => "Cidade",
"Some region" => "Região (Distrito)",
"Your country" => "País",
"Instant Messenger" => "Mensageiro instantâneo",
"Delete IM" => "Apagar mensageiro instantâneo (IM)",
"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",
"Enter nickname" => "Introduza alcunha",
"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 contacto",
"The temporary image has been removed from cache." => "A imagem temporária foi retirada do cache.",
@ -213,7 +241,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.",
@ -230,15 +257,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",
@ -32,15 +27,9 @@
"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",
"Enter name" => "Specifică nume",
"Select type" => "Selectează tip",
"Edit name" => "Editează nume",
"Upload too large" => "Fișierul încărcat este prea mare",
"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",
"Pending" => "În așteptare",
"Importing..." => "Se importă...",
"Enter description" => "Specifică descriere",
"Error" => "Eroare",
"Result: " => "Rezultat:",
" imported, " => "importat,",
"Show CardDav link" => "Arată legătură CardDav",
@ -49,8 +38,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",
@ -64,9 +51,11 @@
"Internet" => "Internet",
"{name}'s Birthday" => "Ziua de naștere a {name}",
"Contact" => "Contact",
"Add Contact" => "Adaugă contact",
"Import" => "Importă",
"Settings" => "Setări",
"Import" => "Importă",
"Export" => "Exportă",
"Back" => "Înapoi",
"Groups" => "Grupuri",
"Close" => "Închide",
"Keyboard shortcuts" => "Scurtături din tastatură",
"Navigation" => "Navigare",
@ -75,36 +64,39 @@
"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",
"Title" => "Titlu",
"Organization" => "Organizație",
"Birthday" => "Zi de naștere",
"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",
"Add" => "Adaugă",
"Phone" => "Telefon",
"Email" => "Email",
"Address" => "Adresă",
"Note" => "Notă",
"Web site" => "Site web",
"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ă",
"Add Contact" => "Adaugă contact",
"Edit name details" => "Introdu detalii despre nume",
"Enter nickname" => "Introdu pseudonim",
"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",
"Delete contact" => "Șterge contact",
"The temporary image has been removed from cache." => "Imaginea temporară a fost eliminată din cache.",
@ -128,8 +120,6 @@
"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",

View File

@ -8,18 +8,12 @@
"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." => "контрольная сумма не установлена.",
"Information about vCard is incorrect. Please reload the page." => "Информация о vCard некорректна. Пожалуйста, обновите страницу.",
"Information about vCard is incorrect. Please reload the page: " => "Информация о vCard не корректна. Перезагрузите страницу: ",
"Something went FUBAR. " => "Что-то пошло FUBAR.",
"Missing IM parameter." => "Отсутствует параметр IM.",
"Unknown IM: " => "Неизвестный IM:",
"No contact ID was submitted." => "Нет контакта ID",
"Error reading contact photo." => "Ошибка чтения фотографии контакта.",
"Error saving temporary file." => "Ошибка сохранения временного файла.",
@ -46,43 +40,17 @@
"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" => "Выберите тип",
"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' called without type argument. Please report at bugs.owncloud.org",
"Edit name" => "Изменить имя",
"Add group" => "Добавить группу",
"No files selected for upload." => "Нет выбранных файлов для загрузки.",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Файл, который вы пытаетесь загрузить превышать максимальный размер загружаемых файлов на этом сервере.",
"Edit profile picture" => "Редактировать изображение профиля",
"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" => "Импорт завершен",
"Not all files uploaded. Retrying..." => "Не все файлы были загружены. Повторяю...",
"Something went wrong with the upload, please retry." => "В процессе загрузки что-то пошло не так, пожалуйста загрузите повторно.",
"Importing..." => "Импортирую...",
"Enter name" => "Введите имя",
"Enter description" => "Ввдите описание",
"The address book name cannot be empty." => "Имя адресной книги не может быть пустым.",
"Error" => "Ошибка",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Некоторые контакты помечены на удаление, но ещё не удалены. Подождите, пока они удаляются.",
"Result: " => "Результат:",
" imported, " => "импортировано, ",
" failed." => "не удалось.",
@ -100,9 +68,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",
@ -137,9 +102,13 @@
"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" => "Импорт",
"Settings" => "Настройки",
"Import" => "Импорт",
"Export" => "Экспорт",
"New Contact" => "Новый контакт",
"Back" => "Назад",
"Delete Contact" => "Удалить контакт",
"Groups" => "Группы",
"Close" => "Закрыть",
"Keyboard shortcuts" => "Горячие клавиши",
"Navigation" => "Навигация",
@ -153,41 +122,47 @@
"Add new contact" => "Добавить новый контакт",
"Add new addressbook" => "Добавить новую адресную книгу",
"Delete current contact" => "Удалить текущий контакт",
"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" => "Введите псевдоним",
"Web site" => "Веб-сайт",
"http://www.somesite.com" => "http://www.somesite.com",
"Go to web site" => "Перейти на веб-сайт",
"Title" => "Заголовок",
"Organization" => "Организация",
"Birthday" => "День рождения",
"dd-mm-yyyy" => "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" => "Удалить адрес электронной почты",
"Enter phone number" => "Введите номер телефона",
"Delete phone number" => "Удалить номер телефона",
"Instant Messenger" => "Instant Messenger",
"Delete IM" => "Удалить IM",
"View on map" => "Показать на карте",
"Edit address details" => "Введите детали адреса",
"Add notes here." => "Добавьте заметки здесь.",
"Add field" => "Добавить поле",
"Add" => "Добавить",
"Phone" => "Телефон",
"Email" => "Эл. почта",
"Instant Messaging" => "Быстрые сообщения",
"Address" => "Адрес",
"Note" => "Заметка",
"Web site" => "Веб-сайт",
"Preferred" => "Предпочитаемый",
"Please specify a valid email address." => "Укажите правильный адрес электронной почты.",
"Mail to address" => "Написать по адресу",
"Delete email address" => "Удалить адрес электронной почты",
"Enter phone number" => "Введите номер телефона",
"Delete phone number" => "Удалить номер телефона",
"Go to web site" => "Перейти на веб-сайт",
"Delete URL" => "Удалить URL",
"View on map" => "Показать на карте",
"Instant Messenger" => "Instant Messenger",
"Delete IM" => "Удалить IM",
"Add Contact" => "Добавить Контакт",
"Drop photo to upload" => "Перетяните фотографии для загрузки",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Формат Краткое имя, Полное имя",
"Edit name details" => "Изменить детали имени",
"Enter nickname" => "Введите псевдоним",
"http://www.somesite.com" => "http://www.somesite.com",
"dd-mm-yyyy" => "dd-mm-yyyy",
"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." => "Временный образ был удален из кэша.",
@ -213,7 +188,6 @@
"Mrs" => "Г-жа",
"Dr" => "Доктор",
"Given name" => "Имя",
"Additional names" => "Отчество",
"Family name" => "Фамилия",
"Hon. suffixes" => "Суффикс имени",
"J.D." => "Уважительные суффиксы",
@ -230,9 +204,7 @@
"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 и др.)",

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." => "Хотя бы одно адресное поле должно быть заполнено.",
"Trying to add duplicate property: " => "Попробуйте добавить дублирующееся свойство.",
"Missing IM parameter." => "Отсутствующий IM параметр.",
"Unknown IM: " => "Неизвестный IM: ",
"Information about vCard is incorrect. Please reload the page." => "Информация о визитной карточке некорректна. Пожалуйста, перезагрузите страницу.",
"Missing ID" => "Отсутствующий ID",
"Error parsing VCard for ID: \"" => "Ошибка при анализе визитной карточки для ID: \"",
"checksum is not set." => "Контрольная сумма не установлена.",
"Information about vCard is incorrect. Please reload the page." => "Информация о визитной карточке некорректна. Пожалуйста, перезагрузите страницу.",
"Couldn't find vCard for %d." => "Не удалось найти визитную карточку для %d.",
"Information about vCard is incorrect. Please reload the page: " => "Информация о визитной карточке некорректна. Пожалуйста, перезагрузите страницу:",
"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." => "Ошибка при сохранении временного файла.",
@ -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" => "Размер загружаемого файла превысил максимально допустимый в директиве upload_max_filesize в php.ini",
@ -46,43 +49,39 @@
"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." => "Пожалуйста, введите email-адрес",
"Enter name" => "Ввод имени",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Пользовательский формат, сокращенное имя, полное имя, обратный порядок или обратный порядок с запятыми",
"Select type" => "Выбрать тип",
"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" => "Группа, названная {группа} уже существует",
"All" => "Все",
"Favorites" => "Избранные",
"Shared by {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" => "Редактировать имя",
"Network or server error. Please inform administrator." => "Сетевая или серверная ошибка. Пожалуйста, сообщите адмистратору.",
"Error adding to group." => "Ошибка добавления в группу.",
"Error removing from group." => "Ошибка удаления из группы.",
"There was an error opening a mail composer." => "Произошла ошибка при открытии окна составления сообщения.",
"Add group" => "Добавить группу",
"No files selected for upload." => "Не выбрано файлов для загрузки.",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Размер загружаемого Вами файла превышает максимально допустимый для загрузки на данный сервер.",
"Edit profile picture" => "Добавить изображение к профилю",
"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" => "Импортирование выполнено",
"Not all files uploaded. Retrying..." => "Не все файлы загружены. Попробуйте снова..",
"Something went wrong with the upload, please retry." => "Что-то пошло не так при загрузке, пожалуйста, попробуйте снова.",
"Importing..." => "Импортирование..",
"Enter name" => "Ввод имени",
"Enter description" => "Ввод описания",
"Select addressbook" => "Выбрать адресную книгу",
"The address book name cannot be empty." => "Имя адресной книги не должно быть пустым.",
"Error" => "Ошибка",
"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 +99,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" => "Джаббер",
"AIM" => "AIM",
"MSN" => "MSN",
@ -128,6 +124,7 @@
"Internet" => "Интернет",
"Friends" => "Друзья",
"Family" => "Семья",
"There was an error deleting properties for this contact." => "Возникла ошибка при удалении свойств для этого контакта.",
"{name}'s Birthday" => "{имя} день рождения",
"Contact" => "Контакт",
"You do not have the permissions to add contacts to this addressbook." => "У Вас нет разрешения для добавления контактов в эту адресную книгу.",
@ -137,9 +134,21 @@
"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" => "Настройки",
"Share" => "Сделать общим",
"Import" => "Импортировать",
"Import into:" => "Импортировать в:",
"Export" => "Экспортировать",
"(De-)select all" => "Отметить(снять отметку) все",
"New Contact" => "Новый контакт",
"Back" => "Назад",
"Download Contact" => "Загрузить контакт",
"Delete Contact" => "Удалить контакт",
"Groups" => "Группы",
"Favorite" => "Избранный",
"Close" => "Закрыть",
"Keyboard shortcuts" => "Комбинации клавиш",
"Navigation" => "Навигация",
@ -153,41 +162,60 @@
"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" => "Перейти к веб-сайту",
"Title" => "Название",
"Organization" => "Организация",
"Birthday" => "День рождения",
"dd-mm-yyyy" => "дд-мм-гггг",
"Groups" => "Группы",
"Separate groups with commas" => "Разделите группы запятыми",
"Edit groups" => "Редактировать группы",
"Preferred" => "Предпочтительный",
"Please specify a valid email address." => "Пожалуйста,укажите действительный email адрес.",
"Enter email address" => "Введите email адрес",
"Mail to address" => "Послать письмо адресату",
"Delete email address" => "Удалить email адрес",
"Enter phone number" => "Введите телефонный номер",
"Delete phone number" => "Удалить телефонный номер",
"Instant Messenger" => "Служба обмена мгновенными сообщениями",
"Delete IM" => "Удалить IM",
"View on map" => "Посмотреть на карте",
"Edit address details" => "Детальное редактирование адреса",
"Add notes here." => "Добавить здесь заметок.",
"Add field" => "Добавить поле",
"Notes go here..." => "Заметки перемещаются сюда...",
"Add" => "Добавить",
"Phone" => "Телефон",
"Email" => "Email",
"Instant Messaging" => "Обмен мгновенными сообщениями",
"Address" => "Адрес",
"Note" => "Заметки",
"Web site" => "Веб-сайт",
"Preferred" => "Предпочтительный",
"Please specify a valid email address." => "Пожалуйста,укажите действительный email адрес.",
"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" => "Удалить адрес",
"1 Main Street" => "1 главная улица",
"12345" => "12345",
"Your city" => "Ваш город",
"Some region" => "Регион",
"Your country" => "Ваша страна",
"Instant Messenger" => "Служба обмена мгновенными сообщениями",
"Delete IM" => "Удалить IM",
"Add Contact" => "Добавить контакт",
"Drop photo to upload" => "Перетащите фотографию для загрузки",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Пользовательский формат, сокращенное имя, полное имя, обратный порядок или обратный порядок с запятыми",
"Edit name details" => "Редактировать детали имени",
"Enter nickname" => "Введите имя",
"http://www.somesite.com" => "http://www.somesite.com",
"dd-mm-yyyy" => "дд-мм-гггг",
"Separate groups with commas" => "Разделите группы запятыми",
"Edit groups" => "Редактировать группы",
"Enter email address" => "Введите email адрес",
"Edit address details" => "Детальное редактирование адреса",
"Add notes here." => "Добавить здесь заметок.",
"Add field" => "Добавить поле",
"Download contact" => "загрузить контакт",
"Delete contact" => "Удалить контакт",
"The temporary image has been removed from cache." => "Временное изображение было удалено из кэша.",
@ -213,7 +241,6 @@
"Mrs" => "Г-жа",
"Dr" => "Доктор",
"Given name" => "Имя",
"Additional names" => "Дополнительные имена",
"Family name" => "Фамилия",
"Hon. suffixes" => "Префиксы",
"J.D." => "Доктор права",
@ -230,15 +257,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

@ -7,11 +7,7 @@
"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" => "හැඳුනුම් අංකය නොමැත",
"Something went FUBAR. " => "යම් කිසිවක් FUBAR විය",
"No contact ID was submitted." => "සබඳතා අංකය සපයා නැත.",
"Error reading contact photo." => "හඳුනාගැනීමේ ඡායාරූපය කියවීම දෝෂ සහිතයි.",
@ -34,24 +30,12 @@
"Couldn't save 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" => "දෝෂයක්",
"Enter name" => "නම දෙන්න",
"Select type" => "වර්ගය තෝරන්න",
"You do not have permission to add contacts to " => "සම්බන්ධතා එකතු කිරීමට ඔබට අවසර නැත",
"Please select one of your own address books." => "කරුණාකර ඔබේම ලිපින පොතක් තෝරන්න",
"Permission error" => "අනුමැතියේ දෝෂයක්",
"Edit name" => "නම සංස්කරණය කරන්න",
"No files selected for upload." => "උඩුගත කිරීමට ගොනු තෝරා නැත",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "ඔබ උඩුගත කිරීමට තැත් කරන ගොනුව, සේවාදායකයාට උඩුගත කළ හැකි උපරිම ගොනු විශාලත්වයට වඩා වැඩිය",
"Enter name" => "නම දෙන්න",
"Enter description" => "විස්තරය දෙන්න",
"Error" => "දෝෂයක්",
"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?" => "ඔබට මෙම ලිපින පොත් දෙක එකතු කිරීමට අවශ්‍යද?",
"Upload too large" => "උඩුගත කිරීම විශාල වැඩිය",
"Upload Error" => "උඩුගත කිරීමේ දෝෂයක්",
"Import done" => "ආයාත කිරීම අවසන්",
"Importing..." => "ආයාත කරමින් පවති...",
"Result: " => "ප්‍රතිඵලය:",
" imported, " => "ආයාත කරන ලදී,",
" failed." => "අසාර්ථකයි",
@ -66,9 +50,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." => "සබඳතාවය සොයා ගත නොහැක.",
"Work" => "රාජකාරී",
"Home" => "නිවස",
"Other" => "වෙනත්",
@ -86,43 +67,48 @@
"You do not have the permissions to edit this contact." => "මෙම සම්බන්ධතාව සංස්කරණය කිරීමට ඔබට අවසර නැත",
"You do not have the permissions to delete this contact." => "මෙම සම්බන්ධතාව මැකීමට ඔබට අවසර නැත",
"There was an error deleting this contact." => "මෙම සම්බන්ධතාව මැකීමේදී දෝෂයක් ඇති විය",
"Add Contact" => "සබඳතාවක් එක් කරන්න",
"Import" => "ආයාත කරන්න",
"Settings" => "සිටුවම්",
"Import" => "ආයාත කරන්න",
"Export" => "නිර්යාත කරන්න",
"Groups" => "කණ්ඩායම්",
"Close" => "වසන්න",
"Next addressbook" => "මෙයට පසු ලිපින පොත",
"Previous addressbook" => "මෙයට පෙර ලිපින පොත",
"Drop photo to upload" => "උඩුගත කිරීමට මෙතැනට දමන්න",
"Add contact" => "සම්බන්ධතාවක් එකතු කරන්න",
"Delete current photo" => "වර්තමාන ඡායාරූපය මකන්න",
"Edit current photo" => "වර්තමාන ඡායාරූපය සංස්කරණය කරන්න",
"Upload new photo" => "නව ඡායාරූපයක් උඩුගත කරන්න",
"Edit name details" => "නමේ විස්තර සංස්කරණය කරන්න",
"Organization" => "ආයතනය",
"Additional names" => "වෙනත් නම්",
"Nickname" => "පටබැඳි නම",
"Enter nickname" => "පටබැඳි නම ඇතුලත් කරන්න",
"Web site" => "වෙබ් අඩවිය",
"http://www.somesite.com" => "http://www.somesite.com",
"Go to web site" => "වෙබ් අඩවියට යන්න",
"Title" => "මාතෘකාව",
"Organization" => "ආයතනය",
"Birthday" => "උපන් දිනය",
"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" => "විද්‍යුත් තැපැල් ලිපිනය මකන්න",
"Enter phone number" => "දුරකථන අංකයක් දෙන්න",
"Delete phone number" => "දුරකථන අංකය මකන්න",
"View on map" => "සිතියමේ පෙන්වන්න",
"Edit address details" => "ලිපින විස්තර සංස්කරණය කරන්න",
"Add notes here." => "මෙතැන නෝට්ටුවක් තබන්න",
"Add field" => "ක්ෂේත්‍රයක් එකතු කරන්න",
"Add" => "එකතු කරන්න",
"Phone" => "දුරකථන",
"Email" => "ඉ-තැපැල්",
"Address" => "ලිපිනය",
"Note" => "නෝට්ටුවක්",
"Web site" => "වෙබ් අඩවිය",
"Preferred" => "රුචි",
"Please specify a valid email address." => "වලංගු විද්‍යුත් තැපැල් ලිපිනයක් ලබා දෙන්න",
"Mail to address" => "තැපැල් එවිය යුතු ලිපිනය",
"Delete email address" => "විද්‍යුත් තැපැල් ලිපිනය මකන්න",
"Enter phone number" => "දුරකථන අංකයක් දෙන්න",
"Delete phone number" => "දුරකථන අංකය මකන්න",
"Go to web site" => "වෙබ් අඩවියට යන්න",
"View on map" => "සිතියමේ පෙන්වන්න",
"Add Contact" => "සබඳතාවක් එක් කරන්න",
"Drop photo to upload" => "උඩුගත කිරීමට මෙතැනට දමන්න",
"Edit name details" => "නමේ විස්තර සංස්කරණය කරන්න",
"Enter nickname" => "පටබැඳි නම ඇතුලත් කරන්න",
"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" => "සබඳතා බාගත කරන්න",
"Delete contact" => "සබඳතාව මකන්න",
"Edit address" => "ලිපිනය සංස්කරණය කරන්න",
@ -136,15 +122,12 @@
"Addressbook" => "ලිපින පොත",
"Hon. prefixes" => "ගෞරවාන්විත නාම",
"Given name" => "දී ඇති නම",
"Additional names" => "වෙනත් නම්",
"Family name" => "අවසන් නම",
"Import a contacts file" => "සම්බන්ධතා ඇති ගොනුවක් ආයාත කරන්න",
"Please choose the addressbook" => "කරුණාකර ලිපින පොත තෝරන්න",
"create a new addressbook" => "නව ලිපින පොතක් සාදන්න",
"Name of new addressbook" => "නව ලිපින පොතේ නම",
"Importing contacts" => "සම්බන්ධතා ආයාත කරමින් පවතී",
"Add contact" => "සම්බන්ධතාවක් එකතු කරන්න",
"Enter description" => "විස්තරය දෙන්න",
"more info" => "තව විස්තර",
"Primary address (Kontact et al)" => "ප්‍රාථමික ලිපිනය(හැම විටම සම්බන්ධ කරගත හැක)",
"iOS/OS X" => "iOS/OS X",

View File

@ -8,18 +8,12 @@
"No address books found." => "Žiadny adresár nenájdený.",
"No contacts found." => "Žiadne kontakty nenájdené.",
"element name is not set." => "meno elementu nie je nastavené.",
"Could not parse contact: " => "Nedá sa spracovať kontakt:",
"Cannot add empty property." => "Nemôžem pridať prázdny údaj.",
"At least one of the address fields has to be filled out." => "Musí byť uvedený aspoň jeden adresný údaj.",
"Trying to add duplicate property: " => "Pokúšate sa pridať rovnaký atribút:",
"Missing IM parameter." => "Chýba údaj o IM.",
"Unknown IM: " => "Neznáme IM:",
"Information about vCard is incorrect. Please reload the page." => "Informácie o vCard sú neplatné. Prosím obnovte stránku.",
"Missing ID" => "Chýba ID",
"Error parsing VCard for ID: \"" => "Chyba pri vyňatí ID z VCard:",
"checksum is not set." => "kontrolný súčet nie je nastavený.",
"Information about vCard is incorrect. Please reload the page." => "Informácie o vCard sú neplatné. Prosím obnovte stránku.",
"Information about vCard is incorrect. Please reload the page: " => "Informácia o vCard je nesprávna. Obnovte stránku, prosím.",
"Something went FUBAR. " => "Niečo sa pokazilo.",
"Missing IM parameter." => "Chýba údaj o IM.",
"Unknown IM: " => "Neznáme IM:",
"No contact ID was submitted." => "Nebolo nastavené ID kontaktu.",
"Error reading contact photo." => "Chyba pri čítaní fotky kontaktu.",
"Error saving temporary file." => "Chyba pri ukladaní dočasného súboru.",
@ -46,43 +40,15 @@
"Couldn't load temporary image: " => "Nemôžem načítať dočasný obrázok: ",
"No file was uploaded. Unknown error" => "Žiaden súbor nebol odoslaný. Neznáma chyba",
"Contacts" => "Kontakty",
"Sorry, this functionality has not been implemented yet" => "Bohužiaľ, táto funkcia ešte nebola implementovaná",
"Not implemented" => "Neimplementované",
"Couldn't get a valid address." => "Nemôžem získať platnú adresu.",
"Error" => "Chyba",
"Please enter an email address." => "Zadať e-mailovú adresu",
"Enter name" => "Zadaj meno",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formát vlastný, krátke meno, celé meno, obrátené alebo obrátené s čiarkami",
"Select type" => "Vybrať typ",
"Select photo" => "Vybrať fotku",
"You do not have permission to add contacts to " => "Nemáte oprávnenie pre pridanie kontaktu do",
"Please select one of your own address books." => "Zvoľte jeden z vašich adresárov.",
"Permission error" => "Porucha oprávnenia.",
"Click to undo deletion of \"" => "Kliknite pre zrušenie zmazania \"",
"Cancelled deletion of: \"" => "Zrušené mazanie: \"",
"This property has to be non-empty." => "Tento parameter nemôže byť prázdny.",
"Couldn't serialize elements." => "Nemôžem previesť prvky.",
"Unknown error. Please check logs." => "Neznáma chyba. Prosím skontrolujte záznamy.",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' zavolané bez argument. Prosím oznámte chybu na bugs.owncloud.org",
"Edit name" => "Upraviť meno",
"No files selected for upload." => "Žiadne súbory neboli vybrané k nahratiu",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Súbor, ktorý sa pokúšate nahrať, presahuje maximálnu povolenú veľkosť.",
"Error loading profile picture." => "Chyba pri nahrávaní profilového obrázku.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Počkajte prosím do skončenia mazania kontaktov označených na mazanie.",
"Do you want to merge these address books?" => "Chcete zlúčiť tieto adresáre?",
"Shared by " => "Zdieľané",
"Upload too large" => "Nahrávanie je príliš veľké",
"Only image files can be used as profile picture." => "Ako profilový obrázok sa dajú použiť len obrázkové súbory.",
"Wrong file type" => "Nesprávny typ súboru",
"Your browser doesn't support AJAX upload. Please click on the profile picture to select a photo to upload." => "Váš prehliadač nepodporuje odosielanie cez AJAX. Prosím kliknite na profilový obrázok pre výber fotografie na odoslanie.",
"Unable to upload your file as it is a directory or has 0 bytes" => "Nedá sa odoslať Váš súbor, pretože je to adresár, alebo je jeho veľkosť 0 bajtov",
"Upload Error" => "Chyba pri posielaní",
"Pending" => "Prebieha",
"Import done" => "Import ukončený",
"Not all files uploaded. Retrying..." => "Všetky súbory neboli odoslané. Opakujem...",
"Something went wrong with the upload, please retry." => "Stalo sa niečo zlé s odosielaným súborom, skúste ho prosím odoslať znovu.",
"Importing..." => "Importujem...",
"Enter name" => "Zadaj meno",
"Enter description" => "Zadať popis",
"The address book name cannot be empty." => "Názov adresára nemôže byť prázdny.",
"Error" => "Chyba",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Počkajte prosím do skončenia mazania kontaktov označených na mazanie.",
"Result: " => "Výsledok: ",
" imported, " => " importovaných, ",
" failed." => " zlyhaných.",
@ -100,9 +66,6 @@
"There was an error updating the addressbook." => "Nastala chyba pri pokuse o úpravy v adresári.",
"You do not have the permissions to delete this addressbook." => "Nemáte oprávnenie pre zmazanie tohto adresára.",
"There was an error deleting this addressbook." => "Vyskytla sa chyba pri mazaní tohto adresára.",
"Addressbook not found: " => "Adresár nebol nájdený:",
"This is not your addressbook." => "Toto nie je váš adresár.",
"Contact could not be found." => "Kontakt nebol nájdený.",
"Jabber" => "Jabber",
"AIM" => "AIM",
"MSN" => "MSN",
@ -135,9 +98,12 @@
"Could not find the Addressbook with ID: " => "Nie je možné nájsť adresár s ID:",
"You do not have the permissions to delete this contact." => "Nemáte oprávnenie pre zmazanie tohto kontaktu.",
"There was an error deleting this contact." => "Vyskytla sa chyba pri mazaní tohto kontaktu.",
"Add Contact" => "Pridať Kontakt.",
"Import" => "Importovať",
"Settings" => "Nastavenia",
"Import" => "Importovať",
"Export" => "Export",
"New Contact" => "Nový kontakt",
"Back" => "Späť",
"Groups" => "Skupiny",
"Close" => "Zatvoriť",
"Keyboard shortcuts" => "Klávesové skratky",
"Navigation" => "Navigácia",
@ -151,41 +117,46 @@
"Add new contact" => "Pridaj nový kontakt",
"Add new addressbook" => "Pridaj nový adresár",
"Delete current contact" => "Vymaž súčasný kontakt",
"Drop photo to upload" => "Pretiahnite sem fotku pre nahratie",
"Add contact" => "Pridať kontakt",
"Delete current photo" => "Odstrániť súčasnú fotku",
"Edit current photo" => "Upraviť súčasnú fotku",
"Upload new photo" => "Nahrať novú fotku",
"Select photo from ownCloud" => "Vybrať fotku z ownCloud",
"Edit name details" => "Upraviť podrobnosti mena",
"Organization" => "Organizácia",
"Additional names" => "Ďalšie mená",
"Nickname" => "Prezývka",
"Enter nickname" => "Zadajte prezývku",
"Web site" => "Web stránka",
"http://www.somesite.com" => "http://www.stranka.sk",
"Go to web site" => "Navštíviť web",
"Title" => "Nadpis",
"Organization" => "Organizácia",
"Birthday" => "Narodeniny",
"dd-mm-yyyy" => "dd. mm. yyyy",
"Groups" => "Skupiny",
"Separate groups with commas" => "Oddelte skupiny čiarkami",
"Edit groups" => "Úprava skupín",
"Preferred" => "Uprednostňované",
"Please specify a valid email address." => "Prosím zadajte platnú e-mailovú adresu.",
"Enter email address" => "Zadajte e-mailové adresy",
"Mail to address" => "Odoslať na adresu",
"Delete email address" => "Odstrániť e-mailové adresy",
"Enter phone number" => "Zadajte telefónne číslo",
"Delete phone number" => "Odstrániť telefónne číslo",
"Instant Messenger" => "Okamžité správy IM",
"Delete IM" => "Zmazať IM",
"View on map" => "Zobraziť na mape",
"Edit address details" => "Upraviť podrobnosti adresy",
"Add notes here." => "Tu môžete pridať poznámky.",
"Add field" => "Pridať pole",
"Add" => "Pridať",
"Phone" => "Telefón",
"Email" => "E-mail",
"Instant Messaging" => "Okamžité správy IM",
"Address" => "Adresa",
"Note" => "Poznámka",
"Web site" => "Web stránka",
"Preferred" => "Uprednostňované",
"Please specify a valid email address." => "Prosím zadajte platnú e-mailovú adresu.",
"Mail to address" => "Odoslať na adresu",
"Delete email address" => "Odstrániť e-mailové adresy",
"Enter phone number" => "Zadajte telefónne číslo",
"Delete phone number" => "Odstrániť telefónne číslo",
"Go to web site" => "Navštíviť web",
"View on map" => "Zobraziť na mape",
"Instant Messenger" => "Okamžité správy IM",
"Delete IM" => "Zmazať IM",
"Add Contact" => "Pridať Kontakt.",
"Drop photo to upload" => "Pretiahnite sem fotku pre nahratie",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formát vlastný, krátke meno, celé meno, obrátené alebo obrátené s čiarkami",
"Edit name details" => "Upraviť podrobnosti mena",
"Enter nickname" => "Zadajte prezývku",
"http://www.somesite.com" => "http://www.stranka.sk",
"dd-mm-yyyy" => "dd. mm. yyyy",
"Separate groups with commas" => "Oddelte skupiny čiarkami",
"Edit groups" => "Úprava skupín",
"Enter email address" => "Zadajte e-mailové adresy",
"Edit address details" => "Upraviť podrobnosti adresy",
"Add notes here." => "Tu môžete pridať poznámky.",
"Add field" => "Pridať pole",
"Download contact" => "Stiahnuť kontakt",
"Delete contact" => "Odstrániť kontakt",
"The temporary image has been removed from cache." => "Dočasný obrázok bol odstránený z cache.",
@ -211,7 +182,6 @@
"Mrs" => "Pani",
"Dr" => "Dr.",
"Given name" => "Krstné meno",
"Additional names" => "Ďalšie mená",
"Family name" => "Priezvisko",
"Hon. suffixes" => "Tituly za",
"J.D." => "JUDr.",
@ -228,9 +198,7 @@
"Name of new addressbook" => "Meno nového adresára",
"Importing contacts" => "Importovanie kontaktov",
"<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>Vo vašej knihe adries nemáte kontakty.</h3><p>Môžete importovať súbory VCF pretiahnutím na zoznam kontaktov a pustením na knihu pre pridanie, alebo do prázdneho miesta pre vytvorenie novej knihy adries.<br />Tiež môžete importovať kliknutím na tlačidlo Importovať na konci zoznamu.</p>",
"Add contact" => "Pridať kontakt",
"Select Address Books" => "Zvoliť adresáre",
"Enter description" => "Zadať popis",
"CardDAV syncing addresses" => "Adresy pre synchronizáciu s CardDAV",
"more info" => "viac informácií",
"Primary address (Kontact et al)" => "Predvolená adresa (Kontakt etc)",

View File

@ -2,24 +2,24 @@
"Error (de)activating addressbook." => "Napaka med omogočanjem ali onemogočanjem imenika.",
"id is not set." => "ID ni nastavljen.",
"Cannot update addressbook with an empty name." => "Imenika s praznim imenom ni mogoče posodobiti.",
"No category name given." => "Ime kategorije ni bilo podano.",
"Error adding group." => "Napaka pri dodajanju skupine.",
"Group ID missing from request." => "V zahtevku manjka ID skupine.",
"Contact ID missing from request." => "V zahtevku manjka ID stika.",
"No ID provided" => "Vrednost ID ni podana",
"Error setting checksum." => "Napaka med nastavljanjem nadzorne vsote.",
"No categories selected for deletion." => "Ni izbrane kategorije za izbris.",
"No address books found." => "Ni mogoče najti nobenega imenika.",
"No contacts found." => "Ni najdenih stikov.",
"element name is not set." => "ime predmeta ni nastavljeno.",
"Could not parse contact: " => "Stika ni mogoče razčleniti:",
"Cannot add empty property." => "Prazne lastnosti ni mogoče dodati.",
"At least one of the address fields has to be filled out." => "Izpolniti je treba vsak eno polje imenika.",
"Trying to add duplicate property: " => "Izveden je poskus dodajanja podvojene lastnost:",
"Missing IM parameter." => "Manjka parameter IM.",
"Unknown IM: " => "Neznan IM:",
"Information about vCard is incorrect. Please reload the page." => "Podrobnosti kartice vCard niso pravilne. Ponovno naložite stran.",
"Missing ID" => "Manjka ID",
"Error parsing VCard for ID: \"" => "Napaka med razčlenjevanjem VCard za ID: \"",
"checksum is not set." => "nadzorna vsota ni nastavljena.",
"Information about vCard is incorrect. Please reload the page." => "Podrobnosti kartice vCard niso pravilne. Ponovno naložite stran.",
"Couldn't find vCard for %d." => "Ne najdem vCard za %d.",
"Information about vCard is incorrect. Please reload the page: " => "Podrobnosti o vCard so napačne. Ponovno naložite stran: ",
"Something went FUBAR. " => "Nekaj je šlo v franže. ",
"Cannot save property of type \"%s\" as array" => "Lastnost vrste \"%s\" ne morem shraniti kot matriko",
"Missing IM parameter." => "Manjka parameter IM.",
"Unknown IM: " => "Neznan IM:",
"No contact ID was submitted." => "ID stika ni poslan.",
"Error reading contact photo." => "Napaka branja slike stika.",
"Error saving temporary file." => "Napaka shranjevanja začasne datoteke.",
@ -35,6 +35,9 @@
"Error cropping image" => "Napaka med obrezovanjem slike",
"Error creating temporary image" => "Napaka med ustvarjanjem začasne slike",
"Error finding image: " => "Napaka med iskanjem datoteke: ",
"Key is not set for: " => "Ključ ni nastavljen za:",
"Value is not set for: " => "Vrednost ni nastavljena za:",
"Could not set preference: " => "Ne morem nastaviti lastnosti:",
"Error uploading contacts to storage." => "Napaka med nalaganjem stikov v hrambo.",
"There is no error, the file uploaded with success" => "Datoteka je uspešno naložena brez napak.",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Naložena datoteka presega velikost, ki jo določa parameter upload_max_filesize v datoteki php.ini",
@ -46,43 +49,39 @@
"Couldn't load temporary image: " => "Začasne slike ni mogoče naložiti: ",
"No file was uploaded. Unknown error" => "Nobena datoteka ni naložena. Neznana napaka.",
"Contacts" => "Stiki",
"Sorry, this functionality has not been implemented yet" => "Žal ta zmožnost še ni podprta",
"Not implemented" => "Ni podprto",
"Couldn't get a valid address." => "Ni mogoče pridobiti veljavnega naslova.",
"Error" => "Napaka",
"Please enter an email address." => "Vpišite elektronski poštni naslov.",
"Enter name" => "Vnesi ime",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format po meri, Kratko ime, Polno ime, Obratno ali Obratno z vejico",
"Select type" => "Izberite vrsto",
"Contact is already in this group." => "Stik je že v tej skupini.",
"Contacts are already in this group." => "Stiki so že v tej skupini.",
"Couldn't get contact list." => "Ne morem dobiti seznama stikov.",
"Contact is not in this group." => "Stik ni v tej skupini",
"Contacts are not in this group." => "Stiki niso v tej skupini.",
"A group named {group} already exists" => "Skupina z imenom {group} že obstaja.",
"All" => "Vsi",
"Favorites" => "Priljubljene",
"Shared by {owner}" => "V souporabo dal {owner}",
"Indexing contacts" => "Ustvarjanje kazala stikov",
"Add to..." => "Dodaj v ...",
"Remove from..." => "Odstrani iz ...",
"Add group..." => "Dodaj skupino ...",
"Select photo" => "Izbor slike",
"You do not have permission to add contacts to " => "Ni ustreznih dovoljenj za dodajanje stikov v",
"Please select one of your own address books." => "Izberite enega izmed imenikov.",
"Permission error" => "Napaka dovoljenj",
"Click to undo deletion of \"" => "Kliknite za preklic izbrisa \"",
"Cancelled deletion of: \"" => "Preklican izbris: \"",
"This property has to be non-empty." => "Ta lastnost ne sme biti prazna",
"Couldn't serialize elements." => "Predmetov ni mogoče dati v zaporedje.",
"Unknown error. Please check logs." => "Neznana napaka. Preverite dnevniški zapis za več podrobnosti.",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "Lastnost \"deleteProperty\" je bila klicana brez vrste argumenta. Oddajte poročilo o napaki na bugs.owncloud.org",
"Edit name" => "Uredi ime",
"Network or server error. Please inform administrator." => "Napaka omrežja ali strežnika. Prosimo, če o tem obvestite administratorja.",
"Error adding to group." => "Napaka pri dodajanju v skupino.",
"Error removing from group." => "Napaka pri odstranjevanju iz skupine.",
"There was an error opening a mail composer." => "Med odpiranjem sestavljalnika pošte je prišlo do napake.",
"Add group" => "Dodaj skupino",
"No files selected for upload." => "Ni izbrane datoteke za nalaganje.",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Datoteka, ki jo poskušate naložiti, presega največjo dovoljeno velikost za pošiljanje na tem strežniku.",
"Edit profile picture" => "Uredi fotografijo profila",
"Error loading profile picture." => "Napaka med nalaganjem slike profila.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Nekateri stiki so označeni za izbris, vendar še niso izbrisani. Počakajte na izbris.",
"Do you want to merge these address books?" => "Ali želite združiti imenike?",
"Shared by " => "V souporabi z",
"Upload too large" => "Datoteke za pošiljanje so prevelike",
"Only image files can be used as profile picture." => "Kot slike profila so lahko uporabljene le slikovne datoteke.",
"Wrong file type" => "Napačna vrsta datoteke",
"Your browser doesn't support AJAX upload. Please click on the profile picture to select a photo to upload." => "Brskalnik ne podpira pošiljanja AJAX. Preverite sliko profila za izbor fotografije za pošiljanje.",
"Unable to upload your file as it is a directory or has 0 bytes" => "Datoteke ni mogoče naložiti, saj je mapa ali pa je velikosti 0 bajtov.",
"Upload Error" => "Napaka med pošiljanjem",
"Pending" => "V čakanju",
"Import done" => "Uvoz je končan",
"Not all files uploaded. Retrying..." => "Vse datoteke niso bile poslane. Poskus bo ponovljen ...",
"Something went wrong with the upload, please retry." => "Med nalaganjem je prišlo do napake. Poskusite znova.",
"Importing..." => "Uvažanje ...",
"Enter name" => "Vnesi ime",
"Enter description" => "Vnesi opis",
"Select addressbook" => "Izberite imenik",
"The address book name cannot be empty." => "Imenika mora imeti določeno ime.",
"Error" => "Napaka",
"Is this correct?" => "Ali je to pravilno?",
"There was an unknown error when trying to delete this contact" => "Med poskusom izbrisa tega stika je prišlo do neznane napake.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Nekateri stiki so označeni za izbris, vendar še niso izbrisani. Počakajte na izbris.",
"Click to undo deletion of {num} contacts" => "Klikni za preklic izbrisa {num} stikov",
"Cancelled deletion of {num}" => "Preklican izbris {num} stikov",
"Result: " => "Rezultati: ",
" imported, " => " uvoženih, ",
" failed." => " je spodletelo.",
@ -100,9 +99,6 @@
"There was an error updating the addressbook." => "Med posodabljanjem imenika je prišlo do napake.",
"You do not have the permissions to delete this addressbook." => "Ni ustreznih dovoljenj za izbris tega imenika.",
"There was an error deleting this addressbook." => "Med brisanjem imenika je prišlo do napake.",
"Addressbook not found: " => "Imenika ni mogoče najti:",
"This is not your addressbook." => "To ni vaš imenik.",
"Contact could not be found." => "Stika ni bilo mogoče najti.",
"Jabber" => "Jabber",
"AIM" => "AIM",
"MSN" => "MSN",
@ -128,6 +124,7 @@
"Internet" => "Internet",
"Friends" => "Prijatelji",
"Family" => "Družina",
"There was an error deleting properties for this contact." => "Pri brisanju lastnosti tega kontakta, je prišlo do napake.",
"{name}'s Birthday" => "{name} - rojstni dan",
"Contact" => "Stik",
"You do not have the permissions to add contacts to this addressbook." => "Ni ustreznih dovoljenj za dodajanje stikov v ta imenik.",
@ -137,9 +134,21 @@
"Could not find the Addressbook with ID: " => "Ni mogoče najti imenika z ID:",
"You do not have the permissions to delete this contact." => "Ni ustreznih dovoljenj za izbris tega stika.",
"There was an error deleting this contact." => "Med brisanjem stika je prišlo do napake.",
"Add Contact" => "Dodaj stik",
"Import" => "Uvozi",
"Contact not found." => "Stik ni bil najden.",
"HomePage" => "Domača stran",
"New Group" => "Nova skupina",
"Settings" => "Nastavitve",
"Share" => "Souporaba",
"Import" => "Uvozi",
"Import into:" => "Uvozi v:",
"Export" => "Izvozi",
"(De-)select all" => "(Od-)izberi vse",
"New Contact" => "Nov stik",
"Back" => "Nazaj",
"Download Contact" => "Prenesi stik",
"Delete Contact" => "Izbriši stik",
"Groups" => "Skupine",
"Favorite" => "Priljubljen",
"Close" => "Zapri",
"Keyboard shortcuts" => "Bližnjice na tipkovnici",
"Navigation" => "Krmarjenje",
@ -153,41 +162,60 @@
"Add new contact" => "Dodaj nov stik",
"Add new addressbook" => "Dodaj nov imenik",
"Delete current contact" => "Izbriši trenutni stik",
"Drop photo to upload" => "Spustite sliko tukaj, da bi jo poslali na strežnik",
"<h3>You have no contacts in your addressbook.</h3><p>Add a new contact or import existing contacts from a VCF file.</p>" => "<h3>V vašem imeniku nimate stikov.</h3><p>Dodaj nov stik ali uvozi obstoječe stike iz datoteke VCF.</p>",
"Add contact" => "Dodaj stik",
"Compose mail" => "Sestavi mail",
"Delete group" => "Izbriši skupino",
"Delete current photo" => "Izbriši trenutno sliko",
"Edit current photo" => "Uredi trenutno sliko",
"Upload new photo" => "Naloži novo sliko",
"Select photo from ownCloud" => "Izberi sliko iz ownCloud",
"Edit name details" => "Uredi podrobnosti imena",
"Organization" => "Ustanova",
"First name" => "Ime",
"Additional names" => "Druga imena",
"Last name" => "Priimek",
"Nickname" => "Vzdevek",
"Enter nickname" => "Vnos vzdevka",
"Web site" => "Spletna stran",
"http://www.somesite.com" => "http://www.spletnastran.si",
"Go to web site" => "Pojdi na spletno stran",
"Title" => "Ime",
"Organization" => "Ustanova",
"Birthday" => "Rojstni dan",
"dd-mm-yyyy" => "dd. mm. yyyy",
"Groups" => "Skupine",
"Separate groups with commas" => "Skupine ločite z vejicami",
"Edit groups" => "Uredi skupine",
"Preferred" => "Prednostno",
"Please specify a valid email address." => "Navesti je treba veljaven elektronski poštni naslov.",
"Enter email address" => "Vnesite elektronski poštni naslov",
"Mail to address" => "Elektronski naslov prejemnika",
"Delete email address" => "Izbriši elektronski poštni naslov",
"Enter phone number" => "Vpiši telefonsko številko",
"Delete phone number" => "Izbriši telefonsko številko",
"Instant Messenger" => "Hipni sporočilnik",
"Delete IM" => "Izbriši IM",
"View on map" => "Pokaži na zemljevidu",
"Edit address details" => "Uredi podrobnosti",
"Add notes here." => "Opombe dodajte tukaj.",
"Add field" => "Dodaj polje",
"Notes go here..." => "Prostor za opombe ...",
"Add" => "Dodaj",
"Phone" => "Telefon",
"Email" => "Elektronska pošta",
"Instant Messaging" => "Hipno sporočanje",
"Address" => "Naslov",
"Note" => "Opomba",
"Web site" => "Spletna stran",
"Preferred" => "Prednostno",
"Please specify a valid email address." => "Navesti je treba veljaven elektronski poštni naslov.",
"someone@example.com" => "nekdo@primer.com",
"Mail to address" => "Elektronski naslov prejemnika",
"Delete email address" => "Izbriši elektronski poštni naslov",
"Enter phone number" => "Vpiši telefonsko številko",
"Delete phone number" => "Izbriši telefonsko številko",
"Go to web site" => "Pojdi na spletno stran",
"Delete URL" => "Izbriši URL",
"View on map" => "Pokaži na zemljevidu",
"Delete address" => "Izbriši imenik",
"1 Main Street" => "1 Glavna ulica",
"12345" => "12345",
"Your city" => "Vaše mesto",
"Some region" => "Neka regija",
"Your country" => "Vaša država",
"Instant Messenger" => "Hipni sporočilnik",
"Delete IM" => "Izbriši IM",
"Add Contact" => "Dodaj stik",
"Drop photo to upload" => "Spustite sliko tukaj, da bi jo poslali na strežnik",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format po meri, Kratko ime, Polno ime, Obratno ali Obratno z vejico",
"Edit name details" => "Uredi podrobnosti imena",
"Enter nickname" => "Vnos vzdevka",
"http://www.somesite.com" => "http://www.spletnastran.si",
"dd-mm-yyyy" => "dd. mm. yyyy",
"Separate groups with commas" => "Skupine ločite z vejicami",
"Edit groups" => "Uredi skupine",
"Enter email address" => "Vnesite elektronski poštni naslov",
"Edit address details" => "Uredi podrobnosti",
"Add notes here." => "Opombe dodajte tukaj.",
"Add field" => "Dodaj polje",
"Download contact" => "Prejmi stik",
"Delete contact" => "Izbriši stik",
"The temporary image has been removed from cache." => "Začasna slika je odstranjena iz predpomnilnika.",
@ -213,7 +241,6 @@
"Mrs" => "ga.",
"Dr" => "dr.",
"Given name" => "Ime",
"Additional names" => "Druga imena",
"Family name" => "Priimek",
"Hon. suffixes" => "Pripone",
"J.D." => "univ. dipl. prav.",
@ -230,15 +257,12 @@
"Name of new addressbook" => "Ime novega imenika",
"Importing contacts" => "Poteka uvažanje stikov",
"<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>V imeniku ni stikov.</h3><p>Datoteke VCF je mogoče uvoziti tako, da jih povlečete na obstoječ seznam stikov ali na prazno mesto. Pri slednjem dejanju bo ustvarjen nov imenik s stiki.<br />Stike lahko uvažate tudi s klikom na gumb uvozi, ki je postavljen na dnu seznama.</p>",
"Add contact" => "Dodaj stik",
"Select Address Books" => "Izbor imenikov",
"Enter description" => "Vnesi opis",
"CardDAV syncing addresses" => "Naslovi CardDAV za usklajevanje",
"more info" => "več podrobnosti",
"Primary address (Kontact et al)" => "Osnovni naslov (za stik)",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "Imeniki",
"Share" => "Souporaba",
"New Address Book" => "Nov imenik",
"Name" => "Ime",
"Description" => "Opis",

View File

@ -9,16 +9,10 @@
"Missing a temporary folder" => "Недостаје привремена фасцикла",
"Contacts" => "Контакти",
"Error" => "Грешка",
"Upload too large" => "Пошиљка је превелика",
"Unable to upload your file as it is a directory or has 0 bytes" => "Није могуће послати датотеку или зато што је директоријуму или јој је величина 0 бајта",
"Upload Error" => "Грешка у слању",
"Pending" => "На чекању",
"Download" => "Преузимање",
"Edit" => "Уреди",
"Delete" => "Обриши",
"Cancel" => "Откажи",
"This is not your addressbook." => "Ово није ваш адресар.",
"Contact could not be found." => "Контакт се не може наћи.",
"Work" => "Посао",
"Home" => "Кућа",
"Other" => "Друго",
@ -29,17 +23,21 @@
"Video" => "Видео",
"Pager" => "Пејџер",
"Contact" => "Контакт",
"Add Contact" => "Додај контакт",
"Import" => "Увези",
"Settings" => "Подешавања",
"Import" => "Увези",
"Export" => "Извези",
"Back" => "Назад",
"Groups" => "Групе",
"Close" => "Затвори",
"Title" => "Наслов",
"Organization" => "Организација",
"Birthday" => "Рођендан",
"Groups" => "Групе",
"Preferred" => "Пожељан",
"Add" => "Додај",
"Phone" => "Телефон",
"Email" => "Е-маил",
"Address" => "Адреса",
"Preferred" => "Пожељан",
"Add Contact" => "Додај контакт",
"Download contact" => "Преузми контакт",
"Delete contact" => "Обриши контакт",
"Type" => "Тип",

View File

@ -6,13 +6,10 @@
"The uploaded file was only partially uploaded" => "Poslati fajl je samo delimično otpremljen!",
"No file was uploaded" => "Nijedan fajl nije poslat",
"Missing a temporary folder" => "Nedostaje privremena fascikla",
"Upload too large" => "Pošiljka je prevelika",
"Download" => "Preuzmi",
"Edit" => "Uredi",
"Delete" => "Obriši",
"Cancel" => "Otkaži",
"This is not your addressbook." => "Ovo nije vaš adresar.",
"Contact could not be found." => "Kontakt se ne može naći.",
"Work" => "Posao",
"Home" => "Kuća",
"Other" => "Drugo",
@ -22,15 +19,16 @@
"Fax" => "Faks",
"Video" => "Video",
"Pager" => "Pejdžer",
"Add Contact" => "Dodaj kontakt",
"Settings" => "Podešavanja",
"Groups" => "Grupe",
"Close" => "Zatvori",
"Title" => "Naslov",
"Organization" => "Organizacija",
"Birthday" => "Rođendan",
"Groups" => "Grupe",
"Phone" => "Telefon",
"Email" => "E-mail",
"Address" => "Adresa",
"Add Contact" => "Dodaj kontakt",
"PO Box" => "Poštanski broj",
"Extended" => "Proširi",
"City" => "Grad",

View File

@ -2,24 +2,21 @@
"Error (de)activating addressbook." => "Fel (av)aktivera adressbok.",
"id is not set." => "ID är inte satt.",
"Cannot update addressbook with an empty name." => "Kan inte uppdatera adressboken med ett tomt namn.",
"No category name given." => "Ingen kategori angiven.",
"Error adding group." => "Fel vid tillägg av grupp.",
"No ID provided" => "Inget ID angett",
"Error setting checksum." => "Fel uppstod när kontrollsumma skulle sättas.",
"No categories selected for deletion." => "Inga kategorier valda för borttaging",
"No address books found." => "Ingen adressbok funnen.",
"No contacts found." => "Inga kontakter funna.",
"element name is not set." => "elementnamn ej angett.",
"Could not parse contact: " => "Kunde inte läsa kontakt:",
"Cannot add empty property." => "Kan inte lägga till en tom egenskap.",
"At least one of the address fields has to be filled out." => "Minst ett fält måste fyllas i.",
"Trying to add duplicate property: " => "Försöker lägga till dubblett:",
"Missing IM parameter." => "IM parameter saknas.",
"Unknown IM: " => "Okänt IM:",
"Information about vCard is incorrect. Please reload the page." => "Information om vCard är felaktigt. Vänligen ladda om sidan.",
"Missing ID" => "ID saknas",
"Error parsing VCard for ID: \"" => "Fel vid läsning av VCard för ID: \"",
"checksum is not set." => "kontrollsumma är inte satt.",
"Information about vCard is incorrect. Please reload the page." => "Information om vCard är felaktigt. Vänligen ladda om sidan.",
"Couldn't find vCard for %d." => "Kunde inte hitta vCard för %d.",
"Information about vCard is incorrect. Please reload the page: " => "Informationen om vCard är fel. Ladda om sidan:",
"Something went FUBAR. " => "Något gick fel.",
"Missing IM parameter." => "IM parameter saknas.",
"Unknown IM: " => "Okänt IM:",
"No contact ID was submitted." => "Inget kontakt-ID angavs.",
"Error reading contact photo." => "Fel uppstod vid läsning av kontaktfoto.",
"Error saving temporary file." => "Fel uppstod när temporär fil skulle sparas.",
@ -35,6 +32,7 @@
"Error cropping image" => "Fel vid beskärning av bilden",
"Error creating temporary image" => "Fel vid skapande av tillfällig bild",
"Error finding image: " => "Kunde inte hitta bild:",
"Value is not set for: " => "Värde är inte satt för:",
"Error uploading contacts to storage." => "Fel uppstod när kontakt skulle lagras.",
"There is no error, the file uploaded with success" => "Inga fel uppstod. Filen laddades upp utan problem.",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Den uppladdade filen överskrider upload_max_filesize direktivet i php.ini",
@ -46,43 +44,32 @@
"Couldn't load temporary image: " => "Kunde inte ladda tillfällig bild:",
"No file was uploaded. Unknown error" => "Ingen fil uppladdad. Okänt fel",
"Contacts" => "Kontakter",
"Sorry, this functionality has not been implemented yet" => "Tyvärr är denna funktion inte införd än",
"Not implemented" => "Inte införd",
"Couldn't get a valid address." => "Kunde inte hitta en giltig adress.",
"Error" => "Fel",
"Please enter an email address." => "Ange en e-postadress.",
"Enter name" => "Ange namn",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => " anpassad, korta namn, hela namn, bakåt eller bakåt med komma",
"Select type" => "Välj typ",
"Contact is already in this group." => "Kontakten finns redan i denna grupp.",
"Contacts are already in this group." => "Kontakterna finns redan i denna grupp.",
"Contact is not in this group." => "Kontakten är inte i denna grupp.",
"Contacts are not in this group." => "Kontakterna är inte i denna grupp.",
"A group named {group} already exists" => "En grupp men namnet {group} finns redan",
"All" => "Alla",
"Favorites" => "Favoriter",
"Shared by {owner}" => "Delad av {owner}",
"Indexing contacts" => "Indexerar kontakter",
"Add to..." => "Lägga till...",
"Remove from..." => "Ta bort från...",
"Add group..." => "Lägg till grupp...",
"Select photo" => "Välj foto",
"You do not have permission to add contacts to " => "Du saknar behörighet att skapa kontakter i",
"Please select one of your own address books." => "Välj en av dina egna adressböcker.",
"Permission error" => "Behörighetsfel",
"Click to undo deletion of \"" => "Klicka för att ångra radering av \"",
"Cancelled deletion of: \"" => "Avbruten radering av: \"",
"This property has to be non-empty." => "Denna egenskap får inte vara tom.",
"Couldn't serialize elements." => "Kunde inte serialisera element.",
"Unknown error. Please check logs." => "Okänt fel. Kontrollera loggarna.",
"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "\"deleteProperty\" anropades utan typargument. Vänligen rapportera till bugs.owncloud.org",
"Edit name" => "Ändra namn",
"Network or server error. Please inform administrator." => "Nätverk eller serverfel. Informera administratören.",
"Add group" => "Lägg till grupp",
"No files selected for upload." => "Inga filer valda för uppladdning",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Filen du försöker ladda upp är större än den maximala storleken för filuppladdning på denna server.",
"Edit profile picture" => "Anpassa profilbild",
"Error loading profile picture." => "Fel vid hämtning av profilbild.",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Vissa kontakter är markerade för radering, men är inte raderade än. Vänta tills dom är raderade.",
"Do you want to merge these address books?" => "Vill du slå samman dessa adressböcker?",
"Shared by " => "Delad av",
"Upload too large" => "För stor uppladdning",
"Only image files can be used as profile picture." => "Endast bildfiler kan användas som profilbild.",
"Wrong file type" => "Felaktig filtyp",
"Your browser doesn't support AJAX upload. Please click on the profile picture to select a photo to upload." => "Din webbläsare saknar stöd för uppladdning med AJAX. Klicka på profilbilden för att välja ett foto att ladda upp.",
"Unable to upload your file as it is a directory or has 0 bytes" => "Kan inte ladda upp din fil eftersom det är en katalog eller har 0 bytes",
"Upload Error" => "Fel vid uppladdning",
"Pending" => "Väntar",
"Import done" => "Import klar",
"Not all files uploaded. Retrying..." => "Alla filer är inte uppladdade. Försöker igen...",
"Something went wrong with the upload, please retry." => "Något gick fel med uppladdningen, försök igen.",
"Importing..." => "Importerar...",
"Enter name" => "Ange namn",
"Enter description" => "Ange beskrivning",
"Select addressbook" => "Välj adressbok",
"The address book name cannot be empty." => "Adressbokens namn kan inte vara tomt.",
"Error" => "Fel",
"Is this correct?" => "Är detta korrekt?",
"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Vissa kontakter är markerade för radering, men är inte raderade än. Vänta tills dom är raderade.",
"Result: " => "Resultat:",
" imported, " => "importerad,",
" failed." => "misslyckades.",
@ -100,9 +87,6 @@
"There was an error updating the addressbook." => "Ett fel uppstod när adressboken skulle uppdateras.",
"You do not have the permissions to delete this addressbook." => "Du har inte behörighet att radera denna adressbok.",
"There was an error deleting this addressbook." => "Fel uppstod vid radering av denna adressbok.",
"Addressbook not found: " => "Adressboken hittades inte:",
"This is not your addressbook." => "Det här är inte din adressbok.",
"Contact could not be found." => "Kontakt kunde inte hittas.",
"Jabber" => "Jabber",
"AIM" => "AIM",
"MSN" => "MSN",
@ -137,9 +121,20 @@
"Could not find the Addressbook with ID: " => "Kan inte hitta adressboken med ID:",
"You do not have the permissions to delete this contact." => "Du saknar behörighet för att radera denna kontakt.",
"There was an error deleting this contact." => "Fel uppstod vid radering av denna kontakt.",
"Add Contact" => "Lägg till kontakt",
"Import" => "Importera",
"Contact not found." => "Kontakt kan inte hittas.",
"HomePage" => "Hemsida",
"New Group" => "Ny grupp",
"Settings" => "Inställningar",
"Share" => "Dela",
"Import" => "Importera",
"Import into:" => "Importera till:",
"Export" => "Exportera",
"New Contact" => "Ny kontakt",
"Back" => "Tillbaka",
"Download Contact" => "Ladda ner kontakt",
"Delete Contact" => "Radera kontakt",
"Groups" => "Grupper",
"Favorite" => "Favorit",
"Close" => "Stäng",
"Keyboard shortcuts" => "Kortkommandon",
"Navigation" => "Navigering",
@ -153,41 +148,58 @@
"Add new contact" => "Lägg till ny kontakt",
"Add new addressbook" => "Lägg till ny adressbok",
"Delete current contact" => "Radera denna kontakt",
"Drop photo to upload" => "Släpp foto för att ladda upp",
"Add contact" => "Lägg till en kontakt",
"Compose mail" => "Skapa e-post",
"Delete group" => "Radera grupp",
"Delete current photo" => "Ta bort aktuellt foto",
"Edit current photo" => "Redigera aktuellt foto",
"Upload new photo" => "Ladda upp ett nytt foto",
"Select photo from ownCloud" => "Välj foto från ownCloud",
"Edit name details" => "Redigera detaljer för namn",
"Organization" => "Organisation",
"First name" => "Förnamn",
"Additional names" => "Mellannamn",
"Last name" => "Efternamn",
"Nickname" => "Smeknamn",
"Enter nickname" => "Ange smeknamn",
"Web site" => "Webbplats",
"http://www.somesite.com" => "http://www.somesite.com",
"Go to web site" => "Gå till webbplats",
"Title" => "Titel",
"Organization" => "Organisation",
"Birthday" => "Födelsedag",
"dd-mm-yyyy" => "dd-mm-åååå",
"Groups" => "Grupper",
"Separate groups with commas" => "Separera grupperna med kommatecken",
"Edit groups" => "Editera grupper",
"Preferred" => "Föredragen",
"Please specify a valid email address." => "Vänligen ange en giltig e-postadress.",
"Enter email address" => "Ange e-postadress",
"Mail to address" => "Posta till adress.",
"Delete email address" => "Ta bort e-postadress",
"Enter phone number" => "Ange telefonnummer",
"Delete phone number" => "Ta bort telefonnummer",
"Instant Messenger" => "Instant Messenger",
"Delete IM" => "Radera IM",
"View on map" => "Visa på karta",
"Edit address details" => "Redigera detaljer för adress",
"Add notes here." => "Lägg till noteringar här.",
"Add field" => "Lägg till fält",
"Notes go here..." => "Noteringar här...",
"Add" => "Lägg till",
"Phone" => "Telefon",
"Email" => "E-post",
"Instant Messaging" => "Instant Messaging",
"Address" => "Adress",
"Note" => "Notering",
"Web site" => "Webbplats",
"Preferred" => "Föredragen",
"Please specify a valid email address." => "Vänligen ange en giltig e-postadress.",
"someone@example.com" => "någon@exempel.com",
"Mail to address" => "Posta till adress.",
"Delete email address" => "Ta bort e-postadress",
"Enter phone number" => "Ange telefonnummer",
"Delete phone number" => "Ta bort telefonnummer",
"Go to web site" => "Gå till webbplats",
"Delete URL" => "Radera URL",
"View on map" => "Visa på karta",
"Delete address" => "Radera adress",
"12345" => "12345",
"Your city" => "Din stad",
"Some region" => "En region",
"Your country" => "Ditt land",
"Instant Messenger" => "Instant Messenger",
"Delete IM" => "Radera IM",
"Add Contact" => "Lägg till kontakt",
"Drop photo to upload" => "Släpp foto för att ladda upp",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => " anpassad, korta namn, hela namn, bakåt eller bakåt med komma",
"Edit name details" => "Redigera detaljer för namn",
"Enter nickname" => "Ange smeknamn",
"http://www.somesite.com" => "http://www.somesite.com",
"dd-mm-yyyy" => "dd-mm-åååå",
"Separate groups with commas" => "Separera grupperna med kommatecken",
"Edit groups" => "Editera grupper",
"Enter email address" => "Ange e-postadress",
"Edit address details" => "Redigera detaljer för adress",
"Add notes here." => "Lägg till noteringar här.",
"Add field" => "Lägg till fält",
"Download contact" => "Ladda ner kontakt",
"Delete contact" => "Radera kontakt",
"The temporary image has been removed from cache." => "Den tillfälliga bilden har raderats från cache.",
@ -213,7 +225,6 @@
"Mrs" => "Fru",
"Dr" => "Dr.",
"Given name" => "Förnamn",
"Additional names" => "Mellannamn",
"Family name" => "Efternamn",
"Hon. suffixes" => "Efterställda titlar",
"J.D." => "Kand. Jur.",
@ -230,15 +241,12 @@
"Name of new addressbook" => "Namn för ny adressbok",
"Importing contacts" => "Importerar kontakter",
"<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>Det finns inga kontakter i din adressbok.</h3><p>Du kan importera VCF-filer genom att antingen dra till kontaktlistan och släppa på en befintlig adressbok, eller på en tom plats för att skapa en ny adressbok.<br />Du kan också importera genom att klicka på importknappen längst ner i listan.</p>",
"Add contact" => "Lägg till en kontakt",
"Select Address Books" => "Välj adressböcker",
"Enter description" => "Ange beskrivning",
"CardDAV syncing addresses" => "CardDAV synkningsadresser",
"more info" => "mer information",
"Primary address (Kontact et al)" => "Primär adress (Kontakt o.a.)",
"iOS/OS X" => "iOS/OS X",
"Addressbooks" => "Adressböcker",
"Share" => "Dela",
"New Address Book" => "Ny adressbok",
"Name" => "Namn",
"Description" => "Beskrivning",

View File

@ -1,33 +1,269 @@
<?php $TRANSLATIONS = array(
"Error (de)activating addressbook." => "முகவரி புத்தகத்தை செயற்படுத்துவதில் (செயற்படுத்தாமையில்) வழு",
"id is not set." => "அடையாளம் அமைக்கப்படவில்லை",
"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." => "மூலக பெயர் அமைக்கப்படவில்லை",
"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." => "தொடர்பு அடையாளங்கள் சமர்பிக்கப்படவில்லை",
"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." => "தொடர்பு பொருளை பெறுவதில் வழு ",
"Error getting PHOTO property." => "பட தொகுப்பை பெறுவதில் வழு",
"Error saving contact." => "தொடர்பை சேமிப்பதில் வழு",
"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 directive ஐ விட கூடியது",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "பதிவேற்றப்பட்ட கோப்பானது HTML படிவத்தில் குறிப்பிடப்பட்டுள்ள MAX_FILE_SIZE directive ஐ விட கூடியது",
"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" => "தொடர்புகள்",
"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" => "ஒரு குழு பெயர் {குழு} ஏற்கனவே உள்ளது",
"All" => "எல்லாம்",
"Favorites" => "விருப்பங்கள்",
"Shared by {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." => "மின்னஞ்சல் செய்தியாக்குகையை திறப்பதில் வழு.",
"Add group" => "குழுவில் சேர்க்க",
"No files selected for upload." => "பதிவேற்றுவதற்கு கோப்புகள் தெரிவுசெய்யப்படவில்லை",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "நீங்கள் பதிவேற்ற முயற்சிக்கும் கோப்பானது இந்த சேவையகத்தில் பதிவேற்றக்கூடிய கோப்பின் ஆகக்கூடிய அளவைவிட கூடியது. ",
"Edit profile picture" => "விபரக்கோவை படத்தை தொகுக்க ",
"Error loading profile picture." => "விபரக்கோவை படத்தை ஏற்றுவதில் வழு",
"Enter name" => "பெயரை நுழைக்க ",
"Enter description" => "விபரிப்புக்களை நுழைக்க",
"Select addressbook" => "முகவரி புத்தகத்தை தெரிவுசெய்க",
"The address book name cannot be empty." => "முகவரிப் புத்தகத்தின் பெயர் வெறுமையாக இருக்கமுடியாது.",
"Error" => "வழு",
"Upload too large" => "பதிவேற்றல் மிகப்பெரியது",
"Unable to upload your file as it is a directory or has 0 bytes" => "அடைவு அல்லது 0 bytes ஐ கொண்டுள்ளதால் உங்களுடைய கோப்பை பதிவேற்ற முடியவில்லை",
"Upload Error" => "பதிவேற்றல் வழு",
"Pending" => "நிலுவையிலுள்ள",
"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..." => "மேலதிக...",
"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",
"Facebook" => "Facebook",
"XMPP" => "XMPP",
"ICQ" => "ICQ",
"Yahoo" => "Yahoo",
"Skype" => "Skype",
"QQ" => "QQ",
"GaduGadu" => "GaduGadu",
"Work" => "வேலை",
"Home" => "அகம்",
"Other" => "மற்றவை",
"Mobile" => "இடமாற்றக்கூடிய",
"Text" => "உரை",
"Import" => "இறக்குமதி",
"Voice" => "குரல்",
"Message" => "செய்தி",
"Fax" => "தொலை நகல்",
"Video" => "நிகழ்படம்",
"Pager" => "தொலை அழைப்பான்",
"Internet" => "இணையம்",
"Friends" => "நண்பர்கள்",
"Family" => "குடும்பம்",
"There was an error deleting properties for this contact." => "இந்த தொடர்புகளின் உறுப்புக்களை நீக்குவதில் வழு ஏற்பட்டுள்ளது.",
"{name}'s Birthday" => "{பெயர்} இன் பிறந்தநாள்",
"Contact" => "தொடர்பு",
"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" => "அமைப்புகள்",
"Share" => "பகிர்வு",
"Import" => "இறக்குமதி",
"Import into:" => "இதற்கு இறக்குமதி செய்க:",
"Export" => "ஏற்றுமதி",
"(De-)select all" => "எல்லாவற்றையும் தெரிவுசெய்க (செய்யாதிக-)",
"New Contact" => "புதிய தொடர்பு",
"Back" => "பின்னுக்கு",
"Download Contact" => "தொடர்பை பதிவிறக்குக",
"Delete Contact" => "தொடர்பை நீக்குக",
"Groups" => "குழுக்கள்",
"Favorite" => "விருப்பமான",
"Close" => "மூடுக",
"Keyboard shortcuts" => "விசைப்பலகை குறுக்குவழிகள்",
"Navigation" => "வழிசெலுத்தல்",
"Next contact in list" => "பட்டியலில் உள்ள அடுத்த தொடர்பு",
"Previous contact in list" => "பட்டியலில் முந்தைய தொடர்பு",
"Expand/collapse current addressbook" => "தற்போதைய முகவரி புத்தகத்தை விரிவாக்குக/தகர்த்துக",
"Next addressbook" => "அடுத்த முகவரி புத்தகம்",
"Previous addressbook" => "முந்தைய முகவரி புத்தகம்",
"Actions" => "செயல்கள்",
"Refresh contacts list" => "தொடர்பு பட்டியலை மீள் ஏற்றுக",
"Add new contact" => "புதிய தொடர்பை சேர்க்க",
"Add new addressbook" => "புதிய முகவரி புத்தகத்தை சேர்க்க",
"Delete current contact" => "தற்போதைய தொடர்பை நீக்குக",
"<h3>You have no contacts in your addressbook.</h3><p>Add a new contact or import existing contacts from a VCF file.</p>" => "<h3>உங்களுடைய முகவரி புத்தகத்தில் ஒரு தொடர்பும் இல்லை.</h3><p>புதிய தொடர்பை சேர்க்க அல்லது ஏற்கனவே உள்ள தொடர்புகளை VCF கோப்பிலிருந்து இறக்குமதி செய்க.</p>",
"Add contact" => "தொடர்பை சேர்க்க",
"Compose mail" => "மின்னஞ்சல் செய்தியாக்குகை",
"Delete group" => "குழுக்களை நீக்குக",
"Delete current photo" => "தற்போதைய படத்தை நீக்குக",
"Edit current photo" => "தற்போதைய படத்தை தொகுக்க",
"Upload new photo" => "புதிய படத்தை பதிவேற்றுக",
"Select photo from ownCloud" => "ownCloud இலிருந்து படத்தை தெரிவுசெய்க",
"First name" => "முதல் பெயர்",
"Additional names" => "மேலதிக பெயர்கள்",
"Last name" => "கடைசிப் பெயர்",
"Nickname" => "பட்டப்பெயர்",
"Title" => "தலைப்பு",
"Organization" => "நிறுவனம்",
"Birthday" => "பிறந்த நாள்",
"Notes go here..." => "குறிப்புகள் இங்கே இருக்கின்றன...",
"Add" => "சேர்க்க",
"Phone" => "தொலைப்பேசி",
"Email" => "மின்னஞ்சல்",
"Instant Messaging" => "Instant Messaging",
"Address" => "முகவரி",
"Note" => "குறிப்பு",
"Web site" => "வலைய தளம்",
"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" => "வலைய தளத்திற்கு செல்க",
"Delete URL" => "URL ஐ நீக்குக",
"View on map" => "வரைப்படத்தில் காண்க",
"Delete address" => "முகவரியை நீக்குக",
"1 Main Street" => "1 பிரதான பாதை",
"12345" => "12345",
"Your city" => "உங்களுடைய நகரம்",
"Some region" => "சில பிரதேசம்",
"Your country" => "உங்களுடைய நாடு",
"Instant Messenger" => "Instant Messenger",
"Delete IM" => "IM ஐ நீக்குக",
"Add Contact" => "​தொடர்புகளை சேர்க்க",
"Drop photo to upload" => "பதிவேற்றுவதற்கான படத்தை விடுக",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "தனிப்பயன் வடிவமைப்பு, சுருக்கப் பெயர், முழுப்பெயர், எதிர் அல்லது காற்புள்ளியினால் பின்னோக்கு",
"Edit name details" => "பெயர் விபரங்களை தொகுக்க ",
"Enter nickname" => "பட்டப்பெயரை நுழைக்க",
"http://www.somesite.com" => "http://www.somesite.com",
"dd-mm-yyyy" => "dd-mm-yyyy",
"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" => "முகவரியை தொகுக்க",
"Type" => "வகை",
"PO Box" => "PO பெட்டி",
"Street address" => "வீதி முகவரி",
"Street and number" => "வீதி மற்றும் இலக்கம்",
"Extended" => "விஸ்த்தரிக்கப்பட்ட",
"Apartment number etc." => "அபாட்மென்ட் இலக்கம் உதாரணம்.",
"City" => "நகரம்",
"Region" => "பிரதேசம்",
"E.g. state or province" => "உதாரணம் . மாநிலம் அல்லது மாகாணம்",
"Zipcode" => "தபால் இலக்கம்",
"Postal code" => "தபால் குறியீடு",
"Country" => "நாடு",
"Addressbook" => "முகவரி புத்தகம்",
"Hon. prefixes" => "Hon. முன்னொட்டுகள்",
"Miss" => "செல்வி",
"Ms" => "திருமதி",
"Mr" => "திரு",
"Sir" => "சேர்",
"Mrs" => "திருமதி",
"Dr" => "டாக்டர்",
"Given name" => "தரப்பட்ட பெயர்",
"Family name" => "குடும்ப பெயர்",
"Hon. suffixes" => "Hon. பின்னொட்டுகள்",
"J.D." => "J.D.",
"M.D." => "M.D.",
"D.O." => "D.O.",
"D.C." => "D.C.",
"Ph.D." => "Ph.D.",
"Esq." => "Esq.",
"Jr." => "Jr.",
"Sn." => "Sn.",
"Import a contacts file" => "தொடர்பு கோப்பை இறக்குமதி செய்க",
"Please choose the addressbook" => "தயவுசெய்து முகவரி புத்தகத்தை தெரிவுசெய்க",
"create a new addressbook" => "புதிதாக முகவரி புத்தகமொன்றை உருவாக்குக",
"Name of new addressbook" => "புதிய முகவரி புத்தகத்தின் பெயர்",
"Importing contacts" => "தொடர்புகள் இறக்குமதி செய்யப்படுகின்றன",
"Select Address Books" => "முகவரி புத்தகத்தை தெரிவுசெய்க",
"CardDAV syncing addresses" => "முகவரிகளை cardDAV ஒத்திசைக்கின்றன",
"more info" => "மேலதிக தகவல்",
"Primary address (Kontact et al)" => "முதன்மை முகவரி (Kontact et al)",
"iOS/OS X" => "iOS/OS X",
"Share" => "பகிர்வு",
"Addressbooks" => "முகவரி புத்தகங்கள்",
"New Address Book" => "புதிய முகவரி புத்தகம்",
"Name" => "பெயர்",
"Description" => "விவரிப்பு",
"Save" => "சேமிக்க"
);

View File

@ -2,24 +2,24 @@
"Error (de)activating addressbook." => "เกิดข้อผิดพลาดใน (ยกเลิก)การเปิดใช้งานสมุดบันทึกที่อยู่",
"id is not set." => "ยังไม่ได้กำหนดรหัส",
"Cannot update addressbook with an empty name." => "ไม่สามารถอัพเดทสมุดบันทึกที่อยู่โดยไม่มีชื่อได้",
"No category name given." => "ยังไม่ได้ใส่ชื่อหมวดหมู่",
"Error adding group." => "เกิดข้อผิดพลาดในการเพิ่มกลุ่ม",
"Group ID missing from request." => "รหัสกลุ่มที่ร้องขอเกิดการสูญหาย",
"Contact ID missing from request." => "รหัสรายชื่อผู้ติดต่อที่ร้องขอเกิดการสูญหาย",
"No ID provided" => "ยังไม่ได้ใส่รหัส",
"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" => "รหัสสูญหาย",
"Error parsing VCard for ID: \"" => "พบข้อผิดพลาดในการแยกรหัส VCard:\"",
"checksum is not set." => "ยังไม่ได้กำหนดค่า checksum",
"Information about vCard is incorrect. Please reload the page." => "ข้อมูลเกี่ยวกับ vCard ไม่ถูกต้อง กรุณาโหลดหน้าเวปใหม่อีกครั้ง",
"Couldn't find vCard for %d." => "ไม่พบ vCard สำหรับ %d",
"Information about vCard is incorrect. Please reload the page: " => "ข้อมูล vCard ไม่ถูกต้อง กรุณาโหลดหน้าเว็บใหม่อีกครั้ง: ",
"Something went FUBAR. " => "มีบางอย่างเกิดการ FUBAR. ",
"Cannot save property of type \"%s\" as array" => "ไม่สามารถบันทึกคุณสมบัติของประเภท \"%s\" เป็นชุดอะเรย์ได้",
"Missing IM parameter." => "ค่าพารามิเตอร์ IM เกิดการสูญหาย",
"Unknown IM: " => "IM ไม่ทราบชื่อ:",
"No contact ID was submitted." => "ไม่มีรหัสข้อมูลการติดต่อถูกส่งมา",
"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" => "ไฟล์ที่อัพโหลดมีขนาดไฟล์ใหญ่เกินจำนวนที่กำหนดไว้ในคำสั่ง upload_max_filesize ที่อยู่ในไฟล์ php.ini",
@ -46,43 +49,39 @@
"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" => "เลือกชนิด",
"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} มีอยู่แล้ว",
"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" => "แก้ไขชื่อ",
"Network or server error. Please inform administrator." => "เครือข่ายหรือเซิร์ฟเวอร์ เกิดข้อผิดพลาด กรุณาติดต่อผู้ดูแลระบบ",
"Error adding to group." => "เกิดข้อผิดพลาดในการเพิ่มเข้าไปยังกลุ่ม",
"Error removing from group." => "เกิดข้อผิดพลาดในการลบออกจากกลุ่ม",
"There was an error opening a mail composer." => "เกิดข้อผิดพลาดในการระหว่างการเปิดหน้าเครื่องมือเขียนอีเมล",
"Add group" => "เพิ่มกลุ่ม",
"No files selected for upload." => "ยังไม่ได้เลือกไฟล์ำสำหรับอัพโหลด",
"The file you are trying to upload exceed the maximum size for file uploads on this server." => "ไฟล์ที่คุณกำลังพยายามที่จะอัพโหลดมีขนาดเกินจำนวนสูงสุดที่สามารถอัพโหลดได้สำหรับเซิร์ฟเวอร์นี้",
"Edit profile picture" => "แก้ไขรูปภาพหน้าโปรไฟล์",
"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" => "เสร็จสิ้นการนำเข้าข้อมูล",
"Not all files uploaded. Retrying..." => "ไม่ใช่ไฟล์ทั้งหมดที่จะถูกอัพโหลด กำลังลองใหม่...",
"Something went wrong with the upload, please retry." => "เกิดข้อผิดพลาดบางประการในการอัพโหลด, กรุณาลองใหม่อีกครั้ง",
"Importing..." => "กำลังนำเข้าข้อมูล...",
"Enter name" => "กรอกชื่อ",
"Enter description" => "กรอกคำอธิบาย",
"Select addressbook" => "เลือกสมุดบันทึกที่อยู่",
"The address book name cannot be empty." => "ชื่อของสมุดบันทึกที่อยู่ไม่สามารถเว้นว่างได้",
"Error" => "พบข้อผิดพลาด",
"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 +99,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",
@ -128,6 +124,7 @@
"Internet" => "อินเทอร์เน็ต",
"Friends" => "เพื่อน",
"Family" => "ครอบครัว",
"There was an error deleting properties for this contact." => "เกิดข้อผิดพลาดในการลบคุณสมบัติของรายชื่อผู้ติดต่อนี้",
"{name}'s Birthday" => "วันเกิดของ {name}",
"Contact" => "ข้อมูลการติดต่อ",
"You do not have the permissions to add contacts to this addressbook." => "คุณไม่ได้รับสิทธิ์ให้เพิ่มข้อมูลผู้ติดต่อเข้าไปในสมุดบันทึกที่อยู่นี้",
@ -137,9 +134,21 @@
"Could not find the Addressbook with 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" => "ตั้งค่า",
"Share" => "แชร์",
"Import" => "นำเข้า",
"Import into:" => "นำเข้าข้อมูลไปไว้ที่:",
"Export" => "ส่งออก",
"(De-)select all" => "ยกเลิกการเลือกทั้งหมด",
"New Contact" => "สร้างรายชื่อผู้ติดต่อใหม่",
"Back" => "ย้อนกลับ",
"Download Contact" => "ดาวน์โหลดรายชื่อผู้ติดต่อ",
"Delete Contact" => "ลบรายชื่อผู้ติดต่อ",
"Groups" => "กลุ่ม",
"Favorite" => "รายการโปรด",
"Close" => "ปิด",
"Keyboard shortcuts" => "ปุ่มลัด",
"Navigation" => "ระบบเมนู",
@ -153,41 +162,60 @@
"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" => "ไปที่เว็บไซต์",
"Title" => "ชื่อ",
"Organization" => "หน่วยงาน",
"Birthday" => "วันเกิด",
"dd-mm-yyyy" => "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" => "ลบที่อยู่อีเมล",
"Enter phone number" => "กรอกหมายเลขโทรศัพท์",
"Delete phone number" => "ลบหมายเลขโทรศัพท์",
"Instant Messenger" => "โปรแกรมรับส่งข้อความ",
"Delete IM" => "ลบ IM",
"View on map" => "ดูบนแผนที่",
"Edit address details" => "แก้ไขรายละเอียดที่อยู่",
"Add notes here." => "เพิ่มหมายเหตุกำกับไว้ที่นี่",
"Add field" => "เพิ่มช่องรับข้อมูล",
"Notes go here..." => "เขียนบันทึกกำกับตรงนี้...",
"Add" => "เพิ่ม",
"Phone" => "โทรศัพท์",
"Email" => "อีเมล์",
"Instant Messaging" => "ส่งข้อความโต้ตอบแบบทันที",
"Address" => "ที่อยู่",
"Note" => "หมายเหตุ",
"Web site" => "เว็บไซต์",
"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" => "ไปที่เว็บไซต์",
"Delete URL" => "ลบที่อยู่ URL",
"View on map" => "ดูบนแผนที่",
"Delete address" => "ลบที่อยู่",
"1 Main Street" => "ถนนสายหลัก",
"12345" => "12345",
"Your city" => "ชื่อเมือง",
"Some region" => "ย่าน",
"Your country" => "ประเทศของคุณ",
"Instant Messenger" => "โปรแกรมรับส่งข้อความ",
"Delete IM" => "ลบ IM",
"Add Contact" => "เพิ่มรายชื่อผู้ติดต่อใหม่",
"Drop photo to upload" => "วางรูปภาพที่ต้องการอัพโหลด",
"Format custom, Short name, Full name, Reverse or Reverse with comma" => "กำหนดรูปแบบของชื่อย่อ, ชื่อจริง, ย้อนค่ากลัีบด้วยคอมม่าเอง",
"Edit name details" => "แก้ไขรายละเอียดของชื่อ",
"Enter nickname" => "กรอกชื่อเล่น",
"http://www.somesite.com" => "http://www.somesite.com",
"dd-mm-yyyy" => "dd-mm-yyyy",
"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." => "รูปภาพชั่วคราวดังกล่าวได้ถูกลบออกจากหน่วยความจำแคชแล้ว",
@ -213,7 +241,6 @@
"Mrs" => "นาง",
"Dr" => "ดร.",
"Given name" => "ชื่อที่ใช้",
"Additional names" => "ชื่ออื่นๆ",
"Family name" => "ชื่อครอบครัว",
"Hon. suffixes" => "คำแนบท้ายชื่อคนรัก",
"J.D." => "J.D.",
@ -230,15 +257,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" => "คำอธิบาย",

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