diff options
author | Jörn Friedrich Dreyer <jfd@butonic.de> | 2012-08-25 00:05:07 +0200 |
---|---|---|
committer | Jörn Friedrich Dreyer <jfd@butonic.de> | 2012-08-25 00:05:07 +0200 |
commit | c8255a170c2d7449b4e7728edd2237eea71dca80 (patch) | |
tree | e5a3854ec472be9700064bc7b689b8adf7c7f692 /apps/contacts | |
parent | 0c0ae928dcd483211a92303eb2b202453d02a86e (diff) | |
parent | 46d6fd15e4cc02d45079ffc688be0684e61f1434 (diff) | |
download | nextcloud-server-c8255a170c2d7449b4e7728edd2237eea71dca80.tar.gz nextcloud-server-c8255a170c2d7449b4e7728edd2237eea71dca80.zip |
Merge branch 'master' of git://gitorious.org/owncloud/owncloud into oracle-support
Conflicts:
3rdparty/Sabre/CardDAV/Plugin.php
3rdparty/smb4php/smb.php
apps/bookmarks/ajax/addBookmark.php
apps/bookmarks/ajax/editBookmark.php
apps/bookmarks/appinfo/migrate.php
apps/calendar/ajax/calendar/edit.form.php
apps/calendar/ajax/changeview.php
apps/calendar/ajax/import/import.php
apps/calendar/ajax/settings/guesstimezone.php
apps/calendar/ajax/settings/setfirstday.php
apps/calendar/ajax/settings/settimeformat.php
apps/calendar/ajax/share/changepermission.php
apps/calendar/ajax/share/share.php
apps/calendar/ajax/share/unshare.php
apps/calendar/appinfo/app.php
apps/calendar/appinfo/remote.php
apps/calendar/appinfo/update.php
apps/calendar/appinfo/version
apps/calendar/js/calendar.js
apps/calendar/l10n/da.php
apps/calendar/l10n/de.php
apps/calendar/l10n/fi_FI.php
apps/calendar/l10n/gl.php
apps/calendar/l10n/he.php
apps/calendar/l10n/hr.php
apps/calendar/l10n/ja_JP.php
apps/calendar/l10n/lb.php
apps/calendar/l10n/lt_LT.php
apps/calendar/l10n/nb_NO.php
apps/calendar/l10n/pl.php
apps/calendar/l10n/pt_PT.php
apps/calendar/l10n/ro.php
apps/calendar/l10n/ru.php
apps/calendar/l10n/sv.php
apps/calendar/l10n/zh_CN.php
apps/calendar/l10n/zh_TW.php
apps/calendar/lib/app.php
apps/calendar/lib/calendar.php
apps/calendar/lib/object.php
apps/calendar/lib/share.php
apps/calendar/templates/part.choosecalendar.rowfields.php
apps/calendar/templates/part.import.php
apps/calendar/templates/settings.php
apps/contacts/ajax/activation.php
apps/contacts/ajax/addressbook/delete.php
apps/contacts/ajax/contact/add.php
apps/contacts/ajax/contact/addproperty.php
apps/contacts/ajax/contact/delete.php
apps/contacts/ajax/contact/deleteproperty.php
apps/contacts/ajax/contact/saveproperty.php
apps/contacts/ajax/createaddressbook.php
apps/contacts/ajax/cropphoto.php
apps/contacts/ajax/currentphoto.php
apps/contacts/ajax/importaddressbook.php
apps/contacts/ajax/oc_photo.php
apps/contacts/ajax/savecrop.php
apps/contacts/ajax/selectaddressbook.php
apps/contacts/ajax/updateaddressbook.php
apps/contacts/ajax/uploadimport.php
apps/contacts/ajax/uploadphoto.php
apps/contacts/appinfo/migrate.php
apps/contacts/appinfo/remote.php
apps/contacts/css/contacts.css
apps/contacts/import.php
apps/contacts/index.php
apps/contacts/js/contacts.js
apps/contacts/l10n/ca.php
apps/contacts/l10n/cs_CZ.php
apps/contacts/l10n/da.php
apps/contacts/l10n/de.php
apps/contacts/l10n/el.php
apps/contacts/l10n/eo.php
apps/contacts/l10n/es.php
apps/contacts/l10n/et_EE.php
apps/contacts/l10n/eu.php
apps/contacts/l10n/fa.php
apps/contacts/l10n/fi_FI.php
apps/contacts/l10n/fr.php
apps/contacts/l10n/he.php
apps/contacts/l10n/hr.php
apps/contacts/l10n/hu_HU.php
apps/contacts/l10n/ia.php
apps/contacts/l10n/it.php
apps/contacts/l10n/ja_JP.php
apps/contacts/l10n/ko.php
apps/contacts/l10n/lb.php
apps/contacts/l10n/mk.php
apps/contacts/l10n/nb_NO.php
apps/contacts/l10n/nl.php
apps/contacts/l10n/pl.php
apps/contacts/l10n/pt_BR.php
apps/contacts/l10n/pt_PT.php
apps/contacts/l10n/ro.php
apps/contacts/l10n/ru.php
apps/contacts/l10n/sk_SK.php
apps/contacts/l10n/sl.php
apps/contacts/l10n/sv.php
apps/contacts/l10n/th_TH.php
apps/contacts/l10n/tr.php
apps/contacts/l10n/zh_CN.php
apps/contacts/l10n/zh_TW.php
apps/contacts/lib/addressbook.php
apps/contacts/lib/hooks.php
apps/contacts/lib/vcard.php
apps/contacts/photo.php
apps/contacts/templates/part.contact.php
apps/contacts/templates/part.contacts.php
apps/contacts/templates/part.cropphoto.php
apps/contacts/templates/part.importaddressbook.php
apps/contacts/templates/part.selectaddressbook.php
apps/contacts/thumbnail.php
apps/files/ajax/download.php
apps/files/ajax/newfile.php
apps/files/ajax/timezone.php
apps/files/appinfo/update.php
apps/files/appinfo/version
apps/files/index.php
apps/files/js/fileactions.js
apps/files/js/filelist.js
apps/files/js/files.js
apps/files/l10n/ar.php
apps/files/l10n/bg_BG.php
apps/files/l10n/ca.php
apps/files/l10n/cs_CZ.php
apps/files/l10n/da.php
apps/files/l10n/de.php
apps/files/l10n/el.php
apps/files/l10n/eo.php
apps/files/l10n/es.php
apps/files/l10n/et_EE.php
apps/files/l10n/eu.php
apps/files/l10n/fa.php
apps/files/l10n/fi_FI.php
apps/files/l10n/fr.php
apps/files/l10n/gl.php
apps/files/l10n/he.php
apps/files/l10n/hr.php
apps/files/l10n/hu_HU.php
apps/files/l10n/ia.php
apps/files/l10n/id.php
apps/files/l10n/it.php
apps/files/l10n/ja_JP.php
apps/files/l10n/ko.php
apps/files/l10n/lb.php
apps/files/l10n/lt_LT.php
apps/files/l10n/mk.php
apps/files/l10n/ms_MY.php
apps/files/l10n/nb_NO.php
apps/files/l10n/nl.php
apps/files/l10n/nn_NO.php
apps/files/l10n/pl.php
apps/files/l10n/pt_BR.php
apps/files/l10n/pt_PT.php
apps/files/l10n/ro.php
apps/files/l10n/ru.php
apps/files/l10n/sk_SK.php
apps/files/l10n/sl.php
apps/files/l10n/sr.php
apps/files/l10n/sr@latin.php
apps/files/l10n/sv.php
apps/files/l10n/th_TH.php
apps/files/l10n/tr.php
apps/files/l10n/uk.php
apps/files/l10n/zh_CN.php
apps/files/l10n/zh_TW.php
apps/files_archive/js/archive.js
apps/files_encryption/lib/cryptstream.php
apps/files_encryption/lib/proxy.php
apps/files_encryption/tests/proxy.php
apps/files_external/appinfo/app.php
apps/files_external/lib/smb.php
apps/files_external/lib/streamwrapper.php
apps/files_external/tests/config.php
apps/files_external/tests/smb.php
apps/files_sharing/ajax/email.php
apps/files_sharing/ajax/getitem.php
apps/files_sharing/ajax/setpermissions.php
apps/files_sharing/ajax/share.php
apps/files_sharing/ajax/toggleresharing.php
apps/files_sharing/ajax/unshare.php
apps/files_sharing/ajax/userautocomplete.php
apps/files_sharing/js/settings.js
apps/files_sharing/js/share.js
apps/files_sharing/lib_share.php
apps/files_sharing/settings.php
apps/files_sharing/sharedstorage.php
apps/files_sharing/templates/settings.php
apps/files_versions/ajax/rollbackVersion.php
apps/files_versions/versions.php
apps/gallery/ajax/thumbnail.php
apps/gallery/appinfo/app.php
apps/gallery/appinfo/update.php
apps/gallery/appinfo/version
apps/gallery/css/styles.css
apps/gallery/index.php
apps/gallery/js/pictures.js
apps/gallery/l10n/ca.php
apps/gallery/l10n/cs_CZ.php
apps/gallery/l10n/de.php
apps/gallery/l10n/el.php
apps/gallery/l10n/es.php
apps/gallery/l10n/fi_FI.php
apps/gallery/l10n/fr.php
apps/gallery/l10n/it.php
apps/gallery/l10n/pl.php
apps/gallery/l10n/pt_PT.php
apps/gallery/l10n/ru.php
apps/gallery/l10n/sl.php
apps/gallery/l10n/sv.php
apps/gallery/l10n/th_TH.php
apps/gallery/l10n/tr.php
apps/gallery/l10n/zh_CN.php
apps/gallery/lib/album.php
apps/gallery/lib/hooks_handlers.php
apps/gallery/lib/managers.php
apps/gallery/lib/photo.php
apps/gallery/lib/tiles.php
apps/gallery/lib/tiles_test.php
apps/gallery/templates/index.php
apps/media/lib_ampache.php
apps/media/lib_collection.php
apps/media/lib_media.php
apps/remoteStorage/lib_remoteStorage.php
apps/tasks/ajax/addtaskform.php
apps/tasks/ajax/edittask.php
apps/user_ldap/appinfo/update.php
apps/user_ldap/group_ldap.php
apps/user_ldap/lib_ldap.php
apps/user_ldap/settings.php
apps/user_ldap/templates/settings.php
apps/user_ldap/user_ldap.php
apps/user_migrate/appinfo/app.php
apps/user_migrate/templates/settings.php
apps/user_webfinger/host-meta.php
config/config.sample.php
core/js/js.js
core/l10n/da.php
core/l10n/de.php
core/l10n/fi_FI.php
core/l10n/gl.php
core/l10n/he.php
core/l10n/hr.php
core/l10n/id.php
core/l10n/ja_JP.php
core/l10n/lb.php
core/l10n/lt_LT.php
core/l10n/nb_NO.php
core/l10n/pl.php
core/l10n/pt_PT.php
core/l10n/ro.php
core/l10n/ru.php
core/l10n/sv.php
core/lostpassword/index.php
core/templates/layout.user.php
core/templates/login.php
db_structure.xml
index.php
l10n/af/calendar.po
l10n/af/contacts.po
l10n/af/core.po
l10n/af/files.po
l10n/af/settings.po
l10n/ar/calendar.po
l10n/ar/contacts.po
l10n/ar/core.po
l10n/ar/files.po
l10n/ar/media.po
l10n/ar/settings.po
l10n/bg_BG/calendar.po
l10n/bg_BG/contacts.po
l10n/bg_BG/core.po
l10n/bg_BG/files.po
l10n/bg_BG/media.po
l10n/bg_BG/settings.po
l10n/ca/calendar.po
l10n/ca/contacts.po
l10n/ca/core.po
l10n/ca/files.po
l10n/ca/gallery.po
l10n/ca/settings.po
l10n/cs_CZ/calendar.po
l10n/cs_CZ/contacts.po
l10n/cs_CZ/core.po
l10n/cs_CZ/files.po
l10n/cs_CZ/gallery.po
l10n/cs_CZ/settings.po
l10n/da/calendar.po
l10n/da/contacts.po
l10n/da/core.po
l10n/da/files.po
l10n/da/settings.po
l10n/de/calendar.po
l10n/de/contacts.po
l10n/de/core.po
l10n/de/files.po
l10n/de/gallery.po
l10n/de/settings.po
l10n/el/calendar.po
l10n/el/contacts.po
l10n/el/core.po
l10n/el/files.po
l10n/el/gallery.po
l10n/el/settings.po
l10n/eo/calendar.po
l10n/eo/contacts.po
l10n/eo/core.po
l10n/eo/files.po
l10n/eo/media.po
l10n/eo/settings.po
l10n/es/calendar.po
l10n/es/contacts.po
l10n/es/core.po
l10n/es/files.po
l10n/es/gallery.po
l10n/es/settings.po
l10n/et_EE/calendar.po
l10n/et_EE/contacts.po
l10n/et_EE/core.po
l10n/et_EE/files.po
l10n/et_EE/settings.po
l10n/eu/calendar.po
l10n/eu/contacts.po
l10n/eu/core.po
l10n/eu/files.po
l10n/eu/settings.po
l10n/fa/calendar.po
l10n/fa/contacts.po
l10n/fa/core.po
l10n/fa/files.po
l10n/fa/settings.po
l10n/fi_FI/calendar.po
l10n/fi_FI/contacts.po
l10n/fi_FI/core.po
l10n/fi_FI/files.po
l10n/fi_FI/gallery.po
l10n/fi_FI/settings.po
l10n/fr/calendar.po
l10n/fr/contacts.po
l10n/fr/core.po
l10n/fr/files.po
l10n/fr/gallery.po
l10n/fr/media.po
l10n/fr/settings.po
l10n/gl/calendar.po
l10n/gl/contacts.po
l10n/gl/core.po
l10n/gl/files.po
l10n/gl/settings.po
l10n/he/calendar.po
l10n/he/contacts.po
l10n/he/core.po
l10n/he/files.po
l10n/he/settings.po
l10n/hr/calendar.po
l10n/hr/contacts.po
l10n/hr/core.po
l10n/hr/files.po
l10n/hr/settings.po
l10n/hu_HU/calendar.po
l10n/hu_HU/contacts.po
l10n/hu_HU/core.po
l10n/hu_HU/files.po
l10n/hu_HU/settings.po
l10n/hy/calendar.po
l10n/hy/contacts.po
l10n/hy/core.po
l10n/hy/files.po
l10n/hy/settings.po
l10n/ia/calendar.po
l10n/ia/contacts.po
l10n/ia/core.po
l10n/ia/files.po
l10n/ia/settings.po
l10n/id/calendar.po
l10n/id/contacts.po
l10n/id/core.po
l10n/id/files.po
l10n/id/settings.po
l10n/it/calendar.po
l10n/it/contacts.po
l10n/it/core.po
l10n/it/files.po
l10n/it/gallery.po
l10n/it/settings.po
l10n/ja_JP/calendar.po
l10n/ja_JP/contacts.po
l10n/ja_JP/core.po
l10n/ja_JP/files.po
l10n/ja_JP/settings.po
l10n/ko/calendar.po
l10n/ko/contacts.po
l10n/ko/core.po
l10n/ko/files.po
l10n/ko/settings.po
l10n/lb/calendar.po
l10n/lb/contacts.po
l10n/lb/core.po
l10n/lb/files.po
l10n/lb/settings.po
l10n/lt_LT/calendar.po
l10n/lt_LT/contacts.po
l10n/lt_LT/core.po
l10n/lt_LT/files.po
l10n/lt_LT/settings.po
l10n/mk/calendar.po
l10n/mk/contacts.po
l10n/mk/core.po
l10n/mk/files.po
l10n/mk/settings.po
l10n/ms_MY/calendar.po
l10n/ms_MY/contacts.po
l10n/ms_MY/core.po
l10n/ms_MY/files.po
l10n/ms_MY/settings.po
l10n/nb_NO/calendar.po
l10n/nb_NO/contacts.po
l10n/nb_NO/core.po
l10n/nb_NO/files.po
l10n/nb_NO/settings.po
l10n/nl/calendar.po
l10n/nl/contacts.po
l10n/nl/core.po
l10n/nl/files.po
l10n/nl/settings.po
l10n/nn_NO/calendar.po
l10n/nn_NO/contacts.po
l10n/nn_NO/core.po
l10n/nn_NO/files.po
l10n/nn_NO/settings.po
l10n/pl/calendar.po
l10n/pl/contacts.po
l10n/pl/core.po
l10n/pl/files.po
l10n/pl/gallery.po
l10n/pl/settings.po
l10n/pt_BR/calendar.po
l10n/pt_BR/contacts.po
l10n/pt_BR/core.po
l10n/pt_BR/files.po
l10n/pt_BR/settings.po
l10n/pt_PT/calendar.po
l10n/pt_PT/contacts.po
l10n/pt_PT/core.po
l10n/pt_PT/files.po
l10n/pt_PT/gallery.po
l10n/pt_PT/settings.po
l10n/ro/calendar.po
l10n/ro/contacts.po
l10n/ro/core.po
l10n/ro/files.po
l10n/ro/settings.po
l10n/ru/calendar.po
l10n/ru/contacts.po
l10n/ru/core.po
l10n/ru/files.po
l10n/ru/gallery.po
l10n/ru/settings.po
l10n/sk_SK/calendar.po
l10n/sk_SK/contacts.po
l10n/sk_SK/core.po
l10n/sk_SK/files.po
l10n/sk_SK/settings.po
l10n/sl/calendar.po
l10n/sl/contacts.po
l10n/sl/core.po
l10n/sl/files.po
l10n/sl/gallery.po
l10n/sl/settings.po
l10n/sr/calendar.po
l10n/sr/contacts.po
l10n/sr/core.po
l10n/sr/files.po
l10n/sr/settings.po
l10n/sr@latin/calendar.po
l10n/sr@latin/contacts.po
l10n/sr@latin/core.po
l10n/sr@latin/files.po
l10n/sr@latin/settings.po
l10n/sv/calendar.po
l10n/sv/contacts.po
l10n/sv/core.po
l10n/sv/files.po
l10n/sv/gallery.po
l10n/sv/media.po
l10n/sv/settings.po
l10n/templates/bookmarks.pot
l10n/templates/calendar.pot
l10n/templates/contacts.pot
l10n/templates/core.pot
l10n/templates/files.pot
l10n/templates/gallery.pot
l10n/templates/media.pot
l10n/templates/settings.pot
l10n/th_TH/calendar.po
l10n/th_TH/contacts.po
l10n/th_TH/core.po
l10n/th_TH/files.po
l10n/th_TH/gallery.po
l10n/th_TH/settings.po
l10n/tr/calendar.po
l10n/tr/contacts.po
l10n/tr/core.po
l10n/tr/files.po
l10n/tr/gallery.po
l10n/tr/settings.po
l10n/uk/calendar.po
l10n/uk/contacts.po
l10n/uk/core.po
l10n/uk/files.po
l10n/uk/media.po
l10n/uk/settings.po
l10n/zh_CN/calendar.po
l10n/zh_CN/contacts.po
l10n/zh_CN/core.po
l10n/zh_CN/files.po
l10n/zh_CN/gallery.po
l10n/zh_CN/settings.po
l10n/zh_TW/calendar.po
l10n/zh_TW/contacts.po
l10n/zh_TW/core.po
l10n/zh_TW/files.po
l10n/zh_TW/settings.po
lib/app.php
lib/base.php
lib/connector/sabre/file.php
lib/connector/sabre/locks.php
lib/connector/sabre/node.php
lib/db.php
lib/filecache.php
lib/fileproxy/quota.php
lib/files.php
lib/filestorage/local.php
lib/filesystemview.php
lib/group/database.php
lib/helper.php
lib/installer.php
lib/json.php
lib/l10n.php
lib/migrate.php
lib/mimetypes.fixlist.php
lib/ocs.php
lib/preferences.php
lib/public/json.php
lib/public/util.php
lib/template.php
lib/user.php
lib/user/database.php
lib/util.php
lib/vcategories.php
ocs/providers.php
settings/admin.php
settings/ajax/lostpassword.php
settings/ajax/removeuser.php
settings/ajax/setbackgroundjobsmode.php
settings/ajax/setlanguage.php
settings/ajax/setquota.php
settings/ajax/togglegroups.php
settings/apps.php
settings/css/settings.css
settings/js/apps.js
settings/js/users.js
settings/l10n/bg_BG.php
settings/l10n/ca.php
settings/l10n/cs_CZ.php
settings/l10n/da.php
settings/l10n/de.php
settings/l10n/el.php
settings/l10n/eo.php
settings/l10n/es.php
settings/l10n/et_EE.php
settings/l10n/eu.php
settings/l10n/fa.php
settings/l10n/fi_FI.php
settings/l10n/fr.php
settings/l10n/gl.php
settings/l10n/he.php
settings/l10n/hr.php
settings/l10n/hu_HU.php
settings/l10n/it.php
settings/l10n/ja_JP.php
settings/l10n/ko.php
settings/l10n/lt_LT.php
settings/l10n/mk.php
settings/l10n/ms_MY.php
settings/l10n/nb_NO.php
settings/l10n/nl.php
settings/l10n/nn_NO.php
settings/l10n/pl.php
settings/l10n/pt_BR.php
settings/l10n/pt_PT.php
settings/l10n/ru.php
settings/l10n/sk_SK.php
settings/l10n/sl.php
settings/l10n/sv.php
settings/l10n/th_TH.php
settings/l10n/tr.php
settings/l10n/zh_CN.php
settings/personal.php
settings/templates/admin.php
settings/templates/users.php
Diffstat (limited to 'apps/contacts')
135 files changed, 8262 insertions, 4907 deletions
diff --git a/apps/contacts/ajax/activation.php b/apps/contacts/ajax/activation.php deleted file mode 100644 index 74cb738ab8f..00000000000 --- a/apps/contacts/ajax/activation.php +++ /dev/null @@ -1,28 +0,0 @@ -<?php -/** - * Copyright (c) 2011 Thomas Tanghus <thomas@tanghus.net> - * Copyright (c) 2011 Bart Visscher <bartv@thisnet.nl> - * 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(); - -$bookid = $_POST['bookid']; -$book = OC_Contacts_App::getAddressbook($bookid);// is owner access check - -if(!OC_Contacts_Addressbook::setActive($bookid, $_POST['active'])) { - OCP\Util::writeLog('contacts','ajax/activation.php: Error activating addressbook: '.$bookid, OCP\Util::ERROR); - OCP\JSON::error(array('data' => array('message' => OC_Contacts_App::$l10n->t('Error (de)activating addressbook.')))); - exit(); -} - -OCP\JSON::success(array( - 'active' => OC_Contacts_Addressbook::isActive($bookid), - 'bookid' => $bookid, - 'book' => $book, -)); diff --git a/apps/contacts/ajax/addbook.php b/apps/contacts/ajax/addbook.php deleted file mode 100644 index 70f47cc8123..00000000000 --- a/apps/contacts/ajax/addbook.php +++ /dev/null @@ -1,20 +0,0 @@ -<?php -/** - * Copyright (c) 2011 Bart Visscher <bartv@thisnet.nl> - * 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'); -$book = array( - 'id' => 'new', - 'displayname' => '', -); -$tmpl = new OCP\Template('contacts', 'part.editaddressbook'); -$tmpl->assign('new', true); -$tmpl->assign('addressbook', $book); -$tmpl->printPage(); -?> diff --git a/apps/contacts/ajax/addressbook/activate.php b/apps/contacts/ajax/addressbook/activate.php new file mode 100644 index 00000000000..a8dec21dac7 --- /dev/null +++ b/apps/contacts/ajax/addressbook/activate.php @@ -0,0 +1,32 @@ +<?php +/** + * Copyright (c) 2011 Thomas Tanghus <thomas@tanghus.net> + * Copyright (c) 2011 Bart Visscher <bartv@thisnet.nl> + * 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(); + +$id = $_POST['id']; +$book = OC_Contacts_App::getAddressbook($id);// is owner access check + +if(!OC_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.')))); + exit(); +} + +OCP\JSON::success(array( + 'active' => OC_Contacts_Addressbook::isActive($id), + 'id' => $id, + 'addressbook' => $book, +)); diff --git a/apps/contacts/ajax/addressbook/add.php b/apps/contacts/ajax/addressbook/add.php new file mode 100644 index 00000000000..65077743ed5 --- /dev/null +++ b/apps/contacts/ajax/addressbook/add.php @@ -0,0 +1,37 @@ +<?php +/** + * Copyright (c) 2011-2012 Thomas Tanghus <thomas@tanghus.net> + * Copyright (c) 2011 Bart Visscher <bartv@thisnet.nl> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + + +// Check if we are a user +OCP\JSON::checkLoggedIn(); +OCP\JSON::checkAppEnabled('contacts'); +OCP\JSON::callCheck(); +require_once __DIR__.'/../loghandler.php'; + +debug('name: '.$_POST['name']); + +$userid = OCP\USER::getUser(); +$name = isset($_POST['name'])?trim(strip_tags($_POST['name'])):null; +$description = isset($_POST['description']) + ? trim(strip_tags($_POST['description'])) + : null; + +if(is_null($name)) { + bailOut('Cannot add addressbook with an empty name.'); +} +$bookid = OC_Contacts_Addressbook::add($userid, $name, $description); +if(!$bookid) { + bailOut('Error adding addressbook: '.$name); +} + +if(!OC_Contacts_Addressbook::setActive($bookid, 1)) { + bailOut('Error activating addressbook.'); +} +$addressbook = OC_Contacts_App::getAddressbook($bookid); +OCP\JSON::success(array('data' => array('addressbook' => $addressbook))); diff --git a/apps/contacts/ajax/deletebook.php b/apps/contacts/ajax/addressbook/delete.php index 4520374a23b..f59c605f4e4 100644 --- a/apps/contacts/ajax/deletebook.php +++ b/apps/contacts/ajax/addressbook/delete.php @@ -20,16 +20,16 @@ * */ -// Init owncloud - - // Check if we are a user OCP\JSON::checkLoggedIn(); OCP\JSON::checkAppEnabled('contacts'); OCP\JSON::callCheck(); +require_once __DIR__.'/../loghandler.php'; -//$id = $_GET['id']; $id = $_POST['id']; +if(!$id) { + bailOut(OC_Contacts_App::$l10n->t('id is not set.')); +} OC_Contacts_App::getAddressbook( $id ); // is owner access check OC_Contacts_Addressbook::delete($id); diff --git a/apps/contacts/ajax/addressbook/update.php b/apps/contacts/ajax/addressbook/update.php new file mode 100644 index 00000000000..0fc66c3a3bf --- /dev/null +++ b/apps/contacts/ajax/addressbook/update.php @@ -0,0 +1,39 @@ +<?php +/** + * Copyright (c) 2011-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. + */ + + + +// Check if we are a user +OCP\JSON::checkLoggedIn(); +OCP\JSON::checkAppEnabled('contacts'); +require_once __DIR__.'/../loghandler.php'; + +$id = $_POST['id']; +$name = trim(strip_tags($_POST['name'])); +$description = trim(strip_tags($_POST['description'])); +if(!$id) { + bailOut(OC_Contacts_App::$l10n->t('id is not set.')); +} + +if(!$name) { + bailOut(OC_Contacts_App::$l10n->t('Cannot update addressbook with an empty name.')); +} + +if(!OC_Contacts_Addressbook::edit($id, $name, $description)) { + bailOut(OC_Contacts_App::$l10n->t('Error updating addressbook.')); +} + +if(!OC_Contacts_Addressbook::setActive($id, $_POST['active'])) { + bailOut(OC_Contacts_App::$l10n->t('Error (de)activating addressbook.')); +} + +OC_Contacts_App::getAddressbook($id); // is owner access check +$addressbook = OC_Contacts_App::getAddressbook($id); +OCP\JSON::success(array( + 'addressbook' => $addressbook, +)); diff --git a/apps/contacts/ajax/categories/categoriesfor.php b/apps/contacts/ajax/categories/categoriesfor.php index 846af300de8..8391b14b545 100644 --- a/apps/contacts/ajax/categories/categoriesfor.php +++ b/apps/contacts/ajax/categories/categoriesfor.php @@ -12,17 +12,23 @@ OCP\JSON::checkAppEnabled('contacts'); $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')))); + OCP\JSON::error(array( + 'data' => array( + 'message' => OC_Contacts_App::$l10n->t('No ID provided')))); exit(); } $vcard = OC_Contacts_App::getContactVCard( $id ); foreach($vcard->children as $property){ - //OCP\Util::writeLog('contacts','ajax/categories/checksumfor.php: '.$property->name, OCP\Util::DEBUG); if($property->name == 'CATEGORIES') { $checksum = md5($property->serialize()); - OCP\JSON::success(array('data' => array('value'=>$property->value, 'checksum'=>$checksum))); + 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.')))); -?> +OCP\JSON::error(array( + 'data' => array( + 'message' => OC_Contacts_App::$l10n->t('Error setting checksum.')))); diff --git a/apps/contacts/ajax/categories/delete.php b/apps/contacts/ajax/categories/delete.php index bee2dbe3f6b..bc9f3e14e87 100644 --- a/apps/contacts/ajax/categories/delete.php +++ b/apps/contacts/ajax/categories/delete.php @@ -9,19 +9,9 @@ OCP\JSON::checkLoggedIn(); OCP\JSON::checkAppEnabled('contacts'); +OCP\JSON::callCheck(); -foreach ($_POST as $key=>$element) { - debug('_POST: '.$key.'=>'.print_r($element, true)); -} - -function bailOut($msg) { - OCP\JSON::error(array('data' => array('message' => $msg))); - OCP\Util::writeLog('contacts','ajax/categories/delete.php: '.$msg, OCP\Util::DEBUG); - exit(); -} -function debug($msg) { - OCP\Util::writeLog('contacts','ajax/categories/delete.php: '.$msg, OCP\Util::DEBUG); -} +require_once __DIR__.'/../loghandler.php'; $categories = isset($_POST['categories'])?$_POST['categories']:null; @@ -56,5 +46,3 @@ $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()))); - -?> diff --git a/apps/contacts/ajax/categories/list.php b/apps/contacts/ajax/categories/list.php index 3ae7635390c..f234116ba8c 100644 --- a/apps/contacts/ajax/categories/list.php +++ b/apps/contacts/ajax/categories/list.php @@ -13,5 +13,3 @@ OCP\JSON::checkAppEnabled('contacts'); $categories = OC_Contacts_App::getCategories(); OCP\JSON::success(array('data' => array('categories'=>$categories))); - -?> diff --git a/apps/contacts/ajax/categories/rescan.php b/apps/contacts/ajax/categories/rescan.php index 84a67dec0b1..a06e7803955 100644 --- a/apps/contacts/ajax/categories/rescan.php +++ b/apps/contacts/ajax/categories/rescan.php @@ -9,36 +9,9 @@ OCP\JSON::checkLoggedIn(); OCP\JSON::checkAppEnabled('contacts'); +OCP\JSON::callCheck(); -foreach ($_POST as $key=>$element) { - debug('_POST: '.$key.'=>'.print_r($element, true)); -} - -function bailOut($msg) { - OCP\JSON::error(array('data' => array('message' => $msg))); - OCP\Util::writeLog('contacts','ajax/categories/rescan.php: '.$msg, OCP\Util::DEBUG); - exit(); -} -function debug($msg) { - OCP\Util::writeLog('contacts','ajax/categories/rescan.php: '.$msg, OCP\Util::DEBUG); -} - -$addressbooks = OC_Contacts_Addressbook::all(OCP\USER::getUser()); -if(count($addressbooks) == 0) { - bailOut(OC_Contacts_App::$l10n->t('No address books found.')); -} -$addressbookids = array(); -foreach($addressbooks as $addressbook) { - $addressbookids[] = $addressbook['id']; -} -$contacts = OC_Contacts_VCard::all($addressbookids); -if(count($contacts) == 0) { - bailOut(OC_Contacts_App::$l10n->t('No contacts found.')); -} - -OC_Contacts_App::scanCategories($contacts); +OC_Contacts_App::scanCategories(); $categories = OC_Contacts_App::getCategories(); OCP\JSON::success(array('data' => array('categories'=>$categories))); - -?> diff --git a/apps/contacts/ajax/chooseaddressbook.php b/apps/contacts/ajax/chooseaddressbook.php deleted file mode 100644 index 9088a4e9d7d..00000000000 --- a/apps/contacts/ajax/chooseaddressbook.php +++ /dev/null @@ -1,14 +0,0 @@ -<?php -/** - * Copyright (c) 2011 Thomas Tanghus <thomas@tanghus.net> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); - -$output = new OCP\Template("contacts", "part.chooseaddressbook"); -$output -> printpage(); diff --git a/apps/contacts/ajax/addcontact.php b/apps/contacts/ajax/contact/add.php index d15ad8c6216..c7cec7d9461 100644 --- a/apps/contacts/ajax/addcontact.php +++ b/apps/contacts/ajax/contact/add.php @@ -20,14 +20,6 @@ * */ -// Init owncloud - -function bailOut($msg) { - OCP\JSON::error(array('data' => array('message' => $msg))); - OCP\Util::writeLog('contacts','ajax/addcontact.php: '.$msg, OCP\Util::DEBUG); - exit(); -} - // Check if we are a user OCP\JSON::checkLoggedIn(); OCP\JSON::checkAppEnabled('contacts'); @@ -45,14 +37,26 @@ $n = trim($_POST['n']); $vcard = new OC_VObject('VCARD'); $vcard->setUID(); -$vcard->setString('FN',$fn); -$vcard->setString('N',$n); +$vcard->setString('FN', $fn); +$vcard->setString('N', $n); -$id = OC_Contacts_VCard::add($aid,$vcard, null, $isnew); +$id = OC_Contacts_VCard::add($aid, $vcard, null, $isnew); if(!$id) { - OCP\JSON::error(array('data' => array('message' => OC_Contacts_App::$l10n->t('There was an error adding the contact.')))); - OCP\Util::writeLog('contacts','ajax/addcontact.php: Recieved non-positive ID on adding card: '.$id, OCP\Util::ERROR); + OCP\JSON::error(array( + 'data' => array( + 'message' => OC_Contacts_App::$l10n->t('There was an error adding the contact.')))); + OCP\Util::writeLog('contacts', 'ajax/addcontact.php: Recieved non-positive ID on adding card: '.$id, OCP\Util::ERROR); exit(); } -OCP\JSON::success(array('data' => array( 'id' => $id ))); +$lastmodified = OC_Contacts_App::lastModified($vcard); +if(!$lastmodified) { + $lastmodified = new DateTime(); +} +OCP\JSON::success(array( + 'data' => array( + 'id' => $id, + 'aid' => $aid, + 'lastmodified' => $lastmodified->format('U') + ) +)); diff --git a/apps/contacts/ajax/addproperty.php b/apps/contacts/ajax/contact/addproperty.php index be9e849be72..2b80ebd58bf 100644 --- a/apps/contacts/ajax/addproperty.php +++ b/apps/contacts/ajax/contact/addproperty.php @@ -20,19 +20,12 @@ * */ -// Init owncloud - - // Check if we are a user OCP\JSON::checkLoggedIn(); OCP\JSON::checkAppEnabled('contacts'); OCP\JSON::callCheck(); -function bailOut($msg) { - OCP\JSON::error(array('data' => array('message' => $msg))); - OCP\Util::writeLog('contacts','ajax/addproperty.php: '.$msg, OCP\Util::DEBUG); - exit(); -} +require_once __DIR__.'/../loghandler.php'; $id = isset($_POST['id'])?$_POST['id']:null; $name = isset($_POST['name'])?$_POST['name']:null; @@ -40,22 +33,27 @@ $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(OC_Contacts_App::$l10n->t('element name is not set.')); + bailOut($l10n->t('element name is not set.')); } if(!$id) { - bailOut(OC_Contacts_App::$l10n->t('id is not set.')); + bailOut($l10n->t('id is not set.')); } if(!$vcard) { - bailOut(OC_Contacts_App::$l10n->t('Could not parse contact: ').$id); + bailOut($l10n->t('Could not parse contact: ').$id); } -if(!is_array($value)){ +if(!is_array($value)) { $value = trim($value); - if(!$value && in_array($name, array('TEL', 'EMAIL', 'ORG', 'BDAY', 'URL', 'NICKNAME', 'NOTE'))) { - bailOut(OC_Contacts_App::$l10n->t('Cannot add empty property.')); + 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; @@ -66,7 +64,7 @@ if(!is_array($value)){ } } if($empty) { - bailOut(OC_Contacts_App::$l10n->t('At least one of the address fields has to be filled out.')); + bailOut($l10n->t('At least one of the address fields has to be filled out.')); } } @@ -75,12 +73,14 @@ $current = $vcard->select($name); foreach($current as $item) { $tmpvalue = (is_array($value)?implode(';', $value):$value); if($tmpvalue == $item->value) { - bailOut(OC_Contacts_App::$l10n->t('Trying to add duplicate property: '.$name.': '.$tmpvalue)); + bailOut($l10n->t('Trying to add duplicate property: '.$name.': '.$tmpvalue)); } } if(is_array($value)) { - ksort($value); // NOTE: Important, otherwise the compound value will be set in the order the fields appear in the form! + // 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); @@ -108,7 +108,17 @@ switch($name) { $value = strtolower($value); break; case 'TEL': - case 'ADR': // should I delete the property if empty or throw an error? + 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; } @@ -123,24 +133,36 @@ switch($name) { $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. +// 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') { + 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)){ - $vcard->children[$line]->parameters[] = new Sabre_VObject_Parameter($key,$e); + foreach($element as $e) { + if($e != '' && !is_null($e)) { + if(trim($e)) { + $vcard->children[$line]->parameters[] = new Sabre_VObject_Parameter($key, $e); + } } } } else { - $vcard->children[$line]->parameters[] = new Sabre_VObject_Parameter($key,$element); + if(trim($element)) { + $vcard->children[$line]->parameters[] = new Sabre_VObject_Parameter($key, $element); + } } } $checksum = md5($vcard->children[$line]->serialize()); -if(!OC_Contacts_VCard::edit($id,$vcard)) { - bailOut(OC_Contacts_App::$l10n->t('Error adding contact property: '.$name)); +try { + OC_Contacts_VCard::edit($id, $vcard); +} catch(Exception $e) { + bailOut($e->getMessage()); } -OCP\JSON::success(array('data' => array( 'checksum' => $checksum ))); +OCP\JSON::success(array( + 'data' => array( + 'checksum' => $checksum, + 'lastmodified' => OC_Contacts_App::lastModified($vcard)->format('U')) + ) +); diff --git a/apps/contacts/ajax/deletecard.php b/apps/contacts/ajax/contact/delete.php index f998185be41..e73f34f898d 100644 --- a/apps/contacts/ajax/deletecard.php +++ b/apps/contacts/ajax/contact/delete.php @@ -4,6 +4,7 @@ * * @author Jakob Sack * @copyright 2011 Jakob Sack mail@jakobsack.de + * @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 @@ -19,25 +20,25 @@ * License along with this library. If not, see <http://www.gnu.org/licenses/>. * */ -function bailOut($msg) { - OCP\JSON::error(array('data' => array('message' => $msg))); - OCP\Util::writeLog('contacts','ajax/saveproperty.php: '.$msg, OCP\Util::DEBUG); - exit(); -} - -// Init owncloud - - // 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; if(!$id) { bailOut(OC_Contacts_App::$l10n->t('id is not set.')); } -$card = OC_Contacts_App::getContactObject( $id ); -OC_Contacts_VCard::delete($id); +try { + OC_Contacts_VCard::delete($id); +} catch(Exception $e) { + $msg = $e->getMessage(); + OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$msg, + OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', __METHOD__.', id'.$id, OCP\Util::DEBUG); + bailOut($msg); +} OCP\JSON::success(array('data' => array( 'id' => $id ))); diff --git a/apps/contacts/ajax/deleteproperty.php b/apps/contacts/ajax/contact/deleteproperty.php index 95fd43e0d95..b76b6e55ede 100644 --- a/apps/contacts/ajax/deleteproperty.php +++ b/apps/contacts/ajax/contact/deleteproperty.php @@ -20,30 +20,35 @@ * */ -// Init owncloud - - // Check if we are a user OCP\JSON::checkLoggedIn(); OCP\JSON::checkAppEnabled('contacts'); OCP\JSON::callCheck(); +require_once __DIR__.'/../loghandler.php'; + $id = $_POST['id']; $checksum = $_POST['checksum']; +$l10n = OC_Contacts_App::$l10n; $vcard = OC_Contacts_App::getContactVCard( $id ); $line = OC_Contacts_App::getPropertyLineByChecksum($vcard, $checksum); -if(is_null($line)){ - OCP\JSON::error(array('data' => array( 'message' => OC_Contacts_App::$l10n->t('Information about vCard is incorrect. Please reload the page.')))); +if(is_null($line)) { + bailOut($l10n->t('Information about vCard is incorrect. Please reload the page.')); exit(); } unset($vcard->children[$line]); -if(!OC_Contacts_VCard::edit($id,$vcard)) { - OCP\JSON::error(array('data' => array('message' => OC_Contacts_App::$l10n->t('Error deleting contact property.')))); - OCP\Util::writeLog('contacts','ajax/deleteproperty.php: Error deleting contact property', OCP\Util::ERROR); - exit(); +try { + OC_Contacts_VCard::edit($id, $vcard); +} catch(Exception $e) { + bailOut($e->getMessage()); } -OCP\JSON::success(array('data' => array( 'id' => $id ))); +OCP\JSON::success(array( + 'data' => array( + 'id' => $id, + 'lastmodified' => OC_Contacts_App::lastModified($vcard)->format('U'), + ) +)); diff --git a/apps/contacts/ajax/contactdetails.php b/apps/contacts/ajax/contact/details.php index 657dc5d586c..5bf337e645e 100644 --- a/apps/contacts/ajax/contactdetails.php +++ b/apps/contacts/ajax/contact/details.php @@ -20,13 +20,7 @@ * */ -// Init owncloud - -function bailOut($msg) { - OCP\JSON::error(array('data' => array('message' => $msg))); - OCP\Util::writeLog('contacts','ajax/contactdetails.php: '.$msg, OCP\Util::DEBUG); - exit(); -} +require_once __DIR__.'/../loghandler.php'; // Check if we are a user OCP\JSON::checkLoggedIn(); @@ -36,24 +30,13 @@ $id = isset($_GET['id'])?$_GET['id']:null; if(is_null($id)) { bailOut(OC_Contacts_App::$l10n->t('Missing ID')); } -$vcard = OC_Contacts_App::getContactVCard( $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); -// Some Google exported files have no FN field. -/*if(!isset($details['FN'])) { - $fn = ''; - if(isset($details['N'])) { - $details['FN'] = array(implode(' ', $details['N'][0]['value'])); - } elseif(isset($details['EMAIL'])) { - $details['FN'] = array('value' => $details['EMAIL'][0]['value']); - } else { - $details['FN'] = array('value' => OC_Contacts_App::$l10n->t('Unknown')); - } -}*/ - // Make up for not supporting the 'N' field in earlier version. if(!isset($details['N'])) { $details['N'] = array(); @@ -67,6 +50,13 @@ if(isset($details['PHOTO'])) { } else { $details['PHOTO'] = false; } +$lastmodified = OC_Contacts_App::lastModified($vcard); +if(!$lastmodified) { + $lastmodified = new DateTime(); +} $details['id'] = $id; +$details['displayname'] = $card['fullname']; +$details['addressbookid'] = $card['addressbookid']; +$details['lastmodified'] = $lastmodified->format('U'); OC_Contacts_App::setLastModifiedHeader($vcard); OCP\JSON::success(array('data' => $details)); diff --git a/apps/contacts/ajax/contact/list.php b/apps/contacts/ajax/contact/list.php new file mode 100644 index 00000000000..4e2509d8d5a --- /dev/null +++ b/apps/contacts/ajax/contact/list.php @@ -0,0 +1,97 @@ +<?php +/** + * Copyright (c) 2011 Thomas Tanghus <thomas@tanghus.net> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +function cmp($a, $b) +{ + if ($a['displayname'] == $b['displayname']) { + return 0; + } + return ($a['displayname'] < $b['displayname']) ? -1 : 1; +} + +OCP\JSON::checkLoggedIn(); +OCP\JSON::checkAppEnabled('contacts'); + +$start = isset($_GET['startat'])?$_GET['startat']:0; +$aid = isset($_GET['aid'])?$_GET['aid']:null; + +if(is_null($aid)) { + // Called initially to get the active addressbooks. + $active_addressbooks = OC_Contacts_Addressbook::active(OCP\USER::getUser()); +} else { + // called each time more contacts has to be shown. + $active_addressbooks = array(OC_Contacts_Addressbook::find($aid)); +} + + +session_write_close(); + +// create the addressbook associate array +$contacts_addressbook = array(); +$ids = array(); +foreach($active_addressbooks as $addressbook) { + $ids[] = $addressbook['id']; + if(!isset($contacts_addressbook[$addressbook['id']])) { + $contacts_addressbook[$addressbook['id']] + = array('contacts' => array('type' => 'book',)); + $contacts_addressbook[$addressbook['id']]['displayname'] + = $addressbook['displayname']; + $contacts_addressbook[$addressbook['id']]['permissions'] + = isset($addressbook['permissions']) + ? $addressbook['permissions'] + : '0'; + } +} + +$contacts_alphabet = array(); + +// get next 50 for each addressbook. +foreach($ids as $id) { + if($id) { + $contacts_alphabet = array_merge( + $contacts_alphabet, + OC_Contacts_VCard::all($id, $start, 50) + ); + } +} +// Our new array for the contacts sorted by addressbook +if($contacts_alphabet) { + foreach($contacts_alphabet as $contact) { + // This should never execute. + 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']); + if(!is_null($vcard)) { + $struct = OC_Contacts_VCard::structureContact($vcard); + $display = isset($struct['EMAIL'][0]) + ? $struct['EMAIL'][0]['value'] + : '[UNKNOWN]'; + } + } + $contacts_addressbook[$contact['addressbookid']]['contacts'][] = array( + 'type' => 'contact', + 'id' => $contact['id'], + 'addressbookid' => $contact['addressbookid'], + 'displayname' => htmlspecialchars($display), + 'permissions' => + isset($contacts_addressbook[$contact['addressbookid']]['permissions']) + ? $contacts_addressbook[$contact['addressbookid']]['permissions'] + : '0', + ); + } +} +unset($contacts_alphabet); +uasort($contacts_addressbook, 'cmp'); + +OCP\JSON::success(array('data' => array('entries' => $contacts_addressbook))); + diff --git a/apps/contacts/ajax/contact/move.php b/apps/contacts/ajax/contact/move.php new file mode 100644 index 00000000000..053343c47ed --- /dev/null +++ b/apps/contacts/ajax/contact/move.php @@ -0,0 +1,29 @@ +<?php +/** +* @author Victor Dubiniuk +* Copyright (c) 2012 Victor Dubiniuk <victor.dubiniuk@gmail.com> +* 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(); + +$id = intval($_POST['id']); +$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); +} catch (Exception $e) { + $msg = $e->getMessage(); + OCP\Util::writeLog('contacts', 'Error moving contacts "'.implode(',', $id).'" to addressbook "'.$aid.'"'.$msg, OCP\Util::ERROR); + OC_JSON::error(array('data' => array('message' => $msg,))); +} + +OC_JSON::success(array('data' => array('ids' => $id,)));
\ No newline at end of file diff --git a/apps/contacts/ajax/saveproperty.php b/apps/contacts/ajax/contact/saveproperty.php index a27b5489ce6..7ae183538b6 100644 --- a/apps/contacts/ajax/saveproperty.php +++ b/apps/contacts/ajax/contact/saveproperty.php @@ -20,37 +20,17 @@ * */ -// Init owncloud - +require_once __DIR__.'/../loghandler.php'; // Check if we are a user OCP\JSON::checkLoggedIn(); OCP\JSON::checkAppEnabled('contacts'); OCP\JSON::callCheck(); - -function bailOut($msg) { - OCP\JSON::error(array('data' => array('message' => $msg))); - OCP\Util::writeLog('contacts','ajax/saveproperty.php: '.$msg, OCP\Util::DEBUG); - exit(); -} -function debug($msg) { - OCP\Util::writeLog('contacts','ajax/saveproperty.php: '.$msg, OCP\Util::DEBUG); -} -// foreach ($_POST as $key=>$element) { -// debug('_POST: '.$key.'=>'.print_r($element, true)); -// } - $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; -// if(!is_null($parameters)) { -// debug('parameters: '.count($parameters)); -// foreach($parameters as $key=>$val ) { -// debug('parameter: '.$key.'=>'.implode('/',$val)); -// } -// } if(!$name) { bailOut(OC_Contacts_App::$l10n->t('element name is not set.')); @@ -61,9 +41,11 @@ if(!$id) { if(!$checksum) { bailOut(OC_Contacts_App::$l10n->t('checksum is not set.')); } -if(is_array($value)){ +if(is_array($value)) { $value = array_map('strip_tags', $value); - ksort($value); // NOTE: Important, otherwise the compound value will be set in the order the fields appear in the form! + // NOTE: Important, otherwise the compound value will be + // set in the order the fields appear in the form! + ksort($value); //if($name == 'CATEGORIES') { // $value = OC_Contacts_VCard::escapeDelimiters($value, ','); //} else { @@ -76,19 +58,22 @@ if(is_array($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); + bailOut(OC_Contacts_App::$l10n->t( + 'Information about vCard is incorrect. Please reload the page: ').$checksum + ); } $element = $vcard->children[$line]->name; if($element != $name) { - bailOut(OC_Contacts_App::$l10n->t('Something went FUBAR. ').$name.' != '.$element); + bailOut(OC_Contacts_App::$l10n->t( + 'Something went FUBAR. ').$name.' != '.$element + ); } /* preprocessing value */ switch($element) { case 'BDAY': $date = New DateTime($value); - //$vcard->setDateTime('BDAY', $date, Sabre_VObject_Element_DateTime::DATE); $value = $date->format('Y-m-d'); break; case 'FN': @@ -103,6 +88,16 @@ switch($element) { case 'EMAIL': $value = strtolower($value); 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; } if(!$value) { @@ -112,28 +107,23 @@ if(!$value) { /* 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. + // 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')); + $vcard->children[$line]->add( + new Sabre_VObject_Parameter('VALUE', 'DATE') + ); debug('Setting value:'.$name.' '.$vcard->children[$line]); break; - case 'FN': - case 'N': - case 'ORG': - case 'NOTE': - case 'NICKNAME': - debug('Setting string:'.$name.' '.$value); - $vcard->setString($name, $value); - break; case 'CATEGORIES': debug('Setting string:'.$name.' '.$value); $vcard->children[$line]->setValue($value); break; case 'EMAIL': case 'TEL': - case 'ADR': // should I delete the property if empty or throw an error? + case 'ADR': + case 'IMPP': debug('Setting element: (EMAIL/TEL/ADR)'.$element); $vcard->children[$line]->setValue($value); $vcard->children[$line]->parameters = array(); @@ -141,22 +131,46 @@ if(!$value) { debug('Setting parameters: '.$parameters); foreach($parameters as $key => $parameter) { debug('Adding parameter: '.$key); - foreach($parameter as $val) { - debug('Adding parameter: '.$key.'=>'.$val); - $vcard->children[$line]->add(new Sabre_VObject_Parameter($key, strtoupper(strip_tags($val)))); + 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))) + ); + } } } } break; + default: + debug('Setting string:'.$name.' '.$value); + $vcard->setString($name, $value); + break; } // Do checksum and be happy $checksum = md5($vcard->children[$line]->serialize()); } //debug('New checksum: '.$checksum); -if(!OC_Contacts_VCard::edit($id,$vcard)) { - bailOut(OC_Contacts_App::$l10n->t('Error updating contact property.')); - exit(); +try { + OC_Contacts_VCard::edit($id, $vcard); +} catch(Exception $e) { + bailOut($e->getMessage()); } -OCP\JSON::success(array('data' => array( 'line' => $line, 'checksum' => $checksum, 'oldchecksum' => $_POST['checksum'] ))); +OCP\JSON::success(array('data' => array( + 'line' => $line, + 'checksum' => $checksum, + 'oldchecksum' => $_POST['checksum'], + 'lastmodified' => OC_Contacts_App::lastModified($vcard)->format('U'), +))); diff --git a/apps/contacts/ajax/contacts.php b/apps/contacts/ajax/contacts.php deleted file mode 100644 index 45c54f90bce..00000000000 --- a/apps/contacts/ajax/contacts.php +++ /dev/null @@ -1,27 +0,0 @@ -<?php -/** - * Copyright (c) 2011 Thomas Tanghus <thomas@tanghus.net> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); - -$ids = OC_Contacts_Addressbook::activeIds(OCP\USER::getUser()); -$allcontacts = OC_Contacts_VCard::all($ids); -$contacts = array(); -foreach($allcontacts as $contact) { // try to conserve some memory - $contacts[] = array('id' => $contact['id'], 'addressbookid' => $contact['addressbookid'], 'fullname' => $contact['fullname']); -} -unset($allcontacts); -$addressbooks = OC_Contacts_Addressbook::active(OCP\USER::getUser()); - -$tmpl = new OCP\Template("contacts", "part.contacts"); -$tmpl->assign('contacts', $contacts); -$page = $tmpl->fetchPage(); - -OCP\JSON::success(array('data' => array( 'page' => $page ))); -?> diff --git a/apps/contacts/ajax/createaddressbook.php b/apps/contacts/ajax/createaddressbook.php deleted file mode 100644 index 616766bb1a0..00000000000 --- a/apps/contacts/ajax/createaddressbook.php +++ /dev/null @@ -1,41 +0,0 @@ -<?php -/** - * Copyright (c) 2011-2012 Thomas Tanghus <thomas@tanghus.net> - * Copyright (c) 2011 Bart Visscher <bartv@thisnet.nl> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); - -$userid = OCP\USER::getUser(); -$name = trim(strip_tags($_POST['name'])); -if(!$name) { - OCP\JSON::error(array('data' => array('message' => OC_Contacts_App::$l10n->t('Cannot add addressbook with an empty name.')))); - OCP\Util::writeLog('contacts','ajax/createaddressbook.php: Cannot add addressbook with an empty name: '.strip_tags($_POST['name']), OCP\Util::ERROR); - exit(); -} -$bookid = OC_Contacts_Addressbook::add($userid, $name, null); -if(!$bookid) { - OCP\JSON::error(array('data' => array('message' => OC_Contacts_App::$l10n->t('Error adding addressbook.')))); - OCP\Util::writeLog('contacts','ajax/createaddressbook.php: Error adding addressbook: '.$_POST['name'], OCP\Util::ERROR); - exit(); -} - -if(!OC_Contacts_Addressbook::setActive($bookid, 1)) { - OCP\JSON::error(array('data' => array('message' => OC_Contacts_App::$l10n->t('Error activating addressbook.')))); - OCP\Util::writeLog('contacts','ajax/createaddressbook.php: Error activating addressbook: '.$bookid, OCP\Util::ERROR); - //exit(); -} -$addressbook = OC_Contacts_App::getAddressbook($bookid); -$tmpl = new OCP\Template('contacts', 'part.chooseaddressbook.rowfields'); -$tmpl->assign('addressbook', $addressbook); -OCP\JSON::success(array( - 'page' => $tmpl->fetchPage(), - 'addressbook' => $addressbook, -)); diff --git a/apps/contacts/ajax/cropphoto.php b/apps/contacts/ajax/cropphoto.php index 7006c6fc1ff..eb9f1fcdb5d 100644 --- a/apps/contacts/ajax/cropphoto.php +++ b/apps/contacts/ajax/cropphoto.php @@ -20,19 +20,15 @@ * */ -// Init owncloud - - // Check if we are a user OCP\JSON::checkLoggedIn(); OCP\JSON::checkAppEnabled('contacts'); -$tmp_path = strip_tags($_GET['tmp_path']); -$requesttoken = strip_tags($_GET['requesttoken']); +$tmpkey = $_GET['tmpkey']; +$requesttoken = $_GET['requesttoken']; $id = $_GET['id']; -OCP\Util::writeLog('contacts','ajax/cropphoto.php: tmp_path: '.$tmp_path.', exists: '.file_exists($tmp_path), OCP\Util::DEBUG); $tmpl = new OCP\Template("contacts", "part.cropphoto"); -$tmpl->assign('tmp_path', $tmp_path); +$tmpl->assign('tmpkey', $tmpkey); $tmpl->assign('id', $id); $tmpl->assign('requesttoken', $requesttoken); $page = $tmpl->fetchPage(); diff --git a/apps/contacts/ajax/currentphoto.php b/apps/contacts/ajax/currentphoto.php index d0654b17d64..96080e661ef 100644 --- a/apps/contacts/ajax/currentphoto.php +++ b/apps/contacts/ajax/currentphoto.php @@ -19,43 +19,30 @@ * License along with this library. If not, see <http://www.gnu.org/licenses/>. * */ -// Init owncloud -//require_once('../../../lib/base.php'); -// Check if we are a user // Firefox and Konqueror tries to download application/json for me. --Arthur OCP\JSON::setContentTypeHeader('text/plain'); OCP\JSON::checkLoggedIn(); OCP\JSON::checkAppEnabled('contacts'); -function bailOut($msg) { - OCP\JSON::error(array('data' => array('message' => $msg))); - OCP\Util::writeLog('contacts','ajax/currentphoto.php: '.$msg, OCP\Util::ERROR); - exit(); -} -function debug($msg) { - OCP\Util::writeLog('contacts','ajax/currentphoto.php: '.$msg, OCP\Util::DEBUG); -} +require_once 'loghandler.php'; if (!isset($_GET['id'])) { bailOut(OC_Contacts_App::$l10n->t('No contact ID was submitted.')); } -$tmpfname = tempnam(get_temp_dir(), "occOrig"); $contact = OC_Contacts_App::getContactVCard($_GET['id']); -$image = new OC_Image(); -if(!$image) { - bailOut(OC_Contacts_App::$l10n->t('Error loading image.')); -} // invalid vcard if( is_null($contact)) { bailOut(OC_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($image->valid()) { - if($image->save($tmpfname)) { - OCP\JSON::success(array('data' => array('id'=>$_GET['id'], 'tmp'=>$tmpfname))); + $tmpkey = 'contact-photo-'.$contact->getAsString('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.')); @@ -64,5 +51,3 @@ if( is_null($contact)) { bailOut(OC_Contacts_App::$l10n->t('The loading photo is not valid.')); } } - -?> diff --git a/apps/contacts/ajax/editaddress.php b/apps/contacts/ajax/editaddress.php index 9fb35a0b5f7..b5e4b72ed57 100644 --- a/apps/contacts/ajax/editaddress.php +++ b/apps/contacts/ajax/editaddress.php @@ -20,12 +20,22 @@ if($checksum) { $line = OC_Contacts_App::getPropertyLineByChecksum($vcard, $checksum); $element = $vcard->children[$line]; $adr = OC_Contacts_VCard::structureProperty($element); - $tmpl->assign('adr',$adr); + $types = array(); + if(isset($adr['parameters']['TYPE'])) { + if(is_array($adr['parameters']['TYPE'])) { + $types = array_map('htmlspecialchars', $adr['parameters']['TYPE']); + $types = array_map('strtoupper', $types); + } else { + $types = array(strtoupper(htmlspecialchars($adr['parameters']['TYPE']))); + } + } + $tmpl->assign('types', $types, false); + $adr = array_map('htmlspecialchars', $adr['value']); + $tmpl->assign('adr', $adr, false); } -$tmpl->assign('id',$id); -$tmpl->assign('adr_types',$adr_types); +$tmpl->assign('id', $id); +$tmpl->assign('adr_types', $adr_types); -$tmpl->printpage(); - -?> +$page = $tmpl->fetchPage(); +OCP\JSON::success(array('data' => array('page'=>$page, 'checksum'=>$checksum))); diff --git a/apps/contacts/ajax/editaddressbook.php b/apps/contacts/ajax/editaddressbook.php deleted file mode 100644 index 7a9b757ae0d..00000000000 --- a/apps/contacts/ajax/editaddressbook.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php -/** - * Copyright (c) 2011 Bart Visscher <bartv@thisnet.nl> - * 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'); -$addressbook = OC_Contacts_App::getAddressbook($_GET['bookid']); -$tmpl = new OCP\Template("contacts", "part.editaddressbook"); -$tmpl->assign('new', false); -$tmpl->assign('addressbook', $addressbook); -$tmpl->printPage(); -?> diff --git a/apps/contacts/ajax/editname.php b/apps/contacts/ajax/editname.php index dc64eeb5101..eb55634011d 100644 --- a/apps/contacts/ajax/editname.php +++ b/apps/contacts/ajax/editname.php @@ -9,19 +9,12 @@ OCP\JSON::checkLoggedIn(); OCP\JSON::checkAppEnabled('contacts'); -function bailOut($msg) { - OCP\JSON::error(array('data' => array('message' => $msg))); - OCP\Util::writeLog('contacts','ajax/editname.php: '.$msg, OCP\Util::DEBUG); - exit(); -} -function debug($msg) { - OCP\Util::writeLog('contacts','ajax/editname.php: '.$msg, OCP\Util::DEBUG); -} +require_once 'loghandler.php'; $tmpl = new OCP\Template("contacts", "part.edit_name_dialog"); $id = isset($_GET['id'])?$_GET['id']:''; -debug('id: '.$id); + if($id) { $vcard = OC_Contacts_App::getContactVCard($id); $name = array('', '', '', '', ''); @@ -31,13 +24,11 @@ if($id) { $name = OC_Contacts_VCard::structureProperty($property); } } - $tmpl->assign('name',$name); - $tmpl->assign('id',$id); + $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.')); - //$addressbooks = OC_Contacts_Addressbook::active(OCP\USER::getUser()); - //$tmpl->assign('addressbooks', $addressbooks); } -$tmpl->printpage(); - -?> +$page = $tmpl->fetchPage(); +OCP\JSON::success(array('data' => array('page'=>$page))); diff --git a/apps/contacts/ajax/importaddressbook.php b/apps/contacts/ajax/importaddressbook.php deleted file mode 100644 index 3c01e24a185..00000000000 --- a/apps/contacts/ajax/importaddressbook.php +++ /dev/null @@ -1,24 +0,0 @@ -<?php -/** - * Copyright (c) 2012 Georg Ehrke <ownclouddev at georgswebsite dot de> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -OCP\JSON::checkLoggedIn(); -OCP\App::checkAppEnabled('contacts'); -$upload_max_filesize = OCP\Util::computerFileSize(ini_get('upload_max_filesize')); -$post_max_size = OCP\Util::computerFileSize(ini_get('post_max_size')); -$maxUploadFilesize = min($upload_max_filesize, $post_max_size); - -$freeSpace=OC_Filesystem::free_space('/'); -$freeSpace=max($freeSpace,0); -$maxUploadFilesize = min($maxUploadFilesize ,$freeSpace); - -$tmpl = new OCP\Template('contacts', 'part.importaddressbook'); -$tmpl->assign('uploadMaxFilesize', $maxUploadFilesize); -$tmpl->assign('requesttoken', $_SERVER['HTTP_REQUESTTOKEN']); -$tmpl->assign('uploadMaxHumanFilesize', OCP\Util::humanFileSize($maxUploadFilesize)); -$tmpl->printpage(); -?> diff --git a/apps/contacts/ajax/importdialog.php b/apps/contacts/ajax/importdialog.php index 5f8805a6106..691522538fb 100644 --- a/apps/contacts/ajax/importdialog.php +++ b/apps/contacts/ajax/importdialog.php @@ -13,4 +13,3 @@ $tmpl = new OCP\Template('contacts', 'part.import'); $tmpl->assign('path', $_POST['path']); $tmpl->assign('filename', $_POST['filename']); $tmpl->printpage(); -?> diff --git a/apps/contacts/ajax/loadcard.php b/apps/contacts/ajax/loadcard.php index 09b6bbe0cf9..82501ffd2ff 100644 --- a/apps/contacts/ajax/loadcard.php +++ b/apps/contacts/ajax/loadcard.php @@ -20,20 +20,6 @@ * */ -// Init owncloud - -function bailOut($msg) { - OCP\JSON::error(array('data' => array('message' => $msg))); - OCP\Util::writeLog('contacts','ajax/loadcard.php: '.$msg, OCP\Util::DEBUG); - exit(); -} -function debug($msg) { - OCP\Util::writeLog('contacts','ajax/loadcard.php: '.$msg, OCP\Util::DEBUG); -} -// foreach ($_POST as $key=>$element) { -// debug('_POST: '.$key.'=>'.$element); -// } - // Check if we are a user OCP\JSON::checkLoggedIn(); OCP\JSON::checkAppEnabled('contacts'); @@ -41,22 +27,32 @@ OCP\JSON::checkAppEnabled('contacts'); $upload_max_filesize = OCP\Util::computerFileSize(ini_get('upload_max_filesize')); $post_max_size = OCP\Util::computerFileSize(ini_get('post_max_size')); $maxUploadFilesize = min($upload_max_filesize, $post_max_size); +$requesttoken = $_GET['requesttoken']; $freeSpace=OC_Filesystem::free_space('/'); -$freeSpace=max($freeSpace,0); -$maxUploadFilesize = min($maxUploadFilesize ,$freeSpace); +$freeSpace=max($freeSpace, 0); +$maxUploadFilesize = min($maxUploadFilesize, $freeSpace); $adr_types = OC_Contacts_App::getTypesOfProperty('ADR'); $phone_types = OC_Contacts_App::getTypesOfProperty('TEL'); $email_types = OC_Contacts_App::getTypesOfProperty('EMAIL'); +$impp_types = OC_Contacts_App::getTypesOfProperty('IMPP'); +$ims = OC_Contacts_App::getIMOptions(); +$im_protocols = array(); +foreach($ims as $name => $values) { + $im_protocols[$name] = $values['displayname']; +} -$tmpl = new OCP\Template('contacts','part.contact'); +$tmpl = new OCP\Template('contacts', 'part.contact'); $tmpl->assign('uploadMaxFilesize', $maxUploadFilesize); $tmpl->assign('requesttoken', $_SERVER['HTTP_REQUESTTOKEN']); $tmpl->assign('uploadMaxHumanFilesize', OCP\Util::humanFileSize($maxUploadFilesize)); -$tmpl->assign('adr_types',$adr_types); -$tmpl->assign('phone_types',$phone_types); -$tmpl->assign('email_types',$email_types); -$tmpl->assign('id',''); +$tmpl->assign('adr_types', $adr_types); +$tmpl->assign('phone_types', $phone_types); +$tmpl->assign('email_types', $email_types); +$tmpl->assign('impp_types', $impp_types, false); +$tmpl->assign('im_protocols', $im_protocols, false); +$tmpl->assign('requesttoken', $requesttoken); +$tmpl->assign('id', ''); $page = $tmpl->fetchPage(); OCP\JSON::success(array('data' => array( 'page' => $page ))); diff --git a/apps/contacts/ajax/loadintro.php b/apps/contacts/ajax/loadintro.php index 6e8fcc4b049..1da08950ca0 100644 --- a/apps/contacts/ajax/loadintro.php +++ b/apps/contacts/ajax/loadintro.php @@ -25,7 +25,7 @@ OCP\JSON::checkLoggedIn(); OCP\JSON::checkAppEnabled('contacts'); -$tmpl = new OCP\Template('contacts','part.no_contacts'); +$tmpl = new OCP\Template('contacts', 'part.no_contacts'); $page = $tmpl->fetchPage(); OCP\JSON::success(array('data' => array( 'page' => $page ))); diff --git a/apps/contacts/ajax/loadphoto.php b/apps/contacts/ajax/loadphoto.php deleted file mode 100644 index ef429e82891..00000000000 --- a/apps/contacts/ajax/loadphoto.php +++ /dev/null @@ -1,63 +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/>. - * - */ -// Init owncloud - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); - -// foreach ($_POST as $key=>$element) { -// OCP\Util::writeLog('contacts','ajax/savecrop.php: '.$key.'=>'.$element, OCP\Util::DEBUG); -// } - -function bailOut($msg) { - OCP\JSON::error(array('data' => array('message' => $msg))); - OCP\Util::writeLog('contacts','ajax/loadphoto.php: '.$msg, OCP\Util::DEBUG); - exit(); -} - -$image = null; - -$id = isset($_GET['id']) ? $_GET['id'] : ''; -$refresh = isset($_GET['refresh']) ? true : false; - -if($id == '') { - bailOut(OC_Contacts_App::$l10n->t('Missing contact id.')); -} - -$checksum = ''; -$vcard = OC_Contacts_App::getContactVCard( $id ); -foreach($vcard->children as $property){ - if($property->name == 'PHOTO') { - $checksum = md5($property->serialize()); - break; - } -} - -$tmpl = new OCP\Template("contacts", "part.contactphoto"); -$tmpl->assign('id', $id); -if($refresh) { - $tmpl->assign('refresh', 1); -} -$page = $tmpl->fetchPage(); -OCP\JSON::success(array('data' => array('page'=>$page, 'checksum'=>$checksum))); -?> diff --git a/apps/contacts/ajax/loghandler.php b/apps/contacts/ajax/loghandler.php new file mode 100644 index 00000000000..be4b98c1112 --- /dev/null +++ b/apps/contacts/ajax/loghandler.php @@ -0,0 +1,44 @@ +<?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/>. + * + */ + +function bailOut($msg, $tracelevel=1, $debuglevel=OCP\Util::ERROR) +{ + OCP\JSON::error(array('data' => array('message' => $msg))); + debug($msg, $tracelevel, $debuglevel); + exit(); +} + +function debug($msg, $tracelevel=0, $debuglevel=OCP\Util::DEBUG) +{ + if(PHP_VERSION >= "5.4") { + $call = debug_backtrace(false, $tracelevel+1); + } else { + $call = debug_backtrace(false); + } + error_log('trace: '.print_r($call, true)); + $call = $call[$tracelevel]; + if($debuglevel !== false) { + OCP\Util::writeLog('contacts', + $call['file'].'. Line: '.$call['line'].': '.$msg, + $debuglevel); + } +} diff --git a/apps/contacts/ajax/oc_photo.php b/apps/contacts/ajax/oc_photo.php index 903d2aedfbe..fe37b530f82 100644 --- a/apps/contacts/ajax/oc_photo.php +++ b/apps/contacts/ajax/oc_photo.php @@ -20,19 +20,9 @@ * */ // Check if we are a user -// Firefox and Konqueror tries to download application/json for me. --Arthur -OCP\JSON::setContentTypeHeader('text/plain'); OCP\JSON::checkLoggedIn(); OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); -function bailOut($msg) { - OCP\JSON::error(array('data' => array('message' => $msg))); - OCP\Util::writeLog('contacts','ajax/oc_photo.php: '.$msg, OCP\Util::ERROR); - exit(); -} -function debug($msg) { - OCP\Util::writeLog('contacts','ajax/oc_photo.php: '.$msg, OCP\Util::DEBUG); -} +require_once 'loghandler.php'; if(!isset($_GET['id'])) { bailOut(OC_Contacts_App::$l10n->t('No contact ID was submitted.')); @@ -43,31 +33,30 @@ if(!isset($_GET['path'])) { } $localpath = OC_Filesystem::getLocalFile($_GET['path']); -$tmpfname = tempnam(get_temp_dir(), "occOrig"); +$tmpkey = 'contact-photo-'.$_GET['id']; if(!file_exists($localpath)) { bailOut(OC_Contacts_App::$l10n->t('File doesn\'t exist:').$localpath); } -file_put_contents($tmpfname, file_get_contents($localpath)); $image = new OC_Image(); if(!$image) { bailOut(OC_Contacts_App::$l10n->t('Error loading image.')); } -if(!$image->loadFromFile($tmpfname)) { +if(!$image->loadFromFile($localpath)) { bailOut(OC_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. } if(!$image->fixOrientation()) { // No fatal error so we don't bail out. - debug('Couldn\'t save correct image orientation: '.$tmpfname); + OCP\Util::writeLog('contacts', + 'ajax/oc_photo.php: Couldn\'t save correct image orientation: '.$localpath, + OCP\Util::DEBUG); } -if($image->save($tmpfname)) { - OCP\JSON::success(array('data' => array('id'=>$_GET['id'], 'tmp'=>$tmpfname))); +if(OC_Cache::set($tmpkey, $image->data(), 600)) { + OCP\JSON::success(array('data' => array('id'=>$_GET['id'], 'tmp'=>$tmpkey))); exit(); } else { - bailOut('Couldn\'t save temporary image: '.$tmpfname); + bailOut('Couldn\'t save temporary image: '.$tmpkey); } - -?> diff --git a/apps/contacts/ajax/savecrop.php b/apps/contacts/ajax/savecrop.php index a5517c5d843..2483d0f7128 100644 --- a/apps/contacts/ajax/savecrop.php +++ b/apps/contacts/ajax/savecrop.php @@ -18,23 +18,16 @@ * 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/>. * - * TODO: Translatable strings. - * Remember to delete tmp file at some point. */ - -function bailOut($msg) { - OCP\JSON::error(array('data' => array('message' => $msg))); - OCP\Util::writeLog('contacts','ajax/savecrop.php: '.$msg, OCP\Util::DEBUG); - exit(); -} - // Check if we are a user OCP\JSON::checkLoggedIn(); OCP\JSON::checkAppEnabled('contacts'); OCP\JSON::callCheck(); // Firefox and Konqueror tries to download application/json for me. --Arthur -OCP\JSON::setContentTypeHeader('text/plain'); +OCP\JSON::setContentTypeHeader('text/plain; charset=utf-8'); + +require_once 'loghandler.php'; $image = null; @@ -44,88 +37,85 @@ $y1 = (isset($_POST['y1']) && $_POST['y1']) ? $_POST['y1'] : 0; //$y2 = isset($_POST['y2']) ? $_POST['y2'] : -1; $w = (isset($_POST['w']) && $_POST['w']) ? $_POST['w'] : -1; $h = (isset($_POST['h']) && $_POST['h']) ? $_POST['h'] : -1; -$tmp_path = isset($_POST['tmp_path']) ? $_POST['tmp_path'] : ''; +$tmpkey = isset($_POST['tmpkey']) ? $_POST['tmpkey'] : ''; $id = isset($_POST['id']) ? $_POST['id'] : ''; -if($tmp_path == '') { - bailOut('Missing path to temporary file.'); +if($tmpkey == '') { + bailOut('Missing key to temporary file.'); } if($id == '') { bailOut('Missing contact id.'); } -OCP\Util::writeLog('contacts','savecrop.php: files: '.$tmp_path.' exists: '.file_exists($tmp_path), OCP\Util::DEBUG); +OCP\Util::writeLog('contacts', 'savecrop.php: key: '.$tmpkey, OCP\Util::DEBUG); -if(file_exists($tmp_path)) { +$data = OC_Cache::get($tmpkey); +if($data) { $image = new OC_Image(); - if($image->loadFromFile($tmp_path)) { + if($image->loadFromdata($data)) { $w = ($w != -1 ? $w : $image->width()); $h = ($h != -1 ? $h : $image->height()); - OCP\Util::writeLog('contacts','savecrop.php, x: '.$x1.' y: '.$y1.' w: '.$w.' h: '.$h, OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', + 'savecrop.php, x: '.$x1.' y: '.$y1.' w: '.$w.' h: '.$h, + OCP\Util::DEBUG); if($image->crop($x1, $y1, $w, $h)) { - if(($image->width() <= 200 && $image->height() <= 200) || $image->resize(200)) { - $tmpfname = tempnam(get_temp_dir(), "occCropped"); // create a new file because of caching issues. - if($image->save($tmpfname)) { - unlink($tmp_path); - $card = OC_Contacts_App::getContactVCard($id); - if(!$card) { - unlink($tmpfname); - bailOut('Error getting contact object.'); - } - if($card->__isset('PHOTO')) { - OCP\Util::writeLog('contacts','savecrop.php: PHOTO property exists.', OCP\Util::DEBUG); - $property = $card->__get('PHOTO'); - if(!$property) { - unlink($tmpfname); - bailOut('Error getting PHOTO property.'); - } - $property->setValue($image->__toString()); - $property->parameters[] = new Sabre_VObject_Parameter('ENCODING', 'b'); - $property->parameters[] = new Sabre_VObject_Parameter('TYPE', $image->mimeType()); - $card->__set('PHOTO', $property); - } else { - OCP\Util::writeLog('contacts','savecrop.php: files: Adding PHOTO property.', OCP\Util::DEBUG); - $card->addProperty('PHOTO', $image->__toString(), array('ENCODING' => 'b', 'TYPE' => $image->mimeType())); - } - $now = new DateTime; - $card->setString('REV', $now->format(DateTime::W3C)); - if(!OC_Contacts_VCard::edit($id,$card)) { - bailOut('Error saving contact.'); + if(($image->width() <= 200 && $image->height() <= 200) + || $image->resize(200)) { + $vcard = OC_Contacts_App::getContactVCard($id); + if(!$vcard) { + OC_Cache::remove($tmpkey); + bailOut(OC_Contacts_App::$l10n + ->t('Error getting contact object.')); + } + if($vcard->__isset('PHOTO')) { + OCP\Util::writeLog('contacts', + 'savecrop.php: PHOTO property exists.', + OCP\Util::DEBUG); + $property = $vcard->__get('PHOTO'); + if(!$property) { + OC_Cache::remove($tmpkey); + bailOut(OC_Contacts_App::$l10n + ->t('Error getting PHOTO property.')); } - unlink($tmpfname); - //$result=array( "status" => "success", 'mime'=>$image->mimeType(), 'tmp'=>$tmp_path); - $tmpl = new OCP\Template("contacts", "part.contactphoto"); - $tmpl->assign('tmp_path', $tmpfname); - $tmpl->assign('mime', $image->mimeType()); - $tmpl->assign('id', $id); - $tmpl->assign('refresh', true); - $tmpl->assign('width', $image->width()); - $tmpl->assign('height', $image->height()); - $page = $tmpl->fetchPage(); - OCP\JSON::success(array('data' => array('page'=>$page, 'tmp'=>$tmpfname))); - exit(); + $property->setValue($image->__toString()); + $property->parameters[] + = new Sabre_VObject_Parameter('ENCODING', 'b'); + $property->parameters[] + = new Sabre_VObject_Parameter('TYPE', $image->mimeType()); + $vcard->__set('PHOTO', $property); } else { - if(file_exists($tmpfname)) { - unlink($tmpfname); - } - bailOut('Error saving temporary image'); + OCP\Util::writeLog('contacts', + 'savecrop.php: files: Adding PHOTO property.', + OCP\Util::DEBUG); + $vcard->addProperty('PHOTO', + $image->__toString(), array('ENCODING' => 'b', + 'TYPE' => $image->mimeType())); + } + $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.')); } + OCP\JSON::success(array( + 'data' => array( + 'id' => $id, + 'width' => $image->width(), + 'height' => $image->height(), + 'lastmodified' => OC_Contacts_App::lastModified($vcard)->format('U') + ) + )); } else { - bailOut('Error resizing image'); + bailOut(OC_Contacts_App::$l10n->t('Error resizing image')); } } else { - bailOut('Error cropping image'); + bailOut(OC_Contacts_App::$l10n->t('Error cropping image')); } } else { - bailOut('Error creating temporary image'); + bailOut(OC_Contacts_App::$l10n->t('Error creating temporary image')); } } else { - bailOut('Error finding image: '.$tmp_path); -} - -if($tmp_path != '' && file_exists($tmp_path)) { - unlink($tmp_path); + bailOut(OC_Contacts_App::$l10n->t('Error finding image: ').$tmpkey); } -?> +OC_Cache::remove($tmpkey); diff --git a/apps/contacts/ajax/updateaddressbook.php b/apps/contacts/ajax/updateaddressbook.php deleted file mode 100644 index 68fe8f81211..00000000000 --- a/apps/contacts/ajax/updateaddressbook.php +++ /dev/null @@ -1,44 +0,0 @@ -<?php -/** - * Copyright (c) 2011-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. - */ - - - -// Check if we are a user -OCP\JSON::checkLoggedIn(); -OCP\JSON::checkAppEnabled('contacts'); -OCP\JSON::callCheck(); - -$bookid = $_POST['id']; -OC_Contacts_App::getAddressbook($bookid); // is owner access check - -$name = trim(strip_tags($_POST['name'])); -if(!$name) { - OCP\JSON::error(array('data' => array('message' => OC_Contacts_App::$l10n->t('Cannot update addressbook with an empty name.')))); - OCP\Util::writeLog('contacts','ajax/updateaddressbook.php: Cannot update addressbook with an empty name: '.strip_tags($_POST['name']), OCP\Util::ERROR); - exit(); -} - -if(!OC_Contacts_Addressbook::edit($bookid, $name, null)) { - OCP\JSON::error(array('data' => array('message' => $l->t('Error updating addressbook.')))); - OCP\Util::writeLog('contacts','ajax/updateaddressbook.php: Error adding addressbook: ', OCP\Util::ERROR); - //exit(); -} - -if(!OC_Contacts_Addressbook::setActive($bookid, $_POST['active'])) { - OCP\JSON::error(array('data' => array('message' => $l->t('Error (de)activating addressbook.')))); - OCP\Util::writeLog('contacts','ajax/updateaddressbook.php: Error (de)activating addressbook: '.$bookid, OCP\Util::ERROR); - //exit(); -} - -$addressbook = OC_Contacts_App::getAddressbook($bookid); -$tmpl = new OCP\Template('contacts', 'part.chooseaddressbook.rowfields'); -$tmpl->assign('addressbook', $addressbook); -OCP\JSON::success(array( - 'page' => $tmpl->fetchPage(), - 'addressbook' => $addressbook, -)); diff --git a/apps/contacts/ajax/uploadimport.php b/apps/contacts/ajax/uploadimport.php index 4c3f5eadf08..87032b731a5 100644 --- a/apps/contacts/ajax/uploadimport.php +++ b/apps/contacts/ajax/uploadimport.php @@ -24,56 +24,57 @@ OCP\JSON::checkLoggedIn(); OCP\JSON::checkAppEnabled('contacts'); OCP\JSON::callCheck(); -function bailOut($msg) { - OCP\JSON::error(array('data' => array('message' => $msg))); - OCP\Util::writeLog('contacts','ajax/uploadimport.php: '.$msg, OCP\Util::ERROR); - exit(); -} +require_once 'loghandler.php'; + +$l10n = OC_Contacts_App::$l10n; $view = OCP\Files::getStorage('contacts'); +if(!$view->file_exists('imports')) { + $view->mkdir('imports'); +} $tmpfile = md5(rand()); // 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) { - if($view->file_put_contents('/'.$tmpfile, file_get_contents('php://input'))) { - OCP\JSON::success(array('data' => array('path'=>'', 'file'=>$tmpfile))); + if($view->file_put_contents('/imports/'.$fn, file_get_contents('php://input'))) { + OCP\JSON::success(array('data' => array('file'=>$tmpfile, 'name'=>$fn))); exit(); } else { - bailOut(OC_Contacts_App::$l10n->t('Error uploading contacts to storage.')); + bailOut($l10n->t('Error uploading contacts to storage.')); } } // File input transfers are handled here if (!isset($_FILES['importfile'])) { - OCP\Util::writeLog('contacts','ajax/uploadphoto.php: No file was uploaded. Unknown error.', OCP\Util::DEBUG); - OCP\JSON::error(array('data' => array( 'message' => 'No file was uploaded. Unknown error' ))); + OCP\Util::writeLog('contacts', + 'ajax/uploadphoto.php: No file was uploaded. Unknown error.', + OCP\Util::DEBUG); + OCP\JSON::error(array(' + data' => array( + 'message' => 'No file was uploaded. Unknown error' ))); exit(); } $error = $_FILES['importfile']['error']; if($error !== UPLOAD_ERR_OK) { $errors = array( - 0=>OC_Contacts_App::$l10n->t("There is no error, the file uploaded with success"), - 1=>OC_Contacts_App::$l10n->t("The uploaded file exceeds the upload_max_filesize directive in php.ini").ini_get('upload_max_filesize'), - 2=>OC_Contacts_App::$l10n->t("The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form"), - 3=>OC_Contacts_App::$l10n->t("The uploaded file was only partially uploaded"), - 4=>OC_Contacts_App::$l10n->t("No file was uploaded"), - 6=>OC_Contacts_App::$l10n->t("Missing a temporary folder") + 0=>$l10n->t("There is no error, the file uploaded with success"), + 1=>$l10n->t("The uploaded file exceeds the upload_max_filesize directive in php.ini").ini_get('upload_max_filesize'), + 2=>$l10n->t("The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form"), + 3=>$l10n->t("The uploaded file was only partially uploaded"), + 4=>$l10n->t("No file was uploaded"), + 6=>$l10n->t("Missing a temporary folder") ); bailOut($errors[$error]); } $file=$_FILES['importfile']; -$tmpfname = tempnam(get_temp_dir(), "occOrig"); if(file_exists($file['tmp_name'])) { - if($view->file_put_contents('/'.$tmpfile, file_get_contents($file['tmp_name']))) { - OCP\JSON::success(array('data' => array('path'=>'', 'file'=>$tmpfile))); + if($view->file_put_contents('/imports/'.$file['name'], file_get_contents($file['tmp_name']))) { + OCP\JSON::success(array('data' => array('file'=>$file['name'], 'name'=>$file['name']))); } else { - bailOut(OC_Contacts_App::$l10n->t('Error uploading contacts to storage.')); + bailOut($l10n->t('Error uploading contacts to storage.')); } } else { bailOut('Temporary file: \''.$file['tmp_name'].'\' has gone AWOL?'); } - - -?> diff --git a/apps/contacts/ajax/uploadphoto.php b/apps/contacts/ajax/uploadphoto.php index 52e25e4a335..34830b291d2 100644 --- a/apps/contacts/ajax/uploadphoto.php +++ b/apps/contacts/ajax/uploadphoto.php @@ -19,96 +19,98 @@ * License along with this library. If not, see <http://www.gnu.org/licenses/>. * */ -function bailOut($msg) { - OCP\JSON::error(array('data' => array('message' => $msg))); - OCP\Util::writeLog('contacts','ajax/uploadphoto.php: '.$msg, OCP\Util::DEBUG); - exit(); -} -function debug($msg) { - OCP\Util::writeLog('contacts','ajax/uploadphoto.php: '.$msg, OCP\Util::DEBUG); -} -OCP\JSON::setContentTypeHeader('text/plain'); + +// Check if we are a user OCP\JSON::checkLoggedIn(); OCP\JSON::checkAppEnabled('contacts'); OCP\JSON::callCheck(); +// Firefox and Konqueror tries to download application/json for me. --Arthur +OCP\JSON::setContentTypeHeader('text/plain; charset=utf-8'); +require_once 'loghandler.php'; +$l10n = OC_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) { - // AJAX call if (!isset($_GET['id'])) { - OCP\Util::writeLog('contacts','ajax/uploadphoto.php: No contact ID was submitted.', OCP\Util::DEBUG); - OCP\JSON::error(array('data' => array( 'message' => 'No contact ID was submitted.' ))); - exit(); + bailOut($l10n->t('No contact ID was submitted.')); } $id = $_GET['id']; - $tmpfname = tempnam(get_temp_dir(), 'occOrig'); - file_put_contents($tmpfname, file_get_contents('php://input')); + $tmpkey = 'contact-photo-'.md5($fn); + $data = file_get_contents('php://input'); $image = new OC_Image(); - if($image->loadFromFile($tmpfname)) { + sleep(1); // Apparently it needs time to load the data. + if($image->loadFromData($data)) { if($image->width() > 400 || $image->height() > 400) { $image->resize(400); // Prettier resizing than with browser and saves bandwidth. } if(!$image->fixOrientation()) { // No fatal error so we don't bail out. - debug('Couldn\'t save correct image orientation: '.$tmpfname); + debug('Couldn\'t save correct image orientation: '.$tmpkey); } - if($image->save($tmpfname)) { - OCP\JSON::success(array('data' => array('mime'=>$_SERVER['CONTENT_TYPE'], 'name'=>$fn, 'id'=>$id, 'tmp'=>$tmpfname))); + if(OC_Cache::set($tmpkey, $image->data(), 600)) { + OCP\JSON::success(array( + 'data' => array( + 'mime'=>$_SERVER['CONTENT_TYPE'], + 'name'=>$fn, + 'id'=>$id, + 'tmp'=>$tmpkey))); exit(); } else { - bailOut('Couldn\'t save temporary image: '.$tmpfname); + bailOut($l10n->t('Couldn\'t save temporary image: ').$tmpkey); } } else { - bailOut('Couldn\'t load temporary image: '.$file['tmp_name']); + bailOut($l10n->t('Couldn\'t load temporary image: ').$tmpkey); } } - +// Uploads from file dialog are handled here. if (!isset($_POST['id'])) { - OCP\Util::writeLog('contacts','ajax/uploadphoto.php: No contact ID was submitted.', OCP\Util::DEBUG); - OCP\JSON::error(array('data' => array( 'message' => 'No contact ID was submitted.' ))); - exit(); + bailOut($l10n->t('No contact ID was submitted.')); } if (!isset($_FILES['imagefile'])) { - OCP\Util::writeLog('contacts','ajax/uploadphoto.php: No file was uploaded. Unknown error.', OCP\Util::DEBUG); - OCP\JSON::error(array('data' => array( 'message' => 'No file was uploaded. Unknown error' ))); - exit(); + bailOut($l10n->t('No file was uploaded. Unknown error')); } + $error = $_FILES['imagefile']['error']; if($error !== UPLOAD_ERR_OK) { $errors = array( - 0=>OC_Contacts_App::$l10n->t("There is no error, the file uploaded with success"), - 1=>OC_Contacts_App::$l10n->t("The uploaded file exceeds the upload_max_filesize directive in php.ini").ini_get('upload_max_filesize'), - 2=>OC_Contacts_App::$l10n->t("The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form"), - 3=>OC_Contacts_App::$l10n->t("The uploaded file was only partially uploaded"), - 4=>OC_Contacts_App::$l10n->t("No file was uploaded"), - 6=>OC_Contacts_App::$l10n->t("Missing a temporary folder") + 0=>$l10n->t("There is no error, the file uploaded with success"), + 1=>$l10n->t("The uploaded file exceeds the upload_max_filesize directive in php.ini").ini_get('upload_max_filesize'), + 2=>$l10n->t("The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form"), + 3=>$l10n->t("The uploaded file was only partially uploaded"), + 4=>$l10n->t("No file was uploaded"), + 6=>$l10n->t("Missing a temporary folder") ); bailOut($errors[$error]); } $file=$_FILES['imagefile']; -$tmpfname = tempnam(get_temp_dir(), "occOrig"); if(file_exists($file['tmp_name'])) { + $tmpkey = 'contact-photo-'.md5(basename($file['tmp_name'])); $image = new OC_Image(); if($image->loadFromFile($file['tmp_name'])) { if($image->width() > 400 || $image->height() > 400) { $image->resize(400); // Prettier resizing than with browser and saves bandwidth. } if(!$image->fixOrientation()) { // No fatal error so we don't bail out. - debug('Couldn\'t save correct image orientation: '.$tmpfname); + debug('Couldn\'t save correct image orientation: '.$tmpkey); } - if($image->save($tmpfname)) { - OCP\JSON::success(array('data' => array('mime'=>$file['type'],'size'=>$file['size'],'name'=>$file['name'], 'id'=>$_POST['id'], 'tmp'=>$tmpfname))); + if(OC_Cache::set($tmpkey, $image->data(), 600)) { + OCP\JSON::success(array( + 'data' => array( + 'mime'=>$file['type'], + 'size'=>$file['size'], + 'name'=>$file['name'], + 'id'=>$_POST['id'], + 'tmp'=>$tmpkey, + ))); exit(); } else { - bailOut('Couldn\'t save temporary image: '.$tmpfname); + bailOut($l10n->t('Couldn\'t save temporary image: ').$tmpkey); } } else { - bailOut('Couldn\'t load temporary image: '.$file['tmp_name']); + bailOut($l10n->t('Couldn\'t load temporary image: ').$file['tmp_name']); } } else { bailOut('Temporary file: \''.$file['tmp_name'].'\' has gone AWOL?'); } - -?> diff --git a/apps/contacts/appinfo/app.php b/apps/contacts/appinfo/app.php index a298857d605..102c04705a4 100644 --- a/apps/contacts/appinfo/app.php +++ b/apps/contacts/appinfo/app.php @@ -3,18 +3,20 @@ OC::$CLASSPATH['OC_Contacts_App'] = 'apps/contacts/lib/app.php'; OC::$CLASSPATH['OC_Contacts_Addressbook'] = 'apps/contacts/lib/addressbook.php'; OC::$CLASSPATH['OC_Contacts_VCard'] = 'apps/contacts/lib/vcard.php'; OC::$CLASSPATH['OC_Contacts_Hooks'] = 'apps/contacts/lib/hooks.php'; -OC::$CLASSPATH['OC_Connector_Sabre_CardDAV'] = 'apps/contacts/lib/connector_sabre.php'; +OC::$CLASSPATH['OC_Share_Backend_Contact'] = 'apps/contacts/lib/share/contact.php'; +OC::$CLASSPATH['OC_Share_Backend_Addressbook'] = 'apps/contacts/lib/share/addressbook.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CardDAV'] = 'apps/contacts/lib/sabre/backend.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CardDAV_AddressBookRoot'] = 'apps/contacts/lib/sabre/addressbookroot.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CardDAV_UserAddressBooks'] = 'apps/contacts/lib/sabre/useraddressbooks.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CardDAV_AddressBook'] = 'apps/contacts/lib/sabre/addressbook.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CardDAV_Card'] = 'apps/contacts/lib/sabre/card.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CardDAV_VCFExportPlugin'] = 'apps/contacts/lib/sabre/vcfexportplugin.php'; OC::$CLASSPATH['OC_Search_Provider_Contacts'] = 'apps/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'); -OCP\App::register( array( - 'order' => 10, - 'id' => 'contacts', - 'name' => 'Contacts' )); - OCP\App::addNavigationEntry( array( 'id' => 'contacts_index', 'order' => 10, @@ -22,7 +24,8 @@ OCP\App::addNavigationEntry( array( 'icon' => OCP\Util::imagePath( 'settings', 'users.svg' ), 'name' => OC_L10N::get('contacts')->t('Contacts') )); - -OCP\App::registerPersonal('contacts','settings'); 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'); + diff --git a/apps/contacts/appinfo/database.xml b/apps/contacts/appinfo/database.xml index f83a04b8f47..1e2e097e49b 100644 --- a/apps/contacts/appinfo/database.xml +++ b/apps/contacts/appinfo/database.xml @@ -44,7 +44,7 @@ <type>text</type> <default></default> <notnull>false</notnull> - <length>100</length> + <length>200</length> </field> <field> @@ -62,6 +62,14 @@ <length>4</length> </field> + <field> + <name>active</name> + <type>integer</type> + <default>1</default> + <notnull>true</notnull> + <length>4</length> + </field> + </declaration> </table> @@ -110,7 +118,7 @@ <type>text</type> <default></default> <notnull>false</notnull> - <length>100</length> + <length>200</length> </field> <field> diff --git a/apps/contacts/appinfo/migrate.php b/apps/contacts/appinfo/migrate.php index f43126e5c25..2559b4ea456 100644 --- a/apps/contacts/appinfo/migrate.php +++ b/apps/contacts/appinfo/migrate.php @@ -2,7 +2,7 @@ class OC_Migration_Provider_Contacts extends OC_Migration_Provider{ // Create the xml for the user supplied - function export( ){ + function export( ) { $options = array( 'table'=>'contacts_addressbooks', 'matchcol'=>'userid', @@ -21,38 +21,40 @@ class OC_Migration_Provider_Contacts extends OC_Migration_Provider{ $ids2 = $this->content->copyRows( $options ); // If both returned some ids then they worked - if( is_array( $ids ) && is_array( $ids2 ) ) - { - return true; + if(is_array($ids) && is_array($ids2)) { + return true; } else { return false; } } - // Import function for bookmarks - function import( ){ - switch( $this->appinfo->version ){ + // Import function for contacts + function import( ) { + switch( $this->appinfo->version ) { default: // All versions of the app have had the same db structure, so all can use the same import function $query = $this->content->prepare( "SELECT * FROM contacts_addressbooks WHERE userid LIKE ?" ); $results = $query->execute( array( $this->olduid ) ); $idmap = array(); - while( $row = $results->fetchRow() ){ - // Import each bookmark, saving its id into the map - $query = OCP\DB::prepare( "INSERT INTO `*PREFIX*contacts_addressbooks` (`userid`, `displayname`, `uri`, `description`, `ctag`) VALUES (?, ?, ?, ?, ?)" ); - $query->execute( array( $this->uid, $row['displayname'], $row['uri'], $row['description'], $row['ctag'] ) ); + while( $row = $results->fetchRow() ) { + // Import each addressbook + $addressbookquery = OCP\DB::prepare( "INSERT INTO *PREFIX*contacts_addressbooks (`userid`, `displayname`, `uri`, `description`, `ctag`) VALUES (?, ?, ?, ?, ?)" ); + $addressbookquery->execute( array( $this->uid, $row['displayname'], $row['uri'], $row['description'], $row['ctag'] ) ); // Map the id - $idmap[$row['id']] = OCP\DB::insertid(); + $idmap[$row['id']] = OCP\DB::insertid('*PREFIX*contacts_addressbooks'); + // Make the addressbook active + OC_Contacts_Addressbook::setActive($idmap[$row['id']], true); } // Now tags - foreach($idmap as $oldid => $newid){ + foreach($idmap as $oldid => $newid) { + $query = $this->content->prepare( "SELECT * FROM contacts_cards WHERE addressbookid LIKE ?" ); $results = $query->execute( array( $oldid ) ); while( $row = $results->fetchRow() ){ - // Import the tags for this bookmark, using the new bookmark id - $query = OCP\DB::prepare( "INSERT INTO `*PREFIX*contacts_cards` (`addressbookid`, `fullname`, `carddata`, `uri`, `lastmodified`) VALUES (?, ?, ?, ?, ?)" ); - $query->execute( array( $newid, $row['fullname'], $row['carddata'], $row['uri'], $row['lastmodified'] ) ); + // Import the contacts + $contactquery = OCP\DB::prepare( "INSERT INTO *PREFIX*contacts_cards (`addressbookid`, `fullname`, `carddata`, `uri`, `lastmodified`) VALUES (?, ?, ?, ?, ?)" ); + $contactquery->execute( array( $newid, $row['fullname'], $row['carddata'], $row['uri'], $row['lastmodified'] ) ); } } // All done! diff --git a/apps/contacts/appinfo/remote.php b/apps/contacts/appinfo/remote.php index 2810358e7f2..d8677d7f731 100644 --- a/apps/contacts/appinfo/remote.php +++ b/apps/contacts/appinfo/remote.php @@ -22,8 +22,8 @@ OCP\App::checkAppEnabled('contacts'); -if(substr($_SERVER["REQUEST_URI"],0,strlen(OC::$APPSWEBROOT . '/apps/contacts/carddav.php')) == OC::$APPSWEBROOT . '/apps/contacts/carddav.php'){ - $baseuri = OC::$APPSWEBROOT . '/apps/contacts/carddav.php'; +if(substr($_SERVER["REQUEST_URI"], 0, strlen(OC_App::getAppWebPath('contacts').'/carddav.php')) == OC_App::getAppWebPath('contacts').'/carddav.php') { + $baseuri = OC_App::getAppWebPath('contacts').'/carddav.php'; } // only need authentication apps @@ -36,25 +36,26 @@ $principalBackend = new OC_Connector_Sabre_Principal(); $carddavBackend = new OC_Connector_Sabre_CardDAV(); // Root nodes -$Sabre_CalDAV_Principal_Collection = new Sabre_CalDAV_Principal_Collection($principalBackend); -$Sabre_CalDAV_Principal_Collection->disableListing = true; // Disable listening +$principalCollection = new Sabre_CalDAV_Principal_Collection($principalBackend); +$principalCollection->disableListing = true; // Disable listening -$Sabre_CardDAV_AddressBookRoot = new Sabre_CardDAV_AddressBookRoot($principalBackend, $carddavBackend); -$Sabre_CardDAV_AddressBookRoot->disableListing = true; // Disable listening +$addressBookRoot = new OC_Connector_Sabre_CardDAV_AddressBookRoot($principalBackend, $carddavBackend); +$addressBookRoot->disableListing = true; // Disable listening -$nodes = array( - $Sabre_CalDAV_Principal_Collection, - $Sabre_CardDAV_AddressBookRoot, +$nodes = array( + $principalCollection, + $addressBookRoot, ); // Fire up server $server = new Sabre_DAV_Server($nodes); $server->setBaseUri($baseuri); // Add plugins -$server->addPlugin(new Sabre_DAV_Auth_Plugin($authBackend,'ownCloud')); +$server->addPlugin(new Sabre_DAV_Auth_Plugin($authBackend, 'ownCloud')); $server->addPlugin(new Sabre_CardDAV_Plugin()); $server->addPlugin(new Sabre_DAVACL_Plugin()); $server->addPlugin(new Sabre_DAV_Browser_Plugin(false)); // Show something in the Browser, but no upload +$server->addPlugin(new OC_Connector_Sabre_CardDAV_VCFExportPlugin()); // And off we go! $server->exec(); diff --git a/apps/contacts/appinfo/update.php b/apps/contacts/appinfo/update.php new file mode 100644 index 00000000000..21e736bb446 --- /dev/null +++ b/apps/contacts/appinfo/update.php @@ -0,0 +1,25 @@ +<?php + +$installedVersion=OCP\Config::getAppValue('contacts', 'installed_version'); +if (version_compare($installedVersion, '0.2.3', '<')) { + // First set all address books in-active. + $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*contacts_addressbooks SET active=0' ); + $result = $stmt->execute(array()); + + // Then get all the active address books. + $stmt = OCP\DB::prepare( 'SELECT userid,configvalue FROM *PREFIX*preferences WHERE appid=\'contacts\' AND configkey=\'openaddressbooks\'' ); + $result = $stmt->execute(array()); + + // Prepare statement for updating the new 'active' field. + $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*contacts_addressbooks SET active=? WHERE id=? AND userid=?' ); + while( $row = $result->fetchRow()) { + $ids = explode(';', $row['configvalue']); + foreach($ids as $id) { + $r = $stmt->execute(array(1, $id, $row['userid'])); + } + } + + // Remove the old preferences. + $stmt = OCP\DB::prepare( 'DELETE FROM *PREFIX*preferences WHERE appid=\'contacts\' AND configkey=\'openaddressbooks\'' ); + $result = $stmt->execute(array()); +} diff --git a/apps/contacts/appinfo/version b/apps/contacts/appinfo/version index 2f4536184bc..72f9fa82020 100644 --- a/apps/contacts/appinfo/version +++ b/apps/contacts/appinfo/version @@ -1 +1 @@ -0.2
\ No newline at end of file +0.2.4
\ No newline at end of file diff --git a/apps/contacts/carddav.php b/apps/contacts/carddav.php index e0579e625d7..264eb30836b 100644 --- a/apps/contacts/carddav.php +++ b/apps/contacts/carddav.php @@ -1,6 +1,6 @@ <?php -if(!file_exists('../../lib/base.php')){ +if(!file_exists('../../lib/base.php')) { die('Please update the path to /lib/base.php in carddav.php or make use of /remote.php/carddav/'); } -require_once('../../lib/base.php'); -require_once('appinfo/remote.php');
\ No newline at end of file +require_once '../../lib/base.php'; +require_once 'appinfo/remote.php';
\ No newline at end of file diff --git a/apps/contacts/css/contacts.css b/apps/contacts/css/contacts.css index 6163c60630f..bc1a57756ae 100644 --- a/apps/contacts/css/contacts.css +++ b/apps/contacts/css/contacts.css @@ -2,36 +2,46 @@ font-weight: bold; }*/ #leftcontent { top: 3.5em !important; padding: 0; margin: 0; } +#leftcontent a { padding: 0 0 0 25px; } #rightcontent { top: 3.5em !important; padding-top: 5px; } -#contacts { background: #fff; width: 20em; left: 12.5em; top: 3.7em; bottom:3em; position: fixed; overflow: auto; padding: 0; margin: 0; } -#contacts a { height: 23px; display: block; margin: 0 0 0 0; padding: 0 0 0 25px; } +#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; } +#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;} -#contacts_newcontact { float: left; margin: 0.2em 0 0 1em; } -#chooseaddressbook { float: right; margin: 0.2em 1em 0 0; } -#actionbar { position: relative; clear: both; height: 30px;} +#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; } +#contacts_newcontact, #bottomcontrols .settings { float: left; margin: 0.2em 0 0 1em; border: 0 none; border-radius: 0; -moz-box-shadow: none; box-shadow: none; outline: 0 none; } +#bottomcontrols .settings { float: right; margin: 0.2em 1em 0 0; } +#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;*/ -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:0.5em; } +#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;/*max-width: 70em; border: thin solid lightgray; display: block;*/ } +#card { width: auto; font-size: 10px; /*max-width: 70em; border: thin solid lightgray; display: block;*/ } #firstrun { width: 100%; position: absolute; top: 5em; left: 0; text-align: center; font-weight:bold; font-size:1.5em; color:#777; } #firstrun #selections { font-size:0.8em; margin: 2em auto auto auto; clear: both; } -#card input[type="text"].contacts_property,input[type="email"].contacts_property { width: 14em; float: left; font-weight: bold; } +#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="text"],input[type="email"],input[type="tel"],input[type="date"], select, textarea { background-color: #fefefe; border: 0 !important; -webkit-appearance:none !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, input[type="text"]:focus, input[type="text"]:active,input[type="email"]:hover,input[type="tel"]:hover,input[type="date"]:hover,input[type="date"],input[type="date"]:hover,input[type="date"]:active,input[type="date"]:active,input[type="date"]:active,input[type="email"]:active,input[type="tel"]:active, select:hover, select:focus, select:active, textarea:focus, 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; } -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; } +#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; } .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; } -#address.form dt { min-width: 5em; } -#address.form dl { min-width: 10em; } +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; } @@ -40,11 +50,12 @@ dl.form { width: 100%; float: left; clear: right; margin: 0; padding: 0; } .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 { cursor: pointer; width: 20px; height: 20px; margin: 0; float: left; position:relative; opacity: 0.1; } +.add,.edit,.delete,.mail, .globe, .upload, .download, .cloud, .share { cursor: pointer; width: 20px; height: 20px; margin: 0; float: left; position:relative; opacity: 0.1; } .add:hover,.edit:hover,.delete:hover,.mail:hover, .globe:hover, .upload:hover, .download:hover .cloud:hover { opacity: 1.0 } .add { background:url('%webroot%/core/img/actions/add.svg') no-repeat center; clear: both; } .delete { background:url('%webroot%/core/img/actions/delete.svg') no-repeat center; } .edit { background:url('%webroot%/core/img/actions/rename.svg') no-repeat center; } +.share { background:url('%webroot%/core/img/actions/share.svg') no-repeat center; } .mail { background:url('%webroot%/core/img/actions/mail.svg') no-repeat center; } .upload { background:url('%webroot%/core/img/actions/upload.svg') no-repeat center; } .download { background:url('%webroot%/core/img/actions/download.svg') no-repeat center; } @@ -60,13 +71,15 @@ dl.form { width: 100%; float: left; clear: right; margin: 0; padding: 0; } #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 { max-width: 250px; }*/ -#contact_identity { min-width: 30em; } -.contactsection { position: relative; float: left; /*max-width: 40em;*/ padding: 0.5em; height: auto: border: thin solid lightgray;/* -webkit-border-radius: 0.5em; -moz-border-radius: 0.5em; border-radius: 0.5em; background-color: #f8f8f8;*/ } +#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; } #cropbox { margin: auto; } -#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; } -#contacts_details_photo:hover { background: #fff; cursor: default; } +#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; } @@ -76,10 +89,17 @@ dl.form { width: 100%; float: left; clear: right; margin: 0; padding: 0; } #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; /*border-bottom: thin solid lightgray;*/ font-weight: bold; clear: both; color: #bbb;} +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 {} @@ -92,17 +112,44 @@ dl.addresscard .action { float: right; } #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;} -#import_upload_start { width: 16px; height: 16px; margin: 0 0 0 0; } +#import_upload_start { width: 20px; height: 20px; margin: 0 0 -24px 0; padding: 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: 28em; } -.propertylist li.propertycontainer { white-space: nowrap; min-width: 35em; /*max-width: 30em;*/ display: block; clear: right; } -.propertycontainer[data-element="EMAIL"] > input[type="email"] { min-width: 19em !important; float: left; } -.propertycontainer[data-element="TEL"] > input[type="text"] { width: 10em !important; float: left; } -.propertylist li > input[type="checkbox"],input[type="radio"] { float: left; clear: left; width: 20px; height: 20px; vertical-align: middle; } +/*.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; } .propertylist li > select { float: left; max-width: 8em; } -.typelist[type="button"] { float: left; max-width: 10em; border: 0; background-color: #fff; color: #bbb} /* for multiselect */ +.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; } +.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; } +.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; } +#ninjahelp .close { position: absolute; top: 5px; right: 5px; height: 20px; width: 20px; } +#ninjahelp h2, .help-section h3 { width: 100%; font-weight: bold; text-align: center; } +#ninjahelp h2 { font-size: 1.4em; } +.help-section { width: 45%; min-width: 35em; float: left; } +.help-section h3 { font-size: 1.2em; } +.help-section dl { width: 100%; float: left; clear: right; margin: 0; padding: 0; cursor: normal; } +.help-section dt { display: table-cell; clear: left; float: left; width: 35%; margin: 0; padding: 0.2em; text-align: right; text-overflow: ellipsis; vertical-align: text-bottom; font-weight: bold: } +.help-section dd { display: table-cell; clear: right; float: left; margin: 0; padding: 0.2em; white-space: nowrap; vertical-align: text-bottom; } +.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:hover { opacity: 1; } +.addressbooks-settings td.active, .addressbooks-settings td.action { width: 20px; } + diff --git a/apps/contacts/css/jquery.Jcrop.css b/apps/contacts/css/jquery.Jcrop.css index c9b24a5ebe9..a9ba4746e07 100644 --- a/apps/contacts/css/jquery.Jcrop.css +++ b/apps/contacts/css/jquery.Jcrop.css @@ -14,7 +14,7 @@ } .jcrop-vline, .jcrop-hline { - background: white url('%webroot%/apps/contacts/img/Jcrop.gif') top left repeat; + background: white url('%appswebroot%/contacts/img/Jcrop.gif') top left repeat; font-size: 0px; position: absolute; } diff --git a/apps/contacts/export.php b/apps/contacts/export.php index 4e4ade2f2ba..161ca8047ac 100644 --- a/apps/contacts/export.php +++ b/apps/contacts/export.php @@ -9,22 +9,30 @@ OCP\User::checkLoggedIn(); OCP\App::checkAppEnabled('contacts'); -$bookid = isset($_GET['bookid']) ? $_GET['bookid'] : NULL; -$contactid = isset($_GET['contactid']) ? $_GET['contactid'] : NULL; +$bookid = isset($_GET['bookid']) ? $_GET['bookid'] : null; +$contactid = isset($_GET['contactid']) ? $_GET['contactid'] : null; $nl = "\n"; -if(isset($bookid)){ +if(isset($bookid)) { $addressbook = OC_Contacts_App::getAddressbook($bookid); - $cardobjects = OC_Contacts_VCard::all($bookid); + //$cardobjects = OC_Contacts_VCard::all($bookid); header('Content-Type: text/directory'); - header('Content-Disposition: inline; filename=' . str_replace(' ', '_', $addressbook['displayname']) . '.vcf'); + header('Content-Disposition: inline; filename=' + . str_replace(' ', '_', $addressbook['displayname']) . '.vcf'); - foreach($cardobjects as $card) { - echo $card['carddata'] . $nl; + $start = 0; + $batchsize = OCP\Config::getUserValue(OCP\User::getUser(), + 'contacts', + 'export_batch_size', 20); + while($cardobjects = OC_Contacts_VCard::all($bookid, $start, $batchsize)){ + foreach($cardobjects as $card) { + echo $card['carddata'] . $nl; + } + $start += $batchsize; } -}elseif(isset($contactid)){ +}elseif(isset($contactid)) { $data = OC_Contacts_App::getContactObject($contactid); - header('Content-Type: text/directory'); - header('Content-Disposition: inline; filename=' . str_replace(' ', '_', $data['fullname']) . '.vcf'); + header('Content-Type: text/vcard'); + header('Content-Disposition: inline; filename=' + . str_replace(' ', '_', $data['fullname']) . '.vcf'); echo $data['carddata']; } -?> diff --git a/apps/contacts/img/contact-new.png b/apps/contacts/img/contact-new.png Binary files differindex 087ad9ab2d3..a91f2e620fa 100644 --- a/apps/contacts/img/contact-new.png +++ b/apps/contacts/img/contact-new.png diff --git a/apps/contacts/img/person.png b/apps/contacts/img/person.png Binary files differindex 17e79196540..e88bb5653af 100644 --- a/apps/contacts/img/person.png +++ b/apps/contacts/img/person.png diff --git a/apps/contacts/img/person_large.png b/apps/contacts/img/person_large.png Binary files differindex 4edba0c5489..8293df61829 100644 --- a/apps/contacts/img/person_large.png +++ b/apps/contacts/img/person_large.png diff --git a/apps/contacts/import.php b/apps/contacts/import.php index 85d4cebeb02..1986d79f6d6 100644 --- a/apps/contacts/import.php +++ b/apps/contacts/import.php @@ -12,131 +12,139 @@ OCP\JSON::checkLoggedIn(); OCP\App::checkAppEnabled('contacts'); session_write_close(); -$cr = "\r"; $nl = "\n"; -$progressfile = 'import_tmp/' . md5(session_id()) . '.txt'; + +global $progresskey; +$progresskey = 'contacts.import-' . (isset($_GET['progresskey'])?$_GET['progresskey']:''); + +if (isset($_GET['progress']) && $_GET['progress']) { + echo OC_Cache::get($progresskey); + die; +} function writeProgress($pct) { - if(is_writable('import_tmp/')){ - $progressfopen = fopen($progressfile, 'w'); - fwrite($progressfopen, $pct); - fclose($progressfopen); - } + global $progresskey; + OC_Cache::set($progresskey, $pct, 300); } writeProgress('10'); $view = $file = null; if(isset($_POST['fstype']) && $_POST['fstype'] == 'OC_FilesystemView') { $view = OCP\Files::getStorage('contacts'); - $file = $view->file_get_contents('/' . $_POST['file']); + $file = $view->file_get_contents('/imports/' . $_POST['file']); } else { $file = OC_Filesystem::file_get_contents($_POST['path'] . '/' . $_POST['file']); } if(!$file) { - OCP\JSON::error(array('message' => 'Import file was empty.')); + OCP\JSON::error(array('data' => array('message' => 'Import file was empty.'))); exit(); } -if(isset($_POST['method']) && $_POST['method'] == 'new'){ - $id = OC_Contacts_Addressbook::add(OCP\USER::getUser(), $_POST['addressbookname']); +if(isset($_POST['method']) && $_POST['method'] == 'new') { + $id = OC_Contacts_Addressbook::add(OCP\USER::getUser(), + $_POST['addressbookname']); if(!$id) { - OCP\JSON::error(array('message' => 'Error creating address book.')); + OCP\JSON::error( + array( + 'data' => array('message' => 'Error creating address book.') + ) + ); exit(); } OC_Contacts_Addressbook::setActive($id, 1); }else{ $id = $_POST['id']; if(!$id) { - OCP\JSON::error(array('message' => 'Error getting the ID of the address book.')); + OCP\JSON::error( + array( + 'data' => array( + 'message' => 'Error getting the ID of the address book.', + 'file'=>$_POST['file'] + ) + ) + ); exit(); } OC_Contacts_App::getAddressbook($id); // is owner access check } //analyse the contacts file -writeProgress('20'); -$searchfor = array('VCARD'); -$parts = $searchfor; -$filearr = explode($nl, $file); -if(count($filearr) == 1) { // Mac eol - $filearr = explode($cr, $file); -} +writeProgress('40'); +$file = str_replace(array("\r","\n\n"), array("\n","\n"), $file); +$lines = explode($nl, $file); $inelement = false; $parts = array(); -$i = 0; -foreach($filearr as $line){ - foreach($searchfor as $search){ - if(substr_count($line, $search) == 1){ - list($attr, $val) = explode(':', $line); - if($attr == 'BEGIN'){ - $parts[]['begin'] = $i; - $inelement = true; - } - if($attr == 'END'){ - $parts[count($parts) - 1]['end'] = $i; - $inelement = false; - } - } - } - $i++; -} -//import the contacts -writeProgress('40'); -$start = ''; -for ($i = 0; $i < $parts[0]['begin']; $i++) { - if($i == 0){ - $start = $filearr[0]; - }else{ - $start .= $nl . $filearr[$i]; - } -} -$end = ''; -for($i = $parts[count($parts) - 1]['end'] + 1;$i <= count($filearr) - 1; $i++){ - if($i == $parts[count($parts) - 1]['end'] + 1){ - $end = $filearr[$parts[count($parts) - 1]['end'] + 1]; - }else{ - $end .= $nl . $filearr[$i]; +$card = array(); +foreach($lines as $line){ + if(strtoupper(trim($line)) == 'BEGIN:VCARD') { + $inelement = true; + } elseif (strtoupper(trim($line)) == 'END:VCARD') { + $card[] = $line; + $parts[] = implode($nl, $card); + $card = array(); + $inelement = false; } -} -writeProgress('50'); -$importready = array(); -foreach($parts as $part){ - for($i = $part['begin']; $i <= $part['end'];$i++){ - if($i == $part['begin']){ - $content = $filearr[$i]; - }else{ - $content .= $nl . $filearr[$i]; - } + if ($inelement === true && trim($line) != '') { + $card[] = $line; } - $importready[] = $start . $nl . $content . $nl . $end; } +//import the contacts writeProgress('70'); -if(count($parts) == 1){ - $importready = array($file); -} $imported = 0; $failed = 0; -if(!count($importready) > 0) { - OCP\JSON::error(array('data' => (array('message' => 'No contacts to import in .'.$_POST['file'].' Please check if the file is corrupted.')))); +if(!count($parts) > 0) { + OCP\JSON::error( + array( + 'data' => array( + 'message' => 'No contacts to import in ' + . $_POST['file'].'. Please check if the file is corrupted.', + 'file'=>$_POST['file'] + ) + ) + ); + if(isset($_POST['fstype']) && $_POST['fstype'] == 'OC_FilesystemView') { + if(!$view->unlink('/imports/' . $_POST['file'])) { + OCP\Util::writeLog('contacts', + 'Import: Error unlinking OC_FilesystemView ' . '/' . $_POST['file'], + OCP\Util::ERROR); + } + } exit(); } -foreach($importready as $import){ - $card = OC_VObject::parse($import); +foreach($parts as $part){ + $card = OC_VObject::parse($part); if (!$card) { $failed += 1; - OCP\Util::writeLog('contacts','Import: skipping card. Error parsing VCard: '.$import, OCP\Util::ERROR); + OCP\Util::writeLog('contacts', + 'Import: skipping card. Error parsing VCard: ' . $part, + OCP\Util::ERROR); continue; // Ditch cards that can't be parsed by Sabre. } - $imported += 1; - OC_Contacts_VCard::add($id, $card); + try { + OC_Contacts_VCard::add($id, $card); + $imported += 1; + } catch (Exception $e) { + OCP\Util::writeLog('contacts', + 'Error importing vcard: ' . $e->getMessage() . $nl . $card, + OCP\Util::ERROR); + $failed += 1; + } } //done the import writeProgress('100'); sleep(3); -if(is_writable('import_tmp/')){ - unlink($progressfile); -} +OC_Cache::remove($progresskey); if(isset($_POST['fstype']) && $_POST['fstype'] == 'OC_FilesystemView') { - if(!$view->unlink('/' . $_POST['file'])) { - OCP\Util::writeLog('contacts','Import: Error unlinking OC_FilesystemView ' . '/' . $_POST['file'], OCP\Util::ERROR); + if(!$view->unlink('/imports/' . $_POST['file'])) { + OCP\Util::writeLog('contacts', + 'Import: Error unlinking OC_FilesystemView ' . '/' . $_POST['file'], + OCP\Util::ERROR); } } -OCP\JSON::success(array('data' => array('imported'=>$imported, 'failed'=>$failed))); +OCP\JSON::success( + array( + 'data' => array( + 'imported'=>$imported, + 'failed'=>$failed, + 'file'=>$_POST['file'], + ) + ) +); diff --git a/apps/contacts/import_tmp/Info b/apps/contacts/import_tmp/Info deleted file mode 100644 index abafbce435c..00000000000 --- a/apps/contacts/import_tmp/Info +++ /dev/null @@ -1,2 +0,0 @@ -This folder contains static files with the percentage of the import. -Requires write permission diff --git a/apps/contacts/index.php b/apps/contacts/index.php index 994539e9fce..f16d6f5641f 100644 --- a/apps/contacts/index.php +++ b/apps/contacts/index.php @@ -14,31 +14,28 @@ OCP\App::checkAppEnabled('contacts'); // Get active address books. This creates a default one if none exists. $ids = OC_Contacts_Addressbook::activeIds(OCP\USER::getUser()); -$allcontacts = OC_Contacts_VCard::all($ids); -$contacts = array(); -foreach($allcontacts as $contact) { // try to conserve some memory - $contacts[] = array('id' => $contact['id'], 'addressbookid' => $contact['addressbookid'], 'fullname' => $contact['fullname']); +$has_contacts = (count(OC_Contacts_VCard::all($ids, 0, 1)) > 0 + ? true + : false); // just to check if there are any contacts. +if($has_contacts === false) { + OCP\Util::writeLog('contacts', + 'index.html: No contacts found.', + OCP\Util::DEBUG); } -unset($allcontacts); -$addressbooks = OC_Contacts_Addressbook::active(OCP\USER::getUser()); // Load the files we need -OCP\App::setActiveNavigationEntry( 'contacts_index' ); +OCP\App::setActiveNavigationEntry('contacts_index'); // Load a specific user? $id = isset( $_GET['id'] ) ? $_GET['id'] : null; -$details = array(); - -if(is_null($id) && count($contacts) > 0) { - $id = $contacts[0]['id']; -} -if(!is_null($id)) { - $vcard = OC_Contacts_App::getContactVCard($id); - $details = OC_Contacts_VCard::structureContact($vcard); -} -$property_types = OC_Contacts_App::getAddPropertyOptions(); +$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(); +$im_protocols = array(); +foreach($ims as $name => $values) { + $im_protocols[$name] = $values['displayname']; +} $categories = OC_Contacts_App::getCategories(); $upload_max_filesize = OCP\Util::computerFileSize(ini_get('upload_max_filesize')); @@ -46,33 +43,32 @@ $post_max_size = OCP\Util::computerFileSize(ini_get('post_max_size')); $maxUploadFilesize = min($upload_max_filesize, $post_max_size); $freeSpace=OC_Filesystem::free_space('/'); -$freeSpace=max($freeSpace,0); -$maxUploadFilesize = min($maxUploadFilesize ,$freeSpace); +$freeSpace=max($freeSpace, 0); +$maxUploadFilesize = min($maxUploadFilesize, $freeSpace); -OCP\Util::addscript('','jquery.multiselect'); -OCP\Util::addscript('','oc-vcategories'); -OCP\Util::addscript('contacts','contacts'); -OCP\Util::addscript('contacts','expanding'); -OCP\Util::addscript('contacts','jquery.combobox'); -OCP\Util::addscript('contacts','jquery.inview'); -OCP\Util::addscript('contacts','jquery.Jcrop'); -OCP\Util::addscript('contacts','jquery.multi-autocomplete'); -OCP\Util::addStyle('','jquery.multiselect'); -OCP\Util::addStyle('contacts','jquery.combobox'); -OCP\Util::addStyle('contacts','jquery.Jcrop'); -OCP\Util::addStyle('contacts','contacts'); +OCP\Util::addscript('', 'jquery.multiselect'); +OCP\Util::addscript('', 'oc-vcategories'); +OCP\Util::addscript('contacts', 'contacts'); +OCP\Util::addscript('contacts', 'expanding'); +OCP\Util::addscript('contacts', 'jquery.combobox'); +OCP\Util::addscript('files', 'jquery.fileupload'); +OCP\Util::addscript('contacts', 'jquery.inview'); +OCP\Util::addscript('contacts', 'jquery.Jcrop'); +OCP\Util::addscript('contacts', 'jquery.multi-autocomplete'); +OCP\Util::addStyle('', 'jquery.multiselect'); +OCP\Util::addStyle('contacts', 'jquery.combobox'); +OCP\Util::addStyle('contacts', 'jquery.Jcrop'); +OCP\Util::addStyle('contacts', 'contacts'); $tmpl = new OCP\Template( "contacts", "index", "user" ); -$tmpl->assign('uploadMaxFilesize', $maxUploadFilesize); -$tmpl->assign('uploadMaxHumanFilesize', OCP\Util::humanFileSize($maxUploadFilesize)); -$tmpl->assign('property_types', $property_types); -$tmpl->assign('phone_types', $phone_types); -$tmpl->assign('email_types', $email_types); -$tmpl->assign('categories', $categories); -$tmpl->assign('addressbooks', $addressbooks); -$tmpl->assign('contacts', $contacts); -$tmpl->assign('details', $details ); -$tmpl->assign('id',$id); +$tmpl->assign('uploadMaxFilesize', $maxUploadFilesize, false); +$tmpl->assign('uploadMaxHumanFilesize', + OCP\Util::humanFileSize($maxUploadFilesize), false); +$tmpl->assign('phone_types', $phone_types, false); +$tmpl->assign('email_types', $email_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, false); $tmpl->printPage(); - -?> diff --git a/apps/contacts/js/contacts.js b/apps/contacts/js/contacts.js index 7f260ea54d9..09cf26bf7fe 100644 --- a/apps/contacts/js/contacts.js +++ b/apps/contacts/js/contacts.js @@ -10,1588 +10,1998 @@ String.prototype.strip_tags = function(){ return stripped; }; -Contacts={ - UI:{ - notification:function(msg, ndata) { - $('#notification').text(msg); - if(data) { - $('#notification').data(ndata[0],ndata[1]); - } - $('#notification').fadeIn(); - setTimeout($('#notification').fadeOut(), 10000); - }, - notImplemented:function() { - OC.dialogs.alert(t('contacts', 'Sorry, this functionality has not been implemented yet'), t('contacts', 'Not implemented')); - }, - searchOSM:function(obj) { - var adr = Contacts.UI.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() + ','; +OC.Contacts={ + /** + * 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)); + } } - if(adrarr[4].trim() != '') { - adrstr = adrstr + adrarr[4].trim() + ','; + 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'); } - if(adrarr[5].trim() != '') { - adrstr = adrstr + adrarr[5].trim() + ','; + self.notifier.fadeOut(); + if(params.timeouthandler && $.isFunction(params.timeouthandler)) { + params.timeouthandler(self.notifier.data(dataid)); + self.notifier.off('click'); + self.notifier.removeData(dataid); } - if(adrarr[6].trim() != '') { - adrstr = adrstr + adrarr[6].trim(); + }, 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).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)) }); + $('.propertylist li a.mail').click(function() { OC.Contacts.mailTo(this) }); + $('.propertylist li a.mail').keydown(function() { OC.Contacts.mailTo(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() {}); } - 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'); + ); + }, + 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(); + if(url != '') { + var newWindow = window.open(url,'_blank'); newWindow.focus(); - }, - mailTo:function(obj) { - var adr = Contacts.UI.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).addClass('loading'); - } else { - $(obj).removeClass('loading'); + } + + $('#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); } - }, - showCardDAVUrl:function(username, bookname){ - $('#carddav_url').val(totalurl + '/' + username + '/' + 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'); - Contacts.UI.Card.deleteProperty(obj, 'list'); - } - $('.propertylist li a.delete, .addresscard .delete').click(function() { deleteItem($(this)) }); - $('.propertylist li a.delete, .addresscard .delete').keydown(function() { deleteItem($(this)) }); - $('.propertylist li a.mail').click(function() { Contacts.UI.mailTo(this) }); - $('.propertylist li a.mail').keydown(function() { Contacts.UI.mailTo(this) }); - $('.addresscard .globe').click(function() { $(this).tipsy('hide');Contacts.UI.searchOSM(this); }); - $('.addresscard .globe').keydown(function() { $(this).tipsy('hide');Contacts.UI.searchOSM(this); }); - $('.addresscard .edit').click(function() { $(this).tipsy('hide');Contacts.UI.Card.editAddress(this, false); }); - $('.addresscard .edit').keydown(function() { $(this).tipsy('hide');Contacts.UI.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'); - Contacts.UI.Card.deleteProperty(obj, 'single'); - } - $('#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(); } ); - $('#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(){Contacts.UI.Card.editName()}); - $('#edit_name').keydown(function(){Contacts.UI.Card.editName()}); - - /* 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() { - Contacts.UI.Card.savePhoto(this); - $(this).dialog('close'); - } - }, - { - text: "Cancel", - click: function() { $(this).dialog('close'); } - } - ] ); - - /*$('#fn').blur(function(){ - if($('#fn').val() == '') { - OC.dialogs.alert(t('contacts','The name field cannot be empty. Please enter a name for this contact.'), t('contacts','Name is empty'), function() { $('#fn').focus(); }); - $('#fn').focus(); - return false; - } - });*/ - - // Name has changed. Update it and reorder. - $('#fn').change(function(){ - var name = $('#fn').val().strip_tags(); - var item = $('#contacts [data-id="'+Contacts.UI.Card.id+'"]'); - $(item).find('a').html(name); - Contacts.UI.Card.fn = name; - var added = false; - $('#contacts li').each(function(){ - if ($(this).text().toLowerCase() > name.toLowerCase()) { - $(this).before(item).fadeIn('fast'); - added = true; - return false; - } - }); - if(!added) { - $('#leftcontent ul').append(item); + ); + $('#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'); } - Contacts.UI.Contacts.scrollTo(Contacts.UI.Card.id); - }); + }, + { + text: "Cancel", + click: function() { $(this).dialog('close'); } + } + ] ); - $('#contacts_deletecard').click( function() { Contacts.UI.Card.doDelete();return false;} ); - $('#contacts_deletecard').keydown( function(event) { - if(event.which == 13) { - Contacts.UI.Card.doDelete(); - } - return false; - }); + // 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_downloadcard').click( function() { Contacts.UI.Card.doExport();return false;} ); - $('#contacts_downloadcard').keydown( function(event) { - if(event.which == 13) { - Contacts.UI.Card.doExport(); - } - return false; - }); + $('#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; + }); - // Profile picture upload handling - // New profile picture selected - $('#file_upload_start').change(function(){ - Contacts.UI.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'); - //event.stopPropagation(); - //event.preventDefault(); - }); - $('#contacts_details_photo_wrapper').bind('drop',function(event){ - event.stopPropagation(); - event.preventDefault(); - $(event.target).removeClass('droppable'); - $.fileUpload(event.originalEvent.dataTransfer.files); - }); + $('#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; + }); - $('#categories').multiple_autocomplete({source: categories}); - $('#contacts_deletecard').tipsy({gravity: 'ne'}); - $('#contacts_downloadcard').tipsy({gravity: 'ne'}); - $('#contacts_propertymenu_button').tipsy(); - $('#contacts_newcontact, #chooseaddressbook').tipsy({gravity: 'sw'}); - }, - Card:{ - id:'', - fn:'', - fullname:'', - shortname:'', - famname:'', - givname:'', - addname:'', - honpre:'', - honsuf:'', - data:undefined, - update:function(id) { - var newid; - if(!id) { - newid = $('#contacts li:first-child').data('id'); - } else { - newid = id; - } - var localLoadContact = function(id) { - if($('#contacts li').length > 0) { - $('#leftcontent li[data-id="'+newid+'"]').addClass('active'); - $.getJSON(OC.filePath('contacts', 'ajax', 'contactdetails.php'),{'id':newid},function(jsondata){ - if(jsondata.status == 'success'){ - Contacts.UI.Card.loadContact(jsondata.data); - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); + // 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(); + $('#contacts_newcontact, #contacts_import, #bottomcontrols .settings').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'; } - - // Make sure proper DOM is loaded. - if(!$('#card')[0]) { - $.getJSON(OC.filePath('contacts', 'ajax', 'loadcard.php'),{},function(jsondata){ - if(jsondata.status == 'success'){ - $('#rightcontent').html(jsondata.data.page).ready(function() { - Contacts.UI.loadHandlers(); - localLoadContact(newid); - }); - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } - else if($('#contacts li').length == 0) { - // load intro page - $.getJSON(OC.filePath('contacts', 'ajax', 'loadintro.php'),{},function(jsondata){ + } else { + newid = parseInt(params.cid); + bookid = parseInt(params.aid); + } + if(!bookid || !newid) { + bookid = parseInt($('#contacts h3').first().data('id')); + newid = parseInt($('#contacts').find('li[data-bookid="'+bookid+'"]').first().data('id')); + } + console.log('newid: ' + newid + ' bookid: ' +bookid); + var localLoadContact = function(newid, bookid) { + if($('.contacts li').length > 0) { + $.getJSON(OC.filePath('contacts', 'ajax', 'contact/details.php'),{'id':newid},function(jsondata){ if(jsondata.status == 'success'){ - id = ''; - $('#rightcontent').data('id',''); - $('#rightcontent').html(jsondata.data.page); + if(bookid == 'unknown') { + bookid = jsondata.data.addressbookid; + var contact = OC.Contacts.Contacts.insertContact({ + contactlist:$('#contacts ul[data-id="'+bookid+'"]'), + data:jsondata.data + }); + } + $('#contacts li[data-id="'+newid+'"],#contacts h3[data-id="'+bookid+'"]').addClass('active'); + $('#contacts ul[data-id="'+bookid+'"]').slideDown(300); + OC.Contacts.Card.loadContact(jsondata.data, bookid); + OC.Contacts.Contacts.scrollTo(newid); } else { OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); } }); } - else { - localLoadContact(); - } - }, - doExport:function() { - document.location.href = OC.linkTo('contacts', 'export.php') + '?contactid=' + this.id; - }, - doImport:function(){ - Contacts.UI.notImplemented(); - }, - editNew:function(){ // add a new contact - this.id = ''; this.bookid = '', this.fn = ''; this.fullname = ''; this.givname = ''; this.famname = ''; this.addname = ''; this.honpre = ''; this.honsuf = ''; - self = this; - $.getJSON(OC.filePath('contacts', 'ajax', 'selectaddressbook.php'),{},function(jsondata) { - if(jsondata.status == 'success') { - if(jsondata.data.type == 'dialog') { - // Load dialog to select addressbook. - if($('#selectaddressbook_dialog').dialog('isOpen') == true) { - $('#selectaddressbook_dialog').dialog('moveToTop'); - } else { - $('#dialog_holder').html(jsondata.data.page).ready(function($) { - $('#selectaddressbook_dialog').dialog({ - modal: true, height: 'auto', width: 'auto', - buttons: { - 'Ok':function() { - Contacts.UI.Card.add(';;;;;', '',$('#selectaddressbook_dialog').find('input:checked').val(), true); - $(this).dialog('close'); - }, - 'Cancel':function() { $(this).dialog('close'); } - }, - close: function(event, ui) { - $(this).dialog('destroy').remove(); - } - }); - }); - } - } else { - Contacts.UI.Card.bookid = jsondata.data.id; - Contacts.UI.Card.add(';;;;;', '',jsondata.data.id, true); - } + } + + // Make sure proper DOM is loaded. + if(!$('#card').length && newid) { + console.log('Loading card DOM'); + $.getJSON(OC.filePath('contacts', 'ajax', 'loadcard.php'),{requesttoken:requesttoken},function(jsondata){ + if(jsondata.status == 'success'){ + $('#rightcontent').html(jsondata.data.page).ready(function() { + OC.Contacts.loadHandlers(); + localLoadContact(newid, bookid); + }); } else { OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); } }); - return false; - }, - add:function(n, fn, aid, isnew){ // add a new contact - var localAddcontact = function(n, fn, aid, isnew) { - $.post(OC.filePath('contacts', 'ajax', 'addcontact.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; - $.getJSON(OC.filePath('contacts', 'ajax', 'contactdetails.php'),{'id':id},function(jsondata){ - if(jsondata.status == 'success'){ - Contacts.UI.Card.loadContact(jsondata.data); - $('#leftcontent .active').removeClass('active'); - var item = $('<li role="button" data-id="'+jsondata.data.id+'" data-book-id="'+aid+'" class="active"><a href="index.php?id='+jsondata.data.id+'" style="background: url('+OC.filePath('contacts', '', 'thumbnail.php')+'?id='+jsondata.data.id+') no-repeat scroll 0% 0% transparent;">'+Contacts.UI.Card.fn+'</a></li>'); - var added = false; - $('#leftcontent ul li').each(function(){ - if ($(this).text().toLowerCase() > Contacts.UI.Card.fn.toLowerCase()) { - $(this).before(item).fadeIn('fast'); - added = true; - return false; - } - }); - if(!added) { - $('#leftcontent ul').append(item); - } - if(isnew) { // add some default properties - Contacts.UI.Card.addProperty('EMAIL'); - Contacts.UI.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')); - } - }); - } - - var card = $('#card')[0]; - if(!card) { - $.getJSON(OC.filePath('contacts', 'ajax', 'loadcard.php'),{},function(jsondata){ - if(jsondata.status == 'success'){ - $('#rightcontent').html(jsondata.data.page).ready(function() { - Contacts.UI.loadHandlers(); - localAddcontact(n, fn, aid, isnew); - }); - } else{ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } else { - localAddcontact(n, fn, aid, isnew); - } - }, - doDelete:function() { - $('#contacts_deletecard').tipsy('hide'); - OC.dialogs.confirm(t('contacts', 'Are you sure you want to delete this contact?'), t('contacts', 'Warning'), function(answer) { - if(answer == true) { - $.post(OC.filePath('contacts', 'ajax', 'deletecard.php'),{'id':Contacts.UI.Card.id},function(jsondata){ + } else if(!newid) { + console.log('Loading intro'); + // load intro page + $.getJSON(OC.filePath('contacts', 'ajax', 'loadintro.php'),{},function(jsondata){ + if(jsondata.status == 'success'){ + id = ''; + $('#rightcontent').data('id',''); + $('#rightcontent').html(jsondata.data.page); + } else { + OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); + } + }); + } + else { + localLoadContact(newid, bookid); + } + }, + 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.Share.PERMISSION_UPDATE + || permissions & OC.Share.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); + aid = aid?aid:$('#contacts h3.active').first().data('id'); + var localAddcontact = function(n, fn, aid, isnew) { + $.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'){ - var newid = ''; - var curlistitem = $('#leftcontent [data-id="'+jsondata.data.id+'"]'); - var newlistitem = curlistitem.prev(); - if(newlistitem == undefined) { - newlistitem = curlistitem.next(); - } - curlistitem.remove(); - if(newlistitem != undefined) { - newid = newlistitem.data('id'); - } - $('#rightcontent').data('id',newid); - this.id = this.fn = this.fullname = this.shortname = this.famname = this.givname = this.addname = this.honpre = this.honsuf = ''; - this.data = undefined; - - if($('#contacts li').length > 0) { // Load first in list. - Contacts.UI.Card.update(newid); - } else { - // load intro page - $.getJSON(OC.filePath('contacts', 'ajax', 'loadintro.php'),{},function(jsondata){ - if(jsondata.status == 'success'){ - id = ''; - $('#rightcontent').data('id',''); - $('#rightcontent').html(jsondata.data.page); - } - else{ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); + OC.Contacts.Card.loadContact(jsondata.data, aid); + var item = OC.Contacts.Contacts.insertContact({data:jsondata.data}); + 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')); } }); - return false; - }, - loadContact:function(jsondata){ - this.data = jsondata; - this.id = this.data.id; - $('#rightcontent').data('id',this.id); - this.populateNameFields(); - this.loadPhoto(); - this.loadMails(); - this.loadPhones(); - this.loadAddresses(); - this.loadSingleProperties(); - Contacts.UI.loadListHandlers(); - if(this.data.NOTE) { - $('#note').data('checksum', this.data.NOTE[0]['checksum']); - var note = $('#note').find('textarea'); - var txt = this.data.NOTE[0]['value']; - var nheight = txt.split('\n').length > 4 ? txt.split('\n').length+2 : 5; - note.css('min-height', nheight+'em'); - note.attr('rows', nheight); - note.val(txt); - $('#note').show(); - note.expandingTextarea(); - $('#contacts_propertymenu_dropdown a[data-type="NOTE"]').parent().hide(); - } else { - $('#note').data('checksum', ''); - $('#note').find('textarea').val(''); - $('#note').hide(); - $('#contacts_propertymenu_dropdown a[data-type="NOTE"]').parent().show(); - } - }, - loadSingleProperties:function() { - var props = ['BDAY', 'NICKNAME', 'ORG', '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(); + } + + if(!$('#card').length) { + console.log('Loading card DOM'); + $.getJSON(OC.filePath('contacts', 'ajax', 'loadcard.php'),{'requesttoken': requesttoken},function(jsondata){ + if(jsondata.status == 'success'){ + $('#rightcontent').html(jsondata.data.page).ready(function() { + OC.Contacts.loadHandlers(); + localAddcontact(n, fn, aid, isnew); + }); + } else{ + OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); } }); - for(var prop in props) { - if(this.data[props[prop]] != undefined) { - $('#contacts_propertymenu_dropdown a[data-type="'+props[prop]+'"]').parent().hide(); - var property = this.data[props[prop]][0]; - var value = property['value'], checksum = property['checksum']; - switch(props[prop]) { - case 'BDAY': - var val = $.datepicker.parseDate('yy-mm-dd', value.substring(0, 10)); - value = $.datepicker.formatDate('dd-mm-yy', val); - $('#contact_identity').find('#bday').val(value); - $('#contact_identity').find('#bday_value').data('checksum', checksum); - $('#contact_identity').find('#bday_label').show(); - $('#contact_identity').find('#bday_value').show(); - break; - case 'NICKNAME': - $('#contact_identity').find('#nickname').val(value); - $('#contact_identity').find('#nickname_value').data('checksum', checksum); - $('#contact_identity').find('#nickname_label').show(); - $('#contact_identity').find('#nickname_value').show(); - break; - case 'ORG': - $('#contact_identity').find('#org').val(value); - $('#contact_identity').find('#org_value').data('checksum', checksum); - $('#contact_identity').find('#org_label').show(); - $('#contact_identity').find('#org_value').show(); - break; - case 'CATEGORIES': - $('#contact_identity').find('#categories').val(value); - $('#contact_identity').find('#categories_value').data('checksum', checksum); - $('#contact_identity').find('#categories_label').show(); - $('#contact_identity').find('#categories_value').show(); - break; - } + } else { + localAddcontact(n, fn, aid, isnew); + } + }, + 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 + $.getJSON(OC.filePath('contacts', 'ajax', 'loadintro.php'),{},function(jsondata){ + if(jsondata.status == 'success'){ + id = ''; + $('#rightcontent').html(jsondata.data.page).removeData('id'); } else { - $('#contacts_propertymenu_dropdown a[data-type="'+props[prop]+'"]').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(''); + OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); } }); - this.fn = ''; this.fullname = ''; this.givname = ''; this.famname = ''; this.addname = ''; this.honpre = ''; this.honsuf = ''; - var narray = undefined; - if(this.data.FN) { - this.fn = this.data.FN[0]['value']; - } - else { - this.fn = ''; + } + 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; } - if(this.data.N == undefined) { - narray = [this.fn,'','','','']; // Checking for non-existing 'N' property :-P - } else { - narray = this.data.N[0]['value']; + }); + }, + 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); } - 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(OC.Contacts.Contacts.deletionQueue.length == 0) { + window.onbeforeunload = null; } - if(this.givname.length > 0) { - this.fullname += ' ' + this.givname; + } + + if(OC.Contacts.Contacts.deletionQueue.indexOf(parseInt(id)) == -1 && removeFromQueue) { + console.log('returning'); + updateQueue(id, removeFromQueue); + if(typeof cb == 'function') { + cb(true); } - if(this.addname.length > 0) { - this.fullname += ' ' + this.addname; + 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); + } } - if(this.famname.length > 0) { - this.fullname += ' ' + this.famname; + 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($('#contacts ul[data-id="' + bookid + '"]').data('permissions')); + console.log('permissions', permissions); + this.setEnabled(permissions == 0 + || permissions & OC.Share.PERMISSION_UPDATE + || permissions & OC.Share.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(); } - if(this.honsuf.length > 0) { - this.fullname += ', ' + this.honsuf; + }); + 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(); } - $('#n').val(narray.join(';')); - $('#fn_select option').remove(); - var names = [this.fn, this.fullname, this.givname + ' ' + this.famname, this.famname + ' ' + this.givname, this.famname + ', ' + this.givname]; - if(this.data.ORG) { - names[names.length]=this.data.ORG[0].value; + } + }, + 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(''); } - $.each(names, function(key, value) { - $('#fn_select') - .append($('<option></option>') - .text(value)); - }); + }); + + with(this) { + delete fn; delete fullname; delete givname; delete famname; + delete addname; delete honpre; delete honsuf; + } + + if(this.data.FN) { + this.fn = this.data.FN[0]['value']; + } + else { + this.fn = ''; + } + if(this.data.N == undefined) { + narray = [this.fn,'','','','']; // Checking for non-existing 'N' property :-P + } else { + narray = this.data.N[0]['value']; + } + this.famname = narray[0] || ''; + this.givname = narray[1] || ''; + this.addname = narray[2] || ''; + this.honpre = narray[3] || ''; + this.honsuf = narray[4] || ''; + if(this.honpre.length > 0) { + this.fullname += this.honpre + ' '; + } + if(this.givname.length > 0) { + this.fullname += ' ' + this.givname; + } + if(this.addname.length > 0) { + this.fullname += ' ' + this.addname; + } + if(this.famname.length > 0) { + this.fullname += ' ' + this.famname; + } + if(this.honsuf.length > 0) { + this.fullname += ', ' + this.honsuf; + } + $('#n').val(narray.join(';')); + $('#fn_select option').remove(); + var names = [this.fn, this.fullname, this.givname + ' ' + this.famname, this.famname + ' ' + this.givname, this.famname + ', ' + this.givname]; + if(this.data.ORG) { + names[names.length]=this.data.ORG[0].value; + } + $.each(names, function(key, value) { + $('#fn_select') + .append($('<option></option>') + .text(value)); + }); $('#fn_select').combobox('value', this.fn); $('#contact_identity').find('*[data-element="N"]').data('checksum', this.data.N[0]['checksum']); if(this.data.FN) { $('#contact_identity').find('*[data-element="FN"]').data('checksum', this.data.FN[0]['checksum']); } $('#contact_identity').show(); - }, - hasCategory:function(category) { - if(this.data.CATEGORIES) { - var categories = this.data.CATEGORIES[0]['value'].split(/,\s*/); - for(var c in categories) { - var cat = this.data.CATEGORIES[0]['value'][c]; - if(typeof cat === 'string' && (cat.toUpperCase() === category.toUpperCase())) { - return true; - } + }, + hasCategory:function(category) { + if(this.data.CATEGORIES) { + var categories = this.data.CATEGORIES[0]['value'].split(/,\s*/); + for(var c in categories) { + var cat = this.data.CATEGORIES[0]['value'][c]; + if(typeof cat === 'string' && (cat.toUpperCase() === category.toUpperCase())) { + return true; } } - return false; - }, - categoriesChanged:function(newcategories) { // Categories added/deleted. - categories = $.map(newcategories, function(v) {return v;}); - $('#categories').multiple_autocomplete('option', 'source', categories); - var categorylist = $('#categories_value').find('input'); - $.getJSON(OC.filePath('contacts', 'ajax', 'categories/categoriesfor.php'),{'id':Contacts.UI.Card.id},function(jsondata){ - if(jsondata.status == 'success'){ - $('#categories_value').data('checksum', jsondata.data.checksum); - categorylist.val(jsondata.data.value); + } + return false; + }, + categoriesChanged:function(newcategories) { // Categories added/deleted. + categories = $.map(newcategories, function(v) {return v;}); + $('#categories').multiple_autocomplete('option', 'source', categories); + var categorylist = $('#categories_value').find('input'); + $.getJSON(OC.filePath('contacts', 'ajax', 'categories/categoriesfor.php'),{'id':OC.Contacts.Card.id},function(jsondata){ + if(jsondata.status == 'success'){ + $('#categories_value').data('checksum', jsondata.data.checksum); + categorylist.val(jsondata.data.value); + } else { + OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); + } + }); + }, + savePropertyInternal:function(name, fields, oldchecksum, checksum) { + // TODO: Add functionality for new fields. + //console.log('savePropertyInternal: ' + name + ', fields: ' + fields + 'checksum: ' + checksum); + //console.log('savePropertyInternal: ' + this.data[name]); + var multivalue = ['CATEGORIES']; + var params = {}; + var value = multivalue.indexOf(name) != -1 ? new Array() : undefined; + jQuery.each(fields, function(i, field){ + //.substring(11,'parameters[TYPE][]'.indexOf(']')) + if(field.name.substring(0, 5) === 'value') { + if(multivalue.indexOf(name) != -1) { + value.push(field.value); } else { - 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); + value = 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; + } 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); } - }, - 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. - Contacts.UI.loading(obj, true); - var checksum = container.data('checksum'); - var name = container.data('element'); - var fields = container.find('input.contacts_property,select.contacts_property').serializeArray(); - switch(name) { - case 'FN': - var nempty = true; - for(var i in Contacts.UI.Card.data.N[0]['value']) { - if(Contacts.UI.Card.data.N[0]['value'][i] != '') { - nempty = false; - break; - } + }); + 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; } - if(nempty) { - $('#n').val(fields[0].value + ';;;;'); - Contacts.UI.Card.data.N[0]['value'] = Array(fields[0].value, '', '', '', ''); - setTimeout(function() {Contacts.UI.Card.saveProperty($('#n'))}, 500); + } + }, + saveProperty:function(obj) { + if(!$(obj).hasClass('contacts_property')) { + return false; + } + if($(obj).hasClass('nonempty') && $(obj).val().trim() == '') { + OC.dialogs.alert(t('contacts', 'This property has to be non-empty.'), t('contacts', 'Error')); + return false; + } + container = $(obj).parents('.propertycontainer').first(); // get the parent holding the metadata. + OC.Contacts.loading(obj, true); + var checksum = container.data('checksum'); + var name = container.data('element'); + var fields = container.find('input.contacts_property,select.contacts_property').serializeArray(); + switch(name) { + case 'FN': + var nempty = true; + for(var i in OC.Contacts.Card.data.N[0]['value']) { + if(OC.Contacts.Card.data.N[0]['value'][i] != '') { + nempty = false; + break; } - 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')); - Contacts.UI.loading(obj, false); - return false; - } - q = q + '&id=' + this.id + '&name=' + name; - if(checksum != undefined && checksum != '') { // save + } + 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); + console.log('Saving: ' + q); $(obj).attr('disabled', 'disabled'); - $.post(OC.filePath('contacts', 'ajax', 'saveproperty.php'),q,function(jsondata){ + $.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); - Contacts.UI.Card.savePropertyInternal(name, fields, checksum, jsondata.data.checksum); - Contacts.UI.loading(obj, false); + 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')); - Contacts.UI.loading(obj, false); + 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); + } else { // add + console.log('Adding: ' + q); $(obj).attr('disabled', 'disabled'); - $.post(OC.filePath('contacts', 'ajax', 'addproperty.php'),q,function(jsondata){ + $.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 - //Contacts.UI.Card.savePropertyInternal(name, fields, checksum, jsondata.data.checksum); - Contacts.UI.loading(obj, false); + //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')); - Contacts.UI.loading(obj, false); + OC.Contacts.loading(obj, false); $(obj).removeAttr('disabled'); + OC.Contacts.Card.update({cid:OC.Contacts.Card.id}); return false; } },'json'); - } - }, - addProperty:function(type){ - switch (type) { - case 'PHOTO': - this.loadPhoto(true); - $('#file_upload_form').show(); - $('#contacts_propertymenu_dropdown a[data-type="'+type+'"]').parent().hide(); - $('#file_upload_start').trigger('click'); - break; - case 'NOTE': - $('#note').show(); - $('#contacts_propertymenu_dropdown a[data-type="'+type+'"]').parent().hide(); - $('#note').find('textarea').expandingTextarea(); - $('#note').find('textarea').focus(); - break; - case 'EMAIL': - if($('#emaillist>li').length == 1) { - $('#emails').show(); - } - Contacts.UI.Card.addMail(); - break; - case 'TEL': - if($('#phonelist>li').length == 1) { - $('#phones').show(); - } - Contacts.UI.Card.addPhone(); - break; - case 'ADR': - if($('#addressdisplay>dl').length == 1) { - $('#addresses').show(); - } - Contacts.UI.Card.editAddress('new', true); - break; - case 'NICKNAME': - 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){ - Contacts.UI.loading(obj, true); - var checksum = Contacts.UI.checksumFor(obj); - if(checksum) { - $.post(OC.filePath('contacts', 'ajax', 'deleteproperty.php'),{'id': this.id, 'checksum': checksum },function(jsondata){ - if(jsondata.status == 'success'){ - if(type == 'list') { - Contacts.UI.propertyContainerFor(obj).remove(); - } else if(type == 'single') { - var proptype = Contacts.UI.propertyTypeFor(obj); - Contacts.UI.Card.data[proptype] = null; - var othertypes = ['NOTE', 'PHOTO']; - if(othertypes.indexOf(proptype) != -1) { - Contacts.UI.propertyContainerFor(obj).data('checksum', ''); - if(proptype == 'PHOTO') { - Contacts.UI.Contacts.refreshThumbnail(Contacts.UI.Card.id); - Contacts.UI.Card.loadPhoto(true); - } else if(proptype == 'NOTE') { - $('#note').find('textarea').val(''); - Contacts.UI.propertyContainerFor(obj).hide(); - } - } else { - $('dl dt[data-element="'+proptype+'"],dd[data-element="'+proptype+'"]').hide(); - $('dl dd[data-element="'+proptype+'"]').data('checksum', ''); - $('dl dd[data-element="'+proptype+'"]').find('input').val(''); + } + }, + 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(); } - $('#contacts_propertymenu_dropdown a[data-type="'+proptype+'"]').parent().show(); - Contacts.UI.loading(obj, false); } else { - OC.dialogs.alert(t('contacts', '\'deleteProperty\' called without type argument. Please report at bugs.owncloud.org'), t('contacts', 'Error')); - Contacts.UI.loading(obj, false); + $('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{ - Contacts.UI.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') { - Contacts.UI.propertyContainerFor(obj).remove(); - } else if(type == 'single') { - var proptype = Contacts.UI.propertyTypeFor(obj); - $('dl dt[data-element="'+proptype+'"],dd[data-element="'+proptype+'"]').hide(); - $('#contacts_propertymenu_dropdown a[data-type="'+proptype+'"]').parent().show(); - Contacts.UI.loading(obj, false); - } else { - OC.dialogs.alert(t('contacts', '\'deleteProperty\' called without type argument. Please report at bugs.owncloud.org'), t('contacts', 'Error')); } + 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(){ - var isnew = (this.id == ''); - /* Initialize the name edit dialog */ - if($('#edit_name_dialog').dialog('isOpen') == true){ - $('#edit_name_dialog').dialog('moveToTop'); - }else{ - $('#dialog_holder').load(OC.filePath('contacts', 'ajax', 'editname.php')+'?id='+this.id, function(jsondata){ - if(jsondata.status != 'error'){ - $('#edit_name_dialog' ).dialog({ - modal: true, - closeOnEscape: (isnew == '' && false || true), - title: (isnew && t('contacts', 'Add contact') || t('contacts', 'Edit name')), - height: 'auto', width: 'auto', - buttons: { - 'Ok':function() { - Contacts.UI.Card.saveName(this); - $(this).dialog('destroy').remove(); - }, - 'Cancel':function() { $(this).dialog('destroy').remove(); } - }, - close: function(event, ui) { - $(this).dialog('destroy').remove(); - //return event; + } + }, + 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'); }, - open: function(event, ui) { - // load 'N' property - maybe :-P - } - }); - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); + 'Cancel':function() { $(this).dialog('close'); } + }, + close: function(event, ui) { + $(this).dialog('destroy').remove(); + $('#name_dialog').remove(); + }, + open: function(event, ui) { + // load 'N' property - maybe :-P + } + }); + } else { + OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); + } + }); + } + }, + saveName:function(dlg) { + if(!this.enabled) { + return; + } + //console.log('saveName, id: ' + this.id); + var n = new Array($(dlg).find('#fam').val().strip_tags(),$(dlg).find('#giv').val().strip_tags(),$(dlg).find('#add').val().strip_tags(),$(dlg).find('#pre').val().strip_tags(),$(dlg).find('#suf').val().strip_tags()); + this.famname = n[0]; + this.givname = n[1]; + this.addname = n[2]; + this.honpre = n[3]; + this.honsuf = n[4]; + this.fullname = ''; + + $('#n').val(n.join(';')); + if(n[3].length > 0) { + this.fullname = n[3] + ' '; + } + this.fullname += n[1] + ' ' + n[2] + ' ' + n[0]; + if(n[4].length > 0) { + this.fullname += ', ' + n[4]; + } + + $('#fn_select option').remove(); + //$('#fn_select').combobox('value', this.fn); + var tmp = [this.fullname, this.givname + ' ' + this.famname, this.famname + ' ' + this.givname, this.famname + ', ' + this.givname]; + var names = new Array(); + for(var name in tmp) { + if(names.indexOf(tmp[name]) == -1) { + names.push(tmp[name]); } - }, - saveName:function(dlg){ - //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 = ''; + } + $.each(names, function(key, value) { + $('#fn_select') + .append($('<option></option>') + .text(value)); + }); - $('#n').val(n.join(';')); - if(n[3].length > 0) { - this.fullname = n[3] + ' '; + 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>'; } - this.fullname += n[1] + ' ' + n[2] + ' ' + n[0]; - if(n[4].length > 0) { - this.fullname += ', ' + n[4]; + if(adrarray[1] && adrarray[1].length > 0) { + adrtxt = adrtxt + '<li>' + adrarray[1].strip_tags() + '</li>'; } - - $('#fn_select option').remove(); - //$('#fn_select').combobox('value', this.fn); - var tmp = [this.fullname, this.givname + ' ' + this.famname, this.famname + ' ' + this.givname, this.famname + ', ' + this.givname]; - var names = new Array(); - for(var name in tmp) { - if(names.indexOf(tmp[name]) == -1) { - names.push(tmp[name]); - } + if(adrarray[2] && adrarray[2].length > 0) { + adrtxt = adrtxt + '<li>' + adrarray[2].strip_tags() + '</li>'; } - $.each(names, function(key, value) { - $('#fn_select') - .append($('<option></option>') - .text(value)); - }); - - if(this.id == '') { - var aid = $(dlg).find('#aid').val(); - Contacts.UI.Card.add(n.join(';'), $('#short').text(), aid); - } else { - Contacts.UI.Card.saveProperty($('#n')); + 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>'; } - }, - loadAddresses:function(){ - $('#addresses').hide(); - $('#addressdisplay dl.propertycontainer').remove(); - for(var adr in this.data.ADR) { - $('#addressdisplay dl').first().clone().insertAfter($('#addressdisplay dl').last()).show(); - $('#addressdisplay dl').last().removeClass('template').addClass('propertycontainer'); - $('#addressdisplay 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((adrarray[3] && adrarray[5]) && 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>'; - } - $('#addressdisplay 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]); - } - } - $('#addressdisplay dl').last().find('.adr_type_label').text(types.join('/')); - $('#addressdisplay dl').last().find('.adr_type').val(ttypes.join(',')); - $('#addressdisplay dl').last().find('.adr').val(adrarray.join(';')); - $('#addressdisplay dl').last().data('checksum', this.data.ADR[adr]['checksum']); + if(adrarray[4] && adrarray[4].length > 0) { + adrtxt = adrtxt + '<li>' + adrarray[4].strip_tags() + '</li>'; } - if($('#addressdisplay dl').length > 1) { - $('#addresses').show(); - $('#contact_communication').show(); + if(adrarray[6] && adrarray[6].length > 0) { + adrtxt = adrtxt + '<li>' + adrarray[6].strip_tags() + '</li>'; } - return false; - }, - editAddress:function(obj, isnew){ - var container = undefined; - var q = q = '?id=' + this.id; - if(obj === 'new') { - isnew = true; - $('#addressdisplay dl').first().clone(true).insertAfter($('#addressdisplay dl').last()).show(); - container = $('#addressdisplay dl').last(); - container.removeClass('template').addClass('propertycontainer'); - } else { - q = q + '&checksum='+Contacts.UI.checksumFor(obj); + 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]); + } } - /* Initialize the address edit dialog */ - if($('#edit_address_dialog').dialog('isOpen') == true){ - $('#edit_address_dialog').dialog('moveToTop'); - }else{ - $('#dialog_holder').load(OC.filePath('contacts', 'ajax', 'editaddress.php')+q, function(jsondata){ - if(jsondata.status != 'error'){ - $('#edit_address_dialog' ).dialog({ - /*modal: true,*/ - height: 'auto', width: 'auto', - buttons: { - 'Ok':function() { - if(isnew) { - Contacts.UI.Card.saveAddress(this, $('#addressdisplay dl:last-child').find('input').first(), isnew); - } else { - Contacts.UI.Card.saveAddress(this, obj, isnew); - } - $(this).dialog('destroy').remove(); - }, - 'Cancel':function() { - $(this).dialog('destroy').remove(); - if(isnew) { - container.remove(); - } + 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'); }, - close : function(event, ui) { - $(this).dialog('destroy').remove(); + 'Cancel':function() { + $(this).dialog('close'); if(isnew) { container.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); + } + }, + 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 + } + })); } - }, - open: function() { - $( this ).removeClass( "ui-corner-all" ).addClass( "ui-corner-top" ); - }, - close: function() { - $( this ).removeClass( "ui-corner-top" ).addClass( "ui-corner-all" ); + }); + }, + minLength: 2, + select: function( event, ui ) { + if(ui.item && $('#adr_country').val().trim().length == 0) { + $('#adr_country').val(ui.item.country); } - }); - $( "#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); + }, + 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 + } + })); } - 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" ); + }); + }, + minLength: 2, + select: function( event, ui ) { + /*if(ui.item) { + $('#adr_country').val(ui.item.country); } - }); - } - }); - } else { - alert(jsondata.data.message); - } - }); - } - }, - saveAddress:function(dlg, obj, isnew){ - if(isnew) { - container = $('#addressdisplay dl').last(); - obj = $('#addressdisplay dl:last-child').find('input').first(); - } else { - checksum = Contacts.UI.checksumFor(obj); - container = Contacts.UI.propertyContainerFor(obj); + 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); + }, + 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); } - 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()))); - Contacts.UI.Card.saveProperty($(container).find('input').first()); - var adrtxt = ''; - if(adr[0].length > 0) { - adrtxt = adrtxt + '<li>' + adr[0] + '</li>'; + else{ + OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); } - if(adr[1].length > 0) { - adrtxt = adrtxt + '<li>' + adr[1] + '</li>'; + }); + }, + 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); } - if(adr[2].length > 0) { - adrtxt = adrtxt + '<li>' + adr[2] + '</li>'; + else{ + wrapper.removeClass('wait'); + OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); } - if(adr[3].length > 0 || adr[5].length > 0) { - adrtxt = adrtxt + '<li>' + adr[5] + ' ' + adr[3] + '</li>'; + }); + }, + editPhoto:function(id, tmpkey){ + if(!this.enabled) { + return; + } + //alert('editPhoto: ' + tmpkey); + $.getJSON(OC.filePath('contacts', 'ajax', 'cropphoto.php'),{'tmpkey':tmpkey,'id':this.id, 'requesttoken':requesttoken},function(jsondata){ + if(jsondata.status == 'success'){ + //alert(jsondata.data.page); + $('#edit_photo_dialog_img').html(jsondata.data.page); } - if(adr[4].length > 0) { - adrtxt = adrtxt + '<li>' + adr[4] + '</li>'; + else{ + OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); } - if(adr[6].length > 0) { - adrtxt = adrtxt + '<li>' + adr[6] + '</li>'; + }); + 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'); } - $(container).find('.addresslist').html(adrtxt); - }, - uploadPhoto:function(filelist) { - if(!filelist) { - OC.dialogs.alert(t('contacts','No files selected for upload.'), t('contacts', 'Error')); - return; + }); + 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()); + } } - 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'){ - Contacts.UI.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')); + } + 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'); + emaillist.find('li:last-child').find('input[type="email"]').focus(); + emaillist.find('li:last-child').find('select').multiselect({ + noneSelectedText: t('contacts', 'Select type'), + header: false, + selectedList: 4, + classes: 'typelist' + }); + 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>'); + } } - }); - form.submit(); + } } - }, - loadPhotoHandlers:function(){ - $('#phototools li a').tipsy('hide'); - $('#phototools li a').tipsy(); - $('#phototools li a').click(function() { - $(this).tipsy('hide'); - }); - $('#contacts_details_photo_wrapper').hover( - function () { - $('#phototools').slideDown(200); - }, - function () { - $('#phototools').slideUp(200); + 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'); } - ); - $('#phototools').hover( - function () { - $(this).removeClass('transparent'); - }, - function () { - $(this).addClass('transparent'); + 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>'); + } + } } - ); - if(this.data.PHOTO) { - $('#phototools .delete').click(function() { - $(this).tipsy('hide'); - Contacts.UI.Card.deleteProperty($('#contacts_details_photo'), 'single'); - $(this).hide(); - }); - $('#phototools .edit').click(function() { - $(this).tipsy('hide'); - Contacts.UI.Card.editCurrentPhoto(); - }); - } else { - $('#phototools .delete').hide(); - $('#phototools .edit').hide(); } - $('#phototools .upload').click(function() { - $('#file_upload_start').trigger('click'); - }); - $('#phototools .cloud').click(function() { - OC.dialogs.filepicker(t('contacts', 'Select photo'), Contacts.UI.Card.cloudPhotoSelected, false, 'image', true); - }); - }, - cloudPhotoSelected:function(path){ - $.getJSON(OC.filePath('contacts', 'ajax', 'oc_photo.php'),{'path':path,'id':Contacts.UI.Card.id},function(jsondata){ - if(jsondata.status == 'success'){ - //alert(jsondata.data.page); - Contacts.UI.Card.editPhoto(jsondata.data.id, jsondata.data.tmp) - $('#edit_photo_dialog_img').html(jsondata.data.page); + 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); } - else{ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); + } + } + }, + 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')); + } + }); } - }); - }, - loadPhoto:function(refresh){ - $('#phototools li a').tipsy('hide'); - $.getJSON(OC.filePath('contacts', 'ajax', 'loadphoto.php'),{'id':this.id, 'refresh': refresh},function(jsondata){ + } + 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'){ - $('#contacts_details_photo_wrapper').data('checksum', jsondata.data.checksum); - $('#contacts_details_photo_wrapper').html(jsondata.data.page); - Contacts.UI.Card.loadPhotoHandlers(); - } - else{ + 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')); } - }); - $('#file_upload_form').show(); - $('#contacts_propertymenu_dropdown a[data-type="PHOTO"]').parent().hide(); - }, - editCurrentPhoto:function(){ - $.getJSON(OC.filePath('contacts', 'ajax', 'currentphoto.php'),{'id':this.id},function(jsondata){ + }); + }, + 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'){ - //alert(jsondata.data.page); - Contacts.UI.Card.editPhoto(jsondata.data.id, jsondata.data.tmp) - $('#edit_photo_dialog_img').html(jsondata.data.page); - } - else{ + OC.Contacts.Contacts.update(); // Easier to refresh the whole bunch. + } else { OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); } }); - }, - editPhoto:function(id, tmp_path){ - //alert('editPhoto: ' + tmp_path); - $.getJSON(OC.filePath('contacts', 'ajax', 'cropphoto.php'),{'tmp_path':tmp_path,'id':this.id,'requesttoken':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')); + } else { + return false; + } + }, + /** + * @params params An object with the properties 'contactlist':a jquery object of the ul to insert into, + * 'contacts':a jquery object of all items in the list and either 'data': an object with the properties + * id, addressbookid and displayname or 'contact': a listitem to be inserted directly. + * If 'contactlist' or 'contacts' aren't defined they will be search for based in the properties in 'data'. + */ + insertContact:function(params) { + var id, bookid; + if(!params.contactlist) { + // FIXME: Check if contact really exists. + bookid = params.data ? params.data.addressbookid : params.contact.data('bookid'); + id = params.data ? params.data.id : params.contact.data('id'); + params.contactlist = $('#contacts ul[data-id="'+bookid+'"]'); + } + if(!params.contacts) { + bookid = params.data ? params.data.addressbookid : params.contact.data('bookid'); + id = params.data ? params.data.id : params.contact.data('id'); + params.contacts = $('#contacts ul[data-id="'+bookid+'"] li'); + } + var contact = params.data + ? $('<li data-id="'+params.data.id+'" data-bookid="'+params.data.addressbookid + + '" role="button"><a href="'+OC.linkTo('contacts', 'index.php')+'&id=' + + params.data.id+'" style="background: url('+OC.filePath('contacts', '', 'thumbnail.php') + + '?id='+params.data.id+') no-repeat scroll 0% 0% transparent;">' + + params.data.displayname+'</a></li>') + : params.contact; + var added = false; + var name = params.data ? params.data.displayname.toLowerCase() : contact.find('a').text().toLowerCase(); + if(params.contacts) { + params.contacts.each(function() { + if ($(this).text().toLowerCase() > name) { + $(this).before(contact); + added = true; + return false; } }); - if($('#edit_photo_dialog').dialog('isOpen') == true){ - $('#edit_photo_dialog').dialog('moveToTop'); + } + 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 { - $('#edit_photo_dialog').dialog('open'); + OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); + return false; } - }, - savePhoto:function(){ - var target = $('#crop_target'); - var form = $('#cropform'); - form.submit(); - target.load(function(){ - var response=jQuery.parseJSON(target.contents().text()); - if(response != undefined && response.status == 'success'){ - // load cropped photo. - $('#contacts_details_photo_wrapper').html(response.data.page); - Contacts.UI.Card.data.PHOTO = true; - Contacts.UI.Card.loadPhotoHandlers(); - }else{ - OC.dialogs.alert(response.data.message, t('contacts', 'Error')); + }); + }, + doImport:function(file, aid){ + $.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}); } + }); + 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') }); - Contacts.UI.Contacts.refreshThumbnail(this.id); - }, - addMail:function() { - //alert('addMail'); - $('#emaillist li.template:first-child').clone(true).appendTo($('#emaillist')).show().find('a .tip').tipsy(); - $('#emaillist li.template:last-child').find('select').addClass('contacts_property'); - $('#emaillist li.template:last-child').removeClass('template').addClass('propertycontainer'); - $('#emaillist li:last-child').find('input[type="email"]').focus(); - return false; - }, - loadMails:function() { - $('#emails').hide(); - $('#emaillist li.propertycontainer').remove(); - for(var mail in this.data.EMAIL) { - this.addMail(); - //$('#emaillist li:first-child').clone().appendTo($('#emaillist')).show(); - $('#emaillist li:last-child').data('checksum', this.data.EMAIL[mail]['checksum']) - $('#emaillist li:last-child').find('input[type="email"]').val(this.data.EMAIL[mail]['value']); - for(var param in this.data.EMAIL[mail]['parameters']) { - if(param.toUpperCase() == 'PREF') { - $('#emaillist li:last-child').find('input[type="checkbox"]').attr('checked', 'checked') - } - else if(param.toUpperCase() == 'TYPE') { - for(etype in this.data.EMAIL[mail]['parameters'][param]) { - var et = this.data.EMAIL[mail]['parameters'][param][etype]; - $('#emaillist li:last-child').find('select option').each(function(){ - if($.inArray($(this).val().toUpperCase(), et.toUpperCase().split(',')) > -1) { - $(this).attr('selected', 'selected'); - } - }); - } - } - } + } + }, + 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') + }); } - if($('#emaillist li').length > 1) { - $('#emails').show(); - $('#contact_communication').show(); + } + }, + previousAddressbook:function() { + console.log('previousAddressbook'); + this.nextAddressbook(true); + }, + // Reload the contacts list. + update:function(params){ + if(!params) { params = {}; } + if(!params.start) { + if(params.aid) { + $('#contacts h3[data-id="'+params.aid+'"],#contacts ul[data-id="'+params.aid+'"]').remove(); + } else { + $('#contacts').empty(); } - - $('#emaillist li:last-child').find('input[type="text"]').focus(); - return false; - }, - addPhone:function() { - $('#phonelist li.template:first-child').clone(true).appendTo($('#phonelist')); //.show(); - $('#phonelist li.template:last-child').find('select').addClass('contacts_property'); - $('#phonelist li.template:last-child').removeClass('template').addClass('propertycontainer'); - $('#phonelist li:last-child').find('input[type="text"]').focus(); - $('#phonelist li:last-child').find('select').multiselect({ - noneSelectedText: t('contacts', 'Select type'), - header: false, - selectedList: 4, - classes: 'typelist' - }); - $('#phonelist li:last-child').show(); - return false; - }, - loadPhones:function() { - $('#phones').hide(); - $('#phonelist li.propertycontainer').remove(); - for(var phone in this.data.TEL) { - this.addPhone(); - $('#phonelist li:last-child').find('select').multiselect('destroy'); - $('#phonelist li:last-child').data('checksum', this.data.TEL[phone]['checksum']) - $('#phonelist li:last-child').find('input[type="text"]').val(this.data.TEL[phone]['value']); - for(var param in this.data.TEL[phone]['parameters']) { - if(param.toUpperCase() == 'PREF') { - $('#phonelist li:last-child').find('input[type="checkbox"]').attr('checked', 'checked'); - } - else if(param.toUpperCase() == 'TYPE') { - for(ptype in this.data.TEL[phone]['parameters'][param]) { - var pt = this.data.TEL[phone]['parameters'][param][ptype]; - $('#phonelist li:last-child').find('select option').each(function(){ - //if ($(this).val().toUpperCase() == pt.toUpperCase()) { - if ($.inArray($(this).val().toUpperCase(), pt.toUpperCase().split(',')) > -1) { - $(this).attr('selected', 'selected'); + } + self = this; + console.log('update: ' + params.cid + ' ' + params.aid + ' ' + params.start); + var firstrun = false; + var opts = {}; + opts['startat'] = (params.start?params.start:0); + if(params.aid) { + opts['aid'] = params.aid; + } + $.getJSON(OC.filePath('contacts', 'ajax', 'contact/list.php'),opts,function(jsondata){ + if(jsondata.status == 'success'){ + var books = jsondata.data.entries; + $.each(books, function(b, book) { + if($('#contacts h3[data-id="'+b+'"]').length == 0) { + firstrun = true; + if($('#contacts h3').length == 0) { + $('#contacts').html('<h3 class="addressbook" contextmenu="addressbookmenu" data-id="' + + b + '" data-permissions="' + book.permissions + '">' + book.displayname + + '</h3><ul class="contacts hidden" data-id="'+b+'" data-permissions="' + + book.permissions + '"></ul>'); + } else { + if(!$('#contacts h3[data-id="' + b + '"]').length) { + var item = $('<h3 class="addressbook" contextmenu="addressbookmenu" data-id="' + + b + '" data-permissions="' + book.permissions + '">' + + book.displayname+'</h3><ul class="contacts hidden" data-id="' + b + + '" data-permissions="' + book.permissions + '"></ul>'); + var added = false; + $('#contacts h3').each(function(){ + if ($(this).text().toLowerCase() > book.displayname.toLowerCase()) { + $(this).before(item).fadeIn('fast'); + added = true; + return false; + } + }); + if(!added) { + $('#contacts').append(item); } - }); + } } + $('#contacts h3[data-id="'+b+'"]').on('click', function(event) { + $('#contacts h3').removeClass('active'); + $(this).addClass('active'); + $('#contacts ul[data-id="'+b+'"]').slideToggle(300); + return false; + }); + var accept = 'li:not([data-bookid="'+b+'"]),h3:not([data-id="'+b+'"])'; + $('#contacts h3[data-id="'+b+'"],#contacts ul[data-id="'+b+'"]').droppable({ + drop: OC.Contacts.Contacts.drop, + activeClass: 'ui-state-hover', + accept: accept + }); } - } - $('#phonelist li:last-child').find('select').multiselect({ - noneSelectedText: t('contacts', 'Select type'), - header: false, - selectedList: 4, - classes: 'typelist' - }); - } - if($('#phonelist li').length > 1) { - $('#phones').show(); - $('#contact_communication').show(); - } - return false; - }, - }, - Addressbooks:{ - droptarget:undefined, - droptext:t('contacts', 'Drop a VCF file to import contacts.'), - overview:function(){ - if($('#chooseaddressbook_dialog').dialog('isOpen') == true){ - $('#chooseaddressbook_dialog').dialog('moveToTop'); - }else{ - $('#dialog_holder').load(OC.filePath('contacts', 'ajax', 'chooseaddressbook.php'), function(jsondata){ - if(jsondata.status != 'error'){ - $('#chooseaddressbook_dialog').dialog({ - minWidth: 600, - close: function(event, ui) { - $(this).dialog('destroy').remove(); + 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}); + } + }); } - }).css('overflow','visible'); - } else { - alert(jsondata.data.message); + } } }); - } - return false; - }, - activation:function(checkbox, bookid) - { - $.post(OC.filePath('contacts', 'ajax', 'activation.php'), { bookid: bookid, active: checkbox.checked?1:0 }, - function(data) { - if (data.status == 'success'){ - checkbox.checked = data.active == 1; - Contacts.UI.Contacts.update(); - } - }); - }, - newAddressbook:function(object){ - var tr = $(document.createElement('tr')) - .load(OC.filePath('contacts', 'ajax', 'addbook.php')); - $(object).closest('tr').after(tr).hide(); - }, - editAddressbook:function(object, bookid){ - var tr = $(document.createElement('tr')) - .load(OC.filePath('contacts', 'ajax', 'editaddressbook.php') + "?bookid="+bookid); - $(object).closest('tr').after(tr).hide(); - }, - deleteAddressbook:function(obj, bookid){ - var check = confirm("Do you really want to delete this address book?"); - if(check == false){ - return false; - }else{ - $.post(OC.filePath('contacts', 'ajax', 'deletebook.php'), { id: bookid}, - function(jsondata) { - if (jsondata.status == 'success'){ - $(obj).closest('tr').remove(); - Contacts.UI.Contacts.update(); - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } - }, - loadImportHandlers:function() { - $('#import_upload_start').change(function(){ - Contacts.UI.Addressbooks.uploadImport(this.files); - }); - $('#importaddressbook_dialog').find('.upload').click(function() { - Contacts.UI.Addressbooks.droptarget.html(t('contacts', 'Uploading...')); - Contacts.UI.loading(Contacts.UI.Addressbooks.droptarget, true); - //$('#import_upload_start').trigger('click'); - //return false; - }); - $('#importaddressbook_dialog').find('.upload').tipsy(); - this.droptarget = $('#import_drop_target'); - $(this.droptarget).bind('dragover',function(event){ - $(event.target).addClass('droppable'); - event.stopPropagation(); - event.preventDefault(); - }); - $(this.droptarget).bind('dragleave',function(event){ - $(event.target).removeClass('droppable'); - }); - $(this.droptarget).bind('drop',function(event){ - event.stopPropagation(); - event.preventDefault(); - $(event.target).removeClass('droppable'); - $(event.target).html(t('contacts', 'Uploading...')); - Contacts.UI.loading(event.target, true); - $.importUpload(event.originalEvent.dataTransfer.files); - }); - - $.importUpload = 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')); - $(Contacts.UI.Addressbooks.droptarget).html(Contacts.UI.Addressbooks.droptext); - Contacts.UI.loading(Contacts.UI.Addressbooks.droptarget, false); - return; + 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(file.type.indexOf('text') != 0) { - OC.dialogs.alert(t('contacts','You have dropped a file type that cannot be imported: ') + file.type, t('contacts','Wrong file type')); - $(Contacts.UI.Addressbooks.droptarget).html(Contacts.UI.Addressbooks.droptext); - Contacts.UI.loading(Contacts.UI.Addressbooks.droptarget, false); - return; + if(opts['startat'] == 0) { // only update card on first load. + OC.Contacts.Card.update(params); } - var xhr = new XMLHttpRequest(); - - if (!xhr.upload) { - OC.dialogs.alert(t('contacts', 'Your browser doesn\'t support AJAX upload. Please upload the contacts file to ownCloud and import that way.'), t('contacts', 'Error')) - } - importUpload = xhr.upload, - xhr.onreadystatechange = function() { - if (xhr.readyState == 4){ - response = $.parseJSON(xhr.responseText); - if(response.status == 'success') { - if(xhr.status == 200) { - Contacts.UI.Addressbooks.doImport(response.data.path, response.data.file); - } else { - $(Contacts.UI.Addressbooks.droptarget).html(Contacts.UI.Addressbooks.droptext); - Contacts.UI.loading(Contacts.UI.Addressbooks.droptarget, false); - OC.dialogs.alert(xhr.status + ': ' + xhr.responseText, t('contacts', 'Error')); - } - } else { - OC.dialogs.alert(response.data.message, t('contacts', 'Error')); - } - } - }; - xhr.open('POST', OC.filePath('contacts', 'ajax', 'uploadimport.php') + '?file='+encodeURIComponent(file.name)+'&requesttoken='+requesttoken, 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); - } - }, - uploadImport:function(filelist) { - if(!filelist) { - OC.dialogs.alert(t('contacts','No files selected for upload.'), t('contacts', 'Error')); - return; - } - //var file = filelist.item(0); - var file = filelist[0]; - var target = $('#import_upload_target'); - var form = $('#import_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'){ - Contacts.UI.Addressbooks.doImport(response.data.path, response.data.file); - }else{ - OC.dialogs.alert(response.data.message, t('contacts', 'Error')); - } - }); - form.submit(); + OC.Contacts.notify({message:t('contacts', 'Error')+': '+jsondata.data.message}); } - }, - importAddressbook:function(object){ - var tr = $(document.createElement('tr')) - .load(OC.filePath('contacts', 'ajax', 'importaddressbook.php')); - $(object).closest('tr').after(tr).hide(); - }, - doImport:function(path, file){ - $(Contacts.UI.Addressbooks.droptarget).html(t('contacts', 'Importing...')); - Contacts.UI.loading(Contacts.UI.Addressbooks.droptarget, true); - var id = $('#importaddressbook_dialog').find('#book').val(); - $.post(OC.filePath('contacts', '', 'import.php'), { id: id, path: path, file: file, fstype: 'OC_FilesystemView' }, - function(jsondata){ - if(jsondata.status == 'success'){ - Contacts.UI.Addressbooks.droptarget.html(t('contacts', 'Import done. Success/Failure: ')+jsondata.data.imported+'/'+jsondata.data.failed); - $('#chooseaddressbook_dialog').find('#close_button').val(t('contacts', 'OK')); - Contacts.UI.Contacts.update(); - setTimeout( - function() { - $(Contacts.UI.Addressbooks.droptarget).html(Contacts.UI.Addressbooks.droptext); - }, 5000); - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - Contacts.UI.loading(Contacts.UI.Addressbooks.droptarget, false); - }, - submit:function(button, bookid){ - var displayname = $("#displayname_"+bookid).val().trim(); - var active = $("#edit_active_"+bookid+":checked").length; - var description = $("#description_"+bookid).val(); - - if(displayname.length == 0) { - OC.dialogs.alert(t('contacts', 'Displayname cannot be empty.'), t('contacts', 'Error')); - return false; - } - var url; - if (bookid == 'new'){ - url = OC.filePath('contacts', 'ajax', 'createaddressbook.php'); - }else{ - url = OC.filePath('contacts', 'ajax', 'updateaddressbook.php'); - } - $.post(url, { id: bookid, name: displayname, active: active, description: description }, - function(jsondata){ - if(jsondata.status == 'success'){ - $(button).closest('tr').prev().html(jsondata.page).show().next().remove(); - Contacts.UI.Contacts.update(); - } else { - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - }, - cancel:function(button, bookid){ - $(button).closest('tr').prev().show().next().remove(); - } + }); }, - Contacts:{ - // Reload the contacts list. - update:function(){ - $.getJSON(OC.filePath('contacts', 'ajax', 'contacts.php'),{},function(jsondata){ - if(jsondata.status == 'success'){ - $('#contacts').html(jsondata.data.page); - Contacts.UI.Card.update(); - } - else{ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - setTimeout(function() { - $('#contacts li').unbind('inview'); - $('#contacts li').bind('inview', function(event, isInView, visiblePartX, visiblePartY) { - if (isInView) { - if (!$(this).find('a').attr('style')) { - $(this).find('a').css('background','url('+OC.filePath('contacts', '', 'thumbnail.php')+'?id='+$(this).data('id')+') no-repeat'); - } - } - })}, 500); - setTimeout(Contacts.UI.Contacts.lazyupdate, 500); - }, - // Add thumbnails to the contact list as they become visible in the viewport. - lazyupdate:function(){ - $('#contacts li').live('inview', function(){ - if (!$(this).find('a').attr('style')) { - $(this).find('a').css('background','url('+OC.filePath('contacts', '', 'thumbnail.php')+'?id='+$(this).data('id')+') no-repeat'); - } - }); - }, - refreshThumbnail:function(id){ - var item = $('#contacts [data-id="'+id+'"]').find('a'); - item.html(Contacts.UI.Card.fn); - item.css('background','url('+OC.filePath('contacts', '', 'thumbnail.php')+'?id='+id+'&refresh=1'+Math.random()+') no-repeat'); - }, - scrollTo:function(id){ + 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: $('#leftcontent li[data-id="'+id+'"]').offset().top-20}, 'slow','swing'); + scrollTop: parseInt(item.offset()).top-40}, 'slow','swing'); } } } } $(document).ready(function(){ - OCCategories.changed = Contacts.UI.Card.categoriesChanged; + OCCategories.changed = OC.Contacts.Card.categoriesChanged; OCCategories.app = 'contacts'; - $('#notification').click(function(){ - $('#notification').fadeOut(); + 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'); }); - - $('#chooseaddressbook').click(Contacts.UI.Addressbooks.overview); - $('#chooseaddressbook').keydown(Contacts.UI.Addressbooks.overview); + $('#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) { + return; + } + //console.log(event.which + ' ' + event.target.nodeName); + /** + * To add: + * Shift-a: add addressbook + * u (85): hide/show leftcontent + * f (70): add field + */ + switch(event.which) { + case 27: // Esc + ninjahelp.hide(); + break; + case 46: // Delete + if(event.shiftKey) { + OC.Contacts.Card.delayedDelete(); + } + break; + case 40: // down + case 74: // j + OC.Contacts.Contacts.next(); + break; + case 65: // a + if(event.shiftKey) { + // add addressbook + OC.Contacts.notImplemented(); + break; + } + OC.Contacts.Card.editNew(); + break; + case 38: // up + case 75: // k + OC.Contacts.Contacts.previous(); + break; + case 34: // PageDown + case 78: // n + // next addressbook + OC.Contacts.Contacts.nextAddressbook(); + break; + case 79: // o + var aid = $('#contacts h3.active').first().data('id'); + if(aid) { + $('#contacts ul[data-id="'+aid+'"]').slideToggle(300); + } + break; + case 33: // PageUp + case 80: // p + // prev addressbook + OC.Contacts.Contacts.previousAddressbook(); + break; + case 82: // r + OC.Contacts.Contacts.update({cid:OC.Contacts.Card.id}); + break; + case 191: // ? + ninjahelp.toggle('fast'); + break; + } + + }); + + //$(window).on('beforeunload', OC.Contacts.Contacts.deleteFilesInQueue); - $('#contacts_newcontact').click(Contacts.UI.Card.editNew); - $('#contacts_newcontact').keydown(Contacts.UI.Card.editNew); - // Load a contact. - $('#contacts').keydown(function(event) { - if(event.which == 13) { - $('#contacts').click(); + $('.contacts').keydown(function(event) { + if(event.which == 13 || event.which == 32) { + $('.contacts').click(); } }); - $('#contacts').click(function(event){ + $(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){ - $('#contacts li[data-id="'+oldid+'"]').removeClass('active'); + 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'); + } } - $.getJSON(OC.filePath('contacts', 'ajax', 'contactdetails.php'),{'id':id},function(jsondata){ + $.getJSON(OC.filePath('contacts', 'ajax', 'contact/details.php'),{'id':id},function(jsondata){ if(jsondata.status == 'success'){ - Contacts.UI.Card.loadContact(jsondata.data); + OC.Contacts.Card.loadContact(jsondata.data, bookid); } else{ OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); @@ -1601,102 +2011,267 @@ $(document).ready(function(){ return false; }); - $('#contacts li').bind('inview', function(event, isInView, visiblePartX, visiblePartY) { - if (isInView) { //NOTE: I've kept all conditions for future reference ;-) - // element is now visible in the viewport - if (visiblePartY == 'top') { - // top part of element is visible - } else if (visiblePartY == 'bottom') { - // bottom part of element is visible - } else { - // whole part of element is visible - if (!$(this).find('a').attr('style')) { - //alert($(this).data('id') + ' has background: ' + $(this).attr('style')); - $(this).find('a').css('background','url('+OC.filePath('contacts', '', 'thumbnail.php')+'?id='+$(this).data('id')+') no-repeat'); - }/* else { - alert($(this).data('id') + ' has style ' + $(this).attr('style').match('url')); - }*/ + $('.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; } - } else { - // element has gone out of viewport + 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='+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); } }); - - $('.contacts_property').live('change', function(){ - Contacts.UI.Card.saveProperty(this); + + $(document).bind('drop dragover', function (e) { + e.preventDefault(); // prevent browser from doing anything, if file isn't dropped in dropZone }); - /** - * Upload function for dropped 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(); + //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') + } + // Import using jquery.fileupload + $(function() { + var uploadingFiles = {}, numfiles = 0, uploadedfiles = 0, retries = 0; + var aid; - 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) { - Contacts.UI.Card.editPhoto(response.data.id, response.data.tmp); + $('#import_upload_start').fileupload({ + dropZone: $('#contacts'), // restrict dropZone to contacts list. + acceptFileTypes: /^text\/(directory|vcard|x-vcard)$/i, + add: function(e, data) { + var files = data.files; + var totalSize=0; + if(files) { + numfiles += files.length; uploadedfiles = 0; + for(var i=0;i<files.length;i++) { + if(files[i].size ==0 && files[i].type== '') { + OC.dialogs.alert(t('files', 'Unable to upload your file as it is a directory or has 0 bytes'), t('files', 'Upload Error')); + return; + } + totalSize+=files[i].size; + } + } + if(totalSize>$('#max_upload').val()){ + OC.dialogs.alert(t('contacts','The file you are trying to upload exceed the maximum size for file uploads on this server.'), t('contacts','Upload too large')); + numfiles = uploadedfiles = retries = aid = 0; + uploadingFiles = {}; + return; + }else{ + if($.support.xhrFileUpload) { + for(var i=0;i<files.length;i++){ + var fileName = files[i].name; + var dropTarget; + if($(e.originalEvent.target).is('h3')) { + dropTarget = $(e.originalEvent.target).next('ul'); + } else { + dropTarget = $(e.originalEvent.target).closest('ul'); + } + if(dropTarget && dropTarget.hasClass('contacts')) { // TODO: More thorough check for where we are. + aid = dropTarget.attr('data-id'); + } else { + aid = undefined; + } + var jqXHR = $('#import_upload_start').fileupload('send', {files: files[i], + formData: function(form) { + var formArray = form.serializeArray(); + formArray['aid'] = aid; + return formArray; + }}) + .success(function(result, textStatus, jqXHR) { + if(result.status == 'success') { + // import the file + uploadedfiles += 1; + } else { + OC.Contacts.notify({message:jsondata.data.message}); + } + return false; + }) + .error(function(jqXHR, textStatus, errorThrown) { + console.log(textStatus); + OC.Contacts.notify({message:errorThrown + ': ' + textStatus,}); + }); + uploadingFiles[fileName] = jqXHR; + } } else { - OC.dialogs.alert(xhr.status + ': ' + xhr.responseText, t('contacts', 'Error')); + 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 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); + delete fileList[fileName]; + numfiles -= 1; uploadedfiles -= 1; + $('#uploadprogressbar').progressbar('value',50+(50/(todo-uploadedfiles))); + }) + $('#uploadprogressbar').progressbar('value',100); + $('#uploadprogressbar').fadeOut(); + setTimeout(function() { + OC.Contacts.Contacts.update({aid:aid}); + numfiles = uploadedfiles = retries = aid = 0; + }, 1000); + } + 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')); + } + }); } else { - OC.dialogs.alert(response.data.message, t('contacts', 'Error')); + // Dropped on an address book or it's list. + setTimeout(function() { // Just to let any uploads finish + importFiles(aid, uploadingFiles); + }, 1000); + } + if(data.dataType != 'iframe ') { + $('#upload input.stop').hide(); } } - }; - - 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='+Contacts.UI.Card.id+'&requesttoken='+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); - } - - $('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'); - Contacts.UI.Card.addProperty(type); - $('#contacts_propertymenu_dropdown').hide(); - } - $('#contacts_propertymenu_dropdown a').click(propertyMenuItem); - $('#contacts_propertymenu_dropdown a').keydown(propertyMenuItem); + + OC.Contacts.loadHandlers(); + OC.Contacts.Contacts.update({cid:id}); }); diff --git a/apps/contacts/js/jquery.combobox.js b/apps/contacts/js/jquery.combobox.js index f12d1d7dd20..d9959eb6cde 100644 --- a/apps/contacts/js/jquery.combobox.js +++ b/apps/contacts/js/jquery.combobox.js @@ -23,16 +23,16 @@ minLength: 0, source: function( request, response ) { var matcher = new RegExp( $.ui.autocomplete.escapeRegex(request.term), "i" ); - response( select.children( "option" ).map(function() { + response( select.children('option').map(function() { var text = $( this ).text(); if ( this.value && ( !request.term || matcher.test(text) ) ) return { label: text.replace( new RegExp( - "(?![^&;]+;)(?!<[^<>]*)(" + + '(?![^&;]+;)(?!<[^<>]*)(' + $.ui.autocomplete.escapeRegex(request.term) + - ")(?![^<>]*>)(?![^&;]+;)", "gi" - ), "<strong>$1</strong>" ), + ')(?![^<>]*>)(?![^&;]+;)', 'gi' + ), '<strong>$1</strong>'), value: text, option: this }; @@ -42,17 +42,17 @@ self.input.val($(ui.item.option).text()); self.input.trigger('change'); ui.item.option.selected = true; - self._trigger( "selected", event, { + self._trigger('selected', event, { item: ui.item.option }); }, change: function( event, ui ) { if ( !ui.item ) { - var matcher = new RegExp( "^" + $.ui.autocomplete.escapeRegex( $(this).val() ) + "$", "i" ), + var matcher = new RegExp( '^' + $.ui.autocomplete.escapeRegex( $(this).val() ) + '$', 'i' ), valid = false; self.input.val($(this).val()); //self.input.trigger('change'); - select.children( "option" ).each(function() { + select.children('option').each(function() { if ( $( this ).text().match( matcher ) ) { this.selected = valid = true; return false; @@ -62,36 +62,41 @@ // remove invalid value, as it didn't match anything $( this ).val( "" ); select.val( "" ); - input.data( "autocomplete" ).term = ""; + input.data('autocomplete').term = ''; return false; } } } }) - .addClass( "ui-widget ui-widget-content ui-corner-left" ); + .addClass('ui-widget ui-widget-content ui-corner-left'); - input.data( "autocomplete" )._renderItem = function( ul, item ) { - return $( "<li></li>" ) - .data( "item.autocomplete", item ) - .append( "<a>" + item.label + "</a>" ) + input.data('autocomplete')._renderItem = function( ul, item ) { + return $('<li></li>') + .data('item.autocomplete', item ) + .append('<a>' + item.label + '</a>') .appendTo( ul ); }; $.each(this.options, function(key, value) { self._setOption(key, value); }); + input.dblclick(function() { + // pass empty string as value to search for, displaying all results + input.autocomplete('search', ''); + }); + if(this.options['showButton']) { - this.button = $( "<button type='button'> </button>" ) - .attr( "tabIndex", -1 ) - .attr( "title", "Show All Items" ) + this.button = $('<button type="button"> </button>') + .attr('tabIndex', -1 ) + .attr('title', 'Show All Items') .insertAfter( input ) .addClass('svg') .addClass('action') .addClass('combo-button') .click(function() { // close if already visible - if ( input.autocomplete( "widget" ).is( ":visible" ) ) { - input.autocomplete( "close" ); + if ( input.autocomplete('widget').is(':visible') ) { + input.autocomplete('close'); return; } @@ -99,7 +104,7 @@ $( this ).blur(); // pass empty string as value to search for, displaying all results - input.autocomplete( "search", "" ); + input.autocomplete('search', ''); input.focus(); }); } diff --git a/apps/contacts/js/jquery.inview.js b/apps/contacts/js/jquery.inview.js index 01900b0b4b4..9687cd83368 100644 --- a/apps/contacts/js/jquery.inview.js +++ b/apps/contacts/js/jquery.inview.js @@ -62,8 +62,8 @@ function getViewportOffset() { return { - top: w.pageYOffset || documentElement.scrollTop || d.body.scrollTop, - left: w.pageXOffset || documentElement.scrollLeft || d.body.scrollLeft + top: w.pageYOffset || documentElement.scrollTop || (d.body?d.body.scrollTop:0), + left: w.pageXOffset || documentElement.scrollLeft || (d.body?d.body.scrollLeft:0) }; } diff --git a/apps/contacts/js/loader.js b/apps/contacts/js/loader.js index 0e6da10e024..3b1f4070485 100644 --- a/apps/contacts/js/loader.js +++ b/apps/contacts/js/loader.js @@ -42,8 +42,8 @@ Contacts_Import={ }
$('#newaddressbook').attr('readonly', 'readonly');
$('#contacts').attr('disabled', 'disabled');
- var progressfile = $('#progressfile').val();
- $.post(OC.filePath('contacts', '', 'import.php'), {method: String (method), addressbookname: String (addressbookname), path: String (path), file: String (filename), id: String (addressbookid)}, function(jsondata){
+ var progresskey = $('#progresskey').val();
+ $.post(OC.filePath('contacts', '', 'import.php') + '?progresskey='+progresskey, {method: String (method), addressbookname: String (addressbookname), path: String (path), file: String (filename), id: String (addressbookid)}, function(jsondata){
if(jsondata.status == 'success'){
$('#progressbar').progressbar('option', 'value', 100);
$('#import_done').find('p').html(t('contacts', 'Result: ') + jsondata.data.imported + t('contacts', ' imported, ') + jsondata.data.failed + t('contacts', ' failed.'));
@@ -55,7 +55,7 @@ Contacts_Import={ });
$('#form_container').css('display', 'none');
$('#progressbar_container').css('display', 'block');
- window.setTimeout('Contacts_Import.getimportstatus(\'' + progressfile + '\')', 500);
+ window.setTimeout('Contacts_Import.getimportstatus(\'' + progresskey + '\')', 500);
});
$('#contacts').change(function(){
if($('#contacts option:selected').val() == 'newaddressbook'){
@@ -65,11 +65,11 @@ Contacts_Import={ }
});
},
- getimportstatus: function(progressfile){
- $.get(OC.filePath('contacts', 'import_tmp', progressfile), function(percent){
+ getimportstatus: function(progresskey){
+ $.get(OC.filePath('contacts', '', 'import.php') + '?progress=1&progresskey=' + progresskey, function(percent){
$('#progressbar').progressbar('option', 'value', parseInt(percent));
if(percent < 100){
- window.setTimeout('Contacts_Import.getimportstatus(\'' + progressfile + '\')', 500);
+ window.setTimeout('Contacts_Import.getimportstatus(\'' + progresskey + '\')', 500);
}else{
$('#import_done').css('display', 'block');
}
@@ -78,9 +78,9 @@ Contacts_Import={ }
$(document).ready(function(){
if(typeof FileActions !== 'undefined'){
- FileActions.register('text/vcard','importaddressbook', '', Contacts_Import.importdialog);
+ FileActions.register('text/vcard','importaddressbook', FileActions.PERMISSION_READ, '', Contacts_Import.importdialog);
FileActions.setDefault('text/vcard','importaddressbook');
- FileActions.register('text/x-vcard','importaddressbook', '', Contacts_Import.importdialog);
+ FileActions.register('text/x-vcard','importaddressbook', FileActions.PERMISSION_READ, '', Contacts_Import.importdialog);
FileActions.setDefault('text/x-vcard','importaddressbook');
};
});
\ No newline at end of file diff --git a/apps/contacts/js/settings.js b/apps/contacts/js/settings.js new file mode 100644 index 00000000000..69cf473e06a --- /dev/null +++ b/apps/contacts/js/settings.js @@ -0,0 +1,196 @@ +OC.Contacts = OC.Contacts || {}; +OC.Contacts.Settings = OC.Contacts.Settings || { + init:function() { + this.Addressbook.adrsettings = $('.addressbooks-settings').first(); + this.Addressbook.adractions = $('#contacts-settings').find('div.actions'); + console.log('actions: ' + this.Addressbook.adractions.length); + OC.Share.loadIcons('addressbook'); + }, + Addressbook:{ + showActions:function(act) { + this.adractions.children().hide(); + this.adractions.children('.'+act.join(',.')).show(); + }, + doActivate:function(id, tgt) { + 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(); + } + } else { + console.log('Error:', jsondata.data.message); + OC.Contacts.notify(t('contacts', 'Error') + ': ' + jsondata.data.message); + tgt.checked = !active; + } + }); + }, + doDelete:function(id) { + console.log('doDelete: ', id); + var check = confirm('Do you really want to delete this address book?'); + if(check == false){ + return false; + } else { + $.post(OC.filePath('contacts', 'ajax', 'addressbook/delete.php'), { id: id}, function(jsondata) { + if (jsondata.status == 'success'){ + $('#contacts h3[data-id="'+id+'"],#contacts ul[data-id="'+id+'"]').remove(); + $('.addressbooks-settings tr[data-id="'+id+'"]').remove() + OC.Contacts.Contacts.update(); + } else { + OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); + } + }); + } + }, + doEdit:function(id) { + console.log('doEdit: ', id); + this.showActions(['active', 'name', 'description', 'save', 'cancel']); + var name = this.adrsettings.find('[data-id="'+id+'"]').find('.name').text(); + var description = this.adrsettings.find('[data-id="'+id+'"]').find('.description').text(); + var active = this.adrsettings.find('[data-id="'+id+'"]').find(':checkbox').is(':checked'); + console.log('name, desc', name, description); + this.adractions.find('.active').prop('checked', active); + this.adractions.find('.name').val(name); + this.adractions.find('.description').val(description); + this.adractions.data('id', id); + }, + doSave:function() { + var name = this.adractions.find('.name').val(); + var description = this.adractions.find('.description').val(); + var active = this.adractions.find('.active').is(':checked'); + var id = this.adractions.data('id'); + console.log('doSave:', id, name, description, active); + + if(name.length == 0) { + OC.dialogs.alert(t('contacts', 'Displayname cannot be empty.'), t('contacts', 'Error')); + return false; + } + var url; + if (id == 'new'){ + url = OC.filePath('contacts', 'ajax', 'addressbook/add.php'); + }else{ + url = OC.filePath('contacts', 'ajax', 'addressbook/update.php'); + } + self = this; + $.post(url, { id: id, name: name, active: Number(active), description: description }, + function(jsondata){ + if(jsondata.status == 'success'){ + self.showActions(['new',]); + self.adractions.removeData('id'); + active = Boolean(Number(jsondata.data.addressbook.active)); + if(id == 'new') { + self.adrsettings.find('table') + .append('<tr class="addressbook" data-id="'+jsondata.data.addressbook.id+'" data-uri="'+jsondata.data.addressbook.uri+'">' + + '<td class="active"><input type="checkbox" '+(active ? 'checked="checked"' : '')+' /></td>' + + '<td class="name">'+jsondata.data.addressbook.displayname+'</td>' + + '<td class="description">'+jsondata.data.addressbook.description+'</td>' + + '<td class="action"><a class="svg action globe" title="'+t('contacts', 'Show CardDav link')+'"></a></td>' + + '<td class="action"><a class="svg action cloud" title="'+t('contacts', 'Show read-only VCF link')+'"></a></td>' + + '<td class="action"><a class="svg action download" title="'+t('contacts', 'Download')+'" ' + + 'href="'+OC.linkTo('contacts', 'export.php')+'?bookid='+jsondata.data.addressbook.id+'"></a></td>' + + '<td class="action"><a class="svg action edit" title="'+t('contacts', 'Edit')+'"></a></td>' + + '<td class="action"><a class="svg action delete" title="'+t('contacts', 'Delete')+'"></a></td>' + + '</tr>'); + } else { + var row = self.adrsettings.find('tr[data-id="'+id+'"]'); + row.find('td.active').find('input:checkbox').prop('checked', active); + row.find('td.name').text(jsondata.data.addressbook.displayname); + row.find('td.description').text(jsondata.data.addressbook.description); + } + OC.Contacts.Contacts.update(); + } else { + OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); + } + }); + }, + showLink:function(id, row, link) { + console.log('row:', row.length); + row.next('tr.link').remove(); + var linkrow = $('<tr class="link"><td colspan="5"><input style="width: 95%;" type="text" value="'+link+'" /></td>' + + '<td colspan="3"><button>'+t('contacts', 'Cancel')+'</button></td></tr>').insertAfter(row); + linkrow.find('input').focus().select(); + linkrow.find('button').click(function() { + $(this).parents('tr').first().remove(); + }); + }, + showCardDAV:function(id) { + console.log('showCardDAV: ', id); + var row = this.adrsettings.find('tr[data-id="'+id+'"]'); + this.showLink(id, row, totalurl+'/'+encodeURIComponent(oc_current_user)); + }, + showVCF:function(id) { + console.log('showVCF: ', id); + var row = this.adrsettings.find('tr[data-id="'+id+'"]'); + var link = totalurl+'/'+encodeURIComponent(oc_current_user)+'/'+encodeURIComponent(row.data('uri'))+'?export'; + console.log(link); + this.showLink(id, row, link); + } + } +}; + + +$(document).ready(function() { + OC.Contacts.Settings.init(); + + var moreless = $('#contacts-settings').find('.moreless').first(); + moreless.keydown(function(event) { + if(event.which == 13 || event.which == 32) { + moreless.click(); + } + }); + moreless.on('click', function(event) { + 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...')); + } + }); + + OC.Contacts.Settings.Addressbook.adrsettings.keydown(function(event) { + if(event.which == 13 || event.which == 32) { + OC.Contacts.Settings.Addressbook.adrsettings.click(); + } + }); + + + OC.Contacts.Settings.Addressbook.adrsettings.on('click', function(event){ + $('.tipsy').remove(); + var tgt = $(event.target); + if(tgt.is('a') || tgt.is(':checkbox')) { + var id = tgt.parents('tr').first().data('id'); + if(!id) { + return; + } + if(tgt.is(':checkbox')) { + OC.Contacts.Settings.Addressbook.doActivate(id, tgt); + } else if(tgt.is('a')) { + if(tgt.hasClass('edit')) { + OC.Contacts.Settings.Addressbook.doEdit(id); + } else if(tgt.hasClass('delete')) { + OC.Contacts.Settings.Addressbook.doDelete(id); + } else if(tgt.hasClass('globe')) { + OC.Contacts.Settings.Addressbook.showCardDAV(id); + } else if(tgt.hasClass('cloud')) { + OC.Contacts.Settings.Addressbook.showVCF(id); + } + } + } else if(tgt.is('button')) { + event.preventDefault(); + if(tgt.hasClass('save')) { + OC.Contacts.Settings.Addressbook.doSave(); + } else if(tgt.hasClass('cancel')) { + OC.Contacts.Settings.Addressbook.showActions(['new']); + } else if(tgt.hasClass('new')) { + OC.Contacts.Settings.Addressbook.doEdit('new'); + } + } + }); +}); diff --git a/apps/contacts/l10n/ar.php b/apps/contacts/l10n/ar.php index 6bebda3b6ad..2b28d6ca6d3 100644 --- a/apps/contacts/l10n/ar.php +++ b/apps/contacts/l10n/ar.php @@ -1,22 +1,13 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "خطء خلال توقيف كتاب العناوين.", +"Error updating addressbook." => "خطء خلال تعديل كتاب العناوين", "There was an error adding the contact." => "خطء خلال اضافة معرفه جديده.", "Cannot add empty property." => "لا يمكنك اضافه صفه خاليه.", "At least one of the address fields has to be filled out." => "يجب ملء على الاقل خانه واحده من العنوان.", -"Error adding contact property." => "خطء خلال اضافة صفة المعرفه.", -"Error adding addressbook." => "خطء خلال اضافة كتاب عناوين.", -"Error activating addressbook." => "خطء خلال تفعيل كتاب العناوين.", "Information about vCard is incorrect. Please reload the page." => "المعلومات الموجودة في ال vCard غير صحيحة. الرجاء إعادة تحديث الصفحة.", -"Error deleting contact property." => "خطء خلال محي الصفه.", -"Error updating contact property." => "خطء خلال تعديل الصفه.", -"Error updating addressbook." => "خطء خلال تعديل كتاب العناوين", "Contacts" => "المعارف", "This is not your addressbook." => "هذا ليس دفتر عناوينك.", "Contact could not be found." => "لم يتم العثور على الشخص.", -"Address" => "عنوان", -"Telephone" => "الهاتف", -"Email" => "البريد الالكتروني", -"Organization" => "المؤسسة", "Work" => "الوظيفة", "Home" => "البيت", "Mobile" => "الهاتف المحمول", @@ -25,34 +16,29 @@ "Fax" => "الفاكس", "Video" => "الفيديو", "Pager" => "الرنان", +"Birthday" => "تاريخ الميلاد", "Contact" => "معرفه", "Add Contact" => "أضف شخص ", "Addressbooks" => "كتب العناوين", -"New Address Book" => "كتاب عناوين جديد", -"CardDav Link" => "وصلة CardDav", -"Download" => "انزال", -"Edit" => "تعديل", +"Organization" => "المؤسسة", "Delete" => "حذف", -"Download contact" => "انزال المعرفه", -"Delete contact" => "امحي المعرفه", -"Birthday" => "تاريخ الميلاد", "Preferred" => "مفضل", "Phone" => "الهاتف", +"Email" => "البريد الالكتروني", +"Address" => "عنوان", +"Download contact" => "انزال المعرفه", +"Delete contact" => "امحي المعرفه", "Type" => "نوع", "PO Box" => "العنوان البريدي", "Extended" => "إضافة", -"Street" => "شارع", "City" => "المدينة", "Region" => "المنطقة", "Zipcode" => "رقم المنطقة", "Country" => "البلد", -"Add" => "أدخل", "Addressbook" => "كتاب العناوين", -"New Addressbook" => "كتاب عناوين جديد", -"Edit Addressbook" => "عدل كتاب العناوين", -"Displayname" => "الاسم المعروض", -"Active" => "فعال", +"Download" => "انزال", +"Edit" => "تعديل", +"New Address Book" => "كتاب عناوين جديد", "Save" => "حفظ", -"Submit" => "ارسال", "Cancel" => "الغاء" ); diff --git a/apps/contacts/l10n/ca.php b/apps/contacts/l10n/ca.php index 0c95b83d5eb..b930d7c685c 100644 --- a/apps/contacts/l10n/ca.php +++ b/apps/contacts/l10n/ca.php @@ -1,39 +1,42 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "Error en (des)activar la llibreta d'adreces.", -"There was an error adding the contact." => "S'ha produït un error en afegir el contacte.", -"Cannot add empty property." => "No es pot afegir una propietat buida.", -"At least one of the address fields has to be filled out." => "Almenys heu d'omplir un dels camps d'adreça.", -"Trying to add duplicate property: " => "Esteu intentant afegir una propietat duplicada:", -"Error adding contact property." => "Error en afegir la propietat del contacte.", +"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", +"Error updating addressbook." => "Error en actualitzar la llibreta d'adreces.", "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.", +"There was an error adding the contact." => "S'ha produït un error en afegir el contacte.", +"element name is not set." => "no s'ha establert el nom de l'element.", +"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: \"", -"Cannot add addressbook with an empty name." => "No es pot afegir una llibreta d'adreces amb un nom buit.", -"Error adding addressbook." => "Error en afegir la llibreta d'adreces.", -"Error activating addressbook." => "Error en activar la llibreta d'adreces.", +"checksum is not set." => "no s'ha establert la suma de verificació.", +"Information about vCard is incorrect. Please reload the page: " => "La informació de la vCard és incorrecta. Carregueu de nou la pàgina:", +"Something went FUBAR. " => "Alguna cosa ha anat FUBAR.", "No contact ID was submitted." => "No s'ha tramès cap ID de contacte.", "Error reading contact photo." => "Error en llegir la foto del contacte.", "Error saving temporary file." => "Error en desar el fitxer temporal.", "The loading photo is not valid." => "La foto carregada no és vàlida.", -"id is not set." => "no s'ha establert la id.", -"Information about vCard is incorrect. Please reload the page." => "La informació de la vCard és incorrecta. Carregueu la pàgina de nou.", -"Error deleting contact property." => "Error en eliminar la propietat del contacte.", "Contact ID is missing." => "falta la ID del contacte.", -"Missing contact id." => "Falta la id del contacte.", "No photo path was submitted." => "No heu tramès el camí de la foto.", "File doesn't exist:" => "El fitxer no existeix:", "Error loading image." => "Error en carregar la imatge.", -"element name is not set." => "no s'ha establert el nom de l'element.", -"checksum is not set." => "no s'ha establert la suma de verificació.", -"Information about vCard is incorrect. Please reload the page: " => "La informació de la vCard és incorrecta. Carregueu de nou la pàgina:", -"Something went FUBAR. " => "Alguna cosa ha anat FUBAR.", -"Error updating contact property." => "Error en actualitzar la propietat del contacte.", -"Cannot update addressbook with an empty name." => "No es pot actualitzar la llibreta d'adreces amb un nom buit", -"Error updating addressbook." => "Error en actualitzar la llibreta d'adreces.", +"Error getting contact object." => "Error en obtenir l'objecte contacte.", +"Error getting PHOTO property." => "Error en obtenir la propietat PHOTO.", +"Error saving contact." => "Error en desar el contacte.", +"Error resizing image" => "Error en modificar la mida de la imatge", +"Error cropping image" => "Error en retallar la imatge", +"Error creating temporary image" => "Error en crear la imatge temporal", +"Error finding image: " => "Error en trobar la imatge:", "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", @@ -41,17 +44,46 @@ "The uploaded file was only partially uploaded" => "El fitxer només s'ha carregat parcialment", "No file was uploaded" => "No s'ha carregat cap fitxer", "Missing a temporary folder" => "Falta un fitxer temporal", +"Couldn't save temporary image: " => "No s'ha pogut desar la imatge temporal: ", +"Couldn't load temporary image: " => "No s'ha pogut carregar la imatge temporal: ", +"No file was uploaded. Unknown error" => "No s'ha carregat cap fitxer. Error desconegut", "Contacts" => "Contactes", -"Drop a VCF file to import contacts." => "Elimina un fitxer VCF per importar contactes.", -"Addressbook not found." => "No s'ha trobat la llibreta d'adreces.", +"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", +"This property has to be non-empty." => "Aquesta propietat no pot ser buida.", +"Couldn't serialize elements." => "No s'han pogut serialitzar els elements.", +"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' s'ha cridat sense argument de tipus. Informeu-ne a bugs.owncloud.org", +"Edit name" => "Edita el nom", +"No files selected for upload." => "No s'han seleccionat fitxers per a la pujada.", +"The file you are trying to upload exceed the maximum size for file uploads on this server." => "El fitxer que intenteu pujar excedeix la mida màxima de pujada en aquest servidor.", +"Error loading profile picture." => "Error en carregar la imatge de perfil.", +"Select type" => "Seleccioneu un tipus", +"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?", +"Result: " => "Resultat: ", +" imported, " => " importat, ", +" failed." => " fallada.", +"Displayname cannot be empty." => "El nom a mostrar no pot ser buit", +"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.", -"Address" => "Adreça", -"Telephone" => "Telèfon", -"Email" => "Correu electrònic", -"Organization" => "Organització", +"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" => "Feina", "Home" => "Casa", +"Other" => "Altres", "Mobile" => "Mòbil", "Text" => "Text", "Voice" => "Veu", @@ -60,25 +92,52 @@ "Video" => "Vídeo", "Pager" => "Paginador", "Internet" => "Internet", +"Birthday" => "Aniversari", +"Business" => "Negocis", +"Call" => "Trucada", +"Clients" => "Clients", +"Deliverer" => "Emissari", +"Holidays" => "Vacances", +"Ideas" => "Idees", +"Journey" => "Viatge", +"Jubilee" => "Aniversari", +"Meeting" => "Reunió", +"Personal" => "Personal", +"Projects" => "Projectes", +"Questions" => "Preguntes", "{name}'s Birthday" => "Aniversari de {name}", "Contact" => "Contacte", "Add Contact" => "Afegeix un contacte", +"Import" => "Importa", +"Settings" => "Configuració", "Addressbooks" => "Llibretes d'adreces", -"Configure Address Books" => "Configura les llibretes d'adreces", -"New Address Book" => "Nova llibreta d'adreces", -"Import from VCF" => "Importa de VFC", -"CardDav Link" => "Enllaç CardDav", -"Download" => "Baixa", -"Edit" => "Edita", -"Delete" => "Suprimeix", -"Download contact" => "Baixa el contacte", -"Delete contact" => "Suprimeix el contacte", +"Close" => "Tanca", +"Keyboard shortcuts" => "Dreceres de teclat", +"Navigation" => "Navegació", +"Next contact in list" => "Següent contacte de la llista", +"Previous contact in list" => "Contacte anterior de la llista", +"Expand/collapse current addressbook" => "Expandeix/col·lapsa la llibreta d'adreces", +"Next addressbook" => "Llibreta d'adreces següent", +"Previous addressbook" => "Llibreta d'adreces anterior", +"Actions" => "Accions", +"Refresh contacts list" => "Carrega de nou la llista de contactes", +"Add new contact" => "Afegeix un contacte nou", +"Add new addressbook" => "Afegeix una llibreta d'adreces nova", +"Delete current contact" => "Esborra el contacte", "Drop photo to upload" => "Elimina la foto a carregar", +"Delete current photo" => "Elimina la foto actual", +"Edit current photo" => "Edita la foto actual", +"Upload new photo" => "Carrega una foto nova", +"Select photo from ownCloud" => "Selecciona una foto de ownCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format personalitzat, Nom curt, Nom sencer, Invertit o Invertit amb coma", "Edit name details" => "Edita detalls del nom", +"Organization" => "Organització", +"Delete" => "Suprimeix", "Nickname" => "Sobrenom", "Enter nickname" => "Escriviu el sobrenom", -"Birthday" => "Aniversari", +"Web site" => "Adreça web", +"http://www.somesite.com" => "http://www.somesite.com", +"Go to web site" => "Vés a la web", "dd-mm-yyyy" => "dd-mm-yyyy", "Groups" => "Grups", "Separate groups with commas" => "Separeu els grups amb comes", @@ -90,28 +149,33 @@ "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", -"Profile picture" => "Foto de perfil", "Phone" => "Telèfon", +"Email" => "Correu electrònic", +"Instant Messaging" => "Missatgeria instantània", +"Address" => "Adreça", "Note" => "Nota", -"Delete current photo" => "Elimina la foto actual", -"Edit current photo" => "Edita la foto actual", -"Upload new photo" => "Carrega una foto nova", -"Select photo from ownCloud" => "Selecciona una foto de ownCloud", +"Download contact" => "Baixa el contacte", +"Delete contact" => "Suprimeix el contacte", +"The temporary image has been removed from cache." => "La imatge temporal ha estat eliminada de la memòria de cau.", "Edit address" => "Edita l'adreça", "Type" => "Tipus", "PO Box" => "Adreça postal", +"Street address" => "Adreça", +"Street and number" => "Carrer i número", "Extended" => "Addicional", -"Street" => "Carrer", +"Apartment number etc." => "Número d'apartament, etc.", "City" => "Ciutat", "Region" => "Comarca", +"E.g. state or province" => "p. ex. Estat o província ", "Zipcode" => "Codi postal", +"Postal code" => "Codi postal", "Country" => "País", -"Edit categories" => "Edita categories", -"Add" => "Afegeix", "Addressbook" => "Llibreta d'adreces", "Hon. prefixes" => "Prefix honorífic:", "Miss" => "Srta", @@ -132,26 +196,35 @@ "Esq." => "Esq.", "Jr." => "Jr.", "Sn." => "Sn.", -"New Addressbook" => "Nova llibreta d'adreces", -"Edit Addressbook" => "Edita la llibreta d'adreces", -"Displayname" => "Nom a mostrar", -"Active" => "Actiu", -"Save" => "Desa", -"Submit" => "Envia", -"Cancel" => "Cancel·la", "Import a contacts file" => "Importa un fitxer de contactes", "Please choose the addressbook" => "Escolliu la llibreta d'adreces", "create a new addressbook" => "crea una llibreta d'adreces nova", "Name of new addressbook" => "Nom de la nova llibreta d'adreces", -"Import" => "Importa", "Importing contacts" => "S'estan important contactes", +"Contacts imported successfully" => "Els contactes s'han importat correctament", +"Close Dialog" => "Tanca el diàleg", +"Import Addressbook" => "Importa la llibreta d'adreces", "Select address book to import to:" => "Seleccioneu la llibreta d'adreces a la que voleu importar:", +"Drop a VCF file to import contacts." => "Elimina un fitxer VCF per importar contactes.", "Select from HD" => "Selecciona de HD", "You have no contacts in your addressbook." => "No teniu contactes a la llibreta d'adreces.", "Add contact" => "Afegeix un contacte", -"Configure addressbooks" => "Configura les llibretes d'adreces", +"Select Address Books" => "Selecccioneu llibretes d'adreces", +"Enter name" => "Escriviu un nom", +"Enter description" => "Escriviu una descripció", "CardDAV syncing addresses" => "Adreces de sincronització CardDAV", "more info" => "més informació", "Primary address (Kontact et al)" => "Adreça primària (Kontact i al)", -"iOS/OS X" => "iOS/OS X" +"iOS/OS X" => "iOS/OS X", +"Show CardDav link" => "Mostra l'enllaç CardDav", +"Show read-only VCF link" => "Mostra l'enllaç VCF només de lectura", +"Share" => "Comparteix", +"Download" => "Baixa", +"Edit" => "Edita", +"New Address Book" => "Nova llibreta d'adreces", +"Name" => "Nom", +"Description" => "Descripció", +"Save" => "Desa", +"Cancel" => "Cancel·la", +"More..." => "Més..." ); diff --git a/apps/contacts/l10n/cs_CZ.php b/apps/contacts/l10n/cs_CZ.php index 391a62010b1..830077aa278 100644 --- a/apps/contacts/l10n/cs_CZ.php +++ b/apps/contacts/l10n/cs_CZ.php @@ -1,39 +1,40 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "Chyba při (de)aktivaci adresáře.", -"There was an error adding the contact." => "Během přidávání kontaktu nastala chyba.", -"Cannot add empty property." => "Nelze přidat prazdný údaj.", -"At least one of the address fields has to be filled out." => "Musí být uveden nejméně jeden z adresních údajů", -"Trying to add duplicate property: " => "Pokoušíte se přidat duplicitní atribut: ", -"Error adding contact property." => "Chyba během přdávání údaje kontaktu.", +"id is not set." => "id neni nastaveno.", +"Cannot update addressbook with an empty name." => "Nelze aktualizovat adresář s prázdným jménem.", +"Error updating addressbook." => "Chyba při aktualizaci adresáře.", "No ID provided" => "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ý adresář nenalezen.", "No contacts found." => "Žádné kontakty nenalezeny.", +"There was an error adding the contact." => "Během přidávání kontaktu nastala chyba.", +"element name is not set." => "jméno elementu není nastaveno.", +"Could not parse contact: " => "Nelze analyzovat kontakty", +"Cannot add empty property." => "Nelze přidat prazdný údaj.", +"At least one of the address fields has to be filled out." => "Musí být uveden nejméně jeden z adresních údajů", +"Trying to add duplicate property: " => "Pokoušíte se přidat duplicitní atribut: ", +"Information about vCard is incorrect. Please reload the page." => "Informace o vCard je nesprávná. Obnovte stránku, prosím.", "Missing ID" => "Chybí ID", "Error parsing VCard for ID: \"" => "Chyba při parsování VCard pro ID: \"", -"Cannot add addressbook with an empty name." => "Nelze přidat adresář s prázdným jménem.", -"Error adding addressbook." => "Chyba při přidávání adresáře.", -"Error activating addressbook." => "Chyba při aktivaci adresáře.", +"checksum is not set." => "kontrolní součet není nastaven.", +"Information about vCard is incorrect. Please reload the page: " => "Informace o vCard je nesprávná. Obnovte stránku, prosím.", +"Something went FUBAR. " => "Něco se pokazilo. ", "No contact ID was submitted." => "Nebylo nastaveno ID kontaktu.", "Error reading contact photo." => "Chyba při načítání fotky kontaktu.", "Error saving temporary file." => "Chyba při ukládání dočasného souboru.", "The loading photo is not valid." => "Načítaná fotka je vadná.", -"id is not set." => "id neni nastaveno.", -"Information about vCard is incorrect. Please reload the page." => "Informace o vCard je nesprávná. Obnovte stránku, prosím.", -"Error deleting contact property." => "Chyba při odstraňování údaje kontaktu.", "Contact ID is missing." => "Chybí ID kontaktu.", -"Missing contact id." => "Chybí id kontaktu.", "No photo path was submitted." => "Žádná fotka nebyla nahrána.", "File doesn't exist:" => "Soubor neexistuje:", "Error loading image." => "Chyba při načítání obrázku.", -"element name is not set." => "jméno elementu není nastaveno.", -"checksum is not set." => "kontrolní součet není nastaven.", -"Information about vCard is incorrect. Please reload the page: " => "Informace o vCard je nesprávná. Obnovte stránku, prosím.", -"Something went FUBAR. " => "Něco se pokazilo. ", -"Error updating contact property." => "Chyba při aktualizaci údaje kontaktu.", -"Cannot update addressbook with an empty name." => "Nelze aktualizovat adresář s prázdným jménem.", -"Error updating addressbook." => "Chyba při aktualizaci adresáře.", +"Error getting contact object." => "Chyba při převzetí objektu kontakt.", +"Error getting PHOTO property." => "Chyba při získávání fotky.", +"Error saving contact." => "Chyba při ukládání kontaktu.", +"Error resizing image" => "Chyba při změně velikosti obrázku.", +"Error cropping image" => "Chyba při oseká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:", "Error uploading contacts to storage." => "Chyba při nahrávání kontaktů do úložiště.", "There is no error, the file uploaded with success" => "Nevyskytla se žádná chyba, soubor byl úspěšně nahrán", "The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Nahrávaný soubor překračuje nastavení upload_max_filesize directive v php.ini", @@ -41,17 +42,33 @@ "The uploaded file was only partially uploaded" => "Nahrávaný soubor se nahrál pouze z části", "No file was uploaded" => "Žádný soubor nebyl nahrán", "Missing a temporary folder" => "Chybí dočasný adresář", +"Couldn't save temporary image: " => "Nemohu uložit dočasný obrázek: ", +"Couldn't load temporary image: " => "Nemohu načíst dočasný obrázek: ", +"No file was uploaded. Unknown error" => "Soubor nebyl odeslán. Neznámá chyba", "Contacts" => "Kontakty", -"Drop a VCF file to import contacts." => "Pro import kontaktů sem přetáhněte soubor VCF", -"Addressbook not found." => "Adresář nenalezen.", +"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", +"This property has to be non-empty." => "Tento parametr nemuže zůstat nevyplněn.", +"Couldn't serialize elements." => "Prvky nelze převést..", +"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' voláno bez argumentu. Prosím oznamte chybu na bugs.owncloud.org", +"Edit name" => "Upravit jméno", +"No files selected for upload." => "Žádné soubory nebyly vybrány k nahrání.", +"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Soubor, který se pokoušíte odeslat, přesahuje maximální povolenou velikost.", +"Error loading profile picture." => "Chyba při otevírání obrázku profilu", +"Select type" => "Vybrat typ", +"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í. Počkete prosím na dokončení operace.", +"Result: " => "Výsledek: ", +" imported, " => "importováno v pořádku,", +" failed." => "neimportováno.", +"Displayname cannot be empty." => "Zobrazované jméno nemůže zůstat prázdné.", +"Addressbook not found: " => "Adresář nenalezen:", "This is not your addressbook." => "Toto není Váš adresář.", "Contact could not be found." => "Kontakt nebyl nalezen.", -"Address" => "Adresa", -"Telephone" => "Telefon", -"Email" => "Email", -"Organization" => "Organizace", "Work" => "Pracovní", "Home" => "Domácí", +"Other" => "Ostatní", "Mobile" => "Mobil", "Text" => "Text", "Voice" => "Hlas", @@ -60,25 +77,52 @@ "Video" => "Video", "Pager" => "Pager", "Internet" => "Internet", +"Birthday" => "Narozeniny", +"Business" => "Pracovní", +"Call" => "Volat", +"Clients" => "Klienti", +"Deliverer" => "Dodavatel", +"Holidays" => "Prázdniny", +"Ideas" => "Nápady", +"Journey" => "Cestování", +"Jubilee" => "Jubileum", +"Meeting" => "Schůzka", +"Personal" => "Osobní", +"Projects" => "Projekty", +"Questions" => "Dotazy", "{name}'s Birthday" => "Narozeniny {name}", "Contact" => "Kontakt", "Add Contact" => "Přidat kontakt", +"Import" => "Import", +"Settings" => "Nastavení", "Addressbooks" => "Adresáře", -"Configure Address Books" => "Nastavit adresáře", -"New Address Book" => "Nový adresář", -"Import from VCF" => "Importovat z VCF", -"CardDav Link" => "CardDav odkaz", -"Download" => "Stažení", -"Edit" => "Editovat", -"Delete" => "Odstranit", -"Download contact" => "Stáhnout kontakt", -"Delete contact" => "Odstranit kontakt", +"Close" => "Zavřít", +"Keyboard shortcuts" => "Klávesoví zkratky", +"Navigation" => "Navigace", +"Next contact in list" => "Následující kontakt v seznamu", +"Previous contact in list" => "Předchozí kontakt v seznamu", +"Expand/collapse current addressbook" => "Rozbalit/sbalit aktuální Adresář", +"Next addressbook" => "Následující Adresář", +"Previous addressbook" => "Předchozí Adresář", +"Actions" => "Akce", +"Refresh contacts list" => "Občerstvit seznam kontaktů", +"Add new contact" => "Přidat kontakt", +"Add new addressbook" => "Předat nový Adresář", +"Delete current contact" => "Odstranit aktuální kontakt", "Drop photo to upload" => "Přetáhněte sem fotku pro její nahrání", +"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", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formát vlastní, křestní, celé jméno, obráceně nebo obráceně oddelené čárkami", "Edit name details" => "Upravit podrobnosti jména", +"Organization" => "Organizace", +"Delete" => "Odstranit", "Nickname" => "Přezdívka", "Enter nickname" => "Zadejte přezdívku", -"Birthday" => "Narozeniny", +"Web site" => "Web", +"http://www.somesite.com" => "http://www.somesite.com", +"Go to web site" => "Přejít na web", "dd-mm-yyyy" => "dd. mm. yyyy", "Groups" => "Skupiny", "Separate groups with commas" => "Oddělte skupiny čárkami", @@ -94,24 +138,26 @@ "Edit address details" => "Upravit podrobnosti adresy", "Add notes here." => "Zde můžete připsat poznámky.", "Add field" => "Přidat políčko", -"Profile picture" => "Profilová fotka", "Phone" => "Telefon", +"Email" => "Email", +"Address" => "Adresa", "Note" => "Poznámka", -"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", +"Download contact" => "Stáhnout kontakt", +"Delete contact" => "Odstranit kontakt", +"The temporary image has been removed from cache." => "Obrázek byl odstraněn z dočasné paměti.", "Edit address" => "Upravit adresu", "Type" => "Typ", "PO Box" => "PO box", +"Street address" => "Ulice", +"Street and number" => "Ulice a číslo", "Extended" => "Rozšířené", -"Street" => "Ulice", +"Apartment number etc." => "Byt číslo atd.", "City" => "Město", "Region" => "Kraj", +"E.g. state or province" => "Např. stát nebo okres", "Zipcode" => "PSČ", +"Postal code" => "PSČ", "Country" => "Země", -"Edit categories" => "Upravit kategorie", -"Add" => "Přidat", "Addressbook" => "Adresář", "Hon. prefixes" => "Tituly před", "Miss" => "Slečna", @@ -132,26 +178,34 @@ "Esq." => "Esq.", "Jr." => "ml.", "Sn." => "st.", -"New Addressbook" => "Nový adresář", -"Edit Addressbook" => "Editace adresáře", -"Displayname" => "Zobrazené jméno", -"Active" => "Aktivní", -"Save" => "Uložit", -"Submit" => "Potvrdit", -"Cancel" => "Storno", "Import a contacts file" => "Importovat soubor kontaktů", "Please choose the addressbook" => "Prosím zvolte adresář", "create a new addressbook" => "vytvořit nový adresář", "Name of new addressbook" => "Jméno nového adresáře", -"Import" => "Import", "Importing contacts" => "Importování kontaktů", +"Contacts imported successfully" => "Kontakty úspěšně importovány", +"Close Dialog" => "Zavírací dialog", +"Import Addressbook" => "Importovat adresář", "Select address book to import to:" => "Vyberte adresář do kterého chcete importovat:", +"Drop a VCF file to import contacts." => "Pro import kontaktů sem přetáhněte soubor VCF", "Select from HD" => "Vybrat z disku", "You have no contacts in your addressbook." => "Nemáte žádné kontakty v adresáři.", "Add contact" => "Přidat kontakt", -"Configure addressbooks" => "Nastavit adresář", +"Select Address Books" => "Vybrat Adresář", +"Enter name" => "Vložte jméno", +"Enter description" => "Vložte popis", "CardDAV syncing addresses" => "Adresa pro synchronizaci pomocí CardDAV:", "more info" => "víc informací", "Primary address (Kontact et al)" => "Hlavní adresa (Kontakt etc)", -"iOS/OS X" => "iOS/OS X" +"iOS/OS X" => "iOS/OS X", +"Show CardDav link" => "Zobrazit odklaz CardDAV:", +"Show read-only VCF link" => "Zobrazit odkaz VCF pouze pro čtení", +"Download" => "Stažení", +"Edit" => "Editovat", +"New Address Book" => "Nový adresář", +"Name" => "Název", +"Description" => "Popis", +"Save" => "Uložit", +"Cancel" => "Storno", +"More..." => "Více..." ); diff --git a/apps/contacts/l10n/da.php b/apps/contacts/l10n/da.php index 28753edda4e..97c5f1307cd 100644 --- a/apps/contacts/l10n/da.php +++ b/apps/contacts/l10n/da.php @@ -1,39 +1,39 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "Fejl ved (de)aktivering af adressebogen", -"There was an error adding the contact." => "Der opstod en fejl ved tilføjelse af kontaktpersonen.", -"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.", -"Error adding contact property." => "Fejl ved tilføjelse af egenskab.", +"id is not set." => "Intet ID medsendt.", +"Cannot update addressbook with an empty name." => "Kan ikke opdatére adressebogen med et tomt navn.", +"Error updating addressbook." => "Fejl ved opdatering af adressebog", "No ID provided" => "Intet ID medsendt", "Error setting checksum." => "Kunne ikke sætte checksum.", "No categories selected for deletion." => "Der ikke valgt nogle grupper at slette.", "No address books found." => "Der blev ikke fundet nogen adressebøger.", "No contacts found." => "Der blev ikke fundet nogen kontaktpersoner.", +"There was an error adding the contact." => "Der opstod en fejl ved tilføjelse af kontaktpersonen.", +"element name is not set." => "Elementnavnet er ikke medsendt.", +"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.", +"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'en: \"", -"Cannot add addressbook with an empty name." => "Kan ikke tilføje adressebog uden et navn.", -"Error adding addressbook." => "Fejl ved tilføjelse af adressebog.", -"Error activating addressbook." => "Fejl ved aktivering af adressebog.", +"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 dette VCard stemmer ikke. Genindlæs venligst siden: ", +"Something went FUBAR. " => "Noget gik grueligt galt. ", "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.", "The loading photo is not valid." => "Billedet under indlæsning er ikke gyldigt.", -"id is not set." => "Intet ID medsendt.", -"Information about vCard is incorrect. Please reload the page." => "Informationen om vCard er forkert. Genindlæs siden.", -"Error deleting contact property." => "Fejl ved sletning af egenskab for kontaktperson.", "Contact ID is missing." => "Kontaktperson ID mangler.", -"Missing contact id." => "Kontaktperson ID mangler.", "No photo path was submitted." => "Der blev ikke medsendt en sti til fotoet.", "File doesn't exist:" => "Filen eksisterer ikke:", "Error loading image." => "Kunne ikke indlæse billede.", -"element name is not set." => "Element navnet er ikke medsendt.", -"checksum is not set." => "Checksum er ikke medsendt.", -"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. ", -"Error updating contact property." => "Fejl ved opdatering af egenskab for kontaktperson.", -"Cannot update addressbook with an empty name." => "Kan ikke opdatére adressebogen med et tomt navn.", -"Error updating addressbook." => "Fejl ved opdatering af adressebog", +"Error getting contact object." => "Fejl ved indlæsning af kontaktpersonobjektet.", +"Error getting PHOTO property." => "Fejl ved indlæsning af PHOTO feltet.", +"Error saving contact." => "Kunne ikke gemme kontaktpersonen.", +"Error resizing image" => "Kunne ikke ændre billedets størrelse", +"Error cropping image" => "Kunne ikke beskære billedet", +"Error creating temporary image" => "Kunne ikke oprette midlertidigt billede", +"Error finding image: " => "Kunne ikke finde billedet: ", "Error uploading contacts to storage." => "Kunne ikke uploade kontaktepersoner til midlertidig opbevaring.", "There is no error, the file uploaded with success" => "Der skete ingen fejl, filen blev succesfuldt uploadet", "The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Den uploadede fil er større end upload_max_filesize indstillingen i php.ini", @@ -41,15 +41,26 @@ "The uploaded file was only partially uploaded" => "Filen blev kun delvist uploadet.", "No file was uploaded" => "Ingen fil uploadet", "Missing a temporary folder" => "Manglende midlertidig mappe.", +"Couldn't save temporary image: " => "Kunne ikke gemme midlertidigt billede: ", +"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", -"Drop a VCF file to import contacts." => "Drop en VCF fil for at importere kontaktpersoner.", -"Addressbook not found." => "Adressebogen blev ikke fundet.", +"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", +"This property has to be non-empty." => "Dette felt må ikke være tomt.", +"Couldn't serialize elements." => "Kunne ikke serialisere elementerne.", +"'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.", +"Select type" => "Vælg type", +"Result: " => "Resultat:", +" imported, " => " importeret ", +" failed." => " fejl.", "This is not your addressbook." => "Dette er ikke din adressebog.", "Contact could not be found." => "Kontaktperson kunne ikke findes.", -"Address" => "Adresse", -"Telephone" => "Telefon", -"Email" => "Email", -"Organization" => "Organisation", "Work" => "Arbejde", "Home" => "Hjemme", "Mobile" => "Mobil", @@ -60,25 +71,24 @@ "Video" => "Video", "Pager" => "Personsøger", "Internet" => "Internet", -"{name}'s Birthday" => "{name}'s fødselsdag", +"Birthday" => "Fødselsdag", +"{name}'s Birthday" => "{name}s fødselsdag", "Contact" => "Kontaktperson", "Add Contact" => "Tilføj kontaktperson", +"Import" => "Importer", "Addressbooks" => "Adressebøger", -"Configure Address Books" => "Konfigurer adressebøger", -"New Address Book" => "Ny adressebog", -"Import from VCF" => "Importer fra VCF", -"CardDav Link" => "CardDav-link", -"Download" => "Download", -"Edit" => "Rediger", -"Delete" => "Slet", -"Download contact" => "Download kontaktperson", -"Delete contact" => "Slet kontaktperson", +"Close" => "Luk", "Drop photo to upload" => "Drop foto for at uploade", +"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", "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.", -"Nickname" => "Øgenavn", -"Enter nickname" => "Indtast øgenavn", -"Birthday" => "Fødselsdag", +"Organization" => "Organisation", +"Delete" => "Slet", +"Nickname" => "Kaldenavn", +"Enter nickname" => "Indtast kaldenavn", "dd-mm-yyyy" => "dd-mm-åååå", "Groups" => "Grupper", "Separate groups with commas" => "Opdel gruppenavne med kommaer", @@ -93,25 +103,22 @@ "View on map" => "Vis på kort", "Edit address details" => "Rediger adresse detaljer", "Add notes here." => "Tilføj noter her.", -"Add field" => "Tilfæj element", -"Profile picture" => "Profilbillede", +"Add field" => "Tilføj element", "Phone" => "Telefon", +"Email" => "Email", +"Address" => "Adresse", "Note" => "Note", -"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", +"Download contact" => "Download kontaktperson", +"Delete contact" => "Slet kontaktperson", +"The temporary image has been removed from cache." => "Det midlertidige billede er ikke længere tilgængeligt.", "Edit address" => "Rediger adresse", "Type" => "Type", "PO Box" => "Postboks", "Extended" => "Udvidet", -"Street" => "Vej", "City" => "By", "Region" => "Region", "Zipcode" => "Postnummer", "Country" => "Land", -"Edit categories" => "Rediger grupper", -"Add" => "Tilføj", "Addressbook" => "Adressebog", "Hon. prefixes" => "Foranstillede titler", "Miss" => "Frøken", @@ -119,7 +126,7 @@ "Mr" => "Hr.", "Sir" => "Sir", "Mrs" => "Fru", -"Dr" => "Dr", +"Dr" => "Dr.", "Given name" => "Fornavn", "Additional names" => "Mellemnavne", "Family name" => "Efternavn", @@ -132,26 +139,20 @@ "Esq." => "Esq.", "Jr." => "Jr.", "Sn." => "Sn.", -"New Addressbook" => "Ny adressebog", -"Edit Addressbook" => "Rediger adressebog", -"Displayname" => "Vist navn", -"Active" => "Aktiv", -"Save" => "Gem", -"Submit" => "Gem", -"Cancel" => "Fortryd", "Import a contacts file" => "Importer fil med kontaktpersoner", "Please choose the addressbook" => "Vælg venligst adressebog", "create a new addressbook" => "Opret ny adressebog", "Name of new addressbook" => "Navn på ny adressebog", -"Import" => "Importer", "Importing contacts" => "Importerer kontaktpersoner", -"Select address book to import to:" => "Vælg hvilken adressebog, der skal importeres til:", -"Select from HD" => "Vælg fra harddisk.", "You have no contacts in your addressbook." => "Du har ingen kontaktpersoner i din adressebog.", "Add contact" => "Tilføj kontaktpeson.", -"Configure addressbooks" => "Konfigurer adressebøger", "CardDAV syncing addresses" => "CardDAV synkroniserings adresse", "more info" => "mere info", "Primary address (Kontact et al)" => "Primær adresse (Kontak m. fl.)", -"iOS/OS X" => "iOS/OS X" +"iOS/OS X" => "iOS/OS X", +"Download" => "Download", +"Edit" => "Rediger", +"New Address Book" => "Ny adressebog", +"Save" => "Gem", +"Cancel" => "Fortryd" ); diff --git a/apps/contacts/l10n/de.php b/apps/contacts/l10n/de.php index 3a1013eb4fc..ca65d26cec1 100644 --- a/apps/contacts/l10n/de.php +++ b/apps/contacts/l10n/de.php @@ -1,57 +1,89 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "(De-)Aktivierung des Adressbuches fehlgeschlagen", -"There was an error adding the contact." => "Erstellen des Kontakts fehlgeschlagen", -"Cannot add empty property." => "Feld darf nicht leer sein.", -"At least one of the address fields has to be filled out." => "Mindestens eines der Adressfelder muss ausgefüllt werden.", -"Trying to add duplicate property: " => "Versuche, doppelte Eigenschaft hinzuzufügen: ", -"Error adding contact property." => "Kontakt ändern fehlgeschlagen", +"id is not set." => "ID ist nicht angegeben.", +"Cannot update addressbook with an empty name." => "Adressbuch kann nicht mir leeren Namen aktualisiert werden.", +"Error updating addressbook." => "Adressbuch aktualisieren fehlgeschlagen.", "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.", +"There was an error adding the contact." => "Erstellen des Kontakts fehlgeschlagen.", +"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: \"", -"Cannot add addressbook with an empty name." => "Bitte einen Namen für das Adressbuch angeben.", -"Error adding addressbook." => "Adressbuch hinzufügen fehlgeschlagen", -"Error activating addressbook." => "Adressbuchaktivierung fehlgeschlagen", +"checksum is not set." => "Keine Prüfsumme angegeben.", +"Information about vCard is incorrect. Please reload the page: " => "Die Informationen zur vCard sind fehlerhaft. Bitte Seite neu laden: ", +"Something went FUBAR. " => "Irgendwas ist hier so richtig schief gelaufen. ", "No contact ID was submitted." => "Es wurde keine Kontakt-ID übermittelt.", -"Error reading contact photo." => "Fehler beim auslesen des Kontaktfotos.", +"Error reading contact photo." => "Fehler beim Auslesen des Kontaktfotos.", "Error saving temporary file." => "Fehler beim Speichern der temporären Datei.", "The loading photo is not valid." => "Das Kontaktfoto ist fehlerhaft.", -"id is not set." => "ID ist nicht angegeben.", -"Information about vCard is incorrect. Please reload the page." => "Die Information der vCard ist fehlerhaft. Bitte aktualisiere die Seite.", -"Error deleting contact property." => "Kontakteigenschaft löschen fehlgeschlagen", "Contact ID is missing." => "Keine Kontakt-ID angegeben.", -"Missing contact id." => "Fehlende Kontakt-ID.", "No photo path was submitted." => "Kein Foto-Pfad übermittelt.", "File doesn't exist:" => "Datei existiert nicht: ", "Error loading image." => "Fehler beim Laden des Bildes.", -"element name is not set." => "Kein Name für das Element angegeben.", -"checksum is not set." => "Keine Prüfsumme angegeben.", -"Information about vCard is incorrect. Please reload the page: " => "Die Informationen zur vCard sind fehlerhaft. Bitte Seite neu laden: ", -"Something went FUBAR. " => "Irgendwas ist hier so richtig schief gelaufen. ", -"Error updating contact property." => "Kontakteigenschaft aktualisieren fehlgeschlagen", -"Cannot update addressbook with an empty name." => "Adressbuch kann nicht mir leeren Namen aktualisiert werden.", -"Error updating addressbook." => "Adressbuch aktualisieren fehlgeschlagen", -"Error uploading contacts to storage." => "Übertragen der Kontakte fehlgeschlagen", +"Error getting contact object." => "Fehler beim Abruf des Kontakt-Objektes.", +"Error getting PHOTO property." => "Fehler beim Abrufen der PHOTO-Eigenschaft.", +"Error saving contact." => "Fehler beim Speichern des Kontaktes.", +"Error resizing image" => "Fehler bei der Größenänderung des Bildes", +"Error cropping image" => "Fehler beim Zuschneiden des Bildes", +"Error creating temporary image" => "Fehler beim Erstellen des temporären Bildes", +"Error finding image: " => "Fehler beim Suchen des Bildes: ", +"Error uploading contacts to storage." => "Übertragen der Kontakte fehlgeschlagen.", "There is no error, the file uploaded with success" => "Alles bestens, Datei erfolgreich übertragen.", -"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Datei größer als durch die upload_max_filesize Direktive in php.ini erlaubt", -"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Datei größer als die MAX_FILE_SIZE Direktive erlaubt, die im HTML Formular spezifiziert ist", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Datei größer, als durch die upload_max_filesize Direktive in php.ini erlaubt", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Datei größer, als die MAX_FILE_SIZE Direktive erlaubt, die im HTML Formular spezifiziert ist", "The uploaded file was only partially uploaded" => "Datei konnte nur teilweise übertragen werden", "No file was uploaded" => "Keine Datei konnte übertragen werden.", "Missing a temporary folder" => "Kein temporärer Ordner vorhanden", +"Couldn't save temporary image: " => "Konnte das temporäre Bild nicht speichern:", +"Couldn't load temporary image: " => "Konnte das temporäre Bild nicht laden:", +"No file was uploaded. Unknown error" => "Keine Datei hochgeladen. Unbekannter Fehler", "Contacts" => "Kontakte", -"Drop a VCF file to import contacts." => "Zieh' eine VCF Datei hierher zum Kontaktimport", -"Addressbook not found." => "Adressbuch nicht gefunden.", -"This is not your addressbook." => "Dies ist nicht dein Adressbuch.", +"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", +"This property has to be non-empty." => "Dieses Feld darf nicht leer sein.", +"Couldn't serialize elements." => "Konnte Elemente nicht serialisieren", +"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' wurde ohne Argumente aufgerufen. Bitte melden Sie dies auf bugs.owncloud.org", +"Edit name" => "Name ändern", +"No files selected for upload." => "Keine Datei(en) zum Hochladen ausgewählt.", +"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Die Datei, die Sie hochladen möchten, überschreitet die maximale Größe für Datei-Uploads auf diesem Server.", +"Error loading profile picture." => "Fehler beim Laden des Profilbildes.", +"Select type" => "Wähle Typ", +"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Einige zum Löschen markiert Kontakte wurden noch nicht gelöscht. Bitte warten.", +"Do you want to merge these address books?" => "Möchten Sie diese Adressbücher zusammenführen?", +"Result: " => "Ergebnis: ", +" imported, " => " importiert, ", +" failed." => " fehlgeschlagen.", +"Displayname cannot be empty." => "Der Anzeigename darf nicht leer sein.", +"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.", -"Address" => "Adresse", -"Telephone" => "Telefon", -"Email" => "Email", -"Organization" => "Organisation", +"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" => "Arbeit", "Home" => "Zuhause", +"Other" => "Andere", "Mobile" => "Mobil", "Text" => "Text", "Voice" => "Anruf", @@ -60,58 +92,90 @@ "Video" => "Video", "Pager" => "Pager", "Internet" => "Internet", +"Birthday" => "Geburtstag", +"Business" => "Geschäftlich", +"Call" => "Anruf", +"Clients" => "Kunden", +"Deliverer" => "Lieferant", +"Holidays" => "Feiertage", +"Ideas" => "Ideen", +"Journey" => "Reise", +"Jubilee" => "Jubiläum", +"Meeting" => "Besprechung", +"Personal" => "Persönlich", +"Projects" => "Projekte", +"Questions" => "Fragen", "{name}'s Birthday" => "Geburtstag von {name}", "Contact" => "Kontakt", "Add Contact" => "Kontakt hinzufügen", +"Import" => "Importieren", +"Settings" => "Einstellungen", "Addressbooks" => "Adressbücher", -"Configure Address Books" => "Adressbücher konfigurieren", -"New Address Book" => "Neues Adressbuch", -"Import from VCF" => "Import von VCF Datei", -"CardDav Link" => "CardDav Link", -"Download" => "Herunterladen", -"Edit" => "Bearbeiten", +"Close" => "Schließen", +"Keyboard shortcuts" => "Tastaturbefehle", +"Navigation" => "Navigation", +"Next contact in list" => "Nächster Kontakt aus der Liste", +"Previous contact in list" => "Vorheriger Kontakt aus der Liste", +"Expand/collapse current addressbook" => "Ausklappen/Einklappen des Adressbuches", +"Next addressbook" => "Nächstes Adressbuch", +"Previous addressbook" => "Vorheriges Adressbuch", +"Actions" => "Aktionen", +"Refresh contacts list" => "Kontaktliste neu laden", +"Add new contact" => "Neuen Kontakt hinzufügen", +"Add new addressbook" => "Neues Adressbuch hinzufügen", +"Delete current contact" => "Aktuellen Kontakt löschen", +"Drop photo to upload" => "Ziehen Sie ein Foto zum Hochladen hierher", +"Delete current photo" => "Derzeitiges Foto löschen", +"Edit current photo" => "Foto ändern", +"Upload new photo" => "Neues Foto hochladen", +"Select photo from ownCloud" => "Foto aus der ownCloud auswählen", +"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format benutzerdefiniert, Kurzname, Vollname, Rückwärts oder Rückwärts mit Komma", +"Edit name details" => "Name ändern", +"Organization" => "Organisation", "Delete" => "Löschen", -"Download contact" => "Kontakt herunterladen", -"Delete contact" => "Kontakt löschen", -"Drop photo to upload" => "Zieh' ein Foto hierher zum hochladen", -"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format benutzerdefiniert, Kurzname, Vollname, Rückwärts order Rückwärts mit Komma", -"Edit name details" => "Namen ändern", "Nickname" => "Spitzname", -"Enter nickname" => "Spitznamen angeben", -"Birthday" => "Geburtstag", -"dd-mm-yyyy" => "TT-MM-JJJJ", +"Enter nickname" => "Spitzname angeben", +"Web site" => "Webseite", +"http://www.somesite.com" => "http://www.somesite.com", +"Go to web site" => "Webseite aufrufen", +"dd-mm-yyyy" => "dd.mm.yyyy", "Groups" => "Gruppen", -"Separate groups with commas" => "Gruppen mit Komma trennt", +"Separate groups with commas" => "Gruppen mit Komma getrennt", "Edit groups" => "Gruppen editieren", "Preferred" => "Bevorzugt", "Please specify a valid email address." => "Bitte eine gültige E-Mail-Adresse angeben.", -"Enter email address" => "E-Mail-Adresse angeben.", +"Enter email address" => "E-Mail-Adresse angeben", "Mail to address" => "E-Mail an diese Adresse schreiben", "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 Karte anzeigen", "Edit address details" => "Adressinformationen ändern", "Add notes here." => "Füge hier Notizen ein.", "Add field" => "Feld hinzufügen", -"Profile picture" => "Profil Bild", "Phone" => "Telefon", +"Email" => "E-Mail", +"Instant Messaging" => "Instant Messaging", +"Address" => "Adresse", "Note" => "Notiz", -"Delete current photo" => "Derzeitiges Foto löschen", -"Edit current photo" => "Foto ändern", -"Upload new photo" => "Neues Foto hochladen", -"Select photo from ownCloud" => "Foto aus ownCloud auswählen", +"Download contact" => "Kontakt herunterladen", +"Delete contact" => "Kontakt löschen", +"The temporary image has been removed from cache." => "Das temporäre Bild wurde aus dem Cache gelöscht.", "Edit address" => "Adresse ändern", "Type" => "Typ", "PO Box" => "Postfach", +"Street address" => "Straßenanschrift", +"Street and number" => "Straße und Nummer", "Extended" => "Erweitert", -"Street" => "Straße", +"Apartment number etc." => "Wohnungsnummer usw.", "City" => "Stadt", "Region" => "Region", +"E.g. state or province" => "Z.B. Staat oder Bezirk", "Zipcode" => "Postleitzahl", +"Postal code" => "PLZ", "Country" => "Land", -"Edit categories" => "Kategorie ändern", -"Add" => "Hinzufügen", "Addressbook" => "Adressbuch", "Hon. prefixes" => "Höflichkeitspräfixe", "Miss" => "Frau", @@ -119,12 +183,12 @@ "Mr" => "Herr", "Sir" => "Herr", "Mrs" => "Frau", -"Dr" => "Dr", +"Dr" => "Dr.", "Given name" => "Vorname", "Additional names" => "Zusätzliche Namen", "Family name" => "Familienname", "Hon. suffixes" => "Höflichkeitssuffixe", -"J.D." => "Dr. Jur", +"J.D." => "Dr. Jur.", "M.D." => "Dr. med.", "D.O." => "DGOM", "D.C." => "MChiro", @@ -132,26 +196,29 @@ "Esq." => "Hochwohlgeborenen", "Jr." => "Jr.", "Sn." => "Senior", -"New Addressbook" => "Neues Adressbuch", -"Edit Addressbook" => "Adressbuch editieren", -"Displayname" => "Anzeigename", -"Active" => "Aktiv", -"Save" => "Speichern", -"Submit" => "Eintragen", -"Cancel" => "Abbrechen", "Import a contacts file" => "Kontaktdatei importieren", "Please choose the addressbook" => "Bitte Adressbuch auswählen", "create a new addressbook" => "Neues Adressbuch erstellen", "Name of new addressbook" => "Name des neuen Adressbuchs", -"Import" => "Importieren", "Importing contacts" => "Kontakte werden importiert", -"Select address book to import to:" => "Adressbuch, in das importiert werden soll", -"Select from HD" => "Von der Festplatte auswählen", -"You have no contacts in your addressbook." => "Du hast keine Kontakte im Adressbuch.", +"You have no contacts in your addressbook." => "Sie haben keine Kontakte im Adressbuch.", "Add contact" => "Kontakt hinzufügen", -"Configure addressbooks" => "Adressbücher konfigurieren", +"Select Address Books" => "Wähle Adressbuch", +"Enter name" => "Name eingeben", +"Enter description" => "Beschreibung eingeben", "CardDAV syncing addresses" => "CardDAV Sync-Adressen", -"more info" => "mehr Info", -"Primary address (Kontact et al)" => "primäre Adresse (für Kontact o.ä. Programme)", -"iOS/OS X" => "iOS/OS X" +"more info" => "mehr Informationen", +"Primary address (Kontact et al)" => "Primäre Adresse (für Kontakt o.ä.)", +"iOS/OS X" => "iOS/OS X", +"Show CardDav link" => "CardDav-Link anzeigen", +"Show read-only VCF link" => "Schreibgeschützten VCF-Link anzeigen", +"Share" => "Teilen", +"Download" => "Herunterladen", +"Edit" => "Bearbeiten", +"New Address Book" => "Neues Adressbuch", +"Name" => "Name", +"Description" => "Beschreibung", +"Save" => "Speichern", +"Cancel" => "Abbrechen", +"More..." => "Mehr..." ); diff --git a/apps/contacts/l10n/el.php b/apps/contacts/l10n/el.php index f015f0ca363..3552ffba616 100644 --- a/apps/contacts/l10n/el.php +++ b/apps/contacts/l10n/el.php @@ -1,39 +1,42 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "Σφάλμα (απ)ενεργοποίησης βιβλίου διευθύνσεων", -"There was an error adding the contact." => "Σφάλμα κατά την προσθήκη επαφής.", -"Cannot add empty property." => "Αδύνατη προσθήκη κενής ιδιότητας.", -"At least one of the address fields has to be filled out." => "Πρέπει να συμπληρωθεί τουλάχιστον ένα από τα παιδία διεύθυνσης.", -"Trying to add duplicate property: " => "Προσπάθεια προσθήκης διπλότυπης ιδιότητας:", -"Error adding contact property." => "Σφάλμα προσθήκης ιδιότητας επαφής.", -"No ID provided" => "Δε δώθηκε ID", +"id is not set." => "δεν ορίστηκε id", +"Cannot update addressbook with an empty name." => "Δε μπορεί να γίνει αλλαγή βιβλίου διευθύνσεων χωρίς όνομα", +"Error updating addressbook." => "Σφάλμα ενημέρωσης βιβλίου διευθύνσεων.", +"No ID provided" => "Δε δόθηκε ID", "Error setting checksum." => "Λάθος κατά τον ορισμό checksum ", "No categories selected for deletion." => "Δε επελέγησαν κατηγορίες για διαγραφή", "No address books found." => "Δε βρέθηκε βιβλίο διευθύνσεων", "No contacts found." => "Δεν βρέθηκαν επαφές", +"There was an error adding the contact." => "Σφάλμα κατά την προσθήκη επαφής.", +"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:\"", -"Cannot add addressbook with an empty name." => "Δε μπορεί να προστεθεί βιβλίο διευθύνσεων με κενό όνομα", -"Error adding addressbook." => "Σφάλμα προσθήκης βιβλίου διευθύνσεων.", -"Error activating addressbook." => "Σφάλμα ενεργοποίησης βιβλίου διευθύνσεων", +"checksum is not set." => "δε ορίστηκε checksum ", +"Information about vCard is incorrect. Please reload the page: " => "Οι πληροφορίες για τη vCard είναι λανθασμένες.Παρακαλώ ξαναφορτώστε τη σελίδα: ", +"Something went FUBAR. " => "Κάτι χάθηκε στο άγνωστο. ", "No contact ID was submitted." => "Δε υπεβλήθει ID επαφής", "Error reading contact photo." => "Σφάλμα ανάγνωσης εικόνας επαφής", "Error saving temporary file." => "Σφάλμα αποθήκευσης προσωρινού αρχείου", "The loading photo is not valid." => "Η φορτωμένη φωτογραφία δεν είναι έγκυρη", -"id is not set." => "δεν ορίστηκε id", -"Information about vCard is incorrect. Please reload the page." => "Οι πληροφορίες σχετικά με vCard είναι εσφαλμένες. Παρακαλώ επαναφορτώστε τη σελίδα.", -"Error deleting contact property." => "Σφάλμα διαγραφής ιδιότητας επαφής.", "Contact ID is missing." => "Λείπει ID επαφής", -"Missing contact id." => "Απουσιαζει ID επαφής", "No photo path was submitted." => "Δε δόθηκε διαδρομή εικόνας", "File doesn't exist:" => "Το αρχείο δεν υπάρχει:", "Error loading image." => "Σφάλμα φόρτωσης εικόνας", -"element name is not set." => "δεν ορίστηκε όνομα στοιχείου", -"checksum is not set." => "δε ορίστηκε checksum ", -"Information about vCard is incorrect. Please reload the page: " => "Οι πληροφορίες για τη vCard είναι λανθασμένες.Παρακαλώ ξαναφορτώστε τη σελίδα:", -"Something went FUBAR. " => "Κάτι χάθηκε στο άγνωστο", -"Error updating contact property." => "Σφάλμα ενημέρωσης ιδιότητας επαφής.", -"Cannot update addressbook with an empty name." => "Δε μπορεί να γίνει αλλαγή βιβλίου διευθύνσεων χωρίς όνομα", -"Error updating addressbook." => "Σφάλμα ενημέρωσης βιβλίου διευθύνσεων.", +"Error getting contact object." => "Σφάλμα κατά τη λήψη αντικειμένου επαφής", +"Error getting PHOTO property." => "Σφάλμα κατά τη λήψη ιδιοτήτων ΦΩΤΟΓΡΑΦΙΑΣ.", +"Error saving contact." => "Σφάλμα κατά την αποθήκευση επαφής.", +"Error resizing image" => "Σφάλμα κατά την αλλαγή μεγέθους εικόνας", +"Error cropping image" => "Σφάλμα κατά την περικοπή εικόνας", +"Error creating temporary image" => "Σφάλμα κατά την δημιουργία προσωρινής εικόνας", +"Error finding image: " => "Σφάλμα κατά την εύρεση της εικόνας: ", "Error uploading contacts to storage." => "Σφάλμα κατά την αποθήκευση επαφών", "There is no error, the file uploaded with success" => "Δεν υπάρχει σφάλμα, το αρχείο ανέβηκε με επιτυχία ", "The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Το μέγεθος του αρχείου ξεπερνάει το upload_max_filesize του php.ini", @@ -41,44 +44,100 @@ "The uploaded file was only partially uploaded" => "Το αρχείο ανέβηκε μερικώς", "No file was uploaded" => "Δεν ανέβηκε κάποιο αρχείο", "Missing a temporary folder" => "Λείπει ο προσωρινός φάκελος", +"Couldn't save temporary image: " => "Δεν ήταν δυνατή η αποθήκευση της προσωρινής εικόνας: ", +"Couldn't load temporary image: " => "Δεν ήταν δυνατή η φόρτωση της προσωρινής εικόνας: ", +"No file was uploaded. Unknown error" => "Δεν ανέβηκε κάποιο αρχείο. Άγνωστο σφάλμα", "Contacts" => "Επαφές", -"Drop a VCF file to import contacts." => "Εισάγεται ένα VCF αρχείο για εισαγωγή επαφών", -"Addressbook not found." => "Δε βρέθηκε βιβλίο διευθύνσεων", +"Sorry, this functionality has not been implemented yet" => "Λυπούμαστε, αυτή η λειτουργία δεν έχει υλοποιηθεί ακόμα", +"Not implemented" => "Δεν έχει υλοποιηθεί", +"Couldn't get a valid address." => "Αδυναμία λήψης έγκυρης διεύθυνσης", +"Error" => "Σφάλμα", +"This property has to be non-empty." => "Το πεδίο δεν πρέπει να είναι άδειο.", +"Couldn't serialize elements." => "Αδύνατο να μπουν σε σειρά τα στοιχεία", +"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "το 'deleteProperty' καλέστηκε χωρίς without type argument. Παρακαλώ αναφέρατε στο bugs.owncloud.org", +"Edit name" => "Αλλαγή ονόματος", +"No files selected for upload." => "Δεν επιλέχτηκαν αρχεία για μεταφόρτωση", +"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Το αρχείο που προσπαθείτε να ανεβάσετε υπερβαίνει το μέγιστο μέγεθος για τις προσθήκες αρχείων σε αυτόν τον server.", +"Error loading profile picture." => "Σφάλμα στην φόρτωση εικόνας προφίλ.", +"Select type" => "Επιλογή τύπου", +"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Κάποιες επαφές σημειώθηκαν προς διαγραφή,δεν έχουν διαγραφεί ακόμα. Παρακαλώ περιμένετε μέχρι να διαγραφούν.", +"Do you want to merge these address books?" => "Επιθυμείτε να συγχωνεύσετε αυτά τα δύο βιβλία διευθύνσεων?", +"Result: " => "Αποτέλεσμα: ", +" imported, " => " εισάγεται,", +" failed." => " απέτυχε.", +"Displayname cannot be empty." => "Το όνομα προβολής δεν μπορεί να είναι κενό. ", +"Addressbook not found: " => "Το βιβλίο διευθύνσεων δεν βρέθηκε:", "This is not your addressbook." => "Αυτό δεν είναι το βιβλίο διευθύνσεων σας.", "Contact could not be found." => "Η επαφή δεν μπόρεσε να βρεθεί.", -"Address" => "Διεύθυνση", -"Telephone" => "Τηλέφωνο", -"Email" => "Email", -"Organization" => "Οργανισμός", +"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" => "Κείμενο", "Voice" => "Ομιλία", -"Message" => "Μήνυμα ", +"Message" => "Μήνυμα", "Fax" => "Φαξ", "Video" => "Βίντεο", "Pager" => "Βομβητής", "Internet" => "Διαδίκτυο", +"Birthday" => "Γενέθλια", +"Business" => "Επιχείρηση", +"Call" => "Κάλεσε", +"Clients" => "Πελάτες", +"Deliverer" => "Προμηθευτής", +"Holidays" => "Διακοπές", +"Ideas" => "Ιδέες", +"Journey" => "Ταξίδι", +"Jubilee" => "Ιωβηλαίο", +"Meeting" => "Συνάντηση", +"Personal" => "Προσωπικό", +"Projects" => "Έργα", +"Questions" => "Ερωτήσεις", "{name}'s Birthday" => "{name} έχει Γενέθλια", "Contact" => "Επαφή", "Add Contact" => "Προσθήκη επαφής", +"Import" => "Εισαγωγή", +"Settings" => "Ρυθμίσεις", "Addressbooks" => "Βιβλία διευθύνσεων", -"Configure Address Books" => "Ρυθμίστε το βιβλίο διευθύνσεων ", -"New Address Book" => "Νέο βιβλίο διευθύνσεων", -"Import from VCF" => "Εισαγωγή από VCF αρχείο", -"CardDav Link" => "Σύνδεσμος CardDav", -"Download" => "Λήψη", -"Edit" => "Επεξεργασία", -"Delete" => "Διαγραφή", -"Download contact" => "Λήψη επαφής", -"Delete contact" => "Διαγραφή επαφής", +"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" => "Διαγραφή τρέχουσας επαφής", "Drop photo to upload" => "Ρίξε μια φωτογραφία για ανέβασμα", +"Delete current photo" => "Διαγραφή τρέχουσας φωτογραφίας", +"Edit current photo" => "Επεξεργασία τρέχουσας φωτογραφίας", +"Upload new photo" => "Ανέβασε νέα φωτογραφία", +"Select photo from ownCloud" => "Επέλεξε φωτογραφία από το ownCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format custom, Όνομα, Επώνυμο, Αντίστροφο ή Αντίστροφο με κόμμα", "Edit name details" => "Αλλάξτε τις λεπτομέρειες ονόματος", +"Organization" => "Οργανισμός", +"Delete" => "Διαγραφή", "Nickname" => "Παρατσούκλι", -"Enter nickname" => "Εισάγεται παρατσούκλι", -"Birthday" => "Γενέθλια", +"Enter nickname" => "Εισάγετε παρατσούκλι", +"Web site" => "Ιστότοπος", +"http://www.somesite.com" => "http://www.somesite.com", +"Go to web site" => "Πήγαινε στον ιστότοπο", "dd-mm-yyyy" => "ΗΗ-ΜΜ-ΕΕΕΕ", "Groups" => "Ομάδες", "Separate groups with commas" => "Διαχώρισε τις ομάδες με κόμμα ", @@ -90,28 +149,33 @@ "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" => "Προσθήκη πεδίου", -"Profile picture" => "Φωτογραφία προφίλ", "Phone" => "Τηλέφωνο", +"Email" => "Email", +"Instant Messaging" => "Άμεσα μυνήματα", +"Address" => "Διεύθυνση", "Note" => "Σημείωση", -"Delete current photo" => "Διαγραφή τρέχουσας φωτογραφίας", -"Edit current photo" => "Επεξεργασία τρέχουσας φωτογραφίας", -"Upload new photo" => "Ανέβασε νέα φωτογραφία", -"Select photo from ownCloud" => "Επέλεξε φωτογραφία από το ownCloud", +"Download contact" => "Λήψη επαφής", +"Delete contact" => "Διαγραφή επαφής", +"The temporary image has been removed from cache." => "Η προσωρινή εικόνα αφαιρέθηκε από την κρυφή μνήμη.", "Edit address" => "Επεξεργασία διεύθυνσης", "Type" => "Τύπος", "PO Box" => "Ταχ. Θυρίδα", +"Street address" => "Διεύθυνση οδού", +"Street and number" => "Οδός και αριθμός", "Extended" => "Εκτεταμένη", -"Street" => "Οδός", +"Apartment number etc." => "Αριθμός διαμερίσματος", "City" => "Πόλη", "Region" => "Περιοχή", +"E.g. state or province" => "Π.χ. Πολιτεία ή επαρχεία", "Zipcode" => "Τ.Κ.", +"Postal code" => "Ταχυδρομικός Κωδικός", "Country" => "Χώρα", -"Edit categories" => "Επεξεργασία κατηγορίας", -"Add" => "Προσθήκη", "Addressbook" => "Βιβλίο διευθύνσεων", "Hon. prefixes" => "προθέματα", "Miss" => "Δις", @@ -132,26 +196,35 @@ "Esq." => "Esq.", "Jr." => "Jr.", "Sn." => "Sn.", -"New Addressbook" => "Νέο βιβλίο διευθύνσεων", -"Edit Addressbook" => "Επεξεργασία βιβλίου διευθύνσεων", -"Displayname" => "Προβαλόμενο όνομα", -"Active" => "Ενεργό", -"Save" => "Αποθήκευση", -"Submit" => "Καταχώρηση", -"Cancel" => "Ακύρωση", "Import a contacts file" => "Εισαγωγή αρχείου επαφών", "Please choose the addressbook" => "Παρακαλώ επέλεξε βιβλίο διευθύνσεων", "create a new addressbook" => "Δημιουργία νέου βιβλίου διευθύνσεων", "Name of new addressbook" => "Όνομα νέου βιβλίου διευθύνσεων", -"Import" => "Εισαγωγή", "Importing contacts" => "Εισαγωγή επαφών", +"Contacts imported successfully" => "Οι επαφές εισήχθησαν επιτυχώς", +"Close Dialog" => "Κλείσιμο διαλόγου", +"Import Addressbook" => "Εισαγωγή βιβλίου διευθύνσεων", "Select address book to import to:" => "Επέλεξε σε ποιο βιβλίο διευθύνσεων για εισαγωγή:", +"Drop a VCF file to import contacts." => "Εισάγεται ένα VCF αρχείο για εισαγωγή επαφών", "Select from HD" => "Επιλογή από HD", "You have no contacts in your addressbook." => "Δεν έχεις επαφές στο βιβλίο διευθύνσεων", "Add contact" => "Προσθήκη επαφής", -"Configure addressbooks" => "Ρύθμισε το βιβλίο διευθύνσεων", +"Select Address Books" => "Επέλεξε βιβλίο διευθύνσεων", +"Enter name" => "Εισαγωγή ονόματος", +"Enter description" => "Εισαγωγή περιγραφής", "CardDAV syncing addresses" => "συγχρονισμός διευθύνσεων μέσω CardDAV ", "more info" => "περισσότερες πληροφορίες", "Primary address (Kontact et al)" => "Κύρια διεύθυνση", -"iOS/OS X" => "iOS/OS X" +"iOS/OS X" => "iOS/OS X", +"Show CardDav link" => "Εμφάνιση συνδέσμου CardDav", +"Show read-only VCF link" => "Εμφάνιση συνδέσμου VCF μόνο για ανάγνωση", +"Share" => "Μοιράσου", +"Download" => "Λήψη", +"Edit" => "Επεξεργασία", +"New Address Book" => "Νέο βιβλίο διευθύνσεων", +"Name" => "Όνομα", +"Description" => "Περιγραφή", +"Save" => "Αποθήκευση", +"Cancel" => "Ακύρωση", +"More..." => "Περισσότερα..." ); diff --git a/apps/contacts/l10n/eo.php b/apps/contacts/l10n/eo.php index ffc885a41a5..e4eb06db2aa 100644 --- a/apps/contacts/l10n/eo.php +++ b/apps/contacts/l10n/eo.php @@ -1,54 +1,70 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "Eraro dum (mal)aktivigo de adresaro.", -"There was an error adding the contact." => "Eraro okazis dum aldono de kontakto.", -"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:", -"Error adding contact property." => "Eraro dum aldono de kontaktopropraĵo.", +"id is not set." => "identigilo ne agordiĝis.", +"Cannot update addressbook with an empty name." => "Ne eblas ĝisdatigi adresaron kun malplena nomo.", +"Error updating addressbook." => "Eraro dum ĝisdatigo de adresaro.", "No ID provided" => "Neniu identigilo proviziĝis.", "Error setting checksum." => "Eraro dum agordado de kontrolsumo.", "No categories selected for deletion." => "Neniu kategorio elektiĝis por forigi.", "No address books found." => "Neniu adresaro troviĝis.", "No contacts found." => "Neniu kontakto troviĝis.", +"There was an error adding the contact." => "Eraro okazis dum aldono de kontakto.", +"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:", -"Cannot add addressbook with an empty name." => "Ne eblas aldoni adresaron kun malplena nomo.", -"Error adding addressbook." => "Eraro dum aldono de adresaro.", -"Error activating addressbook." => "Eraro dum aktivigo de adresaro.", +"checksum is not set." => "kontrolsumo ne agordiĝis.", +"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.", "Error reading contact photo." => "Eraro dum lego de kontakta foto.", "Error saving temporary file." => "Eraro dum konservado de provizora dosiero.", "The loading photo is not valid." => "La alŝutata foto ne validas.", -"id is not set." => "identigilo ne agordiĝis.", -"Information about vCard is incorrect. Please reload the page." => "Informo pri vCard estas malĝusta. Bonvolu reŝargi la paĝon.", -"Error deleting contact property." => "Eraro dum forigo de kontaktopropraĵo.", "Contact ID is missing." => "Kontaktidentigilo mankas.", -"Missing contact id." => "Mankas kontaktidentigilo.", "No photo path was submitted." => "Neniu vojo al foto sendiĝis.", "File doesn't exist:" => "Dosiero ne ekzistas:", "Error loading image." => "Eraro dum ŝargado de bildo.", -"element name is not set." => "eronomo ne agordiĝis.", -"checksum is not set." => "kontrolsumo ne agordiĝis.", -"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.", -"Error updating contact property." => "Eraro dum ĝisdatigo de kontaktopropraĵo.", -"Cannot update addressbook with an empty name." => "Ne eblas ĝisdatigi adresaron kun malplena nomo.", -"Error updating addressbook." => "Eraro dum ĝisdatigo de adresaro.", +"Error getting contact object." => "Eraro dum ekhaviĝis kontakta objekto.", +"Error getting PHOTO property." => "Eraro dum ekhaviĝis la propraĵon PHOTO.", +"Error saving contact." => "Eraro dum konserviĝis kontakto.", +"Error resizing image" => "Eraro dum aligrandiĝis bildo", +"Error cropping image" => "Eraro dum stuciĝis bildo.", +"Error creating temporary image" => "Eraro dum kreiĝis provizora bildo.", +"Error finding image: " => "Eraro dum serĉo de bildo: ", +"Error uploading contacts to storage." => "Eraro dum alŝutiĝis kontaktoj al konservejo.", "There is no error, the file uploaded with success" => "Ne estas eraro, la dosiero alŝutiĝis sukcese.", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "La alŝutita dosiero transpasas la preskribon upload_max_filesize en php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "La alŝutita dosiero transpasas la preskribon MAX_FILE_SIZE kiu specifiĝis en la HTML-formularo", "The uploaded file was only partially uploaded" => "la alŝutita dosiero nur parte alŝutiĝis", "No file was uploaded" => "Neniu dosiero alŝutiĝis.", "Missing a temporary folder" => "Mankas provizora dosierujo.", +"Couldn't save temporary image: " => "Ne eblis konservi provizoran bildon: ", +"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", -"Drop a VCF file to import contacts." => "Demetu VCF-dosieron por enporti kontaktojn.", -"Addressbook not found." => "Adresaro ne troviĝis.", +"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", +"This property has to be non-empty." => "Ĉi tiu propraĵo devas ne esti malplena.", +"Couldn't serialize elements." => "Ne eblis seriigi erojn.", +"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.", +"Select type" => "Elektu tipon", +"Result: " => "Rezulto: ", +" imported, " => " enportoj, ", +" failed." => "malsukcesoj.", +"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.", -"Address" => "Adreso", -"Telephone" => "Telefono", -"Email" => "Retpoŝtadreso", -"Organization" => "Organizaĵo", "Work" => "Laboro", "Home" => "Hejmo", +"Other" => "Alia", "Mobile" => "Poŝtelefono", "Text" => "Teksto", "Voice" => "Voĉo", @@ -57,25 +73,51 @@ "Video" => "Videaĵo", "Pager" => "Televokilo", "Internet" => "Interreto", +"Birthday" => "Naskiĝotago", +"Business" => "Negoco", +"Call" => "Voko", +"Clients" => "Klientoj", +"Deliverer" => "Liveranto", +"Holidays" => "Ferioj", +"Ideas" => "Ideoj", +"Journey" => "Vojaĝo", +"Jubilee" => "Jubileo", +"Meeting" => "Kunveno", +"Personal" => "Persona", +"Projects" => "Projektoj", +"Questions" => "Demandoj", "{name}'s Birthday" => "Naskiĝtago de {name}", "Contact" => "Kontakto", "Add Contact" => "Aldoni kontakton", +"Import" => "Enporti", +"Settings" => "Agordo", "Addressbooks" => "Adresaroj", -"Configure Address Books" => "Agordi adresarojn", -"New Address Book" => "Nova adresaro", -"Import from VCF" => "Enporti el VCF", -"CardDav Link" => "CardDav-ligilo", -"Download" => "Elŝuti", -"Edit" => "Redakti", -"Delete" => "Forigi", -"Download contact" => "Elŝuti kontakton", -"Delete contact" => "Forigi kontakton", +"Close" => "Fermi", +"Keyboard shortcuts" => "Fulmoklavoj", +"Navigation" => "Navigado", +"Next contact in list" => "Jena kontakto en la listo", +"Previous contact in list" => "Maljena kontakto en la listo", +"Next addressbook" => "Jena adresaro", +"Previous addressbook" => "Maljena adresaro", +"Actions" => "Agoj", +"Refresh contacts list" => "Refreŝigi la kontaktoliston", +"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", +"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", "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", +"Organization" => "Organizaĵo", +"Delete" => "Forigi", "Nickname" => "Kromnomo", "Enter nickname" => "Enigu kromnomon", -"Birthday" => "Naskiĝotago", +"Web site" => "TTT-ejo", +"http://www.somesite.com" => "http://www.iuejo.com", +"Go to web site" => "Iri al TTT-ejon", "dd-mm-yyyy" => "yyyy-mm-dd", "Groups" => "Grupoj", "Separate groups with commas" => "Disigi grupojn per komoj", @@ -91,24 +133,24 @@ "Edit address details" => "Redakti detalojn de adreso", "Add notes here." => "Aldoni notojn ĉi tie.", "Add field" => "Aldoni kampon", -"Profile picture" => "Profila bildo", "Phone" => "Telefono", +"Email" => "Retpoŝtadreso", +"Address" => "Adreso", "Note" => "Noto", -"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", +"Download contact" => "Elŝuti kontakton", +"Delete contact" => "Forigi kontakton", +"The temporary image has been removed from cache." => "La provizora bildo estas forigita de la kaŝmemoro.", "Edit address" => "Redakti adreson", "Type" => "Tipo", "PO Box" => "Abonkesto", +"Street address" => "Stratadreso", +"Street and number" => "Strato kaj numero", "Extended" => "Etendita", -"Street" => "Strato", "City" => "Urbo", "Region" => "Regiono", "Zipcode" => "Poŝtokodo", +"Postal code" => "Poŝtkodo", "Country" => "Lando", -"Edit categories" => "Redakti kategoriojn", -"Add" => "Aldoni", "Addressbook" => "Adresaro", "Hon. prefixes" => "Honoraj antaŭmetaĵoj", "Miss" => "f-ino", @@ -121,26 +163,28 @@ "Additional names" => "Pliaj nomoj", "Family name" => "Familia nomo", "Hon. suffixes" => "Honoraj postmetaĵoj", -"New Addressbook" => "Nova adresaro", -"Edit Addressbook" => "Redakti adresaron", -"Displayname" => "Montronomo", -"Active" => "Aktiva", -"Save" => "Konservi", -"Submit" => "Sendi", -"Cancel" => "Nuligi", "Import a contacts file" => "Enporti kontaktodosieron", "Please choose the addressbook" => "Bonvolu elekti adresaron", "create a new addressbook" => "krei novan adresaron", "Name of new addressbook" => "Nomo de nova adresaro", -"Import" => "Enporti", "Importing contacts" => "Enportante kontaktojn", -"Select address book to import to:" => "Elektu adresaron kien enporti:", -"Select from HD" => "Elekti el malmoldisko", "You have no contacts in your addressbook." => "Vi ne havas kontaktojn en via adresaro", "Add contact" => "Aldoni kontakton", -"Configure addressbooks" => "Agordi adresarojn", +"Select Address Books" => "Elektu adresarojn", +"Enter name" => "Enigu nomon", +"Enter description" => "Enigu priskribon", "CardDAV syncing addresses" => "adresoj por CardDAV-sinkronigo", "more info" => "pli da informo", "Primary address (Kontact et al)" => "Ĉefa adreso (por Kontakt kaj aliaj)", -"iOS/OS X" => "iOS/OS X" +"iOS/OS X" => "iOS/OS X", +"Show CardDav link" => "Montri CardDav-ligilon", +"Show read-only VCF link" => "Montri nur legeblan VCF-ligilon", +"Download" => "Elŝuti", +"Edit" => "Redakti", +"New Address Book" => "Nova adresaro", +"Name" => "Nomo", +"Description" => "Priskribo", +"Save" => "Konservi", +"Cancel" => "Nuligi", +"More..." => "Pli..." ); diff --git a/apps/contacts/l10n/es.php b/apps/contacts/l10n/es.php index 2bdb300aa8f..c80c2987e10 100644 --- a/apps/contacts/l10n/es.php +++ b/apps/contacts/l10n/es.php @@ -1,39 +1,41 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "Error al (des)activar libreta de direcciones.", -"There was an error adding the contact." => "Se ha producido un error al añadir 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: ", -"Error adding contact property." => "Error al añadir una propiedad del contacto.", +"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.", +"Error updating addressbook." => "Error al actualizar la libreta de direcciones.", "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.", +"There was an error adding the contact." => "Se ha producido un error al añadir el contacto.", +"element name is not set." => "no se ha puesto ningún nombre de elemento.", +"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: \"", -"Cannot add addressbook with an empty name." => "No se puede añadir una libreta de direcciones sin nombre", -"Error adding addressbook." => "Error al añadir la libreta de direcciones.", -"Error activating addressbook." => "Error al activar la libreta de direcciones.", +"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 la vCard es incorrecta. Por favor, recarga la página:", +"Something went FUBAR. " => "Plof. Algo ha fallado.", "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.", "The loading photo is not valid." => "La foto que se estaba cargando no es válida.", -"id is not set." => "no se ha puesto ninguna ID.", -"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.", -"Error deleting contact property." => "Error al borrar una propiedad del contacto.", "Contact ID is missing." => "Falta la ID del contacto.", -"Missing contact id." => "Falta la id del contacto.", "No photo path was submitted." => "No se ha introducido la ruta de la foto.", "File doesn't exist:" => "Archivo inexistente:", "Error loading image." => "Error cargando imagen.", -"element name is not set." => "no se ha puesto ningún nombre de elemento.", -"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 la vCard es incorrecta. Por favor, recarga la página:", -"Something went FUBAR. " => "Plof. Algo ha fallado.", -"Error updating contact property." => "Error al actualizar una propiedad del contacto.", -"Cannot update addressbook with an empty name." => "No se puede actualizar una libreta de direcciones sin nombre.", -"Error updating addressbook." => "Error al actualizar la libreta de direcciones.", +"Error getting contact object." => "Fallo al coger el contacto.", +"Error getting PHOTO property." => "Fallo al coger las propiedades de la foto .", +"Error saving contact." => "Fallo al salvar un contacto", +"Error resizing image" => "Fallo al cambiar de tamaño una foto", +"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", "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", @@ -41,17 +43,41 @@ "The uploaded file was only partially uploaded" => "El archivo se ha subido parcialmente", "No file was uploaded" => "No se ha subido ningún archivo", "Missing a temporary folder" => "Falta la carpeta temporal", +"Couldn't save temporary image: " => "Fallo no pudo salvar a una imagen temporal", +"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", -"Drop a VCF file to import contacts." => "Suelta un archivo VCF para importar contactos.", -"Addressbook not found." => "Libreta de direcciones no encontrada.", +"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", +"This property has to be non-empty." => "Este campo no puede estar vacío.", +"Couldn't serialize elements." => "Fallo no podido ordenar los elementos", +"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "La propiedad de \"borrar\" se llamado sin argumentos envia fallos a\nbugs.owncloud.org", +"Edit name" => "Edita el Nombre", +"No files selected for upload." => "No hay ficheros seleccionados para subir", +"The file you are trying to upload exceed the maximum size for file uploads on this server." => "El fichero que quieres subir excede el tamaño máximo permitido en este servidor.", +"Select type" => "Selecciona el tipo", +"Result: " => "Resultado :", +" imported, " => "Importado.", +" failed." => "Fallo.", "This is not your addressbook." => "Esta no es tu agenda de contactos.", "Contact could not be found." => "No se ha podido encontrar el contacto.", -"Address" => "Dirección", -"Telephone" => "Teléfono", -"Email" => "Correo electrónico", -"Organization" => "Organización", +"Jabber" => "Jabber", +"AIM" => "AIM", +"MSN" => "MSN", +"Twitter" => "Twitter", +"GoogleTalk" => "Google Talk", +"Facebook" => "Facebook", +"XMPP" => "XMPP", +"ICQ" => "ICQ", +"Yahoo" => "Yahoo", +"Skype" => "Skype", +"QQ" => "QQ", +"GaduGadu" => "GaduGadu", "Work" => "Trabajo", "Home" => "Particular", +"Other" => "Otro", "Mobile" => "Móvil", "Text" => "Texto", "Voice" => "Voz", @@ -60,25 +86,47 @@ "Video" => "Vídeo", "Pager" => "Localizador", "Internet" => "Internet", +"Birthday" => "Cumpleaños", +"Business" => "Negocio", +"Call" => "Llamada", +"Clients" => "Clientes", +"Holidays" => "Vacaciones", +"Ideas" => "Ideas", +"Journey" => "Jornada", +"Meeting" => "Reunión", +"Personal" => "Personal", +"Projects" => "Proyectos", +"Questions" => "Preguntas", "{name}'s Birthday" => "Cumpleaños de {name}", "Contact" => "Contacto", "Add Contact" => "Añadir contacto", +"Import" => "Importar", +"Settings" => "Configuración", "Addressbooks" => "Libretas de direcciones", -"Configure Address Books" => "Configurar libretas de direcciones", -"New Address Book" => "Nueva libreta de direcciones", -"Import from VCF" => "Importar desde VCF", -"CardDav Link" => "Enlace CardDav", -"Download" => "Descargar", -"Edit" => "Editar", -"Delete" => "Borrar", -"Download contact" => "Descargar contacto", -"Delete contact" => "Eliminar contacto", +"Close" => "Cierra.", +"Keyboard shortcuts" => "Atajos de teclado", +"Navigation" => "Navegación", +"Next contact in list" => "Siguiente contacto en la lista", +"Previous contact in list" => "Anterior contacto en la lista", +"Actions" => "Acciones", +"Refresh contacts list" => "Refrescar la lista de contactos", +"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", +"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", "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", +"Organization" => "Organización", +"Delete" => "Borrar", "Nickname" => "Alias", "Enter nickname" => "Introduce un alias", -"Birthday" => "Cumpleaños", +"Web site" => "Sitio Web", +"http://www.somesite.com" => "http://www.unsitio.com", +"Go to web site" => "Ir al sitio Web", "dd-mm-yyyy" => "dd-mm-yyyy", "Groups" => "Grupos", "Separate groups with commas" => "Separa los grupos con comas", @@ -90,28 +138,31 @@ "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", "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", -"Profile picture" => "Foto del perfil", "Phone" => "Teléfono", +"Email" => "Correo electrónico", +"Instant Messaging" => "Mensajería instantánea", +"Address" => "Dirección", "Note" => "Nota", -"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", +"Download contact" => "Descargar contacto", +"Delete contact" => "Eliminar contacto", +"The temporary image has been removed from cache." => "La foto temporal se ha borrado del cache.", "Edit address" => "Editar dirección", "Type" => "Tipo", "PO Box" => "Código postal", +"Street and number" => "Calle y número", "Extended" => "Extendido", -"Street" => "Calle", +"Apartment number etc." => "Número del apartamento, etc.", "City" => "Ciudad", "Region" => "Región", +"E.g. state or province" => "Ej: región o provincia", "Zipcode" => "Código postal", +"Postal code" => "Código postal", "Country" => "País", -"Edit categories" => "Editar categorías", -"Add" => "Añadir", "Addressbook" => "Libreta de direcciones", "Hon. prefixes" => "Prefijos honoríficos", "Miss" => "Srta", @@ -132,26 +183,32 @@ "Esq." => "Don", "Jr." => "Jr.", "Sn." => "Sn.", -"New Addressbook" => "Nueva libreta de direcciones", -"Edit Addressbook" => "Editar libreta de direcciones", -"Displayname" => "Nombre a mostrar", -"Active" => "Activo", -"Save" => "Guardar", -"Submit" => "Aceptar", -"Cancel" => "Cancelar", "Import a contacts file" => "Importar archivo de contactos", "Please choose the addressbook" => "Por favor escoge la agenda", "create a new addressbook" => "crear una nueva agenda", "Name of new addressbook" => "Nombre de la nueva agenda", -"Import" => "Importar", "Importing contacts" => "Importando contactos", +"Contacts imported successfully" => "Contactos importados correctamente", +"Close Dialog" => "Cerrar Diálogo", +"Import Addressbook" => "Importar agenda", "Select address book to import to:" => "Selecciona una agenda para importar a:", +"Drop a VCF file to import contacts." => "Suelta un archivo VCF para importar contactos.", "Select from HD" => "Seleccionar del disco duro", "You have no contacts in your addressbook." => "No hay contactos en tu agenda.", "Add contact" => "Añadir contacto", -"Configure addressbooks" => "Configurar agenda", +"Enter name" => "Introducir nombre", +"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" +"iOS/OS X" => "iOS/OS X", +"Share" => "Compartir", +"Download" => "Descargar", +"Edit" => "Editar", +"New Address Book" => "Nueva libreta de direcciones", +"Name" => "Nombre", +"Description" => "Descripción", +"Save" => "Guardar", +"Cancel" => "Cancelar", +"More..." => "Más..." ); diff --git a/apps/contacts/l10n/et_EE.php b/apps/contacts/l10n/et_EE.php index 39a287c9619..e15ea0c10bd 100644 --- a/apps/contacts/l10n/et_EE.php +++ b/apps/contacts/l10n/et_EE.php @@ -1,39 +1,39 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "Viga aadressiraamatu (de)aktiveerimisel.", -"There was an error adding the contact." => "Konktakti lisamisel tekkis viga.", -"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: ", -"Error adding contact property." => "Viga konktakti korralikul lisamisel.", +"id is not set." => "ID on määramata.", +"Cannot update addressbook with an empty name." => "Tühja nimega aadressiraamatut ei saa uuendada.", +"Error updating addressbook." => "Viga aadressiraamatu uuendamisel.", "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.", +"There was an error adding the contact." => "Konktakti lisamisel tekkis viga.", +"element name is not set." => "elemendi nime pole määratud.", +"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: ", +"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: \"", -"Cannot add addressbook with an empty name." => "Tühja nimega aadressiraamatut ei saa lisada.", -"Error adding addressbook." => "Viga aadressiraamatu lisamisel.", -"Error activating addressbook." => "Viga aadressiraamatu aktiveerimisel.", +"checksum is not set." => "kontrollsummat pole määratud.", +"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.", "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.", "The loading photo is not valid." => "Laetav pilt pole korrektne pildifail.", -"id is not set." => "ID on määramata.", -"Information about vCard is incorrect. Please reload the page." => "Visiitkaardi info pole korrektne. Palun lae leht uuesti.", -"Error deleting contact property." => "Viga konktaki korralikul kustutamisel.", "Contact ID is missing." => "Kontakti ID puudub.", -"Missing contact id." => "Puuduv kontakti ID.", "No photo path was submitted." => "Foto asukohta pole määratud.", "File doesn't exist:" => "Faili pole olemas:", "Error loading image." => "Viga pildi laadimisel.", -"element name is not set." => "elemendi nime pole määratud.", -"checksum is not set." => "kontrollsummat pole määratud.", -"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.", -"Error updating contact property." => "Viga konktaki korralikul uuendamisel.", -"Cannot update addressbook with an empty name." => "Tühja nimega aadressiraamatut ei saa uuendada.", -"Error updating addressbook." => "Viga aadressiraamatu uuendamisel.", +"Error getting contact object." => "Viga kontakti objekti hankimisel.", +"Error getting PHOTO property." => "Viga PHOTO omaduse hankimisel.", +"Error saving contact." => "Viga kontakti salvestamisel.", +"Error resizing image" => "Viga pildi suuruse muutmisel", +"Error cropping image" => "Viga pildi lõikamisel", +"Error creating temporary image" => "Viga ajutise pildi loomisel", +"Error finding image: " => "Viga pildi leidmisel: ", "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", @@ -41,15 +41,23 @@ "The uploaded file was only partially uploaded" => "Fail laeti üles ainult osaliselt", "No file was uploaded" => "Ühtegi faili ei laetud üles", "Missing a temporary folder" => "Ajutiste failide kaust puudub", +"Couldn't save temporary image: " => "Ajutise pildi salvestamine ebaõnnestus: ", +"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", -"Drop a VCF file to import contacts." => "Lohista siia VCF-fail, millest kontakte importida.", -"Addressbook not found." => "Aadressiraamatut ei leitud", +"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", +"This property has to be non-empty." => "See omadus ei tohi olla tühi.", +"Edit name" => "Muuda nime", +"No files selected for upload." => "Üleslaadimiseks pole faile valitud.", +"Select type" => "Vali tüüp", +"Result: " => "Tulemus: ", +" imported, " => " imporditud, ", +" failed." => " ebaõnnestus.", "This is not your addressbook." => "See pole sinu aadressiraamat.", "Contact could not be found." => "Kontakti ei leitud.", -"Address" => "Aadress", -"Telephone" => "Telefon", -"Email" => "E-post", -"Organization" => "Organisatsioon", "Work" => "Töö", "Home" => "Kodu", "Mobile" => "Mobiil", @@ -60,25 +68,24 @@ "Video" => "Video", "Pager" => "Piipar", "Internet" => "Internet", +"Birthday" => "Sünnipäev", "{name}'s Birthday" => "{name} sünnipäev", "Contact" => "Kontakt", "Add Contact" => "Lisa kontakt", +"Import" => "Impordi", "Addressbooks" => "Aadressiraamatud", -"Configure Address Books" => "Seadista aadressiraamatut", -"New Address Book" => "Uus aadressiraamat", -"Import from VCF" => "Impordi VCF-ist", -"CardDav Link" => "CardDav link", -"Download" => "Lae alla", -"Edit" => "Muuda", -"Delete" => "Kustuta", -"Download contact" => "Lae kontakt alla", -"Delete contact" => "Kustuta kontakt", +"Close" => "Sule", "Drop photo to upload" => "Lohista üleslaetav foto siia", +"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", "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", +"Organization" => "Organisatsioon", +"Delete" => "Kustuta", "Nickname" => "Hüüdnimi", "Enter nickname" => "Sisesta hüüdnimi", -"Birthday" => "Sünnipäev", "dd-mm-yyyy" => "dd.mm.yyyy", "Groups" => "Grupid", "Separate groups with commas" => "Eralda grupid komadega", @@ -94,24 +101,21 @@ "Edit address details" => "Muuda aaressi infot", "Add notes here." => "Lisa märkmed siia.", "Add field" => "Lisa väli", -"Profile picture" => "Profiili pilt", "Phone" => "Telefon", +"Email" => "E-post", +"Address" => "Aadress", "Note" => "Märkus", -"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", +"Download contact" => "Lae kontakt alla", +"Delete contact" => "Kustuta kontakt", +"The temporary image has been removed from cache." => "Ajutine pilt on puhvrist eemaldatud.", "Edit address" => "Muuda aadressi", "Type" => "Tüüp", "PO Box" => "Postkontori postkast", "Extended" => "Laiendatud", -"Street" => "Tänav", "City" => "Linn", "Region" => "Piirkond", "Zipcode" => "Postiindeks", "Country" => "Riik", -"Edit categories" => "Muuda kategooriat", -"Add" => "Lisa", "Addressbook" => "Aadressiraamat", "Hon. prefixes" => "Eesliited", "Miss" => "Preili", @@ -132,26 +136,26 @@ "Esq." => "Esq.", "Jr." => "Jr.", "Sn." => "Senior.", -"New Addressbook" => "Uus aadressiraamat", -"Edit Addressbook" => "Muuda aadressiraamatut", -"Displayname" => "Näidatav nimi", -"Active" => "Aktiivne", -"Save" => "Salvesta", -"Submit" => "Saada", -"Cancel" => "Loobu", "Import a contacts file" => "Impordi kontaktifail", "Please choose the addressbook" => "Palun vali aadressiraamat", "create a new addressbook" => "loo uus aadressiraamat", "Name of new addressbook" => "Uue aadressiraamatu nimi", -"Import" => "Impordi", "Importing contacts" => "Kontaktide importimine", +"Contacts imported successfully" => "Kontaktid on imporditud", +"Close Dialog" => "Sulge dialoog", +"Import Addressbook" => "Impordi aadressiraamat", "Select address book to import to:" => "Vali aadressiraamat, millesse importida:", +"Drop a VCF file to import contacts." => "Lohista siia VCF-fail, millest kontakte importida.", "Select from HD" => "Vali kõvakettalt", "You have no contacts in your addressbook." => "Sinu aadressiraamatus pole ühtegi kontakti.", "Add contact" => "Lisa kontakt", -"Configure addressbooks" => "Seadista aadressiraamatuid", "CardDAV syncing addresses" => "CardDAV sünkroniseerimise aadressid", "more info" => "lisainfo", "Primary address (Kontact et al)" => "Peamine aadress", -"iOS/OS X" => "iOS/OS X" +"iOS/OS X" => "iOS/OS X", +"Download" => "Lae alla", +"Edit" => "Muuda", +"New Address Book" => "Uus aadressiraamat", +"Save" => "Salvesta", +"Cancel" => "Loobu" ); diff --git a/apps/contacts/l10n/eu.php b/apps/contacts/l10n/eu.php index 6dfbf0a7b23..b676b45c0fd 100644 --- a/apps/contacts/l10n/eu.php +++ b/apps/contacts/l10n/eu.php @@ -1,44 +1,69 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "Errore bat egon da helbide-liburua (des)gaitzen", -"There was an error adding the contact." => "Errore bat egon da kontaktua gehitzerakoan", -"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.", -"Error adding contact property." => "Errorea kontaktu propietatea gehitzean.", +"id is not set." => "IDa ez da ezarri.", +"Cannot update addressbook with an empty name." => "Ezin da helbide liburua eguneratu izen huts batekin.", +"Error updating addressbook." => "Errore bat egon da helbide liburua eguneratzen.", "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.", +"There was an error adding the contact." => "Errore bat egon da kontaktua gehitzerakoan", +"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:", +"Information about vCard is incorrect. Please reload the page." => "vCard-aren inguruko informazioa okerra da. Mesedez birkargatu orrialdea.", "Missing ID" => "ID falta da", -"Error adding addressbook." => "Errore bat egon da helbide liburua gehitzean.", -"Error activating addressbook." => "Errore bat egon da helbide-liburua aktibatzen.", +"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.", "The loading photo is not valid." => "Kargatzen ari den argazkia ez da egokia.", -"id is not set." => "IDa ez da ezarri.", -"Information about vCard is incorrect. Please reload the page." => "vCard-aren inguruko informazioa okerra da. Mesedez birkargatu orrialdea.", -"Error deleting contact property." => "Errorea kontaktu propietatea ezabatzean.", "Contact ID is missing." => "Kontaktuaren IDa falta da.", -"Missing contact id." => "Kontaktuaren IDa falta da.", +"No photo path was submitted." => "Ez da argazkiaren bide-izenik eman.", "File doesn't exist:" => "Fitxategia ez da existitzen:", "Error loading image." => "Errore bat izan da irudia kargatzearkoan.", -"element name is not set." => "elementuaren izena ez da ezarri.", -"Error updating contact property." => "Errorea kontaktu propietatea eguneratzean.", -"Cannot update addressbook with an empty name." => "Ezin da helbide liburua eguneratu izen huts batekin.", -"Error updating addressbook." => "Errore bat egon da helbide liburua eguneratzen.", +"Error getting contact object." => "Errore bat izan da kontaktu objetua lortzean.", +"Error getting PHOTO property." => "Errore bat izan da PHOTO propietatea lortzean.", +"Error saving contact." => "Errore bat izan da kontaktua gordetzean.", +"Error resizing image" => "Errore bat izan da irudiaren tamaina aldatzean", +"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:", "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", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Igotako fitxategia HTML formularioan zehaztutako MAX_FILE_SIZE direktiba baino handidagoa da.", "The uploaded file was only partially uploaded" => "Igotako fitxategiaren zati bat bakarrik igo da", "No file was uploaded" => "Ez da fitxategirik igo", +"Missing a temporary folder" => "Aldi bateko karpeta falta da", +"Couldn't save temporary image: " => "Ezin izan da aldi bateko irudia gorde:", +"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", -"Drop a VCF file to import contacts." => "Askatu VCF fitxategia kontaktuak inportatzeko.", -"Addressbook not found." => "Helbide liburua ez da aurkitu", +"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", +"This property has to be non-empty." => "Propietate hau ezin da hutsik egon.", +"Couldn't serialize elements." => "Ezin izan dira elementuak serializatu.", +"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' argumenturik gabe deitu da. Mezedez abisatu bugs.owncloud.org-en", +"Edit name" => "Editatu izena", +"No files selected for upload." => "Ez duzu igotzeko fitxategirik hautatu.", +"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Igo nahi duzun fitxategia zerbitzariak onartzen duen tamaina baino handiagoa da.", +"Select type" => "Hautatu mota", +"Result: " => "Emaitza:", +" imported, " => " inportatua, ", +" failed." => "huts egin du.", "This is not your addressbook." => "Hau ez da zure helbide liburua.", "Contact could not be found." => "Ezin izan da kontaktua aurkitu.", -"Address" => "Helbidea", -"Telephone" => "Telefonoa", -"Email" => "Eposta", -"Organization" => "Erakundea", "Work" => "Lana", "Home" => "Etxea", +"Other" => "Bestelakoa", "Mobile" => "Mugikorra", "Text" => "Testua", "Voice" => "Ahotsa", @@ -47,24 +72,46 @@ "Video" => "Bideoa", "Pager" => "Bilagailua", "Internet" => "Internet", +"Birthday" => "Jaioteguna", +"Call" => "Deia", +"Clients" => "Bezeroak", +"Holidays" => "Oporrak", +"Ideas" => "Ideiak", +"Journey" => "Bidaia", +"Meeting" => "Bilera", +"Personal" => "Pertsonala", +"Projects" => "Proiektuak", +"Questions" => "Galderak", "{name}'s Birthday" => "{name}ren jaioteguna", "Contact" => "Kontaktua", "Add Contact" => "Gehitu kontaktua", +"Import" => "Inportatu", +"Settings" => "Ezarpenak", "Addressbooks" => "Helbide Liburuak", -"Configure Address Books" => "Konfiguratu Helbide Liburuak", -"New Address Book" => "Helbide-liburu berria", -"Import from VCF" => "VCFtik inportatu", -"CardDav Link" => "CardDav lotura", -"Download" => "Deskargatu", -"Edit" => "Editatu", -"Delete" => "Ezabatu", -"Download contact" => "Deskargatu kontaktua", -"Delete contact" => "Ezabatu kontaktua", +"Close" => "Itxi", +"Keyboard shortcuts" => "Teklatuaren lasterbideak", +"Navigation" => "Nabigazioa", +"Next contact in list" => "Hurrengoa kontaktua zerrendan", +"Previous contact in list" => "Aurreko kontaktua zerrendan", +"Expand/collapse current addressbook" => "Zabaldu/tolestu uneko helbide-liburua", +"Actions" => "Ekintzak", +"Refresh contacts list" => "Gaurkotu kontaktuen zerrenda", +"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", +"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", +"Delete" => "Ezabatu", "Nickname" => "Ezizena", "Enter nickname" => "Sartu ezizena", -"Birthday" => "Jaioteguna", +"Web site" => "Web orria", +"http://www.somesite.com" => "http://www.webgunea.com", +"Go to web site" => "Web orrira joan", "dd-mm-yyyy" => "yyyy-mm-dd", "Groups" => "Taldeak", "Separate groups with commas" => "Banatu taldeak komekin", @@ -80,45 +127,49 @@ "Edit address details" => "Editatu helbidearen zehaztasunak", "Add notes here." => "Gehitu oharrak hemen.", "Add field" => "Gehitu eremua", -"Profile picture" => "Profilaren irudia", "Phone" => "Telefonoa", +"Email" => "Eposta", +"Address" => "Helbidea", "Note" => "Oharra", -"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", +"Download contact" => "Deskargatu kontaktua", +"Delete contact" => "Ezabatu kontaktua", +"The temporary image has been removed from cache." => "Aldi bateko irudia cachetik ezabatu da.", "Edit address" => "Editatu helbidea", "Type" => "Mota", "PO Box" => "Posta kutxa", +"Street address" => "Kalearen helbidea", +"Street and number" => "Kalea eta zenbakia", "Extended" => "Hedatua", -"Street" => "Kalea", +"Apartment number etc." => "Etxe zenbakia eab.", "City" => "Hiria", "Region" => "Eskualdea", "Zipcode" => "Posta kodea", +"Postal code" => "Posta kodea", "Country" => "Herrialdea", -"Edit categories" => "Editatu kategoriak", -"Add" => "Gehitu", "Addressbook" => "Helbide-liburua", -"New Addressbook" => "Helbide-liburu berria", -"Edit Addressbook" => "Editatu helbide-liburua", -"Displayname" => "Bistaratzeko izena", -"Active" => "Aktibo", -"Save" => "Gorde", -"Submit" => "Bidali", -"Cancel" => "Ezeztatu", "Import a contacts file" => "Inporatu kontaktuen fitxategia", "Please choose the addressbook" => "Mesedez, aukeratu helbide liburua", "create a new addressbook" => "sortu helbide liburu berria", "Name of new addressbook" => "Helbide liburuaren izena", -"Import" => "Inportatu", "Importing contacts" => "Kontaktuak inportatzen", +"Contacts imported successfully" => "Kontaktuak ongi inportatu dira", +"Close Dialog" => "Dialogoa itxi", +"Import Addressbook" => "Inporatu helbide liburua", "Select address book to import to:" => "Hautau helburuko helbide liburua:", +"Drop a VCF file to import contacts." => "Askatu VCF fitxategia kontaktuak inportatzeko.", "Select from HD" => "Hautatu disko gogorretik", "You have no contacts in your addressbook." => "Ez duzu kontakturik zure helbide liburuan.", "Add contact" => "Gehitu kontaktua", -"Configure addressbooks" => "Konfiguratu helbide liburuak", +"Select Address Books" => "Hautatu helbide-liburuak", +"Enter name" => "Sartu izena", +"Enter description" => "Sartu deskribapena", "CardDAV syncing addresses" => "CardDAV sinkronizazio helbideak", "more info" => "informazio gehiago", "Primary address (Kontact et al)" => "Helbide nagusia", -"iOS/OS X" => "iOS/OS X" +"iOS/OS X" => "iOS/OS X", +"Download" => "Deskargatu", +"Edit" => "Editatu", +"New Address Book" => "Helbide-liburu berria", +"Save" => "Gorde", +"Cancel" => "Ezeztatu" ); diff --git a/apps/contacts/l10n/fa.php b/apps/contacts/l10n/fa.php index 9278975c407..9ee6ee54661 100644 --- a/apps/contacts/l10n/fa.php +++ b/apps/contacts/l10n/fa.php @@ -1,39 +1,39 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "خطا در (غیر) فعال سازی کتابچه نشانه ها", -"There was an error adding the contact." => "یک خطا در افزودن اطلاعات شخص مورد نظر", -"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: " => "امتحان کردن برای وارد کردن مشخصات تکراری", -"Error adding contact property." => "خطا درهنگام افزودن ویژگی", +"id is not set." => "شناسه تعیین نشده", +"Cannot update addressbook with an empty name." => "نمی توانید کتابچه نشانی ها را با یک نام خالی بروزرسانی کنید", +"Error updating addressbook." => "خطا در هنگام بروزرسانی کتابچه نشانی ها", "No ID provided" => "هیچ شناسه ای ارائه نشده", "Error setting checksum." => "خطا در تنظیم checksum", "No categories selected for deletion." => "هیچ گروهی برای حذف شدن در نظر گرفته نشده", "No address books found." => "هیچ کتابچه نشانی پیدا نشد", "No contacts found." => "هیچ شخصی پیدا نشد", +"There was an error adding the contact." => "یک خطا در افزودن اطلاعات شخص مورد نظر", +"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: \"" => "خطا در تجزیه کارت ویزا برای شناسه:", -"Cannot add addressbook with an empty name." => "نمیتوانید یک نام خالی را به کتابچه نشانی ها افزود", -"Error adding addressbook." => "خطا درهنگام افزودن کتابچه نشانی ها", -"Error activating addressbook." => "خطا درهنگام فعال سازیکتابچه نشانی ها", +"checksum is not set." => "checksum تنظیم شده نیست", +"Information about vCard is incorrect. Please reload the page: " => "اطلاعات کارت ویزا شما غلط است لطفا صفحه را دوباره بارگزاری کنید", +"Something went FUBAR. " => "چند چیز به FUBAR رفتند", "No contact ID was submitted." => "هیچ اطلاعاتی راجع به شناسه ارسال نشده", "Error reading contact photo." => "خطا در خواندن اطلاعات تصویر", "Error saving temporary file." => "خطا در ذخیره پرونده موقت", "The loading photo is not valid." => "بارگزاری تصویر امکان پذیر نیست", -"id is not set." => "شناسه تعیین نشده", -"Information about vCard is incorrect. Please reload the page." => "اطلاعات درمورد vCard شما اشتباه است لطفا صفحه را دوباره بار گذاری کنید", -"Error deleting contact property." => "خطا در هنگام پاک کرد ویژگی", "Contact ID is missing." => "اطلاعات شناسه گم شده", -"Missing contact id." => "شما اطلاعات شناسه را فراموش کرده اید", "No photo path was submitted." => "هیچ نشانی از تصویرارسال نشده", "File doesn't exist:" => "پرونده وجود ندارد", "Error loading image." => "خطا در بارگزاری تصویر", -"element name is not set." => "نام اصلی تنظیم نشده است", -"checksum is not set." => "checksum تنظیم شده نیست", -"Information about vCard is incorrect. Please reload the page: " => "اطلاعات کارت ویزا شما غلط است لطفا صفحه را دوباره بارگزاری کنید", -"Something went FUBAR. " => "چند چیز به FUBAR رفتند", -"Error updating contact property." => "خطا در هنگام بروزرسانی اطلاعات شخص مورد نظر", -"Cannot update addressbook with an empty name." => "نمی توانید کتابچه نشانی ها را با یک نام خالی بروزرسانی کنید", -"Error updating addressbook." => "خطا در هنگام بروزرسانی کتابچه نشانی ها", +"Error getting contact object." => "خطا در گرفتن اطلاعات شخص", +"Error getting PHOTO property." => "خطا در دربافت تصویر ویژگی شخصی", +"Error saving contact." => "خطا در ذخیره سازی اطلاعات", +"Error resizing image" => "خطا در تغییر دادن اندازه تصویر", +"Error cropping image" => "خطا در برداشت تصویر", +"Error creating temporary image" => "خطا در ساخت تصویر temporary", +"Error finding image: " => "خطا در پیدا کردن تصویر:", "Error uploading contacts to storage." => "خطا در هنگام بارگذاری و ذخیره سازی", "There is no error, the file uploaded with success" => "هیچ خطایی نیست بارگذاری پرونده موفقیت آمیز بود", "The uploaded file exceeds the upload_max_filesize directive in php.ini" => "حجم آپلود از طریق Php.ini تعیین می شود", @@ -41,15 +41,26 @@ "The uploaded file was only partially uploaded" => "پرونده بارگذاری شده فقط تاحدودی بارگذاری شده", "No file was uploaded" => "هیچ پروندهای بارگذاری نشده", "Missing a temporary folder" => "یک پوشه موقت گم شده", +"Couldn't save temporary image: " => "قابلیت ذخیره تصویر موقت وجود ندارد:", +"Couldn't load temporary image: " => "قابلیت بارگذاری تصویر موقت وجود ندارد:", +"No file was uploaded. Unknown error" => "هیچ فایلی آپلود نشد.خطای ناشناس", "Contacts" => "اشخاص", -"Drop a VCF file to import contacts." => "یک پرونده VCF را به اینجا بکشید تا اشخاص افزوده شوند", -"Addressbook not found." => "کتابچه نشانی ها یافت نشد", +"Sorry, this functionality has not been implemented yet" => "با عرض پوزش،این قابلیت هنوز اجرا نشده است", +"Not implemented" => "انجام نشد", +"Couldn't get a valid address." => "Couldn't get a valid address.", +"Error" => "خطا", +"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." => "حجم فایل بسیار بیشتر از حجم تنظیم شده در تنظیمات سرور است", +"Select type" => "نوع را انتخاب کنید", +"Result: " => "نتیجه:", +" imported, " => "وارد شد،", +" failed." => "ناموفق", "This is not your addressbook." => "این کتابچه ی نشانه های شما نیست", "Contact could not be found." => "اتصال ویا تماسی یافت نشد", -"Address" => "نشانی", -"Telephone" => "تلفن", -"Email" => "نشانی پست الکترنیک", -"Organization" => "نهاد(ارگان)", "Work" => "کار", "Home" => "خانه", "Mobile" => "موبایل", @@ -60,25 +71,24 @@ "Video" => "رسانه تصویری", "Pager" => "صفحه", "Internet" => "اینترنت", +"Birthday" => "روزتولد", "{name}'s Birthday" => "روز تولد {name} است", "Contact" => "اشخاص", "Add Contact" => "افزودن اطلاعات شخص مورد نظر", +"Import" => "وارد کردن", "Addressbooks" => "کتابچه ی نشانی ها", -"Configure Address Books" => "پیکر بندی کتابچه نشانی ها", -"New Address Book" => "کتابچه نشانه های جدید", -"Import from VCF" => "وارد شده از VCF", -"CardDav Link" => "CardDav Link", -"Download" => "بارگیری", -"Edit" => "ویرایش", -"Delete" => "پاک کردن", -"Download contact" => "دانلود مشخصات اشخاص", -"Delete contact" => "پاک کردن اطلاعات شخص مورد نظر", +"Close" => "بستن", "Drop photo to upload" => "تصویر را به اینجا بکشید تا بار گذازی شود", +"Delete current photo" => "پاک کردن تصویر کنونی", +"Edit current photo" => "ویرایش تصویر کنونی", +"Upload new photo" => "بار گذاری یک تصویر جدید", +"Select photo from ownCloud" => "انتخاب یک تصویر از ابر های شما", "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" => "ویرایش نام جزئیات", +"Organization" => "نهاد(ارگان)", +"Delete" => "پاک کردن", "Nickname" => "نام مستعار", "Enter nickname" => "یک نام مستعار وارد کنید", -"Birthday" => "روزتولد", "dd-mm-yyyy" => "dd-mm-yyyy", "Groups" => "گروه ها", "Separate groups with commas" => "جدا کردن گروه ها به وسیله درنگ نما", @@ -94,24 +104,21 @@ "Edit address details" => "ویرایش جزئیات نشانی ها", "Add notes here." => "اینجا یادداشت ها را بیافزایید", "Add field" => "اضافه کردن فیلد", -"Profile picture" => "تصویر پروفایل", "Phone" => "شماره تلفن", +"Email" => "نشانی پست الکترنیک", +"Address" => "نشانی", "Note" => "یادداشت", -"Delete current photo" => "پاک کردن تصویر کنونی", -"Edit current photo" => "ویرایش تصویر کنونی", -"Upload new photo" => "بار گذاری یک تصویر جدید", -"Select photo from ownCloud" => "انتخاب یک تصویر از ابر های شما", +"Download contact" => "دانلود مشخصات اشخاص", +"Delete contact" => "پاک کردن اطلاعات شخص مورد نظر", +"The temporary image has been removed from cache." => "تصویر موقت از کش پاک شد.", "Edit address" => "ویرایش نشانی", "Type" => "نوع", "PO Box" => "صندوق پستی", "Extended" => "تمدید شده", -"Street" => "خیابان", "City" => "شهر", "Region" => "ناحیه", "Zipcode" => "کد پستی", "Country" => "کشور", -"Edit categories" => "ویرایش گروه", -"Add" => "افزودن", "Addressbook" => "کتابچه ی نشانی ها", "Hon. prefixes" => "پیشوند های محترمانه", "Miss" => "خانم", @@ -132,26 +139,26 @@ "Esq." => "Esq.", "Jr." => "Jr.", "Sn." => "Sn.", -"New Addressbook" => "کتابچه نشانی جدید", -"Edit Addressbook" => "ویرایش کتابچه نشانی", -"Displayname" => "نام برای نمایش", -"Active" => "فعال", -"Save" => "ذخیره سازی", -"Submit" => "ارسال", -"Cancel" => "انصراف", "Import a contacts file" => "وارد کردن پرونده حاوی اطلاعات", "Please choose the addressbook" => "لطفا یک کتابچه نشانی انتخاب کنید", "create a new addressbook" => "یک کتابچه نشانی بسازید", "Name of new addressbook" => "نام کتابچه نشانی جدید", -"Import" => "وارد کردن", "Importing contacts" => "وارد کردن اشخاص", +"Contacts imported successfully" => "اشخاص با موفقیت افزوده شدند", +"Close Dialog" => "بستن دیالوگ", +"Import Addressbook" => "وارد کردن کتابچه نشانی", "Select address book to import to:" => "یک کتابچه نشانی انتخاب کنید تا وارد شود", +"Drop a VCF file to import contacts." => "یک پرونده VCF را به اینجا بکشید تا اشخاص افزوده شوند", "Select from HD" => "انتخاب از دیسک سخت", "You have no contacts in your addressbook." => "شماهیچ شخصی در کتابچه نشانی خود ندارید", "Add contact" => "افزودن اطلاعات شخص مورد نظر", -"Configure addressbooks" => "پیکربندی کتابچه ی نشانی ها", "CardDAV syncing addresses" => "CardDAV syncing addresses ", "more info" => "اطلاعات بیشتر", "Primary address (Kontact et al)" => "نشانی اولیه", -"iOS/OS X" => "iOS/OS X " +"iOS/OS X" => "iOS/OS X ", +"Download" => "بارگیری", +"Edit" => "ویرایش", +"New Address Book" => "کتابچه نشانه های جدید", +"Save" => "ذخیره سازی", +"Cancel" => "انصراف" ); diff --git a/apps/contacts/l10n/fi_FI.php b/apps/contacts/l10n/fi_FI.php index 2e3e91611bb..23cafe44dcf 100644 --- a/apps/contacts/l10n/fi_FI.php +++ b/apps/contacts/l10n/fi_FI.php @@ -1,36 +1,60 @@ <?php $TRANSLATIONS = array( -"There was an error adding the contact." => "Virhe yhteystietoa lisättäessä.", -"Cannot add empty property." => "Tyhjää ominaisuutta ei voi lisätä.", -"At least one of the address fields has to be filled out." => "Vähintään yksi osoitekenttä tulee täyttää.", -"Error adding contact property." => "Virhe lisättäessä ominaisuutta yhteystietoon.", +"Error updating addressbook." => "Virhe päivitettäessä osoitekirjaa.", +"Error setting checksum." => "Virhe asettaessa tarkistussummaa.", "No categories selected for deletion." => "Luokkia ei ole valittu poistettavaksi.", "No address books found." => "Osoitekirjoja ei löytynyt.", "No contacts found." => "Yhteystietoja ei löytynyt.", +"There was an error adding the contact." => "Virhe yhteystietoa lisättäessä.", +"Cannot add empty property." => "Tyhjää ominaisuutta ei voi lisätä.", +"At least one of the address fields has to be filled out." => "Vähintään yksi osoitekenttä tulee täyttää.", +"Information about vCard is incorrect. Please reload the page." => "vCardin tiedot eivät kelpaa. Lataa sivu uudelleen.", "Error parsing VCard for ID: \"" => "Virhe jäsennettäessä vCardia tunnisteelle: \"", -"Cannot add addressbook with an empty name." => "Ilman nimeä olevaa osoitekirjaa ei voi lisätä.", -"Error adding addressbook." => "Virhe lisättäessä osoitekirjaa.", -"Error activating addressbook." => "Virhe aktivoitaessa osoitekirjaa.", "Error saving temporary file." => "Virhe tallennettaessa tilapäistiedostoa.", -"Error deleting contact property." => "Virhe poistettaessa yhteystiedon ominaisuutta.", +"No photo path was submitted." => "Kuvan polkua ei annettu.", "File doesn't exist:" => "Tiedostoa ei ole olemassa:", "Error loading image." => "Virhe kuvaa ladatessa.", -"Error updating contact property." => "Virhe päivitettäessä yhteystiedon ominaisuutta.", -"Error updating addressbook." => "Virhe päivitettäessä osoitekirjaa.", +"Error saving contact." => "Virhe yhteystietoa tallennettaessa.", +"Error resizing image" => "Virhe asettaessa kuvaa uuteen kokoon", +"Error cropping image" => "Virhe rajatessa kuvaa", +"Error creating temporary image" => "Virhe luotaessa väliaikaista kuvaa", "There is no error, the file uploaded with success" => "Ei virhettä, tiedosto lähetettiin onnistuneesti", "The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Lähetetyn tiedoston koko ylittää upload_max_filesize-asetuksen arvon php.ini-tiedostossa", "The uploaded file was only partially uploaded" => "Lähetetty tiedosto lähetettiin vain osittain", "No file was uploaded" => "Tiedostoa ei lähetetty", "Missing a temporary folder" => "Tilapäiskansio puuttuu", +"Couldn't save temporary image: " => "Väliaikaiskuvan tallennus epäonnistui:", +"Couldn't load temporary image: " => "Väliaikaiskuvan lataus epäonnistui:", +"No file was uploaded. Unknown error" => "Tiedostoa ei lähetetty. Tuntematon virhe", "Contacts" => "Yhteystiedot", -"Addressbook not found." => "Osoitekirjaa ei löytynyt.", +"Error" => "Virhe", +"Edit name" => "Muokkaa nimeä", +"No files selected for upload." => "Tiedostoja ei ole valittu lähetettäväksi.", +"Error loading profile picture." => "Virhe profiilikuvaa ladatessa.", +"Select type" => "Valitse tyyppi", +"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?", +"Result: " => "Tulos: ", +" imported, " => " tuotu, ", +" failed." => " epäonnistui.", +"Displayname cannot be empty." => "Näyttönimi ei voi olla tyhjä.", +"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.", -"Address" => "Osoite", -"Telephone" => "Puhelin", -"Email" => "Sähköposti", -"Organization" => "Organisaatio", +"Jabber" => "Jabber", +"AIM" => "AIM", +"MSN" => "MSN", +"Twitter" => "Twitter", +"GoogleTalk" => "Google Talk", +"Facebook" => "Facebook", +"XMPP" => "XMPP", +"ICQ" => "ICQ", +"Yahoo" => "Yahoo", +"Skype" => "Skype", +"QQ" => "QQ", +"GaduGadu" => "GaduGadu", "Work" => "Työ", "Home" => "Koti", +"Other" => "Muu", "Mobile" => "Mobiili", "Text" => "Teksti", "Voice" => "Ääni", @@ -39,71 +63,97 @@ "Video" => "Video", "Pager" => "Hakulaite", "Internet" => "Internet", +"Birthday" => "Syntymäpäivä", +"Business" => "Työ", +"Questions" => "Kysymykset", "{name}'s Birthday" => "Henkilön {name} syntymäpäivä", "Contact" => "Yhteystieto", "Add Contact" => "Lisää yhteystieto", +"Import" => "Tuo", +"Settings" => "Asetukset", "Addressbooks" => "Osoitekirjat", -"Configure Address Books" => "Muokkaa osoitekirjoja", -"New Address Book" => "Uusi osoitekirja", -"Import from VCF" => "Tuo VCF-tiedostosta", -"CardDav Link" => "CardDav-linkki", -"Download" => "Lataa", -"Edit" => "Muokkaa", +"Close" => "Sulje", +"Keyboard shortcuts" => "Pikanäppäimet", +"Next contact in list" => "Seuraava yhteystieto luettelossa", +"Previous contact in list" => "Edellinen yhteystieto luettelossa", +"Next addressbook" => "Seuraava osoitekirja", +"Previous addressbook" => "Edellinen osoitekirja", +"Actions" => "Toiminnot", +"Refresh contacts list" => "Päivitä yhteystietoluettelo", +"Add new contact" => "Lisää uusi yhteystieto", +"Add new addressbook" => "Lisää uusi osoitekirja", +"Delete current contact" => "Poista nykyinen yhteystieto", +"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", "Delete" => "Poista", -"Download contact" => "Lataa yhteystieto", -"Delete contact" => "Poista yhteystieto", "Nickname" => "Kutsumanimi", "Enter nickname" => "Anna kutsumanimi", -"Birthday" => "Syntymäpäivä", +"Web site" => "Verkkosivu", +"http://www.somesite.com" => "http://www.somesite.com", +"Go to web site" => "Siirry verkkosivulle", "Groups" => "Ryhmät", "Separate groups with commas" => "Erota ryhmät pilkuilla", "Edit groups" => "Muokkaa ryhmiä", +"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", "View on map" => "Näytä kartalla", +"Edit address details" => "Muokkaa osoitetietoja", "Add notes here." => "Lisää huomiot tähän.", "Add field" => "Lisää kenttä", -"Profile picture" => "Profiilikuva", "Phone" => "Puhelin", +"Email" => "Sähköposti", +"Address" => "Osoite", "Note" => "Huomio", -"Delete current photo" => "Poista nykyinen valokuva", -"Edit current photo" => "Muokkaa nykyistä valokuvaa", -"Upload new photo" => "Lähetä uusi valokuva", -"Select photo from ownCloud" => "Valitse valokuva ownCloudista", +"Download contact" => "Lataa yhteystieto", +"Delete contact" => "Poista yhteystieto", +"The temporary image has been removed from cache." => "Väliaikainen kuva on poistettu välimuistista.", "Edit address" => "Muokkaa osoitetta", "Type" => "Tyyppi", "PO Box" => "Postilokero", +"Street address" => "Katuosoite", +"Street and number" => "Katu ja numero", "Extended" => "Laajennettu", -"Street" => "Katuosoite", +"Apartment number etc." => "Asunnon numero jne.", "City" => "Paikkakunta", "Region" => "Alue", "Zipcode" => "Postinumero", +"Postal code" => "Postinumero", "Country" => "Maa", -"Edit categories" => "Muokkaa luokkia", -"Add" => "Lisää", "Addressbook" => "Osoitekirja", "Given name" => "Etunimi", "Additional names" => "Lisänimet", "Family name" => "Sukunimi", -"New Addressbook" => "Uusi osoitekirja", -"Edit Addressbook" => "Muokkaa osoitekirjaa", -"Active" => "Aktiivinen", -"Save" => "Tallenna", -"Submit" => "Lähetä", -"Cancel" => "Peru", "Import a contacts file" => "Tuo yhteystiedon sisältävä tiedosto", "Please choose the addressbook" => "Valitse osoitekirja", "create a new addressbook" => "luo uusi osoitekirja", "Name of new addressbook" => "Uuden osoitekirjan nimi", -"Import" => "Tuo", "Importing contacts" => "Tuodaan yhteystietoja", -"Select address book to import to:" => "Valitse osoitekirja, johon yhteystiedot tuodaan:", "You have no contacts in your addressbook." => "Osoitekirjassasi ei ole yhteystietoja.", "Add contact" => "Lisää yhteystieto", -"Configure addressbooks" => "Muokkaa osoitekirjoja", +"Select Address Books" => "Valitse osoitekirjat", +"Enter name" => "Anna nimi", +"Enter description" => "Anna kuvaus", "CardDAV syncing addresses" => "CardDAV-synkronointiosoitteet", -"iOS/OS X" => "iOS/OS X" +"iOS/OS X" => "iOS/OS X", +"Show CardDav link" => "Näytä CardDav-linkki", +"Show read-only VCF link" => "Näytä vain luku -muodossa oleva VCF-linkki", +"Share" => "Jaa", +"Download" => "Lataa", +"Edit" => "Muokkaa", +"New Address Book" => "Uusi osoitekirja", +"Name" => "Nimi", +"Description" => "Kuvaus", +"Save" => "Tallenna", +"Cancel" => "Peru", +"More..." => "Lisää..." ); diff --git a/apps/contacts/l10n/fr.php b/apps/contacts/l10n/fr.php index 0a2a4e58b9f..87942444356 100644 --- a/apps/contacts/l10n/fr.php +++ b/apps/contacts/l10n/fr.php @@ -1,39 +1,42 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "Des erreurs se sont produites lors de l'activation/désactivation du carnet d'adresses.", -"There was an error adding the contact." => "Une erreur s'est produite lors de l'ajout du contact.", -"Cannot add empty property." => "Impossible d'ajouter un champ vide.", -"At least one of the address fields has to be filled out." => "Au moins un des champs d'adresses doit être complété.", -"Trying to add duplicate property: " => "Ajout d'une propriété en double:", -"Error adding contact property." => "Erreur lors de l'ajout du champ.", +"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.", +"Error updating addressbook." => "Erreur lors de la mise à jour du carnet d'adresses.", "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é.", +"There was an error adding the contact." => "Une erreur s'est produite lors de l'ajout du contact.", +"element name is not set." => "Le champ Nom n'est pas défini.", +"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: \"", -"Cannot add addressbook with an empty name." => "Ne peut être ajouté avec un nom vide.", -"Error adding addressbook." => "Erreur lors de l'ajout du carnet d'adresses.", -"Error activating addressbook." => "Erreur lors de l'activation du carnet d'adresses.", +"checksum is not set." => "L'hachage n'est pas défini.", +"Information about vCard is incorrect. Please reload the page: " => "L'informatiion à propos de la vCard est incorrect. Merci de rafraichir la page:", +"Something went FUBAR. " => "Quelque chose est FUBAR.", "No contact ID was submitted." => "Aucun ID de contact envoyé", "Error reading contact photo." => "Erreur de lecture de la photo du contact.", "Error saving temporary file." => "Erreur de sauvegarde du fichier temporaire.", "The loading photo is not valid." => "La photo chargée est invalide.", -"id is not set." => "L'ID n'est pas défini.", -"Information about vCard is incorrect. Please reload the page." => "Les informations relatives à cette vCard sont incorrectes. Veuillez recharger la page.", -"Error deleting contact property." => "Erreur lors de la suppression du champ.", "Contact ID is missing." => "L'ID du contact est manquant.", -"Missing contact id." => "ID contact manquant.", "No photo path was submitted." => "Le chemin de la photo n'a pas été envoyé.", "File doesn't exist:" => "Fichier inexistant:", "Error loading image." => "Erreur lors du chargement de l'image.", -"element name is not set." => "Le champ Nom n'est pas défini.", -"checksum is not set." => "L'hachage n'est pas défini.", -"Information about vCard is incorrect. Please reload the page: " => "L'informatiion à propos de la vCard est incorrect. Merci de rafraichir la page:", -"Something went FUBAR. " => "Quelque chose est FUBAR.", -"Error updating contact property." => "Erreur lors de la mise à jour du champ.", -"Cannot update addressbook with an empty name." => "Impossible de mettre à jour le carnet d'adresses avec un nom vide.", -"Error updating addressbook." => "Erreur lors de la mise à jour du carnet d'adresses.", +"Error getting contact object." => "Erreur lors de l'obtention de l'objet contact", +"Error getting PHOTO property." => "Erreur lors de l'obtention des propriétés de la photo", +"Error saving contact." => "Erreur de sauvegarde du contact", +"Error resizing image" => "Erreur de redimensionnement de l'image", +"Error cropping image" => "Erreur lors du rognage de l'image", +"Error creating temporary image" => "Erreur de création de l'image temporaire", +"Error finding image: " => "Erreur pour trouver l'image :", "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", @@ -41,17 +44,46 @@ "The uploaded file was only partially uploaded" => "Le fichier envoyé n'a été que partiellement envoyé.", "No file was uploaded" => "Pas de fichier envoyé.", "Missing a temporary folder" => "Absence de dossier temporaire.", +"Couldn't save temporary image: " => "Impossible de sauvegarder l'image temporaire :", +"Couldn't load temporary image: " => "Impossible de charger l'image temporaire :", +"No file was uploaded. Unknown error" => "Aucun fichier n'a été chargé. Erreur inconnue", "Contacts" => "Contacts", -"Drop a VCF file to import contacts." => "Glisser un fichier VCF pour importer des contacts.", -"Addressbook not found." => "Carnet d'adresses introuvable.", +"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", +"This property has to be non-empty." => "Cette valeur ne doit pas être vide", +"Couldn't serialize elements." => "Impossible de sérialiser les éléments.", +"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' a été appelé sans type d'arguments. Merci de rapporter un bug à bugs.owncloud.org", +"Edit name" => "Éditer le nom", +"No files selected for upload." => "Aucun fichiers choisis pour être chargés", +"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Le fichier que vous tentez de charger dépasse la taille maximum de fichier autorisée sur ce serveur.", +"Error loading profile picture." => "Erreur pendant le chargement de la photo de profil.", +"Select type" => "Sélectionner un type", +"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 ?", +"Result: " => "Résultat :", +" imported, " => "importé,", +" failed." => "échoué.", +"Displayname cannot be empty." => "Le nom d'affichage ne peut pas être vide.", +"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é.", -"Address" => "Adresse", -"Telephone" => "Téléphone", -"Email" => "E-mail", -"Organization" => "Société", +"Jabber" => "Jabber", +"AIM" => "Messagerie Instantanée", +"MSN" => "MSN", +"Twitter" => "Twitter", +"GoogleTalk" => "GoogleTalk", +"Facebook" => "Facebook", +"XMPP" => "XMPP", +"ICQ" => "ICQ", +"Yahoo" => "Yahoo", +"Skype" => "Skype", +"QQ" => "QQ", +"GaduGadu" => "GaduGadu", "Work" => "Travail", "Home" => "Maison", +"Other" => "Autre", "Mobile" => "Mobile", "Text" => "Texte", "Voice" => "Voix", @@ -60,25 +92,52 @@ "Video" => "Vidéo", "Pager" => "Bipeur", "Internet" => "Internet", +"Birthday" => "Anniversaire", +"Business" => "Business", +"Call" => "Appel", +"Clients" => "Clients", +"Deliverer" => "Livreur", +"Holidays" => "Vacances", +"Ideas" => "Idées", +"Journey" => "Trajet", +"Jubilee" => "Jubilé", +"Meeting" => "Rendez-vous", +"Personal" => "Personnel", +"Projects" => "Projets", +"Questions" => "Questions", "{name}'s Birthday" => "Anniversaire de {name}", "Contact" => "Contact", "Add Contact" => "Ajouter un Contact", +"Import" => "Importer", +"Settings" => "Paramètres", "Addressbooks" => "Carnets d'adresses", -"Configure Address Books" => "Paramétrer carnet d'adresses", -"New Address Book" => "Nouveau Carnet d'adresses", -"Import from VCF" => "Importer depuis VCF", -"CardDav Link" => "Lien CardDav", -"Download" => "Télécharger", -"Edit" => "Modifier", -"Delete" => "Supprimer", -"Download contact" => "Télécharger le contact", -"Delete contact" => "Supprimer le contact", +"Close" => "Fermer", +"Keyboard shortcuts" => "Raccourcis clavier", +"Navigation" => "Navigation", +"Next contact in list" => "Contact suivant dans la liste", +"Previous contact in list" => "Contact précédent dans la liste", +"Expand/collapse current addressbook" => "Dé/Replier le carnet d'adresses courant", +"Next addressbook" => "Carnet d'adresses suivant", +"Previous addressbook" => "Carnet d'adresses précédent", +"Actions" => "Actions", +"Refresh contacts list" => "Actualiser la liste des contacts", +"Add new contact" => "Ajouter un nouveau contact", +"Add new addressbook" => "Ajouter un nouveau carnet d'adresses", +"Delete current contact" => "Effacer le contact sélectionné", "Drop photo to upload" => "Glisser une photo pour l'envoi", +"Delete current photo" => "Supprimer la photo actuelle", +"Edit current photo" => "Editer la photo actuelle", +"Upload new photo" => "Envoyer une nouvelle photo", +"Select photo from ownCloud" => "Sélectionner une photo depuis ownCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formatage personnalisé, Nom court, Nom complet, Inversé, Inversé avec virgule", "Edit name details" => "Editer les noms", +"Organization" => "Société", +"Delete" => "Supprimer", "Nickname" => "Surnom", "Enter nickname" => "Entrer un surnom", -"Birthday" => "Anniversaire", +"Web site" => "Page web", +"http://www.somesite.com" => "http://www.somesite.com", +"Go to web site" => "Allez à la page web", "dd-mm-yyyy" => "jj-mm-aaaa", "Groups" => "Groupes", "Separate groups with commas" => "Séparer les groupes avec des virgules", @@ -86,31 +145,37 @@ "Preferred" => "Préféré", "Please specify a valid email address." => "Merci d'entrer une adresse e-mail valide.", "Enter email address" => "Entrer une adresse e-mail", +"Mail to address" => "Envoyer à l'adresse", "Delete email address" => "Supprimer l'adresse e-mail", "Enter phone number" => "Entrer un numéro de téléphone", "Delete phone number" => "Supprimer le numéro de téléphone", +"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.", -"Profile picture" => "Photo de profil", "Phone" => "Téléphone", +"Email" => "E-mail", +"Instant Messaging" => "Messagerie instantanée", +"Address" => "Adresse", "Note" => "Note", -"Delete current photo" => "Supprimer la photo actuelle", -"Edit current photo" => "Editer la photo actuelle", -"Upload new photo" => "Envoyer une nouvelle photo", -"Select photo from ownCloud" => "Sélectionner une photo depuis ownCloud", +"Download contact" => "Télécharger le contact", +"Delete contact" => "Supprimer le contact", +"The temporary image has been removed from cache." => "L'image temporaire a été supprimée du cache.", "Edit address" => "Editer l'adresse", "Type" => "Type", "PO Box" => "Boîte postale", +"Street address" => "Adresse postale", +"Street and number" => "Rue et numéro", "Extended" => "Étendu", -"Street" => "Rue", +"Apartment number etc." => "Numéro d'appartement, etc.", "City" => "Ville", "Region" => "Région", +"E.g. state or province" => "Ex: état ou province", "Zipcode" => "Code postal", +"Postal code" => "Code postal", "Country" => "Pays", -"Edit categories" => "Editer les catégories", -"Add" => "Ajouter", "Addressbook" => "Carnet d'adresses", "Hon. prefixes" => "Préfixe hon.", "Miss" => "Mlle", @@ -123,27 +188,43 @@ "Additional names" => "Nom supplémentaires", "Family name" => "Nom de famille", "Hon. suffixes" => "Suffixes hon.", +"J.D." => "J.D.", +"M.D." => "Dr.", +"D.O." => "D.O.", +"D.C." => "D.C.", "Ph.D." => "Dr", -"New Addressbook" => "Nouveau carnet d'adresses", -"Edit Addressbook" => "Éditer le carnet d'adresses", -"Displayname" => "Nom", -"Active" => "Carnet actif", -"Save" => "Sauvegarder", -"Submit" => "Envoyer", -"Cancel" => "Annuler", +"Esq." => "Esq.", +"Jr." => "Jr.", +"Sn." => "Sn.", "Import a contacts file" => "Importer un fichier de contacts", "Please choose the addressbook" => "Choisissez le carnet d'adresses SVP", "create a new addressbook" => "Créer un nouveau carnet d'adresses", "Name of new addressbook" => "Nom du nouveau carnet d'adresses", -"Import" => "Importer", "Importing contacts" => "Importation des contacts", +"Contacts imported successfully" => "Contacts importés avec succes", +"Close Dialog" => "Fermer la boite de dialogue", +"Import Addressbook" => "Importer un carnet d'adresses.", "Select address book to import to:" => "Selectionner le carnet d'adresses à importer vers:", +"Drop a VCF file to import contacts." => "Glisser un fichier VCF pour importer des contacts.", "Select from HD" => "Selectionner depuis le disque dur", "You have no contacts in your addressbook." => "Il n'y a pas de contact dans votre carnet d'adresses.", "Add contact" => "Ajouter un contact", -"Configure addressbooks" => "Paramétrer carnet d'adresses", +"Select Address Books" => "Choix du carnet d'adresses", +"Enter name" => "Saisissez le nom", +"Enter description" => "Saisissez une description", "CardDAV syncing addresses" => "Synchronisation des contacts CardDAV", "more info" => "Plus d'infos", "Primary address (Kontact et al)" => "Adresse principale", -"iOS/OS X" => "iOS/OS X" +"iOS/OS X" => "iOS/OS X", +"Show CardDav link" => "Afficher le lien CardDav", +"Show read-only VCF link" => "Afficher les liens VCF en lecture seule", +"Share" => "Partager", +"Download" => "Télécharger", +"Edit" => "Modifier", +"New Address Book" => "Nouveau Carnet d'adresses", +"Name" => "Nom", +"Description" => "Description", +"Save" => "Sauvegarder", +"Cancel" => "Annuler", +"More..." => "Plus…" ); diff --git a/apps/contacts/l10n/gl.php b/apps/contacts/l10n/gl.php index bc3ec7449c9..f25219b22ce 100644 --- a/apps/contacts/l10n/gl.php +++ b/apps/contacts/l10n/gl.php @@ -1,58 +1,157 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "Produciuse un erro (des)activando a axenda.", +"id is not set." => "non se estableceu o id.", +"Cannot update addressbook with an empty name." => "Non se pode actualizar a libreta de enderezos sen completar o nome.", +"Error updating addressbook." => "Produciuse un erro actualizando a axenda.", +"No ID provided" => "Non se proveeu ID", +"Error setting checksum." => "Erro establecendo a suma de verificación", +"No categories selected for deletion." => "Non se seleccionaron categorías para borrado.", +"No address books found." => "Non se atoparon libretas de enderezos.", +"No contacts found." => "Non se atoparon contactos.", "There was an error adding the contact." => "Produciuse un erro engadindo o contacto.", +"element name is not set." => "non se nomeou o elemento.", "Cannot add empty property." => "Non se pode engadir unha propiedade baleira.", "At least one of the address fields has to be filled out." => "Polo menos un dos campos do enderezo ten que ser cuberto.", -"Error adding contact property." => "Produciuse un erro engadindo unha propiedade do contacto.", -"Error adding addressbook." => "Produciuse un erro engadindo a axenda.", -"Error activating addressbook." => "Produciuse un erro activando a axenda.", +"Trying to add duplicate property: " => "Tentando engadir propiedade duplicada: ", "Information about vCard is incorrect. Please reload the page." => "A información sobre a vCard é incorrecta. Por favor volva cargar a páxina.", -"Error deleting contact property." => "Produciuse un erro borrando a propiedade do contacto.", -"Error updating contact property." => "Produciuse un erro actualizando a propiedade do contacto.", -"Error updating addressbook." => "Produciuse un erro actualizando a axenda.", +"Missing ID" => "ID perdido", +"Error parsing VCard for ID: \"" => "Erro procesando a VCard para o ID: \"", +"checksum is not set." => "non se estableceu a suma de verificación.", +"Information about vCard is incorrect. Please reload the page: " => "A información sobre a vCard é incorrecta. Por favor, recargue a páxina: ", +"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.", +"The loading photo is not valid." => "A fotografía cargada non é válida.", +"Contact ID is missing." => "Falta o ID do contacto.", +"No photo path was submitted." => "Non se enviou a ruta a unha foto.", +"File doesn't exist:" => "O ficheiro non existe:", +"Error loading image." => "Erro cargando imaxe.", +"Error getting contact object." => "Erro obtendo o obxeto contacto.", +"Error getting PHOTO property." => "Erro obtendo a propiedade PHOTO.", +"Error saving contact." => "Erro gardando o contacto.", +"Error resizing image" => "Erro cambiando o tamaño da imaxe", +"Error cropping image" => "Erro recortando a imaxe", +"Error creating temporary image" => "Erro creando a imaxe temporal", +"Error finding image: " => "Erro buscando a imaxe: ", +"Error uploading contacts to storage." => "Erro subindo os contactos ao almacén.", +"There is no error, the file uploaded with success" => "Non houbo erros, o ficheiro subeuse con éxito", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "O ficheiro subido supera a directiva upload_max_filesize no php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "O ficheiro subido supera a directiva MAX_FILE_SIZE especificada no formulario HTML", +"The uploaded file was only partially uploaded" => "O ficheiro so foi parcialmente subido", +"No file was uploaded" => "Non se subeu ningún ficheiro", +"Missing a temporary folder" => "Falta o cartafol temporal", +"Couldn't save temporary image: " => "Non se puido gardar a imaxe temporal: ", +"Couldn't load temporary image: " => "Non se puido cargar a imaxe temporal: ", +"No file was uploaded. Unknown error" => "Non se subeu ningún ficheiro. Erro descoñecido.", "Contacts" => "Contactos", +"Sorry, this functionality has not been implemented yet" => "Sentímolo, esta función aínda non foi implementada.", +"Not implemented" => "Non implementada.", +"Couldn't get a valid address." => "Non se puido obter un enderezo de correo válido.", +"Error" => "Erro", +"This property has to be non-empty." => "Esta propiedade non pode quedar baldeira.", +"Couldn't serialize elements." => "Non se puido serializar os elementos.", +"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' chamado sen argumento. Por favor, informe en bugs.owncloud.org", +"Edit name" => "Editar nome", +"No files selected for upload." => "Sen ficheiros escollidos para subir.", +"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.", +"Select type" => "Seleccione tipo", +"Result: " => "Resultado: ", +" imported, " => " importado, ", +" failed." => " fallou.", "This is not your addressbook." => "Esta non é a súa axenda.", "Contact could not be found." => "Non se atopou o contacto.", -"Address" => "Enderezo", -"Telephone" => "Teléfono", -"Email" => "Correo electrónico", -"Organization" => "Organización", "Work" => "Traballo", "Home" => "Casa", "Mobile" => "Móbil", "Text" => "Texto", "Voice" => "Voz", +"Message" => "Mensaxe", "Fax" => "Fax", "Video" => "Vídeo", "Pager" => "Paxinador", +"Internet" => "Internet", +"Birthday" => "Aniversario", +"{name}'s Birthday" => "Cumpleanos de {name}", "Contact" => "Contacto", "Add Contact" => "Engadir contacto", +"Import" => "Importar", "Addressbooks" => "Axendas", -"New Address Book" => "Nova axenda", -"CardDav Link" => "Ligazón CardDav", -"Download" => "Descargar", -"Edit" => "Editar", +"Close" => "Pechar", +"Drop photo to upload" => "Solte a foto a subir", +"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", +"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", +"Organization" => "Organización", "Delete" => "Eliminar", -"Download contact" => "Descargar contacto", -"Delete contact" => "Borrar contacto", -"Birthday" => "Aniversario", +"Nickname" => "Apodo", +"Enter nickname" => "Introuza apodo", +"dd-mm-yyyy" => "dd-mm-yyyy", +"Groups" => "Grupos", +"Separate groups with commas" => "Separe grupos con comas", +"Edit groups" => "Editar grupos", "Preferred" => "Preferido", +"Please specify a valid email address." => "Por favor indique un enderezo de correo electrónico válido.", +"Enter email address" => "Introduza enderezo de correo electrónico", +"Mail to address" => "Correo ao enderezo", +"Delete email address" => "Borrar enderezo de correo electrónico", +"Enter phone number" => "Introducir número de teléfono", +"Delete phone number" => "Borrar número de teléfono", +"View on map" => "Ver no mapa", +"Edit address details" => "Editar detalles do enderezo", +"Add notes here." => "Engadir aquí as notas.", +"Add field" => "Engadir campo", "Phone" => "Teléfono", +"Email" => "Correo electrónico", +"Address" => "Enderezo", +"Note" => "Nota", +"Download contact" => "Descargar contacto", +"Delete contact" => "Borrar contacto", +"The temporary image has been removed from cache." => "A imaxe temporal foi eliminada da caché.", +"Edit address" => "Editar enderezo", "Type" => "Escribir", "PO Box" => "Apartado de correos", "Extended" => "Ampliado", -"Street" => "Rúa", "City" => "Cidade", "Region" => "Autonomía", "Zipcode" => "Código postal", "Country" => "País", -"Add" => "Engadir", "Addressbook" => "Axenda", -"New Addressbook" => "Nova axenda", -"Edit Addressbook" => "Editar axenda", -"Displayname" => "Nome a mostrar", -"Active" => "Activo", +"Hon. prefixes" => "Prefixos honoríficos", +"Miss" => "Srta", +"Ms" => "Sra/Srta", +"Mr" => "Sr", +"Sir" => "Sir", +"Mrs" => "Sra", +"Dr" => "Dr", +"Given name" => "Apodo", +"Additional names" => "Nomes adicionais", +"Family name" => "Nome familiar", +"Hon. suffixes" => "Sufixos honorarios", +"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" => "Importar un ficheiro de contactos", +"Please choose the addressbook" => "Por favor escolla unha libreta de enderezos", +"create a new addressbook" => "crear unha nova libreta de enderezos", +"Name of new addressbook" => "Nome da nova libreta de enderezos", +"Importing contacts" => "Importando contactos", +"You have no contacts in your addressbook." => "Non ten contactos na súa libreta de enderezos.", +"Add contact" => "Engadir contacto", +"CardDAV syncing addresses" => "Enderezos CardDAV a sincronizar", +"more info" => "máis información", +"Primary address (Kontact et al)" => "Enderezo primario (Kontact et al)", +"iOS/OS X" => "iOS/OS X", +"Download" => "Descargar", +"Edit" => "Editar", +"New Address Book" => "Nova axenda", "Save" => "Gardar", -"Submit" => "Enviar", "Cancel" => "Cancelar" ); diff --git a/apps/contacts/l10n/he.php b/apps/contacts/l10n/he.php index 6e40ad71e1d..b224403ad22 100644 --- a/apps/contacts/l10n/he.php +++ b/apps/contacts/l10n/he.php @@ -1,65 +1,135 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "שגיאה בהפעלה או בנטרול פנקס הכתובות.", -"There was an error adding the contact." => "אירעה שגיאה בעת הוספת איש הקשר.", -"Cannot add empty property." => "לא ניתן להוסיף מאפיין ריק.", -"At least one of the address fields has to be filled out." => "יש למלא לפחות אחד משדות הכתובת.", -"Trying to add duplicate property: " => "ניסיון להוספת מאפיין כפול: ", -"Error adding contact property." => "שגיאה בהוספת מאפיין לאיש הקשר.", +"id is not set." => "מספר מזהה לא נקבע.", +"Cannot update addressbook with an empty name." => "אי אפשר לעדכן ספר כתובות ללא שם", +"Error updating addressbook." => "שגיאה בעדכון פנקס הכתובות.", "No ID provided" => "לא צוין מזהה", "Error setting checksum." => "שגיאה בהגדרת נתוני הביקורת.", "No categories selected for deletion." => "לא נבחור קטגוריות למחיקה.", "No address books found." => "לא נמצאו פנקסי כתובות.", "No contacts found." => "לא נמצאו אנשי קשר.", -"Missing ID" => "מזהה חסר", -"Error adding addressbook." => "שגיאה בהוספת פנקס הכתובות.", -"Error activating addressbook." => "שגיאה בהפעלת פנקס הכתובות.", +"There was an error adding the contact." => "אירעה שגיאה בעת הוספת איש הקשר.", +"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 אינו נכון. נא לטעון מחדש את הדף.", -"Error deleting contact property." => "שגיאה במחיקת מאפיין של איש הקשר.", -"Error updating contact property." => "שגיאה בעדכון המאפיין של איש הקשר.", -"Error updating addressbook." => "שגיאה בעדכון פנקס הכתובות.", +"Missing ID" => "מזהה חסר", +"Error parsing VCard for ID: \"" => "שגיאה בפענוח ה VCard עבור מספר המזהה: \"", +"checksum is not set." => "סיכום ביקורת לא נקבע.", +"Information about vCard is incorrect. Please reload the page: " => "המידע עבור ה vCard אינו נכון. אנא טען את העמוד: ", +"Something went FUBAR. " => "משהו לא התנהל כצפוי.", +"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 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", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "הקובץ שהועלה גדוך מהערך MAX_FILE_SIZE שהוגדר בתופס HTML", +"The uploaded file was only partially uploaded" => "הקובץ הועלה באופן חלקי בלבד", +"No file was uploaded" => "שום קובץ לא הועלה", +"Missing a temporary folder" => "תקיה זמנית חסרה", "Contacts" => "אנשי קשר", "This is not your addressbook." => "זהו אינו ספר הכתובות שלך", "Contact could not be found." => "לא ניתן לאתר איש קשר", -"Address" => "כתובת", -"Telephone" => "טלפון", -"Email" => "דואר אלקטרוני", -"Organization" => "ארגון", "Work" => "עבודה", "Home" => "בית", "Mobile" => "נייד", "Text" => "טקסט", "Voice" => "קולי", +"Message" => "הודעה", "Fax" => "פקס", "Video" => "וידאו", "Pager" => "זימונית", +"Internet" => "אינטרנט", +"Birthday" => "יום הולדת", +"{name}'s Birthday" => "יום ההולדת של {name}", "Contact" => "איש קשר", "Add Contact" => "הוספת איש קשר", +"Import" => "יבא", "Addressbooks" => "פנקסי כתובות", -"New Address Book" => "פנקס כתובות חדש", -"CardDav Link" => "קישור ", -"Download" => "הורדה", -"Edit" => "עריכה", +"Drop photo to upload" => "גרור ושחרר תמונה בשביל להעלות", +"Delete current photo" => "מחק תמונה נוכחית", +"Edit current photo" => "ערוך תמונה נוכחית", +"Upload new photo" => "העלה תמונה חדשה", +"Select photo from ownCloud" => "בחר תמונה מ ownCloud", +"Edit name details" => "ערוך פרטי שם", +"Organization" => "ארגון", "Delete" => "מחיקה", -"Download contact" => "הורדת איש קשר", -"Delete contact" => "מחיקת איש קשר", -"Birthday" => "יום הולדת", +"Nickname" => "כינוי", +"Enter nickname" => "הכנס כינוי", +"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" => "מחק מספר טלפון", +"View on map" => "ראה במפה", +"Edit address details" => "ערוך פרטי כתובת", +"Add notes here." => "הוסף הערות כאן.", +"Add field" => "הוסף שדה", "Phone" => "טלפון", +"Email" => "דואר אלקטרוני", +"Address" => "כתובת", +"Note" => "הערה", +"Download contact" => "הורדת איש קשר", +"Delete contact" => "מחיקת איש קשר", +"Edit address" => "ערוך כתובת", "Type" => "סוג", "PO Box" => "תא דואר", "Extended" => "מורחב", -"Street" => "רחוב", "City" => "עיר", "Region" => "אזור", "Zipcode" => "מיקוד", "Country" => "מדינה", -"Add" => "הוספה", "Addressbook" => "פנקס כתובות", -"New Addressbook" => "פנקס כתובות חדש", -"Edit Addressbook" => "עריכת פנקס הכתובות", -"Displayname" => "שם התצוגה", -"Active" => "פעיל", +"Hon. prefixes" => "קידומות שם", +"Miss" => "גב'", +"Ms" => "גב'", +"Mr" => "מר'", +"Sir" => "אדון", +"Mrs" => "גב'", +"Dr" => "ד\"ר", +"Given name" => "שם", +"Additional names" => "שמות נוספים", +"Family name" => "שם משפחה", +"Hon. suffixes" => "סיומות שם", +"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" => "מיבא אנשי קשר", +"You have no contacts in your addressbook." => "איך לך אנשי קשר בספר הכתובות", +"Add contact" => "הוסף איש קשר", +"CardDAV syncing addresses" => "CardDAV מסנכרן כתובות", +"more info" => "מידע נוסף", +"Primary address (Kontact et al)" => "כתובת ראשית", +"iOS/OS X" => "iOS/OS X", +"Download" => "הורדה", +"Edit" => "עריכה", +"New Address Book" => "פנקס כתובות חדש", "Save" => "שמירה", -"Submit" => "ביצוע", "Cancel" => "ביטול" ); diff --git a/apps/contacts/l10n/hr.php b/apps/contacts/l10n/hr.php index d381bf4fa90..769a6ced0fd 100644 --- a/apps/contacts/l10n/hr.php +++ b/apps/contacts/l10n/hr.php @@ -1,38 +1,69 @@ <?php $TRANSLATIONS = array( +"Error (de)activating addressbook." => "Pogreška pri (de)aktivaciji adresara.", +"id is not set." => "id nije postavljen.", +"Cannot update addressbook with an empty name." => "Ne mogu ažurirati adresar sa praznim nazivom.", +"Error updating addressbook." => "Pogreška pri ažuriranju adresara.", +"No ID provided" => "Nema dodijeljenog ID identifikatora", +"Error setting checksum." => "Pogreška pri postavljanju checksuma.", +"No categories selected for deletion." => "Niti jedna kategorija nije odabrana za brisanje.", +"No address books found." => "Nema adresara.", +"No contacts found." => "Nema kontakata.", +"There was an error adding the contact." => "Dogodila se pogreška prilikom dodavanja kontakta.", +"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: " => "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.", +"Error reading contact photo." => "Pogreška pri čitanju kontakt fotografije.", +"Error saving temporary file." => "Pogreška pri spremanju privremene datoteke.", +"The loading photo is not valid." => "Fotografija nije valjana.", +"Contact ID is missing." => "ID kontakta nije dostupan.", +"No photo path was submitted." => "Putanja do fotografije nije podnešena.", "File doesn't exist:" => "Datoteka ne postoji:", +"Error loading image." => "Pogreška pri učitavanju slike.", +"Error uploading contacts to storage." => "Pogreška pri slanju kontakata.", +"There is no error, the file uploaded with success" => "Nema pogreške, datoteka je poslana uspješno.", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Veličina poslane datoteke prelazi veličinu prikazanu u upload_max_filesize direktivi u konfiguracijskoj datoteci php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Poslana datoteka prelazi veličinu prikazanu u MAX_FILE_SIZE direktivi u HTML formi", +"The uploaded file was only partially uploaded" => "Poslana datoteka je parcijalno poslana", +"No file was uploaded" => "Datoteka nije poslana", +"Missing a temporary folder" => "Nedostaje privremeni direktorij", "Contacts" => "Kontakti", "This is not your addressbook." => "Ovo nije vaš adresar.", "Contact could not be found." => "Kontakt ne postoji.", -"Address" => "Adresa", -"Telephone" => "Telefon", -"Email" => "E-mail", -"Organization" => "Organizacija", "Work" => "Posao", "Home" => "Kuća", "Mobile" => "Mobitel", "Text" => "Tekst", "Voice" => "Glasovno", +"Message" => "Poruka", "Fax" => "Fax", "Video" => "Video", "Pager" => "Pager", +"Internet" => "Internet", +"Birthday" => "Rođendan", +"{name}'s Birthday" => "{name} Rođendan", "Contact" => "Kontakt", "Add Contact" => "Dodaj kontakt", +"Import" => "Uvezi", "Addressbooks" => "Adresari", -"New Address Book" => "Novi adresar", -"CardDav Link" => "CardDav poveznica", -"Download" => "Preuzimanje", -"Edit" => "Uredi", -"Delete" => "Obriši", -"Download contact" => "Preuzmi kontakt", -"Delete contact" => "Izbriši kontakt", +"Drop photo to upload" => "Dovucite fotografiju za slanje", +"Edit current photo" => "Uredi trenutnu sliku", "Edit name details" => "Uredi detalje imena", +"Organization" => "Organizacija", +"Delete" => "Obriši", "Nickname" => "Nadimak", "Enter nickname" => "Unesi nadimank", -"Birthday" => "Rođendan", "dd-mm-yyyy" => "dd-mm-yyyy", "Groups" => "Grupe", "Edit groups" => "Uredi grupe", +"Preferred" => "Preferirano", "Enter email address" => "Unesi email adresu", "Enter phone number" => "Unesi broj telefona", "View on map" => "Prikaži na karti", @@ -40,24 +71,23 @@ "Add notes here." => "Dodaj bilješke ovdje.", "Add field" => "Dodaj polje", "Phone" => "Telefon", +"Email" => "E-mail", +"Address" => "Adresa", "Note" => "Bilješka", -"Edit current photo" => "Uredi trenutnu sliku", +"Download contact" => "Preuzmi kontakt", +"Delete contact" => "Izbriši kontakt", "Edit address" => "Uredi adresu", "Type" => "Tip", "PO Box" => "Poštanski Pretinac", "Extended" => "Prošireno", -"Street" => "Ulica", "City" => "Grad", "Region" => "Regija", "Zipcode" => "Poštanski broj", "Country" => "Država", -"Edit categories" => "Uredi kategorije", -"Add" => "Dodaj", "Addressbook" => "Adresar", -"New Addressbook" => "Novi adresar", -"Edit Addressbook" => "Uredi adresar", +"Download" => "Preuzimanje", +"Edit" => "Uredi", +"New Address Book" => "Novi adresar", "Save" => "Spremi", -"Submit" => "Pošalji", -"Cancel" => "Prekini", -"Import" => "Uvezi" +"Cancel" => "Prekini" ); diff --git a/apps/contacts/l10n/hu_HU.php b/apps/contacts/l10n/hu_HU.php index 68f7b2607eb..4febe9c29f2 100644 --- a/apps/contacts/l10n/hu_HU.php +++ b/apps/contacts/l10n/hu_HU.php @@ -1,39 +1,39 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "Címlista (de)aktiválása sikertelen", -"There was an error adding the contact." => "Hiba a kapcsolat hozzáadásakor", -"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: ", -"Error adding contact property." => "Hiba a kapcsolat-tulajdonság hozzáadásakor", +"id is not set." => "ID nincs beállítva", +"Cannot update addressbook with an empty name." => "Üres névvel nem frissíthető a címlista", +"Error updating addressbook." => "Hiba a címlista frissítésekor", "No ID provided" => "Nincs ID megadva", "Error setting checksum." => "Hiba az ellenőrzőösszeg beállításakor", "No categories selected for deletion." => "Nincs kiválasztva törlendő kategória", "No address books found." => "Nem található címlista", "No contacts found." => "Nem található kontakt", +"There was an error adding the contact." => "Hiba a kapcsolat hozzáadásakor", +"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: \"", -"Cannot add addressbook with an empty name." => "Nem adható hozzá névtelen címlista", -"Error adding addressbook." => "Hiba a címlista hozzáadásakor", -"Error activating addressbook." => "Címlista aktiválása sikertelen", +"checksum is not set." => "az ellenőrzőösszeg nincs beállítva", +"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", "Error reading contact photo." => "A kontakt képének beolvasása sikertelen", "Error saving temporary file." => "Ideiglenes fájl mentése sikertelen", "The loading photo is not valid." => "A kép érvénytelen", -"id is not set." => "ID 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.", -"Error deleting contact property." => "Hiba a kapcsolat-tulajdonság törlésekor", "Contact ID is missing." => "Hiányzik a kapcsolat ID", -"Missing contact id." => "Hiányzik a kontakt ID", "No photo path was submitted." => "Nincs fénykép-útvonal megadva", "File doesn't exist:" => "A fájl nem létezik:", "Error loading image." => "Kép betöltése sikertelen", -"element name is not set." => "az elem neve nincs beállítva", -"checksum is not set." => "az ellenőrzőösszeg nincs beállítva", -"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.", -"Error updating contact property." => "Hiba a kapcsolat-tulajdonság frissítésekor", -"Cannot update addressbook with an empty name." => "Üres névvel nem frissíthető a címlista", -"Error updating addressbook." => "Hiba a címlista frissítésekor", +"Error getting contact object." => "A kontakt-objektum feldolgozása sikertelen", +"Error getting PHOTO property." => "A PHOTO-tulajdonság feldolgozása sikertelen", +"Error saving contact." => "A kontakt mentése sikertelen", +"Error resizing image" => "Képméretezés sikertelen", +"Error cropping image" => "Képvágás sikertelen", +"Error creating temporary image" => "Ideiglenes kép létrehozása sikertelen", +"Error finding image: " => "A kép nem található", "Error uploading contacts to storage." => "Hiba a kapcsolatok feltöltésekor", "There is no error, the file uploaded with success" => "Nincs hiba, a fájl sikeresen feltöltődött", "The uploaded file exceeds the upload_max_filesize directive in php.ini" => "A feltöltött fájl mérete meghaladja az upload_max_filesize értéket a php.ini-ben", @@ -41,15 +41,26 @@ "The uploaded file was only partially uploaded" => "A fájl csak részlegesen lett feltöltve", "No file was uploaded" => "Nincs feltöltött fájl", "Missing a temporary folder" => "Hiányzik az ideiglenes könyvtár", +"Couldn't save temporary image: " => "Ideiglenes kép létrehozása sikertelen", +"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", -"Drop a VCF file to import contacts." => "Húzza ide a VCF fájlt a kapcsolatok importálásához", -"Addressbook not found." => "Címlista nem található", +"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", +"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", +"Select type" => "Típus kiválasztása", +"Result: " => "Eredmény: ", +" imported, " => " beimportálva, ", +" failed." => " sikertelen", "This is not your addressbook." => "Ez nem a te címjegyzéked.", "Contact could not be found." => "Kapcsolat nem található.", -"Address" => "Cím", -"Telephone" => "Telefonszám", -"Email" => "E-mail", -"Organization" => "Szervezet", "Work" => "Munkahelyi", "Home" => "Otthoni", "Mobile" => "Mobiltelefonszám", @@ -60,25 +71,24 @@ "Video" => "Video", "Pager" => "Személyhívó", "Internet" => "Internet", +"Birthday" => "Születésnap", "{name}'s Birthday" => "{name} születésnapja", "Contact" => "Kapcsolat", "Add Contact" => "Kapcsolat hozzáadása", +"Import" => "Import", "Addressbooks" => "Címlisták", -"Configure Address Books" => "Címlisták beállítása", -"New Address Book" => "Új címlista", -"Import from VCF" => "Importálás VCF-ből", -"CardDav Link" => "CardDav hivatkozás", -"Download" => "Letöltés", -"Edit" => "Szerkesztés", -"Delete" => "Törlés", -"Download contact" => "Kapcsolat letöltése", -"Delete contact" => "Kapcsolat törlése", +"Close" => "Bezár", "Drop photo to upload" => "Húzza ide a feltöltendő képet", +"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", "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", +"Organization" => "Szervezet", +"Delete" => "Törlés", "Nickname" => "Becenév", "Enter nickname" => "Becenév megadása", -"Birthday" => "Születésnap", "dd-mm-yyyy" => "yyyy-mm-dd", "Groups" => "Csoportok", "Separate groups with commas" => "Vesszővel válassza el a csoportokat", @@ -94,24 +104,21 @@ "Edit address details" => "Cím részleteinek szerkesztése", "Add notes here." => "Megjegyzések", "Add field" => "Mező hozzáadása", -"Profile picture" => "Profilkép", "Phone" => "Telefonszám", +"Email" => "E-mail", +"Address" => "Cím", "Note" => "Jegyzet", -"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", +"Download contact" => "Kapcsolat letöltése", +"Delete contact" => "Kapcsolat törlése", +"The temporary image has been removed from cache." => "Az ideiglenes kép el lett távolítva a gyorsítótárból", "Edit address" => "Cím szerkesztése", "Type" => "Típus", "PO Box" => "Postafiók", "Extended" => "Kiterjesztett", -"Street" => "Utca", "City" => "Város", "Region" => "Megye", "Zipcode" => "Irányítószám", "Country" => "Ország", -"Edit categories" => "Kategóriák szerkesztése", -"Add" => "Hozzáad", "Addressbook" => "Címlista", "Hon. prefixes" => "Előtag", "Miss" => "Miss", @@ -132,26 +139,20 @@ "Esq." => "Esq.", "Jr." => "Ifj.", "Sn." => "Id.", -"New Addressbook" => "Új Címlista", -"Edit Addressbook" => "Címlista szerkesztése", -"Displayname" => "Megjelenített név", -"Active" => "Aktív", -"Save" => "Mentés", -"Submit" => "Elküld", -"Cancel" => "Mégsem", "Import a contacts file" => "Kapcsolat-fájl importálása", "Please choose the addressbook" => "Válassza ki a címlistát", "create a new addressbook" => "Címlista létrehozása", "Name of new addressbook" => "Új címlista neve", -"Import" => "Import", "Importing contacts" => "Kapcsolatok importálása", -"Select address book to import to:" => "Melyik címlistába történjen az importálás:", -"Select from HD" => "Kiválasztás merevlemezről", "You have no contacts in your addressbook." => "Nincsenek kapcsolatok a címlistában", "Add contact" => "Kapcsolat hozzáadása", -"Configure addressbooks" => "Címlisták beállítása", "CardDAV syncing addresses" => "CardDAV szinkronizációs címek", "more info" => "további információ", "Primary address (Kontact et al)" => "Elsődleges cím", -"iOS/OS X" => "iOS/OS X" +"iOS/OS X" => "iOS/OS X", +"Download" => "Letöltés", +"Edit" => "Szerkesztés", +"New Address Book" => "Új címlista", +"Save" => "Mentés", +"Cancel" => "Mégsem" ); diff --git a/apps/contacts/l10n/ia.php b/apps/contacts/l10n/ia.php index f420b48d842..4d455f7c976 100644 --- a/apps/contacts/l10n/ia.php +++ b/apps/contacts/l10n/ia.php @@ -1,21 +1,14 @@ <?php $TRANSLATIONS = array( -"Cannot add empty property." => "Non pote adder proprietate vacue.", "No address books found." => "Nulle adressario trovate", "No contacts found." => "Nulle contactos trovate.", -"Error adding addressbook." => "Error durante que il addeva le adressario.", -"Error activating addressbook." => "Error in activar adressario", +"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.", "No file was uploaded" => "Nulle file esseva incargate.", "Missing a temporary folder" => "Manca un dossier temporari", "Contacts" => "Contactos", -"Addressbook not found." => "Adressario non trovate.", "This is not your addressbook." => "Iste non es tu libro de adresses", "Contact could not be found." => "Contacto non poterea esser legite", -"Address" => "Adresse", -"Telephone" => "Telephono", -"Email" => "E-posta", -"Organization" => "Organisation", "Work" => "Travalio", "Home" => "Domo", "Mobile" => "Mobile", @@ -26,19 +19,19 @@ "Video" => "Video", "Pager" => "Pager", "Internet" => "Internet", +"Birthday" => "Anniversario", "Contact" => "Contacto", "Add Contact" => "Adder contacto", +"Import" => "Importar", "Addressbooks" => "Adressarios", -"New Address Book" => "Nove adressario", -"CardDav Link" => "Ligamine CardDav", -"Download" => "Discargar", -"Edit" => "Modificar", +"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", "Delete" => "Deler", -"Download contact" => "Discargar contacto", -"Delete contact" => "Deler contacto", "Nickname" => "Pseudonymo", "Enter nickname" => "Inserer pseudonymo", -"Birthday" => "Anniversario", "Groups" => "Gruppos", "Edit groups" => "Modificar gruppos", "Preferred" => "Preferite", @@ -49,24 +42,20 @@ "View on map" => "Vider in un carta", "Add notes here." => "Adder notas hic", "Add field" => "Adder campo", -"Profile picture" => "Imagine de profilo", "Phone" => "Phono", +"Email" => "E-posta", +"Address" => "Adresse", "Note" => "Nota", -"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", +"Download contact" => "Discargar contacto", +"Delete contact" => "Deler contacto", "Edit address" => "Modificar adresses", "Type" => "Typo", "PO Box" => "Cassa postal", "Extended" => "Extendite", -"Street" => "Strata", "City" => "Citate", "Region" => "Region", "Zipcode" => "Codice postal", "Country" => "Pais", -"Edit categories" => "Modificar categorias", -"Add" => "Adder", "Addressbook" => "Adressario", "Hon. prefixes" => "Prefixos honorific", "Miss" => "Senioretta", @@ -77,18 +66,20 @@ "Additional names" => "Nomines additional", "Family name" => "Nomine de familia", "Hon. suffixes" => "Suffixos honorific", -"New Addressbook" => "Nove adressario", -"Edit Addressbook" => "Modificar adressario", -"Active" => "Active", -"Save" => "Salveguardar", -"Submit" => "Submitter", -"Cancel" => "Cancellar", "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:", "Import" => "Importar", +"Contacts imported successfully" => "Contactos importate con successo.", +"Close Dialog" => "Clauder dialogo", +"Import Addressbook" => "Importar adressario.", "Add contact" => "Adder adressario", "more info" => "plus info", -"iOS/OS X" => "iOS/OS X" +"iOS/OS X" => "iOS/OS X", +"Download" => "Discargar", +"Edit" => "Modificar", +"New Address Book" => "Nove adressario", +"Save" => "Salveguardar", +"Cancel" => "Cancellar" ); diff --git a/apps/contacts/l10n/it.php b/apps/contacts/l10n/it.php index 2a5478e6c4b..8302bfffdca 100644 --- a/apps/contacts/l10n/it.php +++ b/apps/contacts/l10n/it.php @@ -1,39 +1,42 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "Errore nel (dis)attivare la rubrica.", -"There was an error adding the contact." => "Si è verificato un errore nell'aggiunta del contatto.", -"Cannot add empty property." => "Impossibile aggiungere una proprietà vuota.", -"At least one of the address fields has to be filled out." => "Deve essere riempito almeno un indirizzo.", -"Trying to add duplicate property: " => "P", -"Error adding contact property." => "Errore durante l'aggiunta della proprietà del contatto.", +"id is not set." => "ID non impostato.", +"Cannot update addressbook with an empty name." => "Impossibile aggiornare una rubrica senza nome.", +"Error updating addressbook." => "Errore durante l'aggiornamento della rubrica.", "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.", +"There was an error adding the contact." => "Si è verificato un errore nell'aggiunta del contatto.", +"element name is not set." => "il nome dell'elemento non è impostato.", +"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: \"", -"Cannot add addressbook with an empty name." => "Impossibile aggiungere una rubrica senza nome.", -"Error adding addressbook." => "Errore durante l'aggiunta della rubrica.", -"Error activating addressbook." => "Errore durante l'attivazione della rubrica.", +"checksum is not set." => "il codice di controllo non è impostato.", +"Information about vCard is incorrect. Please reload the page: " => "Le informazioni della vCard non sono corrette. Ricarica la pagina: ", +"Something went FUBAR. " => "Qualcosa è andato storto. ", "No contact ID was submitted." => "Nessun ID di contatto inviato.", "Error reading contact photo." => "Errore di lettura della foto del contatto.", "Error saving temporary file." => "Errore di salvataggio del file temporaneo.", "The loading photo is not valid." => "La foto caricata non è valida.", -"id is not set." => "ID non impostato.", -"Information about vCard is incorrect. Please reload the page." => "Informazioni sulla vCard non corrette. Ricarica la pagina.", -"Error deleting contact property." => "Errore durante l'eliminazione della proprietà del contatto.", "Contact ID is missing." => "Manca l'ID del contatto.", -"Missing contact id." => "ID di contatto mancante.", "No photo path was submitted." => "Non è stato inviato alcun percorso a una foto.", "File doesn't exist:" => "Il file non esiste:", "Error loading image." => "Errore di caricamento immagine.", -"element name is not set." => "il nome dell'elemento non è impostato.", -"checksum is not set." => "il codice di controllo non è impostato.", -"Information about vCard is incorrect. Please reload the page: " => "Le informazioni della vCard non sono corrette. Ricarica la pagina: ", -"Something went FUBAR. " => "Qualcosa è andato storto. ", -"Error updating contact property." => "Errore durante l'aggiornamento della proprietà del contatto.", -"Cannot update addressbook with an empty name." => "Impossibile aggiornare una rubrica senza nome.", -"Error updating addressbook." => "Errore durante l'aggiornamento della rubrica.", +"Error getting contact object." => "Errore di recupero dell'oggetto contatto.", +"Error getting PHOTO property." => "Errore di recupero della proprietà FOTO.", +"Error saving contact." => "Errore di salvataggio del contatto.", +"Error resizing image" => "Errore di ridimensionamento dell'immagine", +"Error cropping image" => "Errore di ritaglio dell'immagine", +"Error creating temporary image" => "Errore durante la creazione dell'immagine temporanea", +"Error finding image: " => "Errore durante la ricerca dell'immagine: ", "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", @@ -41,17 +44,46 @@ "The uploaded file was only partially uploaded" => "Il file è stato inviato solo parzialmente", "No file was uploaded" => "Nessun file è stato inviato", "Missing a temporary folder" => "Manca una cartella temporanea", +"Couldn't save temporary image: " => "Impossibile salvare l'immagine temporanea: ", +"Couldn't load temporary image: " => "Impossibile caricare l'immagine temporanea: ", +"No file was uploaded. Unknown error" => "Nessun file è stato inviato. Errore sconosciuto", "Contacts" => "Contatti", -"Drop a VCF file to import contacts." => "Rilascia un file VCF per importare i contatti.", -"Addressbook not found." => "Rubrica non trovata.", +"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", +"This property has to be non-empty." => "Questa proprietà non può essere vuota.", +"Couldn't serialize elements." => "Impossibile serializzare gli elementi.", +"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' invocata senza l'argomento di tipo. Segnalalo a bugs.owncloud.org", +"Edit name" => "Modifica il nome", +"No files selected for upload." => "Nessun file selezionato per l'invio", +"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Il file che stai cercando di inviare supera la dimensione massima per l'invio dei file su questo server.", +"Error loading profile picture." => "Errore durante il caricamento dell'immagine di profilo.", +"Select type" => "Seleziona il tipo", +"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?", +"Result: " => "Risultato: ", +" imported, " => " importato, ", +" failed." => " non riuscito.", +"Displayname cannot be empty." => "Il nome visualizzato non può essere vuoto.", +"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.", -"Address" => "Indirizzo", -"Telephone" => "Telefono", -"Email" => "Email", -"Organization" => "Organizzazione", +"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" => "Lavoro", "Home" => "Casa", +"Other" => "Altro", "Mobile" => "Cellulare", "Text" => "Testo", "Voice" => "Voce", @@ -60,25 +92,52 @@ "Video" => "Video", "Pager" => "Cercapersone", "Internet" => "Internet", +"Birthday" => "Compleanno", +"Business" => "Lavoro", +"Call" => "Chiama", +"Clients" => "Client", +"Deliverer" => "Corriere", +"Holidays" => "Festività", +"Ideas" => "Idee", +"Journey" => "Viaggio", +"Jubilee" => "Anniversario", +"Meeting" => "Riunione", +"Personal" => "Personale", +"Projects" => "Progetti", +"Questions" => "Domande", "{name}'s Birthday" => "Data di nascita di {name}", "Contact" => "Contatto", "Add Contact" => "Aggiungi contatto", +"Import" => "Importa", +"Settings" => "Impostazioni", "Addressbooks" => "Rubriche", -"Configure Address Books" => "Configura rubrica", -"New Address Book" => "Nuova rubrica", -"Import from VCF" => "Importa da VCF", -"CardDav Link" => "Link CardDav", -"Download" => "Scarica", -"Edit" => "Modifica", -"Delete" => "Elimina", -"Download contact" => "Scarica contatto", -"Delete contact" => "Elimina contatto", +"Close" => "Chiudi", +"Keyboard shortcuts" => "Scorciatoie da tastiera", +"Navigation" => "Navigazione", +"Next contact in list" => "Contatto successivo in elenco", +"Previous contact in list" => "Contatto precedente in elenco", +"Expand/collapse current addressbook" => "Espandi/Contrai la rubrica corrente", +"Next addressbook" => "Rubrica successiva", +"Previous addressbook" => "Rubrica precedente", +"Actions" => "Azioni", +"Refresh contacts list" => "Aggiorna l'elenco dei contatti", +"Add new contact" => "Aggiungi un nuovo contatto", +"Add new addressbook" => "Aggiungi una nuova rubrica", +"Delete current contact" => "Elimina il contatto corrente", "Drop photo to upload" => "Rilascia una foto da inviare", +"Delete current photo" => "Elimina la foto corrente", +"Edit current photo" => "Modifica la foto corrente", +"Upload new photo" => "Invia una nuova foto", +"Select photo from ownCloud" => "Seleziona la foto da ownCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formato personalizzato, nome breve, nome completo, invertito o invertito con virgola", "Edit name details" => "Modifica dettagli del nome", +"Organization" => "Organizzazione", +"Delete" => "Elimina", "Nickname" => "Pseudonimo", "Enter nickname" => "Inserisci pseudonimo", -"Birthday" => "Compleanno", +"Web site" => "Sito web", +"http://www.somesite.com" => "http://www.somesite.com", +"Go to web site" => "Vai al sito web", "dd-mm-yyyy" => "gg-mm-aaaa", "Groups" => "Gruppi", "Separate groups with commas" => "Separa i gruppi con virgole", @@ -90,28 +149,33 @@ "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", -"Profile picture" => "Immagine del profilo", "Phone" => "Telefono", +"Email" => "Email", +"Instant Messaging" => "Messaggistica istantanea", +"Address" => "Indirizzo", "Note" => "Nota", -"Delete current photo" => "Elimina la foto corrente", -"Edit current photo" => "Modifica la foto corrente", -"Upload new photo" => "Invia una nuova foto", -"Select photo from ownCloud" => "Seleziona la foto da ownCloud", +"Download contact" => "Scarica contatto", +"Delete contact" => "Elimina contatto", +"The temporary image has been removed from cache." => "L'immagine temporanea è stata rimossa dalla cache.", "Edit address" => "Modifica indirizzo", "Type" => "Tipo", "PO Box" => "Casella postale", +"Street address" => "Indirizzo", +"Street and number" => "Via e numero", "Extended" => "Esteso", -"Street" => "Via", +"Apartment number etc." => "Numero appartamento ecc.", "City" => "Città", "Region" => "Regione", +"E.g. state or province" => "Ad es. stato o provincia", "Zipcode" => "CAP", +"Postal code" => "CAP", "Country" => "Stato", -"Edit categories" => "Modifica categorie", -"Add" => "Aggiungi", "Addressbook" => "Rubrica", "Hon. prefixes" => "Prefissi onorifici", "Miss" => "Sig.na", @@ -132,26 +196,35 @@ "Esq." => "Esq.", "Jr." => "Jr.", "Sn." => "Sn.", -"New Addressbook" => "Nuova rubrica", -"Edit Addressbook" => "Modifica rubrica", -"Displayname" => "Nome visualizzato", -"Active" => "Attiva", -"Save" => "Salva", -"Submit" => "Invia", -"Cancel" => "Annulla", "Import a contacts file" => "Importa un file di contatti", "Please choose the addressbook" => "Scegli la rubrica", "create a new addressbook" => "crea una nuova rubrica", "Name of new addressbook" => "Nome della nuova rubrica", -"Import" => "Importa", "Importing contacts" => "Importazione contatti", +"Contacts imported successfully" => "Contatti importati correttamente", +"Close Dialog" => "Chiudi finestra", +"Import Addressbook" => "Importa rubrica", "Select address book to import to:" => "Seleziona la rubrica di destinazione:", +"Drop a VCF file to import contacts." => "Rilascia un file VCF per importare i contatti.", "Select from HD" => "Seleziona da disco", "You have no contacts in your addressbook." => "Non hai contatti nella rubrica.", "Add contact" => "Aggiungi contatto", -"Configure addressbooks" => "Configura rubriche", +"Select Address Books" => "Seleziona rubriche", +"Enter name" => "Inserisci il nome", +"Enter description" => "Inserisci una descrizione", "CardDAV syncing addresses" => "Indirizzi di sincronizzazione CardDAV", "more info" => "altre informazioni", "Primary address (Kontact et al)" => "Indirizzo principale (Kontact e altri)", -"iOS/OS X" => "iOS/OS X" +"iOS/OS X" => "iOS/OS X", +"Show CardDav link" => "Mostra collegamento CardDav", +"Show read-only VCF link" => "Mostra collegamento VCF in sola lettura", +"Share" => "Condividi", +"Download" => "Scarica", +"Edit" => "Modifica", +"New Address Book" => "Nuova rubrica", +"Name" => "Nome", +"Description" => "Descrizione", +"Save" => "Salva", +"Cancel" => "Annulla", +"More..." => "Altro..." ); diff --git a/apps/contacts/l10n/ja_JP.php b/apps/contacts/l10n/ja_JP.php index d98e58f94da..8a6cce37cc6 100644 --- a/apps/contacts/l10n/ja_JP.php +++ b/apps/contacts/l10n/ja_JP.php @@ -1,36 +1,42 @@ <?php $TRANSLATIONS = array( -"Error (de)activating addressbook." => "アドレスブックの有効/無効化に失敗しました。", -"There was an error adding the contact." => "連絡先の追加でエラーが発生しました。", -"Cannot add empty property." => "項目の新規追加に失敗しました。", -"At least one of the address fields has to be filled out." => "住所の項目のうち1つは入力して下さい。", -"Error adding contact property." => "連絡先の追加に失敗しました。", +"Error (de)activating addressbook." => "アドレス帳の有効/無効化に失敗しました。", +"id is not set." => "idが設定されていません。", +"Cannot update addressbook with an empty name." => "空白の名前でアドレス帳を更新することはできません。", +"Error updating addressbook." => "アドレス帳の更新に失敗しました。", "No ID provided" => "IDが提供されていません", "Error setting checksum." => "チェックサムの設定エラー。", "No categories selected for deletion." => "削除するカテゴリが選択されていません。", -"No address books found." => "アドレスブックが見つかりません。", +"No address books found." => "アドレス帳が見つかりません。", "No contacts found." => "連絡先が見つかりません。", +"There was an error adding the contact." => "連絡先の追加でエラーが発生しました。", +"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の抽出エラー: \"", -"Cannot add addressbook with an empty name." => "名前を空白にしたままでアドレスブックを追加することはできません。", -"Error adding addressbook." => "アドレスブックの追加に失敗しました。", -"Error activating addressbook." => "アドレスブックの有効化に失敗しました。", +"checksum is not set." => "チェックサムが設定されていません。", +"Information about vCard is incorrect. Please reload the page: " => "vCardの情報が正しくありません。ページを再読み込みしてください: ", +"Something went FUBAR. " => "何かがFUBARへ移動しました。", "No contact ID was submitted." => "連絡先IDは登録されませんでした。", "Error reading contact photo." => "連絡先写真の読み込みエラー。", "Error saving temporary file." => "一時ファイルの保存エラー。", "The loading photo is not valid." => "写真の読み込みは無効です。", -"id is not set." => "idが設定されていません。", -"Information about vCard is incorrect. Please reload the page." => "vCardの情報に誤りがあります。ページをリロードして下さい。", -"Error deleting contact property." => "連絡先の削除に失敗しました。", "Contact ID is missing." => "コンタクトIDが見つかりません。", -"Missing contact id." => "コンタクトIDが設定されていません。", "No photo path was submitted." => "写真のパスが登録されていません。", "File doesn't exist:" => "ファイルが存在しません:", "Error loading image." => "画像の読み込みエラー。", -"element name is not set." => "要素名が設定されていません。", -"checksum is not set." => "チェックサムが設定されていません。", -"Information about vCard is incorrect. Please reload the page: " => "vCardの情報が正しくありません。ページを再読み込みしてください: ", -"Error updating contact property." => "連絡先の更新に失敗しました。", -"Cannot update addressbook with an empty name." => "空白の名前でアドレスブックを更新することはできません。", -"Error updating addressbook." => "アドレスブックの更新に失敗しました。", +"Error getting contact object." => "コンタクトオブジェクトの取得エラー。", +"Error getting PHOTO property." => "写真属性の取得エラー。", +"Error saving contact." => "コンタクトの保存エラー。", +"Error resizing image" => "画像のリサイズエラー", +"Error cropping image" => "画像の切り抜きエラー", +"Error creating temporary image" => "一時画像の生成エラー", +"Error finding image: " => "画像検索エラー: ", "Error uploading contacts to storage." => "ストレージへの連絡先のアップロードエラー。", "There is no error, the file uploaded with success" => "エラーはありません。ファイルのアップロードは成功しました", "The uploaded file exceeds the upload_max_filesize directive in php.ini" => "アップロードファイルは php.ini 内の upload_max_filesize の制限を超えています", @@ -38,17 +44,46 @@ "The uploaded file was only partially uploaded" => "アップロードファイルは一部分だけアップロードされました", "No file was uploaded" => "ファイルはアップロードされませんでした", "Missing a temporary folder" => "一時保存フォルダが見つかりません", +"Couldn't save temporary image: " => "一時的な画像の保存ができませんでした: ", +"Couldn't load temporary image: " => "一時的な画像の読み込みができませんでした: ", +"No file was uploaded. Unknown error" => "ファイルは何もアップロードされていません。不明なエラー", "Contacts" => "連絡先", -"Drop a VCF file to import contacts." => "連絡先をインポートするVCFファイルをドロップしてください。", -"Addressbook not found." => "アドレスブックが見つかりませんでした。", +"Sorry, this functionality has not been implemented yet" => "申し訳ありません。この機能はまだ実装されていません", +"Not implemented" => "未実装", +"Couldn't get a valid address." => "有効なアドレスを取得できませんでした。", +"Error" => "エラー", +"This property has to be non-empty." => "この属性は空にできません。", +"Couldn't serialize elements." => "要素をシリアライズできませんでした。", +"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' は型の引数無しで呼び出されました。bugs.owncloud.org へ報告してください。", +"Edit name" => "名前を編集", +"No files selected for upload." => "アップロードするファイルが選択されていません。", +"The file you are trying to upload exceed the maximum size for file uploads on this server." => "アップロードしようとしているファイルは、このサーバの最大ファイルアップロードサイズを超えています。", +"Error loading profile picture." => "プロファイルの画像の読み込みエラー", +"Select type" => "タイプを選択", +"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "いくつかのコンタクトが削除とマークされていますが、まだ削除されていません。削除するまでお待ちください。", +"Do you want to merge these address books?" => "これらのアドレス帳をマージしてもよろしいですか?", +"Result: " => "結果: ", +" imported, " => " をインポート、 ", +" failed." => " は失敗しました。", +"Displayname cannot be empty." => "表示名は空にできません。", +"Addressbook not found: " => "アドレス帳が見つかりません:", "This is not your addressbook." => "これはあなたの電話帳ではありません。", "Contact could not be found." => "連絡先を見つける事ができません。", -"Address" => "住所", -"Telephone" => "電話番号", -"Email" => "メールアドレス", -"Organization" => "所属", +"Jabber" => "Jabber", +"AIM" => "AIM", +"MSN" => "MSN", +"Twitter" => "Twitter", +"GoogleTalk" => "Googleトーク", +"Facebook" => "Facebook", +"XMPP" => "XMPP", +"ICQ" => "ICQ", +"Yahoo" => "Yahoo", +"Skype" => "Skype", +"QQ" => "QQ", +"GaduGadu" => "GaduGadu", "Work" => "勤務先", "Home" => "住居", +"Other" => "その他", "Mobile" => "携帯電話", "Text" => "TTY TDD", "Voice" => "音声番号", @@ -57,58 +92,92 @@ "Video" => "テレビ電話", "Pager" => "ポケベル", "Internet" => "インターネット", +"Birthday" => "誕生日", +"Business" => "ビジネス", +"Call" => "電話", +"Clients" => "顧客", +"Deliverer" => "運送会社", +"Holidays" => "休日", +"Ideas" => "アイデア", +"Journey" => "旅行", +"Jubilee" => "記念祭", +"Meeting" => "打ち合わせ", +"Personal" => "個人", +"Projects" => "プロジェクト", +"Questions" => "質問", "{name}'s Birthday" => "{name}の誕生日", "Contact" => "連絡先", "Add Contact" => "連絡先の追加", -"Addressbooks" => "電話帳", -"Configure Address Books" => "アドレスブックを設定", -"New Address Book" => "新規電話帳", -"Import from VCF" => "VCFからインポート", -"CardDav Link" => "CardDAVリンク", -"Download" => "ダウンロード", -"Edit" => "編集", -"Delete" => "削除", -"Download contact" => "連絡先のダウンロード", -"Delete contact" => "連絡先の削除", +"Import" => "インポート", +"Settings" => "設定", +"Addressbooks" => "アドレス帳", +"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" => "現在のコンタクトを削除", "Drop photo to upload" => "写真をドロップしてアップロード", +"Delete current photo" => "現在の写真を削除", +"Edit current photo" => "現在の写真を編集", +"Upload new photo" => "新しい写真をアップロード", +"Select photo from ownCloud" => "ownCloudから写真を選択", +"Format custom, Short name, Full name, Reverse or Reverse with comma" => "編集フォーマット、ショートネーム、フルネーム、逆順、カンマ区切りの逆順", "Edit name details" => "名前の詳細を編集", +"Organization" => "所属", +"Delete" => "削除", "Nickname" => "ニックネーム", "Enter nickname" => "ニックネームを入力", -"Birthday" => "誕生日", +"Web site" => "ウェブサイト", +"http://www.somesite.com" => "http://www.somesite.com", +"Go to web site" => "Webサイトへ移動", "dd-mm-yyyy" => "yyyy-mm-dd", "Groups" => "グループ", "Separate groups with commas" => "コンマでグループを分割", "Edit groups" => "グループを編集", "Preferred" => "推奨", -"Please specify a valid email address." => "連絡先を追加", +"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" => "項目を追加", -"Profile picture" => "プロフィール写真", "Phone" => "電話番号", +"Email" => "メールアドレス", +"Instant Messaging" => "インスタントメッセージ", +"Address" => "住所", "Note" => "メモ", -"Delete current photo" => "現在の写真を削除", -"Edit current photo" => "現在の写真を編集", -"Upload new photo" => "新しい写真をアップロード", -"Select photo from ownCloud" => "ownCloudから写真を選択", +"Download contact" => "連絡先のダウンロード", +"Delete contact" => "連絡先の削除", +"The temporary image has been removed from cache." => "一時画像はキャッシュから削除されました。", "Edit address" => "住所を編集", "Type" => "種類", "PO Box" => "私書箱", -"Extended" => "番地2", -"Street" => "番地1", +"Street address" => "住所1", +"Street and number" => "番地", +"Extended" => "住所2", +"Apartment number etc." => "アパート名等", "City" => "都市", "Region" => "都道府県", +"E.g. state or province" => "例:東京都、大阪府", "Zipcode" => "郵便番号", +"Postal code" => "郵便番号", "Country" => "国名", -"Edit categories" => "カテゴリを編集", -"Add" => "追加", -"Addressbook" => "アドレスブック", +"Addressbook" => "アドレス帳", +"Hon. prefixes" => "敬称", "Miss" => "Miss", "Ms" => "Ms", "Mr" => "Mr", @@ -118,7 +187,7 @@ "Given name" => "名", "Additional names" => "ミドルネーム", "Family name" => "姓", -"Hon. suffixes" => "ストレージへの連絡先のアップロードエラー。", +"Hon. suffixes" => "称号", "J.D." => "J.D.", "M.D." => "M.D.", "D.O." => "D.O.", @@ -127,26 +196,29 @@ "Esq." => "Esq.", "Jr." => "Jr.", "Sn." => "Sn.", -"New Addressbook" => "アドレスブックの新規作成", -"Edit Addressbook" => "アドレスブックを編集", -"Displayname" => "表示名", -"Active" => "アクティブ", -"Save" => "保存", -"Submit" => "送信", -"Cancel" => "取り消し", "Import a contacts file" => "コンタクトファイルをインポート", -"Please choose the addressbook" => "アドレスブックを選択してください", -"create a new addressbook" => "新しいアドレスブックを作成", +"Please choose the addressbook" => "アドレス帳を選択してください", +"create a new addressbook" => "新しいアドレス帳を作成", "Name of new addressbook" => "新しいアドレスブックの名前", -"Import" => "インポート", "Importing contacts" => "コンタクトをインポート", -"Select address book to import to:" => "インポートするアドレスブックを選択:", -"Select from HD" => "HDから選択", -"You have no contacts in your addressbook." => "アドレスブックに連絡先が登録されていません。", +"You have no contacts in your addressbook." => "アドレス帳に連絡先が登録されていません。", "Add contact" => "連絡先を追加", -"Configure addressbooks" => "アドレス帳を設定", +"Select Address Books" => "アドレス帳を選択してください", +"Enter name" => "名前を入力", +"Enter description" => "説明を入力してください", "CardDAV syncing addresses" => "CardDAV同期アドレス", "more info" => "詳細情報", "Primary address (Kontact et al)" => "プライマリアドレス(Kontact 他)", -"iOS/OS X" => "iOS/OS X" +"iOS/OS X" => "iOS/OS X", +"Show CardDav link" => "CarDavリンクを表示", +"Show read-only VCF link" => "読み取り専用のVCFリンクを表示", +"Share" => "共有", +"Download" => "ダウンロード", +"Edit" => "編集", +"New Address Book" => "新規のアドレス帳", +"Name" => "名前", +"Description" => "説明", +"Save" => "保存", +"Cancel" => "取り消し", +"More..." => "もっと..." ); diff --git a/apps/contacts/l10n/ko.php b/apps/contacts/l10n/ko.php index fcdc1d08c62..4349224f53c 100644 --- a/apps/contacts/l10n/ko.php +++ b/apps/contacts/l10n/ko.php @@ -1,41 +1,64 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "주소록을 (비)활성화하는 데 실패했습니다.", -"There was an error adding the contact." => "연락처를 추가하는 중 오류가 발생하였습니다.", -"Cannot add empty property." => "빈 속성을 추가할 수 없습니다.", -"At least one of the address fields has to be filled out." => "최소한 하나의 주소록 항목을 입력해야 합니다.", -"Error adding contact property." => "연락처 속성을 추가할 수 없습니다.", +"id is not set." => "아이디가 설정되어 있지 않습니다. ", +"Cannot update addressbook with an empty name." => "주소록에 이름란이 비어있으면 업데이트를 할 수 없습니다. ", +"Error updating addressbook." => "주소록을 업데이트할 수 없습니다.", "No ID provided" => "제공되는 아이디 없음", "Error setting checksum." => "오류 검사합계 설정", "No categories selected for deletion." => "삭제 카테고리를 선택하지 않았습니다. ", "No address books found." => "주소록을 찾을 수 없습니다.", "No contacts found." => "연락처를 찾을 수 없습니다.", +"There was an error adding the contact." => "연락처를 추가하는 중 오류가 발생하였습니다.", +"element name is not set." => "element 이름이 설정되지 않았습니다.", +"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" => "아이디 분실", -"Cannot add addressbook with an empty name." => "성명란이 비어 주소록에 추가 할 수 없습니다.", -"Error adding addressbook." => "주소록을 추가할 수 없습니다.", -"Error activating addressbook." => "주소록을 활성화할 수 없습니다.", +"Error parsing VCard for ID: \"" => "아이디에 대한 VCard 분석 오류", +"checksum is not set." => "체크섬이 설정되지 않았습니다.", +"Information about vCard is incorrect. Please reload the page: " => " vCard에 대한 정보가 잘못되었습니다. 페이지를 다시 로드하세요:", "No contact ID was submitted." => "접속 아이디가 기입되지 않았습니다.", "Error reading contact photo." => "사진 읽기 오류", "Error saving temporary file." => "임시 파일을 저장하는 동안 오류가 발생했습니다. ", "The loading photo is not valid." => "로딩 사진이 유효하지 않습니다. ", -"id is not set." => "아이디가 설정되어 있지 않습니다. ", -"Information about vCard is incorrect. Please reload the page." => "vCard 정보가 올바르지 않습니다. 페이지를 새로 고치십시오.", -"Error deleting contact property." => "연락처 속성을 삭제할 수 없습니다.", "Contact ID is missing." => "접속 아이디가 없습니다. ", -"Missing contact id." => "접속 아이디 분실", +"No photo path was submitted." => "사진 경로가 제출되지 않았습니다. ", "File doesn't exist:" => "파일이 존재하지 않습니다. ", "Error loading image." => "로딩 이미지 오류입니다.", -"Error updating contact property." => "연락처 속성을 업데이트할 수 없습니다.", -"Error updating addressbook." => "주소록을 업데이트할 수 없습니다.", +"Error getting contact object." => "연락처 개체를 가져오는 중 오류가 발생했습니다. ", +"Error getting PHOTO property." => "사진 속성을 가져오는 중 오류가 발생했습니다. ", +"Error saving contact." => "연락처 저장 중 오류가 발생했습니다.", +"Error resizing image" => "이미지 크기 조정 중 오류가 발생했습니다.", +"Error cropping image" => "이미지를 자르던 중 오류가 발생했습니다.", +"Error creating temporary image" => "임시 이미지를 생성 중 오류가 발생했습니다.", +"Error finding image: " => "이미지를 찾던 중 오류가 발생했습니다:", +"Error uploading contacts to storage." => "스토리지 에러 업로드 연락처.", +"There is no error, the file uploaded with success" => "오류없이 파일업로드 성공.", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "php.ini 형식으로 업로드 된 이 파일은 MAX_FILE_SIZE를 초과하였다.", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "HTML형식으로 업로드 된 이 파일은 MAX_FILE_SIZE를 초과하였다.", +"The uploaded file was only partially uploaded" => "이 업로드된 파일은 부분적으로만 업로드 되었습니다.", "No file was uploaded" => "파일이 업로드 되어있지 않습니다", "Missing a temporary folder" => "임시 폴더 분실", +"Couldn't save temporary image: " => "임시 이미지를 저장할 수 없습니다:", +"Couldn't load temporary image: " => "임시 이미지를 불러올 수 없습니다. ", +"No file was uploaded. Unknown error" => "파일이 업로드 되지 않았습니다. 알 수 없는 오류.", "Contacts" => "연락처", -"Addressbook not found." => "주소록을 찾을 수 없습니다.", +"Sorry, this functionality has not been implemented yet" => "죄송합니다. 이 기능은 아직 구현되지 않았습니다. ", +"Not implemented" => "구현되지 않음", +"Couldn't get a valid address." => "유효한 주소를 얻을 수 없습니다.", +"Error" => "오류", +"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." => "이 파일은 이 서버 파일 업로드 최대 용량을 초과 합니다. ", +"Select type" => "유형 선택", +"Result: " => "결과:", +" imported, " => "불러오기,", +" failed." => "실패.", "This is not your addressbook." => "내 주소록이 아닙니다.", "Contact could not be found." => "연락처를 찾을 수 없습니다.", -"Address" => "주소", -"Telephone" => "전화 번호", -"Email" => "전자 우편", -"Organization" => "조직", "Work" => "직장", "Home" => "자택", "Mobile" => "휴대폰", @@ -46,24 +69,24 @@ "Video" => "영상 번호", "Pager" => "호출기", "Internet" => "인터넷", +"Birthday" => "생일", "{name}'s Birthday" => "{이름}의 생일", "Contact" => "연락처", "Add Contact" => "연락처 추가", +"Import" => "입력", "Addressbooks" => "주소록", -"Configure Address Books" => "주소록 구성", -"New Address Book" => "새 주소록", -"Import from VCF" => "VCF에서 가져오기", -"CardDav Link" => "CardDav 링크", -"Download" => "다운로드", -"Edit" => "편집", -"Delete" => "삭제", -"Download contact" => "연락처 다운로드", -"Delete contact" => "연락처 삭제", +"Close" => "닫기", "Drop photo to upload" => "Drop photo to upload", +"Delete current photo" => "현재 사진 삭제", +"Edit current photo" => "현재 사진 편집", +"Upload new photo" => "새로운 사진 업로드", +"Select photo from ownCloud" => "ownCloud에서 사진 선택", +"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format custom, Short name, Full name, Reverse or Reverse with comma", "Edit name details" => "이름 세부사항을 편집합니다. ", +"Organization" => "조직", +"Delete" => "삭제", "Nickname" => "별명", "Enter nickname" => "별명 입력", -"Birthday" => "생일", "dd-mm-yyyy" => "일-월-년", "Groups" => "그룹", "Separate groups with commas" => "쉼표로 그룹 구분", @@ -71,22 +94,62 @@ "Preferred" => "선호함", "Please specify a valid email address." => "올바른 이메일 주소를 입력하세요.", "Enter email address" => "이메일 주소 입력", +"Delete email address" => "이메일 주소 삭제", +"Enter phone number" => "전화번호 입력", +"Delete phone number" => "전화번호 삭제", +"View on map" => "지도에서 보기", +"Edit address details" => "상세 주소 수정", +"Add notes here." => "여기에 노트 추가.", +"Add field" => "파일 추가", "Phone" => "전화 번호", +"Email" => "전자 우편", +"Address" => "주소", +"Note" => "노트", +"Download contact" => "연락처 다운로드", +"Delete contact" => "연락처 삭제", +"The temporary image has been removed from cache." => "임시 이미지가 캐시에서 제거 되었습니다. ", +"Edit address" => "주소 수정", "Type" => "종류", "PO Box" => "사서함", "Extended" => "확장", -"Street" => "거리", "City" => "도시", "Region" => "지역", "Zipcode" => "우편 번호", "Country" => "국가", -"Add" => "추가", "Addressbook" => "주소록", -"New Addressbook" => "새 주소록", -"Edit Addressbook" => "주소록 편집", -"Displayname" => "표시 이름", -"Active" => "활성", +"Hon. prefixes" => "Hon. prefixes", +"Miss" => "Miss", +"Ms" => "Ms", +"Mr" => "Mr", +"Sir" => "Sir", +"Mrs" => "Mrs", +"Dr" => "Dr", +"Given name" => "Given name", +"Additional names" => "추가 이름", +"Family name" => "성", +"Hon. suffixes" => "Hon. suffixes", +"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" => "연락처 입력", +"You have no contacts in your addressbook." => "당신의 주소록에는 연락처가 없습니다. ", +"Add contact" => "연락처 추가", +"CardDAV syncing addresses" => "CardDAV 주소 동기화", +"more info" => "더 많은 정보", +"Primary address (Kontact et al)" => "기본 주소 (Kontact et al)", +"iOS/OS X" => "iOS/OS X", +"Download" => "다운로드", +"Edit" => "편집", +"New Address Book" => "새 주소록", "Save" => "저장", -"Submit" => "보내기", "Cancel" => "취소" ); diff --git a/apps/contacts/l10n/lb.php b/apps/contacts/l10n/lb.php index 361e1cb93e1..22ca20e751b 100644 --- a/apps/contacts/l10n/lb.php +++ b/apps/contacts/l10n/lb.php @@ -1,44 +1,86 @@ <?php $TRANSLATIONS = array( +"Error (de)activating addressbook." => "Fehler beim (de)aktivéieren vum Adressbuch.", +"id is not set." => "ID ass net gesat.", +"Error updating addressbook." => "Fehler beim updaten vum Adressbuch.", +"No ID provided" => "Keng ID uginn", +"Error setting checksum." => "Fehler beim setzen vun der Checksum.", +"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.", +"There was an error adding the contact." => "Fehler beim bäisetzen vun engem Kontakt.", +"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.", +"The loading photo is not valid." => "Déi geluede Photo ass net gülteg.", +"Contact ID is missing." => "Kontakt ID fehlt.", +"File doesn't exist:" => "Fichier existéiert net:", +"Error loading image." => "Fehler beim lueden vum Bild.", +"No file was uploaded" => "Et ass kee Fichier ropgeluede ginn", +"Contacts" => "Kontakter", +"Error" => "Fehler", +"Result: " => "Resultat: ", +" imported, " => " importéiert, ", "This is not your addressbook." => "Dat do ass net däin Adressbuch.", "Contact could not be found." => "Konnt den Kontakt net fannen.", -"Address" => "Adress", -"Telephone" => "Telefon's Nummer", -"Email" => "Email", -"Organization" => "Firma", "Work" => "Aarbecht", "Home" => "Doheem", "Mobile" => "GSM", "Text" => "SMS", "Voice" => "Voice", +"Message" => "Message", "Fax" => "Fax", "Video" => "Video", "Pager" => "Pager", +"Internet" => "Internet", +"Birthday" => "Gebuertsdag", +"{name}'s Birthday" => "{name} säi Gebuertsdag", "Contact" => "Kontakt", "Add Contact" => "Kontakt bäisetzen", "Addressbooks" => "Adressbicher ", -"New Address Book" => "Neit Adressbuch", -"CardDav Link" => "CardDav Link", -"Download" => "Download", -"Edit" => "Editéieren", +"Close" => "Zoumaachen", +"Organization" => "Firma", "Delete" => "Läschen", -"Delete contact" => "Kontakt läschen", -"Birthday" => "Gebuertsdag", +"Nickname" => "Spëtznumm", +"Enter nickname" => "Gëff e Spëtznumm an", +"dd-mm-yyyy" => "dd-mm-yyyy", +"Groups" => "Gruppen", +"Edit groups" => "Gruppen editéieren", +"Enter phone number" => "Telefonsnummer aginn", +"Delete phone number" => "Telefonsnummer läschen", +"View on map" => "Op da Kaart uweisen", +"Edit address details" => "Adress Detailer editéieren", "Phone" => "Telefon", +"Email" => "Email", +"Address" => "Adress", +"Note" => "Note", +"Download contact" => "Kontakt eroflueden", +"Delete contact" => "Kontakt läschen", "Type" => "Typ", "PO Box" => "Postleetzuel", "Extended" => "Erweidert", -"Street" => "Strooss", "City" => "Staat", "Region" => "Regioun", "Zipcode" => "Postleetzuel", "Country" => "Land", -"Add" => "Dobäisetzen", "Addressbook" => "Adressbuch", -"New Addressbook" => "Neit Adressbuch", -"Edit Addressbook" => "Adressbuch editéieren", -"Displayname" => "Ugewisene Numm", +"Mr" => "M", +"Sir" => "Sir", +"Mrs" => "Mme", +"Dr" => "Dr", +"Given name" => "Virnumm", +"Additional names" => "Weider Nimm", +"Family name" => "Famillje Numm", +"Ph.D." => "Ph.D.", +"Jr." => "Jr.", +"Sn." => "Sn.", +"iOS/OS X" => "iOS/OS X", +"Download" => "Download", +"Edit" => "Editéieren", +"New Address Book" => "Neit Adressbuch", "Save" => "Späicheren", -"Submit" => "Fortschécken", "Cancel" => "Ofbriechen" ); diff --git a/apps/contacts/l10n/lt_LT.php b/apps/contacts/l10n/lt_LT.php index 435927a247c..3b31aa7931e 100644 --- a/apps/contacts/l10n/lt_LT.php +++ b/apps/contacts/l10n/lt_LT.php @@ -1,49 +1,53 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "Klaida (de)aktyvuojant adresų knygą.", +"No contacts found." => "Kontaktų nerasta.", "There was an error adding the contact." => "Pridedant kontaktą įvyko klaida.", -"Error adding addressbook." => "Klaida pridedant adresų knygą.", -"Error activating addressbook." => "Klaida aktyvuojant adresų knygą.", "Information about vCard is incorrect. Please reload the page." => "Informacija apie vCard yra neteisinga. ", +"Error reading contact photo." => "Klaida skaitant kontakto nuotrauką.", +"The loading photo is not valid." => "Netinkama įkeliama nuotrauka.", +"File doesn't exist:" => "Failas neegzistuoja:", +"Error loading image." => "Klaida įkeliant nuotrauką.", +"There is no error, the file uploaded with success" => "Failas įkeltas sėkmingai, be klaidų", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Įkeliamo failo dydis viršija upload_max_filesize nustatymą php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Įkeliamo failo dydis viršija MAX_FILE_SIZE nustatymą, kuris naudojamas HTML formoje.", +"The uploaded file was only partially uploaded" => "Failas buvo įkeltas tik dalinai", +"No file was uploaded" => "Nebuvo įkeltas joks failas", "Contacts" => "Kontaktai", "This is not your addressbook." => "Tai ne jūsų adresų knygelė.", "Contact could not be found." => "Kontaktas nerastas", -"Address" => "Adresas", -"Telephone" => "Telefonas", -"Email" => "El. paštas", -"Organization" => "Organizacija", "Work" => "Darbo", "Home" => "Namų", "Mobile" => "Mobilusis", "Text" => "Žinučių", "Voice" => "Balso", +"Message" => "Žinutė", "Fax" => "Faksas", "Video" => "Vaizdo", "Pager" => "Pranešimų gaviklis", +"Internet" => "Internetas", +"Birthday" => "Gimtadienis", "Contact" => "Kontaktas", "Add Contact" => "Pridėti kontaktą", "Addressbooks" => "Adresų knygos", -"New Address Book" => "Nauja adresų knyga", -"CardDav Link" => "CardDAV nuoroda", -"Download" => "Atsisiųsti", -"Edit" => "Keisti", +"Organization" => "Organizacija", "Delete" => "Trinti", +"Nickname" => "Slapyvardis", +"Enter nickname" => "Įveskite slapyvardį", +"Phone" => "Telefonas", +"Email" => "El. paštas", +"Address" => "Adresas", "Download contact" => "Atsisųsti kontaktą", "Delete contact" => "Ištrinti kontaktą", -"Birthday" => "Gimtadienis", -"Phone" => "Telefonas", "Type" => "Tipas", "PO Box" => "Pašto dėžutė", -"Street" => "Gatvė", "City" => "Miestas", "Region" => "Regionas", "Zipcode" => "Pašto indeksas", "Country" => "Šalis", -"Add" => "Pridėti", "Addressbook" => "Adresų knyga", -"New Addressbook" => "Nauja adresų knyga", -"Edit Addressbook" => "Redaguoti adresų knygą", -"Displayname" => "Rodomas vardas", -"Active" => "Aktyvus", +"Download" => "Atsisiųsti", +"Edit" => "Keisti", +"New Address Book" => "Nauja adresų knyga", "Save" => "Išsaugoti", "Cancel" => "Atšaukti" ); diff --git a/apps/contacts/l10n/mk.php b/apps/contacts/l10n/mk.php index 2b81a5d877e..dbdd633e519 100644 --- a/apps/contacts/l10n/mk.php +++ b/apps/contacts/l10n/mk.php @@ -1,39 +1,39 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "Грешка (де)активирање на адресарот.", -"There was an error adding the contact." => "Имаше грешка при додавање на контактот.", -"Cannot add empty property." => "Неможе да се додаде празна вредност.", -"At least one of the address fields has to be filled out." => "Барем една од полињата за адреса треба да биде пополнето.", -"Trying to add duplicate property: " => "Се обидовте да внесете дупликат вредност:", -"Error adding contact property." => "Грешка при додавање на вредност за контактот.", +"id is not set." => "ид не е поставено.", +"Cannot update addressbook with an empty name." => "Неможе да се ажурира адресар со празно име.", +"Error updating addressbook." => "Грешка при ажурирање на адресарот.", "No ID provided" => "Нема доставено ИД", "Error setting checksum." => "Грешка во поставување сума за проверка.", "No categories selected for deletion." => "Нема избрано категории за бришење.", "No address books found." => "Не се најдени адресари.", "No contacts found." => "Не се најдени контакти.", +"There was an error adding the contact." => "Имаше грешка при додавање на контактот.", +"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 за ИД: \"", -"Cannot add addressbook with an empty name." => "Неможе да се внесе адресар со празно име.", -"Error adding addressbook." => "Грешки при додавање на адресарот.", -"Error activating addressbook." => "Грешка при активирање на адресарот.", +"checksum is not set." => "сумата за проверка не е поставена.", +"Information about vCard is incorrect. Please reload the page: " => "Информацијата за vCard не е точна. Ве молам превчитајте ја страницава:", +"Something went FUBAR. " => "Нешто се расипа.", "No contact ID was submitted." => "Не беше доставено ИД за контакт.", "Error reading contact photo." => "Грешка во читање на контакт фотографија.", "Error saving temporary file." => "Грешка во снимање на привремена датотека.", "The loading photo is not valid." => "Фотографијата која се вчитува е невалидна.", -"id is not set." => "ид не е поставено.", -"Information about vCard is incorrect. Please reload the page." => "Информацијата за vCard не е точна. Ве молам превчитајте ја страницава.", -"Error deleting contact property." => "Греш при бришење на вредноста за контакт.", "Contact ID is missing." => "ИД за контакт недостасува.", -"Missing contact id." => "Недостасува ид за контакт.", "No photo path was submitted." => "Не беше поднесена патека за фотографија.", "File doesn't exist:" => "Не постои датотеката:", "Error loading image." => "Грешка во вчитување на слика.", -"element name is not set." => "име за елементот не е поставена.", -"checksum is not set." => "сумата за проверка не е поставена.", -"Information about vCard is incorrect. Please reload the page: " => "Информацијата за vCard не е точна. Ве молам превчитајте ја страницава:", -"Something went FUBAR. " => "Нешто се расипа.", -"Error updating contact property." => "Грешка при ажурирање на вредноста за контакт.", -"Cannot update addressbook with an empty name." => "Неможе да се ажурира адресар со празно име.", -"Error updating addressbook." => "Грешка при ажурирање на адресарот.", +"Error getting contact object." => "Грешка при преземањето на контакт објектот,", +"Error getting PHOTO property." => "Грешка при утврдувањето на карактеристиките на фотографијата.", +"Error saving contact." => "Грешка при снимање на контактите.", +"Error resizing image" => "Грешка при скалирање на фотографијата", +"Error cropping image" => "Грешка при сечење на фотографијата", +"Error creating temporary image" => "Грешка при креирањето на привремената фотографија", +"Error finding image: " => "Грешка при наоѓањето на фотографијата:", "Error uploading contacts to storage." => "Грешка во снимање на контактите на диск.", "There is no error, the file uploaded with success" => "Датотеката беше успешно подигната.", "The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Големината на датотеката ја надминува upload_max_filesize директивата во php.ini", @@ -41,15 +41,26 @@ "The uploaded file was only partially uploaded" => "Датотеката беше само делумно подигната.", "No file was uploaded" => "Не беше подигната датотека.", "Missing a temporary folder" => "Недостасува привремена папка", +"Couldn't save temporary image: " => "Не можеше да се сними привремената фотографија:", +"Couldn't load temporary image: " => "Не можеше да се вчита привремената фотографија:", +"No file was uploaded. Unknown error" => "Ниту еден фајл не се вчита. Непозната грешка", "Contacts" => "Контакти", -"Drop a VCF file to import contacts." => "Довлечкај VCF датотека да се внесат контакти.", -"Addressbook not found." => "Адресарот не е најден.", +"Sorry, this functionality has not been implemented yet" => "Жалам, оваа функционалност уште не е имплементирана", +"Not implemented" => "Не е имплементирано", +"Couldn't get a valid address." => "Не можев да добијам исправна адреса.", +"Error" => "Грешка", +"This property has to be non-empty." => "Својството не смее да биде празно.", +"Couldn't serialize elements." => "Не може да се серијализираат елементите.", +"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' повикан без тип на аргументот. Пријавете грешка/проблем на bugs.owncloud.org", +"Edit name" => "Уреди го името", +"No files selected for upload." => "Ниту еден фајл не е избран за вчитување.", +"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Датотеката која се обидувате да ја префрлите ја надминува максималната големина дефинирана за пренос на овој сервер.", +"Select type" => "Одбери тип", +"Result: " => "Резултат: ", +" imported, " => "увезено,", +" failed." => "неуспешно.", "This is not your addressbook." => "Ова не е во Вашиот адресар.", "Contact could not be found." => "Контактот неможе да биде најден.", -"Address" => "Адреса", -"Telephone" => "Телефон", -"Email" => "Е-пошта", -"Organization" => "Организација", "Work" => "Работа", "Home" => "Дома", "Mobile" => "Мобилен", @@ -60,25 +71,24 @@ "Video" => "Видео", "Pager" => "Пејџер", "Internet" => "Интернет", +"Birthday" => "Роденден", "{name}'s Birthday" => "Роденден на {name}", "Contact" => "Контакт", "Add Contact" => "Додади контакт", +"Import" => "Внеси", "Addressbooks" => "Адресари", -"Configure Address Books" => "Конфигурирај адресар", -"New Address Book" => "Нов адресар", -"Import from VCF" => "Внеси од VCF", -"CardDav Link" => "Врска за CardDav", -"Download" => "Преземи", -"Edit" => "Уреди", -"Delete" => "Избриши", -"Download contact" => "Преземи го контактот", -"Delete contact" => "Избриши го контактот", +"Close" => "Затвои", "Drop photo to upload" => "Довлечкај фотографија за да се подигне", +"Delete current photo" => "Избриши моментална фотографија", +"Edit current photo" => "Уреди моментална фотографија", +"Upload new photo" => "Подигни нова фотографија", +"Select photo from ownCloud" => "Изберете фотографија од ownCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Прилагоден формат, кратко име, цело име, обратно или обратно со запирка", "Edit name details" => "Уреди детали за име", +"Organization" => "Организација", +"Delete" => "Избриши", "Nickname" => "Прекар", "Enter nickname" => "Внеси прекар", -"Birthday" => "Роденден", "dd-mm-yyyy" => "dd-mm-yyyy", "Groups" => "Групи", "Separate groups with commas" => "Одвоете ги групите со запирка", @@ -94,24 +104,21 @@ "Edit address details" => "Уреди детали за адреса", "Add notes here." => "Внесете забелешки тука.", "Add field" => "Додади поле", -"Profile picture" => "Фотографија за профил", "Phone" => "Телефон", +"Email" => "Е-пошта", +"Address" => "Адреса", "Note" => "Забелешка", -"Delete current photo" => "Избриши моментална фотографија", -"Edit current photo" => "Уреди моментална фотографија", -"Upload new photo" => "Подигни нова фотографија", -"Select photo from ownCloud" => "Изберете фотографија од ownCloud", +"Download contact" => "Преземи го контактот", +"Delete contact" => "Избриши го контактот", +"The temporary image has been removed from cache." => "Привремената слика е отстранета од кешот.", "Edit address" => "Уреди адреса", "Type" => "Тип", "PO Box" => "Поштенски фах", "Extended" => "Дополнително", -"Street" => "Улица", "City" => "Град", "Region" => "Регион", "Zipcode" => "Поштенски код", "Country" => "Држава", -"Edit categories" => "Уреди категории", -"Add" => "Додади", "Addressbook" => "Адресар", "Hon. prefixes" => "Префикси за титула", "Miss" => "Г-ца", @@ -132,26 +139,26 @@ "Esq." => "Esq.", "Jr." => "Помлад.", "Sn." => "Постар.", -"New Addressbook" => "Нов адресар", -"Edit Addressbook" => "Уреди адресар", -"Displayname" => "Прикажано име", -"Active" => "Активно", -"Save" => "Сними", -"Submit" => "Прати", -"Cancel" => "Откажи", "Import a contacts file" => "Внеси датотека со контакти", "Please choose the addressbook" => "Ве молам изберете адресар", "create a new addressbook" => "креирај нов адресар", "Name of new addressbook" => "Име на новиот адресар", -"Import" => "Внеси", "Importing contacts" => "Внесување контакти", +"Contacts imported successfully" => "Контаките беа внесени успешно", +"Close Dialog" => "Дијалог за затварање", +"Import Addressbook" => "Внеси адресар", "Select address book to import to:" => "Изберете адресар да се внесе:", +"Drop a VCF file to import contacts." => "Довлечкај VCF датотека да се внесат контакти.", "Select from HD" => "Изберете од хард диск", "You have no contacts in your addressbook." => "Немате контакти во Вашиот адресар.", "Add contact" => "Додади контакт", -"Configure addressbooks" => "Уреди адресари", "CardDAV syncing addresses" => "Адреса за синхронизација со CardDAV", "more info" => "повеќе информации", "Primary address (Kontact et al)" => "Примарна адреса", -"iOS/OS X" => "iOS/OS X" +"iOS/OS X" => "iOS/OS X", +"Download" => "Преземи", +"Edit" => "Уреди", +"New Address Book" => "Нов адресар", +"Save" => "Сними", +"Cancel" => "Откажи" ); diff --git a/apps/contacts/l10n/ms_MY.php b/apps/contacts/l10n/ms_MY.php index 7d8a4c7d124..3fce9eae5a3 100644 --- a/apps/contacts/l10n/ms_MY.php +++ b/apps/contacts/l10n/ms_MY.php @@ -1,58 +1,178 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "Ralat nyahaktif buku alamat.", +"id is not set." => "ID tidak ditetapkan.", +"Cannot update addressbook with an empty name." => "Tidak boleh kemaskini buku alamat dengan nama yang kosong.", +"Error updating addressbook." => "Masalah mengemaskini buku alamat.", +"No ID provided" => "tiada ID diberi", +"Error setting checksum." => "Ralat menetapkan checksum.", +"No categories selected for deletion." => "Tiada kategori dipilih untuk dibuang.", +"No address books found." => "Tiada buku alamat dijumpai.", +"No contacts found." => "Tiada kenalan dijumpai.", "There was an error adding the contact." => "Terdapat masalah menambah maklumat.", +"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.", -"Error adding contact property." => "Terdapat masalah menambah maklumat.", -"Error adding addressbook." => "Masalah menambah buku alamat.", -"Error activating addressbook." => "Masalah mengaktifkan buku alamat.", +"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.", -"Error deleting contact property." => "Masalah memadam maklumat.", -"Error updating contact property." => "Masalah mengemaskini maklumat.", -"Error updating addressbook." => "Masalah mengemaskini buku alamat.", +"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 tentang vCard tidak betul.", +"Something went FUBAR. " => "Sesuatu tidak betul.", +"No contact ID was submitted." => "Tiada ID kenalan yang diberi.", +"Error reading contact photo." => "Ralat pada foto kenalan.", +"Error saving temporary file." => "Ralat menyimpan fail sementara", +"The loading photo is not valid." => "Foto muatan tidak sah.", +"Contact ID is missing." => "ID Kenalan telah hilang.", +"No photo path was submitted." => "Tiada direktori gambar yang diberi.", +"File doesn't exist:" => "Fail tidak wujud:", +"Error loading image." => "Ralat pada muatan imej.", +"Error getting contact object." => "Ralat mendapatkan objek pada kenalan.", +"Error getting PHOTO property." => "Ralat mendapatkan maklumat gambar.", +"Error saving contact." => "Ralat menyimpan kenalan.", +"Error resizing image" => "Ralat mengubah saiz imej", +"Error cropping image" => "Ralat memotong imej", +"Error creating temporary image" => "Ralat mencipta imej sementara", +"Error finding image: " => "Ralat mencari imej: ", +"Error uploading contacts to storage." => "Ralat memuatnaik senarai kenalan.", +"There is no error, the file uploaded with success" => "Tiada ralat berlaku, fail berjaya dimuatnaik", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Saiz fail yang dimuatnaik melebihi upload_max_filesize yang ditetapkan dalam php.ini", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Saiz fail yang dimuatnaik melebihi MAX_FILE_SIZE yang ditetapkan dalam borang HTML", +"The uploaded file was only partially uploaded" => "Fail yang dimuatnaik tidak lengkap", +"No file was uploaded" => "Tiada fail dimuatnaik", +"Missing a temporary folder" => "Direktori sementara hilang", +"Couldn't save temporary image: " => "Tidak boleh menyimpan imej sementara: ", +"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", +"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.", +"Select type" => "PIlih jenis", +"Result: " => "Hasil: ", +" imported, " => " import, ", +" failed." => " gagal.", +"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", -"Address" => "Alamat", -"Telephone" => "Telefon", -"Email" => "Emel", -"Organization" => "Organisasi", "Work" => "Kerja", "Home" => "Rumah", +"Other" => "Lain", "Mobile" => "Mudah alih", "Text" => "Teks", "Voice" => "Suara", +"Message" => "Mesej", "Fax" => "Fax", "Video" => "Video", "Pager" => "Alat Kelui", +"Internet" => "Internet", +"Birthday" => "Hari lahir", +"Business" => "Perniagaan", +"Clients" => "klien", +"Holidays" => "Hari kelepasan", +"Ideas" => "Idea", +"Journey" => "Perjalanan", +"Jubilee" => "Jubli", +"Meeting" => "Mesyuarat", +"Personal" => "Peribadi", +"Projects" => "Projek", +"{name}'s Birthday" => "Hari Lahir {name}", "Contact" => "Hubungan", "Add Contact" => "Tambah kenalan", +"Import" => "Import", +"Settings" => "Tetapan", "Addressbooks" => "Senarai Buku Alamat", -"New Address Book" => "Buku Alamat Baru", -"CardDav Link" => "Sambungan CardDav", -"Download" => "Muat naik", -"Edit" => "Sunting", +"Close" => "Tutup", +"Next addressbook" => "Buku alamat seterusnya", +"Previous addressbook" => "Buku alamat sebelumnya", +"Drop photo to upload" => "Letak foto disini untuk muatnaik", +"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", +"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", +"Organization" => "Organisasi", "Delete" => "Padam", -"Download contact" => "Muat turun hubungan", -"Delete contact" => "Padam hubungan", -"Birthday" => "Hari lahir", +"Nickname" => "Nama Samaran", +"Enter nickname" => "Masukkan nama samaran", +"dd-mm-yyyy" => "dd-mm-yyyy", +"Groups" => "Kumpulan", +"Separate groups with commas" => "Asingkan kumpulan dengan koma", +"Edit groups" => "Ubah kumpulan", "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", +"Edit address details" => "Ubah butiran alamat", +"Add notes here." => "Letak nota disini.", +"Add field" => "Letak ruangan", "Phone" => "Telefon", +"Email" => "Emel", +"Address" => "Alamat", +"Note" => "Nota", +"Download contact" => "Muat turun hubungan", +"Delete contact" => "Padam hubungan", +"The temporary image has been removed from cache." => "Imej sementara telah dibuang dari cache.", +"Edit address" => "Ubah alamat", "Type" => "Jenis", "PO Box" => "Peti surat", "Extended" => "Sambungan", -"Street" => "Jalan", "City" => "bandar", "Region" => "Wilayah", "Zipcode" => "Poskod", "Country" => "Negara", -"Add" => "Tambah", "Addressbook" => "Buku alamat", -"New Addressbook" => "Buku Alamat Baru", -"Edit Addressbook" => "Kemaskini Buku Alamat", -"Displayname" => "Paparan nama", -"Active" => "Aktif", +"Hon. prefixes" => "Awalan nama", +"Miss" => "Cik", +"Ms" => "Cik", +"Mr" => "Encik", +"Sir" => "Tuan", +"Mrs" => "Puan", +"Dr" => "Dr", +"Given name" => "Nama diberi", +"Additional names" => "Nama tambahan", +"Family name" => "Nama keluarga", +"Hon. suffixes" => "Awalan nama", +"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" => "Import fail kenalan", +"Please choose the addressbook" => "Sila pilih buku alamat", +"create a new addressbook" => "Cipta buku alamat baru", +"Name of new addressbook" => "Nama buku alamat", +"Importing contacts" => "Import senarai kenalan", +"You have no contacts in your addressbook." => "Anda tidak mempunyai sebarang kenalan didalam buku alamat.", +"Add contact" => "Letak kenalan", +"Select Address Books" => "Pilih Buku Alamat", +"Enter name" => "Masukkan nama", +"Enter description" => "Masukkan keterangan", +"CardDAV syncing addresses" => "alamat selarian CardDAV", +"more info" => "maklumat lanjut", +"Primary address (Kontact et al)" => "Alamat utama", +"iOS/OS X" => "iOS/OS X", +"Download" => "Muat naik", +"Edit" => "Sunting", +"New Address Book" => "Buku Alamat Baru", +"Name" => "Nama", +"Description" => "Keterangan", "Save" => "Simpan", -"Submit" => "Hantar", -"Cancel" => "Batal" +"Cancel" => "Batal", +"More..." => "Lagi..." ); diff --git a/apps/contacts/l10n/nb_NO.php b/apps/contacts/l10n/nb_NO.php index 3f7731bede8..5f7c49c8b98 100644 --- a/apps/contacts/l10n/nb_NO.php +++ b/apps/contacts/l10n/nb_NO.php @@ -1,45 +1,51 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "Et problem oppsto med å (de)aktivere adresseboken.", -"There was an error adding the contact." => "Et problem oppsto med å legge til kontakten.", -"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.", -"Error adding contact property." => "Et problem oppsto med å legge til kontaktfeltet.", +"id is not set." => "id er ikke satt.", +"Cannot update addressbook with an empty name." => "Kan ikke oppdatere adressebøker uten navn.", +"Error updating addressbook." => "Et problem oppsto med å oppdatere adresseboken.", "No ID provided" => "Ingen ID angitt", "No categories selected for deletion." => "Ingen kategorier valgt for sletting.", "No address books found." => "Ingen adressebok funnet.", "No contacts found." => "Ingen kontakter funnet.", +"There was an error adding the contact." => "Et problem oppsto med å legge til kontakten.", +"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.", +"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", -"Cannot add addressbook with an empty name." => "Kan ikke legge til en adressebok uten navn.", -"Error adding addressbook." => "Et problem oppsto med å legge til adresseboken.", -"Error activating addressbook." => "Et problem oppsto med å aktivere adresseboken.", +"Something went FUBAR. " => "Noe gikk fryktelig galt.", "Error reading contact photo." => "Klarte ikke å lese kontaktbilde.", "Error saving temporary file." => "Klarte ikke å lagre midlertidig fil.", "The loading photo is not valid." => "Bildet som lastes inn er ikke gyldig.", -"id is not set." => "id er ikke satt.", -"Information about vCard is incorrect. Please reload the page." => "Informasjonen om vCard-filen er ikke riktig. Last inn siden på nytt.", -"Error deleting contact property." => "Et problem oppsto med å fjerne kontaktfeltet.", -"Missing contact id." => "Mangler kontakt-id.", +"Contact ID is missing." => "Kontakt-ID mangler.", "No photo path was submitted." => "Ingen filsti ble lagt inn.", "File doesn't exist:" => "Filen eksisterer ikke:", "Error loading image." => "Klarte ikke å laste bilde.", -"Something went FUBAR. " => "Noe gikk fryktelig galt.", -"Error updating contact property." => "Et problem oppsto med å legge til kontaktfeltet.", -"Cannot update addressbook with an empty name." => "Kan ikke oppdatere adressebøker uten navn.", -"Error updating addressbook." => "Et problem oppsto med å oppdatere adresseboken.", +"Error saving contact." => "Klarte ikke å lagre kontakt.", +"Error resizing image" => "Klarte ikke å endre størrelse på bildet", +"Error cropping image" => "Klarte ikke å beskjære bildet", +"Error creating temporary image" => "Klarte ikke å lage et midlertidig bilde", +"Error finding image: " => "Kunne ikke finne bilde:", +"Error uploading contacts to storage." => "Klarte ikke å laste opp kontakter til lagringsplassen", "There is no error, the file uploaded with success" => "Pust ut, ingen feil. Filen ble lastet opp problemfritt", "The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Filen du prøvde å laste opp var større enn grensen upload_max_filesize i php.ini", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Filen du prøvde å laste opp var større enn grensen satt i MAX_FILE_SIZE i HTML-skjemaet.", "The uploaded file was only partially uploaded" => "Filen du prøvde å laste opp ble kun delvis lastet opp", "No file was uploaded" => "Ingen filer ble lastet opp", "Missing a temporary folder" => "Mangler midlertidig mappe", +"Couldn't save temporary image: " => "Kunne ikke lagre midlertidig bilde:", +"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", -"Addressbook not found." => "Adresseboken ble ikke funnet.", +"Error" => "Feil", +"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.", +"Select type" => "Velg type", +"Result: " => "Resultat:", +" imported, " => "importert,", +" failed." => "feilet.", "This is not your addressbook." => "Dette er ikke dine adressebok.", "Contact could not be found." => "Kontakten ble ikke funnet.", -"Address" => "Adresse", -"Telephone" => "Telefon", -"Email" => "E-post", -"Organization" => "Organisasjon", "Work" => "Arbeid", "Home" => "Hjem", "Mobile" => "Mobil", @@ -50,24 +56,23 @@ "Video" => "Video", "Pager" => "Pager", "Internet" => "Internett", -"{name}'s Birthday" => "bursdagen til {name}", +"Birthday" => "Bursdag", +"{name}'s Birthday" => "{name}s bursdag", "Contact" => "Kontakt", "Add Contact" => "Ny kontakt", +"Import" => "Importer", "Addressbooks" => "Adressebøker", -"Configure Address Books" => "Konfigurer adressebok", -"New Address Book" => "Ny adressebok", -"Import from VCF" => "Importer fra VDF", -"CardDav Link" => "CardDAV-lenke", -"Download" => "Hent ned", -"Edit" => "Rediger", -"Delete" => "Slett", -"Download contact" => "Hend ned kontakten", -"Delete contact" => "Slett kontakt", +"Close" => "Lukk", "Drop photo to upload" => "Dra bilder hit for å laste opp", +"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", +"Delete" => "Slett", "Nickname" => "Kallenavn", "Enter nickname" => "Skriv inn kallenavn", -"Birthday" => "Bursdag", "dd-mm-yyyy" => "dd-mm-åååå", "Groups" => "Grupper", "Separate groups with commas" => "Skill gruppene med komma", @@ -83,25 +88,23 @@ "Edit address details" => "Endre detaljer rundt adresse", "Add notes here." => "Legg inn notater her.", "Add field" => "Legg til felt", -"Profile picture" => "Profilbilde", "Phone" => "Telefon", +"Email" => "E-post", +"Address" => "Adresse", "Note" => "Notat", -"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", +"Download contact" => "Hend ned kontakten", +"Delete contact" => "Slett kontakt", +"The temporary image has been removed from cache." => "Det midlertidige bildet er fjernet fra cache.", "Edit address" => "Endre adresse", "Type" => "Type", "PO Box" => "Postboks", "Extended" => "Utvidet", -"Street" => "Gate", "City" => "By", "Region" => "Området", "Zipcode" => "Postnummer", "Country" => "Land", -"Edit categories" => "Endre kategorier", -"Add" => "Ny", "Addressbook" => "Adressebok", +"Hon. prefixes" => "Ærestitler", "Miss" => "Frøken", "Mr" => "Herr", "Mrs" => "Fru", @@ -118,18 +121,21 @@ "Displayname" => "Visningsnavn", "Active" => "Aktiv", "Save" => "Lagre", -"Submit" => "Lagre", +"Submit" => "Send inn", "Cancel" => "Avbryt", "Import a contacts file" => "Importer en fil med kontakter.", "Please choose the addressbook" => "Vennligst velg adressebok", "create a new addressbook" => "Lag ny adressebok", "Name of new addressbook" => "Navn på ny adressebok", -"Import" => "Importer", "Importing contacts" => "Importerer kontakter", "You have no contacts in your addressbook." => "Du har ingen kontakter i din adressebok", "Add contact" => "Ny kontakt", -"Configure addressbooks" => "Konfigurer adressebøker", "CardDAV syncing addresses" => "Synkroniseringsadresse for CardDAV", "more info" => "mer info", -"iOS/OS X" => "iOS/OS X" +"iOS/OS X" => "iOS/OS X", +"Download" => "Hent ned", +"Edit" => "Rediger", +"New Address Book" => "Ny adressebok", +"Save" => "Lagre", +"Cancel" => "Avbryt" ); diff --git a/apps/contacts/l10n/nl.php b/apps/contacts/l10n/nl.php index fd7e50ba4d5..bcf93c506a9 100644 --- a/apps/contacts/l10n/nl.php +++ b/apps/contacts/l10n/nl.php @@ -1,39 +1,32 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "Fout bij het (de)activeren van het adresboek.", -"There was an error adding the contact." => "Er was een fout bij het toevoegen van het contact.", -"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: ", -"Error adding contact property." => "Fout bij het toevoegen van de contacteigenschap.", +"id is not set." => "id is niet ingesteld.", +"Cannot update addressbook with an empty name." => "Kan adresboek zonder naam niet wijzigen", +"Error updating addressbook." => "Fout bij het updaten van het adresboek.", "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", +"There was an error adding the contact." => "Er was een fout bij het toevoegen van het contact.", +"element name is not set." => "onderdeel naam is niet opgegeven.", +"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: ", +"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: \"", -"Cannot add addressbook with an empty name." => "Kan geen adresboek toevoegen zonder naam.", -"Error adding addressbook." => "Fout bij het toevoegen van het adresboek.", -"Error activating addressbook." => "Fout bij het activeren van het adresboek.", +"checksum is not set." => "controlegetal is niet opgegeven.", +"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. ", "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.", "The loading photo is not valid." => "De geladen foto is niet goed.", -"id is not set." => "id is niet ingesteld.", -"Information about vCard is incorrect. Please reload the page." => "Informatie over de vCard is onjuist. Herlaad de pagina.", -"Error deleting contact property." => "Fout bij het verwijderen van de contacteigenschap.", "Contact ID is missing." => "Contact ID ontbreekt.", -"Missing contact id." => "Ontbrekende contact id.", "No photo path was submitted." => "Geen fotopad opgestuurd.", "File doesn't exist:" => "Bestand bestaat niet:", "Error loading image." => "Fout bij laden plaatje.", -"element name is not set." => "onderdeel naam is niet opgegeven.", -"checksum is not set." => "controlegetal is niet opgegeven.", -"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. ", -"Error updating contact property." => "Fout bij het updaten van de contacteigenschap.", -"Cannot update addressbook with an empty name." => "Kan adresboek zonder naam niet wijzigen", -"Error updating addressbook." => "Fout bij het updaten van het adresboek.", "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", @@ -42,14 +35,8 @@ "No file was uploaded" => "Er is geen bestand geüpload", "Missing a temporary folder" => "Er ontbreekt een tijdelijke map", "Contacts" => "Contacten", -"Drop a VCF file to import contacts." => "Sleep een VCF bestand om de contacten te importeren.", -"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.", -"Address" => "Adres", -"Telephone" => "Telefoon", -"Email" => "E-mail", -"Organization" => "Organisatie", "Work" => "Werk", "Home" => "Thuis", "Mobile" => "Mobiel", @@ -60,25 +47,23 @@ "Video" => "Video", "Pager" => "Pieper", "Internet" => "Internet", +"Birthday" => "Verjaardag", "{name}'s Birthday" => "{name}'s verjaardag", "Contact" => "Contact", "Add Contact" => "Contact toevoegen", +"Import" => "Importeer", "Addressbooks" => "Adresboeken", -"Configure Address Books" => "Instellen adresboeken", -"New Address Book" => "Nieuw Adresboek", -"Import from VCF" => "Importeer uit VCF", -"CardDav Link" => "CardDav Link", -"Download" => "Download", -"Edit" => "Bewerken", -"Delete" => "Verwijderen", -"Download contact" => "Download contact", -"Delete contact" => "Verwijder contact", "Drop photo to upload" => "Verwijder foto uit upload", +"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", "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", +"Organization" => "Organisatie", +"Delete" => "Verwijderen", "Nickname" => "Roepnaam", "Enter nickname" => "Voer roepnaam in", -"Birthday" => "Verjaardag", "dd-mm-yyyy" => "dd-mm-yyyy", "Groups" => "Groepen", "Separate groups with commas" => "Gebruik komma bij meerder groepen", @@ -94,49 +79,45 @@ "Edit address details" => "Wijzig adres gegevens", "Add notes here." => "Voeg notitie toe", "Add field" => "Voeg veld toe", -"Profile picture" => "Profiel foto", "Phone" => "Telefoon", +"Email" => "E-mail", +"Address" => "Adres", "Note" => "Notitie", -"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", +"Download contact" => "Download contact", +"Delete contact" => "Verwijder contact", "Edit address" => "Wijzig adres", "Type" => "Type", "PO Box" => "Postbus", "Extended" => "Uitgebreide", -"Street" => "Straat", "City" => "Stad", "Region" => "Regio", "Zipcode" => "Postcode", "Country" => "Land", -"Edit categories" => "Wijzig categorieën", -"Add" => "Voeg toe", "Addressbook" => "Adresboek", "Hon. prefixes" => "Hon. prefixes", "Given name" => "Voornaam", "Additional names" => "Extra namen", "Family name" => "Achternaam", -"New Addressbook" => "Nieuw adresboek", -"Edit Addressbook" => "Wijzig adresboek", -"Displayname" => "Weergavenaam", -"Active" => "Actief", -"Save" => "Opslaan", -"Submit" => "Opslaan", -"Cancel" => "Anuleren", "Import a contacts file" => "Importeer een contacten bestand", "Please choose the addressbook" => "Kies een adresboek", "create a new addressbook" => "Maak een nieuw adresboek", "Name of new addressbook" => "Naam van nieuw adresboek", -"Import" => "Importeer", "Importing contacts" => "Importeren van contacten", +"Contacts imported successfully" => "Contacten zijn geïmporteerd", +"Close Dialog" => "Sluit venster", +"Import Addressbook" => "Importeer adresboek", "Select address book to import to:" => "Selecteer adresboek voor import:", +"Drop a VCF file to import contacts." => "Sleep een VCF bestand om de contacten te importeren.", "Select from HD" => "Selecteer van schijf", "You have no contacts in your addressbook." => "Je hebt geen contacten in je adresboek", "Add contact" => "Contactpersoon toevoegen", -"Configure addressbooks" => "Bewerken adresboeken", "CardDAV syncing addresses" => "CardDAV synchroniseert de adressen", "more info" => "meer informatie", "Primary address (Kontact et al)" => "Standaardadres", -"iOS/OS X" => "IOS/OS X" +"iOS/OS X" => "IOS/OS X", +"Download" => "Download", +"Edit" => "Bewerken", +"New Address Book" => "Nieuw Adresboek", +"Save" => "Opslaan", +"Cancel" => "Anuleren" ); diff --git a/apps/contacts/l10n/nn_NO.php b/apps/contacts/l10n/nn_NO.php index 5b3fc5b1ab3..2e3ab16da3e 100644 --- a/apps/contacts/l10n/nn_NO.php +++ b/apps/contacts/l10n/nn_NO.php @@ -1,22 +1,13 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "Ein feil oppstod ved (de)aktivering av adressebok.", +"Error updating addressbook." => "Eit problem oppstod ved å oppdatere adresseboka.", "There was an error adding the contact." => "Det kom ei feilmelding då kontakta vart lagt til.", "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.", -"Error adding contact property." => "Eit problem oppstod ved å leggja til kontakteltet.", -"Error adding addressbook." => "Eit problem oppstod ved å leggja til adresseboka.", -"Error activating addressbook." => "Eit problem oppstod ved aktivering av adresseboka.", "Information about vCard is incorrect. Please reload the page." => "Informasjonen om vCard-et er feil, ver venleg og last sida på nytt.", -"Error deleting contact property." => "Eit problem oppstod ved å slette kontaktfeltet.", -"Error updating contact property." => "Eit problem oppstod ved å endre kontaktfeltet.", -"Error updating addressbook." => "Eit problem oppstod ved å oppdatere adresseboka.", "Contacts" => "Kotaktar", "This is not your addressbook." => "Dette er ikkje di adressebok.", "Contact could not be found." => "Fann ikkje kontakten.", -"Address" => "Adresse", -"Telephone" => "Telefonnummer", -"Email" => "Epost", -"Organization" => "Organisasjon", "Work" => "Arbeid", "Home" => "Heime", "Mobile" => "Mobil", @@ -25,34 +16,29 @@ "Fax" => "Faks", "Video" => "Video", "Pager" => "Personsøkjar", +"Birthday" => "Bursdag", "Contact" => "Kontakt", "Add Contact" => "Legg til kontakt", "Addressbooks" => "Adressebøker", -"New Address Book" => "Ny adressebok", -"CardDav Link" => "CardDav lenkje", -"Download" => "Last ned", -"Edit" => "Endra", +"Organization" => "Organisasjon", "Delete" => "Slett", -"Download contact" => "Last ned kontakt", -"Delete contact" => "Slett kontakt", -"Birthday" => "Bursdag", "Preferred" => "Føretrekt", "Phone" => "Telefonnummer", +"Email" => "Epost", +"Address" => "Adresse", +"Download contact" => "Last ned kontakt", +"Delete contact" => "Slett kontakt", "Type" => "Skriv", "PO Box" => "Postboks", "Extended" => "Utvida", -"Street" => "Gate", "City" => "Stad", "Region" => "Region/fylke", "Zipcode" => "Postnummer", "Country" => "Land", -"Add" => "Legg til", "Addressbook" => "Adressebok", -"New Addressbook" => "Ny adressebok", -"Edit Addressbook" => "Endre adressebok", -"Displayname" => "Visningsnamn", -"Active" => "Aktiv", +"Download" => "Last ned", +"Edit" => "Endra", +"New Address Book" => "Ny adressebok", "Save" => "Lagre", -"Submit" => "Send", "Cancel" => "Kanseller" ); diff --git a/apps/contacts/l10n/pl.php b/apps/contacts/l10n/pl.php index a99f1906958..924622ebb0f 100644 --- a/apps/contacts/l10n/pl.php +++ b/apps/contacts/l10n/pl.php @@ -1,39 +1,40 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "Błąd (de)aktywowania książki adresowej.", -"There was an error adding the contact." => "Wystąpił błąd podczas dodawania 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:", -"Error adding contact property." => "Błąd dodawania elementu.", +"id is not set." => "id nie ustawione.", +"Cannot update addressbook with an empty name." => "Nie można zaktualizować książki adresowej z pustą nazwą.", +"Error updating addressbook." => "Błąd uaktualniania książki adresowej.", "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.", +"There was an error adding the contact." => "Wystąpił błąd podczas dodawania kontaktu.", +"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:", +"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: \"", -"Cannot add addressbook with an empty name." => "Nie można dodać książki adresowej z pusta nazwą", -"Error adding addressbook." => "Błąd dodawania książki adresowej.", -"Error activating addressbook." => "Błąd aktywowania książki adresowej.", +"checksum is not set." => "checksum-a nie ustawiona", +"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.", "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.", "The loading photo is not valid." => "Wczytywane zdjęcie nie jest poprawne.", -"id is not set." => "id nie ustawione.", -"Information about vCard is incorrect. Please reload the page." => "Informacje o vCard są nieprawidłowe. Proszę odświeżyć stronę.", -"Error deleting contact property." => "Błąd usuwania elementu.", "Contact ID is missing." => "Brak kontaktu id.", -"Missing contact id." => "Brak kontaktu id.", "No photo path was submitted." => "Ścieżka do zdjęcia nie została podana.", "File doesn't exist:" => "Plik nie istnieje:", "Error loading image." => "Błąd ładowania obrazu.", -"element name is not set." => "nazwa elementu nie jest ustawiona.", -"checksum is not set." => "checksum-a nie ustawiona", -"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.", -"Error updating contact property." => "Błąd uaktualniania elementu.", -"Cannot update addressbook with an empty name." => "Nie można zaktualizować książki adresowej z pustą nazwą.", -"Error updating addressbook." => "Błąd uaktualniania książki adresowej.", +"Error getting contact object." => "Błąd pobrania kontaktu.", +"Error getting PHOTO property." => "Błąd uzyskiwania właściwości ZDJĘCIA.", +"Error saving contact." => "Błąd zapisu kontaktu.", +"Error resizing image" => "Błąd zmiany rozmiaru obrazu", +"Error cropping image" => "Błąd przycinania obrazu", +"Error creating temporary image" => "Błąd utworzenia obrazu tymczasowego", +"Error finding image: " => "Błąd znajdowanie obrazu: ", "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 ", @@ -41,17 +42,46 @@ "The uploaded file was only partially uploaded" => "Załadowany plik tylko częściowo został wysłany.", "No file was uploaded" => "Plik nie został załadowany", "Missing a temporary folder" => "Brak folderu tymczasowego", +"Couldn't save temporary image: " => "Nie można zapisać obrazu tymczasowego: ", +"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", -"Drop a VCF file to import contacts." => "Upuść plik VCF do importu kontaktów.", -"Addressbook not found." => "Nie znaleziono książki adresowej", +"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", +"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.", +"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "\"deleteProperty' wywołana bez argumentu typu. Proszę raportuj na bugs.owncloud.org", +"Edit name" => "Zmień nazwę", +"No files selected for upload." => "Żadne pliki nie zostały zaznaczone do wysłania.", +"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Plik, który próbujesz wysłać przekracza maksymalny rozmiar pliku przekazywania na tym serwerze.", +"Error loading profile picture." => "Błąd wczytywania zdjęcia profilu.", +"Select type" => "Wybierz typ", +"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?", +"Result: " => "Wynik: ", +" imported, " => " importowane, ", +" failed." => " nie powiodło się.", +"Displayname cannot be empty." => "Nazwa nie może być pusta.", +"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.", -"Address" => "Adres", -"Telephone" => "Telefon", -"Email" => "E-mail", -"Organization" => "Organizacja", +"Jabber" => "Jabber", +"AIM" => "AIM", +"MSN" => "MSN", +"Twitter" => "Twitter", +"GoogleTalk" => "GoogleTalk", +"Facebook" => "Facebook", +"XMPP" => "XMPP", +"ICQ" => "ICQ", +"Yahoo" => "Yahoo", +"Skype" => "Skype", +"QQ" => "QQ", +"GaduGadu" => "GG", "Work" => "Praca", "Home" => "Dom", +"Other" => "Inne", "Mobile" => "Komórka", "Text" => "Połączenie tekstowe", "Voice" => "Połączenie głosowe", @@ -60,25 +90,52 @@ "Video" => "Połączenie wideo", "Pager" => "Pager", "Internet" => "Internet", +"Birthday" => "Urodziny", +"Business" => "Biznesowe", +"Call" => "Wywołanie", +"Clients" => "Klienci", +"Deliverer" => "Doręczanie", +"Holidays" => "Święta", +"Ideas" => "Pomysły", +"Journey" => "Podróż", +"Jubilee" => "Jubileusz", +"Meeting" => "Spotkanie", +"Personal" => "Osobiste", +"Projects" => "Projekty", +"Questions" => "Pytania", "{name}'s Birthday" => "{name} Urodzony", "Contact" => "Kontakt", "Add Contact" => "Dodaj kontakt", +"Import" => "Import", +"Settings" => "Ustawienia", "Addressbooks" => "Książki adresowe", -"Configure Address Books" => "Konfiguruj książkę adresową", -"New Address Book" => "Nowa książka adresowa", -"Import from VCF" => "Importuj z VFC", -"CardDav Link" => "Wyświetla odnośnik CardDav", -"Download" => "Pobiera książkę adresową", -"Edit" => "Edytuje książkę adresową", -"Delete" => "Usuwa książkę adresową", -"Download contact" => "Pobiera kontakt", -"Delete contact" => "Usuwa kontakt", +"Close" => "Zamknij", +"Keyboard shortcuts" => "Skróty klawiatury", +"Navigation" => "Nawigacja", +"Next contact in list" => "Następny kontakt na liście", +"Previous contact in list" => "Poprzedni kontakt na liście", +"Expand/collapse current addressbook" => "Rozwiń/Zwiń bieżącą książkę adresową", +"Next addressbook" => "Następna książka adresowa", +"Previous addressbook" => "Poprzednia książka adresowa", +"Actions" => "Akcje", +"Refresh contacts list" => "Odśwież listę kontaktów", +"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ć", +"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", "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", +"Organization" => "Organizacja", +"Delete" => "Usuwa książkę adresową", "Nickname" => "Nazwa", "Enter nickname" => "Wpisz nazwę", -"Birthday" => "Urodziny", +"Web site" => "Strona www", +"http://www.somesite.com" => "http://www.jakasstrona.pl", +"Go to web site" => "Idż do strony www", "dd-mm-yyyy" => "dd-mm-rrrr", "Groups" => "Grupy", "Separate groups with commas" => "Oddziel grupy przecinkami", @@ -94,24 +151,26 @@ "Edit address details" => "Edytuj szczegóły adresu", "Add notes here." => "Dodaj notatkę tutaj.", "Add field" => "Dodaj pole", -"Profile picture" => "Zdjęcie profilu", "Phone" => "Telefon", +"Email" => "E-mail", +"Address" => "Adres", "Note" => "Uwaga", -"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", +"Download contact" => "Pobiera kontakt", +"Delete contact" => "Usuwa kontakt", +"The temporary image has been removed from cache." => "Tymczasowy obraz został usunięty z pamięci podręcznej.", "Edit address" => "Edytuj adres", "Type" => "Typ", "PO Box" => "Skrzynka pocztowa", +"Street address" => "Ulica", +"Street and number" => "Ulica i numer", "Extended" => "Rozszerzony", -"Street" => "Ulica", +"Apartment number etc." => "Numer lokalu", "City" => "Miasto", "Region" => "Region", +"E.g. state or province" => "Np. stanu lub prowincji", "Zipcode" => "Kod pocztowy", +"Postal code" => "Kod pocztowy", "Country" => "Kraj", -"Edit categories" => "Edytuj kategorie", -"Add" => "Dodaj", "Addressbook" => "Książka adresowa", "Hon. prefixes" => "Prefiksy Hon.", "Miss" => "Panna", @@ -132,26 +191,29 @@ "Esq." => "Esq.", "Jr." => "Jr.", "Sn." => "Sn.", -"New Addressbook" => "Nowa książka adresowa", -"Edit Addressbook" => "Edytowanie książki adresowej", -"Displayname" => "Wyświetlana nazwa", -"Active" => "Aktywna", -"Save" => "Zapisz", -"Submit" => "Potwierdź", -"Cancel" => "Anuluj", "Import a contacts file" => "Importuj plik z kontaktami", "Please choose the addressbook" => "Proszę wybrać książkę adresową", "create a new addressbook" => "utwórz nową książkę adresową", "Name of new addressbook" => "Nazwa nowej książki adresowej", -"Import" => "Import", "Importing contacts" => "importuj kontakty", -"Select address book to import to:" => "Zaznacz książkę adresową do importu do:", -"Select from HD" => "Wybierz z HD", "You have no contacts in your addressbook." => "Nie masz żadnych kontaktów w swojej książce adresowej.", "Add contact" => "Dodaj kontakt", -"Configure addressbooks" => "Konfiguruj książkę adresową", +"Select Address Books" => "Wybierz książki adresowe", +"Enter name" => "Wpisz nazwę", +"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" +"iOS/OS X" => "iOS/OS X", +"Show CardDav link" => "Pokaż link CardDAV", +"Show read-only VCF link" => "Pokaż tylko do odczytu łącze VCF", +"Share" => "Udostępnij", +"Download" => "Pobiera książkę adresową", +"Edit" => "Edytuje książkę adresową", +"New Address Book" => "Nowa książka adresowa", +"Name" => "Nazwa", +"Description" => "Opis", +"Save" => "Zapisz", +"Cancel" => "Anuluj", +"More..." => "Więcej..." ); diff --git a/apps/contacts/l10n/pt_BR.php b/apps/contacts/l10n/pt_BR.php index e0da0a771a5..de43e6cbb0f 100644 --- a/apps/contacts/l10n/pt_BR.php +++ b/apps/contacts/l10n/pt_BR.php @@ -1,39 +1,39 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "Erro ao (des)ativar agenda.", -"There was an error adding the contact." => "Ocorreu um erro ao adicionar o 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:", -"Error adding contact property." => "Erro ao adicionar propriedade de contato.", +"id is not set." => "ID não definido.", +"Cannot update addressbook with an empty name." => "Não é possível atualizar sua agenda com um nome em branco.", +"Error updating addressbook." => "Erro ao atualizar agenda.", "No ID provided" => "Nenhum ID fornecido", "Error setting checksum." => "Erro ajustando checksum.", "No categories selected for deletion." => "Nenhum categoria selecionada para remoção.", "No address books found." => "Nenhuma agenda de endereços encontrada.", "No contacts found." => "Nenhum contato encontrado.", +"There was an error adding the contact." => "Ocorreu um erro ao adicionar o contato.", +"element name is not set." => "nome do elemento não definido.", +"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:", +"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:", -"Cannot add addressbook with an empty name." => "Não é possivel adicionar uma agenda de endereços com o nome em branco.", -"Error adding addressbook." => "Erro ao adicionar agenda.", -"Error activating addressbook." => "Erro ao ativar agenda.", +"checksum is not set." => "checksum não definido.", +"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. ", "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.", "The loading photo is not valid." => "Foto carregada não é válida.", -"id is not set." => "ID não definido.", -"Information about vCard is incorrect. Please reload the page." => "Informações sobre vCard é incorreta. Por favor, recarregue a página.", -"Error deleting contact property." => "Erro ao excluir propriedade de contato.", "Contact ID is missing." => "ID do contato está faltando.", -"Missing contact id." => "Faltando ID do contato.", "No photo path was submitted." => "Nenhum caminho para foto foi submetido.", "File doesn't exist:" => "Arquivo não existe:", "Error loading image." => "Erro ao carregar imagem.", -"element name is not set." => "nome do elemento não definido.", -"checksum is not set." => "checksum não definido.", -"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. ", -"Error updating contact property." => "Erro ao atualizar propriedades do contato.", -"Cannot update addressbook with an empty name." => "Não é possível atualizar sua agenda com um nome em branco.", -"Error updating addressbook." => "Erro ao atualizar agenda.", +"Error getting contact object." => "Erro ao obter propriedade de contato.", +"Error getting PHOTO property." => "Erro ao obter propriedade da FOTO.", +"Error saving contact." => "Erro ao salvar contato.", +"Error resizing image" => "Erro ao modificar tamanho da imagem", +"Error cropping image" => "Erro ao recortar imagem", +"Error creating temporary image" => "Erro ao criar imagem temporária", +"Error finding image: " => "Erro ao localizar imagem:", "Error uploading contacts to storage." => "Erro enviando contatos para armazenamento.", "There is no error, the file uploaded with success" => "Arquivo enviado com sucesso", "The uploaded file exceeds the upload_max_filesize directive in php.ini" => "O arquivo enviado excede a diretiva upload_max_filesize em php.ini", @@ -41,15 +41,26 @@ "The uploaded file was only partially uploaded" => "O arquivo foi parcialmente carregado", "No file was uploaded" => "Nenhum arquivo carregado", "Missing a temporary folder" => "Diretório temporário não encontrado", +"Couldn't save temporary image: " => "Não foi possível salvar a imagem temporária:", +"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", -"Drop a VCF file to import contacts." => "Arraste um arquivo VCF para importar contatos.", -"Addressbook not found." => "Lista de endereços não encontrado.", +"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", +"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.", +"'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.", +"Select type" => "Selecione o tipo", +"Result: " => "Resultado:", +" imported, " => "importado,", +" failed." => "falhou.", "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.", -"Address" => "Endereço", -"Telephone" => "Telefone", -"Email" => "E-mail", -"Organization" => "Organização", "Work" => "Trabalho", "Home" => "Home", "Mobile" => "Móvel", @@ -60,25 +71,24 @@ "Video" => "Vídeo", "Pager" => "Pager", "Internet" => "Internet", +"Birthday" => "Aniversário", "{name}'s Birthday" => "Aniversário de {name}", "Contact" => "Contato", "Add Contact" => "Adicionar Contato", +"Import" => "Importar", "Addressbooks" => "Agendas de Endereço", -"Configure Address Books" => "Configurar Livro de Endereços", -"New Address Book" => "Nova agenda", -"Import from VCF" => "Importar de VCF", -"CardDav Link" => "Link CardDav", -"Download" => "Baixar", -"Edit" => "Editar", -"Delete" => "Excluir", -"Download contact" => "Baixar contato", -"Delete contact" => "Apagar contato", +"Close" => "Fechar.", "Drop photo to upload" => "Arraste a foto para ser carregada", +"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", "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", +"Organization" => "Organização", +"Delete" => "Excluir", "Nickname" => "Apelido", "Enter nickname" => "Digite o apelido", -"Birthday" => "Aniversário", "dd-mm-yyyy" => "dd-mm-aaaa", "Groups" => "Grupos", "Separate groups with commas" => "Separe grupos por virgula", @@ -94,24 +104,21 @@ "Edit address details" => "Editar detalhes de endereço", "Add notes here." => "Adicionar notas", "Add field" => "Adicionar campo", -"Profile picture" => "Imagem do Perfil", "Phone" => "Telefone", +"Email" => "E-mail", +"Address" => "Endereço", "Note" => "Nota", -"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", +"Download contact" => "Baixar contato", +"Delete contact" => "Apagar contato", +"The temporary image has been removed from cache." => "A imagem temporária foi removida cache.", "Edit address" => "Editar endereço", "Type" => "Digite", "PO Box" => "Caixa Postal", "Extended" => "Estendido", -"Street" => "Rua", "City" => "Cidade", "Region" => "Região", "Zipcode" => "CEP", "Country" => "País", -"Edit categories" => "Editar categorias", -"Add" => "Adicionar", "Addressbook" => "Agenda de Endereço", "Hon. prefixes" => "Exmo. Prefixos ", "Miss" => "Senhorita", @@ -132,26 +139,20 @@ "Esq." => "Esq.", "Jr." => "Jr.", "Sn." => "Sn.", -"New Addressbook" => "Nova Agenda de Endereço", -"Edit Addressbook" => "Editar Agenda de Endereço", -"Displayname" => "Nome de exibição", -"Active" => "Ativo", -"Save" => "Salvar", -"Submit" => "Enviar", -"Cancel" => "Cancelar", "Import a contacts file" => "Importar arquivos de contato.", "Please choose the addressbook" => "Por favor, selecione uma agenda de endereços", "create a new addressbook" => "Criar nova agenda de endereços", "Name of new addressbook" => "Nome da nova agenda de endereços", -"Import" => "Importar", "Importing contacts" => "Importar contatos", -"Select address book to import to:" => "Selecione agenda de endereços para importar ao destino:", -"Select from HD" => "Selecione do disco rigído", "You have no contacts in your addressbook." => "Voce não tem contatos em sua agenda de endereços.", "Add contact" => "Adicionar contatos", -"Configure addressbooks" => "Configurar agenda de endereços", "CardDAV syncing addresses" => "Sincronizando endereços CardDAV", "more info" => "leia mais", "Primary address (Kontact et al)" => "Endereço primário(Kontact et al)", -"iOS/OS X" => "iOS/OS X" +"iOS/OS X" => "iOS/OS X", +"Download" => "Baixar", +"Edit" => "Editar", +"New Address Book" => "Nova agenda", +"Save" => "Salvar", +"Cancel" => "Cancelar" ); diff --git a/apps/contacts/l10n/pt_PT.php b/apps/contacts/l10n/pt_PT.php index 7a4861abf9d..38708c86206 100644 --- a/apps/contacts/l10n/pt_PT.php +++ b/apps/contacts/l10n/pt_PT.php @@ -1,52 +1,89 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "Erro a (des)ativar o livro de endereços", -"There was an error adding the contact." => "Erro ao adicionar contato", -"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: ", -"Error adding contact property." => "Erro ao adicionar propriedade do contato", +"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.", +"Error updating addressbook." => "Erro a atualizar o livro de endereços", "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.", +"There was an error adding the contact." => "Erro ao adicionar contato", +"element name is not set." => "o nome do elemento não está definido.", +"Could not parse contact: " => "Incapaz de processar contacto", +"Cannot add empty property." => "Não é possivel adicionar uma propriedade vazia", +"At least one of the address fields has to be filled out." => "Pelo menos um dos campos de endereço precisa de estar preenchido", +"Trying to add duplicate property: " => "A tentar adicionar propriedade duplicada: ", +"Missing IM parameter." => "Falta o parâmetro de mensagens instantâneas (IM)", +"Unknown IM: " => "Mensagens instantâneas desconhecida (IM)", +"Information about vCard is incorrect. Please reload the page." => "A informação sobre o vCard está incorreta. Por favor refresque a página", "Missing ID" => "Falta ID", "Error parsing VCard for ID: \"" => "Erro a analisar VCard para o ID: \"", -"Cannot add addressbook with an empty name." => "Não é possivel adicionar Livro de endereços com nome vazio.", -"Error adding addressbook." => "Erro ao adicionar livro de endereços", -"Error activating addressbook." => "Erro ao ativar livro de endereços", +"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á incorrecta. Por favor refresque a página: ", +"Something went FUBAR. " => "Algo provocou um FUBAR. ", "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.", "The loading photo is not valid." => "A foto carregada não é valida.", -"id is not set." => "id não está definido", -"Information about vCard is incorrect. Please reload the page." => "A informação sobre o vCard está incorreta. Por favor refresque a página", -"Error deleting contact property." => "Erro ao apagar propriedade do contato", "Contact ID is missing." => "Falta o ID do contacto.", -"Missing contact id." => "Falta o ID do contacto.", "No photo path was submitted." => "Nenhum caminho da foto definido.", "File doesn't exist:" => "O ficheiro não existe:", "Error loading image." => "Erro a carregar a imagem.", -"element name is not set." => "o nome do elemento não está definido.", -"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á incorrecta. Por favor refresque a página: ", -"Something went FUBAR. " => "Algo provocou um FUBAR. ", -"Error updating contact property." => "Erro ao atualizar propriedade do contato", -"Cannot update addressbook with an empty name." => "Não é possivel actualizar o livro de endereços com o nome vazio.", -"Error updating addressbook." => "Erro a atualizar o livro de endereços", +"Error getting contact object." => "Erro a obter o objecto dos contactos", +"Error getting PHOTO property." => "Erro a obter a propriedade Foto", +"Error saving contact." => "Erro a guardar o contacto.", +"Error resizing image" => "Erro a redimensionar a imagem", +"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: ", "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", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "O tamanho do ficheiro carregado ultrapassa o valor MAX_FILE_SIZE definido no formulário HTML", +"The uploaded file was only partially uploaded" => "O ficheiro seleccionado foi apenas carregado parcialmente", "No file was uploaded" => "Nenhum ficheiro foi submetido", +"Missing a temporary folder" => "Está a faltar a pasta temporária", +"Couldn't save temporary image: " => "Não foi possível guardar a imagem temporária: ", +"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", -"Addressbook not found." => "Livro de endereços não encontrado.", +"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", +"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", +"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' chamada sem argumento definido. Por favor report o problema em bugs.owncloud.org", +"Edit name" => "Editar nome", +"No files selected for upload." => "Nenhum ficheiro seleccionado para enviar.", +"The file you are trying to upload exceed the maximum size for file uploads on this server." => "O tamanho do ficheiro que está a tentar carregar ultrapassa o limite máximo definido para ficheiros no servidor.", +"Error loading profile picture." => "Erro ao carregar imagem de perfil.", +"Select type" => "Seleccionar tipo", +"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?", +"Result: " => "Resultado: ", +" imported, " => " importado, ", +" failed." => " falhou.", +"Displayname cannot be empty." => "Displayname não pode ser vazio", +"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", -"Address" => "Morada", -"Telephone" => "Telefone", -"Email" => "Email", -"Organization" => "Organização", +"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" => "Emprego", "Home" => "Casa", +"Other" => "Outro", "Mobile" => "Telemovel", "Text" => "Texto", "Voice" => "Voz", @@ -55,23 +92,52 @@ "Video" => "Vídeo", "Pager" => "Pager", "Internet" => "Internet", +"Birthday" => "Aniversário", +"Business" => "Empresa", +"Call" => "Telefonar", +"Clients" => "Clientes", +"Deliverer" => "Fornecedor", +"Holidays" => "Férias", +"Ideas" => "Ideias", +"Journey" => "Viagem", +"Jubilee" => "Jubileu", +"Meeting" => "Encontro", +"Personal" => "Pessoal", +"Projects" => "Projectos", +"Questions" => "Questões", "{name}'s Birthday" => "Aniversário de {name}", "Contact" => "Contacto", "Add Contact" => "Adicionar Contacto", +"Import" => "Importar", +"Settings" => "Configurações", "Addressbooks" => "Livros de endereços", -"Configure Address Books" => "Configurar livros de endereços", -"New Address Book" => "Novo livro de endereços", -"Import from VCF" => "Importar de VCF", -"CardDav Link" => "Endereço CardDav", -"Download" => "Transferir", -"Edit" => "Editar", -"Delete" => "Apagar", -"Download contact" => "Transferir contacto", -"Delete contact" => "Apagar contato", +"Close" => "Fechar", +"Keyboard shortcuts" => "Atalhos de teclado", +"Navigation" => "Navegação", +"Next contact in list" => "Próximo contacto na lista", +"Previous contact in list" => "Contacto anterior na lista", +"Expand/collapse current addressbook" => "Expandir/encolher o livro de endereços atual", +"Next addressbook" => "Próximo livro de endereços", +"Previous addressbook" => "Livro de endereços anterior", +"Actions" => "Ações", +"Refresh contacts list" => "Recarregar lista de contactos", +"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", +"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", +"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", +"Organization" => "Organização", +"Delete" => "Apagar", "Nickname" => "Alcunha", "Enter nickname" => "Introduza alcunha", -"Birthday" => "Aniversário", +"Web site" => "Página web", +"http://www.somesite.com" => "http://www.somesite.com", +"Go to web site" => "Ir para página web", "dd-mm-yyyy" => "dd-mm-aaaa", "Groups" => "Grupos", "Separate groups with commas" => "Separe os grupos usando virgulas", @@ -83,47 +149,76 @@ "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", -"Profile picture" => "Foto do perfil", "Phone" => "Telefone", +"Email" => "Email", +"Instant Messaging" => "Mensagens Instantâneas", +"Address" => "Morada", "Note" => "Nota", -"Delete current photo" => "Eliminar a foto actual", -"Edit current photo" => "Editar a foto actual", -"Select photo from ownCloud" => "Selecionar uma foto da ownCloud", +"Download contact" => "Transferir contacto", +"Delete contact" => "Apagar contato", +"The temporary image has been removed from cache." => "A imagem temporária foi retirada do cache.", "Edit address" => "Editar endereço", "Type" => "Tipo", "PO Box" => "Apartado", +"Street address" => "Endereço da Rua", +"Street and number" => "Rua e número", "Extended" => "Extendido", -"Street" => "Rua", +"Apartment number etc." => "Número de Apartamento, etc.", "City" => "Cidade", "Region" => "Região", +"E.g. state or province" => "Por Ex. Estado ou província", "Zipcode" => "Código Postal", +"Postal code" => "Código Postal", "Country" => "País", -"Edit categories" => "Editar categorias", -"Add" => "Adicionar", "Addressbook" => "Livro de endereços", +"Hon. prefixes" => "Prefixos honoráveis", +"Miss" => "Menina", "Ms" => "Sra", "Mr" => "Sr", "Sir" => "Sr", +"Mrs" => "Senhora", "Dr" => "Dr", +"Given name" => "Nome introduzido", "Additional names" => "Nomes adicionais", "Family name" => "Nome de familia", -"New Addressbook" => "Novo livro de endereços", -"Edit Addressbook" => "Editar livro de endereços", -"Displayname" => "Nome de exibição", -"Active" => "Ativo", -"Save" => "Guardar", -"Submit" => "Submeter", -"Cancel" => "Cancelar", +"Hon. suffixes" => "Sufixos Honoráveis", +"J.D." => "D.J.", +"M.D." => "D.M.", +"D.O." => "Dr.", +"D.C." => "Dr.", +"Ph.D." => "Dr.", +"Esq." => "Esq.", +"Jr." => "Jr.", +"Sn." => "r.", "Import a contacts file" => "Importar um ficheiro de contactos", "Please choose the addressbook" => "Por favor seleccione o livro de endereços", "create a new addressbook" => "Criar um novo livro de endereços", -"Import" => "Importar", +"Name of new addressbook" => "Nome do novo livro de endereços", "Importing contacts" => "A importar os contactos", +"You have no contacts in your addressbook." => "Não tem contactos no seu livro de endereços.", "Add contact" => "Adicionar contacto", +"Select Address Books" => "Selecionar Livros de contactos", +"Enter name" => "Introduzir nome", +"Enter description" => "Introduzir descrição", +"CardDAV syncing addresses" => "CardDAV a sincronizar endereços", "more info" => "mais informação", -"iOS/OS X" => "iOS/OS X" +"Primary address (Kontact et al)" => "Endereço primario (Kontact et al)", +"iOS/OS X" => "iOS/OS X", +"Show CardDav link" => "Mostrar ligação CardDAV", +"Show read-only VCF link" => "Mostrar ligações VCF só de leitura", +"Share" => "Partilhar", +"Download" => "Transferir", +"Edit" => "Editar", +"New Address Book" => "Novo livro de endereços", +"Name" => "Nome", +"Description" => "Descrição", +"Save" => "Guardar", +"Cancel" => "Cancelar", +"More..." => "Mais..." ); diff --git a/apps/contacts/l10n/ro.php b/apps/contacts/l10n/ro.php index 01609756718..291e8d54f7b 100644 --- a/apps/contacts/l10n/ro.php +++ b/apps/contacts/l10n/ro.php @@ -1,42 +1,31 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "(Dez)activarea agendei a întâmpinat o eroare.", -"There was an error adding the contact." => "O eroare a împiedicat adăugarea contactului.", -"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.", -"Error adding contact property." => "Contactul nu a putut fi adăugat.", +"id is not set." => "ID-ul nu este stabilit", +"Error updating addressbook." => "Eroare la actualizarea agendei.", "No ID provided" => "Nici un ID nu a fost furnizat", "Error setting checksum." => "Eroare la stabilirea sumei de control", "No categories selected for deletion." => "Nici o categorie selectată pentru ștergere", "No address books found." => "Nici o carte de adrese găsită", "No contacts found." => "Nici un contact găsit", +"There was an error adding the contact." => "O eroare a împiedicat adăugarea contactului.", +"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.", +"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:\"", -"Cannot add addressbook with an empty name." => "Nu e posibil de adăugat o carte de adrese fără nume", -"Error adding addressbook." => "Agenda nu a putut fi adăugată.", -"Error activating addressbook." => "Eroare la activarea agendei.", +"checksum is not set." => "suma de control nu este stabilită.", "No contact ID was submitted." => "Nici un ID de contact nu a fost transmis", "Error reading contact photo." => "Eroare la citerea fotografiei de contact", "Error saving temporary file." => "Eroare la salvarea fișierului temporar.", "The loading photo is not valid." => "Fotografia care se încarcă nu este validă.", -"id is not set." => "ID-ul 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.", -"Error deleting contact property." => "Eroare la ștergerea proprietăților contactului.", "Contact ID is missing." => "ID-ul de contact lipsește.", -"Missing contact id." => "ID de contact lipsă.", "No photo path was submitted." => "Nici o adresă către fotografie nu a fost transmisă", "File doesn't exist:" => "Fișierul nu există:", "Error loading image." => "Eroare la încărcarea imaginii.", -"element name is not set." => "numele elementului nu este stabilit.", -"checksum is not set." => "suma de control nu este stabilită.", -"Error updating contact property." => "Eroare la actualizarea proprietăților contactului.", -"Error updating addressbook." => "Eroare la actualizarea agendei.", "Contacts" => "Contacte", "This is not your addressbook." => "Nu se găsește în agendă.", "Contact could not be found." => "Contactul nu a putut fi găsit.", -"Address" => "Adresă", -"Telephone" => "Telefon", -"Email" => "Email", -"Organization" => "Organizație", "Work" => "Servicu", "Home" => "Acasă", "Mobile" => "Mobil", @@ -47,21 +36,16 @@ "Video" => "Video", "Pager" => "Pager", "Internet" => "Internet", +"Birthday" => "Zi de naștere", "{name}'s Birthday" => "Ziua de naștere a {name}", "Contact" => "Contact", "Add Contact" => "Adaugă contact", "Addressbooks" => "Agende", -"New Address Book" => "Agendă nouă", -"CardDav Link" => "Legătură CardDev", -"Download" => "Descarcă", -"Edit" => "Editează", -"Delete" => "Șterge", -"Download contact" => "Descarcă acest contact", -"Delete contact" => "Șterge contact", "Edit name details" => "Introdu detalii despre nume", +"Organization" => "Organizație", +"Delete" => "Șterge", "Nickname" => "Pseudonim", "Enter nickname" => "Introdu pseudonim", -"Birthday" => "Zi de naștere", "dd-mm-yyyy" => "zz-ll-aaaa", "Groups" => "Grupuri", "Separate groups with commas" => "Separă grupurile cu virgule", @@ -72,21 +56,21 @@ "Mail to address" => "Trimite mesaj la e-mail", "Delete email address" => "Șterge e-mail", "Phone" => "Telefon", +"Email" => "Email", +"Address" => "Adresă", +"Download contact" => "Descarcă acest contact", +"Delete contact" => "Șterge contact", "Type" => "Tip", "PO Box" => "CP", "Extended" => "Extins", -"Street" => "Stradă", "City" => "Oraș", "Region" => "Regiune", "Zipcode" => "Cod poștal", "Country" => "Țară", -"Add" => "Adaugă", "Addressbook" => "Agendă", -"New Addressbook" => "Agendă nouă", -"Edit Addressbook" => "Modifică agenda", -"Displayname" => "Nume afișat", -"Active" => "Activ", +"Download" => "Descarcă", +"Edit" => "Editează", +"New Address Book" => "Agendă nouă", "Save" => "Salvează", -"Submit" => "Trimite", "Cancel" => "Anulează" ); diff --git a/apps/contacts/l10n/ru.php b/apps/contacts/l10n/ru.php index 01a0e2642b9..010c4507f4e 100644 --- a/apps/contacts/l10n/ru.php +++ b/apps/contacts/l10n/ru.php @@ -1,34 +1,41 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "Ошибка (де)активации адресной книги.", -"There was an error adding the contact." => "Произошла ошибка при добавлении контакта.", -"Cannot add empty property." => "Невозможно добавить пустой параметр.", -"At least one of the address fields has to be filled out." => "Как минимум одно поле адреса должно быть заполнено.", -"Error adding contact property." => "Ошибка добавления информации к контакту.", +"id is not set." => "id не установлен.", +"Cannot update addressbook with an empty name." => "Нельзя обновить адресную книгу с пустым именем.", +"Error updating addressbook." => "Ошибка обновления адресной книги.", "No ID provided" => "ID не предоставлен", "Error setting checksum." => "Ошибка установки контрольной суммы.", "No categories selected for deletion." => "Категории для удаления не установлены.", "No address books found." => "Адресные книги не найдены.", "No contacts found." => "Контакты не найдены.", +"There was an error adding the contact." => "Произошла ошибка при добавлении контакта.", +"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: " => "При попытке добавить дубликат:", +"Unknown IM: " => "Неизвестный IM:", +"Information about vCard is incorrect. Please reload the page." => "Информация о vCard некорректна. Пожалуйста, обновите страницу.", "Missing ID" => "Отсутствует ID", "Error parsing VCard for ID: \"" => "Ошибка обработки VCard для ID: \"", -"Cannot add addressbook with an empty name." => "Нельзя добавить адресную книгу без имени.", -"Error adding addressbook." => "Ошибка добавления адресной книги.", -"Error activating addressbook." => "Ошибка активации адресной книги.", +"checksum is not set." => "контрольная сумма не установлена.", +"Information about vCard is incorrect. Please reload the page: " => "Информация о vCard не корректна. Перезагрузите страницу: ", +"Something went FUBAR. " => "Что-то пошло FUBAR.", +"No contact ID was submitted." => "Нет контакта ID", "Error reading contact photo." => "Ошибка чтения фотографии контакта.", "Error saving temporary file." => "Ошибка сохранения временного файла.", "The loading photo is not valid." => "Загружаемая фотография испорчена.", -"id is not set." => "id не установлен.", -"Information about vCard is incorrect. Please reload the page." => "Информация о vCard некорректна. Пожалуйста, обновите страницу.", -"Error deleting contact property." => "Ошибка удаления информации из контакта.", "Contact ID is missing." => "ID контакта отсутствует.", +"No photo path was submitted." => "Нет фото по адресу.", "File doesn't exist:" => "Файл не существует:", "Error loading image." => "Ошибка загрузки картинки.", -"element name is not set." => "имя элемента не установлено.", -"checksum is not set." => "контрольная сумма не установлена.", -"Information about vCard is incorrect. Please reload the page: " => "Информация о vCard не корректна. Перезагрузите страницу: ", -"Error updating contact property." => "Ошибка обновления информации контакта.", -"Cannot update addressbook with an empty name." => "Нельзя обновить адресную книгу с пустым именем.", -"Error updating addressbook." => "Ошибка обновления адресной книги.", +"Error getting contact object." => "Ошибка при получении контактов", +"Error getting PHOTO property." => "Ошибка при получении ФОТО.", +"Error saving contact." => "Ошибка при сохранении контактов.", +"Error resizing image" => "Ошибка изменения размера изображений", +"Error cropping image" => "Ошибка обрезки изображений", +"Error creating temporary image" => "Ошибка создания временных изображений", +"Error finding image: " => "Ошибка поиска изображений:", "Error uploading contacts to storage." => "Ошибка загрузки контактов в хранилище.", "There is no error, the file uploaded with success" => "Файл загружен успешно.", "The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Загружаемый файл первосходит значение переменной upload_max_filesize, установленно в php.ini", @@ -36,16 +43,46 @@ "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" => "Контакты", -"Addressbook not found." => "Адресная книга не найдена.", +"Sorry, this functionality has not been implemented yet" => "К сожалению, эта функция не была реализована", +"Not implemented" => "Не реализовано", +"Couldn't get a valid address." => "Не удалось получить адрес.", +"Error" => "Ошибка", +"This property has to be non-empty." => "Это свойство должно быть не пустым.", +"Couldn't serialize elements." => "Не удалось сериализовать элементы.", +"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' called without type argument. Please report at 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." => "Ошибка загрузки изображения профиля.", +"Select type" => "Выберите тип", +"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Некоторые контакты помечены на удаление, но ещё не удалены. Подождите, пока они удаляются.", +"Do you want to merge these address books?" => "Вы хотите соединить эти адресные книги?", +"Result: " => "Результат:", +" imported, " => "импортировано, ", +" failed." => "не удалось.", +"Displayname cannot be empty." => "Отображаемое имя не может быть пустым.", +"Addressbook not found: " => "Адресная книга не найдена:", "This is not your addressbook." => "Это не ваша адресная книга.", "Contact could not be found." => "Контакт не найден.", -"Address" => "Адрес", -"Telephone" => "Телефон", -"Email" => "Ящик эл. почты", -"Organization" => "Организация", +"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" => "Текст", "Voice" => "Голос", @@ -54,25 +91,54 @@ "Video" => "Видео", "Pager" => "Пейджер", "Internet" => "Интернет", +"Birthday" => "День рождения", +"Business" => "Бизнес", +"Call" => "Вызов", +"Clients" => "Клиенты", +"Holidays" => "Праздники", +"Ideas" => "Идеи", +"Journey" => "Поездка", +"Jubilee" => "Юбилей", +"Meeting" => "Встреча", +"Personal" => "Личный", +"Projects" => "Проекты", +"Questions" => "Вопросы", "{name}'s Birthday" => "День рождения {name}", "Contact" => "Контакт", "Add Contact" => "Добавить Контакт", +"Import" => "Импорт", +"Settings" => "Настройки", "Addressbooks" => "Адресные книги", -"Configure Address Books" => "Настроить Адресную книгу", -"New Address Book" => "Новая адресная книга", -"Import from VCF" => "Импортировать из VCF", -"CardDav Link" => "Ссылка CardDAV", -"Download" => "Скачать", -"Edit" => "Редактировать", -"Delete" => "Удалить", -"Download contact" => "Скачать контакт", -"Delete contact" => "Удалить контакт", +"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" => "Удалить текущий контакт", "Drop photo to upload" => "Перетяните фотографии для загрузки", +"Delete current photo" => "Удалить текущую фотографию", +"Edit current photo" => "Редактировать текущую фотографию", +"Upload new photo" => "Загрузить новую фотографию", +"Select photo from ownCloud" => "Выбрать фотографию из ownCloud", +"Format custom, Short name, Full name, Reverse or Reverse with comma" => "Формат Краткое имя, Полное имя", +"Edit name details" => "Изменить детали имени", +"Organization" => "Организация", +"Delete" => "Удалить", "Nickname" => "Псевдоним", "Enter nickname" => "Введите псевдоним", -"Birthday" => "День рождения", +"Web site" => "Веб-сайт", +"http://www.somesite.com" => "http://www.somesite.com", +"Go to web site" => "Перейти на веб-сайт", "dd-mm-yyyy" => "dd-mm-yyyy", "Groups" => "Группы", +"Separate groups with commas" => "Разделить группы запятыми", "Edit groups" => "Редактировать группы", "Preferred" => "Предпочитаемый", "Please specify a valid email address." => "Укажите действительный адрес электронной почты.", @@ -81,47 +147,71 @@ "Delete email address" => "Удалить адрес электронной почты", "Enter phone number" => "Ввести номер телефона", "Delete phone number" => "Удалить номер телефона", +"Delete IM" => "Удалить IM", "View on map" => "Показать на карте", "Edit address details" => "Ввести детали адреса", "Add notes here." => "Добавьте заметки здесь.", "Add field" => "Добавить поле", -"Profile picture" => "Фото профиля", "Phone" => "Телефон", +"Email" => "Ящик эл. почты", +"Address" => "Адрес", "Note" => "Заметка", -"Delete current photo" => "Удалить текущую фотографию", -"Edit current photo" => "Редактировать текущую фотографию", -"Upload new photo" => "Загрузить новую фотографию", -"Select photo from ownCloud" => "Выбрать фотографию из ownCloud", +"Download contact" => "Скачать контакт", +"Delete contact" => "Удалить контакт", +"The temporary image has been removed from cache." => "Временный образ был удален из кэша.", "Edit address" => "Редактировать адрес", "Type" => "Тип", "PO Box" => "АО", +"Street address" => "Улица", +"Street and number" => "Улица и дом", "Extended" => "Расширенный", -"Street" => "Улица", +"Apartment number etc." => "Номер квартиры и т.д.", "City" => "Город", "Region" => "Область", +"E.g. state or province" => "Например, область или район", "Zipcode" => "Почтовый индекс", +"Postal code" => "Почтовый индекс", "Country" => "Страна", -"Edit categories" => "Редактировать категрии", -"Add" => "Добавить", "Addressbook" => "Адресная книга", +"Hon. prefixes" => "Уважительные префиксы", +"Miss" => "Мисс", +"Ms" => "Г-жа", +"Mr" => "Г-н", +"Sir" => "Сэр", +"Mrs" => "Г-жа", +"Dr" => "Доктор", "Given name" => "Имя", "Additional names" => "Дополнительные имена (отчество)", "Family name" => "Фамилия", -"New Addressbook" => "Новая адресная книга", -"Edit Addressbook" => "Редактировать адресную книгу", -"Displayname" => "Отображаемое имя", -"Active" => "Активно", -"Save" => "Сохранить", -"Submit" => "Отправить", -"Cancel" => "Отменить", +"Hon. suffixes" => "Hon. suffixes", +"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" => "Имя новой адресной книги", -"Import" => "Импорт", "Importing contacts" => "Импорт контактов", -"You have no contacts in your addressbook." => "В адресной книге есть контакты.", +"You have no contacts in your addressbook." => "В адресной книге нет контактов.", "Add contact" => "Добавить контакт", -"Configure addressbooks" => "Настроить адресную книгу", -"more info" => "дополнительная информация" +"Select Address Books" => "Выбрать адресную книгу", +"Enter name" => "Введите имя", +"Enter description" => "Ввдите описание", +"CardDAV syncing addresses" => "CardDAV синхронизации адресов", +"more info" => "дополнительная информация", +"Primary address (Kontact et al)" => "Первичный адрес (Kontact и др.)", +"iOS/OS X" => "iOS/OS X", +"Download" => "Скачать", +"Edit" => "Редактировать", +"New Address Book" => "Новая адресная книга", +"Name" => "Имя", +"Description" => "Описание", +"Save" => "Сохранить", +"Cancel" => "Отменить", +"More..." => "Ещё..." ); diff --git a/apps/contacts/l10n/sk_SK.php b/apps/contacts/l10n/sk_SK.php index 6e5ebe3bd3c..54ae324d93c 100644 --- a/apps/contacts/l10n/sk_SK.php +++ b/apps/contacts/l10n/sk_SK.php @@ -1,39 +1,39 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "Chyba (de)aktivácie adresára.", -"There was an error adding the contact." => "Vyskytla sa chyba pri pridávaní kontaktu.", -"Cannot add empty property." => "Nemôžem pridať prázdny údaj.", -"At least one of the address fields has to be filled out." => "Musí byť uvedený aspoň jeden adresný údaj.", -"Trying to add duplicate property: " => "Pokúšate sa pridať rovnaký atribút:", -"Error adding contact property." => "Chyba pridania údaju kontaktu", +"id is not set." => "ID nie je nastavené.", +"Cannot update addressbook with an empty name." => "Nedá sa upraviť adresár s prázdnym menom.", +"Error updating addressbook." => "Chyba aktualizácie adresára.", "No ID provided" => "ID nezadané", "Error setting checksum." => "Chyba pri nastavovaní kontrolného súčtu.", "No categories selected for deletion." => "Žiadne kategórie neboli vybraté na odstránenie.", "No address books found." => "Žiadny adresár nenájdený.", "No contacts found." => "Žiadne kontakty nenájdené.", +"There was an error adding the contact." => "Vyskytla sa chyba pri pridávaní kontaktu.", +"element name is not set." => "meno elementu nie je nastavené.", +"Cannot add empty property." => "Nemôžem pridať prázdny údaj.", +"At least one of the address fields has to be filled out." => "Musí byť uvedený aspoň jeden adresný údaj.", +"Trying to add duplicate property: " => "Pokúšate sa pridať rovnaký atribút:", +"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:", -"Cannot add addressbook with an empty name." => "Nedá sa pridať adresár s prázdnym menom.", -"Error adding addressbook." => "Chyba počas pridávania adresára.", -"Error activating addressbook." => "Chyba aktivovania adresára.", +"checksum is not set." => "kontrolný súčet nie je nastavený.", +"Information about vCard is incorrect. Please reload the page: " => "Informácia o vCard je nesprávna. Obnovte stránku, prosím.", +"Something went FUBAR. " => "Niečo sa pokazilo.", "No contact ID was submitted." => "Nebolo nastavené ID kontaktu.", "Error reading contact photo." => "Chyba pri čítaní fotky kontaktu.", "Error saving temporary file." => "Chyba pri ukladaní dočasného súboru.", "The loading photo is not valid." => "Načítaná fotka je vadná.", -"id is not set." => "ID nie je nastavené.", -"Information about vCard is incorrect. Please reload the page." => "Informácie o vCard sú neplatné. Prosím obnovte stránku.", -"Error deleting contact property." => "Chyba odstránenia údaju kontaktu.", "Contact ID is missing." => "Chýba ID kontaktu.", -"Missing contact id." => "Chýba ID kontaktu.", "No photo path was submitted." => "Žiadna fotka nebola poslaná.", "File doesn't exist:" => "Súbor neexistuje:", "Error loading image." => "Chyba pri nahrávaní obrázka.", -"element name is not set." => "meno elementu nie je nastavené.", -"checksum is not set." => "kontrolný súčet nie je nastavený.", -"Information about vCard is incorrect. Please reload the page: " => "Informácia o vCard je nesprávna. Obnovte stránku, prosím.", -"Something went FUBAR. " => "Niečo sa pokazilo.", -"Error updating contact property." => "Chyba aktualizovania údaju kontaktu.", -"Cannot update addressbook with an empty name." => "Nedá sa upraviť adresár s prázdnym menom.", -"Error updating addressbook." => "Chyba aktualizácie adresára.", +"Error getting contact object." => "Chyba počas prevzatia objektu kontakt.", +"Error getting PHOTO property." => "Chyba počas získavania fotky.", +"Error saving contact." => "Chyba počas ukladania kontaktu.", +"Error resizing image" => "Chyba počas zmeny obrázku.", +"Error cropping image" => "Chyba počas orezania obrázku.", +"Error creating temporary image" => "Chyba počas vytvárania dočasného obrázku.", +"Error finding image: " => "Chyba vyhľadania obrázku: ", "Error uploading contacts to storage." => "Chyba pri ukladaní kontaktov na úložisko.", "There is no error, the file uploaded with success" => "Nevyskytla sa žiadna chyba, súbor úspešne uložené.", "The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Ukladaný súbor prekračuje nastavenie upload_max_filesize v php.ini", @@ -41,17 +41,29 @@ "The uploaded file was only partially uploaded" => "Ukladaný súbor sa nahral len čiastočne", "No file was uploaded" => "Žiadny súbor nebol uložený", "Missing a temporary folder" => "Chýba dočasný priečinok", +"Couldn't save temporary image: " => "Nemôžem uložiť dočasný obrázok: ", +"Couldn't load temporary image: " => "Nemôžem načítať dočasný obrázok: ", +"No file was uploaded. Unknown error" => "Žiaden súbor nebol odoslaný. Neznáma chyba", "Contacts" => "Kontakty", -"Drop a VCF file to import contacts." => "Pretiahnite VCF súbor pre import kontaktov.", -"Addressbook not found." => "Adresár sa nenašiel.", +"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", +"This property has to be non-empty." => "Tento parameter nemôže byť prázdny.", +"Couldn't serialize elements." => "Nemôžem previesť prvky.", +"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' zavolané bez argument. Prosím oznámte chybu na bugs.owncloud.org", +"Edit name" => "Upraviť meno", +"No files selected for upload." => "Žiadne súbory neboli vybrané k nahratiu", +"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Súbor, ktorý sa pokúšate nahrať, presahuje maximálnu povolenú veľkosť.", +"Select type" => "Vybrať typ", +"Result: " => "Výsledok: ", +" imported, " => " importovaných, ", +" failed." => " zlyhaných.", "This is not your addressbook." => "Toto nie je váš adresár.", "Contact could not be found." => "Kontakt nebol nájdený.", -"Address" => "Adresa", -"Telephone" => "Telefón", -"Email" => "E-mail", -"Organization" => "Organizácia", "Work" => "Práca", "Home" => "Domov", +"Other" => "Iné", "Mobile" => "Mobil", "Text" => "SMS", "Voice" => "Odkazová schránka", @@ -60,25 +72,39 @@ "Video" => "Video", "Pager" => "Pager", "Internet" => "Internet", +"Birthday" => "Narodeniny", +"Business" => "Biznis", +"Clients" => "Klienti", +"Holidays" => "Prázdniny", +"Meeting" => "Stretnutie", +"Projects" => "Projekty", +"Questions" => "Otázky", "{name}'s Birthday" => "Narodeniny {name}", "Contact" => "Kontakt", "Add Contact" => "Pridať Kontakt.", +"Import" => "Importovať", "Addressbooks" => "Adresáre", -"Configure Address Books" => "Nastaviť adresáre", -"New Address Book" => "Nový adresár", -"Import from VCF" => "Importovať z VCF", -"CardDav Link" => "CardDav odkaz", -"Download" => "Stiahnuť", -"Edit" => "Upraviť", -"Delete" => "Odstrániť", -"Download contact" => "Stiahnuť kontakt", -"Delete contact" => "Odstrániť kontakt", +"Close" => "Zatvoriť", +"Keyboard shortcuts" => "Klávesové skratky", +"Navigation" => "Navigácia", +"Next contact in list" => "Ďalší kontakt v zozname", +"Previous contact in list" => "Predchádzajúci kontakt v zozname", +"Actions" => "Akcie", +"Refresh contacts list" => "Obnov zoznam kontaktov", +"Add new contact" => "Pridaj nový kontakt", +"Add new addressbook" => "Pridaj nový adresár", +"Delete current contact" => "Vymaž súčasný kontakt", "Drop photo to upload" => "Pretiahnite sem fotku pre nahratie", +"Delete current photo" => "Odstrániť súčasnú fotku", +"Edit current photo" => "Upraviť súčasnú fotku", +"Upload new photo" => "Nahrať novú fotku", +"Select photo from ownCloud" => "Vybrať fotku z ownCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formát vlastný, krátke meno, celé meno, obrátené alebo obrátené s čiarkami", "Edit name details" => "Upraviť podrobnosti mena", +"Organization" => "Organizácia", +"Delete" => "Odstrániť", "Nickname" => "Prezývka", "Enter nickname" => "Zadajte prezývku", -"Birthday" => "Narodeniny", "dd-mm-yyyy" => "dd. mm. yyyy", "Groups" => "Skupiny", "Separate groups with commas" => "Oddelte skupiny čiarkami", @@ -94,24 +120,24 @@ "Edit address details" => "Upraviť podrobnosti adresy", "Add notes here." => "Tu môžete pridať poznámky.", "Add field" => "Pridať pole", -"Profile picture" => "Profilová fotka", "Phone" => "Telefón", +"Email" => "E-mail", +"Address" => "Adresa", "Note" => "Poznámka", -"Delete current photo" => "Odstrániť súčasnú fotku", -"Edit current photo" => "Upraviť súčasnú fotku", -"Upload new photo" => "Nahrať novú fotku", -"Select photo from ownCloud" => "Vybrať fotku z ownCloud", +"Download contact" => "Stiahnuť kontakt", +"Delete contact" => "Odstrániť kontakt", +"The temporary image has been removed from cache." => "Dočasný obrázok bol odstránený z cache.", "Edit address" => "Upraviť adresu", "Type" => "Typ", "PO Box" => "PO Box", +"Street address" => "Ulica", +"Street and number" => "Ulica a číslo", "Extended" => "Rozšírené", -"Street" => "Ulica", "City" => "Mesto", "Region" => "Región", "Zipcode" => "PSČ", +"Postal code" => "PSČ", "Country" => "Krajina", -"Edit categories" => "Upraviť kategórie", -"Add" => "Pridať", "Addressbook" => "Adresár", "Hon. prefixes" => "Tituly pred", "Miss" => "Slečna", @@ -126,30 +152,33 @@ "Hon. suffixes" => "Tituly za", "J.D." => "JUDr.", "M.D." => "MUDr.", +"D.O." => "D.O.", +"D.C." => "D.C.", "Ph.D." => "Ph.D.", "Esq." => "Esq.", "Jr." => "ml.", "Sn." => "st.", -"New Addressbook" => "Nový Adresár", -"Edit Addressbook" => "Upraviť Adresár", -"Displayname" => "Zobrazené meno", -"Active" => "Aktívny", -"Save" => "Uložiť", -"Submit" => "Odoslať", -"Cancel" => "Zrušiť", "Import a contacts file" => "Importovať súbor kontaktu", "Please choose the addressbook" => "Prosím zvolte adresár", "create a new addressbook" => "vytvoriť nový adresár", "Name of new addressbook" => "Meno nového adresára", -"Import" => "Importovať", "Importing contacts" => "Importovanie kontaktov", +"Contacts imported successfully" => "Kontakty úspešne importované", +"Close Dialog" => "Zatvoriť ponuku", +"Import Addressbook" => "Importovanie adresára", "Select address book to import to:" => "Vyberte adresár, do ktorého chcete importovať:", +"Drop a VCF file to import contacts." => "Pretiahnite VCF súbor pre import kontaktov.", "Select from HD" => "Vyberte z pevného disku", "You have no contacts in your addressbook." => "Nemáte žiadne kontakty v adresári.", "Add contact" => "Pridať kontakt", -"Configure addressbooks" => "Nastaviť adresáre", +"Enter name" => "Zadaj meno", "CardDAV syncing addresses" => "Adresy pre synchronizáciu s CardDAV", "more info" => "viac informácií", "Primary address (Kontact et al)" => "Predvolená adresa (Kontakt etc)", -"iOS/OS X" => "iOS/OS X" +"iOS/OS X" => "iOS/OS X", +"Download" => "Stiahnuť", +"Edit" => "Upraviť", +"New Address Book" => "Nový adresár", +"Save" => "Uložiť", +"Cancel" => "Zrušiť" ); diff --git a/apps/contacts/l10n/sl.php b/apps/contacts/l10n/sl.php index bfba23fabcf..e404b7a5e94 100644 --- a/apps/contacts/l10n/sl.php +++ b/apps/contacts/l10n/sl.php @@ -1,39 +1,42 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "Napaka med (de)aktivacijo imenika.", -"There was an error adding the contact." => "Med dodajanjem stika je prišlo do napake", -"Cannot add empty property." => "Ne morem dodati prazne lastnosti.", -"At least one of the address fields has to be filled out." => "Vsaj eno izmed polj je še potrebno izpolniti.", -"Trying to add duplicate property: " => "Poskušam dodati podvojeno lastnost:", -"Error adding contact property." => "Napaka pri dodajanju informacije o stiku.", +"id is not set." => "id ni nastavljen.", +"Cannot update addressbook with an empty name." => "Ne morem posodobiti imenika s praznim imenom.", +"Error updating addressbook." => "Napaka pri posodabljanju imenika.", "No ID provided" => "ID ni bil podan", "Error setting checksum." => "Napaka pri nastavljanju nadzorne vsote.", "No categories selected for deletion." => "Nobena kategorija ni bila izbrana za izbris.", "No address books found." => "Ni bilo najdenih imenikov.", "No contacts found." => "Ni bilo najdenih stikov.", +"There was an error adding the contact." => "Med dodajanjem stika je prišlo do napake", +"element name is not set." => "ime elementa ni nastavljeno.", +"Could not parse contact: " => "Ne morem razčleniti stika:", +"Cannot add empty property." => "Ne morem dodati prazne lastnosti.", +"At least one of the address fields has to be filled out." => "Vsaj eno izmed polj je še potrebno izpolniti.", +"Trying to add duplicate property: " => "Poskušam dodati podvojeno lastnost:", +"Missing IM parameter." => "Manjkajoč IM parameter.", +"Unknown IM: " => "Neznan IM:", +"Information about vCard is incorrect. Please reload the page." => "Informacije o vCard niso pravilne. Prosimo, če ponovno naložite stran.", "Missing ID" => "Manjkajoč ID", "Error parsing VCard for ID: \"" => "Napaka pri razčlenjevanju VCard za ID: \"", -"Cannot add addressbook with an empty name." => "Ne morem dodati imenika s praznim imenom.", -"Error adding addressbook." => "Napaka pri dodajanju imenika.", -"Error activating addressbook." => "Napaka pri aktiviranju imenika.", +"checksum is not set." => "nadzorna vsota ni nastavljena.", +"Information about vCard is incorrect. Please reload the page: " => "Informacija o vCard je napačna. Prosimo, če ponovno naložite stran: ", +"Something went FUBAR. " => "Nekaj je šlo v franže. ", "No contact ID was submitted." => "ID stika ni bil poslan.", "Error reading contact photo." => "Napaka pri branju slike stika.", "Error saving temporary file." => "Napaka pri shranjevanju začasne datoteke.", "The loading photo is not valid." => "Slika, ki se nalaga ni veljavna.", -"id is not set." => "id ni nastavljen.", -"Information about vCard is incorrect. Please reload the page." => "Informacije o vCard niso pravilne. Prosimo, če ponovno naložite stran.", -"Error deleting contact property." => "Napaka pri brisanju lastnosti stika.", "Contact ID is missing." => "Manjka ID stika.", -"Missing contact id." => "Manjka id stika.", "No photo path was submitted." => "Pot slike ni bila poslana.", "File doesn't exist:" => "Datoteka ne obstaja:", "Error loading image." => "Napaka pri nalaganju slike.", -"element name is not set." => "ime elementa ni nastavljeno.", -"checksum is not set." => "nadzorna vsota ni nastavljena.", -"Information about vCard is incorrect. Please reload the page: " => "Informacija o vCard je napačna. Prosimo, če ponovno naložite stran: ", -"Something went FUBAR. " => "Nekaj je šlo v franže. ", -"Error updating contact property." => "Napaka pri posodabljanju lastnosti stika.", -"Cannot update addressbook with an empty name." => "Ne morem posodobiti imenika s praznim imenom.", -"Error updating addressbook." => "Napaka pri posodabljanju imenika.", +"Error getting contact object." => "Napaka pri pridobivanju kontakta predmeta.", +"Error getting PHOTO property." => "Napaka pri pridobivanju lastnosti fotografije.", +"Error saving contact." => "Napaka pri shranjevanju stika.", +"Error resizing image" => "Napaka pri spreminjanju velikosti slike", +"Error cropping image" => "Napaka pri obrezovanju slike", +"Error creating temporary image" => "Napaka pri ustvarjanju začasne slike", +"Error finding image: " => "Napaka pri iskanju datoteke: ", "Error uploading contacts to storage." => "Napaka pri nalaganju stikov v hrambo.", "There is no error, the file uploaded with success" => "Datoteka je bila uspešno naložena.", "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", @@ -41,17 +44,46 @@ "The uploaded file was only partially uploaded" => "Datoteka je bila le delno naložena", "No file was uploaded" => "Nobena datoteka ni bila naložena", "Missing a temporary folder" => "Manjka začasna mapa", +"Couldn't save temporary image: " => "Začasne slike ni bilo mogoče shraniti: ", +"Couldn't load temporary image: " => "Začasne slike ni bilo mogoče naložiti: ", +"No file was uploaded. Unknown error" => "Nobena datoteka ni bila naložena. Neznana napaka", "Contacts" => "Stiki", -"Drop a VCF file to import contacts." => "Za uvoz stikov spustite VCF datoteko tukaj.", -"Addressbook not found." => "Imenik ni bil najden.", +"Sorry, this functionality has not been implemented yet" => "Žal ta funkcionalnost še ni podprta", +"Not implemented" => "Ni podprto", +"Couldn't get a valid address." => "Ne morem dobiti veljavnega naslova.", +"Error" => "Napaka", +"This property has to be non-empty." => "Ta lastnost ne sme biti prazna", +"Couldn't serialize elements." => "Predmetov ni bilo mogoče dati v zaporedje.", +"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "\"deleteProperty\" je bila klicana brez vrste argumenta. Prosimo, če oddate poročilo o napaki na bugs.owncloud.org", +"Edit name" => "Uredi ime", +"No files selected for upload." => "Nobena datoteka ni bila izbrana 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 nalaganje na tem strežniku.", +"Error loading profile picture." => "Napaka pri nalaganju slike profila.", +"Select type" => "Izberite vrsto", +"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. Prosimo, če počakate na njihov izbris.", +"Do you want to merge these address books?" => "Ali želite združiti adresarje?", +"Result: " => "Rezultati: ", +" imported, " => " uvoženih, ", +" failed." => " je spodletelo.", +"Displayname cannot be empty." => "Ime za prikaz ne more biti prazno.", +"Addressbook not found: " => "Adresar ni bil najden:", "This is not your addressbook." => "To ni vaš imenik.", "Contact could not be found." => "Stika ni bilo mogoče najti.", -"Address" => "Naslov", -"Telephone" => "Telefon", -"Email" => "E-pošta", -"Organization" => "Organizacija", +"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" => "Delo", "Home" => "Doma", +"Other" => "Drugo", "Mobile" => "Mobilni telefon", "Text" => "Besedilo", "Voice" => "Glas", @@ -60,25 +92,52 @@ "Video" => "Video", "Pager" => "Pozivnik", "Internet" => "Internet", +"Birthday" => "Rojstni dan", +"Business" => "Poslovno", +"Call" => "Klic", +"Clients" => "Stranka", +"Deliverer" => "Dostavljalec", +"Holidays" => "Prazniki", +"Ideas" => "Ideje", +"Journey" => "Potovanje", +"Jubilee" => "Jubilej", +"Meeting" => "Sestanek", +"Personal" => "Osebno", +"Projects" => "Projekti", +"Questions" => "Vprašanja", "{name}'s Birthday" => "{name} - rojstni dan", "Contact" => "Stik", "Add Contact" => "Dodaj stik", +"Import" => "Uvozi", +"Settings" => "Nastavitve", "Addressbooks" => "Imeniki", -"Configure Address Books" => "Nastavi imenike", -"New Address Book" => "Nov imenik", -"Import from VCF" => "Uvozi iz VCF", -"CardDav Link" => "CardDav povezava", -"Download" => "Prenesi", -"Edit" => "Uredi", -"Delete" => "Izbriši", -"Download contact" => "Prenesi stik", -"Delete contact" => "Izbriši stik", +"Close" => "Zapri", +"Keyboard shortcuts" => "Bližnjice na tipkovnici", +"Navigation" => "Krmarjenje", +"Next contact in list" => "Naslednji stik na seznamu", +"Previous contact in list" => "Predhodni stik na seznamu", +"Expand/collapse current addressbook" => "Razširi/skrči trenutni adresar", +"Next addressbook" => "Naslednji adresar", +"Previous addressbook" => "Predhodni adresar", +"Actions" => "Dejanja", +"Refresh contacts list" => "Osveži seznam stikov", +"Add new contact" => "Dodaj nov stik", +"Add new addressbook" => "Dodaj nov adresar", +"Delete current contact" => "Izbriši trenutni stik", "Drop photo to upload" => "Spustite sliko tukaj, da bi jo naložili", +"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", "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" => "Uredite podrobnosti imena", +"Organization" => "Organizacija", +"Delete" => "Izbriši", "Nickname" => "Vzdevek", "Enter nickname" => "Vnesite vzdevek", -"Birthday" => "Rojstni dan", +"Web site" => "Spletna stran", +"http://www.somesite.com" => "http://www.nekastran.si", +"Go to web site" => "Pojdi na spletno stran", "dd-mm-yyyy" => "dd. mm. yyyy", "Groups" => "Skupine", "Separate groups with commas" => "Skupine ločite z vejicami", @@ -90,28 +149,33 @@ "Delete email address" => "Izbriši e-poštni naslov", "Enter phone number" => "Vpiši telefonsko številko", "Delete phone number" => "Izbriši telefonsko številko", +"Instant Messenger" => "Takojšni sporočilnik", +"Delete IM" => "Izbriši IM", "View on map" => "Prikaz na zemljevidu", "Edit address details" => "Uredi podrobnosti", "Add notes here." => "Opombe dodajte tukaj.", "Add field" => "Dodaj polje", -"Profile picture" => "Slika profila", "Phone" => "Telefon", +"Email" => "E-pošta", +"Instant Messaging" => "Neposredno sporočanje", +"Address" => "Naslov", "Note" => "Opomba", -"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", +"Download contact" => "Prenesi stik", +"Delete contact" => "Izbriši stik", +"The temporary image has been removed from cache." => "Začasna slika je bila odstranjena iz predpomnilnika.", "Edit address" => "Uredi naslov", "Type" => "Vrsta", "PO Box" => "Poštni predal", +"Street address" => "Ulični naslov", +"Street and number" => "Ulica in štelika", "Extended" => "Razširjeno", -"Street" => "Ulica", +"Apartment number etc." => "Številka stanovanja itd.", "City" => "Mesto", "Region" => "Regija", +"E.g. state or province" => "Npr. dežela ali pokrajina", "Zipcode" => "Poštna št.", +"Postal code" => "Poštna številka", "Country" => "Dežela", -"Edit categories" => "Uredi kategorije", -"Add" => "Dodaj", "Addressbook" => "Imenik", "Hon. prefixes" => "Predpone", "Miss" => "gdč.", @@ -132,26 +196,35 @@ "Esq." => "Esq.", "Jr." => "mlajši", "Sn." => "starejši", -"New Addressbook" => "Nov imenik", -"Edit Addressbook" => "Uredi imenik", -"Displayname" => "Ime za prikaz", -"Active" => "Aktiven", -"Save" => "Shrani", -"Submit" => "Potrdi", -"Cancel" => "Prekliči", "Import a contacts file" => "Uvozi datoteko s stiki", "Please choose the addressbook" => "Prosimo, če izberete imenik", "create a new addressbook" => "Ustvari nov imenik", "Name of new addressbook" => "Ime novega imenika", -"Import" => "Uvozi", "Importing contacts" => "Uvažam stike", +"Contacts imported successfully" => "Stiki so bili uspešno uvoženi", +"Close Dialog" => "Zapri dialog", +"Import Addressbook" => "Uvozi imenik", "Select address book to import to:" => "Izberite imenik v katerega boste uvažali:", +"Drop a VCF file to import contacts." => "Za uvoz stikov spustite VCF datoteko tukaj.", "Select from HD" => "Izberi iz HD", "You have no contacts in your addressbook." => "V vašem imeniku ni stikov.", "Add contact" => "Dodaj stik", -"Configure addressbooks" => "Nastavi imenike", +"Select Address Books" => "Izberite adresarje", +"Enter name" => "Vnesite ime", +"Enter description" => "Vnesite opis", "CardDAV syncing addresses" => "CardDAV naslovi za sinhronizacijo", "more info" => "več informacij", "Primary address (Kontact et al)" => "Primarni naslov (za kontakt et al)", -"iOS/OS X" => "iOS/OS X" +"iOS/OS X" => "iOS/OS X", +"Show CardDav link" => "Pokaži CardDav povezavo", +"Show read-only VCF link" => "Pokaži VCF povezavo samo za branje", +"Share" => "Souporaba", +"Download" => "Prenesi", +"Edit" => "Uredi", +"New Address Book" => "Nov imenik", +"Name" => "Ime", +"Description" => "Opis", +"Save" => "Shrani", +"Cancel" => "Prekliči", +"More..." => "Več..." ); diff --git a/apps/contacts/l10n/sr.php b/apps/contacts/l10n/sr.php index aad88f3603c..f54741c182f 100644 --- a/apps/contacts/l10n/sr.php +++ b/apps/contacts/l10n/sr.php @@ -3,10 +3,6 @@ "Contacts" => "Контакти", "This is not your addressbook." => "Ово није ваш адресар.", "Contact could not be found." => "Контакт се не може наћи.", -"Address" => "Адреса", -"Telephone" => "Телефон", -"Email" => "Е-маил", -"Organization" => "Организација", "Work" => "Посао", "Home" => "Кућа", "Mobile" => "Мобилни", @@ -15,33 +11,29 @@ "Fax" => "Факс", "Video" => "Видео", "Pager" => "Пејџер", +"Birthday" => "Рођендан", "Contact" => "Контакт", "Add Contact" => "Додај контакт", "Addressbooks" => "Адресар", -"New Address Book" => "Нови адресар", -"Download" => "Преузимање", -"Edit" => "Уреди", +"Organization" => "Организација", "Delete" => "Обриши", -"Download contact" => "Преузми контакт", -"Delete contact" => "Обриши контакт", -"Birthday" => "Рођендан", "Preferred" => "Пожељан", "Phone" => "Телефон", +"Email" => "Е-маил", +"Address" => "Адреса", +"Download contact" => "Преузми контакт", +"Delete contact" => "Обриши контакт", "Type" => "Тип", "PO Box" => "Поштански број", "Extended" => "Прошири", -"Street" => "Улица", "City" => "Град", "Region" => "Регија", "Zipcode" => "Зип код", "Country" => "Земља", -"Add" => "Додај", "Addressbook" => "Адресар", -"New Addressbook" => "Нови адресар", -"Edit Addressbook" => "Уреди адресар", -"Displayname" => "Приказано име", -"Active" => "Активан", +"Download" => "Преузимање", +"Edit" => "Уреди", +"New Address Book" => "Нови адресар", "Save" => "Сними", -"Submit" => "Пошаљи", "Cancel" => "Откажи" ); diff --git a/apps/contacts/l10n/sr@latin.php b/apps/contacts/l10n/sr@latin.php index a76c1047907..f06539ab43e 100644 --- a/apps/contacts/l10n/sr@latin.php +++ b/apps/contacts/l10n/sr@latin.php @@ -2,10 +2,6 @@ "Information about vCard is incorrect. Please reload the page." => "Podaci o vKarti su neispravni. Ponovo učitajte stranicu.", "This is not your addressbook." => "Ovo nije vaš adresar.", "Contact could not be found." => "Kontakt se ne može naći.", -"Address" => "Adresa", -"Telephone" => "Telefon", -"Email" => "E-mail", -"Organization" => "Organizacija", "Work" => "Posao", "Home" => "Kuća", "Mobile" => "Mobilni", @@ -14,16 +10,18 @@ "Fax" => "Faks", "Video" => "Video", "Pager" => "Pejdžer", +"Birthday" => "Rođendan", "Add Contact" => "Dodaj kontakt", -"Edit" => "Uredi", +"Organization" => "Organizacija", "Delete" => "Obriši", -"Birthday" => "Rođendan", "Phone" => "Telefon", +"Email" => "E-mail", +"Address" => "Adresa", "PO Box" => "Poštanski broj", "Extended" => "Proširi", -"Street" => "Ulica", "City" => "Grad", "Region" => "Regija", "Zipcode" => "Zip kod", -"Country" => "Zemlja" +"Country" => "Zemlja", +"Edit" => "Uredi" ); diff --git a/apps/contacts/l10n/sv.php b/apps/contacts/l10n/sv.php index 8d5d37d2484..a7721753b4b 100644 --- a/apps/contacts/l10n/sv.php +++ b/apps/contacts/l10n/sv.php @@ -1,35 +1,42 @@ <?php $TRANSLATIONS = array( -"Error (de)activating addressbook." => "Fel när (av)aktivera adressbok", -"There was an error adding the contact." => "Det uppstod ett fel när kontakt skulle läggas till", -"Cannot add empty property." => "Kan inte lägga till en tom egenskap", -"At least one of the address fields has to be filled out." => "Minst ett fält måste fyllas i", -"Error adding contact property." => "Fel när kontaktegenskap skulle läggas till", +"Error (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.", +"Error updating addressbook." => "Fel uppstod när adressbok skulle uppdateras.", "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.", +"There was an error adding the contact." => "Det uppstod ett fel när kontakten skulle läggas till.", +"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", -"Cannot add addressbook with an empty name." => "Kan inte lägga till adressbok med ett tomt namn.", -"Error adding addressbook." => "Fel när adressbok skulle läggas till", -"Error activating addressbook." => "Fel uppstod när adressbok skulle aktiveras", +"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: " => "Informationen om vCard är fel. Ladda om sidan:", +"Something went FUBAR. " => "Något gick fel.", "No contact ID was submitted." => "Inget kontakt-ID angavs.", -"Error reading contact photo." => "Fel uppstod när ", +"Error reading contact photo." => "Fel uppstod vid läsning av kontaktfoto.", "Error saving temporary file." => "Fel uppstod när temporär fil skulle sparas.", "The loading photo is not valid." => "Det laddade fotot är inte giltigt.", -"id is not set." => "ID är inte satt.", -"Information about vCard is incorrect. Please reload the page." => "Information om vCard är felaktigt. Vänligen ladda om sidan.", -"Error deleting contact property." => "Fel uppstod när kontaktegenskap skulle tas bort", "Contact ID is missing." => "Kontakt-ID saknas.", -"Missing contact id." => "Saknar kontakt-ID.", "No photo path was submitted." => "Ingen sökväg till foto angavs.", "File doesn't exist:" => "Filen existerar inte.", "Error loading image." => "Fel uppstod när bild laddades.", -"checksum is not set." => "kontrollsumma är inte satt.", -"Information about vCard is incorrect. Please reload the page: " => "Informationen om vCard är fel. Ladda om sidan:", -"Error updating contact property." => "Fel uppstod när kontaktegenskap skulle uppdateras", -"Cannot update addressbook with an empty name." => "Kan inte uppdatera adressboken med ett tomt namn.", -"Error updating addressbook." => "Fel uppstod när adressbok skulle uppdateras", +"Error getting contact object." => "Fel vid hämtning av kontakt.", +"Error getting PHOTO property." => "Fel vid hämtning av egenskaper för FOTO.", +"Error saving contact." => "Fel vid sparande av kontakt.", +"Error resizing image" => "Fel vid storleksförändring av bilden", +"Error cropping image" => "Fel vid beskärning av bilden", +"Error creating temporary image" => "Fel vid skapande av tillfällig bild", +"Error finding image: " => "Kunde inte hitta bild:", "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", @@ -37,17 +44,46 @@ "The uploaded file was only partially uploaded" => "Den uppladdade filen var bara delvist uppladdad", "No file was uploaded" => "Ingen fil laddades upp", "Missing a temporary folder" => "En temporär mapp saknas", +"Couldn't save temporary image: " => "Kunde inte spara tillfällig bild:", +"Couldn't load temporary image: " => "Kunde inte ladda tillfällig bild:", +"No file was uploaded. Unknown error" => "Ingen fil uppladdad. Okänt fel", "Contacts" => "Kontakter", -"Drop a VCF file to import contacts." => "Släpp en VCF-fil för att importera kontakter.", -"Addressbook not found." => "Hittade inte adressboken", +"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", +"This property has to be non-empty." => "Denna egenskap får inte vara tom.", +"Couldn't serialize elements." => "Kunde inte serialisera element.", +"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "\"deleteProperty\" anropades utan typargument. Vänligen rapportera till bugs.owncloud.org", +"Edit name" => "Ändra namn", +"No files selected for upload." => "Inga filer valda för uppladdning", +"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Filen du försöker ladda upp är större än den maximala storleken för filuppladdning på denna server.", +"Error loading profile picture." => "Fel vid hämtning av profilbild.", +"Select type" => "Välj typ", +"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?", +"Result: " => "Resultat:", +" imported, " => "importerad,", +" failed." => "misslyckades.", +"Displayname cannot be empty." => "Visningsnamn får inte vara tomt.", +"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.", -"Address" => "Adress", -"Telephone" => "Telefon", -"Email" => "E-post", -"Organization" => "Organisation", +"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" => "Arbete", "Home" => "Hem", +"Other" => "Annat", "Mobile" => "Mobil", "Text" => "Text", "Voice" => "Röst", @@ -56,88 +92,133 @@ "Video" => "Video", "Pager" => "Personsökare", "Internet" => "Internet", +"Birthday" => "Födelsedag", +"Business" => "Företag", +"Call" => "Ring", +"Clients" => "Kunder", +"Deliverer" => "Leverera", +"Holidays" => "Helgdagar", +"Ideas" => "Idéer", +"Journey" => "Resa", +"Jubilee" => "Jubileum", +"Meeting" => "Möte", +"Personal" => "Privat", +"Projects" => "Projekt", +"Questions" => "Frågor", "{name}'s Birthday" => "{name}'s födelsedag", "Contact" => "Kontakt", "Add Contact" => "Lägg till kontakt", +"Import" => "Importera", +"Settings" => "Inställningar", "Addressbooks" => "Adressböcker", -"Configure Address Books" => "Konfigurera adressböcker", -"New Address Book" => "Ny adressbok", -"Import from VCF" => "Importera från VCF", -"CardDav Link" => "CardDAV länk", -"Download" => "Nedladdning", -"Edit" => "Redigera", -"Delete" => "Radera", -"Download contact" => "Ladda ner kontakt", -"Delete contact" => "Radera kontakt", +"Close" => "Stäng", +"Keyboard shortcuts" => "Kortkommandon", +"Navigation" => "Navigering", +"Next contact in list" => "Nästa kontakt i listan", +"Previous contact in list" => "Föregående kontakt i listan", +"Expand/collapse current addressbook" => "Visa/dölj aktuell adressbok", +"Next addressbook" => "Nästa adressbok", +"Previous addressbook" => "Föregående adressbok", +"Actions" => "Åtgärder", +"Refresh contacts list" => "Uppdatera kontaktlistan", +"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", +"Delete current photo" => "Ta bort aktuellt foto", +"Edit current photo" => "Redigera aktuellt foto", +"Upload new photo" => "Ladda upp ett nytt foto", +"Select photo from ownCloud" => "Välj foto från ownCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => " anpassad, korta namn, hela namn, bakåt eller bakåt med komma", "Edit name details" => "Redigera detaljer för namn", +"Organization" => "Organisation", +"Delete" => "Radera", "Nickname" => "Smeknamn", "Enter nickname" => "Ange smeknamn", -"Birthday" => "Födelsedag", +"Web site" => "Webbplats", +"http://www.somesite.com" => "http://www.somesite.com", +"Go to web site" => "Gå till webbplats", "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", +"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 ett telefonnummer", +"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", -"Profile picture" => "Profilbild", "Phone" => "Telefon", +"Email" => "E-post", +"Instant Messaging" => "Instant Messaging", +"Address" => "Adress", "Note" => "Notering", -"Delete current photo" => "Ta bort aktuellt foto", -"Edit current photo" => "Redigera aktuellt foto", -"Upload new photo" => "Ladda upp ett nytt foto", -"Select photo from ownCloud" => "Välj foto från ownCloud", +"Download contact" => "Ladda ner kontakt", +"Delete contact" => "Radera kontakt", +"The temporary image has been removed from cache." => "Den tillfälliga bilden har raderats från cache.", "Edit address" => "Editera adress", "Type" => "Typ", "PO Box" => "Postbox", +"Street address" => "Gatuadress", +"Street and number" => "Gata och nummer", "Extended" => "Utökad", -"Street" => "Gata", +"Apartment number etc." => "Lägenhetsnummer", "City" => "Stad", "Region" => "Län", +"E.g. state or province" => "T.ex. stat eller provins", "Zipcode" => "Postnummer", +"Postal code" => "Postnummer", "Country" => "Land", -"Edit categories" => "Editera kategorier", -"Add" => "Ny", "Addressbook" => "Adressbok", -"Miss" => "Herr", -"Ms" => "Ingen adressbok funnen.", -"Mr" => "Fru", -"Mrs" => "Fröken", -"Dr" => "Dr", +"Hon. prefixes" => "Ledande titlar", +"Miss" => "Fröken", +"Ms" => "Fru", +"Mr" => "Herr", +"Sir" => "Herr", +"Mrs" => "Fru", +"Dr" => "Dr.", "Given name" => "Förnamn", "Additional names" => "Mellannamn", "Family name" => "Efternamn", +"Hon. suffixes" => "Efterställda titlar", +"J.D." => "Kand. Jur.", +"M.D." => "M.D.", +"D.O." => "D.O.", +"D.C." => "D.C.", "Ph.D." => "Fil.dr.", -"New Addressbook" => "Ny adressbok", -"Edit Addressbook" => "Redigera adressbok", -"Displayname" => "Visningsnamn", -"Active" => "Aktiv", -"Save" => "Spara", -"Submit" => "Skicka in", -"Cancel" => "Avbryt", +"Esq." => "Esq.", +"Jr." => "Jr.", +"Sn." => "Sn.", "Import a contacts file" => "Importera en kontaktfil", "Please choose the addressbook" => "Vänligen välj adressboken", "create a new addressbook" => "skapa en ny adressbok", "Name of new addressbook" => "Namn för ny adressbok", -"Import" => "Importera", "Importing contacts" => "Importerar kontakter", -"Select address book to import to:" => "Importera till adressbok:", -"Select from HD" => "Välj från hårddisk", "You have no contacts in your addressbook." => "Du har inga kontakter i din adressbok.", "Add contact" => "Lägg till en kontakt", -"Configure addressbooks" => "Konfigurera adressböcker", +"Select Address Books" => "Välj adressböcker", +"Enter name" => "Ange namn", +"Enter description" => "Ange beskrivning", "CardDAV syncing addresses" => "CardDAV synkningsadresser", -"more info" => "mera information", +"more info" => "mer information", "Primary address (Kontact et al)" => "Primär adress (Kontakt o.a.)", -"iOS/OS X" => "iOS/OS X" +"iOS/OS X" => "iOS/OS X", +"Show CardDav link" => "Visa CardDav-länk", +"Show read-only VCF link" => "Visa skrivskyddad VCF-länk", +"Share" => "Dela", +"Download" => "Nedladdning", +"Edit" => "Redigera", +"New Address Book" => "Ny adressbok", +"Name" => "Namn", +"Description" => "Beskrivning", +"Save" => "Spara", +"Cancel" => "Avbryt", +"More..." => "Mer..." ); diff --git a/apps/contacts/l10n/th_TH.php b/apps/contacts/l10n/th_TH.php index acf382c6a43..6afc64e61d3 100644 --- a/apps/contacts/l10n/th_TH.php +++ b/apps/contacts/l10n/th_TH.php @@ -1,39 +1,40 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "เกิดข้อผิดพลาดใน (ยกเลิก)การเปิดใช้งานสมุดบันทึกที่อยู่", -"There was an error adding the contact." => "เกิดข้อผิดพลาดในการเพิ่มรายชื่อผู้ติดต่อใหม่", -"Cannot add empty property." => "ไม่สามารถเพิ่มรายละเอียดที่ไม่มีข้อมูลได้", -"At least one of the address fields has to be filled out." => "อย่างน้อยที่สุดช่องข้อมูลที่อยู่จะต้องถูกกรอกลงไป", -"Trying to add duplicate property: " => "พยายามที่จะเพิ่มทรัพยากรที่ซ้ำซ้อนกัน: ", -"Error adding contact property." => "เกิดข้อผิดพลาดในการเพิ่มรายละเอียดการติดต่อ", +"id is not set." => "ยังไม่ได้กำหนดรหัส", +"Cannot update addressbook with an empty name." => "ไม่สามารถอัพเดทสมุดบันทึกที่อยู่โดยไม่มีชื่อได้", +"Error updating addressbook." => "เกิดข้อผิดพลาดในการอัพเดทสมุดบันทึกที่อยู่", "No ID provided" => "ยังไม่ได้ใส่รหัส", "Error setting checksum." => "เกิดข้อผิดพลาดในการตั้งค่า checksum", "No categories selected for deletion." => "ยังไม่ได้เลือกหมวดหมู่ที่ต้องการลบ", "No address books found." => "ไม่พบสมุดบันทึกที่อยู่ที่ต้องการ", "No contacts found." => "ไม่พบข้อมูลการติดต่อที่ต้องการ", +"There was an error adding the contact." => "เกิดข้อผิดพลาดในการเพิ่มรายชื่อผู้ติดต่อใหม่", +"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: " => "พยายามที่จะเพิ่มทรัพยากรที่ซ้ำซ้อนกัน: ", +"Information about vCard is incorrect. Please reload the page." => "ข้อมูลเกี่ยวกับ vCard ไม่ถูกต้อง กรุณาโหลดหน้าเวปใหม่อีกครั้ง", "Missing ID" => "รหัสสูญหาย", "Error parsing VCard for ID: \"" => "พบข้อผิดพลาดในการแยกรหัส VCard:\"", -"Cannot add addressbook with an empty name." => "ไม่สามารถเพิ่มสมุดบันทึกที่อยู่โดยไม่มีชื่อได้", -"Error adding addressbook." => "เกิดข้อผิดพลาดในการเพิ่มสมุดบันทึกที่อยู่ใหม่", -"Error activating addressbook." => "เกิดข้อผิดพลาดในการเปิดใช้งานสมุดบันทึกที่อยู่", +"checksum is not set." => "ยังไม่ได้กำหนดค่า checksum", +"Information about vCard is incorrect. Please reload the page: " => "ข้อมูล vCard ไม่ถูกต้อง กรุณาโหลดหน้าเว็บใหม่อีกครั้ง: ", +"Something went FUBAR. " => "มีบางอย่างเกิดการ FUBAR. ", "No contact ID was submitted." => "ไม่มีรหัสข้อมูลการติดต่อถูกส่งมา", "Error reading contact photo." => "เกิดข้อผิดพลาดในการอ่านรูปภาพของข้อมูลการติดต่อ", "Error saving temporary file." => "เกิดข้อผิดพลาดในการบันทึกไฟล์ชั่วคราว", "The loading photo is not valid." => "โหลดรูปภาพไม่ถูกต้อง", -"id is not set." => "ยังไม่ได้กำหนดรหัส", -"Information about vCard is incorrect. Please reload the page." => "ข้อมูลเกี่ยวกับ vCard ไม่ถูกต้อง กรุณาโหลดหน้าเวปใหม่อีกครั้ง", -"Error deleting contact property." => "เกิดข้อผิดพลาดในการลบรายละเอียดการติดต่อ", "Contact ID is missing." => "รหัสข้อมูลการติดต่อเกิดการสูญหาย", -"Missing contact id." => "รหัสข้อมูลการติดต่อเกิดการสูญหาย", "No photo path was submitted." => "ไม่พบตำแหน่งพาธของรูปภาพ", "File doesn't exist:" => "ไม่มีไฟล์ดังกล่าว", "Error loading image." => "เกิดข้อผิดพลาดในการโหลดรูปภาพ", -"element name is not set." => "ยังไม่ได้กำหนดชื่อ", -"checksum is not set." => "ยังไม่ได้กำหนดค่า checksum", -"Information about vCard is incorrect. Please reload the page: " => "ข้อมูล vCard ไม่ถูกต้อง กรุณาโหลดหน้าเว็บใหม่อีกครั้ง: ", -"Something went FUBAR. " => "มีบางอย่างเกิดการ FUBAR. ", -"Error updating contact property." => "เกิดข้อผิดพลาดในการอัพเดทข้อมูลการติดต่อ", -"Cannot update addressbook with an empty name." => "ไม่สามารถอัพเดทสมุดบันทึกที่อยู่โดยไม่มีชื่อได้", -"Error updating addressbook." => "เกิดข้อผิดพลาดในการอัพเดทสมุดบันทึกที่อยู่", +"Error getting contact object." => "เกิดข้อผิดพลาดในการดึงข้อมูลติดต่อ", +"Error getting PHOTO property." => "เกิดข้อผิดพลาดในการดึงคุณสมบัติของรูปภาพ", +"Error saving contact." => "เกิดข้อผิดพลาดในการบันทึกข้อมูลผู้ติดต่อ", +"Error resizing image" => "เกิดข้อผิดพลาดในการปรับขนาดรูปภาพ", +"Error cropping image" => "เกิดข้อผิดพลาดในการครอบตัดภาพ", +"Error creating temporary image" => "เกิดข้อผิดพลาดในการสร้างรูปภาพชั่วคราว", +"Error finding image: " => "เกิดข้อผิดพลาดในการค้นหารูปภาพ: ", "Error uploading contacts to storage." => "เกิดข้อผิดพลาดในการอัพโหลดข้อมูลการติดต่อไปยังพื้นที่จัดเก็บข้อมูล", "There is no error, the file uploaded with success" => "ไม่พบข้อผิดพลาดใดๆ, ไฟล์ถูกอัพโหลดเรียบร้อยแล้ว", "The uploaded file exceeds the upload_max_filesize directive in php.ini" => "ไฟล์ที่อัพโหลดมีขนาดไฟล์ใหญ่เกินจำนวนที่กำหนดไว้ในคำสั่ง upload_max_filesize ที่อยู่ในไฟล์ php.ini", @@ -41,17 +42,34 @@ "The uploaded file was only partially uploaded" => "ไฟล์ถูกอัพโหลดได้เพียงบางส่วนเท่านั้น", "No file was uploaded" => "ไม่มีไฟล์ที่ถูกอัพโหลด", "Missing a temporary folder" => "โฟลเดอร์ชั่วคราวเกิดการสูญหาย", +"Couldn't save temporary image: " => "ไม่สามารถบันทึกรูปภาพชั่วคราวได้: ", +"Couldn't load temporary image: " => "ไม่สามารถโหลดรูปภาพชั่วคราวได้: ", +"No file was uploaded. Unknown error" => "ยังไม่มีไฟล์ใดที่ถูกอัพโหลด เกิดข้อผิดพลาดที่ไม่ทราบสาเหตุ", "Contacts" => "ข้อมูลการติดต่อ", -"Drop a VCF file to import contacts." => "วางไฟล์ VCF ที่ต้องการนำเข้าข้อมูลการติดต่อ", -"Addressbook not found." => "ไม่พบสมุดบันทึกที่อยู่ที่ต้องการ", +"Sorry, this functionality has not been implemented yet" => "ขออภัย, ฟังก์ชั่นการทำงานนี้ยังไม่ได้ถูกดำเนินการ", +"Not implemented" => "ยังไม่ได้ถูกดำเนินการ", +"Couldn't get a valid address." => "ไม่สามารถดึงที่อยู่ที่ถูกต้องได้", +"Error" => "พบข้อผิดพลาด", +"This property has to be non-empty." => "คุณสมบัตินี้ต้องไม่มีข้อมูลว่างอยู่", +"Couldn't serialize elements." => "ไม่สามารถทำสัญลักษณ์องค์ประกอบต่างๆให้เป็นตัวเลขตามลำดับได้", +"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' ถูกเรียกใช้โดยไม่มีอาร์กิวเมนต์ กรุณาแจ้งได้ที่ bugs.owncloud.org", +"Edit name" => "แก้ไขชื่อ", +"No files selected for upload." => "ยังไม่ได้เลือกไฟล์ำสำหรับอัพโหลด", +"The file you are trying to upload exceed the maximum size for file uploads on this server." => "ไฟล์ที่คุณกำลังพยายามที่จะอัพโหลดมีขนาดเกินจำนวนสูงสุดที่สามารถอัพโหลดได้สำหรับเซิร์ฟเวอร์นี้", +"Error loading profile picture." => "เกิดข้อผิดพลาดในการโหลดรูปภาพประจำตัว", +"Select type" => "เลือกชนิด", +"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "ข้อมูลผู้ติดต่อบางรายการได้ถูกทำเครื่องหมายสำหรับลบทิ้งเอาไว้, แต่ยังไม่ได้ถูกลบทิ้ง, กรุณารอให้รายการดังกล่าวถูกลบทิ้งเสียก่อน", +"Do you want to merge these address books?" => "คุณต้องการผสานข้อมูลสมุดบันทึกที่อยู่เหล่านี้หรือไม่?", +"Result: " => "ผลลัพธ์: ", +" imported, " => " นำเข้าข้อมูลแล้ว, ", +" failed." => " ล้มเหลว.", +"Displayname cannot be empty." => "ชื่อที่ใช้แสดงไม่สามารถเว้นว่างได้", +"Addressbook not found: " => "ไม่พบสมุดบันทึกที่อยู่ที่ต้องการ", "This is not your addressbook." => "นี่ไม่ใช่สมุดบันทึกที่อยู่ของคุณ", "Contact could not be found." => "ไม่พบข้อมูลการติดต่อ", -"Address" => "ที่อยู่", -"Telephone" => "โทรศัพท์", -"Email" => "อีเมล์", -"Organization" => "หน่วยงาน", "Work" => "ที่ทำงาน", "Home" => "บ้าน", +"Other" => "อื่นๆ", "Mobile" => "มือถือ", "Text" => "ข้อความ", "Voice" => "เสียงพูด", @@ -60,25 +78,52 @@ "Video" => "วีดีโอ", "Pager" => "เพจเจอร์", "Internet" => "อินเทอร์เน็ต", +"Birthday" => "วันเกิด", +"Business" => "ธุรกิจ", +"Call" => "โทร", +"Clients" => "ลูกค้า", +"Deliverer" => "ผู้จัดส่ง", +"Holidays" => "วันหยุด", +"Ideas" => "ไอเดีย", +"Journey" => "การเดินทาง", +"Jubilee" => "งานเฉลิมฉลอง", +"Meeting" => "ประชุม", +"Personal" => "ส่วนตัว", +"Projects" => "โปรเจค", +"Questions" => "คำถาม", "{name}'s Birthday" => "วันเกิดของ {name}", "Contact" => "ข้อมูลการติดต่อ", "Add Contact" => "เพิ่มรายชื่อผู้ติดต่อใหม่", +"Import" => "นำเข้า", +"Settings" => "ตั้งค่า", "Addressbooks" => "สมุดบันทึกที่อยู่", -"Configure Address Books" => "กำหนดค่าสมุดบันทึกที่อยู่", -"New Address Book" => "สร้างสมุดบันทึกข้อมูลการติดต่อใหม่", -"Import from VCF" => "นำเข้าจาก VCF", -"CardDav Link" => "ลิงค์ CardDav", -"Download" => "ดาวน์โหลด", -"Edit" => "แก้ไข", -"Delete" => "ลบ", -"Download contact" => "ดาวน์โหลดข้อมูลการติดต่อ", -"Delete contact" => "ลบข้อมูลการติดต่อ", +"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" => "ลบข้อมูลผู้ติดต่อปัจจุบัน", "Drop photo to upload" => "วางรูปภาพที่ต้องการอัพโหลด", +"Delete current photo" => "ลบรูปภาพปัจจุบัน", +"Edit current photo" => "แก้ไขรูปภาพปัจจุบัน", +"Upload new photo" => "อัพโหลดรูปภาพใหม่", +"Select photo from ownCloud" => "เลือกรูปภาพจาก ownCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "กำหนดรูปแบบของชื่อย่อ, ชื่อจริง, ย้อนค่ากลัีบด้วยคอมม่าเอง", "Edit name details" => "แก้ไขรายละเอียดของชื่อ", +"Organization" => "หน่วยงาน", +"Delete" => "ลบ", "Nickname" => "ชื่อเล่น", "Enter nickname" => "กรอกชื่อเล่น", -"Birthday" => "วันเกิด", +"Web site" => "เว็บไซต์", +"http://www.somesite.com" => "http://www.somesite.com", +"Go to web site" => "ไปที่เว็บไซต์", "dd-mm-yyyy" => "dd-mm-yyyy", "Groups" => "กลุ่ม", "Separate groups with commas" => "คั่นระหว่างรายชื่อกลุ่มด้วยเครื่องหมายจุลภาีคหรือคอมม่า", @@ -94,24 +139,26 @@ "Edit address details" => "แก้ไขรายละเอียดที่อยู่", "Add notes here." => "เพิ่มหมายเหตุกำกับไว้ที่นี่", "Add field" => "เพิ่มช่องรับข้อมูล", -"Profile picture" => "รูปภาพโปรไฟล์", "Phone" => "โทรศัพท์", +"Email" => "อีเมล์", +"Address" => "ที่อยู่", "Note" => "หมายเหตุ", -"Delete current photo" => "ลบรูปภาพปัจจุบัน", -"Edit current photo" => "แก้ไขรูปภาพปัจจุบัน", -"Upload new photo" => "อัพโหลดรูปภาพใหม่", -"Select photo from ownCloud" => "เลือกรูปภาพจาก ownCloud", +"Download contact" => "ดาวน์โหลดข้อมูลการติดต่อ", +"Delete contact" => "ลบข้อมูลการติดต่อ", +"The temporary image has been removed from cache." => "รูปภาพชั่วคราวดังกล่าวได้ถูกลบออกจากหน่วยความจำแคชแล้ว", "Edit address" => "แก้ไขที่อยู่", "Type" => "ประเภท", "PO Box" => "ตู้ ปณ.", +"Street address" => "ที่อยู่", +"Street and number" => "ถนนและหมายเลข", "Extended" => "เพิ่ม", -"Street" => "ถนน", +"Apartment number etc." => "หมายเลขอพาร์ทเมนต์ ฯลฯ", "City" => "เมือง", "Region" => "ภูมิภาค", +"E.g. state or province" => "เช่น รัฐ หรือ จังหวัด", "Zipcode" => "รหัสไปรษณีย์", +"Postal code" => "รหัสไปรษณีย์", "Country" => "ประเทศ", -"Edit categories" => "แก้ไขหมวดหมู่", -"Add" => "เพิ่ม", "Addressbook" => "สมุดบันทึกที่อยู่", "Hon. prefixes" => "คำนำหน้าชื่อคนรัก", "Miss" => "นางสาว", @@ -132,26 +179,35 @@ "Esq." => "Esq.", "Jr." => "จูเนียร์", "Sn." => "ซีเนียร์", -"New Addressbook" => "สร้างสมุดบันทึกที่อยู่ใหม่", -"Edit Addressbook" => "แก้ไขสมุดบันทึกที่อยู่", -"Displayname" => "ชื่อที่ต้องการให้แสดง", -"Active" => "เปิดใช้", -"Save" => "บันทึก", -"Submit" => "ส่งข้อมูล", -"Cancel" => "ยกเลิก", "Import a contacts file" => "นำเข้าไฟล์ข้อมูลการติดต่อ", "Please choose the addressbook" => "กรุณาเลือกสมุดบันทึกที่อยู่", "create a new addressbook" => "สร้างสมุดบันทึกที่อยู่ใหม่", "Name of new addressbook" => "กำหนดชื่อของสมุดที่อยู่ที่สร้างใหม่", -"Import" => "นำเข้า", "Importing contacts" => "นำเข้าข้อมูลการติดต่อ", +"Contacts imported successfully" => "ข้อมูลการติดต่อถูกนำเข้าข้อมูลเรียบร้อยแล้ว", +"Close Dialog" => "ปิดกล่องข้อความ", +"Import Addressbook" => "นำเข้าข้อมูลสมุดบันทึกที่อยู่", "Select address book to import to:" => "เลือกสมุดบันทึกที่อยู่ที่ต้องการนำเข้า:", +"Drop a VCF file to import contacts." => "วางไฟล์ VCF ที่ต้องการนำเข้าข้อมูลการติดต่อ", "Select from HD" => "เลือกจากฮาร์ดดิส", "You have no contacts in your addressbook." => "คุณยังไม่มีข้อมูลการติดต่อใดๆในสมุดบันทึกที่อยู่ของคุณ", "Add contact" => "เพิ่มชื่อผู้ติดต่อ", -"Configure addressbooks" => "กำหนดค่าสมุดบันทึกที่อยู่", +"Select Address Books" => "เลือกสมุดบันทึกที่อยู่", +"Enter name" => "กรอกชื่อ", +"Enter description" => "กรอกคำอธิบาย", "CardDAV syncing addresses" => "ที่อยู่ที่ใช้เชื่อมข้อมูลกับ CardDAV", "more info" => "ข้อมูลเพิ่มเติม", "Primary address (Kontact et al)" => "ที่อยู่หลัก (สำหรับติดต่อ)", -"iOS/OS X" => "iOS/OS X" +"iOS/OS X" => "iOS/OS X", +"Show CardDav link" => "แสดงลิงก์ CardDav", +"Show read-only VCF link" => "แสดงลิงก์ VCF สำหรับอ่านเท่านั้น", +"Share" => "แชร์", +"Download" => "ดาวน์โหลด", +"Edit" => "แก้ไข", +"New Address Book" => "สร้างสมุดบันทึกข้อมูลการติดต่อใหม่", +"Name" => "ชื่อ", +"Description" => "คำอธิบาย", +"Save" => "บันทึก", +"Cancel" => "ยกเลิก", +"More..." => "เพิ่มเติม..." ); diff --git a/apps/contacts/l10n/tr.php b/apps/contacts/l10n/tr.php index 65e8e34c305..e2a769410f1 100644 --- a/apps/contacts/l10n/tr.php +++ b/apps/contacts/l10n/tr.php @@ -1,39 +1,40 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "Adres defteri etkisizleştirilirken hata oluştu.", -"There was an error adding the contact." => "Kişi eklenirken hata oluştu.", -"Cannot add empty property." => "Boş özellik eklenemiyor.", -"At least one of the address fields has to be filled out." => "En az bir adres alanı doldurulmalı.", -"Trying to add duplicate property: " => "Yinelenen özellik eklenmeye çalışılıyor: ", -"Error adding contact property." => "Kişi özelliği eklenirken hata oluştu.", +"id is not set." => "id atanmamış.", +"Cannot update addressbook with an empty name." => "Adres defterini boş bir isimle güncelleyemezsiniz.", +"Error updating addressbook." => "Adres defteri güncellenirken hata oluştu.", "No ID provided" => "ID verilmedi", "Error setting checksum." => "İmza oluşturulurken hata.", "No categories selected for deletion." => "Silmek için bir kategori seçilmedi.", "No address books found." => "Adres defteri bulunamadı.", "No contacts found." => "Bağlantı bulunamadı.", +"There was an error adding the contact." => "Kişi eklenirken hata oluştu.", +"element name is not set." => "eleman ismi atanmamış.", +"Could not parse contact: " => "Kişi bilgisi ayrıştırılamadı.", +"Cannot add empty property." => "Boş özellik eklenemiyor.", +"At least one of the address fields has to be filled out." => "En az bir adres alanı doldurulmalı.", +"Trying to add duplicate property: " => "Yinelenen özellik eklenmeye çalışılıyor: ", +"Information about vCard is incorrect. Please reload the page." => "vCard bilgileri doğru değil. Lütfen sayfayı yenileyin.", "Missing ID" => "Eksik ID", "Error parsing VCard for ID: \"" => "ID için VCard ayrıştırılamadı:\"", -"Cannot add addressbook with an empty name." => "Adres defterini isimsiz ekleyemezsiniz.", -"Error adding addressbook." => "Adres defteri eklenirken hata oluştu.", -"Error activating addressbook." => "Adres defteri etkinleştirilirken hata oluştu.", +"checksum is not set." => "checksum atanmamış.", +"Information about vCard is incorrect. Please reload the page: " => "vCard hakkındaki bilgi hatalı. Lütfen sayfayı yeniden yükleyin: ", +"Something went FUBAR. " => "Bir şey FUBAR gitti.", "No contact ID was submitted." => "Bağlantı ID'si girilmedi.", "Error reading contact photo." => "Bağlantı fotoğrafı okunamadı.", "Error saving temporary file." => "Geçici dosya kaydetme hatası.", "The loading photo is not valid." => "Yüklenecek fotograf geçerli değil.", -"id is not set." => "id atanmamış.", -"Information about vCard is incorrect. Please reload the page." => "vCard bilgileri doğru değil. Lütfen sayfayı yenileyin.", -"Error deleting contact property." => "Kişi özelliği silinirken hata oluştu.", "Contact ID is missing." => "Bağlantı ID'si eksik.", -"Missing contact id." => "Eksik bağlantı id'si.", "No photo path was submitted." => "Fotoğraf girilmedi.", "File doesn't exist:" => "Dosya mevcut değil:", "Error loading image." => "İmaj yükleme hatası.", -"element name is not set." => "eleman ismi atanmamış.", -"checksum is not set." => "checksum atanmamış.", -"Information about vCard is incorrect. Please reload the page: " => "vCard hakkındaki bilgi hatalı. Lütfen sayfayı yeniden yükleyin: ", -"Something went FUBAR. " => "Bir şey FUBAR gitti.", -"Error updating contact property." => "Kişi özelliği güncellenirken hata oluştu.", -"Cannot update addressbook with an empty name." => "Adres defterini boş bir isimle güncelleyemezsiniz.", -"Error updating addressbook." => "Adres defteri güncellenirken hata oluştu.", +"Error getting contact object." => "Bağlantı nesnesini kaydederken hata.", +"Error getting PHOTO property." => "Resim özelleğini alırken hata oluştu.", +"Error saving contact." => "Bağlantıyı kaydederken hata", +"Error resizing image" => "Görüntü yeniden boyutlandırılamadı.", +"Error cropping image" => "Görüntü kırpılamadı.", +"Error creating temporary image" => "Geçici resim oluştururken hata oluştu", +"Error finding image: " => "Resim ararken hata oluştu:", "Error uploading contacts to storage." => "Bağlantıları depoya yükleme hatası", "There is no error, the file uploaded with success" => "Dosya başarıyla yüklendi, hata oluşmadı", "The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Dosyanın boyutu php.ini dosyasındaki upload_max_filesize limitini aşıyor", @@ -41,17 +42,29 @@ "The uploaded file was only partially uploaded" => "Dosya kısmen karşıya yüklenebildi", "No file was uploaded" => "Hiç dosya gönderilmedi", "Missing a temporary folder" => "Geçici dizin eksik", +"Couldn't save temporary image: " => "Geçici resmi saklayamadı : ", +"Couldn't load temporary image: " => "Geçici resmi yükleyemedi :", +"No file was uploaded. Unknown error" => "Dosya yüklenmedi. Bilinmeyen hata", "Contacts" => "Kişiler", -"Drop a VCF file to import contacts." => "Bağlantıları içe aktarmak için bir VCF dosyası bırakın.", -"Addressbook not found." => "Adres defteri bulunamadı.", +"Sorry, this functionality has not been implemented yet" => "Üzgünüz, bu özellik henüz tamamlanmadı.", +"Not implemented" => "Tamamlanmadı.", +"Couldn't get a valid address." => "Geçerli bir adres alınamadı.", +"Error" => "Hata", +"This property has to be non-empty." => "Bu özellik boş bırakılmamalı.", +"Couldn't serialize elements." => "Öğeler seri hale getiremedi", +"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' tip argümanı olmadan çağrıldı. Lütfen bugs.owncloud.org a rapor ediniz.", +"Edit name" => "İsmi düzenle", +"No files selected for upload." => "Yükleme için dosya seçilmedi.", +"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Yüklemeye çalıştığınız dosya sunucudaki dosya yükleme maksimum boyutunu aşmaktadır. ", +"Select type" => "Tür seç", +"Result: " => "Sonuç: ", +" imported, " => " içe aktarıldı, ", +" failed." => " hatalı.", "This is not your addressbook." => "Bu sizin adres defteriniz değil.", "Contact could not be found." => "Kişi bulunamadı.", -"Address" => "Adres", -"Telephone" => "Telefon", -"Email" => "Eposta", -"Organization" => "Organizasyon", "Work" => "İş", "Home" => "Ev", +"Other" => "Diğer", "Mobile" => "Mobil", "Text" => "Metin", "Voice" => "Ses", @@ -60,25 +73,49 @@ "Video" => "Video", "Pager" => "Sayfalayıcı", "Internet" => "İnternet", +"Birthday" => "Doğum günü", +"Business" => "İş", +"Call" => "Çağrı", +"Clients" => "Müşteriler", +"Deliverer" => "Dağıtıcı", +"Holidays" => "Tatiller", +"Ideas" => "Fikirler", +"Journey" => "Seyahat", +"Jubilee" => "Yıl Dönümü", +"Meeting" => "Toplantı", +"Personal" => "Kişisel", +"Projects" => "Projeler", +"Questions" => "Sorular", "{name}'s Birthday" => "{name}'nin Doğumgünü", "Contact" => "Kişi", "Add Contact" => "Kişi Ekle", +"Import" => "İçe aktar", "Addressbooks" => "Adres defterleri", -"Configure Address Books" => "Adres Defterlerini Yapılandır", -"New Address Book" => "Yeni Adres Defteri", -"Import from VCF" => "VCF'den içeri aktar", -"CardDav Link" => "CardDav Bağlantısı", -"Download" => "İndir", -"Edit" => "Düzenle", -"Delete" => "Sil", -"Download contact" => "Kişiyi indir", -"Delete contact" => "Kişiyi sil", +"Close" => "Kapat", +"Keyboard shortcuts" => "Klavye kısayolları", +"Navigation" => "Dolaşım", +"Next contact in list" => "Listedeki sonraki kişi", +"Previous contact in list" => "Listedeki önceki kişi", +"Expand/collapse current addressbook" => "Şuanki adres defterini genişlet/daralt", +"Actions" => "Eylemler", +"Refresh contacts list" => "Kişi listesini tazele", +"Add new contact" => "Yeni kişi ekle", +"Add new addressbook" => "Yeni adres defteri ekle", +"Delete current contact" => "Şuanki kişiyi sil", "Drop photo to upload" => "Fotoğrafı yüklenmesi için bırakın", +"Delete current photo" => "Mevcut fotoğrafı sil", +"Edit current photo" => "Mevcut fotoğrafı düzenle", +"Upload new photo" => "Yeni fotoğraf yükle", +"Select photo from ownCloud" => "ownCloud'dan bir fotoğraf seç", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Biçin özel, Kısa isim, Tam isim, Ters veya noktalı ters", "Edit name details" => "İsim detaylarını düzenle", +"Organization" => "Organizasyon", +"Delete" => "Sil", "Nickname" => "Takma ad", "Enter nickname" => "Takma adı girin", -"Birthday" => "Doğum günü", +"Web site" => "Web sitesi", +"http://www.somesite.com" => "http://www.somesite.com", +"Go to web site" => "Web sitesine git", "dd-mm-yyyy" => "gg-aa-yyyy", "Groups" => "Gruplar", "Separate groups with commas" => "Grupları birbirinden virgülle ayırın", @@ -94,24 +131,26 @@ "Edit address details" => "Adres detaylarını düzenle", "Add notes here." => "Notları buraya ekleyin.", "Add field" => "Alan ekle", -"Profile picture" => "Profil resmi", "Phone" => "Telefon", +"Email" => "Eposta", +"Address" => "Adres", "Note" => "Not", -"Delete current photo" => "Mevcut fotoğrafı sil", -"Edit current photo" => "Mevcut fotoğrafı düzenle", -"Upload new photo" => "Yeni fotoğraf yükle", -"Select photo from ownCloud" => "ownCloud'dan bir fotoğraf seç", +"Download contact" => "Kişiyi indir", +"Delete contact" => "Kişiyi sil", +"The temporary image has been removed from cache." => "Geçici resim ön bellekten silinmiştir.", "Edit address" => "Adresi düzenle", "Type" => "Tür", "PO Box" => "Posta Kutusu", +"Street address" => "Sokak adresi", +"Street and number" => "Sokak ve Numara", "Extended" => "Uzatılmış", -"Street" => "Sokak", +"Apartment number etc." => "Apartman numarası vb.", "City" => "Şehir", "Region" => "Bölge", +"E.g. state or province" => "Örn. eyalet veya il", "Zipcode" => "Posta kodu", +"Postal code" => "Posta kodu", "Country" => "Ülke", -"Edit categories" => "Kategorileri düzenle", -"Add" => "Ekle", "Addressbook" => "Adres defteri", "Hon. prefixes" => "Kısaltmalar", "Miss" => "Bayan", @@ -132,26 +171,29 @@ "Esq." => "Esq.", "Jr." => "Jr.", "Sn." => "Sn.", -"New Addressbook" => "Yeni Adres defteri", -"Edit Addressbook" => "Adres Defterini Düzenle", -"Displayname" => "Görünen adı", -"Active" => "Aktif", -"Save" => "Kaydet", -"Submit" => "Gönder", -"Cancel" => "İptal", "Import a contacts file" => "Bağlantı dosyasını içeri aktar", "Please choose the addressbook" => "Yeni adres defterini seç", "create a new addressbook" => "Yeni adres defteri oluştur", "Name of new addressbook" => "Yeni adres defteri için isim", -"Import" => "İçe aktar", "Importing contacts" => "Bağlantıları içe aktar", +"Contacts imported successfully" => "Bağlantılar başarıyla içe aktarıldı", +"Close Dialog" => "Diyaloğu kapat", +"Import Addressbook" => "Adres defterini içeri aktar", "Select address book to import to:" => "İçe aktarılacak adres defterini seçin:", +"Drop a VCF file to import contacts." => "Bağlantıları içe aktarmak için bir VCF dosyası bırakın.", "Select from HD" => "HD'den seç", "You have no contacts in your addressbook." => "Adres defterinizde hiç bağlantı yok.", "Add contact" => "Bağlatı ekle", -"Configure addressbooks" => "Adres defterini yapılandır", +"Select Address Books" => "Adres deftelerini seçiniz", +"Enter name" => "İsim giriniz", +"Enter description" => "Tanım giriniz", "CardDAV syncing addresses" => "CardDAV adresleri eşzamanlıyor", "more info" => "daha fazla bilgi", "Primary address (Kontact et al)" => "Birincil adres (Bağlantı ve arkadaşları)", -"iOS/OS X" => "iOS/OS X" +"iOS/OS X" => "iOS/OS X", +"Download" => "İndir", +"Edit" => "Düzenle", +"New Address Book" => "Yeni Adres Defteri", +"Save" => "Kaydet", +"Cancel" => "İptal" ); diff --git a/apps/contacts/l10n/uk.php b/apps/contacts/l10n/uk.php index 4c27acf543e..dcd9efff344 100644 --- a/apps/contacts/l10n/uk.php +++ b/apps/contacts/l10n/uk.php @@ -1,29 +1,24 @@ <?php $TRANSLATIONS = array( "At least one of the address fields has to be filled out." => "Має бути заповнено щонайменше одне поле.", -"Error adding addressbook." => "Помилка при додаванні адресної книги.", "This is not your addressbook." => "Це не ваша адресна книга.", -"Address" => "Адреса", -"Telephone" => "Телефон", -"Email" => "Ел.пошта", -"Organization" => "Організація", "Mobile" => "Мобільний", "Text" => "Текст", "Voice" => "Голос", "Fax" => "Факс", "Video" => "Відео", "Pager" => "Пейджер", +"Birthday" => "День народження", "Add Contact" => "Додати контакт", -"New Address Book" => "Нова адресна книга", -"Download" => "Завантажити", +"Organization" => "Організація", "Delete" => "Видалити", -"Delete contact" => "Видалити контакт", -"Birthday" => "День народження", "Phone" => "Телефон", +"Email" => "Ел.пошта", +"Address" => "Адреса", +"Delete contact" => "Видалити контакт", "Extended" => "Розширено", -"Street" => "Вулиця", "City" => "Місто", "Zipcode" => "Поштовий індекс", "Country" => "Країна", -"Add" => "Додати", -"Displayname" => "Відображуване ім'я" +"Download" => "Завантажити", +"New Address Book" => "Нова адресна книга" ); diff --git a/apps/contacts/l10n/vi.php b/apps/contacts/l10n/vi.php new file mode 100644 index 00000000000..d484fb405ca --- /dev/null +++ b/apps/contacts/l10n/vi.php @@ -0,0 +1,41 @@ +<?php $TRANSLATIONS = array( +"id is not set." => "id không được thiết lập.", +"No ID provided" => "Không có ID được cung cấp", +"No address books found." => "Không tìm thấy sổ địa chỉ.", +"No contacts found." => "Không tìm thấy danh sách", +"element name is not set." => "tên phần tử không được thiết lập.", +"Missing ID" => "Missing ID", +"Error reading contact photo." => "Lỗi đọc liên lạc hình ảnh.", +"The loading photo is not valid." => "Các hình ảnh tải không hợp lệ.", +"File doesn't exist:" => "Tập tin không tồn tại", +"Error loading image." => "Lỗi khi tải hình ảnh.", +"Error uploading contacts to storage." => "Lỗi tải lên danh sách địa chỉ để lưu trữ.", +"There is no error, the file uploaded with success" => "Không có lỗi, các tập tin tải lên thành công", +"Contacts" => "Liên lạc", +"Work" => "Công việc", +"Home" => "Nhà", +"Mobile" => "Di động", +"Fax" => "Fax", +"Video" => "Video", +"Pager" => "số trang", +"Birthday" => "Ngày sinh nhật", +"Contact" => "Danh sách", +"Add Contact" => "Thêm liên lạc", +"Addressbooks" => "Sổ địa chỉ", +"Organization" => "Tổ chức", +"Delete" => "Xóa", +"Phone" => "Điện thoại", +"Email" => "Email", +"Address" => "Địa chỉ", +"Delete contact" => "Xóa liên lạc", +"PO Box" => "Hòm thư bưu điện", +"City" => "Thành phố", +"Region" => "Vùng/miền", +"Zipcode" => "Mã bưu điện", +"Country" => "Quốc gia", +"Addressbook" => "Sổ địa chỉ", +"Download" => "Tải về", +"Edit" => "Sửa", +"Save" => "Lưu", +"Cancel" => "Hủy" +); diff --git a/apps/contacts/l10n/zh_CN.php b/apps/contacts/l10n/zh_CN.php index dcf9b99bc8b..b3bac7aedfb 100644 --- a/apps/contacts/l10n/zh_CN.php +++ b/apps/contacts/l10n/zh_CN.php @@ -1,46 +1,66 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "(取消)激活地址簿错误。", -"There was an error adding the contact." => "添加联系人时出错。", -"Cannot add empty property." => "无法添加空属性。", -"At least one of the address fields has to be filled out." => "至少需要填写一项地址。", -"Trying to add duplicate property: " => "试图添加重复属性: ", -"Error adding contact property." => "添加联系人属性错误。", +"id is not set." => "没有设置 id。", +"Cannot update addressbook with an empty name." => "无法使用一个空名称更新地址簿", +"Error updating addressbook." => "更新地址簿错误", "No ID provided" => "未提供 ID", "Error setting checksum." => "设置校验值错误。", "No categories selected for deletion." => "未选中要删除的分类。", "No address books found." => "找不到地址簿。", "No contacts found." => "找不到联系人。", +"There was an error adding the contact." => "添加联系人时出错。", +"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" => "缺少 ID", "Error parsing VCard for ID: \"" => "无法解析如下ID的 VCard:“", -"Cannot add addressbook with an empty name." => "无法无姓名的地址簿。", -"Error adding addressbook." => "添加地址簿错误。", -"Error activating addressbook." => "激活地址簿错误。", +"checksum is not set." => "未设置校验值。", +"Information about vCard is incorrect. Please reload the page: " => "vCard 信息不正确。请刷新页面: ", +"Something went FUBAR. " => "有一些信息无法被处理。", "No contact ID was submitted." => "未提交联系人 ID。", "Error reading contact photo." => "读取联系人照片错误。", "Error saving temporary file." => "保存临时文件错误。", "The loading photo is not valid." => "装入的照片不正确。", -"id is not set." => "没有设置 id。", -"Information about vCard is incorrect. Please reload the page." => "vCard 的信息不正确。请重新加载页面。", -"Error deleting contact property." => "删除联系人属性错误。", "Contact ID is missing." => "缺少联系人 ID。", -"Missing contact id." => "缺少联系人 ID。", "No photo path was submitted." => "未提供照片路径。", "File doesn't exist:" => "文件不存在:", "Error loading image." => "加载图片错误。", -"checksum is not set." => "未设置校验值。", -"Error updating contact property." => "更新联系人属性错误。", -"Error updating addressbook." => "更新地址簿错误", +"Error getting contact object." => "获取联系人目标时出错。", +"Error getting PHOTO property." => "获取照片属性时出错。", +"Error saving contact." => "保存联系人时出错。", +"Error resizing image" => "缩放图像时出错", +"Error cropping image" => "裁切图像时出错", +"Error creating temporary image" => "创建临时图像时出错", +"Error finding image: " => "查找图像时出错: ", +"Error uploading contacts to storage." => "上传联系人到存储空间时出错", +"There is no error, the file uploaded with success" => "文件上传成功,没有错误发生", +"The uploaded file exceeds the upload_max_filesize directive in php.ini" => "上传的文件长度超出了 php.ini 中 upload_max_filesize 的限制", +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "上传的文件长度超出了 HTML 表单中 MAX_FILE_SIZE 的限制", "The uploaded file was only partially uploaded" => "已上传文件只上传了部分", "No file was uploaded" => "没有文件被上传", "Missing a temporary folder" => "缺少临时目录", +"Couldn't save temporary image: " => "无法保存临时图像: ", +"Couldn't load temporary image: " => "无法加载临时图像: ", +"No file was uploaded. Unknown error" => "没有文件被上传。未知错误", "Contacts" => "联系人", -"Addressbook not found." => "未找到地址簿。", +"Sorry, this functionality has not been implemented yet" => "抱歉,这个功能暂时还没有被实现", +"Not implemented" => "未实现", +"Couldn't get a valid address." => "无法获取一个合法的地址。", +"Error" => "错误", +"This property has to be non-empty." => "这个属性必须是非空的", +"Couldn't serialize elements." => "无法序列化元素", +"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' 调用时没有类型声明。请到 bugs.owncloud.org 汇报错误", +"Edit name" => "编辑名称", +"No files selected for upload." => "没有选择文件以上传", +"The file you are trying to upload exceed the maximum size for file uploads on this server." => "您试图上传的文件超出了该服务器的最大文件限制", +"Select type" => "选择类型", +"Result: " => "结果: ", +" imported, " => " 已导入, ", +" failed." => " 失败。", "This is not your addressbook." => "这不是您的地址簿。", "Contact could not be found." => "无法找到联系人。", -"Address" => "地址", -"Telephone" => "电话", -"Email" => "电子邮件", -"Organization" => "组织", "Work" => "工作", "Home" => "家庭", "Mobile" => "移动电话", @@ -51,24 +71,24 @@ "Video" => "视频", "Pager" => "传呼机", "Internet" => "互联网", +"Birthday" => "生日", "{name}'s Birthday" => "{name} 的生日", "Contact" => "联系人", "Add Contact" => "添加联系人", +"Import" => "导入", "Addressbooks" => "地址簿", -"Configure Address Books" => "配置地址簿", -"New Address Book" => "新建地址簿", -"Import from VCF" => "从 VCF 导入", -"CardDav Link" => "CardDav 链接", -"Download" => "下载", -"Edit" => "编辑", -"Delete" => "删除", -"Download contact" => "下载联系人", -"Delete contact" => "删除联系人", +"Close" => "关闭", "Drop photo to upload" => "拖拽图片进行上传", +"Delete current photo" => "删除当前照片", +"Edit current photo" => "编辑当前照片", +"Upload new photo" => "上传新照片", +"Select photo from ownCloud" => "从 ownCloud 选择照片", +"Format custom, Short name, Full name, Reverse or Reverse with comma" => "自定义格式,简称,全名,姓在前,姓在前并用逗号分割", "Edit name details" => "编辑名称详情", +"Organization" => "组织", +"Delete" => "删除", "Nickname" => "昵称", "Enter nickname" => "输入昵称", -"Birthday" => "生日", "dd-mm-yyyy" => "yyyy-mm-dd", "Groups" => "分组", "Separate groups with commas" => "用逗号隔开分组", @@ -84,44 +104,55 @@ "Edit address details" => "编辑地址细节。", "Add notes here." => "添加注释。", "Add field" => "添加字段", -"Profile picture" => "联系人图片", "Phone" => "电话", +"Email" => "电子邮件", +"Address" => "地址", "Note" => "注释", -"Delete current photo" => "删除当前照片", -"Edit current photo" => "编辑当前照片", -"Upload new photo" => "上传新照片", -"Select photo from ownCloud" => "从 ownCloud 选择照片", +"Download contact" => "下载联系人", +"Delete contact" => "删除联系人", +"The temporary image has been removed from cache." => "临时图像文件已从缓存中删除", "Edit address" => "编辑地址", "Type" => "类型", "PO Box" => "邮箱", "Extended" => "扩展", -"Street" => "街道", "City" => "城市", "Region" => "地区", "Zipcode" => "邮编", "Country" => "国家", -"Edit categories" => "编辑分类", -"Add" => "添加", "Addressbook" => "地址簿", +"Hon. prefixes" => "名誉字首", +"Miss" => "小姐", +"Ms" => "女士", +"Mr" => "先生", +"Sir" => "先生", +"Mrs" => "夫人", +"Dr" => "博士", "Given name" => "名", +"Additional names" => "其他名称", "Family name" => "姓", -"New Addressbook" => "新建地址簿", -"Edit Addressbook" => "编辑地址簿", -"Displayname" => "显示名称", -"Active" => "激活", -"Save" => "保存", -"Submit" => "提交", -"Cancel" => "取消", +"Hon. suffixes" => "名誉后缀", +"J.D." => "法律博士", +"M.D." => "医学博士", +"D.O." => "骨科医学博士", +"D.C." => "教育学博士", +"Ph.D." => "哲学博士", +"Esq." => "先生", +"Jr." => "小", +"Sn." => "老", "Import a contacts file" => "导入联系人文件", "Please choose the addressbook" => "请选择地址簿", "create a new addressbook" => "创建新地址簿", "Name of new addressbook" => "新地址簿名称", -"Import" => "导入", "Importing contacts" => "导入联系人", +"You have no contacts in your addressbook." => "您的地址簿中没有联系人。", "Add contact" => "添加联系人", -"Configure addressbooks" => "配置地址簿", "CardDAV syncing addresses" => "CardDAV 同步地址", "more info" => "更多信息", "Primary address (Kontact et al)" => "首选地址 (Kontact 等)", -"iOS/OS X" => "iOS/OS X" +"iOS/OS X" => "iOS/OS X", +"Download" => "下载", +"Edit" => "编辑", +"New Address Book" => "新建地址簿", +"Save" => "保存", +"Cancel" => "取消" ); diff --git a/apps/contacts/l10n/zh_TW.php b/apps/contacts/l10n/zh_TW.php index d4c2efc47aa..0d007ef9c82 100644 --- a/apps/contacts/l10n/zh_TW.php +++ b/apps/contacts/l10n/zh_TW.php @@ -1,27 +1,21 @@ <?php $TRANSLATIONS = array( "Error (de)activating addressbook." => "在啟用或關閉電話簿時發生錯誤", +"Error updating addressbook." => "電話簿更新中發生錯誤", +"No ID provided" => "未提供 ID", +"No contacts found." => "沒有找到聯絡人", "There was an error adding the contact." => "添加通訊錄發生錯誤", "Cannot add empty property." => "不可添加空白內容", "At least one of the address fields has to be filled out." => "至少必須填寫一欄地址", "Error adding contact property." => "添加通訊錄內容中發生錯誤", "No ID provided" => "未提供 ID", -"No contacts found." => "沒有找到聯絡人", -"Missing ID" => "遺失ID", "Error adding addressbook." => "添加電話簿中發生錯誤", "Error activating addressbook." => "啟用電話簿中發生錯誤", "Information about vCard is incorrect. Please reload the page." => "有關 vCard 的資訊不正確,請重新載入此頁。", -"Error deleting contact property." => "刪除通訊錄內容中發生錯誤", -"Error updating contact property." => "更新通訊錄內容中發生錯誤", -"Error updating addressbook." => "電話簿更新中發生錯誤", +"Missing ID" => "遺失ID", "No file was uploaded" => "沒有已上傳的檔案", "Contacts" => "通訊錄", -"Addressbook not found." => "找不到通訊錄", "This is not your addressbook." => "這不是你的電話簿", "Contact could not be found." => "通訊錄未發現", -"Address" => "地址", -"Telephone" => "電話", -"Email" => "電子郵件", -"Organization" => "組織", "Work" => "公司", "Home" => "住宅", "Mobile" => "行動電話", @@ -32,23 +26,16 @@ "Video" => "影片", "Pager" => "呼叫器", "Internet" => "網際網路", +"Birthday" => "生日", "{name}'s Birthday" => "{name}的生日", "Contact" => "通訊錄", "Add Contact" => "添加通訊錄", "Addressbooks" => "電話簿", -"Configure Address Books" => "設定通訊錄", -"New Address Book" => "新電話簿", -"Import from VCF" => "從VCF匯入", -"CardDav Link" => "CardDav 聯結", -"Download" => "下載", -"Edit" => "編輯", -"Delete" => "刪除", -"Download contact" => "下載通訊錄", -"Delete contact" => "刪除通訊錄", "Edit name details" => "編輯姓名詳細資訊", +"Organization" => "組織", +"Delete" => "刪除", "Nickname" => "綽號", "Enter nickname" => "輸入綽號", -"Birthday" => "生日", "dd-mm-yyyy" => "dd-mm-yyyy", "Groups" => "群組", "Separate groups with commas" => "用逗號分隔群組", @@ -63,18 +50,19 @@ "Edit address details" => "電子郵件住址詳細資訊", "Add notes here." => "在這裡新增註解", "Add field" => "新增欄位", -"Profile picture" => "個人資料照片", "Phone" => "電話", +"Email" => "電子郵件", +"Address" => "地址", "Note" => "註解", +"Download contact" => "下載通訊錄", +"Delete contact" => "刪除通訊錄", "Type" => "類型", "PO Box" => "通訊地址", "Extended" => "分機", -"Street" => "街道", "City" => "城市", "Region" => "地區", "Zipcode" => "郵遞區號", "Country" => "國家", -"Add" => "添加", "Addressbook" => "電話簿", "Mr" => "先生", "Sir" => "先生", @@ -83,11 +71,9 @@ "Given name" => "給定名(名)", "Additional names" => "額外名", "Family name" => "家族名(姓)", -"New Addressbook" => "新電話簿", -"Edit Addressbook" => "編輯電話簿", -"Displayname" => "顯示名稱", -"Active" => "作用中", +"Download" => "下載", +"Edit" => "編輯", +"New Address Book" => "新電話簿", "Save" => "儲存", -"Submit" => "提出", "Cancel" => "取消" ); diff --git a/apps/contacts/lib/addressbook.php b/apps/contacts/lib/addressbook.php index 974ecb4047d..b487260d327 100644 --- a/apps/contacts/lib/addressbook.php +++ b/apps/contacts/lib/addressbook.php @@ -37,25 +37,68 @@ /** * This class manages our addressbooks. */ -class OC_Contacts_Addressbook{ +class OC_Contacts_Addressbook { /** * @brief Returns the list of addressbooks for a specific user. * @param string $uid - * @return array + * @param boolean $active Only return addressbooks with this $active state, default(=false) is don't care + * @return array or false. */ - public static function all($uid){ - $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_addressbooks` WHERE `userid` = ? ORDER BY `displayname`' ); - $result = $stmt->execute(array($uid)); + public static function all($uid, $active=false) { + $values = array($uid); + $active_where = ''; + if ($active) { + $active_where = ' AND `active` = ?'; + $values[] = 1; + } + try { + $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_addressbooks` WHERE `userid` = ? ' . $active_where . ' ORDER BY `displayname`' ); + $result = $stmt->execute($values); + } catch(Exception $e) { + OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.' exception: '.$e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.' uid: '.$uid, OCP\Util::DEBUG); + return false; + } $addressbooks = array(); - while( $row = $result->fetchRow()){ + while( $row = $result->fetchRow()) { $addressbooks[] = $row; } - + $addressbooks = array_merge($addressbooks, OCP\Share::getItemsSharedWith('addressbook', OC_Share_Backend_Addressbook::FORMAT_ADDRESSBOOKS)); + if(!$active && !count($addressbooks)) { + $id = self::addDefault($uid); + return array(self::find($id),); + } return $addressbooks; } /** + * @brief Get active addressbook IDs for a user. + * @param integer $uid User id. If null current user will be used. + * @return array + */ + public static function activeIds($uid = null) { + if(is_null($uid)) { + $uid = OCP\USER::getUser(); + } + $activeaddressbooks = self::all($uid, true); + $ids = array(); + foreach($activeaddressbooks as $addressbook) { + $ids[] = $addressbook['id']; + } + return $ids; + } + + /** + * @brief Returns the list of active addressbooks for a specific user. + * @param string $uid + * @return array + */ + public static function active($uid) { + return self::all($uid, true); + } + + /** * @brief Returns the list of addressbooks for a principal (DAV term of user) * @param string $principaluri * @return array @@ -68,9 +111,9 @@ class OC_Contacts_Addressbook{ /** * @brief Gets the data of one address book * @param integer $id - * @return associative array + * @return associative array or false. */ - public static function find($id){ + public static function find($id) { try { $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_addressbooks` WHERE `id` = ?' ); $result = $stmt->execute(array($id)); @@ -80,6 +123,23 @@ class OC_Contacts_Addressbook{ OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', id: '.$id, OCP\Util::DEBUG); return false; } + + return $result->fetchRow(); + } + + /** + * @brief Adds default address book + * @return $id ID of the newly created addressbook or false on error. + */ + public static function addDefault($uid = null) { + if(is_null($uid)) { + $uid = OCP\USER::getUser(); + } + $id = self::add($uid, 'Contacts', 'Default Address Book'); + if($id !== false) { + self::setActive($id, true); + } + return $id; } /** @@ -89,17 +149,29 @@ class OC_Contacts_Addressbook{ * @param string $description * @return insertid */ - public static function add($userid,$name,$description=''){ - $all = self::all($userid); + public static function add($uid,$name,$description='') { + try { + $stmt = OCP\DB::prepare( 'SELECT `uri` FROM `*PREFIX*contacts_addressbooks` WHERE `userid` = ? ' ); + $result = $stmt->execute(array($uid)); + } catch(Exception $e) { + OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.' exception: '.$e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.' uid: '.$uid, OCP\Util::DEBUG); + return false; + } $uris = array(); - foreach($all as $i){ - $uris[] = $i['uri']; + while($row = $result->fetchRow()){ + $uris[] = $row['uri']; } $uri = self::createURI($name, $uris ); - - $stmt = OCP\DB::prepare( 'INSERT INTO `*PREFIX*contacts_addressbooks` (`userid`,`displayname`,`uri`,`description`,`ctag`) VALUES(?,?,?,?,?)' ); - $result = $stmt->execute(array($userid,$name,$uri,$description,1)); + try { + $stmt = OCP\DB::prepare( 'INSERT INTO `*PREFIX*contacts_addressbooks` (`userid`,`displayname`,`uri`,`description`,`ctag`) VALUES(?,?,?,?,?)' ); + $result = $stmt->execute(array($uid,$name,$uri,$description,1)); + } catch(Exception $e) { + OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', uid: '.$uid, OCP\Util::DEBUG); + return false; + } return OCP\DB::insertid('*PREFIX*contacts_addressbooks'); } @@ -110,13 +182,20 @@ class OC_Contacts_Addressbook{ * @param string $uri * @param string $name * @param string $description - * @return insertid + * @return insertid or false */ - public static function addFromDAVData($principaluri,$uri,$name,$description){ - $userid = self::extractUserID($principaluri); + public static function addFromDAVData($principaluri,$uri,$name,$description) { + $uid = self::extractUserID($principaluri); - $stmt = OCP\DB::prepare( 'INSERT INTO `*PREFIX*contacts_addressbooks` (`userid`,`displayname`,`uri`,`description`,`ctag`) VALUES(?,?,?,?,?)' ); - $result = $stmt->execute(array($userid,$name,$uri,$description,1)); + try { + $stmt = OCP\DB::prepare('INSERT INTO `*PREFIX*contacts_addressbooks` (`userid`,`displayname`,`uri`,`description`,`ctag`) VALUES(?,?,?,?,?)'); + $result = $stmt->execute(array($uid,$name,$uri,$description,1)); + } catch(Exception $e) { + OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', uid: '.$uid, OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', uri: '.$uri, OCP\Util::DEBUG); + return false; + } return OCP\DB::insertid('*PREFIX*contacts_addressbooks'); } @@ -128,134 +207,51 @@ class OC_Contacts_Addressbook{ * @param string $description * @return boolean */ - public static function edit($id,$name,$description){ + public static function edit($id,$name,$description) { // Need these ones for checking uri $addressbook = self::find($id); - - if(is_null($name)){ - $name = $addressbook['name']; - } - if(is_null($description)){ - $description = $addressbook['description']; - } - - $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*contacts_addressbooks` SET `displayname`=?,`description`=?, `ctag`=`ctag`+1 WHERE `id`=?' ); - $result = $stmt->execute(array($name,$description,$id)); - - return true; - } - - public static function cleanArray($array, $remove_null_number = true){ - $new_array = array(); - - $null_exceptions = array(); - - foreach ($array as $key => $value){ - $value = trim($value); - - if($remove_null_number){ - $null_exceptions[] = '0'; - } - - if(!in_array($value, $null_exceptions) && $value != "") { - $new_array[] = $value; + if ($addressbook['userid'] != OCP\User::getUser()) { + $sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $id); + if (!$sharedAddressbook || !($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_UPDATE)) { + return false; } } - return $new_array; - } - - /** - * @brief Get active addressbooks for a user. - * @param integer $uid User id. If null current user will be used. - * @return array - */ - public static function activeIds($uid = null){ - if(is_null($uid)){ - $uid = OCP\USER::getUser(); - } - $prefbooks = OCP\Config::getUserValue($uid,'contacts','openaddressbooks',null); - $prefbooks = explode(';',$prefbooks); - for ($i = 0; $i < count($prefbooks); $i++) { - if(!$prefbooks[$i] || !self::find($prefbooks[$i])) { - unset($prefbooks[$i]); - } + if(is_null($name)) { + $name = $addressbook['name']; } - if(!$prefbooks){ - OCP\Util::writeLog('contacts','OC_Contacts_Addressbook:activeIds:, No active addressbooks',OCP\Util::DEBUG); - $addressbooks = OC_Contacts_Addressbook::all($uid); - if(count($addressbooks) == 0){ - OCP\Util::writeLog('contacts','OC_Contacts_Addressbook:activeIds:, No addressbooks',OCP\Util::DEBUG); - $id = self::add($uid,'default','Default Address Book'); - OCP\Util::writeLog('contacts','OC_Contacts_Addressbook:activeIds:, Created addressbook: '.$id,OCP\Util::DEBUG); - self::setActive($id, true); - $addressbooks = OC_Contacts_Addressbook::all($uid); - } - $prefbooks[] = $addressbooks[0]['id']; - OCP\Config::setUserValue($uid,'contacts','openaddressbooks',implode(';',$prefbooks)); + if(is_null($description)) { + $description = $addressbook['description']; } - return $prefbooks; - } - /** - * @brief Returns the list of active addressbooks for a specific user. - * @param string $uid - * @return array - */ - public static function active($uid){ - $active = self::activeIds($uid); - $addressbooks = array(); - if(!$active) { - return $addressbooks; - } - $ids_sql = join(',', array_fill(0, count($active), '?')); - $prep = 'SELECT * FROM `*PREFIX*contacts_addressbooks` WHERE `id` IN ('.$ids_sql.') ORDER BY `displayname`'; try { - $stmt = OCP\DB::prepare( $prep ); - $result = $stmt->execute($active); - while( $row = $result->fetchRow()){ - $addressbooks[] = $row; - } + $stmt = OCP\DB::prepare('UPDATE `*PREFIX*contacts_addressbooks` SET `displayname`=?,`description`=?, `ctag`=`ctag`+1 WHERE `id`=?'); + $result = $stmt->execute(array($name,$description,$id)); } catch(Exception $e) { - OCP\Util::writeLog('contacts','OC_Contacts_Addressbook:active:, exception: '.$e->getMessage(),OCP\Util::DEBUG); - OCP\Util::writeLog('contacts','OC_Contacts_Addressbook:active, ids: '.join(',', $active),OCP\Util::DEBUG); - OCP\Util::writeLog('contacts','OC_Contacts_Addressbook::active, SQL:'.$prep,OCP\Util::DEBUG); - return array(); + OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', id: '.$id, OCP\Util::DEBUG); + return false; } - return $addressbooks; + return true; } /** * @brief Activates an addressbook * @param integer $id - * @param integer $name + * @param boolean $active * @return boolean */ - public static function setActive($id,$active=true){ - // Need these ones for checking uri - //$addressbook = self::find($id); - - if(is_null($id)){ - $id = 0; - } - - $openaddressbooks = self::activeIds(); - if($active) { - if(!in_array($id, $openaddressbooks)) { - $openaddressbooks[] = $id; - } - } else { - if(in_array($id, $openaddressbooks)) { - unset($openaddressbooks[array_search($id, $openaddressbooks)]); - } + public static function setActive($id,$active) { + $sql = 'UPDATE `*PREFIX*contacts_addressbooks` SET `active` = ? WHERE `id` = ?'; + OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', id: '.$id.', active: '.intval($active), OCP\Util::ERROR); + try { + $stmt = OCP\DB::prepare($sql); + $stmt->execute(array(intval($active), $id)); + return true; + } catch(Exception $e) { + OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception for '.$id.': '.$e->getMessage(), OCP\Util::ERROR); + return false; } - // NOTE: Ugly hack... - $openaddressbooks = self::cleanArray($openaddressbooks, false); - sort($openaddressbooks, SORT_NUMERIC); - // FIXME: I alway end up with a ';' prepending when imploding the array..? - OCP\Config::setUserValue(OCP\USER::getUser(),'contacts','openaddressbooks',implode(';', $openaddressbooks)); - - return true; } /** @@ -263,9 +259,16 @@ class OC_Contacts_Addressbook{ * @param integer $id ID of the address book. * @return boolean */ - public static function isActive($id){ - //OCP\Util::writeLog('contacts','OC_Contacts_Addressbook::isActive('.$id.'):'.in_array($id, self::activeIds()), OCP\Util::DEBUG); - return in_array($id, self::activeIds()); + public static function isActive($id) { + $sql = 'SELECT `active` FROM `*PREFIX*contacts_addressbooks` WHERE `id` = ?'; + try { + $stmt = OCP\DB::prepare( $sql ); + $result = $stmt->execute(array($id)); + $row = $result->fetchRow(); + return (bool)$row['active']; + } catch(Exception $e) { + OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); + } } /** @@ -273,11 +276,22 @@ class OC_Contacts_Addressbook{ * @param integer $id * @return boolean */ - public static function delete($id){ - // FIXME: There's no error checking at all. + public static function delete($id) { + $addressbook = self::find($id); + if ($addressbook['userid'] != OCP\User::getUser()) { + $sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $id); + if (!$sharedAddressbook || !($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_DELETE)) { + return false; + } + } self::setActive($id, false); - $stmt = OCP\DB::prepare( 'DELETE FROM `*PREFIX*contacts_addressbooks` WHERE `id` = ?' ); - $stmt->execute(array($id)); + try { + $stmt = OCP\DB::prepare( 'DELETE FROM `*PREFIX*contacts_addressbooks` WHERE `id` = ?' ); + $stmt->execute(array($id)); + } catch(Exception $e) { + OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception for '.$id.': '.$e->getMessage(), OCP\Util::ERROR); + return false; + } $cards = OC_Contacts_VCard::all($id); foreach($cards as $card){ @@ -292,7 +306,7 @@ class OC_Contacts_Addressbook{ * @param integer $id * @return boolean */ - public static function touch($id){ + public static function touch($id) { $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*contacts_addressbooks` SET `ctag` = `ctag` + 1 WHERE `id` = ?' ); $stmt->execute(array($id)); @@ -305,11 +319,11 @@ class OC_Contacts_Addressbook{ * @param array $existing existing addressbook URIs * @return string new name */ - public static function createURI($name,$existing){ - $name = strtolower($name); + public static function createURI($name,$existing) { + $name = str_replace(' ', '_', strtolower($name)); $newname = $name; $i = 1; - while(in_array($newname,$existing)){ + while(in_array($newname, $existing)) { $newname = $name.$i; $i = $i + 1; } @@ -320,8 +334,8 @@ class OC_Contacts_Addressbook{ * @brief gets the userid from a principal path * @return string */ - public static function extractUserID($principaluri){ - list($prefix,$userid) = Sabre_DAV_URLUtil::splitPath($principaluri); + public static function extractUserID($principaluri) { + list($prefix, $userid) = Sabre_DAV_URLUtil::splitPath($principaluri); return $userid; } } diff --git a/apps/contacts/lib/app.php b/apps/contacts/lib/app.php index 29428763d60..e8e1937404f 100644 --- a/apps/contacts/lib/app.php +++ b/apps/contacts/lib/app.php @@ -10,7 +10,6 @@ * This class manages our app actions */ OC_Contacts_App::$l10n = OC_L10N::get('contacts'); -OC_Contacts_App::$categories = new OC_VCategories('contacts'); class OC_Contacts_App { /* * @brief language object for calendar app @@ -23,17 +22,39 @@ class OC_Contacts_App { public static $categories = null; public static function getAddressbook($id) { + // TODO: Throw an exception instead of returning json. $addressbook = OC_Contacts_Addressbook::find( $id ); - if( $addressbook === false || $addressbook['userid'] != OCP\USER::getUser()) { + if($addressbook === false || $addressbook['userid'] != OCP\USER::getUser()) { if ($addressbook === false) { - OCP\Util::writeLog('contacts', 'Addressbook not found: '. $id, OCP\Util::ERROR); - OCP\JSON::error(array('data' => array( 'message' => self::$l10n->t('Addressbook not found.')))); - } - else { - OCP\Util::writeLog('contacts', 'Addressbook('.$id.') is not from '.OCP\USER::getUser(), OCP\Util::ERROR); - OCP\JSON::error(array('data' => array( 'message' => self::$l10n->t('This is not your addressbook.')))); + OCP\Util::writeLog('contacts', + 'Addressbook not found: '. $id, + OCP\Util::ERROR); + //throw new Exception('Addressbook not found: '. $id); + OCP\JSON::error( + array( + 'data' => array( + 'message' => self::$l10n->t('Addressbook not found: ' . $id) + ) + ) + ); + } else { + $sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $id, OC_Share_Backend_Addressbook::FORMAT_ADDRESSBOOKS); + if ($sharedAddressbook) { + return $sharedAddressbook; + } else { + OCP\Util::writeLog('contacts', + 'Addressbook('.$id.') is not from '.OCP\USER::getUser(), + OCP\Util::ERROR); + //throw new Exception('This is not your addressbook.'); + OCP\JSON::error( + array( + 'data' => array( + 'message' => self::$l10n->t('This is not your addressbook.') + ) + ) + ); + } } - exit(); } return $addressbook; } @@ -41,8 +62,17 @@ class OC_Contacts_App { public static function getContactObject($id) { $card = OC_Contacts_VCard::find( $id ); if( $card === false ) { - OCP\Util::writeLog('contacts', 'Contact could not be found: '.$id, OCP\Util::ERROR); - OCP\JSON::error(array('data' => array( 'message' => self::$l10n->t('Contact could not be found.').' '.$id))); + OCP\Util::writeLog('contacts', + 'Contact could not be found: '.$id, + OCP\Util::ERROR); + OCP\JSON::error( + array( + 'data' => array( + 'message' => self::$l10n->t('Contact could not be found.') + .' '.print_r($id, true) + ) + ) + ); exit(); } @@ -58,22 +88,6 @@ class OC_Contacts_App { $card = self::getContactObject( $id ); $vcard = OC_VObject::parse($card['carddata']); - // Try to fix cards with missing 'N' field from pre ownCloud 4. Hot damn, this is ugly... - if(!is_null($vcard) && !$vcard->__isset('N')) { - $version = OCP\App::getAppVersion('contacts'); - if($version >= 5) { - OCP\Util::writeLog('contacts','OC_Contacts_App::getContactVCard. Deprecated check for missing N field', OCP\Util::DEBUG); - } - OCP\Util::writeLog('contacts','getContactVCard, Missing N field', OCP\Util::DEBUG); - if($vcard->__isset('FN')) { - OCP\Util::writeLog('contacts','getContactVCard, found FN field: '.$vcard->__get('FN'), OCP\Util::DEBUG); - $n = implode(';', array_reverse(array_slice(explode(' ', $vcard->__get('FN')), 0, 2))).';;;'; - $vcard->setString('N', $n); - OC_Contacts_VCard::edit( $id, $vcard); - } else { // Else just add an empty 'N' field :-P - $vcard->setString('N', 'Unknown;Name;;;'); - } - } if (!is_null($vcard) && !isset($vcard->REV)) { $rev = new DateTime('@'.$card['lastmodified']); $vcard->setString('REV', $rev->format(DateTime::W3C)); @@ -95,14 +109,77 @@ class OC_Contacts_App { /** * @return array of vcard prop => label */ - public static function getAddPropertyOptions() { + public static function getIMOptions($im = null) { $l10n = self::$l10n; - return array( - 'ADR' => $l10n->t('Address'), - 'TEL' => $l10n->t('Telephone'), - 'EMAIL' => $l10n->t('Email'), - 'ORG' => $l10n->t('Organization'), - ); + $ims = array( + 'jabber' => array( + 'displayname' => (string)$l10n->t('Jabber'), + 'xname' => 'X-JABBER', + 'protocol' => 'xmpp', + ), + 'aim' => array( + 'displayname' => (string)$l10n->t('AIM'), + 'xname' => 'X-AIM', + 'protocol' => 'aim', + ), + 'msn' => array( + 'displayname' => (string)$l10n->t('MSN'), + 'xname' => 'X-MSN', + 'protocol' => 'msn', + ), + 'twitter' => array( + 'displayname' => (string)$l10n->t('Twitter'), + 'xname' => 'X-TWITTER', + 'protocol' => null, + ), + 'googletalk' => array( + 'displayname' => (string)$l10n->t('GoogleTalk'), + 'xname' => null, + 'protocol' => 'xmpp', + ), + 'facebook' => array( + 'displayname' => (string)$l10n->t('Facebook'), + 'xname' => null, + 'protocol' => 'xmpp', + ), + 'xmpp' => array( + 'displayname' => (string)$l10n->t('XMPP'), + 'xname' => null, + 'protocol' => 'xmpp', + ), + 'icq' => array( + 'displayname' => (string)$l10n->t('ICQ'), + 'xname' => 'X-ICQ', + 'protocol' => 'icq', + ), + 'yahoo' => array( + 'displayname' => (string)$l10n->t('Yahoo'), + 'xname' => 'X-YAHOO', + 'protocol' => 'ymsgr', + ), + 'skype' => array( + 'displayname' => (string)$l10n->t('Skype'), + 'xname' => 'X-SKYPE', + 'protocol' => 'skype', + ), + 'qq' => array( + 'displayname' => (string)$l10n->t('QQ'), + 'xname' => 'X-SKYPE', + 'protocol' => 'x-apple', + ), + 'gadugadu' => array( + 'displayname' => (string)$l10n->t('GaduGadu'), + 'xname' => 'X-SKYPE', + 'protocol' => 'x-apple', + ), + ); + if(is_null($im)) { + return $ims; + } else { + $ims['ymsgr'] = $ims['yahoo']; + $ims['gtalk'] = $ims['googletalk']; + return isset($ims[$im]) ? $ims[$im] : null; + } } /** @@ -111,54 +188,83 @@ class OC_Contacts_App { public static function getTypesOfProperty($prop) { $l = self::$l10n; switch($prop) { - case 'ADR': - return array( - 'WORK' => $l->t('Work'), - 'HOME' => $l->t('Home'), - ); - case 'TEL': - return array( - 'HOME' => $l->t('Home'), - 'CELL' => $l->t('Mobile'), - 'WORK' => $l->t('Work'), - 'TEXT' => $l->t('Text'), - 'VOICE' => $l->t('Voice'), - 'MSG' => $l->t('Message'), - 'FAX' => $l->t('Fax'), - 'VIDEO' => $l->t('Video'), - 'PAGER' => $l->t('Pager'), - ); - case 'EMAIL': - return array( - 'WORK' => $l->t('Work'), - 'HOME' => $l->t('Home'), - 'INTERNET' => $l->t('Internet'), - ); + case 'ADR': + case 'IMPP': + return array( + 'WORK' => $l->t('Work'), + 'HOME' => $l->t('Home'), + 'OTHER' => $l->t('Other'), + ); + case 'TEL': + return array( + 'HOME' => $l->t('Home'), + 'CELL' => $l->t('Mobile'), + 'WORK' => $l->t('Work'), + 'TEXT' => $l->t('Text'), + 'VOICE' => $l->t('Voice'), + 'MSG' => $l->t('Message'), + 'FAX' => $l->t('Fax'), + 'VIDEO' => $l->t('Video'), + 'PAGER' => $l->t('Pager'), + 'OTHER' => $l->t('Other'), + ); + case 'EMAIL': + return array( + 'WORK' => $l->t('Work'), + 'HOME' => $l->t('Home'), + 'INTERNET' => $l->t('Internet'), + ); } } - /* + /** * @brief returns the vcategories object of the user * @return (object) $vcategories */ protected static function getVCategories() { if (is_null(self::$categories)) { - self::$categories = new OC_VCategories('contacts'); + self::$categories = new OC_VCategories('contacts', + null, + self::getDefaultCategories()); } return self::$categories; } - - /* + + /** * @brief returns the categories for the user * @return (Array) $categories */ public static function getCategories() { - $categories = self::$categories->categories(); + $categories = self::getVCategories()->categories(); if(count($categories) == 0) { self::scanCategories(); $categories = self::$categories->categories(); } - return $categories; + return ($categories ? $categories : self::getDefaultCategories()); + } + + /** + * @brief returns the default categories of ownCloud + * @return (array) $categories + */ + public static function getDefaultCategories(){ + return array( + (string)self::$l10n->t('Birthday'), + (string)self::$l10n->t('Business'), + (string)self::$l10n->t('Call'), + (string)self::$l10n->t('Clients'), + (string)self::$l10n->t('Deliverer'), + (string)self::$l10n->t('Holidays'), + (string)self::$l10n->t('Ideas'), + (string)self::$l10n->t('Journey'), + (string)self::$l10n->t('Jubilee'), + (string)self::$l10n->t('Meeting'), + (string)self::$l10n->t('Other'), + (string)self::$l10n->t('Personal'), + (string)self::$l10n->t('Projects'), + (string)self::$l10n->t('Questions'), + (string)self::$l10n->t('Work'), + ); } /** @@ -173,16 +279,25 @@ class OC_Contacts_App { foreach($vcaddressbooks as $vcaddressbook) { $vcaddressbookids[] = $vcaddressbook['id']; } - $vccontacts = OC_Contacts_VCard::all($vcaddressbookids); - } - } - if(is_array($vccontacts) && count($vccontacts) > 0) { - $cards = array(); - foreach($vccontacts as $vccontact) { - $cards[] = $vccontact['carddata']; + $start = 0; + $batchsize = 10; + while($vccontacts = + OC_Contacts_VCard::all($vcaddressbookids, $start, $batchsize)) { + $cards = array(); + foreach($vccontacts as $vccontact) { + $cards[] = $vccontact['carddata']; + } + OCP\Util::writeLog('contacts', + __CLASS__.'::'.__METHOD__ + .', scanning: '.$batchsize.' starting from '.$start, + OCP\Util::DEBUG); + // only reset on first batch. + self::getVCategories()->rescan($cards, + true, + ($start == 0 ? true : false)); + $start += $batchsize; + } } - - self::$categories->rescan($cards); } } @@ -194,6 +309,18 @@ class OC_Contacts_App { self::getVCategories()->loadFromVObject($contact, true); } + /** + * @brief Get the last modification time. + * @param $vcard OC_VObject + * $return DateTime | null + */ + public static function lastModified($vcard) { + $rev = $vcard->getAsString('REV'); + if ($rev) { + return DateTime::createFromFormat(DateTime::W3C, $rev); + } + } + public static function setLastModifiedHeader($contact) { $rev = $contact->getAsString('REV'); if ($rev) { diff --git a/apps/contacts/lib/hooks.php b/apps/contacts/lib/hooks.php index 3afad1ef7d3..8b7adc60f27 100644 --- a/apps/contacts/lib/hooks.php +++ b/apps/contacts/lib/hooks.php @@ -21,6 +21,15 @@ */ /** + * The following signals are being emitted: + * + * OC_Contacts_VCard::post_moveToAddressbook(array('aid' => $aid, 'id' => $id)) + * OC_Contacts_VCard::pre_deleteVCard(array('aid' => $aid, 'id' => $id, 'uri' = $uri)); (NOTE: the values can be null depending on which method emits them) + * OC_Contacts_VCard::post_updateVCard($id) + * OC_Contacts_VCard::post_createVCard($newid) + */ + +/** * This class contains all hooks. */ class OC_Contacts_Hooks{ @@ -30,7 +39,7 @@ class OC_Contacts_Hooks{ * @return array */ static public function createUser($parameters) { - OC_Contacts_Addressbook::add($parameters['uid'],'default','Default Address Book'); + OC_Contacts_Addressbook::addDefault($parameters['uid']); return true; } @@ -52,8 +61,8 @@ class OC_Contacts_Hooks{ static public function getCalenderSources($parameters) { $base_url = OCP\Util::linkTo('calendar', 'ajax/events.php').'?calendar_id='; foreach(OC_Contacts_Addressbook::all(OCP\USER::getUser()) as $addressbook) { - $parameters['sources'][] = - array( + $parameters['sources'][] + = array( 'url' => $base_url.'birthday_'. $addressbook['id'], 'backgroundColor' => '#cccccc', 'borderColor' => '#888', @@ -66,7 +75,7 @@ class OC_Contacts_Hooks{ static public function getBirthdayEvents($parameters) { $name = $parameters['calendar_id']; - if (strpos('birthday_', $name) != 0) { + if (strpos($name, 'birthday_') != 0) { return; } $info = explode('_', $name); @@ -81,17 +90,25 @@ class OC_Contacts_Hooks{ if ($birthday) { $date = new DateTime($birthday); $vevent = new OC_VObject('VEVENT'); - $vevent->setDateTime('LAST-MODIFIED', new DateTime($vcard->REV)); - $vevent->setDateTime('DTSTART', $date, Sabre_VObject_Element_DateTime::DATE); + //$vevent->setDateTime('LAST-MODIFIED', new DateTime($vcard->REV)); + $vevent->setDateTime('DTSTART', $date, + Sabre_VObject_Element_DateTime::DATE); $vevent->setString('DURATION', 'P1D'); + $vevent->setString('UID', substr(md5(rand().time()), 0, 10)); // DESCRIPTION? $vevent->setString('RRULE', 'FREQ=YEARLY'); - $title = str_replace('{name}', $vcard->getAsString('FN'), OC_Contacts_App::$l10n->t('{name}\'s Birthday')); + $title = str_replace('{name}', + $vcard->getAsString('FN'), + OC_Contacts_App::$l10n->t('{name}\'s Birthday')); $parameters['events'][] = array( 'id' => 0,//$card['id'], 'vevent' => $vevent, 'repeating' => true, 'summary' => $title, + 'calendardata' => "BEGIN:VCALENDAR\nVERSION:2.0\n" + . "PRODID:ownCloud Contacts " + . OCP\App::getAppVersion('contacts') . "\n" + . $vevent->serialize() . "END:VCALENDAR" ); } } diff --git a/apps/contacts/lib/sabre/addressbook.php b/apps/contacts/lib/sabre/addressbook.php new file mode 100644 index 00000000000..e9eb77472b6 --- /dev/null +++ b/apps/contacts/lib/sabre/addressbook.php @@ -0,0 +1,128 @@ +<?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/>. + * + */ + +/** + * This class overrides __construct to get access to $addressBookInfo and + * $carddavBackend, Sabre_CardDAV_AddressBook::getACL() to return read/write + * permissions based on user and shared state and it overrides + * Sabre_CardDAV_AddressBook::getChild() and Sabre_CardDAV_AddressBook::getChildren() + * to instantiate OC_Connector_Sabre_CardDAV_Cards. +*/ +class OC_Connector_Sabre_CardDAV_AddressBook extends Sabre_CardDAV_AddressBook { + + /** + * CardDAV backend + * + * @var Sabre_CardDAV_Backend_Abstract + */ + private $carddavBackend; + + /** + * Constructor + * + * @param Sabre_CardDAV_Backend_Abstract $carddavBackend + * @param array $addressBookInfo + */ + public function __construct( + Sabre_CardDAV_Backend_Abstract $carddavBackend, + array $addressBookInfo) { + + $this->carddavBackend = $carddavBackend; + $this->addressBookInfo = $addressBookInfo; + parent::__construct($carddavBackend, $addressBookInfo); + + } + + /** + * Returns a list of ACE's for this node. + * + * Each ACE has the following properties: + * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are + * currently the only supported privileges + * * 'principal', a url to the principal who owns the node + * * 'protected' (optional), indicating that this ACE is not allowed to + * be updated. + * + * @return array + */ + public function getACL() { + + $readprincipal = $this->getOwner(); + $writeprincipal = $this->getOwner(); + $uid = OC_Contacts_Addressbook::extractUserID($this->getOwner()); + + if($uid != OCP\USER::getUser()) { + $sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $this->addressBookInfo['id']); + if ($sharedAddressbook && ($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_READ)) { + $readprincipal = 'principals/' . OCP\USER::getUser(); + } + if ($sharedAddressbook && ($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_UPDATE)) { + $writeprincipal = 'principals/' . OCP\USER::getUser(); + } + } + + return array( + array( + 'privilege' => '{DAV:}read', + 'principal' => $readprincipal, + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}write', + 'principal' => $writeprincipal, + 'protected' => true, + ), + + ); + + } + + /** + * Returns a card + * + * @param string $name + * @return OC_Connector_Sabre_DAV_Card + */ + public function getChild($name) { + + $obj = $this->carddavBackend->getCard($this->addressBookInfo['id'],$name); + if (!$obj) throw new Sabre_DAV_Exception_NotFound('Card not found'); + return new OC_Connector_Sabre_CardDAV_Card($this->carddavBackend,$this->addressBookInfo,$obj); + + } + + /** + * Returns the full list of cards + * + * @return array + */ + public function getChildren() { + + $objs = $this->carddavBackend->getCards($this->addressBookInfo['id']); + $children = array(); + foreach($objs as $obj) { + $children[] = new OC_Connector_Sabre_CardDAV_Card($this->carddavBackend,$this->addressBookInfo,$obj); + } + return $children; + + } +}
\ No newline at end of file diff --git a/apps/contacts/lib/sabre/addressbookroot.php b/apps/contacts/lib/sabre/addressbookroot.php new file mode 100644 index 00000000000..69cd6021284 --- /dev/null +++ b/apps/contacts/lib/sabre/addressbookroot.php @@ -0,0 +1,45 @@ +<?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/>. + * + */ + +/** + * This class overrides Sabre_CardDAV_AddressBookRoot::getChildForPrincipal() + * to instantiate OC_Connector_CardDAV_UserAddressBooks. +*/ +class OC_Connector_Sabre_CardDAV_AddressBookRoot extends Sabre_CardDAV_AddressBookRoot { + + /** + * This method returns a node for a principal. + * + * The passed array contains principal information, and is guaranteed to + * at least contain a uri item. Other properties may or may not be + * supplied by the authentication backend. + * + * @param array $principal + * @return Sabre_DAV_INode + */ + public function getChildForPrincipal(array $principal) { + + return new OC_Connector_Sabre_CardDAV_UserAddressBooks($this->carddavBackend, $principal['uri']); + + } + +}
\ No newline at end of file diff --git a/apps/contacts/lib/connector_sabre.php b/apps/contacts/lib/sabre/backend.php index c967e906601..04737eb3ab4 100644 --- a/apps/contacts/lib/connector_sabre.php +++ b/apps/contacts/lib/sabre/backend.php @@ -40,7 +40,8 @@ class OC_Connector_Sabre_CardDAV extends Sabre_CardDAV_Backend_Abstract { 'uri' => $i['uri'], 'principaluri' => 'principals/'.$i['userid'], '{DAV:}displayname' => $i['displayname'], - '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}addressbook-description' => $i['description'], + '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}addressbook-description' + => $i['description'], '{http://calendarserver.org/ns/}getctag' => $i['ctag'], ); } @@ -69,7 +70,8 @@ class OC_Connector_Sabre_CardDAV extends Sabre_CardDAV_Backend_Abstract { case '{DAV:}displayname' : $name = $newvalue; break; - case '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}addressbook-description' : + case '{' . Sabre_CardDAV_Plugin::NS_CARDDAV + . '}addressbook-description' : $description = $newvalue; break; default : @@ -79,7 +81,7 @@ class OC_Connector_Sabre_CardDAV extends Sabre_CardDAV_Backend_Abstract { } } - OC_Contacts_Addressbook::edit($addressbookid,$name,$description); + OC_Contacts_Addressbook::edit($addressbookid, $name, $description); return true; @@ -104,16 +106,23 @@ class OC_Connector_Sabre_CardDAV extends Sabre_CardDAV_Backend_Abstract { case '{DAV:}displayname' : $displayname = $newvalue; break; - case '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}addressbook-description' : + case '{' . Sabre_CardDAV_Plugin::NS_CARDDAV + . '}addressbook-description' : $description = $newvalue; break; default : - throw new Sabre_DAV_Exception_BadRequest('Unknown property: ' . $property); + throw new Sabre_DAV_Exception_BadRequest('Unknown property: ' + . $property); } } - OC_Contacts_Addressbook::addFromDAVData($principaluri,$url,$name,$description); + OC_Contacts_Addressbook::addFromDAVData( + $principaluri, + $url, + $name, + $description + ); } /** @@ -136,9 +145,12 @@ class OC_Connector_Sabre_CardDAV extends Sabre_CardDAV_Backend_Abstract { $data = OC_Contacts_VCard::all($addressbookid); $cards = array(); foreach($data as $i){ + //OCP\Util::writeLog('contacts', __METHOD__.', uri: ' . $i['uri'], OCP\Util::DEBUG); $cards[] = array( 'id' => $i['id'], - 'carddata' => $i['carddata'], + //'carddata' => $i['carddata'], + 'size' => strlen($i['carddata']), + 'etag' => md5($i['carddata']), 'uri' => $i['uri'], 'lastmodified' => $i['lastmodified'] ); } @@ -154,7 +166,7 @@ class OC_Connector_Sabre_CardDAV extends Sabre_CardDAV_Backend_Abstract { * @return array */ public function getCard($addressbookid, $carduri) { - return OC_Contacts_VCard::findWhereDAVDataIs($addressbookid,$carduri); + return OC_Contacts_VCard::findWhereDAVDataIs($addressbookid, $carduri); } @@ -180,7 +192,9 @@ class OC_Connector_Sabre_CardDAV extends Sabre_CardDAV_Backend_Abstract { * @return bool */ public function updateCard($addressbookid, $carduri, $carddata) { - return OC_Contacts_VCard::editFromDAVData($addressbookid, $carduri, $carddata); + return OC_Contacts_VCard::editFromDAVData( + $addressbookid, $carduri, $carddata + ); } /** diff --git a/apps/contacts/lib/sabre/card.php b/apps/contacts/lib/sabre/card.php new file mode 100644 index 00000000000..f4414a25f7c --- /dev/null +++ b/apps/contacts/lib/sabre/card.php @@ -0,0 +1,94 @@ +<?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/>. + * + */ + +/** + * This class overrides Sabre_CardDAV_Card::getACL() + * to return read/write permissions based on user and shared state. +*/ +class OC_Connector_Sabre_CardDAV_Card extends Sabre_CardDAV_Card { + + /** + * Array with information about the containing addressbook + * + * @var array + */ + private $addressBookInfo; + + /** + * Constructor + * + * @param Sabre_CardDAV_Backend_Abstract $carddavBackend + * @param array $addressBookInfo + * @param array $cardData + */ + public function __construct(Sabre_CardDAV_Backend_Abstract $carddavBackend, array $addressBookInfo, array $cardData) { + + $this->addressBookInfo = $addressBookInfo; + parent::__construct($carddavBackend, $addressBookInfo, $cardData); + + } + + /** + * Returns a list of ACE's for this node. + * + * Each ACE has the following properties: + * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are + * currently the only supported privileges + * * 'principal', a url to the principal who owns the node + * * 'protected' (optional), indicating that this ACE is not allowed to + * be updated. + * + * @return array + */ + public function getACL() { + + $readprincipal = $this->getOwner(); + $writeprincipal = $this->getOwner(); + $uid = OC_Contacts_Addressbook::extractUserID($this->getOwner()); + + if($uid != OCP\USER::getUser()) { + $sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $this->addressBookInfo['id']); + if ($sharedAddressbook && ($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_READ)) { + $readprincipal = 'principals/' . OCP\USER::getUser(); + } + if ($sharedAddressbook && ($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_UPDATE)) { + $writeprincipal = 'principals/' . OCP\USER::getUser(); + } + } + + return array( + array( + 'privilege' => '{DAV:}read', + 'principal' => $readprincipal, + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}write', + 'principal' => $writeprincipal, + 'protected' => true, + ), + + ); + + } + +}
\ No newline at end of file diff --git a/apps/contacts/lib/sabre/useraddressbooks.php b/apps/contacts/lib/sabre/useraddressbooks.php new file mode 100644 index 00000000000..328b433bd6e --- /dev/null +++ b/apps/contacts/lib/sabre/useraddressbooks.php @@ -0,0 +1,45 @@ +<?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/>. + * + */ + +/** + * This class overrides Sabre_CardDAV_UserAddressBooks::getChildren() + * to instantiate OC_Connector_Sabre_CardDAV_AddressBooks. +*/ +class OC_Connector_Sabre_CardDAV_UserAddressBooks extends Sabre_CardDAV_UserAddressBooks { + + /** + * Returns a list of addressbooks + * + * @return array + */ + public function getChildren() { + + $addressbooks = $this->carddavBackend->getAddressbooksForUser($this->principalUri); + $objs = array(); + foreach($addressbooks as $addressbook) { + $objs[] = new OC_Connector_Sabre_CardDAV_AddressBook($this->carddavBackend, $addressbook); + } + return $objs; + + } + +}
\ No newline at end of file diff --git a/apps/contacts/lib/sabre/vcfexportplugin.php b/apps/contacts/lib/sabre/vcfexportplugin.php new file mode 100644 index 00000000000..f0ba60b303f --- /dev/null +++ b/apps/contacts/lib/sabre/vcfexportplugin.php @@ -0,0 +1,100 @@ +<?php + +/** + * VCF Exporter + * + * This plugin adds the ability to export entire address books as .vcf files. + * This is useful for clients that don't support CardDAV yet. They often do + * support vcf files. + * + * @package Sabre + * @subpackage CardDAV + * @copyright Copyright (C) 2007-2012 Rooftop Solutions. All rights reserved. + * @author Evert Pot (http://www.rooftopsolutions.nl/) + * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License + */ +class OC_Connector_Sabre_CardDAV_VCFExportPlugin extends Sabre_DAV_ServerPlugin { + + /** + * Reference to Server class + * + * @var Sabre_DAV_Server + */ + private $server; + + /** + * Initializes the plugin and registers event handlers + * + * @param Sabre_DAV_Server $server + * @return void + */ + public function initialize(Sabre_DAV_Server $server) { + + $this->server = $server; + $this->server->subscribeEvent('beforeMethod', array($this,'beforeMethod'), 90); + + } + + /** + * 'beforeMethod' event handles. This event handles intercepts GET requests ending + * with ?export + * + * @param string $method + * @param string $uri + * @return bool + */ + public function beforeMethod($method, $uri) { + + if ($method!='GET') return; + if ($this->server->httpRequest->getQueryString()!='export') return; + + // splitting uri + list($uri) = explode('?', $uri, 2); + + $node = $this->server->tree->getNodeForPath($uri); + + if (!($node instanceof Sabre_CardDAV_IAddressBook)) return; + + // Checking ACL, if available. + if ($aclPlugin = $this->server->getPlugin('acl')) { + $aclPlugin->checkPrivileges($uri, '{DAV:}read'); + } + + $this->server->httpResponse->setHeader('Content-Type', 'text/directory'); + $this->server->httpResponse->sendStatus(200); + + $nodes = $this->server->getPropertiesForPath($uri, array( + '{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}address-data', + ), 1); + + $this->server->httpResponse->sendBody($this->generateVCF($nodes)); + + // Returning false to break the event chain + return false; + + } + + /** + * Merges all vcard objects, and builds one big vcf export + * + * @param array $nodes + * @return string + */ + public function generateVCF(array $nodes) { + $objects = array(); + + foreach($nodes as $node) { + + if (!isset($node[200]['{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}address-data'])) { + continue; + } + $nodeData = $node[200]['{' . Sabre_CardDAV_Plugin::NS_CARDDAV . '}address-data']; + $objects[] = $nodeData; + + } + + return implode("\r\n", $objects); + + } + +} diff --git a/apps/contacts/lib/search.php b/apps/contacts/lib/search.php index 144138a7c2c..53aa2b48496 100644 --- a/apps/contacts/lib/search.php +++ b/apps/contacts/lib/search.php @@ -2,24 +2,17 @@ class OC_Search_Provider_Contacts extends OC_Search_Provider{ function search($query){ $addressbooks = OC_Contacts_Addressbook::all(OCP\USER::getUser(), 1); -// if(count($calendars)==0 || !OCP\App::isEnabled('contacts')){ -// //return false; -// } - // NOTE: Does the following do anything - $results=array(); - $searchquery=array(); - if(substr_count($query, ' ') > 0){ - $searchquery = explode(' ', $query); - }else{ - $searchquery[] = $query; + if(count($addressbooks)==0 || !OCP\App::isEnabled('contacts')) { + return array(); } + $results=array(); $l = new OC_l10n('contacts'); foreach($addressbooks as $addressbook){ $vcards = OC_Contacts_VCard::all($addressbook['id']); foreach($vcards as $vcard){ - if(substr_count(strtolower($vcard['fullname']), strtolower($query)) > 0){ - $link = OCP\Util::linkTo('contacts', 'index.php').'?id='.urlencode($vcard['id']); - $results[]=new OC_Search_Result($vcard['fullname'],'', $link,$l->t('Contact'));//$name,$text,$link,$type + if(substr_count(strtolower($vcard['fullname']), strtolower($query)) > 0) { + $link = OCP\Util::linkTo('contacts', 'index.php').'&id='.urlencode($vcard['id']); + $results[]=new OC_Search_Result($vcard['fullname'], '', $link, (string)$l->t('Contact'));//$name,$text,$link,$type } } } diff --git a/apps/contacts/lib/share/addressbook.php b/apps/contacts/lib/share/addressbook.php new file mode 100644 index 00000000000..d35f0ce9aea --- /dev/null +++ b/apps/contacts/lib/share/addressbook.php @@ -0,0 +1,94 @@ +<?php +/** + * Copyright (c) 2012 Bart Visscher <bartv@thisnet.nl> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +class OC_Share_Backend_Addressbook implements OCP\Share_Backend_Collection { + const FORMAT_ADDRESSBOOKS = 1; + + /** + * @brief Get the source of the item to be stored in the database + * @param string Item + * @param string Owner of the item + * @return mixed|array|false Source + * + * Return an array if the item is file dependent, the array needs two keys: 'item' and 'file' + * Return false if the item does not exist for the user + * + * The formatItems() function will translate the source returned back into the item + */ + public function isValidSource($itemSource, $uidOwner) { + $addressbook = OC_Contacts_Addressbook::find( $itemSource ); + if( $addressbook === false || $addressbook['userid'] != $uidOwner) { + return false; + } + return true; + } + + /** + * @brief Get a unique name of the item for the specified user + * @param string Item + * @param string|false User the item is being shared with + * @param array|null List of similar item names already existing as shared items + * @return string Target name + * + * This function needs to verify that the user does not already have an item with this name. + * If it does generate a new name e.g. name_# + */ + public function generateTarget($itemSource, $shareWith, $exclude = null) { + $addressbook = OC_Contacts_Addressbook::find( $itemSource ); + $user_addressbooks = array(); + foreach(OC_Contacts_Addressbook::all($shareWith) as $user_addressbook) { + $user_addressbooks[] = $user_addressbook['displayname']; + } + $name = $addressbook['userid']."'s ".$addressbook['displayname']; + $suffix = ''; + while (in_array($name.$suffix, $user_addressbooks)) { + $suffix++; + } + + return $name.$suffix; + } + + /** + * @brief Converts the shared item sources back into the item in the specified format + * @param array Shared items + * @param int Format + * @return ? + * + * The items array is a 3-dimensional array with the item_source as the first key and the share id as the second key to an array with the share info. + * The key/value pairs included in the share info depend on the function originally called: + * If called by getItem(s)Shared: id, item_type, item, item_source, share_type, share_with, permissions, stime, file_source + * If called by getItem(s)SharedWith: id, item_type, item, item_source, item_target, share_type, share_with, permissions, stime, file_source, file_target + * This function allows the backend to control the output of shared items with custom formats. + * It is only called through calls to the public getItem(s)Shared(With) functions. + */ + public function formatItems($items, $format, $parameters = null) { + $addressbooks = array(); + if ($format == self::FORMAT_ADDRESSBOOKS) { + foreach ($items as $item) { + $addressbook = OC_Contacts_Addressbook::find($item['item_source']); + if ($addressbook) { + $addressbook['displayname'] = $item['item_target']; + $addressbook['permissions'] = $item['permissions']; + $addressbooks[] = $addressbook; + } + } + } + return $addressbooks; + } + + public function getChildren($itemSource) { + $query = OCP\DB::prepare('SELECT id FROM *PREFIX*contacts_cards WHERE addressbookid = ?'); + $result = $query->execute(array($itemSource)); + $sources = array(); + while ($contact = $result->fetchRow()) { + $sources[] = $contact['id']; + } + return $sources; + } + +} diff --git a/apps/contacts/lib/share/contact.php b/apps/contacts/lib/share/contact.php new file mode 100644 index 00000000000..718c8f9025f --- /dev/null +++ b/apps/contacts/lib/share/contact.php @@ -0,0 +1,53 @@ +<?php +/** +* ownCloud +* +* @author Michael Gapczynski +* @copyright 2012 Michael Gapczynski mtgap@owncloud.com +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU AFFERO GENERAL PUBLIC LICENSE for more details. +* +* You should have received a copy of the GNU Affero General Public +* License along with this library. If not, see <http://www.gnu.org/licenses/>. +*/ + +class OC_Share_Backend_Contact implements OCP\Share_Backend { + + const FORMAT_CONTACT = 0; + + private static $contact; + + public function isValidSource($itemSource, $uidOwner) { + self::$contact = OC_Contacts_VCard::find($itemSource); + if (self::$contact) { + return true; + } + return false; + } + + public function generateTarget($itemSource, $shareWith, $exclude = null) { + // TODO Get default addressbook and check for conflicts + return self::$contact['fullname']; + } + + public function formatItems($items, $format, $parameters = null) { + $contacts = array(); + if ($format == self::FORMAT_CONTACT) { + foreach ($items as $item) { + $contact = OC_Contacts_VCard::find($item['item_source']); + $contact['fullname'] = $item['item_target']; + $contacts[] = $contact; + } + } + return $contacts; + } + +}
\ No newline at end of file diff --git a/apps/contacts/lib/vcard.php b/apps/contacts/lib/vcard.php index a0491c6323c..fbb1c734f64 100644 --- a/apps/contacts/lib/vcard.php +++ b/apps/contacts/lib/vcard.php @@ -38,45 +38,50 @@ /** * This class manages our vCards */ -class OC_Contacts_VCard{ +class OC_Contacts_VCard { /** * @brief Returns all cards of an address book * @param integer $id - * @return array + * @return array|false * * The cards are associative arrays. You'll find the original vCard in * ['carddata'] */ - public static function all($id){ + public static function all($id, $start=null, $num=null){ + //FIXME jfd: use limit & offset as OC_DB::prepare parameters for oracle support + $limitsql = ''; + if(!is_null($num)) { + $limitsql = ' LIMIT '.$num; + } + if(!is_null($start) && !is_null($num)) { + $limitsql .= ' OFFSET '.$start.' '; + } $result = null; - if(is_array($id) && count($id) > 1) { + if(is_array($id) && count($id)) { $id_sql = join(',', array_fill(0, count($id), '?')); - $prep = 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `addressbookid` IN ('.$id_sql.') ORDER BY `fullname`'; + $prep = 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `addressbookid` IN ('.$id_sql.') ORDER BY `fullname`'.$limitsql; try { $stmt = OCP\DB::prepare( $prep ); $result = $stmt->execute($id); } catch(Exception $e) { - OCP\Util::writeLog('contacts','OC_Contacts_VCard:all:, exception: '.$e->getMessage(),OCP\Util::ERROR); - OCP\Util::writeLog('contacts','OC_Contacts_VCard:all, ids: '.count($id).' '.join(',', $id),OCP\Util::DEBUG); - OCP\Util::writeLog('contacts','SQL:'.$prep,OCP\Util::DEBUG); - } - } elseif($id) { - if(is_array($id)) { - if(count($id) == 0) { - return array(); - } - $id = $id[0]; + OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __METHOD__.', ids: '.join(',', $id), OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', __METHOD__.'SQL:'.$prep, OCP\Util::DEBUG); + return false; } + } elseif(is_int($id) || is_string($id)) { try { - $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `addressbookid` = ? ORDER BY `fullname`' ); + $sql = 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `addressbookid` = ? ORDER BY `fullname`'.$limitsql; + $stmt = OCP\DB::prepare( $sql ); $result = $stmt->execute(array($id)); } catch(Exception $e) { - OCP\Util::writeLog('contacts','OC_Contacts_VCard:all:, exception: '.$e->getMessage(),OCP\Util::ERROR); - OCP\Util::writeLog('contacts','OC_Contacts_VCard:all, id: '. $id,OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __METHOD__.', ids: '. $id, OCP\Util::DEBUG); + return false; } } else { - OCP\Util::writeLog('contacts','OC_Contacts_VCard:all: No ID given.',OCP\Util::ERROR); - return array(); + OCP\Util::writeLog('contacts', __METHOD__.'. Addressbook id(s) argument is empty: '. print_r($id, true), OCP\Util::DEBUG); + return false; } $cards = array(); if(!is_null($result)) { @@ -91,11 +96,17 @@ class OC_Contacts_VCard{ /** * @brief Returns a card * @param integer $id - * @return associative array + * @return associative array or false. */ public static function find($id){ - $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `id` = ?' ); - $result = $stmt->execute(array($id)); + try { + $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `id` = ?' ); + $result = $stmt->execute(array($id)); + } catch(Exception $e) { + OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __METHOD__.', id: '. $id, OCP\Util::DEBUG); + return false; + } return $result->fetchRow(); } @@ -104,11 +115,17 @@ class OC_Contacts_VCard{ * @brief finds a card by its DAV Data * @param integer $aid Addressbook id * @param string $uri the uri ('filename') - * @return associative array + * @return associative array or false. */ public static function findWhereDAVDataIs($aid,$uri){ - $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `addressbookid` = ? AND `uri` = ?' ); - $result = $stmt->execute(array($aid,$uri)); + try { + $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `addressbookid` = ? AND `uri` = ?' ); + $result = $stmt->execute(array($aid,$uri)); + } catch(Exception $e) { + OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __METHOD__.', aid: '.$aid.' uri'.$uri, OCP\Util::DEBUG); + return false; + } return $result->fetchRow(); } @@ -158,13 +175,19 @@ class OC_Contacts_VCard{ protected static function trueUID($aid, &$uid) { $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `addressbookid` = ? AND `uri` = ?' ); $uri = $uid.'.vcf'; - $result = $stmt->execute(array($aid,$uri)); - if($result->numRows() > 0){ + try { + $result = $stmt->execute(array($aid,$uri)); + } catch(Exception $e) { + OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __METHOD__.', aid: '.$aid.' uid'.$uid, OCP\Util::DEBUG); + return false; + } + if($result->numRows() > 0) { while(true) { - $tmpuid = substr(md5(rand().time()),0,10); + $tmpuid = substr(md5(rand().time()), 0, 10); $uri = $tmpuid.'.vcf'; - $result = $stmt->execute(array($aid,$uri)); - if($result->numRows() > 0){ + $result = $stmt->execute(array($aid, $uri)); + if($result->numRows() > 0) { continue; } else { $uid = $tmpuid; @@ -190,7 +213,7 @@ class OC_Contacts_VCard{ // Add version if needed if($version && $version < '3.0') { $upgrade = true; - OCP\Util::writeLog('contacts','OC_Contacts_VCard::updateValuesFromAdd. Updating from version: '.$version,OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', 'OC_Contacts_VCard::updateValuesFromAdd. Updating from version: '.$version, OCP\Util::DEBUG); } foreach($vcard->children as &$property){ // Decode string properties and remove obsolete properties. @@ -203,29 +226,29 @@ class OC_Contacts_VCard{ } // Fix format of type parameters. if($upgrade && in_array($property->name, $typeprops)) { - OCP\Util::writeLog('contacts','OC_Contacts_VCard::updateValuesFromAdd. before: '.$property->serialize(),OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', 'OC_Contacts_VCard::updateValuesFromAdd. before: '.$property->serialize(), OCP\Util::DEBUG); self::formatPropertyTypes($property); - OCP\Util::writeLog('contacts','OC_Contacts_VCard::updateValuesFromAdd. after: '.$property->serialize(),OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', 'OC_Contacts_VCard::updateValuesFromAdd. after: '.$property->serialize(), OCP\Util::DEBUG); } - if($property->name == 'FN'){ + if($property->name == 'FN') { $fn = $property->value; } - if($property->name == 'N'){ + if($property->name == 'N') { $n = $property->value; } - if($property->name == 'UID'){ + if($property->name == 'UID') { $uid = $property->value; } - if($property->name == 'ORG'){ + if($property->name == 'ORG') { $org = $property->value; } - if($property->name == 'EMAIL' && is_null($email)){ // only use the first email as substitute for missing N or FN. + if($property->name == 'EMAIL' && is_null($email)) { // only use the first email as substitute for missing N or FN. $email = $property->value; } } // Check for missing 'N', 'FN' and 'UID' properties if(!$fn) { - if($n && $n != ';;;;'){ + if($n && $n != ';;;;') { $fn = join(' ', array_reverse(array_slice(explode(';', $n), 0, 2))); } elseif($email) { $fn = $email; @@ -235,21 +258,21 @@ class OC_Contacts_VCard{ $fn = 'Unknown Name'; } $vcard->setString('FN', $fn); - OCP\Util::writeLog('contacts','OC_Contacts_VCard::updateValuesFromAdd. Added missing \'FN\' field: '.$fn,OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', 'OC_Contacts_VCard::updateValuesFromAdd. Added missing \'FN\' field: '.$fn, OCP\Util::DEBUG); } - if(!$n || $n == ';;;;'){ // Fix missing 'N' field. Ugly hack ahead ;-) + if(!$n || $n == ';;;;') { // Fix missing 'N' field. Ugly hack ahead ;-) $slice = array_reverse(array_slice(explode(' ', $fn), 0, 2)); // Take 2 first name parts of 'FN' and reverse. if(count($slice) < 2) { // If not enought, add one more... $slice[] = ""; } $n = implode(';', $slice).';;;'; $vcard->setString('N', $n); - OCP\Util::writeLog('contacts','OC_Contacts_VCard::updateValuesFromAdd. Added missing \'N\' field: '.$n,OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', 'OC_Contacts_VCard::updateValuesFromAdd. Added missing \'N\' field: '.$n, OCP\Util::DEBUG); } if(!$uid) { $vcard->setUID(); $uid = $vcard->getAsString('UID'); - OCP\Util::writeLog('contacts','OC_Contacts_VCard::updateValuesFromAdd. Added missing \'UID\' field: '.$uid,OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', 'OC_Contacts_VCard::updateValuesFromAdd. Added missing \'UID\' field: '.$uid, OCP\Util::DEBUG); } if(self::trueUID($aid, $uid)) { $vcard->setString('UID', $uid); @@ -260,23 +283,29 @@ class OC_Contacts_VCard{ /** * @brief Adds a card - * @param integer $aid Addressbook id - * @param OC_VObject $card vCard file - * @param string $uri the uri of the card, default based on the UID - * @return insertid on success or null if no card. + * @param $aid integer Addressbook id + * @param $card OC_VObject vCard file + * @param $uri string the uri of the card, default based on the UID + * @param $isChecked boolean If the vCard should be checked for validity and version. + * @return insertid on success or false. */ - public static function add($aid, OC_VObject $card, $uri=null, $isnew=false){ - if(is_null($card)){ - OCP\Util::writeLog('contacts','OC_Contacts_VCard::add. No vCard supplied', OCP\Util::ERROR); + public static function add($aid, OC_VObject $card, $uri=null, $isChecked=false){ + if(is_null($card)) { + OCP\Util::writeLog('contacts', 'OC_Contacts_VCard::add. No vCard supplied', OCP\Util::ERROR); return null; }; - - if(!$isnew) { + $addressbook = OC_Contacts_Addressbook::find($aid); + if ($addressbook['userid'] != OCP\User::getUser()) { + $sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $aid); + if (!$sharedAddressbook || !($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_CREATE)) { + return false; + } + } + if(!$isChecked) { OC_Contacts_App::loadCategoriesFromVCard($card); self::updateValuesFromAdd($aid, $card); } - - $card->setString('VERSION','3.0'); + $card->setString('VERSION', '3.0'); // Add product ID is missing. $prodid = trim($card->getAsString('PRODID')); if(!$prodid) { @@ -298,11 +327,17 @@ class OC_Contacts_VCard{ $data = $card->serialize(); $stmt = OCP\DB::prepare( 'INSERT INTO `*PREFIX*contacts_cards` (`addressbookid`,`fullname`,`carddata`,`uri`,`lastmodified`) VALUES(?,?,?,?,?)' ); - $result = $stmt->execute(array($aid,$fn,$data,$uri,time())); + try { + $result = $stmt->execute(array($aid,$fn,$data,$uri,time())); + } catch(Exception $e) { + OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __METHOD__.', aid: '.$aid.' uri'.$uri, OCP\Util::DEBUG); + return false; + } $newid = OCP\DB::insertid('*PREFIX*contacts_cards'); OC_Contacts_Addressbook::touch($aid); - + OC_Hook::emit('OC_Contacts_VCard', 'post_createVCard', $newid); return $newid; } @@ -327,15 +362,26 @@ class OC_Contacts_VCard{ $now = new DateTime; foreach($objects as $object) { $vcard = OC_VObject::parse($object[1]); - if(!is_null($vcard)){ + if(!is_null($vcard)) { + $oldcard = self::find($object[0]); + if (!$oldcard) { + return false; + } + $addressbook = OC_Contacts_Addressbook::find($oldcard['addressbookid']); + if ($addressbook['userid'] != OCP\User::getUser()) { + $sharedContact = OCP\Share::getItemSharedWithBySource('contact', $object[0], OCP\Share::FORMAT_NONE, null, true); + if (!$sharedContact || !($sharedContact['permissions'] & OCP\Share::PERMISSION_UPDATE)) { + return false; + } + } $vcard->setString('REV', $now->format(DateTime::W3C)); $data = $vcard->serialize(); try { $result = $stmt->execute(array($data,time(),$object[0])); //OCP\Util::writeLog('contacts','OC_Contacts_VCard::updateDataByID, id: '.$object[0].': '.$object[1],OCP\Util::DEBUG); } catch(Exception $e) { - OCP\Util::writeLog('contacts','OC_Contacts_VCard::updateDataByID:, exception: '.$e->getMessage(),OCP\Util::DEBUG); - OCP\Util::writeLog('contacts','OC_Contacts_VCard::updateDataByID, id: '.$object[0],OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __METHOD__.', id: '.$object[0], OCP\Util::DEBUG); } } } @@ -349,11 +395,20 @@ class OC_Contacts_VCard{ */ public static function edit($id, OC_VObject $card){ $oldcard = self::find($id); - + if (!$oldcard) { + return false; + } if(is_null($card)) { return false; } - + // NOTE: Owner checks are being made in the ajax files, which should be done inside the lib files to prevent any redundancies with sharing checks + $addressbook = OC_Contacts_Addressbook::find($oldcard['addressbookid']); + if ($addressbook['userid'] != OCP\User::getUser()) { + $sharedContact = OCP\Share::getItemSharedWithBySource('contact', $id, OCP\Share::FORMAT_NONE, null, true); + if (!$sharedContact || !($sharedContact['permissions'] & OCP\Share::PERMISSION_UPDATE)) { + throw new Exception(OC_Contacts_App::$l10n->t('You do not have the permissions to edit this contact.')); + } + } OC_Contacts_App::loadCategoriesFromVCard($card); $fn = $card->getAsString('FN'); @@ -366,10 +421,17 @@ class OC_Contacts_VCard{ $data = $card->serialize(); $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*contacts_cards` SET `fullname` = ?,`carddata` = ?, `lastmodified` = ? WHERE `id` = ?' ); - $result = $stmt->execute(array($fn,$data,time(),$id)); + try { + $result = $stmt->execute(array($fn,$data,time(),$id)); + } catch(Exception $e) { + OCP\Util::writeLog('contacts', __METHOD__.', exception: ' + . $e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __METHOD__.', id'.$id, OCP\Util::DEBUG); + return false; + } OC_Contacts_Addressbook::touch($oldcard['addressbookid']); - + OC_Hook::emit('OC_Contacts_VCard', 'post_updateVCard', $id); return true; } @@ -380,14 +442,25 @@ class OC_Contacts_VCard{ * @param string $data vCard file * @return boolean */ - public static function editFromDAVData($aid,$uri,$data){ - $oldcard = self::findWhereDAVDataIs($aid,$uri); + public static function editFromDAVData($aid, $uri, $data){ + $oldcard = self::findWhereDAVDataIs($aid, $uri); $card = OC_VObject::parse($data); if(!$card) { - OCP\Util::writeLog('contacts','OC_Contacts_VCard::editFromDAVData. Unable to parse VCARD, uri: '.$uri,OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __METHOD__. + ', Unable to parse VCARD, uri: '.$uri, OCP\Util::ERROR); + return false; + } + try { + self::edit($oldcard['id'], $card); + return true; + } catch(Exception $e) { + OCP\Util::writeLog('contacts', __METHOD__.', exception: ' + . $e->getMessage() . ', ' + . OCP\USER::getUser(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __METHOD__.', uri' + . $uri, OCP\Util::DEBUG); return false; } - return self::edit($oldcard['id'], $card); } /** @@ -396,9 +469,36 @@ class OC_Contacts_VCard{ * @return boolean */ public static function delete($id){ - // FIXME: Add error checking. - $stmt = OCP\DB::prepare( 'DELETE FROM `*PREFIX*contacts_cards` WHERE `id` = ?' ); - $stmt->execute(array($id)); + $card = self::find($id); + if (!$card) { + return false; + } + $addressbook = OC_Contacts_Addressbook::find($card['addressbookid']); + if ($addressbook['userid'] != OCP\User::getUser()) { + $sharedContact = OCP\Share::getItemSharedWithBySource('contact', + $id, OCP\Share::FORMAT_NONE, null, true); + if (!$sharedContact + || !($sharedContact['permissions'] & OCP\Share::PERMISSION_DELETE)) { + throw new Exception( + OC_Contacts_App::$l10n->t( + 'You do not have the permissions to delete this contact.' + ) + ); + } + } + OC_Hook::emit('OC_Contacts_VCard', 'pre_deleteVCard', + array('aid' => null, 'id' => $id, 'uri' => null) + ); + $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*contacts_cards` WHERE `id` = ?'); + try { + $stmt->execute(array($id)); + } catch(Exception $e) { + OCP\Util::writeLog('contacts', __METHOD__. + ', exception: ' . $e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __METHOD__.', id: ' + . $id, OCP\Util::DEBUG); + return false; + } return true; } @@ -410,9 +510,27 @@ class OC_Contacts_VCard{ * @return boolean */ public static function deleteFromDAVData($aid,$uri){ - // FIXME: Add error checking. Deleting a card gives an Kontact/Akonadi error. + $addressbook = OC_Contacts_Addressbook::find($aid); + if ($addressbook['userid'] != OCP\User::getUser()) { + $query = OCP\DB::prepare( 'SELECT id FROM *PREFIX*contacts_cards WHERE addressbookid = ? AND uri = ?' ); + $id = $query->execute(array($aid, $uri))->fetchOne(); + if (!$id) { + return false; + } + $sharedContact = OCP\Share::getItemSharedWithBySource('contact', $id, OCP\Share::FORMAT_NONE, null, true); + if (!$sharedContact || !($sharedContact['permissions'] & OCP\Share::PERMISSION_DELETE)) { + return false; + } + } + OC_Hook::emit('OC_Contacts_VCard', 'pre_deleteVCard', array('aid' => $aid, 'id' => null, 'uri' => $uri)); $stmt = OCP\DB::prepare( 'DELETE FROM `*PREFIX*contacts_cards` WHERE `addressbookid` = ? AND `uri`=?' ); - $stmt->execute(array($aid,$uri)); + try { + $stmt->execute(array($aid,$uri)); + } catch(Exception $e) { + OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __METHOD__.', aid: '.$aid.' uri: '.$uri, OCP\Util::DEBUG); + return false; + } OC_Contacts_Addressbook::touch($aid); return true; @@ -439,14 +557,14 @@ class OC_Contacts_VCard{ * @return array */ public static function unescapeDelimiters($value, $delimiter=';') { - $array = explode($delimiter,$value); + $array = explode($delimiter, $value); for($i=0;$i<count($array);$i++) { - if(substr($array[$i],-1,1)=="\\") { + if(substr($array[$i], -1, 1)=="\\") { if(isset($array[$i+1])) { - $array[$i] = substr($array[$i],0,count($array[$i])-2).$delimiter.$array[$i+1]; + $array[$i] = substr($array[$i], 0, count($array[$i])-2).$delimiter.$array[$i+1]; unset($array[$i+1]); } else { - $array[$i] = substr($array[$i],0,count($array[$i])-2).$delimiter; + $array[$i] = substr($array[$i], 0, count($array[$i])-2).$delimiter; } $i = $i - 1; } @@ -462,16 +580,25 @@ class OC_Contacts_VCard{ * * look at code ... */ - public static function structureContact($object){ + public static function structureContact($object) { $details = array(); - foreach($object->children as $property){ + + foreach($object->children as $property) { + $pname = $property->name; $temp = self::structureProperty($property); if(!is_null($temp)) { - if(array_key_exists($property->name,$details)){ - $details[$property->name][] = $temp; + // Get Apple X-ABLabels + if(isset($object->{$property->group . '.X-ABLABEL'})) { + $temp['label'] = $object->{$property->group . '.X-ABLABEL'}->value; + if($temp['label'] == '_$!<Other>!$_') { + $temp['label'] = OC_Contacts_App::$l10n->t('Other'); + } + } + if(array_key_exists($pname, $details)) { + $details[$pname][] = $temp; } else{ - $details[$property->name] = array($temp); + $details[$pname] = array($temp); } } } @@ -491,10 +618,10 @@ class OC_Contacts_VCard{ * NOTE: $value is not escaped anymore. It shouldn't make any difference * but we should look out for any problems. */ - public static function structureProperty($property){ + public static function structureProperty($property) { $value = $property->value; //$value = htmlspecialchars($value); - if($property->name == 'ADR' || $property->name == 'N'){ + if($property->name == 'ADR' || $property->name == 'N') { $value = self::unescapeDelimiters($value); } elseif($property->name == 'BDAY') { if(strpos($value, '-') === false) { @@ -505,6 +632,9 @@ class OC_Contacts_VCard{ } } } + if(is_string($value)) { + $value = strtr($value, array('\,' => ',', '\;' => ';')); + } $temp = array( 'name' => $property->name, 'value' => $value, @@ -514,17 +644,17 @@ class OC_Contacts_VCard{ // Faulty entries by kaddressbook // Actually TYPE=PREF is correct according to RFC 2426 // but this way is more handy in the UI. Tanghus. - if($parameter->name == 'TYPE' && $parameter->value == 'PREF'){ + if($parameter->name == 'TYPE' && strtoupper($parameter->value) == 'PREF') { $parameter->name = 'PREF'; $parameter->value = '1'; } // NOTE: Apparently Sabre_VObject_Reader can't always deal with value list parameters // like TYPE=HOME,CELL,VOICE. Tanghus. - if (in_array($property->name, array('TEL', 'EMAIL')) && $parameter->name == 'TYPE'){ - if (isset($temp['parameters'][$parameter->name])){ + if (in_array($property->name, array('TEL', 'EMAIL')) && $parameter->name == 'TYPE') { + if (isset($temp['parameters'][$parameter->name])) { $temp['parameters'][$parameter->name][] = $parameter->value; } - else{ + else { $temp['parameters'][$parameter->name] = array($parameter->value); } } @@ -542,9 +672,29 @@ class OC_Contacts_VCard{ * @return boolean * */ - public static function moveToAddressBook($aid, $id){ + public static function moveToAddressBook($aid, $id, $isAddressbook = false) { OC_Contacts_App::getAddressbook($aid); // check for user ownership. + $addressbook = OC_Contacts_Addressbook::find($aid); + if ($addressbook['userid'] != OCP\User::getUser()) { + $sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $aid); + if (!$sharedAddressbook || !($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_CREATE)) { + return false; + } + } if(is_array($id)) { + foreach ($id as $index => $cardId) { + $card = self::find($cardId); + if (!$card) { + unset($id[$index]); + } + $oldAddressbook = OC_Contacts_Addressbook::find($card['addressbookid']); + if ($oldAddressbook['userid'] != OCP\User::getUser()) { + $sharedContact = OCP\Share::getItemSharedWithBySource('contact', $cardId, OCP\Share::FORMAT_NONE, null, true); + if (!$sharedContact || !($sharedContact['permissions'] & OCP\Share::PERMISSION_DELETE)) { + unset($id[$index]); + } + } + } $id_sql = join(',', array_fill(0, count($id), '?')); $prep = 'UPDATE `*PREFIX*contacts_cards` SET `addressbookid` = ? WHERE `id` IN ('.$id_sql.')'; try { @@ -553,24 +703,39 @@ class OC_Contacts_VCard{ $vals = array_merge((array)$aid, $id); $result = $stmt->execute($vals); } catch(Exception $e) { - OCP\Util::writeLog('contacts','OC_Contacts_VCard::moveToAddressBook:, exception: '.$e->getMessage(),OCP\Util::DEBUG); - OCP\Util::writeLog('contacts','OC_Contacts_VCard::moveToAddressBook, ids: '.join(',', $vals),OCP\Util::DEBUG); - OCP\Util::writeLog('contacts','SQL:'.$prep,OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __METHOD__.', ids: '.join(',', $vals), OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', __METHOD__.', SQL:'.$prep, OCP\Util::DEBUG); return false; } } else { - try { + $stmt = null; + if($isAddressbook) { + $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*contacts_cards` SET `addressbookid` = ? WHERE `addressbookid` = ?' ); + } else { + $card = self::find($id); + if (!$card) { + return false; + } + $oldAddressbook = OC_Contacts_Addressbook::find($card['addressbookid']); + if ($oldAddressbook['userid'] != OCP\User::getUser()) { + $sharedContact = OCP\Share::getItemSharedWithBySource('contact', $id, OCP\Share::FORMAT_NONE, null, true); + if (!$sharedContact || !($sharedContact['permissions'] & OCP\Share::PERMISSION_DELETE)) { + return false; + } + } $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*contacts_cards` SET `addressbookid` = ? WHERE `id` = ?' ); + } + try { $result = $stmt->execute(array($aid, $id)); } catch(Exception $e) { - OCP\Util::writeLog('contacts','OC_Contacts_VCard::moveToAddressBook:, exception: '.$e->getMessage(),OCP\Util::DEBUG); - OCP\Util::writeLog('contacts','OC_Contacts_VCard::moveToAddressBook, id: '.$id,OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', __METHOD__.' id: '.$id, OCP\Util::DEBUG); return false; } } - + OC_Hook::emit('OC_Contacts_VCard', 'post_moveToAddressbook', array('aid' => $aid, 'id' => $id)); OC_Contacts_Addressbook::touch($aid); return true; } - } diff --git a/apps/contacts/photo.php b/apps/contacts/photo.php index 4660d61f618..f5c8e6fe4bd 100644 --- a/apps/contacts/photo.php +++ b/apps/contacts/photo.php @@ -13,51 +13,63 @@ OCP\User::checkLoggedIn(); OCP\App::checkAppEnabled('contacts'); -function getStandardImage(){ +function getStandardImage() { //OCP\Response::setExpiresHeader('P10D'); OCP\Response::enableCaching(); OCP\Response::redirect(OCP\Util::imagePath('contacts', 'person_large.png')); } $id = isset($_GET['id']) ? $_GET['id'] : null; -$caching = isset($_GET['refresh']) ? 0 : null; +$etag = null; +$caching = null; if(is_null($id)) { getStandardImage(); } if(!extension_loaded('gd') || !function_exists('gd_info')) { - OCP\Util::writeLog('contacts','photo.php. GD module not installed',OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', + 'photo.php. GD module not installed', OCP\Util::DEBUG); getStandardImage(); } $contact = OC_Contacts_App::getContactVCard($id); $image = new OC_Image(); -if(!$image) { +if (!$image) { getStandardImage(); } // invalid vcard -if( is_null($contact)) { - OCP\Util::writeLog('contacts','photo.php. The VCard for ID '.$id.' is not RFC compatible',OCP\Util::ERROR); +if (is_null($contact)) { + OCP\Util::writeLog('contacts', + 'photo.php. The VCard for ID ' . $id . ' is not RFC compatible', + OCP\Util::ERROR); } else { - OCP\Response::enableCaching($caching); - OC_Contacts_App::setLastModifiedHeader($contact); - // Photo :-) - if($image->loadFromBase64($contact->getAsString('PHOTO'))) { + if ($image->loadFromBase64($contact->getAsString('PHOTO'))) { // OK - OCP\Response::setETagHeader(md5($contact->getAsString('PHOTO'))); + $etag = md5($contact->getAsString('PHOTO')); } else // Logo :-/ - if($image->loadFromBase64($contact->getAsString('LOGO'))) { + if ($image->loadFromBase64($contact->getAsString('LOGO'))) { // OK - OCP\Response::setETagHeader(md5($contact->getAsString('LOGO'))); + $etag = md5($contact->getAsString('LOGO')); } if ($image->valid()) { + $modified = OC_Contacts_App::lastModified($contact); + // Force refresh if modified within the last minute. + if(!is_null($modified)) { + $caching = (time() - $modified->format('U') > 60) ? null : 0; + } + OCP\Response::enableCaching($caching); + if(!is_null($modified)) { + OCP\Response::setLastModifiedHeader($modified); + } + if($etag) { + OCP\Response::setETagHeader($etag); + } $max_size = 200; - if($image->width() > $max_size || - $image->height() > $max_size) { + if ($image->width() > $max_size || $image->height() > $max_size) { $image->resize($max_size); } } @@ -65,8 +77,7 @@ if( is_null($contact)) { if (!$image->valid()) { // Not found :-( getStandardImage(); - //$image->loadFromFile('img/person_large.png'); } header('Content-Type: '.$image->mimeType()); $image->show(); -//echo OC_Contacts_App::$l10n->t('This card does not contain a photo.'); + diff --git a/apps/contacts/settings.php b/apps/contacts/settings.php index c88fed0b4d6..5f639399c95 100644 --- a/apps/contacts/settings.php +++ b/apps/contacts/settings.php @@ -1,6 +1,6 @@ <?php $tmpl = new OCP\Template( 'contacts', 'settings'); +$tmpl->assign('addressbooks', OC_Contacts_Addressbook::all(OCP\USER::getUser()), false); -return $tmpl->fetchPage(); -?> +$tmpl->printPage(); diff --git a/apps/contacts/templates/index.php b/apps/contacts/templates/index.php index 7d212e71ba8..744381026ab 100644 --- a/apps/contacts/templates/index.php +++ b/apps/contacts/templates/index.php @@ -1,29 +1,74 @@ +<div id='notification'></div> <script type='text/javascript'> var totalurl = '<?php echo OCP\Util::linkToRemote('carddav'); ?>addressbooks'; var categories = <?php echo json_encode($_['categories']); ?>; + var id = '<?php echo $_['id']; ?>'; var lang = '<?php echo OCP\Config::getUserValue(OCP\USER::getUser(), 'core', 'lang', 'en'); ?>'; </script> -<div id="leftcontent" class="leftcontent"> - <ul id="contacts"> - <?php echo $this->inc("part.contacts"); ?> - </ul> -</div> -<div id="bottomcontrols"> - <form> - <button class="svg" id="contacts_newcontact" title="<?php echo $l->t('Add Contact'); ?>"><img class="svg" src="<?php echo OCP\Util::linkTo('contacts', 'img/contact-new.svg'); ?>" alt="<?php echo $l->t('Add Contact'); ?>" /></button> - <button class="svg" id="chooseaddressbook" title="<?php echo $l->t('Addressbooks'); ?>"><img class="svg" src="core/img/actions/settings.svg" alt="<?php echo $l->t('Addressbooks'); ?>" /></button> - </form> +<div id="leftcontent"> + <div class="hidden" id="statusbar"></div> + <div id="contacts"> + </div> + <div id="uploadprogressbar"></div> + <div id="bottomcontrols"> + <button class="svg" id="contacts_newcontact" title="<?php echo $l->t('Add Contact'); ?>"><img class="svg" src="<?php echo OCP\Util::imagePath('contacts', 'contact-new.svg'); ?>" alt="<?php echo $l->t('Add Contact'); ?>" /></button> + <button class="svg import tip" title="<?php echo $l->t('Import'); ?>"> + <img class="svg" src="<?php echo OCP\Util::imagePath('core', 'actions/upload.svg') ?>" alt="<?php echo $l->t('Import'); ?>" /> + </button> + <button class="svg settings tip" title="<?php echo $l->t('Settings'); ?>"><img class="svg" src="<?php echo OCP\Util::imagePath('core', 'actions/settings.svg') ?>" alt="<?php echo $l->t('Addressbooks'); ?>" /></button> + <form id="import_upload_form" action="<?php echo OCP\Util::linkTo('contacts', 'ajax/uploadimport.php'); ?>" method="post" enctype="multipart/form-data" target="import_upload_target"> + <input class="float" id="import_upload_start" type="file" accept="text/directory,text/vcard,text/x-vcard" name="importfile" /> + <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $_['uploadMaxFilesize'] ?>" id="max_upload"> + </form> + <iframe name="import_upload_target" id='import_upload_target' src=""></iframe> + </div> </div> <div id="rightcontent" class="rightcontent" data-id="<?php echo $_['id']; ?>"> <?php - if ($_['id']){ + if($_['has_contacts']) { echo $this->inc('part.contact'); } else{ echo $this->inc('part.no_contacts'); } ?> + <div class="hidden popup" id="ninjahelp"> + <a class="close" tabindex="0" role="button" title="<?php echo $l->t('Close'); ?>"></a> + <h2><?php echo $l->t('Keyboard shortcuts'); ?></h2> + <div class="help-section"> + <h3><?php echo $l->t('Navigation'); ?></h3> + <dl> + <dt>j/Down</dt> + <dd><?php echo $l->t('Next contact in list'); ?></dd> + <dt>k/Up</dt> + <dd><?php echo $l->t('Previous contact in list'); ?></dd> + <dt>o</dt> + <dd><?php echo $l->t('Expand/collapse current addressbook'); ?></dd> + <dt>n/PageDown</dt> + <dd><?php echo $l->t('Next addressbook'); ?></dd> + <dt>p/PageUp</dt> + <dd><?php echo $l->t('Previous addressbook'); ?></dd> + </dl> + </div> + <div class="help-section"> + <h3><?php echo $l->t('Actions'); ?></h3> + <dl> + <dt>r</dt> + <dd><?php echo $l->t('Refresh contacts list'); ?></dd> + <dt>a</dt> + <dd><?php echo $l->t('Add new contact'); ?></dd> + <!-- dt>Shift-a</dt> + <dd><?php echo $l->t('Add new addressbook'); ?></dd --> + <dt>Shift-Delete</dt> + <dd><?php echo $l->t('Delete current contact'); ?></dd> + </dl> + </div> + </div> </div> <!-- Dialogs --> <div id="dialog_holder"></div> <!-- End of Dialogs --> +<menu type="context" id="addressbookmenu"> + <menuitem label="Delete" icon="<?php echo OCP\Util::imagePath('core', 'actions/delete.svg') ?>" onclick="alert('Really? ' + $(this).attr('data-id'))"></menuitem> + <menuitem label="Rename" icon="<?php echo OCP\Util::imagePath('core', 'actions/rename.svg') ?>" onclick="alert('Can\'t do that')"></menuitem> +</menu> diff --git a/apps/contacts/templates/part.chooseaddressbook.php b/apps/contacts/templates/part.chooseaddressbook.php deleted file mode 100644 index a0ec053ab91..00000000000 --- a/apps/contacts/templates/part.chooseaddressbook.php +++ /dev/null @@ -1,25 +0,0 @@ -<div id="chooseaddressbook_dialog" title="<?php echo $l->t("Configure Address Books"); ?>"> -<table width="100%" style="border: 0;"> -<?php -$option_addressbooks = OC_Contacts_Addressbook::all(OCP\USER::getUser()); -for($i = 0; $i < count($option_addressbooks); $i++){ - echo "<tr>"; - $tmpl = new OCP\Template('contacts', 'part.chooseaddressbook.rowfields'); - $tmpl->assign('addressbook', $option_addressbooks[$i]); - $tmpl->assign('active', OC_Contacts_Addressbook::isActive($option_addressbooks[$i]['id'])); - $tmpl->printpage(); - echo "</tr>"; -} -?> -<tr> - <td colspan="5" style="padding: 0.5em;"> - <a class="button" href="#" onclick="Contacts.UI.Addressbooks.newAddressbook(this);"><?php echo $l->t('New Address Book') ?></a> - <a class="button" href="#" onclick="Contacts.UI.Addressbooks.importAddressbook(this);"><?php echo $l->t('Import from VCF') ?></a> - </td> -</tr> -<tr> - <td colspan="5"> - <p style="margin: 0 auto;width: 90%;"><input style="display:none;width: 90%;float: left;" type="text" id="carddav_url" onmouseover="$('#carddav_url').select();" title="<?php echo $l->t("CardDav Link"); ?>"><a class="action delete" id="carddav_url_close" style="height: 20px;vertical-align: middle;display: none;" title="close" onclick="$('#carddav_url').hide();$('#carddav_url_close').hide();"/></a></p> - </td> -</tr> -</table> diff --git a/apps/contacts/templates/part.chooseaddressbook.rowfields.php b/apps/contacts/templates/part.chooseaddressbook.rowfields.php deleted file mode 100644 index 780920ea3c2..00000000000 --- a/apps/contacts/templates/part.chooseaddressbook.rowfields.php +++ /dev/null @@ -1,18 +0,0 @@ -<td width="20px"> - <input id="active_<?php echo $_['addressbook']["id"]; ?>" type="checkbox" onClick="Contacts.UI.Addressbooks.activation(this, <?php echo $_['addressbook']["id"]; ?>)" <?php echo (OC_Contacts_Addressbook::isActive($_['addressbook']["id"]) ? ' checked="checked"' : ''); ?>> -</td> -<td> - <label for="active_<?php echo $_['addressbook']["id"]; ?>"><?php echo htmlspecialchars($_['addressbook']["displayname"]); ?></label> -</td> -<td width="20px"> - <a onclick="Contacts.UI.showCardDAVUrl('<?php echo OCP\USER::getUser(); ?>', '<?php echo rawurlencode($_['addressbook']["uri"]); ?>');" title="<?php echo $l->t("CardDav Link"); ?>" class="svg action globe"></a> -</td> -<td width="20px"> - <a href="<?php echo OCP\Util::linkTo('contacts', 'export.php'); ?>?bookid=<?php echo $_['addressbook']["id"]; ?>" title="<?php echo $l->t("Download"); ?>" class="svg action download"></a> -</td> -<td width="20px"> - <a title="<?php echo $l->t("Edit"); ?>" class="svg action edit" onclick="Contacts.UI.Addressbooks.editAddressbook(this, <?php echo $_['addressbook']["id"]; ?>);"></a> -</td> -<td width="20px"> - <a onclick="Contacts.UI.Addressbooks.deleteAddressbook(this, <?php echo $_['addressbook']["id"]; ?>);" title="<?php echo $l->t("Delete"); ?>" class="svg action delete"></a> -</td> diff --git a/apps/contacts/templates/part.contact.php b/apps/contacts/templates/part.contact.php index 5b07ba3c337..87ed07c0ec8 100644 --- a/apps/contacts/templates/part.contact.php +++ b/apps/contacts/templates/part.contact.php @@ -1,25 +1,34 @@ +<div id="appsettings" class="popup bottomleft hidden"></div> <?php $id = isset($_['id']) ? $_['id'] : ''; ?> <div id="card"> <form class="float" id="file_upload_form" action="<?php echo OCP\Util::linkTo('contacts', 'ajax/uploadphoto.php'); ?>" method="post" enctype="multipart/form-data" target="file_upload_target"> - <input type="hidden" name="id" value="<?php echo $_['id'] ?>"> <input type="hidden" name="requesttoken" value="<?php echo $_['requesttoken'] ?>"> + <input type="hidden" name="id" value="<?php echo $_['id'] ?>"> <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $_['uploadMaxFilesize'] ?>" id="max_upload"> <input type="hidden" class="max_human_file_size" value="(max <?php echo $_['uploadMaxHumanFilesize']; ?>)"> <input id="file_upload_start" type="file" accept="image/*" name="imagefile" /> </form> - <div id="contact_photo" class="contactsection"> + <div id="contact_photo"> <iframe name="file_upload_target" id='file_upload_target' src=""></iframe> <div class="tip propertycontainer" id="contacts_details_photo_wrapper" title="<?php echo $l->t('Drop photo to upload'); ?> (max <?php echo $_['uploadMaxHumanFilesize']; ?>)" data-element="PHOTO"> + <ul id="phototools" class="transparent hidden"> + <li><a class="svg delete" title="<?php echo $l->t('Delete current photo'); ?>"></a></li> + <li><a class="svg edit" title="<?php echo $l->t('Edit current photo'); ?>"></a></li> + <li><a class="svg upload" title="<?php echo $l->t('Upload new photo'); ?>"></a></li> + <li><a class="svg cloud" title="<?php echo $l->t('Select photo from ownCloud'); ?>"></a></li> + </ul> </div> </div> <!-- contact_photo --> - <div id="contact_identity" class="contactsection"> <form method="post"> + + <div id="contact_identity"> <input type="hidden" name="id" value="<?php echo $_['id'] ?>"> + <input type="hidden" name="requesttoken" value="<?php echo $_['requesttoken'] ?>"> <fieldset id="ident" class="contactpart"> <span class="propertycontainer" data-element="N"><input type="hidden" id="n" class="contacts_property" name="value" value="" /></span> <span id="name" class="propertycontainer" data-element="FN"> @@ -31,6 +40,8 @@ $id = isset($_['id']) ? $_['id'] : ''; <dd class="propertycontainer hidden" id="org_value" data-element="ORG"><input id="org" required="required" type="text" class="contacts_property big" name="value" value="" placeholder="<?php echo $l->t('Organization'); ?>" /><a role="button" class="action delete" title="<?php echo $l->t('Delete'); ?>"></a></dd> <dt class="hidden" id="nickname_label" data-element="NICKNAME"><label for="nickname"><?php echo $l->t('Nickname'); ?></label></dt> <dd class="propertycontainer hidden" id="nickname_value" data-element="NICKNAME"><input id="nickname" required="required" type="text" class="contacts_property big" name="value" value="" placeholder="<?php echo $l->t('Enter nickname'); ?>" /><a role="button" class="action delete" title="<?php echo $l->t('Delete'); ?>"></a></dd> + <dt class="hidden" id="url_label" data-element="URL"><label for="url"><?php echo $l->t('Web site'); ?></label></dt> + <dd class="propertycontainer hidden" id="url_value" data-element="URL"><input id="url" required="required" type="url" class="contacts_property big" name="value" value="" placeholder="<?php echo $l->t('http://www.somesite.com'); ?>" /><a role="button" class="action globe" title="<?php echo $l->t('Go to web site'); ?>"><a role="button" class="action delete" title="<?php echo $l->t('Delete'); ?>"></a></dd> <dt class="hidden" id="bday_label" data-element="BDAY"><label for="bday"><?php echo $l->t('Birthday'); ?></label></dt> <dd class="propertycontainer hidden" id="bday_value" data-element="BDAY"><input id="bday" required="required" name="value" type="text" class="contacts_property big" value="" placeholder="<?php echo $l->t('dd-mm-yyyy'); ?>" /><a role="button" class="action delete" title="<?php echo $l->t('Delete'); ?>"></a></dd> <dt class="hidden" id="categories_label" data-element="CATEGORIES"><label for="categories"><?php echo $l->t('Groups'); ?></label></dt> @@ -39,73 +50,88 @@ $id = isset($_['id']) ? $_['id'] : ''; <a role="button" class="action delete" title="<?php echo $l->t('Delete'); ?>"></a><a role="button" class="action edit" title="<?php echo $l->t('Edit groups'); ?>"></a></dd> </dl> </fieldset> - </form> </div> <!-- contact_identity --> - <!-- div class="delimiter"></div --> - <div id="contact_communication" class="contactsection"> - <form method="post"> - <!-- email addresses --> - <div id="emails"> - <ul id="emaillist" class="propertylist"> - <li class="template hidden" data-element="EMAIL"> - <input type="checkbox" class="contacts_property tip" name="parameters[TYPE][]" value="PREF" title="<?php echo $l->t('Preferred'); ?>" /> - <input type="email" required="required" class="nonempty contacts_property" name="value" value="" x-moz-errormessage="<?php echo $l->t('Please specify a valid email address.'); ?>" placeholder="<?php echo $l->t('Enter email address'); ?>" /> - <select class="hidden" multiple="multiple" name="parameters[TYPE][]"> - <?php echo OCP\html_select_options($_['email_types'], array()) ?> - </select> - <span class="listactions"><a class="action mail" title="<?php echo $l->t('Mail to address'); ?>"></a> - <a role="button" class="action delete" title="<?php echo $l->t('Delete email address'); ?>"></a></span></li> - </ul> - </div> <!-- email addresses--> + <!-- email addresses --> + <div id="emails" class="hidden contactsection"> + <ul id="emaillist" class="propertylist"> + <li class="template hidden" data-element="EMAIL"> + <input type="checkbox" class="contacts_property tip" name="parameters[TYPE][]" value="PREF" title="<?php echo $l->t('Preferred'); ?>" /> + <input type="email" required="required" class="nonempty contacts_property" name="value" value="" x-moz-errormessage="<?php echo $l->t('Please specify a valid email address.'); ?>" placeholder="<?php echo $l->t('Enter email address'); ?>" /> + <select multiple="multiple" name="parameters[TYPE][]"> + <?php echo OCP\html_select_options($_['email_types'], array()) ?> + </select> + <span class="listactions"><a class="action mail" title="<?php echo $l->t('Mail to address'); ?>"></a> + <a role="button" class="action delete" title="<?php echo $l->t('Delete email address'); ?>"></a></span></li> + </ul> + </div> <!-- email addresses--> - <!-- Phone numbers --> - <div id="phones"> - <ul id="phonelist" class="propertylist"> - <li class="template hidden" data-element="TEL"> - <input type="checkbox" class="contacts_property tip" name="parameters[TYPE][]" value="PREF" title="<?php echo $l->t('Preferred'); ?>" /> - <input type="text" required="required" class="nonempty contacts_property" name="value" value="" placeholder="<?php echo $l->t('Enter phone number'); ?>" /> - <select multiple="multiple" name="parameters[TYPE][]"> - <?php echo OCP\html_select_options($_['phone_types'], array()) ?> - </select> - <a role="button" class="action delete" title="<?php echo $l->t('Delete phone number'); ?>"></a></li> - </ul> - </div> <!-- Phone numbers --> + <!-- Phone numbers --> + <div id="phones" class="hidden contactsection"> + <ul id="phonelist" class="propertylist"> + <li class="template hidden" data-element="TEL"> + <input type="checkbox" class="contacts_property tip" name="parameters[TYPE][]" value="PREF" title="<?php echo $l->t('Preferred'); ?>" /> + <input type="text" required="required" class="nonempty contacts_property" name="value" value="" + placeholder="<?php echo $l->t('Enter phone number'); ?>" /> + <select multiple="multiple" name="parameters[TYPE][]"> + <?php echo OCP\html_select_options($_['phone_types'], array()) ?> + </select> + <a role="button" class="action delete" title="<?php echo $l->t('Delete phone number'); ?>"></a></li> + </ul> + </div> <!-- Phone numbers --> - <!-- Addresses --> - <div id="addresses" class="hidden"> - <div id="addressdisplay"> - <dl class="addresscard template hidden" data-element="ADR"><dt> - <input class="adr contacts_property" name="value" type="hidden" value="" /> - <input type="hidden" class="adr_type contacts_property" name="parameters[TYPE][]" value="" /> - <span class="adr_type_label"></span><a class="action globe" title="<?php echo $l->t('View on map'); ?>"></a><a class="action edit" title="<?php echo $l->t('Edit address details'); ?>"></a><a role="button" class="action delete" title="Delete address"></a> - </dt><dd><ul class="addresslist"></ul></dd></dl> + <!-- IMPP --> + <div id="ims" class="hidden contactsection"> + <ul id="imlist" class="propertylist"> + <li class="template hidden" data-element="IMPP"> + <div class="select_wrapper"> + <select class="impp" name="parameters[X-SERVICE-TYPE]"> + <?php echo OCP\html_select_options($_['im_protocols'], array()) ?> + </select> + </div> + <div class="select_wrapper"> + <select class="types" name="parameters[TYPE][]"> + <option></option> + <?php echo OCP\html_select_options($_['impp_types'], array()) ?> + </select> + </div> + <input type="checkbox" class="contacts_property impp tip" name="parameters[TYPE][]" value="PREF" title="<?php echo $l->t('Preferred'); ?>" /> + <input type="text" required="required" class="nonempty contacts_property" name="value" value="" + placeholder="<?php echo $l->t('Instant Messenger'); ?>" /> + <a role="button" class="action delete" title="<?php echo $l->t('Delete IM'); ?>"></a></li> + </ul> + </div> <!-- IMPP --> - </div> <!-- addressdisplay --> - </div> <!-- Addresses --> - </form> - </div> <!-- contact_communication --> + <!-- Addresses --> + <div id="addresses" class="hidden contactsection"> + <dl class="addresscard template hidden" data-element="ADR"><dt> + <input class="adr contacts_property" name="value" type="hidden" value="" /> + <input type="hidden" class="adr_type contacts_property" name="parameters[TYPE][]" value="" /> + <span class="adr_type_label"></span><a class="action globe" title="<?php echo $l->t('View on map'); ?>"></a><a class="action edit" title="<?php echo $l->t('Edit address details'); ?>"></a><a role="button" class="action delete" title="Delete address"></a> + </dt><dd><ul class="addresslist"></ul></dd></dl> + </div> <!-- Addresses --> - <div id="contact_note" class="contactsection"> - <form class="float" method="post"> + <div id="contact_note" class="hidden contactsection"> <div id="note" class="propertycontainer" data-element="NOTE"> <textarea class="contacts_property" name="value" required="required" placeholder="<?php echo $l->t('Add notes here.'); ?>" cols="60" wrap="hard"></textarea> </div> - </form> </div> <!-- contact_note --> + </form> + <div id="actionbar"> <div id="contacts_propertymenu"> <button class="button" id="contacts_propertymenu_button"><?php echo $l->t('Add field'); ?></button> <ul id="contacts_propertymenu_dropdown" role="menu" class="hidden"> - <li><a role="menuitem" data-type="PHOTO"><?php echo $l->t('Profile picture'); ?></a></li> <li><a role="menuitem" data-type="ORG"><?php echo $l->t('Organization'); ?></a></li> <li><a role="menuitem" data-type="NICKNAME"><?php echo $l->t('Nickname'); ?></a></li> <li><a role="menuitem" data-type="BDAY"><?php echo $l->t('Birthday'); ?></a></li> <li><a role="menuitem" data-type="TEL"><?php echo $l->t('Phone'); ?></a></li> <li><a role="menuitem" data-type="EMAIL"><?php echo $l->t('Email'); ?></a></li> + <li><a role="menuitem" data-type="IMPP"><?php echo $l->t('Instant Messaging'); ?></a></li> <li><a role="menuitem" data-type="ADR"><?php echo $l->t('Address'); ?></a></li> <li><a role="menuitem" data-type="NOTE"><?php echo $l->t('Note'); ?></a></li> + <li><a role="menuitem" data-type="URL"><?php echo $l->t('Web site'); ?></a></li> <li><a role="menuitem" data-type="CATEGORIES"><?php echo $l->t('Groups'); ?></a></li> </ul> </div> @@ -117,19 +143,3 @@ $id = isset($_['id']) ? $_['id'] : ''; <div id="edit_photo_dialog" title="Edit photo"> <div id="edit_photo_dialog_img"></div> </div> -<script type="text/javascript"> -$(document).ready(function(){ - if('<?php echo $id; ?>'!='') { - $.getJSON(OC.filePath('contacts', 'ajax', 'contactdetails.php'),{'id':'<?php echo $id; ?>'},function(jsondata){ - if(jsondata.status == 'success'){ - $('#leftcontent li[data-id="<?php echo $id; ?>"]').addClass('active'); - Contacts.UI.Card.loadContact(jsondata.data); - Contacts.UI.loadHandlers(); - } - else{ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } - }); - } -}); -</script> diff --git a/apps/contacts/templates/part.contactphoto.php b/apps/contacts/templates/part.contactphoto.php deleted file mode 100644 index bddf4cc8a81..00000000000 --- a/apps/contacts/templates/part.contactphoto.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php -$id = $_['id']; -$wattr = isset($_['width'])?'width="'.$_['width'].'"':''; -$hattr = isset($_['height'])?'height="'.$_['height'].'"':''; -$rand = isset($_['refresh'])?'&refresh='.rand():''; -?> -<ul id="phototools" class="transparent hidden"> - <li><a class="svg delete" title="<?php echo $l->t('Delete current photo'); ?>"></a></li> - <li><a class="svg edit" title="<?php echo $l->t('Edit current photo'); ?>"></a></li> - <li><a class="svg upload" title="<?php echo $l->t('Upload new photo'); ?>"></a></li> - <li><a class="svg cloud" title="<?php echo $l->t('Select photo from ownCloud'); ?>"></a></li> -</ul> -<img class="loading" id="contacts_details_photo" <?php echo $wattr; ?> <?php echo $hattr; ?> src="<?php echo OCP\Util::linkToAbsolute('contacts', 'photo.php'); ?>?id=<?php echo $id.$rand; ?>" /> -<progress id="contacts_details_photo_progress" style="display:none;" value="0" max="100">0 %</progress> - - diff --git a/apps/contacts/templates/part.contacts.php b/apps/contacts/templates/part.contacts.php deleted file mode 100644 index 57517505405..00000000000 --- a/apps/contacts/templates/part.contacts.php +++ /dev/null @@ -1,12 +0,0 @@ -<?php foreach( $_['contacts'] as $contact ): - $display = trim($contact['fullname']); - if(!$display) { - $vcard = OC_Contacts_App::getContactVCard($contact['id']); - if(!is_null($vcard)) { - $struct = OC_Contacts_VCard::structureContact($vcard); - $display = isset($struct['EMAIL'][0])?$struct['EMAIL'][0]['value']:'[UNKNOWN]'; - } - } -?> - <li role="button" book-id="<?php echo $contact['addressbookid']; ?>" data-id="<?php echo $contact['id']; ?>"><a href="index.php?id=<?php echo $contact['id']; ?>"><?php echo htmlspecialchars($display); ?></a></li> -<?php endforeach; ?> diff --git a/apps/contacts/templates/part.cropphoto.php b/apps/contacts/templates/part.cropphoto.php index e1072179130..3f5817622b2 100644 --- a/apps/contacts/templates/part.cropphoto.php +++ b/apps/contacts/templates/part.cropphoto.php @@ -1,10 +1,9 @@ <?php $id = $_['id']; -$tmp_path = $_['tmp_path']; +$tmpkey = $_['tmpkey']; $requesttoken = $_['requesttoken']; -OCP\Util::writeLog('contacts','templates/part.cropphoto.php: tmp_path: '.$tmp_path.', exists: '.file_exists($tmp_path), OCP\Util::DEBUG); ?> -<script language="Javascript"> +<script type="text/javascript"> jQuery(function($) { $('#cropbox').Jcrop({ onChange: showCoords, @@ -39,7 +38,8 @@ OCP\Util::writeLog('contacts','templates/part.cropphoto.php: tmp_path: '.$tmp_pa return true; });*/ </script> -<img id="cropbox" src="<?php echo OCP\Util::linkToAbsolute('contacts', 'dynphoto.php'); ?>?tmp_path=<?php echo urlencode($tmp_path); ?>" /> +<?php if(OC_Cache::hasKey($tmpkey)) { ?> +<img id="cropbox" src="<?php echo OCP\Util::linkToAbsolute('contacts', 'tmpphoto.php'); ?>?tmpkey=<?php echo $tmpkey; ?>" /> <form id="cropform" class="coords" method="post" @@ -48,8 +48,8 @@ OCP\Util::writeLog('contacts','templates/part.cropphoto.php: tmp_path: '.$tmp_pa action="<?php echo OCP\Util::linkToAbsolute('contacts', 'ajax/savecrop.php'); ?>"> <input type="hidden" id="id" name="id" value="<?php echo $id; ?>" /> - <input type="hidden" id="requesttoken" name="requesttoken" value="<?php echo $requesttoken; ?>" /> - <input type="hidden" id="tmp_path" name="tmp_path" value="<?php echo $tmp_path; ?>" /> + <input type="hidden" name="requesttoken" value="<?php echo $requesttoken; ?>"> + <input type="hidden" id="tmpkey" name="tmpkey" value="<?php echo $tmpkey; ?>" /> <fieldset id="coords"> <input type="hidden" id="x1" name="x1" value="" /> <input type="hidden" id="y1" name="y1" value="" /> @@ -60,5 +60,8 @@ OCP\Util::writeLog('contacts','templates/part.cropphoto.php: tmp_path: '.$tmp_pa </fieldset> <iframe name="crop_target" id='crop_target' src=""></iframe> </form> - - +<?php +} else { + echo $l->t('The temporary image has been removed from cache.'); +} +?> diff --git a/apps/contacts/templates/part.edit_address_dialog.php b/apps/contacts/templates/part.edit_address_dialog.php index 8b3425033cc..81e24ba4d0e 100644 --- a/apps/contacts/templates/part.edit_address_dialog.php +++ b/apps/contacts/templates/part.edit_address_dialog.php @@ -1,13 +1,9 @@ <?php $adr = isset($_['adr'])?$_['adr']:array(); -$id = $_['id']; -$types = array(); -foreach(isset($adr['parameters']['TYPE'])?array($adr['parameters']['TYPE']):array() as $type) { - $types[] = strtoupper($type); -} +$id = isset($_['id'])?$_['id']:array(); +$types = isset($_['types'])?$_['types']:array(); ?> <div id="edit_address_dialog" title="<?php echo $l->t('Edit address'); ?>"> -<!-- ?php print_r($types); ? --> <fieldset id="address"> <dl class="form"> <dt> @@ -22,46 +18,46 @@ foreach(isset($adr['parameters']['TYPE'])?array($adr['parameters']['TYPE']):arra <label class="label" for="adr_pobox"><?php echo $l->t('PO Box'); ?></label> </dt> <dd> - <input type="text" id="adr_pobox" name="value[ADR][0]" placeholder="<?php echo $l->t('PO Box'); ?>" value="<?php echo isset($adr['value'][0])?$adr['value'][0]:''; ?>"> + <input type="text" id="adr_pobox" name="value[ADR][0]" placeholder="<?php echo $l->t('PO Box'); ?>" value="<?php echo isset($adr[0])?$adr[0]:''; ?>"> </dd> - <dd> <dt> - <label class="label" for="adr_extended"><?php echo $l->t('Extended'); ?></label> + <label class="label" for="adr_street"><?php echo $l->t('Street address'); ?></label> </dt> <dd> - <input type="text" id="adr_extended" name="value[ADR][1]" placeholder="<?php echo $l->t('Extended'); ?>" value="<?php echo isset($adr['value'][1])?$adr['value'][1]:''; ?>"> + <input type="text" id="adr_street" name="value[ADR][2]" placeholder="<?php echo $l->t('Street and number'); ?>" value="<?php echo isset($adr[2])?$adr[2]:''; ?>"> </dd> <dt> - <label class="label" for="adr_street"><?php echo $l->t('Street'); ?></label> + <label class="label" for="adr_extended"><?php echo $l->t('Extended'); ?></label> </dt> <dd> - <input type="text" id="adr_street" name="value[ADR][2]" placeholder="<?php echo $l->t('Street'); ?>" value="<?php echo isset($adr['value'][2])?$adr['value'][2]:''; ?>"> + <input type="text" id="adr_extended" name="value[ADR][1]" placeholder="<?php echo $l->t('Apartment number etc.'); ?>" value="<?php echo isset($adr[1])?$adr[1]:''; ?>"> </dd> <dt> <label class="label" for="adr_city"><?php echo $l->t('City'); ?></label> </dt> <dd> - <input type="text" id="adr_city" name="value[ADR][3]" placeholder="<?php echo $l->t('City'); ?>" value="<?php echo isset($adr['value'][3])?$adr['value'][3]:''; ?>"> + <input type="text" id="adr_city" name="value[ADR][3]" placeholder="<?php echo $l->t('City'); ?>" value="<?php echo isset($adr[3])?$adr[3]:''; ?>"> </dd> <dt> <label class="label" for="adr_region"><?php echo $l->t('Region'); ?></label> </dt> <dd> - <input type="text" id="adr_region" name="value[ADR][4]" placeholder="<?php echo $l->t('Region'); ?>" value="<?php echo isset($adr['value'][4])?$adr['value'][4]:''; ?>"> + <input type="text" id="adr_region" name="value[ADR][4]" placeholder="<?php echo $l->t('E.g. state or province'); ?>" value="<?php echo isset($adr[4])?$adr[4]:''; ?>"> </dd> <dt> <label class="label" for="adr_zipcode"><?php echo $l->t('Zipcode'); ?></label> </dt> <dd> - <input type="text" id="adr_zipcode" name="value[ADR][5]" placeholder="<?php echo $l->t('Zipcode'); ?>" value="<?php echo isset($adr['value'][5])?$adr['value'][5]:''; ?>"> + <input type="text" id="adr_zipcode" name="value[ADR][5]" placeholder="<?php echo $l->t('Postal code'); ?>" value="<?php echo isset($adr[5])?$adr[5]:''; ?>"> </dd> <dt> <label class="label" for="adr_country"><?php echo $l->t('Country'); ?></label> </dt> <dd> - <input type="text" id="adr_country" name="value[ADR][6]" placeholder="<?php echo $l->t('Country'); ?>" value="<?php echo isset($adr['value'][6])?$adr['value'][6]:''; ?>"> + <input type="text" id="adr_country" name="value[ADR][6]" placeholder="<?php echo $l->t('Country'); ?>" value="<?php echo isset($adr[6])?$adr[6]:''; ?>"> </dd> </dl> + <div style="width: 100%; text-align:center;">Powered by <a href="http://geonames.org/" target="_blank">geonames.org</a></div> </fieldset> </form> </div> diff --git a/apps/contacts/templates/part.edit_categories_dialog.php b/apps/contacts/templates/part.edit_categories_dialog.php deleted file mode 100644 index 8997fa586bd..00000000000 --- a/apps/contacts/templates/part.edit_categories_dialog.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php -$categories = isset($_['categories'])?$_['categories']:array(); -?> -<div id="edit_categories_dialog" title="<?php echo $l->t('Edit categories'); ?>"> -<!-- ?php print_r($types); ? --> - <form method="post" id="categoryform"> - <div class="scrollarea"> - <ul id="categorylist"> - <?php foreach($categories as $category) { ?> - <li><input type="checkbox" name="categories[]" value="<?php echo $category; ?>" /><?php echo $category; ?></li> - <?php } ?> - </ul> - </div> - <div class="bottombuttons"><input type="text" id="category_addinput" name="category" /><button id="category_addbutton" disabled="disabled"><?php echo $l->t('Add'); ?></button></div> - </form> -</div> diff --git a/apps/contacts/templates/part.edit_name_dialog.php b/apps/contacts/templates/part.edit_name_dialog.php index be45f9a5b06..f984c232a30 100644 --- a/apps/contacts/templates/part.edit_name_dialog.php +++ b/apps/contacts/templates/part.edit_name_dialog.php @@ -22,7 +22,7 @@ $addressbooks = isset($_['addressbooks'])?$_['addressbooks']:null; <?php }} ?> <dt><label for="pre"><?php echo $l->t('Hon. prefixes'); ?></label></dt> <dd> - <input name="pre" id="pre" value="<?php echo isset($name['value'][3]) ? $name['value'][3] : ''; ?>" type="text" list="prefixes" /> + <input name="pre" id="pre" value="<?php echo isset($name[3]) ? $name[3] : ''; ?>" type="text" list="prefixes" /> <datalist id="prefixes"> <option value="<?php echo $l->t('Miss'); ?>"> <option value="<?php echo $l->t('Ms'); ?>"> @@ -33,14 +33,14 @@ $addressbooks = isset($_['addressbooks'])?$_['addressbooks']:null; </datalist> </dd> <dt><label for="giv"><?php echo $l->t('Given name'); ?></label></dt> - <dd><input name="giv" id="giv" value="<?php echo isset($name['value'][1]) ? $name['value'][1] : ''; ?>" type="text" /></dd> + <dd><input name="giv" id="giv" value="<?php echo isset($name[1]) ? $name[1] : ''; ?>" type="text" /></dd> <dt><label for="add"><?php echo $l->t('Additional names'); ?></label></dt> - <dd><input name="add" id="add" value="<?php echo isset($name['value'][2]) ? $name['value'][2] : ''; ?>" type="text" /></dd> + <dd><input name="add" id="add" value="<?php echo isset($name[2]) ? $name[2] : ''; ?>" type="text" /></dd> <dt><label for="fam"><?php echo $l->t('Family name'); ?></label></dt> - <dd><input name="fam" id="fam" value="<?php echo isset($name['value'][0]) ? $name['value'][0] : ''; ?>" type="text" /></dd> + <dd><input name="fam" id="fam" value="<?php echo isset($name[0]) ? $name[0] : ''; ?>" type="text" /></dd> <dt><label for="suf"><?php echo $l->t('Hon. suffixes'); ?></label></dt> <dd> - <input name="suf" id="suf" value="<?php echo isset($name['value'][4]) ? $name['value'][4] : ''; ?>" type="text" list="suffixes" /> + <input name="suf" id="suf" value="<?php echo isset($name[4]) ? $name[4] : ''; ?>" type="text" list="suffixes" /> <datalist id="suffixes"> <option value="<?php echo $l->t('J.D.'); ?>"> <option value="<?php echo $l->t('M.D.'); ?>"> diff --git a/apps/contacts/templates/part.editaddressbook.php b/apps/contacts/templates/part.editaddressbook.php deleted file mode 100644 index c1c585687c4..00000000000 --- a/apps/contacts/templates/part.editaddressbook.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php -/** - * Copyright (c) 2011 Bart Visscher <bartv@thisnet.nl> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ -?> -<td id="<?php echo $_['new'] ? 'new' : 'edit' ?>addressbook_dialog" title="<?php echo $_['new'] ? $l->t("New Addressbook") : $l->t("Edit Addressbook"); ?>" colspan="6"> -<table width="100%" style="border: 0;"> -<tr> - <th><?php echo $l->t('Displayname') ?></th> - <td> - <input id="displayname_<?php echo $_['addressbook']['id'] ?>" type="text" value="<?php echo htmlspecialchars($_['addressbook']['displayname']) ?>"> - </td> -</tr> -<?php if (!$_['new']): ?> -<tr> - <td></td> - <td> - <input id="edit_active_<?php echo $_['addressbook']['id'] ?>" type="checkbox"<?php echo OC_Contacts_Addressbook::isActive($_['addressbook']['id']) ? ' checked="checked"' : '' ?>> - <label for="edit_active_<?php echo $_['addressbook']['id'] ?>"> - <?php echo $l->t('Active') ?> - </label> - </td> -</tr> -<?php endif; ?> -</table> -<input style="float: left;" type="button" onclick="Contacts.UI.Addressbooks.submit(this, <?php echo $_['new'] ? "'new'" : $_['addressbook']['id'] ?>);" value="<?php echo $_['new'] ? $l->t("Save") : $l->t("Submit"); ?>"> -<input style="float: left;" type="button" onclick="Contacts.UI.Addressbooks.cancel(this, <?php echo $_['new'] ? "'new'" : $_['addressbook']['id'] ?>);" value="<?php echo $l->t("Cancel"); ?>"> -</td> diff --git a/apps/contacts/templates/part.import.php b/apps/contacts/templates/part.import.php index b8793042997..32c8dc50dd6 100644 --- a/apps/contacts/templates/part.import.php +++ b/apps/contacts/templates/part.import.php @@ -2,7 +2,7 @@ <div id="form_container"> <input type="hidden" id="filename" value="<?php echo $_['filename'];?>"> <input type="hidden" id="path" value="<?php echo $_['path'];?>"> - <input type="hidden" id="progressfile" value="<?php echo md5(session_id()) . '.txt';?>"> + <input type="hidden" id="progresskey" value="<?php echo rand() ?>"> <p class="bold" style="text-align:center;"><?php echo $l->t('Please choose the addressbook'); ?></p> <select style="width:100%;" id="contacts" name="contacts"> <?php diff --git a/apps/contacts/templates/part.importaddressbook.php b/apps/contacts/templates/part.importaddressbook.php deleted file mode 100644 index c7c6555f680..00000000000 --- a/apps/contacts/templates/part.importaddressbook.php +++ /dev/null @@ -1,36 +0,0 @@ -<?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. - */ -?> -<td id="importaddressbook_dialog" colspan="6"> -<table> -<tr> - <th><?php echo $l->t('Select address book to import to:') ?></th> - <td> - <form id="import_upload_form" action="<?php echo OCP\Util::linkTo('contacts', 'ajax/uploadimport.php'); ?>" method="post" enctype="multipart/form-data" target="import_upload_target"> - <input type="hidden" name="requesttoken" value="<?php echo $_['requesttoken'] ?>"> - <select id="book" name="book" class="float"> - <?php - $contacts_options = OC_Contacts_Addressbook::all(OCP\USER::getUser()); - echo OCP\html_select_options($contacts_options, $contacts_options[0]['id'], array('value'=>'id', 'label'=>'displayname')); - ?> - </select> - <span id="import_drop_target" class="droptarget float"><?php echo $l->t("Drop a VCF file<br />to import contacts."); ?> (Max. <?php echo $_['uploadMaxHumanFilesize']; ?>)</span> - <a class="svg upload float" title="<?php echo $l->t('Select from HD'); ?>"> - <input class="float" id="import_upload_start" type="file" accept="text/*" name="importfile" /></a> - <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $_['uploadMaxFilesize'] ?>" id="max_upload"> - </form> - </td> -</tr> -</table> - -<input id="close_button" style="float: left;" type="button" onclick="Contacts.UI.Addressbooks.cancel(this);" value="<?php echo $l->t("Cancel"); ?>"> -<iframe name="import_upload_target" id='import_upload_target' src=""></iframe> -</td> -<script type="text/javascript"> -Contacts.UI.Addressbooks.loadImportHandlers(); -</script>
\ No newline at end of file diff --git a/apps/contacts/templates/part.no_contacts.php b/apps/contacts/templates/part.no_contacts.php index 5faa481bc3c..1802939483b 100644 --- a/apps/contacts/templates/part.no_contacts.php +++ b/apps/contacts/templates/part.no_contacts.php @@ -1,7 +1,7 @@ +<div id="appsettings" class="popup bottomleft hidden"></div> <div id="firstrun"> <?php echo $l->t('You have no contacts in your addressbook.') ?> <div id="selections"> - <input type="button" value="<?php echo $l->t('Add contact') ?>" onclick="Contacts.UI.Card.editNew()" /> - <input type="button" value="<?php echo $l->t('Configure addressbooks') ?>" onclick="Contacts.UI.Addressbooks.overview()" /> + <input type="button" value="<?php echo $l->t('Add contact') ?>" onclick="OC.Contacts.Card.editNew()" /> </div> </div> diff --git a/apps/contacts/templates/part.selectaddressbook.php b/apps/contacts/templates/part.selectaddressbook.php index 4b152a6e1d3..812a3b891ff 100644 --- a/apps/contacts/templates/part.selectaddressbook.php +++ b/apps/contacts/templates/part.selectaddressbook.php @@ -1,16 +1,33 @@ <div id="selectaddressbook_dialog" title="<?php echo $l->t("Select Address Books"); ?>"> +<script type="text/javascript"> +$(document).ready(function() { + $('input.name,input.desc').on('focus', function(e) { + $('#book_new').prop('checked', true); + }); +}); +</script> <form> -<table> +<table style="width: 100%"> <?php foreach($_['addressbooks'] as $idx => $addressbook) { ?> <tr> <td> <input id="book_<?php echo $addressbook['id']; ?>" name="book" type="radio" value="<?php echo $addressbook['id']; ?>" <?php echo ($idx==0?'checked="checked"':'')?>> </td> <td> - <label for="book_<?php echo $addressbook['id']; ?>"><?php echo $addressbook['name']; ?></label> + <label for="book_<?php echo $addressbook['id']; ?>"><?php echo $addressbook['displayname']; ?></label> </td> + <td><?php echo $addressbook['description']; ?></td> </tr> <?php } ?> + <tr> + <td> + <input id="book_new" name="book" type="radio" value="new"> + </td> + <th> + <input type="text" class="name" name="displayname" placeholder="<?php echo $l->t("Enter name"); ?>" /> + </th> + <td><input type="text" class="desc" name="description" placeholder="<?php echo $l->t("Enter description"); ?>" /></td> + </tr> </table> </form> </div> diff --git a/apps/contacts/templates/settings.php b/apps/contacts/templates/settings.php index 216003b6c69..e3536c7b461 100644 --- a/apps/contacts/templates/settings.php +++ b/apps/contacts/templates/settings.php @@ -1,13 +1,55 @@ -<form id="contacts"> +<form id="contacts-settings"> <fieldset class="personalblock"> - <legend><?php echo $l->t('Contacts'); ?></legend> <?php echo $l->t('CardDAV syncing addresses'); ?> (<a href="http://owncloud.org/synchronisation/" target="_blank"><?php echo $l->t('more info'); ?></a>) <dl> <dt><?php echo $l->t('Primary address (Kontact et al)'); ?></dt> <dd><code><?php echo OCP\Util::linkToRemote('carddav'); ?></code></dd> <dt><?php echo $l->t('iOS/OS X'); ?></dt> <dd><code><?php echo OCP\Util::linkToRemote('carddav'); ?>principals/<?php echo OCP\USER::getUser(); ?></code>/</dd> + <dt class="hidden"><?php echo $l->t('Addressbooks'); ?></dt> + <dd class="addressbooks-settings hidden"> + <table> + <?php foreach($_['addressbooks'] as $addressbook) { ?> + <tr class="addressbook" data-id="<?php echo $addressbook['id'] ?>" data-uri="<?php echo $addressbook['uri'] ?>"> + <td class="active"> + <input type="checkbox" <?php echo (($addressbook['active']) == '1' ? ' checked="checked"' : ''); ?> /> + </td> + <td class="name"><?php echo $addressbook['displayname'] ?></td> + <td class="description"><?php echo $addressbook['description'] ?></td> + <td class="action"> + <a class="svg action globe" title="<?php echo $l->t('Show CardDav link'); ?>"></a> + </td> + <td class="action"> + <a class="svg action cloud" title="<?php echo $l->t('Show read-only VCF link'); ?>"></a> + </td> + <td class="action"> + <a class="svg action share" data-item-type="addressbook" data-item="<?php echo $addressbook['id'] ?>" title="<?php echo $l->t("Share"); ?>"></a> + </td> + <td class="action"> + <a class="svg action download" title="<?php echo $l->t('Download'); ?>" + href="<?php echo OCP\Util::linkToAbsolute('contacts', 'export.php'); ?>?bookid=<?php echo $addressbook['id'] ?>"></a> + </td> + <td class="action"> + <a class="svg action edit" title="<?php echo $l->t("Edit"); ?>"></a> + </td> + <td class="action"> + <a class="svg action delete" title="<?php echo $l->t("Delete"); ?>"></a> + </td> + </tr> + <?php } ?> + </table> + <div class="actions" style="width: 100%;"> + <input class="active hidden" type="checkbox" /> + <button class="new"><?php echo $l->t('New Address Book') ?></button> + <input class="name hidden" type="text" autofocus="autofocus" placeholder="<?php echo $l->t('Name'); ?>" /> + <input class="description hidden" type="text" placeholder="<?php echo $l->t('Description'); ?>" /> + <button class="save hidden"><?php echo $l->t('Save') ?></button> + <button class="cancel hidden"><?php echo $l->t('Cancel') ?></button> + </div> + </dd> </dl> - Powered by <a href="http://geonames.org/" target="_blank">geonames.org webservice</a> + <div style="width: 100%; clear: both;"> + <button class="moreless"><?php echo $l->t('More...') ?></button> + </div> </fieldset> </form> diff --git a/apps/contacts/thumbnail.php b/apps/contacts/thumbnail.php index a64b09b6711..1e3714ae6c6 100644 --- a/apps/contacts/thumbnail.php +++ b/apps/contacts/thumbnail.php @@ -20,32 +20,33 @@ * */ -// Init owncloud - OCP\JSON::checkLoggedIn(); //OCP\User::checkLoggedIn(); OCP\App::checkAppEnabled('contacts'); +session_write_close(); -function getStandardImage(){ - //OCP\Response::setExpiresHeader('P10D'); +function getStandardImage() { OCP\Response::enableCaching(); OCP\Response::redirect(OCP\Util::imagePath('contacts', 'person.png')); } if(!extension_loaded('gd') || !function_exists('gd_info')) { - OCP\Util::writeLog('contacts','thumbnail.php. GD module not installed',OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', + 'thumbnail.php. GD module not installed', OCP\Util::DEBUG); getStandardImage(); exit(); } $id = $_GET['id']; -$caching = isset($_GET['refresh']) ? 0 : null; +$caching = null; $contact = OC_Contacts_App::getContactVCard($id); // invalid vcard -if(is_null($contact)){ - OCP\Util::writeLog('contacts','thumbnail.php. The VCard for ID '.$id.' is not RFC compatible',OCP\Util::ERROR); +if(is_null($contact)) { + OCP\Util::writeLog('contacts', + 'thumbnail.php. The VCard for ID ' . $id . ' is not RFC compatible', + OCP\Util::ERROR); getStandardImage(); exit(); } @@ -58,25 +59,40 @@ $thumbnail_size = 23; $image = new OC_Image(); $photo = $contact->getAsString('PHOTO'); if($photo) { - OCP\Response::setETagHeader(md5($photo)); - if($image->loadFromBase64($photo)) { if($image->centerCrop()) { if($image->resize($thumbnail_size)) { + $modified = OC_Contacts_App::lastModified($contact); + // Force refresh if modified within the last minute. + if(!is_null($modified)) { + $caching = (time() - $modified->format('U') > 60) ? null : 0; + } + OCP\Response::enableCaching($caching); + if(!is_null($modified)) { + OCP\Response::setLastModifiedHeader($modified); + } + OCP\Response::setETagHeader(md5($photo)); if($image->show()) { - // done exit(); } else { - OCP\Util::writeLog('contacts','thumbnail.php. Couldn\'t display thumbnail for ID '.$id,OCP\Util::ERROR); + OCP\Util::writeLog('contacts', + 'thumbnail.php. Couldn\'t display thumbnail for ID ' . $id, + OCP\Util::ERROR); } } else { - OCP\Util::writeLog('contacts','thumbnail.php. Couldn\'t resize thumbnail for ID '.$id,OCP\Util::ERROR); + OCP\Util::writeLog('contacts', + 'thumbnail.php. Couldn\'t resize thumbnail for ID ' . $id, + OCP\Util::ERROR); } }else{ - OCP\Util::writeLog('contacts','thumbnail.php. Couldn\'t crop thumbnail for ID '.$id,OCP\Util::ERROR); + OCP\Util::writeLog('contacts', + 'thumbnail.php. Couldn\'t crop thumbnail for ID ' . $id, + OCP\Util::ERROR); } } else { - OCP\Util::writeLog('contacts','thumbnail.php. Couldn\'t load image string for ID '.$id,OCP\Util::ERROR); + OCP\Util::writeLog('contacts', + 'thumbnail.php. Couldn\'t load image string for ID ' . $id, + OCP\Util::ERROR); } } getStandardImage(); diff --git a/apps/contacts/dynphoto.php b/apps/contacts/tmpphoto.php index ea6cef227e1..156d5c80308 100644 --- a/apps/contacts/dynphoto.php +++ b/apps/contacts/tmpphoto.php @@ -20,15 +20,14 @@ * */ -// Init owncloud - -$tmp_path = $_GET['tmp_path']; +$tmpkey = $_GET['tmpkey']; $maxsize = isset($_GET['maxsize']) ? $_GET['maxsize'] : -1; header("Cache-Control: no-cache, no-store, must-revalidate"); -OCP\Util::writeLog('contacts','dynphoto.php: tmp_path: '.$tmp_path.', exists: '.file_exists($tmp_path), OCP\Util::DEBUG); +OCP\Util::writeLog('contacts', 'tmpphoto.php: tmpkey: '.$tmpkey, OCP\Util::DEBUG); -$image = new OC_Image($tmp_path); +$image = new OC_Image(); +$image->loadFromData(OC_Cache::get($tmpkey)); if($maxsize != -1) { $image->resize($maxsize); } |