aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xINSTALL.txt5
-rwxr-xr-xboot.php37
-rwxr-xr-xdatabase.sql34
-rwxr-xr-xdoc/Pages.md2
-rwxr-xr-xdoc/Plugins.md40
-rwxr-xr-xdoc/developer18
-rw-r--r--images/beer_mug.gifbin0 -> 1032 bytes
-rw-r--r--images/coffee.gifbin0 -> 231 bytes
-rw-r--r--images/icons/10/audio.pngbin0 -> 470 bytes
-rw-r--r--images/icons/10/image.pngbin0 -> 455 bytes
-rw-r--r--images/icons/10/text.pngbin0 -> 435 bytes
-rw-r--r--images/icons/10/video.pngbin0 -> 454 bytes
-rw-r--r--images/icons/10/zip.pngbin0 -> 468 bytes
-rw-r--r--images/icons/16/audio.pngbin0 -> 599 bytes
-rw-r--r--images/icons/16/image.pngbin0 -> 667 bytes
-rw-r--r--images/icons/16/text.pngbin0 -> 503 bytes
-rw-r--r--images/icons/16/video.pngbin0 -> 527 bytes
-rw-r--r--images/icons/16/zip.pngbin0 -> 623 bytes
-rw-r--r--images/icons/22/audio.pngbin0 -> 713 bytes
-rw-r--r--images/icons/22/image.pngbin0 -> 916 bytes
-rw-r--r--images/icons/22/text.pngbin0 -> 583 bytes
-rw-r--r--images/icons/22/video.pngbin0 -> 616 bytes
-rw-r--r--images/icons/22/zip.pngbin0 -> 785 bytes
-rw-r--r--images/icons/48/audio.pngbin0 -> 1307 bytes
-rw-r--r--images/icons/48/image.pngbin0 -> 2229 bytes
-rw-r--r--images/icons/48/text.pngbin0 -> 972 bytes
-rw-r--r--images/icons/48/video.pngbin0 -> 1022 bytes
-rw-r--r--images/icons/48/zip.pngbin0 -> 1659 bytes
-rwxr-xr-ximages/icons/Makefile3
-rw-r--r--images/icons/audio.pngbin0 -> 7975 bytes
-rw-r--r--images/icons/image.pngbin0 -> 13987 bytes
-rw-r--r--images/icons/text.pngbin0 -> 6177 bytes
-rw-r--r--images/icons/video.pngbin0 -> 6151 bytes
-rw-r--r--images/icons/zip.pngbin0 -> 9829 bytes
-rw-r--r--images/smiley-bangheaddesk.gifbin0 -> 885 bytes
-rw-r--r--images/smiley-facepalm.gifbin0 -> 582 bytes
-rwxr-xr-xinclude/attach.php14
-rwxr-xr-xinclude/auth.php2
-rwxr-xr-xinclude/bb2diaspora.php15
-rwxr-xr-xinclude/bbcode.php85
-rwxr-xr-xinclude/conversation.php254
-rwxr-xr-xinclude/datetime.php9
-rwxr-xr-xinclude/delivery.php22
-rwxr-xr-xinclude/diaspora.php31
-rwxr-xr-xinclude/enotify.php60
-rwxr-xr-xinclude/expire.php5
-rwxr-xr-xinclude/items.php107
-rwxr-xr-xinclude/network.php3
-rwxr-xr-xinclude/notifier.php24
-rwxr-xr-xinclude/oembed.php2
-rwxr-xr-xinclude/plugin.php38
-rwxr-xr-xinclude/poller.php4
-rwxr-xr-xinclude/profile_advanced.php2
-rwxr-xr-xinclude/text.php103
-rw-r--r--library/fullcalendar/GPL-LICENSE.txt278
-rw-r--r--library/fullcalendar/MIT-LICENSE.txt20
-rw-r--r--library/fullcalendar/changelog.txt318
-rw-r--r--library/fullcalendar/fullcalendar.css618
-rw-r--r--library/fullcalendar/fullcalendar.js5224
-rw-r--r--library/fullcalendar/fullcalendar.min.js114
-rw-r--r--library/fullcalendar/fullcalendar.print.css61
-rw-r--r--library/fullcalendar/gcal.js112
-rwxr-xr-xlibrary/slinky.php32
-rw-r--r--library/spam/README12
-rw-r--r--library/spam/b8/b8.php503
-rw-r--r--library/spam/b8/b8.php.ORIG503
-rw-r--r--library/spam/b8/degenerator/degenerator_default.php127
-rw-r--r--library/spam/b8/lexer/lexer_default.php205
-rw-r--r--library/spam/b8/storage/storage_base.php396
-rw-r--r--library/spam/b8/storage/storage_base.php.ORIG395
-rw-r--r--library/spam/b8/storage/storage_dba.php198
-rw-r--r--library/spam/b8/storage/storage_frndc.php344
-rw-r--r--library/spam/b8/storage/storage_mysql.php351
-rw-r--r--library/spam/doc/COPYING504
-rw-r--r--library/spam/doc/ChangeLog179
-rw-r--r--library/spam/doc/readme.htm707
-rw-r--r--library/spam/doc/readme.rst371
-rw-r--r--library/spam/example/index.php241
-rw-r--r--library/spam/install/setup_berkeleydb.php240
-rw-r--r--library/spam/install/setup_mysql.sql27
-rwxr-xr-xlibrary/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js2
-rwxr-xr-xmod/admin.php48
-rwxr-xr-xmod/community.php4
-rwxr-xr-xmod/contacts.php106
-rwxr-xr-xmod/dfrn_confirm.php98
-rwxr-xr-xmod/dfrn_poll.php1
-rwxr-xr-xmod/dfrn_request.php1
-rwxr-xr-xmod/directory.php2
-rwxr-xr-xmod/display.php18
-rwxr-xr-xmod/editpost.php8
-rwxr-xr-xmod/events.php145
-rwxr-xr-xmod/install.php11
-rwxr-xr-xmod/item.php39
-rwxr-xr-xmod/network.php50
-rwxr-xr-xmod/newmember.php28
-rwxr-xr-xmod/notifications.php3
-rwxr-xr-xmod/oembed.php15
-rwxr-xr-xmod/oexchange.php20
-rwxr-xr-xmod/parse_url.php40
-rwxr-xr-xmod/profile.php2
-rwxr-xr-xmod/redir.php79
-rwxr-xr-xmod/register.php4
-rwxr-xr-xmod/regmod.php2
-rwxr-xr-xmod/settings.php10
-rwxr-xr-xmod/smilies.php3
-rwxr-xr-xmod/wall_attach.php2
-rwxr-xr-xmod/wall_upload.php6
-rwxr-xr-xupdate.php55
-rw-r--r--util/fpostit/README8
-rw-r--r--util/fpostit/fpostit.js11
-rw-r--r--util/fpostit/fpostit.php129
-rw-r--r--util/fpostit/friendika-32.pngbin0 -> 1593 bytes
-rwxr-xr-xutil/messages.po5538
-rwxr-xr-xview/comment_item.tpl6
-rwxr-xr-xview/contacts-top.tpl8
-rw-r--r--[-rwxr-xr-x]view/de/messages.po7386
-rwxr-xr-xview/de/strings.php1693
-rw-r--r--view/event.tpl10
-rwxr-xr-xview/event_form.tpl4
-rwxr-xr-xview/event_head.tpl67
-rw-r--r--view/events-js.tpl6
-rw-r--r--view/events.tpl24
-rwxr-xr-xview/head.tpl17
-rwxr-xr-xview/install_checks.tpl2
-rwxr-xr-xview/intros.tpl1
-rwxr-xr-xview/jot-header.tpl44
-rwxr-xr-xview/jot.tpl5
-rwxr-xr-xview/mail_conv.tpl2
-rwxr-xr-xview/nav.tpl2
-rwxr-xr-xview/profile_advanced.tpl45
-rwxr-xr-xview/search_item.tpl10
-rwxr-xr-xview/settings.tpl1
-rwxr-xr-xview/theme/dispy/jot-header.tpl52
-rwxr-xr-xview/theme/dispy/jot.tpl2
-rwxr-xr-xview/theme/dispy/style.css8
-rwxr-xr-xview/theme/dispy/wall_item.tpl2
-rwxr-xr-xview/theme/dispy/wallwall_item.tpl2
-rwxr-xr-xview/theme/duepuntozero/comment_item.tpl32
-rwxr-xr-xview/theme/duepuntozero/jot.tpl2
-rwxr-xr-xview/theme/duepuntozero/style.css20
-rwxr-xr-xview/theme/duepuntozero/wall_item.tpl2
-rwxr-xr-xview/theme/duepuntozero/wallwall_item.tpl2
-rwxr-xr-xview/theme/loozah/comment_item.tpl32
-rwxr-xr-xview/theme/loozah/jot.tpl2
-rwxr-xr-xview/theme/loozah/wall_item.tpl2
-rwxr-xr-xview/theme/loozah/wallwall_item.tpl2
-rwxr-xr-xview/theme/quattro-green/colors.less94
-rwxr-xr-xview/theme/quattro-green/contact_template.tpl21
-rwxr-xr-xview/theme/quattro-green/experimental (renamed from view/theme/darkbubble/experimental)0
-rwxr-xr-xview/theme/quattro-green/style.css1374
-rwxr-xr-xview/theme/quattro-green/style.less14
-rwxr-xr-xview/theme/quattro/icons.less5
-rwxr-xr-xview/theme/quattro/quattro.less106
-rwxr-xr-xview/theme/quattro/style.css163
-rwxr-xr-xview/theme/testbubble/comment_item.tpl7
-rwxr-xr-xview/theme/testbubble/jot-header.tpl52
-rwxr-xr-xview/theme/testbubble/jot.tpl2
-rwxr-xr-xview/theme/testbubble/style.css9
-rwxr-xr-xview/theme/testbubble/wall_item.tpl2
-rwxr-xr-xview/theme/testbubble/wallwall_item.tpl24
-rw-r--r--view/theme/vier/style.css23
161 files changed, 23085 insertions, 7793 deletions
diff --git a/INSTALL.txt b/INSTALL.txt
index 70027dc4c..fdd54b765 100755
--- a/INSTALL.txt
+++ b/INSTALL.txt
@@ -107,6 +107,11 @@ one shown, substituting for your unique paths and settings:
You can generally find the location of PHP by executing "which php". If you
have troubles with this section please contact your hosting provider for
assistance. Friendika will not work correctly if you cannot perform this step.
+
+You should also be sure that $a->config['php_path'] is set correctly, it should
+look like (changing it to the correct PHP location)
+
+$a->config['php_path'] = '/usr/local/php53/bin/php'
Alternative: You may be able to use the 'poormancron' plugin to perform this
step if you are using a recent Friendika release. 'poormancron' may result in
diff --git a/boot.php b/boot.php
index c2c99a55e..0c79b6e54 100755
--- a/boot.php
+++ b/boot.php
@@ -9,9 +9,9 @@ require_once('include/nav.php');
require_once('include/cache.php');
define ( 'FRIENDICA_PLATFORM', 'Friendica');
-define ( 'FRIENDICA_VERSION', '2.3.1237' );
+define ( 'FRIENDICA_VERSION', '2.3.1255' );
define ( 'DFRN_PROTOCOL_VERSION', '2.22' );
-define ( 'DB_UPDATE_VERSION', 1118 );
+define ( 'DB_UPDATE_VERSION', 1122 );
define ( 'EOL', "<br />\r\n" );
define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' );
@@ -101,10 +101,12 @@ define ( 'NETWORK_OSTATUS', 'stat'); // status.net, identi.ca, GNU-s
define ( 'NETWORK_FEED', 'feed'); // RSS/Atom feeds with no known "post/notify" protocol
define ( 'NETWORK_DIASPORA', 'dspr'); // Diaspora
define ( 'NETWORK_MAIL', 'mail'); // IMAP/POP
+define ( 'NETWORK_MAIL2', 'mai2'); // extended IMAP/POP
define ( 'NETWORK_FACEBOOK', 'face'); // Facebook API
define ( 'NETWORK_LINKEDIN', 'lnkd'); // LinkedIn
define ( 'NETWORK_XMPP', 'xmpp'); // XMPP
define ( 'NETWORK_MYSPACE', 'mysp'); // MySpace
+define ( 'NETWORK_GPLUS', 'goog'); // Google+
/**
* Maximum number of "people who like (or don't like) this" that we will list by name
@@ -123,14 +125,15 @@ define ( 'ZCURL_TIMEOUT' , (-1));
* email notification options
*/
-define ( 'NOTIFY_INTRO', 0x0001 );
-define ( 'NOTIFY_CONFIRM', 0x0002 );
-define ( 'NOTIFY_WALL', 0x0004 );
-define ( 'NOTIFY_COMMENT', 0x0008 );
-define ( 'NOTIFY_MAIL', 0x0010 );
-define ( 'NOTIFY_SUGGEST', 0x0020 );
-define ( 'NOTIFY_PROFILE', 0x0040 );
-
+define ( 'NOTIFY_INTRO', 0x0001 );
+define ( 'NOTIFY_CONFIRM', 0x0002 );
+define ( 'NOTIFY_WALL', 0x0004 );
+define ( 'NOTIFY_COMMENT', 0x0008 );
+define ( 'NOTIFY_MAIL', 0x0010 );
+define ( 'NOTIFY_SUGGEST', 0x0020 );
+define ( 'NOTIFY_PROFILE', 0x0040 );
+define ( 'NOTIFY_TAGSELF', 0x0080 );
+define ( 'NOTIFY_TAGSHARE', 0x0100 );
/**
* various namespaces we may need to parse
@@ -816,7 +819,7 @@ function profile_load(&$a, $nickname, $profile = 0) {
}
$r = null;
-
+
if($profile) {
$profile_int = intval($profile);
$r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `contact`.`avatar-date` AS picdate, `user`.* FROM `profile`
@@ -826,7 +829,7 @@ function profile_load(&$a, $nickname, $profile = 0) {
intval($profile_int)
);
}
- if(! count($r)) {
+ if((! $r) && (! count($r))) {
$r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `contact`.`avatar-date` AS picdate, `user`.* FROM `profile`
left join `contact` on `contact`.`uid` = `profile`.`uid` LEFT JOIN `user` ON `profile`.`uid` = `user`.`uid`
WHERE `user`.`nickname` = '%s' AND `profile`.`is-default` = 1 and `contact`.`self` = 1 LIMIT 1",
@@ -839,6 +842,16 @@ function profile_load(&$a, $nickname, $profile = 0) {
$a->error = 404;
return;
}
+
+ // fetch user tags if this isn't the default profile
+
+ if(! $r[0]['is-default']) {
+ $x = q("select `pub_keywords` from `profile` where uid = %d and `is-default` = 1 limit 1",
+ intval($profile_uid)
+ );
+ if($x && count($x))
+ $r[0]['pub_keywords'] = $x[0]['pub_keywords'];
+ }
$a->profile = $r[0];
diff --git a/database.sql b/database.sql
index 9a2e5c8dd..32d7cf40b 100755
--- a/database.sql
+++ b/database.sql
@@ -96,6 +96,7 @@ CREATE TABLE IF NOT EXISTS `contact` (
`pending` tinyint(1) NOT NULL DEFAULT '1',
`rating` tinyint(1) NOT NULL DEFAULT '0',
`reason` text NOT NULL,
+ `closeness` tinyint(2) NOT NULL DEFAULT '99',
`info` mediumtext NOT NULL,
`profile-id` int(11) NOT NULL DEFAULT '0',
`bdyear` CHAR( 4 ) NOT NULL COMMENT 'birthday notify flag',
@@ -116,7 +117,8 @@ CREATE TABLE IF NOT EXISTS `contact` (
KEY `blocked` (`blocked`),
KEY `readonly` (`readonly`),
KEY `hidden` (`hidden`),
- KEY `pending` (`pending`)
+ KEY `pending` (`pending`),
+ KEY `closeness` (`closeness`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
@@ -224,6 +226,7 @@ CREATE TABLE IF NOT EXISTS `item` (
`pubmail` tinyint(1) NOT NULL DEFAULT '0',
`moderated` tinyint(1) NOT NULL DEFAULT '0',
`visible` tinyint(1) NOT NULL DEFAULT '0',
+ `spam` tinyint(1) NOT NULL DEFAULT '0',
`starred` tinyint(1) NOT NULL DEFAULT '0',
`bookmark` tinyint(1) NOT NULL DEFAULT '0',
`unseen` tinyint(1) NOT NULL DEFAULT '1',
@@ -245,6 +248,7 @@ CREATE TABLE IF NOT EXISTS `item` (
KEY `received` (`received`),
KEY `moderated` (`moderated`),
KEY `visible` (`visible`),
+ KEY `spam` (`spam`),
KEY `starred` (`starred`),
KEY `bookmark` (`bookmark`),
KEY `deleted` (`deleted`),
@@ -777,3 +781,31 @@ INDEX ( `uid` ),
INDEX ( `mid` )
) ENGINE = MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE IF NOT EXISTS `poll_result` (
+`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+`poll_id` INT NOT NULL ,
+`choice` INT NOT NULL ,
+INDEX ( `poll_id` ),
+INDEX ( `choice` )
+) ENGINE = MyISAM DEFAULT CHARSET=utf8;
+
+
+CREATE TABLE IF NOT EXISTS `poll` (
+`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+`uid` INT NOT NULL ,
+`q0` MEDIUMTEXT NOT NULL ,
+`q1` MEDIUMTEXT NOT NULL ,
+`q2` MEDIUMTEXT NOT NULL ,
+`q3` MEDIUMTEXT NOT NULL ,
+`q4` MEDIUMTEXT NOT NULL ,
+`q5` MEDIUMTEXT NOT NULL ,
+`q6` MEDIUMTEXT NOT NULL ,
+`q7` MEDIUMTEXT NOT NULL ,
+`q8` MEDIUMTEXT NOT NULL ,
+`q9` MEDIUMTEXT NOT NULL ,
+INDEX ( `uid` )
+) ENGINE = MyISAM DEFAULT CHARSET=utf8;
+
+
+
+
diff --git a/doc/Pages.md b/doc/Pages.md
index ff2fb9fb3..d0e6776a4 100755
--- a/doc/Pages.md
+++ b/doc/Pages.md
@@ -24,7 +24,7 @@ The "Automatic Friend Account" is typically used for personal profile pages wher
We recommend that you create group pages with the same email address and password as your normal account. If you do this, you will find a new "Manage" tab on the menu bar which lets you toggle identities easily and manage your pages. You are not required to do this, but the alternative is to logout and log back into the other account to manage alternate pages - and this could get cumbersome if you manage several different pages/identities.
-You may also appoint a delegate to manage your page. Do this by visiting the [Delegation Setup Page](/delegate). This will provide you with a list of contacts on this system under "Potential Delegates". Selecting one or more persons will give them access to manage your page. They will be able to edit contacts, profiles, and all content for this account/page. Please use this facility wisely. Delegated managers will not be able to alter basic account settings such as passwords or page types and/or remove the account.
+You may also appoint a delegate to manage your page. Do this by visiting the [Delegation Setup Page](delegate). This will provide you with a list of contacts on this system under "Potential Delegates". Selecting one or more persons will give them access to manage your page. They will be able to edit contacts, profiles, and all content for this account/page. Please use this facility wisely. Delegated managers will not be able to alter basic account settings such as passwords or page types and/or remove the account.
**Posting to Community Pages**
diff --git a/doc/Plugins.md b/doc/Plugins.md
index 70a8726c7..29dff3187 100755
--- a/doc/Plugins.md
+++ b/doc/Plugins.md
@@ -1,11 +1,20 @@
**Friendica Addon/Plugin development**
-This is an early specification and hook details may be subject to change.
-
Please see the sample addon 'randplace' for a working example of using some of these features. The facebook addon provides an example of integrating both "addon" and "module" functionality. Addons work by intercepting event hooks - which must be registered. Modules work by intercepting specific page requests (by URL path).
-Plugin names cannot contain spaces and are used as filenames. Each addon must contain both an install and an uninstall function based on the addon/plugin name. For instance "plugin1name_install()". These two functions take no arguments and are usually responsible for registering (and unregistering) event hooks that your plugin will require. The install and uninstall functions will also be called (i.e. re-installed) if the plugin changes after installation - therefore your uninstall should not destroy data and install should consider that data may already exist. Future extensions may provide for "setup" amd "remove".
+Plugin names cannot contain spaces or other punctuation and are used as filenames and function names. You may supply a "friendly" name within the comment block. Each addon must contain both an install and an uninstall function based on the addon/plugin name. For instance "plugin1name_install()". These two functions take no arguments and are usually responsible for registering (and unregistering) event hooks that your plugin will require. The install and uninstall functions will also be called (i.e. re-installed) if the plugin changes after installation - therefore your uninstall should not destroy data and install should consider that data may already exist. Future extensions may provide for "setup" amd "remove".
+
+Plugins should contain a comment block with the four following parameters:
+
+ /*
+ * Name: My Great Plugin
+ * Description: This is what my plugin does. It's really cool
+ * Version: 1.0
+ * Author: John Q. Public <john@myfriendicasite.com>
+ */
+
+
Register your plugin hooks during installation.
@@ -160,7 +169,8 @@ Your module functions will often contain the function plugin_name_content(&$a),
$b is (string) HTML of content div
-A complete list of all hook callbacks with file locations (generated 09-Nov-2011): Please see the source for details of any hooks not documented above.
+A complete list of all hook callbacks with file locations (generated 14-Feb-2012): Please see the source for details of any hooks not documented above.
+
boot.php: call_hooks('login_hook',$o);
@@ -170,7 +180,7 @@ boot.php: call_hooks('profile_sidebar', $arr);
boot.php: call_hooks("proc_run", $arr);
-include/contact_selectors.php: call_hooks('network_to_name', $s);
+include/contact_selectors.php: call_hooks('network_to_name', $nets);
include/api.php: call_hooks('logged_in', $a->user);
@@ -194,8 +204,6 @@ include/nav.php: call_hooks('page_header', $a->page['nav']);
include/auth.php: call_hooks('authenticate', $addon_auth);
-include/auth.php: call_hooks('logged_in', $a->user);
-
include/bbcode.php: call_hooks('bbcode',$Text);
include/oauth.php: call_hooks('logged_in', $a->user);
@@ -236,19 +244,29 @@ include/bb2diaspora.php: call_hooks('bb2diaspora',$Text);
include/cronhooks.php: call_hooks('cron', $d);
+include/security.php: call_hooks('logged_in', $a->user);
+
include/html2bbcode.php: call_hooks('html2bbcode', $text);
+include/Contact.php: call_hooks('remove_user',$r[0]);
+
include/Contact.php: call_hooks('contact_photo_menu', $args);
+include/conversation.php: call_hooks('conversation_start',$cb);
+
+include/conversation.php: call_hooks('render_location',$locate);
+
include/conversation.php: call_hooks('display_item', $arr);
+include/conversation.php: call_hooks('render_location',$locate);
+
include/conversation.php: call_hooks('display_item', $arr);
include/conversation.php: call_hooks('item_photo_menu', $args);
-include/conversation.php: call_hooks('jot_tool', $jotplugins);
+include/conversation.php: call_hooks('jot_tool', $jotplugins);
-include/conversation.php: call_hooks('jot_networks', $jotnets);
+include/conversation.php: call_hooks('jot_networks', $jotnets);
include/plugin.php:if(! function_exists('call_hooks')) {
@@ -282,6 +300,8 @@ mod/editpost.php: call_hooks('jot_networks', $jotnets);
mod/parse_url.php: call_hooks('parse_link', $arr);
+mod/home.php: call_hooks('home_init',$ret);
+
mod/home.php: call_hooks("home_content",$o);
mod/contacts.php: call_hooks('contact_edit_post', $_POST);
@@ -306,7 +326,7 @@ mod/like.php: call_hooks('post_local_end', $arr);
mod/xrd.php: call_hooks('personal_xrd', $arr);
-mod/item.php: call_hooks('post_local_start', $_POST);
+mod/item.php: call_hooks('post_local_start', $_REQUEST);
mod/item.php: call_hooks('post_local',$datarray);
diff --git a/doc/developer b/doc/developer
deleted file mode 100755
index dd8b316ea..000000000
--- a/doc/developer
+++ /dev/null
@@ -1,18 +0,0 @@
-Friendica Developer Guide
-
-Here is how you can join us.
-
-First, get yourself a working git package on the system where you will be
-doing development.
-
-Create your own github account.
-
-Follow the instructions provided here: [[http://help.github.com/fork-a-repo/]]
-to create and use your own tracking fork on github
-
-Then go to your github page and create a "Pull request" when you are ready
-to notify us to merge your work.
-
-**Important**
-
-Please pull in any changes from the project repository and merge them with your work **before** issuing a pull request. We reserve the right to reject any patch which results in a large number of merge conflicts. This is especially true in the case of language translations - where we may not be able to understand the subtle differences between conflicting versions. \ No newline at end of file
diff --git a/images/beer_mug.gif b/images/beer_mug.gif
new file mode 100644
index 000000000..a047d1987
--- /dev/null
+++ b/images/beer_mug.gif
Binary files differ
diff --git a/images/coffee.gif b/images/coffee.gif
new file mode 100644
index 000000000..7e2037174
--- /dev/null
+++ b/images/coffee.gif
Binary files differ
diff --git a/images/icons/10/audio.png b/images/icons/10/audio.png
new file mode 100644
index 000000000..cfc2fdcbd
--- /dev/null
+++ b/images/icons/10/audio.png
Binary files differ
diff --git a/images/icons/10/image.png b/images/icons/10/image.png
new file mode 100644
index 000000000..dce827bbe
--- /dev/null
+++ b/images/icons/10/image.png
Binary files differ
diff --git a/images/icons/10/text.png b/images/icons/10/text.png
new file mode 100644
index 000000000..a9995ea4d
--- /dev/null
+++ b/images/icons/10/text.png
Binary files differ
diff --git a/images/icons/10/video.png b/images/icons/10/video.png
new file mode 100644
index 000000000..4a3dacf96
--- /dev/null
+++ b/images/icons/10/video.png
Binary files differ
diff --git a/images/icons/10/zip.png b/images/icons/10/zip.png
new file mode 100644
index 000000000..b90ab104a
--- /dev/null
+++ b/images/icons/10/zip.png
Binary files differ
diff --git a/images/icons/16/audio.png b/images/icons/16/audio.png
new file mode 100644
index 000000000..f2b99981f
--- /dev/null
+++ b/images/icons/16/audio.png
Binary files differ
diff --git a/images/icons/16/image.png b/images/icons/16/image.png
new file mode 100644
index 000000000..c52b9730d
--- /dev/null
+++ b/images/icons/16/image.png
Binary files differ
diff --git a/images/icons/16/text.png b/images/icons/16/text.png
new file mode 100644
index 000000000..1f3433a56
--- /dev/null
+++ b/images/icons/16/text.png
Binary files differ
diff --git a/images/icons/16/video.png b/images/icons/16/video.png
new file mode 100644
index 000000000..bd1a7bb57
--- /dev/null
+++ b/images/icons/16/video.png
Binary files differ
diff --git a/images/icons/16/zip.png b/images/icons/16/zip.png
new file mode 100644
index 000000000..f0fbc0dbf
--- /dev/null
+++ b/images/icons/16/zip.png
Binary files differ
diff --git a/images/icons/22/audio.png b/images/icons/22/audio.png
new file mode 100644
index 000000000..dbf4675cf
--- /dev/null
+++ b/images/icons/22/audio.png
Binary files differ
diff --git a/images/icons/22/image.png b/images/icons/22/image.png
new file mode 100644
index 000000000..f00e3a290
--- /dev/null
+++ b/images/icons/22/image.png
Binary files differ
diff --git a/images/icons/22/text.png b/images/icons/22/text.png
new file mode 100644
index 000000000..d35e45ff8
--- /dev/null
+++ b/images/icons/22/text.png
Binary files differ
diff --git a/images/icons/22/video.png b/images/icons/22/video.png
new file mode 100644
index 000000000..eca481ff1
--- /dev/null
+++ b/images/icons/22/video.png
Binary files differ
diff --git a/images/icons/22/zip.png b/images/icons/22/zip.png
new file mode 100644
index 000000000..4d4ecbe9a
--- /dev/null
+++ b/images/icons/22/zip.png
Binary files differ
diff --git a/images/icons/48/audio.png b/images/icons/48/audio.png
new file mode 100644
index 000000000..23f49b54d
--- /dev/null
+++ b/images/icons/48/audio.png
Binary files differ
diff --git a/images/icons/48/image.png b/images/icons/48/image.png
new file mode 100644
index 000000000..cc0c86872
--- /dev/null
+++ b/images/icons/48/image.png
Binary files differ
diff --git a/images/icons/48/text.png b/images/icons/48/text.png
new file mode 100644
index 000000000..502394547
--- /dev/null
+++ b/images/icons/48/text.png
Binary files differ
diff --git a/images/icons/48/video.png b/images/icons/48/video.png
new file mode 100644
index 000000000..dde02f600
--- /dev/null
+++ b/images/icons/48/video.png
Binary files differ
diff --git a/images/icons/48/zip.png b/images/icons/48/zip.png
new file mode 100644
index 000000000..08a9330c4
--- /dev/null
+++ b/images/icons/48/zip.png
Binary files differ
diff --git a/images/icons/Makefile b/images/icons/Makefile
index 00c4fa4c2..bfb5927df 100755
--- a/images/icons/Makefile
+++ b/images/icons/Makefile
@@ -2,7 +2,8 @@
IMAGES=add.png edit.png gear.png info.png menu.png \
notify_off.png star.png delete.png feed.png group.png \
lock.png notice.png notify_on.png user.png link.png \
- play.png plugin.png unlock.png
+ play.png plugin.png unlock.png zip.png audio.png video.png \
+ image.png text.png
DESTS=10/ 16/ 22/ 48/ \
$(addprefix 10/, $(IMAGES)) \
diff --git a/images/icons/audio.png b/images/icons/audio.png
new file mode 100644
index 000000000..1e1561266
--- /dev/null
+++ b/images/icons/audio.png
Binary files differ
diff --git a/images/icons/image.png b/images/icons/image.png
new file mode 100644
index 000000000..cec105bfd
--- /dev/null
+++ b/images/icons/image.png
Binary files differ
diff --git a/images/icons/text.png b/images/icons/text.png
new file mode 100644
index 000000000..c20190ce2
--- /dev/null
+++ b/images/icons/text.png
Binary files differ
diff --git a/images/icons/video.png b/images/icons/video.png
new file mode 100644
index 000000000..467a2123e
--- /dev/null
+++ b/images/icons/video.png
Binary files differ
diff --git a/images/icons/zip.png b/images/icons/zip.png
new file mode 100644
index 000000000..df961dd49
--- /dev/null
+++ b/images/icons/zip.png
Binary files differ
diff --git a/images/smiley-bangheaddesk.gif b/images/smiley-bangheaddesk.gif
new file mode 100644
index 000000000..91ccb8bb4
--- /dev/null
+++ b/images/smiley-bangheaddesk.gif
Binary files differ
diff --git a/images/smiley-facepalm.gif b/images/smiley-facepalm.gif
new file mode 100644
index 000000000..724370369
--- /dev/null
+++ b/images/smiley-facepalm.gif
Binary files differ
diff --git a/include/attach.php b/include/attach.php
index 4001d2af1..6d611cec0 100755
--- a/include/attach.php
+++ b/include/attach.php
@@ -38,6 +38,7 @@ function z_mime_content_type($filename) {
// audio/video
'mp3' => 'audio/mpeg',
+ 'wav' => 'audio/wav',
'qt' => 'video/quicktime',
'mov' => 'video/quicktime',
'ogg' => 'application/ogg',
@@ -68,12 +69,13 @@ function z_mime_content_type($filename) {
return $mime_types[$ext];
}
}
- elseif (function_exists('finfo_open')) {
- $finfo = finfo_open(FILEINFO_MIME);
- $mimetype = finfo_file($finfo, $filename);
- finfo_close($finfo);
- return $mimetype;
- }
+// can't use this because we're just passing a name, e.g. not a file that can be opened
+// elseif (function_exists('finfo_open')) {
+// $finfo = @finfo_open(FILEINFO_MIME);
+// $mimetype = @finfo_file($finfo, $filename);
+// @finfo_close($finfo);
+// return $mimetype;
+// }
else {
return 'application/octet-stream';
}
diff --git a/include/auth.php b/include/auth.php
index fd1c63847..fc52684e6 100755
--- a/include/auth.php
+++ b/include/auth.php
@@ -165,7 +165,7 @@ else {
}
if((! $record) || (! count($record))) {
- logger('authenticate: failed login attempt: ' . trim($_POST['username']));
+ logger('authenticate: failed login attempt: ' . notags(trim($_POST['username'])));
notice( t('Login failed.') . EOL );
goaway(z_root());
}
diff --git a/include/bb2diaspora.php b/include/bb2diaspora.php
index d367b6716..c26b0c334 100755
--- a/include/bb2diaspora.php
+++ b/include/bb2diaspora.php
@@ -14,9 +14,17 @@ require_once('include/html2bbcode.php');
function diaspora2bb($s) {
$s = html_entity_decode($s,ENT_COMPAT,'UTF-8');
+ $s = str_replace("\r","\n",$s);
$s = preg_replace('/\@\{(.+?)\; (.+?)\@(.+?)\}/','@[url=https://$3/u/$2]$1[/url]',$s);
+
+ $s = preg_replace('/\#([^\s\#])/','\\#$1',$s);
+
$s = Markdown($s);
+
+ $s = str_replace('&#35;','#',$s);
+ $s = str_replace("\n",'<br />',$s);
+
$s = html2bbcode($s);
// $s = str_replace('&#42;','*',$s);
@@ -30,11 +38,6 @@ function diaspora2bb($s) {
$s = preg_replace("/(\[code\])+(.*?)(\[\/code\])+/ism","[code]$2[/code]", $s);
$s = scale_diaspora_images($s);
- // we seem to get a lot of text smushed together with links from Diaspora.
-
- $s = preg_replace('/[^ ]\[url\=(.*?)\]/',' [url=$1]' ,$s);
- $s = preg_replace('/\[\/url\][^ ]/','[/url] ',$s);
-
return $s;
}
@@ -209,7 +212,7 @@ function bb2diaspora($Text,$preserve_nl = false) {
$Text = preg_replace("/\[vimeo\]([0-9]+)(.*?)\[\/vimeo\]/ism", 'http://vimeo.com/$1',$Text);
-
+ $Text = str_replace('[nosmile]','',$Text);
// oembed tag
// $Text = oembed_bbcode2html($Text);
diff --git a/include/bbcode.php b/include/bbcode.php
index 6b733c8f4..cae867eb8 100755
--- a/include/bbcode.php
+++ b/include/bbcode.php
@@ -11,7 +11,7 @@ function stripcode_br_cb($s) {
function tryoembed($match){
$url = ((count($match)==2)?$match[1]:$match[2]);
- logger("tryoembed: $url");
+// logger("tryoembed: $url");
$o = oembed_fetch_url($url);
@@ -24,13 +24,40 @@ function tryoembed($match){
}
+// [noparse][i]italic[/i][/noparse] turns into
+// [noparse][ i ]italic[ /i ][/noparse],
+// to hide them from parser.
+function bb_spacefy($st) {
+ $whole_match = $st[0];
+ $captured = $st[1];
+ $spacefied = preg_replace("/\[(.*?)\]/", "[ $1 ]", $captured);
+ $new_str = str_replace($captured, $spacefied, $whole_match);
+ return $new_str;
+}
+
+// The previously spacefied [noparse][ i ]italic[ /i ][/noparse],
+// now turns back and the [noparse] tags are trimed
+// returning [i]italic[/i]
+
+function bb_unspacefy_and_trim($st) {
+ $whole_match = $st[0];
+ $captured = $st[1];
+ $unspacefied = preg_replace("/\[ (.*?)\ ]/", "[$1]", $captured);
+ return $unspacefied;
+}
// BBcode 2 HTML was written by WAY2WEB.net
// extended to work with Mistpark/Friendica - Mike Macgirvin
function bbcode($Text,$preserve_nl = false) {
+ // Hide all [noparse] contained bbtags spacefying them
+
+ $Text = preg_replace_callback("/\[noparse\](.*?)\[\/noparse\]/ism", 'bb_spacefy',$Text);
+ $Text = preg_replace_callback("/\[nobb\](.*?)\[\/nobb\]/ism", 'bb_spacefy',$Text);
+ $Text = preg_replace_callback("/\[pre\](.*?)\[\/pre\]/ism", 'bb_spacefy',$Text);
+
// Extract a single private image which uses data url's since preg has issues with
// large data sizes. Stash it away while we do bbcode conversion, and then put it back
@@ -111,25 +138,34 @@ function bbcode($Text,$preserve_nl = false) {
$Text = preg_replace("(\[color=(.*?)\](.*?)\[\/color\])ism","<span style=\"color: $1;\">$2</span>",$Text);
// Check for sized text
+ // [size=50] --> font-size: 50px (with the unit).
+ $Text = preg_replace("(\[size=(\d*?)\](.*?)\[\/size\])ism","<span style=\"font-size: $1px;\">$2</span>",$Text);
$Text = preg_replace("(\[size=(.*?)\](.*?)\[\/size\])ism","<span style=\"font-size: $1;\">$2</span>",$Text);
- // Check for list text
-
- if(stristr($Text,'[/list]'))
- $Text = str_replace("[*]", "<li>", $Text);
+ // Check for centered text
+ $Text = preg_replace("(\[center\](.*?)\[\/center\])ism","<div style=\"text-align:center;\">$1</div>",$Text);
- if(stristr($Text,'[/list]'))
- $Text = str_replace("[*]", "<li>", $Text);
+ // Check for list text
+ $Text = str_replace("[*]", "<li>", $Text);
+ $Text = preg_replace("/\[li\](.*?)\[\/li\]/ism", '<li>$1</li>' ,$Text);
$Text = preg_replace("/\[list\](.*?)\[\/list\]/ism", '<ul class="listbullet" style="list-style-type: circle;">$1</ul>' ,$Text);
+ $Text = preg_replace("/\[ul\](.*?)\[\/ul\]/ism", '<ul class="listbullet" style="list-style-type: circle;">$1</ul>'
+,$Text);
$Text = preg_replace("/\[list=\](.*?)\[\/list\]/ism", '<ul class="listnone" style="list-style-type: none;">$1</ul>' ,$Text);
$Text = preg_replace("/\[list=1\](.*?)\[\/list\]/ism", '<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>' ,$Text);
- $Text = preg_replace("/\[list=i\](.*?)\[\/list\]/sm",'<ul class="listlowerroman" style="list-style-type: lower-roman;">$1</ul>' ,$Text);
- $Text = preg_replace("/\[list=I\](.*?)\[\/list\]/sm", '<ul class="listupperroman" style="list-style-type: upper-roman;">$1</ul>' ,$Text);
- $Text = preg_replace("/\[list=a\](.*?)\[\/list\]/sm", '<ul class="listloweralpha" style="list-style-type: lower-alpha;">$1</ul>' ,$Text);
- $Text = preg_replace("/\[list=A\](.*?)\[\/list\]/sm", '<ul class="listupperalpha" style="list-style-type: upper-alpha;">$1</ul>' ,$Text);
- $Text = preg_replace("/\[li\](.*?)\[\/li\]/sm", '<li>$1</li>' ,$Text);
-
+ $Text = preg_replace("/\[ol\](.*?)\[\/ol\]/ism", '<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>'
+,$Text);
+ $Text = preg_replace("/\[list=((?-i)i)\](.*?)\[\/list\]/ism",'<ul class="listlowerroman" style="list-style-type:
+lower-roman;">$2</ul>' ,$Text);
+ $Text = preg_replace("/\[list=((?-i)I)\](.*?)\[\/list\]/ism", '<ul class="listupperroman" style="list-style-type:
+upper-roman;">$2</ul>' ,$Text);
+ $Text = preg_replace("/\[list=((?-i)a)\](.*?)\[\/list\]/ism", '<ul class="listloweralpha" style="list-style-type:
+lower-alpha;">$2</ul>' ,$Text);
+ $Text = preg_replace("/\[list=((?-i)A)\](.*?)\[\/list\]/ism", '<ul class="listupperalpha" style="list-style-type:
+upper-alpha;">$2</ul>' ,$Text);
+
+ $Text = preg_replace("/\[th\](.*?)\[\/th\]/sm", '<th>$1</th>' ,$Text);
$Text = preg_replace("/\[td\](.*?)\[\/td\]/sm", '<td>$1</td>' ,$Text);
$Text = preg_replace("/\[tr\](.*?)\[\/tr\]/sm", '<tr>$1</tr>' ,$Text);
$Text = preg_replace("/\[table\](.*?)\[\/table\]/sm", '<table>$1</table>' ,$Text);
@@ -137,7 +173,11 @@ function bbcode($Text,$preserve_nl = false) {
$Text = preg_replace("/\[table border=1\](.*?)\[\/table\]/sm", '<table border="1" >$1</table>' ,$Text);
$Text = preg_replace("/\[table border=0\](.*?)\[\/table\]/sm", '<table border="0" >$1</table>' ,$Text);
-
+ $Text = str_replace('[hr]','<hr />', $Text);
+
+ // This is actually executed in prepare_body()
+
+ $Text = str_replace('[nosmile]','',$Text);
// Check for font change text
$Text = preg_replace("/\[font=(.*?)\](.*?)\[\/font\]/sm","<span style=\"font-family: $1;\">$2</span>",$Text);
@@ -157,7 +197,15 @@ function bbcode($Text,$preserve_nl = false) {
$QuoteLayout = '<blockquote>$1</blockquote>';
// Check for [quote] text
$Text = preg_replace("/\[quote\](.*?)\[\/quote\]/ism","$QuoteLayout", $Text);
-
+
+ // Check for [quote=Author] text
+
+ $t_wrote = t('$1 wrote:');
+
+ $Text = preg_replace("/\[quote=[\"\']*(.*?)[\"\']*\](.*?)\[\/quote\]/ism",
+ "<blockquote><strong>" . $t_wrote . "</strong> $2</blockquote>",
+ $Text);
+
// [img=widthxheight]image source[/img]
$Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '<img src="$3" style="height: $2px; width: $1px;" >', $Text);
@@ -219,6 +267,13 @@ function bbcode($Text,$preserve_nl = false) {
$Text = preg_replace("/\[event\-adjust\](.*?)\[\/event\-adjust\]/ism",'',$Text);
}
+ // Unhide all [noparse] contained bbtags unspacefying them
+ // and triming the [noparse] tag.
+
+ $Text = preg_replace_callback("/\[noparse\](.*?)\[\/noparse\]/ism", 'bb_unspacefy_and_trim',$Text);
+ $Text = preg_replace_callback("/\[nobb\](.*?)\[\/nobb\]/ism", 'bb_unspacefy_and_trim',$Text);
+ $Text = preg_replace_callback("/\[pre\](.*?)\[\/pre\]/ism", 'bb_unspacefy_and_trim',$Text);
+
// fix any escaped ampersands that may have been converted into links
$Text = preg_replace("/\<(.*?)(src|href)=(.*?)\&amp\;(.*?)\>/ism",'<$1$2=$3&$4>',$Text);
if(strlen($saved_image))
diff --git a/include/conversation.php b/include/conversation.php
index 20c7b2a51..3d13a1179 100755
--- a/include/conversation.php
+++ b/include/conversation.php
@@ -4,6 +4,28 @@
* Render actions localized
*/
function localize_item(&$item){
+
+ $Text = $item['body'];
+ $saved_image = '';
+ $img_start = strpos($Text,'[img]data:');
+ $img_end = strpos($Text,'[/img]');
+
+ if($img_start !== false && $img_end !== false && $img_end > $img_start) {
+ $start_fragment = substr($Text,0,$img_start);
+ $img_start += strlen('[img]');
+ $saved_image = substr($Text,$img_start,$img_end - $img_start);
+ $end_fragment = substr($Text,$img_end + strlen('[/img]'));
+ $Text = $start_fragment . '[!#saved_image#!]' . $end_fragment;
+ $search = '/\[url\=(.*?)\]\[!#saved_image#!\]\[\/url\]' . '/is';
+ $replace = '[url=' . z_path() . '/redir/' . $item['contact-id']
+ . '?f=1&url=' . '$1' . '][!#saved_image#!][/url]' ;
+
+ $Text = preg_replace($search,$replace,$Text);
+
+ if(strlen($saved_image))
+ $item['body'] = str_replace('[!#saved_image#!]', '[img]' . $saved_image . '[/img]',$Text);
+ }
+
$xmlhead="<"."?xml version='1.0' encoding='UTF-8' ?".">";
if ($item['verb']=== ACTIVITY_LIKE || $item['verb']=== ACTIVITY_DISLIKE){
@@ -262,15 +284,10 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
else
$profile_avatar = ((strlen($item['author-avatar'])) ? $item['author-avatar'] : $item['thumb']);
- $location = (($item['location']) ? '<a target="map" title="' . $item['location'] . '" href="http://maps.google.com/?q=' . urlencode($item['location']) . '">' . $item['location'] . '</a>' : '');
- $coord = (($item['coord']) ? '<a target="map" title="' . $item['coord'] . '" href="http://maps.google.com/?q=' . urlencode($item['coord']) . '">' . $item['coord'] . '</a>' : '');
- if($coord) {
- if($location)
- $location .= '<br /><span class="smalltext">(' . $coord . ')</span>';
- else
- $location = '<span class="smalltext">' . $coord . '</span>';
- }
+ $locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => '');
+ call_hooks('render_location',$locate);
+ $location = ((strlen($locate['html'])) ? $locate['html'] : render_location_google($locate));
localize_item($item);
if($mode === 'network-new')
@@ -494,7 +511,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
}
$likebuttons = '';
- $shareable = ((($profile_owner == local_user()) && ($mode != 'display') && (! $item['private'])) ? true : false);
+ $shareable = ((($profile_owner == local_user()) && (! $item['private'])) ? true : false); //($mode != 'display') &&
if($page_writeable) {
if($toplevelpost) {
@@ -505,6 +522,10 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
if ($shareable) $likebuttons['share'] = array( t('Share this'), t('share'));
}
+
+ $qc = ((local_user()) ? get_pconfig(local_user(),'qcomment','words') : null);
+ $qcomment = (($qc) ? explode("\n",$qc) : null);
+
if(($show_comment_box) || (($show_comment_box == false) && ($override_comment_box == false) && ($item['last-child']))) {
$comment = replace_macros($cmnt_tpl,array(
'$return_path' => '',
@@ -512,6 +533,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
'$type' => (($mode === 'profile') ? 'wall-comment' : 'net-comment'),
'$id' => $item['item_id'],
'$parent' => $item['parent'],
+ '$qcomment' => $qcomment,
'$profile_uid' => $profile_owner,
'$mylink' => $a->contact['url'],
'$mytitle' => t('This is you'),
@@ -594,16 +616,10 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
$like = ((x($alike,$item['id'])) ? format_like($alike[$item['id']],$alike[$item['id'] . '-l'],'like',$item['id']) : '');
$dislike = ((x($dlike,$item['id'])) ? format_like($dlike[$item['id']],$dlike[$item['id'] . '-l'],'dislike',$item['id']) : '');
- $location = (($item['location']) ? '<a target="map" title="' . $item['location']
- . '" href="http://maps.google.com/?q=' . urlencode($item['location']) . '">' . $item['location'] . '</a>' : '');
- $coord = (($item['coord']) ? '<a target="map" title="' . $item['coord']
- . '" href="http://maps.google.com/?q=' . urlencode($item['coord']) . '">' . $item['coord'] . '</a>' : '');
- if($coord) {
- if($location)
- $location .= '<br /><span class="smalltext">(' . $coord . ')</span>';
- else
- $location = '<span class="smalltext">' . $coord . '</span>';
- }
+ $locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => '');
+ call_hooks('render_location',$locate);
+
+ $location = ((strlen($locate['html'])) ? $locate['html'] : render_location_google($locate));
$indent = (($toplevelpost) ? '' : ' comment');
@@ -620,11 +636,9 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
if ($tag!="") $tags[] = bbcode($tag);
}
-
// Build the HTML
$body = prepare_body($item,true);
-
$tmp_item = replace_macros($template,array(
'$type' => implode("",array_slice(split("/",$item['verb']),-1)),
@@ -832,104 +846,114 @@ function format_like($cnt,$arr,$type,$id) {
}}
-function status_editor($a,$x, $notes_cid = 0) {
+function status_editor($a,$x, $notes_cid = 0, $popup=false) {
$o = '';
$geotag = (($x['allow_location']) ? get_markup_template('jot_geotag.tpl') : '');
- $tpl = get_markup_template('jot-header.tpl');
-
- $a->page['htmlhead'] .= replace_macros($tpl, array(
- '$newpost' => 'true',
- '$baseurl' => $a->get_baseurl(),
- '$geotag' => $geotag,
- '$nickname' => $x['nickname'],
- '$ispublic' => t('Visible to <strong>everybody</strong>'),
- '$linkurl' => t('Please enter a link URL:'),
- '$vidurl' => t("Please enter a video link/URL:"),
- '$audurl' => t("Please enter an audio link/URL:"),
- '$term' => t('Tag term:'),
- '$whereareu' => t('Where are you right now?'),
- '$title' => t('Enter a title for this item')
- ));
-
-
- $tpl = get_markup_template("jot.tpl");
-
- $jotplugins = '';
- $jotnets = '';
+ $plaintext = false;
+ if(local_user() && intval(get_pconfig(local_user(),'system','plaintext')))
+ $plaintext = true;
- $mail_disabled = ((function_exists('imap_open') && (! get_config('system','imap_disabled'))) ? 0 : 1);
+ $tpl = get_markup_template('jot-header.tpl');
+
+ $a->page['htmlhead'] .= replace_macros($tpl, array(
+ '$newpost' => 'true',
+ '$baseurl' => $a->get_baseurl(),
+ '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
+ '$geotag' => $geotag,
+ '$nickname' => $x['nickname'],
+ '$ispublic' => t('Visible to <strong>everybody</strong>'),
+ '$linkurl' => t('Please enter a link URL:'),
+ '$vidurl' => t("Please enter a video link/URL:"),
+ '$audurl' => t("Please enter an audio link/URL:"),
+ '$term' => t('Tag term:'),
+ '$whereareu' => t('Where are you right now?'),
+ '$title' => t('Enter a title for this item')
+ ));
- $mail_enabled = false;
- $pubmail_enabled = false;
- if(($x['is_owner']) && (! $mail_disabled)) {
- $r = q("SELECT * FROM `mailacct` WHERE `uid` = %d AND `server` != '' LIMIT 1",
- intval(local_user())
- );
- if(count($r)) {
- $mail_enabled = true;
- if(intval($r[0]['pubmail']))
- $pubmail_enabled = true;
- }
+ $tpl = get_markup_template("jot.tpl");
+
+ $jotplugins = '';
+ $jotnets = '';
+
+ $mail_disabled = ((function_exists('imap_open') && (! get_config('system','imap_disabled'))) ? 0 : 1);
+
+ $mail_enabled = false;
+ $pubmail_enabled = false;
+
+ if(($x['is_owner']) && (! $mail_disabled)) {
+ $r = q("SELECT * FROM `mailacct` WHERE `uid` = %d AND `server` != '' LIMIT 1",
+ intval(local_user())
+ );
+ if(count($r)) {
+ $mail_enabled = true;
+ if(intval($r[0]['pubmail']))
+ $pubmail_enabled = true;
}
+ }
- if($mail_enabled) {
- $selected = (($pubmail_enabled) ? ' checked="checked" ' : '');
- $jotnets .= '<div class="profile-jot-net"><input type="checkbox" name="pubmail_enable"' . $selected . ' value="1" /> '
- . t("Post to Email") . '</div>';
- }
+ if($mail_enabled) {
+ $selected = (($pubmail_enabled) ? ' checked="checked" ' : '');
+ $jotnets .= '<div class="profile-jot-net"><input type="checkbox" name="pubmail_enable"' . $selected . ' value="1" /> ' . t("Post to Email") . '</div>';
+ }
+
+ call_hooks('jot_tool', $jotplugins);
+ call_hooks('jot_networks', $jotnets);
+
+ if($notes_cid)
+ $jotnets .= '<input type="hidden" name="contact_allow[]" value="' . $notes_cid .'" />';
+
+ $tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins));
+
+ $o .= replace_macros($tpl,array(
+ '$return_path' => $a->cmd,
+ '$action' => $a->get_baseurl().'/item',
+ '$share' => (($x['button']) ? $x['button'] : t('Share')),
+ '$upload' => t('Upload photo'),
+ '$shortupload' => t('upload photo'),
+ '$attach' => t('Attach file'),
+ '$shortattach' => t('attach file'),
+ '$weblink' => t('Insert web link'),
+ '$shortweblink' => t('web link'),
+ '$video' => t('Insert video link'),
+ '$shortvideo' => t('video link'),
+ '$audio' => t('Insert audio link'),
+ '$shortaudio' => t('audio link'),
+ '$setloc' => t('Set your location'),
+ '$shortsetloc' => t('set location'),
+ '$noloc' => t('Clear browser location'),
+ '$shortnoloc' => t('clear location'),
+ '$title' => "",
+ '$placeholdertitle' => t('Set title'),
+ '$wait' => t('Please wait'),
+ '$permset' => t('Permission settings'),
+ '$shortpermset' => t('permissions'),
+ '$ptyp' => (($notes_cid) ? 'note' : 'wall'),
+ '$content' => '',
+ '$post_id' => '',
+ '$baseurl' => $a->get_baseurl(),
+ '$defloc' => $x['default_location'],
+ '$visitor' => $x['visitor'],
+ '$pvisit' => (($notes_cid) ? 'none' : $x['visitor']),
+ '$emailcc' => t('CC: email addresses'),
+ '$public' => t('Public post'),
+ '$jotnets' => $jotnets,
+ '$emtitle' => t('Example: bob@example.com, mary@example.com'),
+ '$lockstate' => $x['lockstate'],
+ '$acl' => $x['acl'],
+ '$bang' => $x['bang'],
+ '$profile_uid' => $x['profile_uid'],
+ '$preview' => t('Preview'),
+ ));
- call_hooks('jot_tool', $jotplugins);
- call_hooks('jot_networks', $jotnets);
-
- if($notes_cid)
- $jotnets .= '<input type="hidden" name="contact_allow[]" value="' . $notes_cid .'" />';
-
- $tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins));
-
- $o .= replace_macros($tpl,array(
- '$return_path' => $a->cmd,
- '$action' => 'item',
- '$share' => (($x['button']) ? $x['button'] : t('Share')),
- '$upload' => t('Upload photo'),
- '$shortupload' => t('upload photo'),
- '$attach' => t('Attach file'),
- '$shortattach' => t('attach file'),
- '$weblink' => t('Insert web link'),
- '$shortweblink' => t('web link'),
- '$video' => t('Insert video link'),
- '$shortvideo' => t('video link'),
- '$audio' => t('Insert audio link'),
- '$shortaudio' => t('audio link'),
- '$setloc' => t('Set your location'),
- '$shortsetloc' => t('set location'),
- '$noloc' => t('Clear browser location'),
- '$shortnoloc' => t('clear location'),
- '$title' => "",
- '$placeholdertitle' => t('Set title'),
- '$wait' => t('Please wait'),
- '$permset' => t('Permission settings'),
- '$shortpermset' => t('permissions'),
- '$ptyp' => (($notes_cid) ? 'note' : 'wall'),
- '$content' => '',
- '$post_id' => '',
- '$baseurl' => $a->get_baseurl(),
- '$defloc' => $x['default_location'],
- '$visitor' => $x['visitor'],
- '$pvisit' => (($notes_cid) ? 'none' : $x['visitor']),
- '$emailcc' => t('CC: email addresses'),
- '$public' => t('Public post'),
- '$jotnets' => $jotnets,
- '$emtitle' => t('Example: bob@example.com, mary@example.com'),
- '$lockstate' => $x['lockstate'],
- '$acl' => $x['acl'],
- '$bang' => $x['bang'],
- '$profile_uid' => $x['profile_uid'],
- '$preview' => t('Preview'),
- ));
+
+ if ($popup==true){
+ $o = '<div id="jot-popup" style="display: none;">'.$o.'</div>';
+
+ }
return $o;
}
@@ -1004,3 +1028,17 @@ function find_thread_parent_index($arr,$x) {
return $k;
return false;
}
+
+function render_location_google($item) {
+ $location = '';
+ $location = (($item['location']) ? '<a target="map" title="' . $item['location'] . '" href="http://maps.google.com/?q=' . urlencode($item['location']) . '">' . $item['location'] . '</a>' : '');
+ $coord = (($item['coord']) ? '<a target="map" title="' . $item['coord'] . '" href="http://maps.google.com/?q=' . urlencode($item['coord']) . '">' . $item['coord'] . '</a>' : '');
+ if($coord) {
+ if($location)
+ $location .= '<br /><span class="smalltext">(' . $coord . ')</span>';
+ else
+ $location = '<span class="smalltext">' . $coord . '</span>';
+ }
+ return $location;
+}
+
diff --git a/include/datetime.php b/include/datetime.php
index d44e995cf..6d395fe3f 100755
--- a/include/datetime.php
+++ b/include/datetime.php
@@ -260,10 +260,11 @@ function relative_date($posted_date) {
);
foreach ($a as $secs => $str) {
- $d = $etime / $secs;
- if ($d >= 1) {
- $r = round($d);
- return $r . ' ' . (($r == 1) ? $str[0] : $str[1]) . t(' ago');
+ $d = $etime / $secs;
+ if ($d >= 1) {
+ $r = round($d);
+ // translators - e.g. 22 hours ago, 1 minute ago
+ return sprintf( t('%1$d %2$s ago'),$r, (($r == 1) ? $str[0] : $str[1]));
}
}
}}
diff --git a/include/delivery.php b/include/delivery.php
index c05358868..677d89388 100755
--- a/include/delivery.php
+++ b/include/delivery.php
@@ -21,6 +21,7 @@ function delivery_run($argv, $argc){
require_once('include/items.php');
require_once('include/bbcode.php');
require_once('include/diaspora.php');
+ require_once('include/email.php');
load_config('config');
load_config('system');
@@ -311,6 +312,13 @@ function delivery_run($argv, $argc){
);
if(count($x)) {
+ if($owner['page-flags'] == PAGE_COMMUNITY && ! $x[0]['writable']) {
+ q("update contact set writable = 1 where id = %d limit 1",
+ intval($x[0]['id'])
+ );
+ $x[0]['writable'] = 1;
+ }
+
require_once('library/simplepie/simplepie.inc');
logger('mod-delivery: local delivery');
local_delivery($x[0],$atom);
@@ -373,7 +381,8 @@ function delivery_run($argv, $argc){
break;
case NETWORK_MAIL :
-
+ case NETWORK_MAIL2:
+
if(get_config('system','dfrn_only'))
break;
// WARNING: does not currently convert to RFC2047 header encodings, etc.
@@ -412,8 +421,15 @@ function delivery_run($argv, $argc){
if($r1 && $r1[0]['reply_to'])
$reply_to = $r1[0]['reply_to'];
- $subject = (($it['title']) ? $it['title'] : t("\x28no subject\x29")) ;
- $headers = 'From: ' . $local_user[0]['username'] . ' <' . $local_user[0]['email'] . '>' . "\n";
+ $subject = (($it['title']) ? email_header_encode($it['title'],'UTF-8') : t("\x28no subject\x29")) ;
+
+ // only expose our real email address to true friends
+
+ if(($contact['rel'] == CONTACT_IS_FRIEND) && (! $contact['blocked']))
+ $headers = 'From: ' . email_header_encode($local_user[0]['username'],'UTF-8') . ' <' . $local_user[0]['email'] . '>' . "\n";
+ else
+ $headers = 'From: ' . email_header_encode($local_user[0]['username'],'UTF-8') . ' <' . t('noreply') . '@' . $a->get_hostname() . '>' . "\n";
+
if($reply_to)
$headers .= 'Reply-to: ' . $reply_to . "\n";
$headers .= 'Message-id: <' . $it['uri'] . '>' . "\n";
diff --git a/include/diaspora.php b/include/diaspora.php
index cded389c3..a8e02e509 100755
--- a/include/diaspora.php
+++ b/include/diaspora.php
@@ -598,7 +598,7 @@ function diaspora_request($importer,$xml) {
`uri-date` = '%s',
`avatar-date` = '%s',
`blocked` = 0,
- `pending` = 0,
+ `pending` = 0
WHERE `id` = %d LIMIT 1
",
dbesc($photos[0]),
@@ -611,7 +611,7 @@ function diaspora_request($importer,$xml) {
intval($contact_record['id'])
);
- $u = q("select * from user where id = %d limit 1",intval($importer['uid']));
+ $u = q("select * from user where uid = %d limit 1",intval($importer['uid']));
if($u)
$ret = diaspora_share($u[0],$contact_record);
}
@@ -673,6 +673,14 @@ function diaspora_post($importer,$xml) {
if(strpos($tag,'#') === 0) {
if(strpos($tag,'[url='))
continue;
+
+ // don't link tags that are already embedded in links
+
+ if(preg_match('/\[(.*?)' . preg_quote($tag) . '(.*?)\]/',$body))
+ continue;
+ if(preg_match('/\[(.*?)\]\((.*?)' . preg_quote($tag) . '(.*?)\)/',$body))
+ continue;
+
$basetag = str_replace('_',' ',substr($tag,1));
$body = str_replace($tag,'#[url=' . $a->get_baseurl() . '/search?search=' . rawurlencode($basetag) . ']' . $basetag . '[/url]',$body);
if(strlen($str_tags))
@@ -830,6 +838,15 @@ function diaspora_reshare($importer,$xml) {
if(strpos($tag,'#') === 0) {
if(strpos($tag,'[url='))
continue;
+
+ // don't link tags that are already embedded in links
+
+ if(preg_match('/\[(.*?)' . preg_quote($tag) . '(.*?)\]/',$body))
+ continue;
+ if(preg_match('/\[(.*?)\]\((.*?)' . preg_quote($tag) . '(.*?)\)/',$body))
+ continue;
+
+
$basetag = str_replace('_',' ',substr($tag,1));
$body = str_replace($tag,'#[url=' . $a->get_baseurl() . '/search?search=' . rawurlencode($basetag) . ']' . $basetag . '[/url]',$body);
if(strlen($str_tags))
@@ -1062,6 +1079,15 @@ function diaspora_comment($importer,$xml,$msg) {
if(strpos($tag,'#') === 0) {
if(strpos($tag,'[url='))
continue;
+
+ // don't link tags that are already embedded in links
+
+ if(preg_match('/\[(.*?)' . preg_quote($tag) . '(.*?)\]/',$body))
+ continue;
+ if(preg_match('/\[(.*?)\]\((.*?)' . preg_quote($tag) . '(.*?)\)/',$body))
+ continue;
+
+
$basetag = str_replace('_',' ',substr($tag,1));
$body = str_replace($tag,'#[url=' . $a->get_baseurl() . '/search?search=' . rawurlencode($basetag) . ']' . $basetag . '[/url]',$body);
if(strlen($str_tags))
@@ -1282,6 +1308,7 @@ function diaspora_conversation($importer,$xml,$msg) {
'language' => $importer['language'],
'to_name' => $importer['username'],
'to_email' => $importer['email'],
+ 'uid' =>$importer['importer_uid'],
'item' => array('subject' => $subject, 'body' => $body),
'source_name' => $person['name'],
'source_link' => $person['url'],
diff --git a/include/enotify.php b/include/enotify.php
index 9df9b57e5..a8e6e3de6 100755
--- a/include/enotify.php
+++ b/include/enotify.php
@@ -28,17 +28,19 @@ function notification($params) {
$subject = sprintf( t('New mail received at %s'),$sitename);
$preamble = sprintf( t('%s sent you a new private message at %s.'),$params['source_name'],$sitename);
-
+ $epreamble = sprintf( t('%s sent you a private message.'),'[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]');
$sitelink = t('Please visit %s to view and/or reply to your private messages.');
$tsitelink = sprintf( $sitelink, $siteurl . '/message' );
$hsitelink = sprintf( $sitelink, '<a href="' . $siteurl . '/message">' . $sitename . '</a>');
- $itemlink = '';
+ $itemlink = $siteurl . '/message';
}
if($params['type'] == NOTIFY_COMMENT) {
$subject = sprintf( t('%s commented on an item at %s'), $params['source_name'], $sitename);
$preamble = sprintf( t('%s commented on an item/conversation you have been following.'), $params['source_name']);
+ $epreamble = sprintf( t('%s commented on an item/conversation you have been following.'), '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]');
+
$sitelink = t('Please visit %s to view and/or reply to the conversation.');
$tsitelink = sprintf( $sitelink, $siteurl );
$hsitelink = sprintf( $sitelink, '<a href="' . $siteurl . '">' . $sitename . '</a>');
@@ -47,6 +49,27 @@ function notification($params) {
if($params['type'] == NOTIFY_WALL) {
$preamble = $subject = sprintf( t('%s posted to your profile wall at %s') , $params['source_name'], $sitename);
+ $epreamble = sprintf( t('%s posted to your profile wall') , '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]');
+
+ $sitelink = t('Please visit %s to view and/or reply to the conversation.');
+ $tsitelink = sprintf( $sitelink, $siteurl );
+ $hsitelink = sprintf( $sitelink, '<a href="' . $siteurl . '">' . $sitename . '</a>');
+ $itemlink = $params['link'];
+ }
+
+ if($params['type'] == NOTIFY_TAGSELF) {
+ $preamble = $subject = sprintf( t('%s tagged you at %s') , $params['source_name'], $sitename);
+ $epreamble = sprintf( t('%s tagged you') , '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]');
+
+ $sitelink = t('Please visit %s to view and/or reply to the conversation.');
+ $tsitelink = sprintf( $sitelink, $siteurl );
+ $hsitelink = sprintf( $sitelink, '<a href="' . $siteurl . '">' . $sitename . '</a>');
+ $itemlink = $params['link'];
+ }
+
+ if($params['type'] == NOTIFY_TAGSHARE) {
+ $preamble = $subject = sprintf( t('%s tagged your post at %s') , $params['source_name'], $sitename);
+ $epreamble = sprintf( t('%s tagged your post') , '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]');
$sitelink = t('Please visit %s to view and/or reply to the conversation.');
$tsitelink = sprintf( $sitelink, $siteurl );
@@ -57,6 +80,7 @@ function notification($params) {
if($params['type'] == NOTIFY_INTRO) {
$subject = sprintf( t('Introduction received at %s'), $sitename);
$preamble = sprintf( t('You\'ve received an introduction from \'%s\' at %s'), $params['source_name'], $sitename);
+ $epreamble = sprintf( t('You\'ve received an introduction from %s'), '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]');
$body = sprintf( t('You may visit their profile at %s'),$params['source_link']);
$sitelink = t('Please visit %s to approve or reject the introduction.');
@@ -68,6 +92,9 @@ function notification($params) {
if($params['type'] == NOTIFY_SUGGEST) {
$subject = sprintf( t('Friend suggestion received at %s'), $sitename);
$preamble = sprintf( t('You\'ve received a friend suggestion from \'%s\' at %s'), $params['source_name'], $sitename);
+ $epreamble = sprintf( t('You\'ve received a friend suggestion for %s from %s'),
+ '[url=' . $params['item']['url'] . ']' . $params['item']['name'] . '[/url]',
+ '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]');
$body = t('Name:') . ' ' . $params['item']['name'] . "\n";
$body .= t('Photo:') . ' ' . $params['item']['photo'] . "\n";
$body .= sprintf( t('You may visit their profile at %s'),$params['item']['url']);
@@ -82,9 +109,27 @@ function notification($params) {
}
- // TODO - create notification entry in DB
+ // from here on everything is in the recipients language
+
+ push_lang($params['language']);
+
+ require_once('include/html2bbcode.php');
+ // create notification entry in DB
+ $r = q("insert into notify (name,url,photo,date,msg,uid,link,type,verb,otype)
+ values('%s','%s','%s','%s','%s',%d,'%s',%d,'%s','%s')",
+ dbesc($params['source_name']),
+ dbesc($params['source_link']),
+ dbesc($params['source_photo']),
+ dbesc(datetime_convert()),
+ dbesc($epreamble),
+ intval($params['uid']),
+ dbesc($itemlink),
+ intval($params['type']),
+ dbesc($params['verb']),
+ dbesc($params['otype'])
+ );
// send email notification if notification preferences permit
@@ -93,7 +138,6 @@ function notification($params) {
logger('notification: sending notification email');
- push_lang($params['language']);
$textversion = strip_tags(html_entity_decode(bbcode(stripslashes(str_replace(array("\\r\\n", "\\r", "\\n"), "\n",
$body))),ENT_QUOTES,'UTF-8'));
@@ -108,7 +152,7 @@ function notification($params) {
'$preamble' => $preamble,
'$sitename' => $sitename,
'$siteurl' => $siteurl,
- '$source_name' => $parama['source_name'],
+ '$source_name' => $params['source_name'],
'$source_link' => $params['source_link'],
'$source_photo' => $params['source_photo'],
'$username' => $params['to_name'],
@@ -128,7 +172,7 @@ function notification($params) {
'$preamble' => $preamble,
'$sitename' => $sitename,
'$siteurl' => $siteurl,
- '$source_name' => $parama['source_name'],
+ '$source_name' => $params['source_name'],
'$source_link' => $params['source_link'],
'$source_photo' => $params['source_photo'],
'$username' => $params['to_name'],
@@ -153,8 +197,10 @@ function notification($params) {
'htmlVersion' => $email_html_body,
'textVersion' => $email_text_body
));
- pop_lang();
}
+
+ pop_lang();
+
}
require_once('include/email.php');
diff --git a/include/expire.php b/include/expire.php
index 64dbe2536..5fa0ec758 100755
--- a/include/expire.php
+++ b/include/expire.php
@@ -29,6 +29,11 @@ function expire_run($argv, $argc){
$a->set_baseurl(get_config('system','url'));
+ // physically remove anything that has been deleted for more than two months
+
+ $r = q("delete from item where deleted = 1 and changed < UTC_TIMESTAMP() - INTERVAL 60 DAY");
+ q("optimize table item");
+
logger('expire: start');
$r = q("SELECT `uid`,`username`,`expire` FROM `user` WHERE `expire` != 0");
diff --git a/include/items.php b/include/items.php
index 62f1f2ce5..f4837449d 100755
--- a/include/items.php
+++ b/include/items.php
@@ -814,6 +814,11 @@ function item_store($arr,$force_parent = false) {
call_hooks('post_remote',$arr);
+ if(x($arr,'cancel')) {
+ logger('item_store: post cancelled by plugin.');
+ return 0;
+ }
+
dbesc_array($arr);
logger('item_store: ' . print_r($arr,true), LOGGER_DATA);
@@ -900,7 +905,7 @@ function item_store($arr,$force_parent = false) {
);
}
- tgroup_deliver($arr['uid'],$current_post);
+ tag_deliver($arr['uid'],$current_post);
return $current_post;
}
@@ -918,22 +923,22 @@ function get_item_contact($item,$contacts) {
}
-function tgroup_deliver($uid,$item_id) {
-
+function tag_deliver($uid,$item_id) {
- // setup a second delivery chain for forum/community posts if appropriate
+ // look for mention tags and setup a second delivery chain for forum/community posts if appropriate
$a = get_app();
- $deliver_to_tgroup = false;
+ $mention = false;
- $u = q("select * from user where uid = %d and `page-flags` = %d limit 1",
- intval($uid),
- intval(PAGE_COMMUNITY)
+ $u = q("select uid, nickname, language, username, email, `page-flags`, `notify-flags` from user where uid = %d limit 1",
+ intval($uid)
);
if(! count($u))
return;
+ $community_page = (($u[0]['page-flags'] == PAGE_COMMUNITY) ? true : false);
+
$i = q("select * from item where id = %d and uid = %d limit 1",
intval($item_id),
intval($uid)
@@ -943,13 +948,6 @@ function tgroup_deliver($uid,$item_id) {
$item = $i[0];
- // prevent delivery looping - only proceed
- // if the message originated elsewhere and is a top-level post
-
- if(($item['wall']) || ($item['origin']) || ($item['id'] != $item['parent']))
- return;
-
-
$link = normalise_link($a->get_baseurl() . '/profile/' . $u[0]['nickname']);
// Diaspora uses their own hardwired link URL in @-tags
@@ -961,19 +959,57 @@ function tgroup_deliver($uid,$item_id) {
if($cnt) {
foreach($matches as $mtch) {
if(link_compare($link,$mtch[1]) || link_compare($dlink,$mtch[1])) {
- $deliver_to_tgroup = true;
- logger('tgroup_deliver: local group mention found: ' . $mtch[2]);
+ $mention = true;
+ logger('tag_deliver: mention found: ' . $mtch[2]);
}
}
}
- if(! $deliver_to_tgroup)
+ if(! $mention)
+ return;
+
+ // send a notification
+
+ require_once('include/enotify.php');
+ notification(array(
+ 'type' => NOTIFY_TAGSELF,
+ 'notify_flags' => $u[0]['notify-flags'],
+ 'language' => $u[0]['language'],
+ 'to_name' => $u[0]['username'],
+ 'to_email' => $u[0]['email'],
+ 'uid' => $u[0]['uid'],
+ 'item' => $item,
+ 'link' => $a->get_baseurl() . '/display/' . $u[0]['nickname'] . '/' . $item['id'],
+ 'source_name' => $item['author-name'],
+ 'source_link' => $item['author-link'],
+ 'source_photo' => $item['author-avatar'],
+ 'verb' => ACTIVITY_TAG,
+ 'otype' => 'item'
+ ));
+
+ if(! $community_page)
+ return;
+
+ // tgroup delivery - setup a second delivery chain
+ // prevent delivery looping - only proceed
+ // if the message originated elsewhere and is a top-level post
+
+ if(($item['wall']) || ($item['origin']) || ($item['id'] != $item['parent']))
return;
// now change this copy of the post to a forum head message and deliver to all the tgroup members
- q("update item set wall = 1, origin = 1, forum_mode = 1 where id = %d limit 1",
+ $c = q("select name, url, thumb from contact where self = 1 and uid = %d limit 1",
+ intval($u[0]['uid'])
+ );
+ if(! count($c))
+ return;
+
+ q("update item set wall = 1, origin = 1, forum_mode = 1, `owner-name` = '%s', `owner-link` = '%s', `owner-avatar` = '%s' where id = %d limit 1",
+ dbesc($c[0]['name']),
+ dbesc($c[0]['url']),
+ dbesc($c[0]['thumb']),
intval($item_id)
);
@@ -990,8 +1026,8 @@ function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
$a = get_app();
- if((! strlen($contact['issued-id'])) && (! $contact['duplex']) && (! ($owner['page-flags'] == PAGE_COMMUNITY)))
- return 3;
+// if((! strlen($contact['issued-id'])) && (! $contact['duplex']) && (! ($owner['page-flags'] == PAGE_COMMUNITY)))
+// return 3;
$idtosend = $orig_id = (($contact['dfrn-id']) ? $contact['dfrn-id'] : $contact['issued-id']);
@@ -1042,7 +1078,9 @@ function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
$final_dfrn_id = '';
- if(($contact['duplex'] && strlen($contact['pubkey'])) || ($owner['page-flags'] == PAGE_COMMUNITY)) {
+ if(($contact['duplex'] && strlen($contact['pubkey']))
+ || ($owner['page-flags'] == PAGE_COMMUNITY && strlen($contact['pubkey']))
+ || ($contact['rel'] == CONTACT_IS_SHARING && strlen($contact['pubkey']))) {
openssl_public_decrypt($sent_dfrn_id,$final_dfrn_id,$contact['pubkey']);
openssl_public_decrypt($challenge,$postvars['challenge'],$contact['pubkey']);
}
@@ -1085,7 +1123,10 @@ function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
if($dfrn_version >= 2.1) {
- if(($contact['duplex'] && strlen($contact['pubkey'])) || ($owner['page-flags'] == PAGE_COMMUNITY)) {
+ if(($contact['duplex'] && strlen($contact['pubkey']))
+ || ($owner['page-flags'] == PAGE_COMMUNITY && strlen($contact['pubkey']))
+ || ($contact['rel'] == CONTACT_IS_SHARING && strlen($contact['pubkey']))) {
+
openssl_public_encrypt($key,$postvars['key'],$contact['pubkey']);
}
else {
@@ -1481,7 +1522,8 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
if(count($r)) {
if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {
- $r = q("UPDATE `item` SET `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($datarray['title']),
dbesc($datarray['body']),
dbesc(datetime_convert('UTC','UTC',$datarray['edited'])),
dbesc($item_id),
@@ -1611,7 +1653,8 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
if(count($r)) {
if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {
- $r = q("UPDATE `item` SET `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($datarray['title']),
dbesc($datarray['body']),
dbesc(datetime_convert('UTC','UTC',$datarray['edited'])),
dbesc($item_id),
@@ -1806,6 +1849,7 @@ function local_delivery($importer,$data) {
'language' => $importer['language'],
'to_name' => $importer['username'],
'to_email' => $importer['email'],
+ 'uid' => $importer['importer_uid'],
'item' => $fsugg,
'link' => $a->get_baseurl() . '/notifications/intros',
'source_name' => $importer['name'],
@@ -1857,6 +1901,7 @@ function local_delivery($importer,$data) {
'language' => $importer['language'],
'to_name' => $importer['username'],
'to_email' => $importer['email'],
+ 'uid' => $importer['importer_uid'],
'item' => $msg,
'source_name' => $msg['from-name'],
'source_link' => $importer['url'],
@@ -2129,6 +2174,7 @@ function local_delivery($importer,$data) {
'language' => $importer['language'],
'to_name' => $importer['username'],
'to_email' => $importer['email'],
+ 'uid' => $importer['importer_uid'],
'item' => $datarray,
'link' => $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $posted_id,
'source_name' => stripslashes($datarray['author-name']),
@@ -2162,7 +2208,8 @@ function local_delivery($importer,$data) {
if(count($r)) {
if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {
- $r = q("UPDATE `item` SET `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($datarray['title']),
dbesc($datarray['body']),
dbesc(datetime_convert('UTC','UTC',$datarray['edited'])),
dbesc($item_id),
@@ -2248,6 +2295,7 @@ function local_delivery($importer,$data) {
'language' => $importer['language'],
'to_name' => $importer['username'],
'to_email' => $importer['email'],
+ 'uid' => $importer['importer_uid'],
'item' => $datarray,
'link' => $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $posted_id,
'source_name' => stripslashes($datarray['author-name']),
@@ -2304,7 +2352,8 @@ function local_delivery($importer,$data) {
if(count($r)) {
if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {
- $r = q("UPDATE `item` SET `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($datarray['title']),
dbesc($datarray['body']),
dbesc(datetime_convert('UTC','UTC',$datarray['edited'])),
dbesc($item_id),
@@ -2800,7 +2849,7 @@ function drop_item($id,$interactive = true) {
// delete the item
- $r = q("UPDATE `item` SET `deleted` = 1, `body` = '', `edited` = '%s', `changed` = '%s' WHERE `id` = %d LIMIT 1",
+ $r = q("UPDATE `item` SET `deleted` = 1, `title` = '', `body` = '', `edited` = '%s', `changed` = '%s' WHERE `id` = %d LIMIT 1",
dbesc(datetime_convert()),
dbesc(datetime_convert()),
intval($item['id'])
@@ -2833,7 +2882,7 @@ function drop_item($id,$interactive = true) {
// If it's the parent of a comment thread, kill all the kids
if($item['uri'] == $item['parent-uri']) {
- $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s', `body` = ''
+ $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s', `body` = '' , `title` = ''
WHERE `parent-uri` = '%s' AND `uid` = %d ",
dbesc(datetime_convert()),
dbesc(datetime_convert()),
diff --git a/include/network.php b/include/network.php
index 551d5e1d0..25db62d16 100755
--- a/include/network.php
+++ b/include/network.php
@@ -579,6 +579,9 @@ function fetch_xrd_links($url) {
if(! function_exists('validate_url')) {
function validate_url(&$url) {
+ // no naked subdomains
+ if(strpos($url,'.') === false)
+ return false;
if(substr($url,0,4) != 'http')
$url = 'http://' . $url;
$h = @parse_url($url);
diff --git a/include/notifier.php b/include/notifier.php
index ead7aebad..37bc6dae5 100755
--- a/include/notifier.php
+++ b/include/notifier.php
@@ -35,7 +35,7 @@ function notifier_run($argv, $argc){
require_once("datetime.php");
require_once('include/items.php');
require_once('include/bbcode.php');
-
+ require_once('include/email.php');
load_config('config');
load_config('system');
@@ -264,7 +264,7 @@ function notifier_run($argv, $argc){
$deny_people = expand_acl($parent['deny_cid']);
$deny_groups = expand_groups(expand_acl($parent['deny_gid']));
- // if our parent is a forum, uplink to the origonal author causing
+ // if our parent is a forum, uplink to the origional author causing
// a delivery fork
if(intval($parent['forum_mode']) && (! $top_level) && ($cmd !== 'uplink')) {
@@ -526,6 +526,14 @@ function notifier_run($argv, $argc){
);
if(count($x)) {
+
+ if($owner['page-flags'] == PAGE_COMMUNITY && ! $x[0]['writable']) {
+ q("update contact set writable = 1 where id = %d limit 1",
+ intval($x[0]['id'])
+ );
+ $x[0]['writable'] = 1;
+ }
+
require_once('library/simplepie/simplepie.inc');
logger('mod-delivery: local delivery');
local_delivery($x[0],$atom);
@@ -584,6 +592,7 @@ function notifier_run($argv, $argc){
break;
case NETWORK_MAIL:
+ case NETWORK_MAIL2:
if(get_config('system','dfrn_only'))
break;
@@ -625,14 +634,14 @@ function notifier_run($argv, $argc){
if($r1 && $r1[0]['reply_to'])
$reply_to = $r1[0]['reply_to'];
- $subject = (($it['title']) ? $it['title'] : t("\x28no subject\x29")) ;
+ $subject = (($it['title']) ? email_header_encode($it['title'],'UTF-8') : t("\x28no subject\x29")) ;
// only expose our real email address to true friends
- if($contact['rel'] == CONTACT_IS_FRIEND)
- $headers = 'From: ' . $local_user[0]['username'] . ' <' . $local_user[0]['email'] . '>' . "\n";
+ if(($contact['rel'] == CONTACT_IS_FRIEND) && (! $contact['blocked']))
+ $headers = 'From: ' . email_header_encode($local_user[0]['username'],'UTF-8') . ' <' . $local_user[0]['email'] . '>' . "\n";
else
- $headers = 'From: ' . $local_user[0]['username'] . ' <' . t('noreply') . '@' . $a->get_hostname() . '>' . "\n";
+ $headers = 'From: ' . email_header_encode($local_user[0]['username'],'UTF-8') . ' <' . t('noreply') . '@' . $a->get_hostname() . '>' . "\n";
if($reply_to)
$headers .= 'Reply-to: ' . $reply_to . "\n";
@@ -754,9 +763,10 @@ function notifier_run($argv, $argc){
);
$r2 = q("SELECT `id`, `name`,`network` FROM `contact`
- WHERE `network` = '%s' AND `uid` = %d AND `blocked` = 0 AND `pending` = 0
+ WHERE `network` in ( '%s', '%s') AND `uid` = %d AND `blocked` = 0 AND `pending` = 0
AND `rel` != %d order by rand() ",
dbesc(NETWORK_DFRN),
+ dbesc(NETWORK_MAIL2),
intval($owner['uid']),
intval(CONTACT_IS_SHARING)
);
diff --git a/include/oembed.php b/include/oembed.php
index 118f7fa4a..5c3c595f5 100755
--- a/include/oembed.php
+++ b/include/oembed.php
@@ -11,7 +11,7 @@ function oembed_replacecb($matches){
function oembed_fetch_url($embedurl){
-
+
$txt = Cache::get($embedurl);
$noexts = array("mp3","mp4","ogg","ogv","oga","ogm","webm");
diff --git a/include/plugin.php b/include/plugin.php
index fe325ac3b..85b51edff 100755
--- a/include/plugin.php
+++ b/include/plugin.php
@@ -56,25 +56,29 @@ function reload_plugins() {
if(count($parr)) {
foreach($parr as $pl) {
$pl = trim($pl);
+
+ $fname = 'addon/' . $pl . '/' . $pl . '.php';
- $t = filemtime('addon/' . $pl . '/' . $pl . '.php');
- foreach($installed as $i) {
- if(($i['name'] == $pl) && ($i['timestamp'] != $t)) {
- logger('Reloading plugin: ' . $i['name']);
- @include_once('addon/' . $pl . '/' . $pl . '.php');
-
- if(function_exists($pl . '_uninstall')) {
- $func = $pl . '_uninstall';
- $func();
- }
- if(function_exists($pl . '_install')) {
- $func = $pl . '_install';
- $func();
+ if(file_exists($fname)) {
+ $t = @filemtime($fname);
+ foreach($installed as $i) {
+ if(($i['name'] == $pl) && ($i['timestamp'] != $t)) {
+ logger('Reloading plugin: ' . $i['name']);
+ @include_once($fname);
+
+ if(function_exists($pl . '_uninstall')) {
+ $func = $pl . '_uninstall';
+ $func();
+ }
+ if(function_exists($pl . '_install')) {
+ $func = $pl . '_install';
+ $func();
+ }
+ q("UPDATE `addon` SET `timestamp` = %d WHERE `id` = %d LIMIT 1",
+ intval($t),
+ intval($i['id'])
+ );
}
- q("UPDATE `addon` SET `timestamp` = %d WHERE `id` = %d LIMIT 1",
- intval($t),
- intval($i['id'])
- );
}
}
}
diff --git a/include/poller.php b/include/poller.php
index 89e4488b9..7d42c63b5 100755
--- a/include/poller.php
+++ b/include/poller.php
@@ -369,7 +369,7 @@ function poller_run($argv, $argc){
$xml = fetch_url($contact['poll']);
}
- elseif($contact['network'] === NETWORK_MAIL) {
+ elseif($contact['network'] === NETWORK_MAIL || $contact['network'] === NETWORK_MAIL2) {
$mail_disabled = ((function_exists('imap_open') && (! get_config('system','imap_disabled'))) ? 0 : 1);
if($mail_disabled)
@@ -462,7 +462,7 @@ function poller_run($argv, $argc){
$datarray['contact-id'] = $contact['id'];
if($datarray['parent-uri'] === $datarray['uri'])
$datarray['private'] = 1;
- if(! get_pconfig($importer_uid,'system','allow_public_email_replies')) {
+ if(($contact['network'] === NETWORK_MAIL) && (! get_pconfig($importer_uid,'system','allow_public_email_replies'))) {
$datarray['private'] = 1;
$datarray['allow_cid'] = '<' . $contact['id'] . '>';
}
diff --git a/include/profile_advanced.php b/include/profile_advanced.php
index ccecb95de..004a58524 100755
--- a/include/profile_advanced.php
+++ b/include/profile_advanced.php
@@ -44,6 +44,8 @@ function advanced_profile(&$a) {
if($a->profile['homepage']) $profile['homepage'] = array( t('Homepage:'), linkify($a->profile['homepage']) );
+ if($a->profile['pub_keywords']) $profile['pub_keywords'] = array( t('Tags:'), $a->profile['pub_keywords']);
+
if($a->profile['politic']) $profile['politic'] = array( t('Political Views:'), $a->profile['politic']);
if($a->profile['religion']) $profile['religion'] = array( t('Religion:'), $a->profile['religion']);
diff --git a/include/text.php b/include/text.php
index 5f4adb27c..b9813cfa9 100755
--- a/include/text.php
+++ b/include/text.php
@@ -428,8 +428,10 @@ if(! function_exists('logger')) {
function logger($msg,$level = 0) {
// turn off logger in install mode
global $a;
- if ($a->module == 'install') return;
-
+ global $db;
+
+ if(($a->module == 'install') || (! ($db && $db->connected))) return;
+
$debugging = get_config('system','debugging');
$loglevel = intval(get_config('system','loglevel'));
$logfile = get_config('system','logfile');
@@ -538,8 +540,10 @@ function contact_block() {
$a = get_app();
$shown = get_pconfig($a->profile['uid'],'system','display_friend_count');
- if(! $shown)
+ if($shown === false)
$shown = 24;
+ if($shown == 0)
+ return;
if((! is_array($a->profile)) || ($a->profile['hide-friends']))
return $o;
@@ -674,41 +678,105 @@ function linkify($s) {
*/
if(! function_exists('smilies')) {
-function smilies($s) {
+function smilies($s, $sample = false) {
$a = get_app();
- $s = str_replace(
- array( '&lt;3', '&lt;/3', '&lt;\\3', ':-)', ':)', ';-)', ':-(', ':(', ':-P', ':P', ':-"', ':-x', ':-X', ':-D', '8-|', '8-O', '\\o/', 'o.O', 'O.o', '\\.../', '\\ooo/',
- '~friendika', '~friendica', 'Diaspora*' ),
- array(
+ $texts = array(
+ '&lt;3',
+ '&lt;/3',
+ '&lt;\\3',
+ ':-)',
+// ':)',
+ ';-)',
+// ';)',
+ ':-(',
+// ':(',
+ ':-P',
+// ':P',
+ ':-"',
+ ':-&quot;',
+ ':-x',
+ ':-X',
+ ':-D',
+// ':D',
+ '8-|',
+ '8-O',
+ ':-O',
+ '\\o/',
+ 'o.O',
+ 'O.o',
+ '\\.../',
+ '\\ooo/',
+ ":'(",
+ ":-!",
+ ":-/",
+ ":-[",
+ "8-)",
+ ':beer',
+ ':homebrew',
+ ':coffee',
+ ':facepalm',
+ ':headdesk',
+ '~friendika',
+ '~friendica',
+ 'Diaspora*'
+ );
+
+ $icons = array(
'<img src="' . $a->get_baseurl() . '/images/smiley-heart.gif" alt="<3" />',
'<img src="' . $a->get_baseurl() . '/images/smiley-brokenheart.gif" alt="</3" />',
'<img src="' . $a->get_baseurl() . '/images/smiley-brokenheart.gif" alt="<\\3" />',
'<img src="' . $a->get_baseurl() . '/images/smiley-smile.gif" alt=":-)" />',
- '<img src="' . $a->get_baseurl() . '/images/smiley-smile.gif" alt=":)" />',
+// '<img src="' . $a->get_baseurl() . '/images/smiley-smile.gif" alt=":)" />',
'<img src="' . $a->get_baseurl() . '/images/smiley-wink.gif" alt=";-)" />',
+// '<img src="' . $a->get_baseurl() . '/images/smiley-wink.gif" alt=";)"/>',
'<img src="' . $a->get_baseurl() . '/images/smiley-frown.gif" alt=":-(" />',
- '<img src="' . $a->get_baseurl() . '/images/smiley-frown.gif" alt=":(" />',
+// '<img src="' . $a->get_baseurl() . '/images/smiley-frown.gif" alt=":(" />',
'<img src="' . $a->get_baseurl() . '/images/smiley-tongue-out.gif" alt=":-P" />',
- '<img src="' . $a->get_baseurl() . '/images/smiley-tongue-out.gif" alt=":P" />',
+// '<img src="' . $a->get_baseurl() . '/images/smiley-tongue-out.gif" alt=":P" />',
+ '<img src="' . $a->get_baseurl() . '/images/smiley-kiss.gif" alt=":-\"" />',
'<img src="' . $a->get_baseurl() . '/images/smiley-kiss.gif" alt=":-\"" />',
'<img src="' . $a->get_baseurl() . '/images/smiley-kiss.gif" alt=":-x" />',
'<img src="' . $a->get_baseurl() . '/images/smiley-kiss.gif" alt=":-X" />',
'<img src="' . $a->get_baseurl() . '/images/smiley-laughing.gif" alt=":-D" />',
+// '<img src="' . $a->get_baseurl() . '/images/smiley-laughing.gif" alt=":D"/>',
'<img src="' . $a->get_baseurl() . '/images/smiley-surprised.gif" alt="8-|" />',
'<img src="' . $a->get_baseurl() . '/images/smiley-surprised.gif" alt="8-O" />',
+ '<img src="' . $a->get_baseurl() . '/images/smiley-surprised.gif" alt=":-O" />',
'<img src="' . $a->get_baseurl() . '/images/smiley-thumbsup.gif" alt="\\o/" />',
'<img src="' . $a->get_baseurl() . '/images/smiley-Oo.gif" alt="o.O" />',
'<img src="' . $a->get_baseurl() . '/images/smiley-Oo.gif" alt="O.o" />',
'<img src="' . $a->get_baseurl() . '/images/smiley-shaka.gif" alt="\\.../" />',
'<img src="' . $a->get_baseurl() . '/images/smiley-shaka.gif" alt="\\ooo/" />',
+ '<img src="' . $a->get_baseurl() . '/images/smiley-cry.gif" alt=":\'(" />',
+ '<img src="' . $a->get_baseurl() . '/images/smiley-foot-in-mouth.gif" alt=":-!" />',
+ '<img src="' . $a->get_baseurl() . '/images/smiley-undecided.gif" alt=":-/" />',
+ '<img src="' . $a->get_baseurl() . '/images/smiley-embarassed.gif" alt=":-[" />',
+ '<img src="' . $a->get_baseurl() . '/images/smiley-cool.gif" alt="8-)" />',
+ '<img src="' . $a->get_baseurl() . '/images/beer_mug.gif" alt=":beer" />',
+ '<img src="' . $a->get_baseurl() . '/images/beer_mug.gif" alt=":homebrew" />',
+ '<img src="' . $a->get_baseurl() . '/images/coffee.gif" alt=":coffee" />',
+ '<img src="' . $a->get_baseurl() . '/images/smiley-facepalm.gif" alt=":facepalm" />',
+ '<img src="' . $a->get_baseurl() . '/images/smiley-bangheaddesk.gif" alt=":headdesk" />',
'<a href="http://project.friendika.com">~friendika <img src="' . $a->get_baseurl() . '/images/friendika-16.png" alt="~friendika" /></a>',
'<a href="http://friendica.com">~friendica <img src="' . $a->get_baseurl() . '/images/friendika-16.png" alt="~friendica" /></a>',
'<a href="http://diasporafoundation.org">Diaspora<img src="' . $a->get_baseurl() . '/images/diaspora.png" alt="Diaspora*" /></a>',
- ), $s);
+ );
+
+ $params = array('texts' => $texts, 'icons' => $icons, 'string' => $s);
+ call_hooks('smilie', $params);
- call_hooks('smilie', $s);
+ if($sample) {
+ $s = '<div class="smiley-sample">';
+ for($x = 0; $x < count($params['texts']); $x ++) {
+ $s .= '<dl><dt>' . $params['texts'][$x] . '</dt><dd>' . $params['icons'][$x] . '</dd></dl>';
+ }
+ }
+ else {
+ $s = str_replace($params['texts'],$params['icons'],$params['string']);
+ }
+
return $s;
}}
@@ -785,10 +853,10 @@ function prepare_body($item,$attach = false) {
case 'audio':
case 'image':
case 'text':
- $icon = '<div class="attachtype type-' . $icontype . '"></div>';
+ $icon = '<div class="attachtype icon s22 type-' . $icontype . '"></div>';
break;
default:
- $icon = '<div class="attachtype type-unkn"></div>';
+ $icon = '<div class="attachtype icon s22 type-unkn"></div>';
break;
}
$title = ((strlen(trim($matches[4]))) ? escape_tags(trim($matches[4])) : escape_tags($matches[1]));
@@ -814,7 +882,10 @@ function prepare_text($text) {
require_once('include/bbcode.php');
- $s = smilies(bbcode($text));
+ if(stristr($text,'[nosmile]'))
+ $s = bbcode($text);
+ else
+ $s = smilies(bbcode($text));
return $s;
}}
diff --git a/library/fullcalendar/GPL-LICENSE.txt b/library/fullcalendar/GPL-LICENSE.txt
new file mode 100644
index 000000000..11dddd00e
--- /dev/null
+++ b/library/fullcalendar/GPL-LICENSE.txt
@@ -0,0 +1,278 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
diff --git a/library/fullcalendar/MIT-LICENSE.txt b/library/fullcalendar/MIT-LICENSE.txt
new file mode 100644
index 000000000..46d475449
--- /dev/null
+++ b/library/fullcalendar/MIT-LICENSE.txt
@@ -0,0 +1,20 @@
+Copyright (c) 2009 Adam Shaw
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/library/fullcalendar/changelog.txt b/library/fullcalendar/changelog.txt
new file mode 100644
index 000000000..17b31f862
--- /dev/null
+++ b/library/fullcalendar/changelog.txt
@@ -0,0 +1,318 @@
+
+version 1.5.3 (2/6/12)
+ - fixed dragging issue with jQuery UI 1.8.16 (issue 1168)
+ - bundled with jQuery 1.7.1 and jQuery UI 1.8.17
+
+version 1.5.2 (8/21/11)
+ - correctly process UTC "Z" ISO8601 date strings (issue 750)
+
+version 1.5.1 (4/9/11)
+ - more flexible ISO8601 date parsing (issue 814)
+ - more flexible parsing of UNIX timestamps (issue 826)
+ - FullCalendar now buildable from source on a Mac (issue 795)
+ - FullCalendar QA'd in FF4 (issue 883)
+ - upgraded to jQuery 1.5.2 (which supports IE9) and jQuery UI 1.8.11
+
+version 1.5 (3/19/11)
+ - slicker default styling for buttons
+ - reworked a lot of the calendar's HTML and accompanying CSS
+ (solves issues 327 and 395)
+ - more printer-friendly (fullcalendar-print.css)
+ - fullcalendar now inherits styles from jquery-ui themes differently.
+ styles for buttons are distinct from styles for calendar cells.
+ (solves issue 299)
+ - can now color events through FullCalendar options and Event-Object properties (issue 117)
+ THIS IS NOW THE PREFERRED METHOD OF COLORING EVENTS (as opposed to using className and CSS)
+ - FullCalendar options:
+ - eventColor (changes both background and border)
+ - eventBackgroundColor
+ - eventBorderColor
+ - eventTextColor
+ - Event-Object options:
+ - color (changes both background and border)
+ - backgroundColor
+ - borderColor
+ - textColor
+ - can now specify an event source as an *object* with a `url` property (json feed) or
+ an `events` property (function or array) with additional properties that will
+ be applied to the entire event source:
+ - color (changes both background and border)
+ - backgroudColor
+ - borderColor
+ - textColor
+ - className
+ - editable
+ - allDayDefault
+ - ignoreTimezone
+ - startParam (for a feed)
+ - endParam (for a feed)
+ - ANY OF THE JQUERY $.ajax OPTIONS
+ allows for easily changing from GET to POST and sending additional parameters (issue 386)
+ allows for easily attaching ajax handlers such as `error` (issue 754)
+ allows for turning caching on (issue 355)
+ - Google Calendar feeds are now specified differently:
+ - specify a simple string of your feed's URL
+ - specify an *object* with a `url` property of your feed's URL.
+ you can include any of the new Event-Source options in this object.
+ - the old `$.fullCalendar.gcalFeed` method still works
+ - no more IE7 SSL popup (issue 504)
+ - remove `cacheParam` - use json event source `cache` option instead
+ - latest jquery/jquery-ui
+
+version 1.4.11 (2/22/11)
+ - fixed rerenderEvents bug (issue 790)
+ - fixed bug with faulty dragging of events from all-day slot in agenda views
+ - bundled with jquery 1.5 and jquery-ui 1.8.9
+
+version 1.4.10 (1/2/11)
+ - fixed bug with resizing event to different week in 5-day month view (issue 740)
+ - fixed bug with events not sticking after a removeEvents call (issue 757)
+ - fixed bug with underlying parseTime method, and other uses of parseInt (issue 688)
+
+version 1.4.9 (11/16/10)
+ - new algorithm for vertically stacking events (issue 111)
+ - resizing an event to a different week (issue 306)
+ - bug: some events not rendered with consecutive calls to addEventSource (issue 679)
+
+version 1.4.8 (10/16/10)
+ - ignoreTimezone option (set to `false` to process UTC offsets in ISO8601 dates)
+ - bugfixes
+ - event refetching not being called under certain conditions (issues 417, 554)
+ - event refetching being called multiple times under certain conditions (issues 586, 616)
+ - selection cannot be triggered by right mouse button (issue 558)
+ - agenda view left axis sized incorrectly (issue 465)
+ - IE js error when calendar is too narrow (issue 517)
+ - agenda view looks strange when no scrollbars (issue 235)
+ - improved parsing of ISO8601 dates with UTC offsets
+ - $.fullCalendar.version
+ - an internal refactor of the code, for easier future development and modularity
+
+version 1.4.7 (7/5/10)
+ - "dropping" external objects onto the calendar
+ - droppable (boolean, to turn on/off)
+ - dropAccept (to filter which events the calendar will accept)
+ - drop (trigger)
+ - selectable options can now be specified with a View Option Hash
+ - bugfixes
+ - dragged & reverted events having wrong time text (issue 406)
+ - bug rendering events that have an endtime with seconds, but no hours/minutes (issue 477)
+ - gotoDate date overflow bug (issue 429)
+ - wrong date reported when clicking on edge of last column in agenda views (412)
+ - support newlines in event titles
+ - select/unselect callbacks now passes native js event
+
+version 1.4.6 (5/31/10)
+ - "selecting" days or timeslots
+ - options: selectable, selectHelper, unselectAuto, unselectCancel
+ - callbacks: select, unselect
+ - methods: select, unselect
+ - when dragging an event, the highlighting reflects the duration of the event
+ - code compressing by Google Closure Compiler
+ - bundled with jQuery 1.4.2 and jQuery UI 1.8.1
+
+version 1.4.5 (2/21/10)
+ - lazyFetching option, which can force the calendar to fetch events on every view/date change
+ - scroll state of agenda views are preserved when switching back to view
+ - bugfixes
+ - calling methods on an uninitialized fullcalendar throws error
+ - IE6/7 bug where an entire view becomes invisible (issue 320)
+ - error when rendering a hidden calendar (in jquery ui tabs for example) in IE (issue 340)
+ - interconnected bugs related to calendar resizing and scrollbars
+ - when switching views or clicking prev/next, calendar would "blink" (issue 333)
+ - liquid-width calendar's events shifted (depending on initial height of browser) (issue 341)
+ - more robust underlying algorithm for calendar resizing
+
+version 1.4.4 (2/3/10)
+ - optimized event rendering in all views (events render in 1/10 the time)
+ - gotoDate() does not force the calendar to unnecessarily rerender
+ - render() method now correctly readjusts height
+
+version 1.4.3 (12/22/09)
+ - added destroy method
+ - Google Calendar event pages respect currentTimezone
+ - caching now handled by jQuery's ajax
+ - protection from setting aspectRatio to zero
+ - bugfixes
+ - parseISO8601 and DST caused certain events to display day before
+ - button positioning problem in IE6
+ - ajax event source removed after recently being added, events still displayed
+ - event not displayed when end is an empty string
+ - dynamically setting calendar height when no events have been fetched, throws error
+
+version 1.4.2 (12/02/09)
+ - eventAfterRender trigger
+ - getDate & getView methods
+ - height & contentHeight options (explicitly sets the pixel height)
+ - minTime & maxTime options (restricts shown hours in agenda view)
+ - getters [for all options] and setters [for height, contentHeight, and aspectRatio ONLY! stay tuned..]
+ - render method now readjusts calendar's size
+ - bugfixes
+ - lightbox scripts that use iframes (like fancybox)
+ - day-of-week classNames were off when firstDay=1
+ - guaranteed space on right side of agenda events (even when stacked)
+ - accepts ISO8601 dates with a space (instead of 'T')
+
+version 1.4.1 (10/31/09)
+ - can exclude weekends with new 'weekends' option
+ - gcal feed 'currentTimezone' option
+ - bugfixes
+ - year/month/date option sometimes wouldn't set correctly (depending on current date)
+ - daylight savings issue caused agenda views to start at 1am (for BST users)
+ - cleanup of gcal.js code
+
+version 1.4 (10/19/09)
+ - agendaWeek and agendaDay views
+ - added some options for agenda views:
+ - allDaySlot
+ - allDayText
+ - firstHour
+ - slotMinutes
+ - defaultEventMinutes
+ - axisFormat
+ - modified some existing options/triggers to work with agenda views:
+ - dragOpacity and timeFormat can now accept a "View Hash" (a new concept)
+ - dayClick now has an allDay parameter
+ - eventDrop now has an an allDay parameter
+ (this will affect those who use revertFunc, adjust parameter list)
+ - added 'prevYear' and 'nextYear' for buttons in header
+ - minor change for theme users, ui-state-hover not applied to active/inactive buttons
+ - added event-color-changing example in docs
+ - better defaults for right-to-left themed button icons
+
+version 1.3.2 (10/13/09)
+ - Bugfixes (please upgrade from 1.3.1!)
+ - squashed potential infinite loop when addMonths and addDays
+ is called with an invalid date
+ - $.fullCalendar.parseDate() now correctly parses IETF format
+ - when switching views, the 'today' button sticks inactive, fixed
+ - gotoDate now can accept a single Date argument
+ - documentation for changes in 1.3.1 and 1.3.2 now on website
+
+version 1.3.1 (9/30/09)
+ - Important Bugfixes (please upgrade from 1.3!)
+ - When current date was late in the month, for long months, and prev/next buttons
+ were clicked in month-view, some months would be skipped/repeated
+ - In certain time zones, daylight savings time would cause certain days
+ to be misnumbered in month-view
+ - Subtle change in way week interval is chosen when switching from month to basicWeek/basicDay view
+ - Added 'allDayDefault' option
+ - Added 'changeView' and 'render' methods
+
+version 1.3 (9/21/09)
+ - different 'views': month/basicWeek/basicDay
+ - more flexible 'header' system for buttons
+ - themable by jQuery UI themes
+ - resizable events (require jQuery UI resizable plugin)
+ - rescoped & rewritten CSS, enhanced default look
+ - cleaner css & rendering techniques for right-to-left
+ - reworked options & API to support multiple views / be consistent with jQuery UI
+ - refactoring of entire codebase
+ - broken into different JS & CSS files, assembled w/ build scripts
+ - new test suite for new features, uses firebug-lite
+ - refactored docs
+ - Options
+ + date
+ + defaultView
+ + aspectRatio
+ + disableResizing
+ + monthNames (use instead of $.fullCalendar.monthNames)
+ + monthNamesShort (use instead of $.fullCalendar.monthAbbrevs)
+ + dayNames (use instead of $.fullCalendar.dayNames)
+ + dayNamesShort (use instead of $.fullCalendar.dayAbbrevs)
+ + theme
+ + buttonText
+ + buttonIcons
+ x draggable -> editable/disableDragging
+ x fixedWeeks -> weekMode
+ x abbrevDayHeadings -> columnFormat
+ x buttons/title -> header
+ x eventDragOpacity -> dragOpacity
+ x eventRevertDuration -> dragRevertDuration
+ x weekStart -> firstDay
+ x rightToLeft -> isRTL
+ x showTime (use 'allDay' CalEvent property instead)
+ - Triggered Actions
+ + eventResizeStart
+ + eventResizeStop
+ + eventResize
+ x monthDisplay -> viewDisplay
+ x resize -> windowResize
+ 'eventDrop' params changed, can revert if ajax cuts out
+ - CalEvent Properties
+ x showTime -> allDay
+ x draggable -> editable
+ 'end' is now INCLUSIVE when allDay=true
+ 'url' now produces a real <a> tag, more native clicking/tab behavior
+ - Methods:
+ + renderEvent
+ x prevMonth -> prev
+ x nextMonth -> next
+ x prevYear/nextYear -> moveDate
+ x refresh -> rerenderEvents/refetchEvents
+ x removeEvent -> removeEvents
+ x getEventsByID -> clientEvents
+ - Utilities:
+ 'formatDate' format string completely changed (inspired by jQuery UI datepicker + datejs)
+ 'formatDates' added to support date-ranges
+ - Google Calendar Options:
+ x draggable -> editable
+ - Bugfixes
+ - gcal extension fetched 25 results max, now fetches all
+
+version 1.2.1 (6/29/09)
+ - bugfixes
+ - allows and corrects invalid end dates for events
+ - doesn't throw an error in IE while rendering when display:none
+ - fixed 'loading' callback when used w/ multiple addEventSource calls
+ - gcal className can now be an array
+
+version 1.2 (5/31/09)
+ - expanded API
+ - 'className' CalEvent attribute
+ - 'source' CalEvent attribute
+ - dynamically get/add/remove/update events of current month
+ - locale improvements: change month/day name text
+ - better date formatting ($.fullCalendar.formatDate)
+ - multiple 'event sources' allowed
+ - dynamically add/remove event sources
+ - options for prevYear and nextYear buttons
+ - docs have been reworked (include addition of Google Calendar docs)
+ - changed behavior of parseDate for number strings
+ (now interpets as unix timestamp, not MS times)
+ - bugfixes
+ - rightToLeft month start bug
+ - off-by-one errors with month formatting commands
+ - events from previous months sticking when clicking prev/next quickly
+ - Google Calendar API changed to work w/ multiple event sources
+ - can also provide 'className' and 'draggable' options
+ - date utilties moved from $ to $.fullCalendar
+ - more documentation in source code
+ - minified version of fullcalendar.js
+ - test suit (available from svn)
+ - top buttons now use <button> w/ an inner <span> for better css cusomization
+ - thus CSS has changed. IF UPGRADING FROM PREVIOUS VERSIONS,
+ UPGRADE YOUR FULLCALENDAR.CSS FILE!!!
+
+version 1.1 (5/10/09)
+ - Added the following options:
+ - weekStart
+ - rightToLeft
+ - titleFormat
+ - timeFormat
+ - cacheParam
+ - resize
+ - Fixed rendering bugs
+ - Opera 9.25 (events placement & window resizing)
+ - IE6 (window resizing)
+ - Optimized window resizing for ALL browsers
+ - Events on same day now sorted by start time (but first by timespan)
+ - Correct z-index when dragging
+ - Dragging contained in overflow DIV for IE6
+ - Modified fullcalendar.css
+ - for right-to-left support
+ - for variable start-of-week
+ - for IE6 resizing bug
+ - for THEAD and TBODY (in 1.0, just used TBODY, restructured in 1.1)
+ - IF UPGRADING FROM FULLCALENDAR 1.0, YOU MUST UPGRADE FULLCALENDAR.CSS
+ !!!!!!!!!!!
+
diff --git a/library/fullcalendar/fullcalendar.css b/library/fullcalendar/fullcalendar.css
new file mode 100644
index 000000000..04f118493
--- /dev/null
+++ b/library/fullcalendar/fullcalendar.css
@@ -0,0 +1,618 @@
+/*
+ * FullCalendar v1.5.3 Stylesheet
+ *
+ * Copyright (c) 2011 Adam Shaw
+ * Dual licensed under the MIT and GPL licenses, located in
+ * MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
+ *
+ * Date: Mon Feb 6 22:40:40 2012 -0800
+ *
+ */
+
+
+.fc {
+ direction: ltr;
+ text-align: left;
+ }
+
+.fc table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ }
+
+html .fc,
+.fc table {
+ font-size: 1em;
+ }
+
+.fc td,
+.fc th {
+ padding: 0;
+ vertical-align: top;
+ }
+
+
+
+/* Header
+------------------------------------------------------------------------*/
+
+.fc-header td {
+ white-space: nowrap;
+ }
+
+.fc-header-left {
+ width: 25%;
+ text-align: left;
+ }
+
+.fc-header-center {
+ text-align: center;
+ }
+
+.fc-header-right {
+ width: 25%;
+ text-align: right;
+ }
+
+.fc-header-title {
+ display: inline-block;
+ vertical-align: top;
+ }
+
+.fc-header-title h2 {
+ margin-top: 0;
+ white-space: nowrap;
+ }
+
+.fc .fc-header-space {
+ padding-left: 10px;
+ }
+
+.fc-header .fc-button {
+ margin-bottom: 1em;
+ vertical-align: top;
+ }
+
+/* buttons edges butting together */
+
+.fc-header .fc-button {
+ margin-right: -1px;
+ }
+
+.fc-header .fc-corner-right {
+ margin-right: 1px; /* back to normal */
+ }
+
+.fc-header .ui-corner-right {
+ margin-right: 0; /* back to normal */
+ }
+
+/* button layering (for border precedence) */
+
+.fc-header .fc-state-hover,
+.fc-header .ui-state-hover {
+ z-index: 2;
+ }
+
+.fc-header .fc-state-down {
+ z-index: 3;
+ }
+
+.fc-header .fc-state-active,
+.fc-header .ui-state-active {
+ z-index: 4;
+ }
+
+
+
+/* Content
+------------------------------------------------------------------------*/
+
+.fc-content {
+ clear: both;
+ }
+
+.fc-view {
+ width: 100%; /* needed for view switching (when view is absolute) */
+ overflow: hidden;
+ }
+
+
+
+/* Cell Styles
+------------------------------------------------------------------------*/
+
+.fc-widget-header, /* <th>, usually */
+.fc-widget-content { /* <td>, usually */
+ border: 1px solid #ccc;
+ }
+
+.fc-state-highlight { /* <td> today cell */ /* TODO: add .fc-today to <th> */
+ background: #ffc;
+ }
+
+.fc-cell-overlay { /* semi-transparent rectangle while dragging */
+ background: #9cf;
+ opacity: .2;
+ filter: alpha(opacity=20); /* for IE */
+ }
+
+
+
+/* Buttons
+------------------------------------------------------------------------*/
+
+.fc-button {
+ position: relative;
+ display: inline-block;
+ cursor: pointer;
+ }
+
+.fc-state-default { /* non-theme */
+ border-style: solid;
+ border-width: 1px 0;
+ }
+
+.fc-button-inner {
+ position: relative;
+ float: left;
+ overflow: hidden;
+ }
+
+.fc-state-default .fc-button-inner { /* non-theme */
+ border-style: solid;
+ border-width: 0 1px;
+ }
+
+.fc-button-content {
+ position: relative;
+ float: left;
+ height: 1.9em;
+ line-height: 1.9em;
+ padding: 0 .6em;
+ white-space: nowrap;
+ }
+
+/* icon (for jquery ui) */
+
+.fc-button-content .fc-icon-wrap {
+ position: relative;
+ float: left;
+ top: 50%;
+ }
+
+.fc-button-content .ui-icon {
+ position: relative;
+ float: left;
+ margin-top: -50%;
+ *margin-top: 0;
+ *top: -50%;
+ }
+
+/* gloss effect */
+
+.fc-state-default .fc-button-effect {
+ position: absolute;
+ top: 50%;
+ left: 0;
+ }
+
+.fc-state-default .fc-button-effect span {
+ position: absolute;
+ top: -100px;
+ left: 0;
+ width: 500px;
+ height: 100px;
+ border-width: 100px 0 0 1px;
+ border-style: solid;
+ border-color: #fff;
+ background: #444;
+ opacity: .09;
+ filter: alpha(opacity=9);
+ }
+
+/* button states (determines colors) */
+
+.fc-state-default,
+.fc-state-default .fc-button-inner {
+ border-style: solid;
+ border-color: #ccc #bbb #aaa;
+ background: #F3F3F3;
+ color: #000;
+ }
+
+.fc-state-hover,
+.fc-state-hover .fc-button-inner {
+ border-color: #999;
+ }
+
+.fc-state-down,
+.fc-state-down .fc-button-inner {
+ border-color: #555;
+ background: #777;
+ }
+
+.fc-state-active,
+.fc-state-active .fc-button-inner {
+ border-color: #555;
+ background: #777;
+ color: #fff;
+ }
+
+.fc-state-disabled,
+.fc-state-disabled .fc-button-inner {
+ color: #999;
+ border-color: #ddd;
+ }
+
+.fc-state-disabled {
+ cursor: default;
+ }
+
+.fc-state-disabled .fc-button-effect {
+ display: none;
+ }
+
+
+
+/* Global Event Styles
+------------------------------------------------------------------------*/
+
+.fc-event {
+ border-style: solid;
+ border-width: 0;
+ font-size: .85em;
+ cursor: default;
+ }
+
+a.fc-event,
+.fc-event-draggable {
+ cursor: pointer;
+ }
+
+a.fc-event {
+ text-decoration: none;
+ }
+
+.fc-rtl .fc-event {
+ text-align: right;
+ }
+
+.fc-event-skin {
+ border-color: #36c; /* default BORDER color */
+ background-color: #36c; /* default BACKGROUND color */
+ color: #fff; /* default TEXT color */
+ }
+
+.fc-event-inner {
+ position: relative;
+ width: 100%;
+ height: 100%;
+ border-style: solid;
+ border-width: 0;
+ overflow: hidden;
+ }
+
+.fc-event-time,
+.fc-event-title {
+ padding: 0 1px;
+ }
+
+.fc .ui-resizable-handle { /*** TODO: don't use ui-resizable anymore, change class ***/
+ display: block;
+ position: absolute;
+ z-index: 99999;
+ overflow: hidden; /* hacky spaces (IE6/7) */
+ font-size: 300%; /* */
+ line-height: 50%; /* */
+ }
+
+
+
+/* Horizontal Events
+------------------------------------------------------------------------*/
+
+.fc-event-hori {
+ border-width: 1px 0;
+ margin-bottom: 1px;
+ }
+
+/* resizable */
+
+.fc-event-hori .ui-resizable-e {
+ top: 0 !important; /* importants override pre jquery ui 1.7 styles */
+ right: -3px !important;
+ width: 7px !important;
+ height: 100% !important;
+ cursor: e-resize;
+ }
+
+.fc-event-hori .ui-resizable-w {
+ top: 0 !important;
+ left: -3px !important;
+ width: 7px !important;
+ height: 100% !important;
+ cursor: w-resize;
+ }
+
+.fc-event-hori .ui-resizable-handle {
+ _padding-bottom: 14px; /* IE6 had 0 height */
+ }
+
+
+
+/* Fake Rounded Corners (for buttons and events)
+------------------------------------------------------------*/
+
+.fc-corner-left {
+ margin-left: 1px;
+ }
+
+.fc-corner-left .fc-button-inner,
+.fc-corner-left .fc-event-inner {
+ margin-left: -1px;
+ }
+
+.fc-corner-right {
+ margin-right: 1px;
+ }
+
+.fc-corner-right .fc-button-inner,
+.fc-corner-right .fc-event-inner {
+ margin-right: -1px;
+ }
+
+.fc-corner-top {
+ margin-top: 1px;
+ }
+
+.fc-corner-top .fc-event-inner {
+ margin-top: -1px;
+ }
+
+.fc-corner-bottom {
+ margin-bottom: 1px;
+ }
+
+.fc-corner-bottom .fc-event-inner {
+ margin-bottom: -1px;
+ }
+
+
+
+/* Fake Rounded Corners SPECIFICALLY FOR EVENTS
+-----------------------------------------------------------------*/
+
+.fc-corner-left .fc-event-inner {
+ border-left-width: 1px;
+ }
+
+.fc-corner-right .fc-event-inner {
+ border-right-width: 1px;
+ }
+
+.fc-corner-top .fc-event-inner {
+ border-top-width: 1px;
+ }
+
+.fc-corner-bottom .fc-event-inner {
+ border-bottom-width: 1px;
+ }
+
+
+
+/* Reusable Separate-border Table
+------------------------------------------------------------*/
+
+table.fc-border-separate {
+ border-collapse: separate;
+ }
+
+.fc-border-separate th,
+.fc-border-separate td {
+ border-width: 1px 0 0 1px;
+ }
+
+.fc-border-separate th.fc-last,
+.fc-border-separate td.fc-last {
+ border-right-width: 1px;
+ }
+
+.fc-border-separate tr.fc-last th,
+.fc-border-separate tr.fc-last td {
+ border-bottom-width: 1px;
+ }
+
+.fc-border-separate tbody tr.fc-first td,
+.fc-border-separate tbody tr.fc-first th {
+ border-top-width: 0;
+ }
+
+
+
+/* Month View, Basic Week View, Basic Day View
+------------------------------------------------------------------------*/
+
+.fc-grid th {
+ text-align: center;
+ }
+
+.fc-grid .fc-day-number {
+ float: right;
+ padding: 0 2px;
+ }
+
+.fc-grid .fc-other-month .fc-day-number {
+ opacity: 0.3;
+ filter: alpha(opacity=30); /* for IE */
+ /* opacity with small font can sometimes look too faded
+ might want to set the 'color' property instead
+ making day-numbers bold also fixes the problem */
+ }
+
+.fc-grid .fc-day-content {
+ clear: both;
+ padding: 2px 2px 1px; /* distance between events and day edges */
+ }
+
+/* event styles */
+
+.fc-grid .fc-event-time {
+ font-weight: bold;
+ }
+
+/* right-to-left */
+
+.fc-rtl .fc-grid .fc-day-number {
+ float: left;
+ }
+
+.fc-rtl .fc-grid .fc-event-time {
+ float: right;
+ }
+
+
+
+/* Agenda Week View, Agenda Day View
+------------------------------------------------------------------------*/
+
+.fc-agenda table {
+ border-collapse: separate;
+ }
+
+.fc-agenda-days th {
+ text-align: center;
+ }
+
+.fc-agenda .fc-agenda-axis {
+ width: 50px;
+ padding: 0 4px;
+ vertical-align: middle;
+ text-align: right;
+ white-space: nowrap;
+ font-weight: normal;
+ }
+
+.fc-agenda .fc-day-content {
+ padding: 2px 2px 1px;
+ }
+
+/* make axis border take precedence */
+
+.fc-agenda-days .fc-agenda-axis {
+ border-right-width: 1px;
+ }
+
+.fc-agenda-days .fc-col0 {
+ border-left-width: 0;
+ }
+
+/* all-day area */
+
+.fc-agenda-allday th {
+ border-width: 0 1px;
+ }
+
+.fc-agenda-allday .fc-day-content {
+ min-height: 34px; /* TODO: doesnt work well in quirksmode */
+ _height: 34px;
+ }
+
+/* divider (between all-day and slots) */
+
+.fc-agenda-divider-inner {
+ height: 2px;
+ overflow: hidden;
+ }
+
+.fc-widget-header .fc-agenda-divider-inner {
+ background: #eee;
+ }
+
+/* slot rows */
+
+.fc-agenda-slots th {
+ border-width: 1px 1px 0;
+ }
+
+.fc-agenda-slots td {
+ border-width: 1px 0 0;
+ background: none;
+ }
+
+.fc-agenda-slots td div {
+ height: 20px;
+ }
+
+.fc-agenda-slots tr.fc-slot0 th,
+.fc-agenda-slots tr.fc-slot0 td {
+ border-top-width: 0;
+ }
+
+.fc-agenda-slots tr.fc-minor th,
+.fc-agenda-slots tr.fc-minor td {
+ border-top-style: dotted;
+ }
+
+.fc-agenda-slots tr.fc-minor th.ui-widget-header {
+ *border-top-style: solid; /* doesn't work with background in IE6/7 */
+ }
+
+
+
+/* Vertical Events
+------------------------------------------------------------------------*/
+
+.fc-event-vert {
+ border-width: 0 1px;
+ }
+
+.fc-event-vert .fc-event-head,
+.fc-event-vert .fc-event-content {
+ position: relative;
+ z-index: 2;
+ width: 100%;
+ overflow: hidden;
+ }
+
+.fc-event-vert .fc-event-time {
+ white-space: nowrap;
+ font-size: 10px;
+ }
+
+.fc-event-vert .fc-event-bg { /* makes the event lighter w/ a semi-transparent overlay */
+ position: absolute;
+ z-index: 1;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: #fff;
+ opacity: .3;
+ filter: alpha(opacity=30);
+ }
+
+.fc .ui-draggable-dragging .fc-event-bg, /* TODO: something nicer like .fc-opacity */
+.fc-select-helper .fc-event-bg {
+ display: none\9; /* for IE6/7/8. nested opacity filters while dragging don't work */
+ }
+
+/* resizable */
+
+.fc-event-vert .ui-resizable-s {
+ bottom: 0 !important; /* importants override pre jquery ui 1.7 styles */
+ width: 100% !important;
+ height: 8px !important;
+ overflow: hidden !important;
+ line-height: 8px !important;
+ font-size: 11px !important;
+ font-family: monospace;
+ text-align: center;
+ cursor: s-resize;
+ }
+
+.fc-agenda .ui-resizable-resizing { /* TODO: better selector */
+ _overflow: hidden;
+ }
+
+
diff --git a/library/fullcalendar/fullcalendar.js b/library/fullcalendar/fullcalendar.js
new file mode 100644
index 000000000..779a313c7
--- /dev/null
+++ b/library/fullcalendar/fullcalendar.js
@@ -0,0 +1,5224 @@
+/**
+ * @preserve
+ * FullCalendar v1.5.3
+ * http://arshaw.com/fullcalendar/
+ *
+ * Use fullcalendar.css for basic styling.
+ * For event drag & drop, requires jQuery UI draggable.
+ * For event resizing, requires jQuery UI resizable.
+ *
+ * Copyright (c) 2011 Adam Shaw
+ * Dual licensed under the MIT and GPL licenses, located in
+ * MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
+ *
+ * Date: Mon Feb 6 22:40:40 2012 -0800
+ *
+ */
+
+(function($, undefined) {
+
+
+var defaults = {
+
+ // display
+ defaultView: 'month',
+ aspectRatio: 1.35,
+ header: {
+ left: 'title',
+ center: '',
+ right: 'today prev,next'
+ },
+ weekends: true,
+
+ // editing
+ //editable: false,
+ //disableDragging: false,
+ //disableResizing: false,
+
+ allDayDefault: true,
+ ignoreTimezone: true,
+
+ // event ajax
+ lazyFetching: true,
+ startParam: 'start',
+ endParam: 'end',
+
+ // time formats
+ titleFormat: {
+ month: 'MMMM yyyy',
+ week: "MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",
+ day: 'dddd, MMM d, yyyy'
+ },
+ columnFormat: {
+ month: 'ddd',
+ week: 'ddd M/d',
+ day: 'dddd M/d'
+ },
+ timeFormat: { // for event elements
+ '': 'h(:mm)t' // default
+ },
+
+ // locale
+ isRTL: false,
+ firstDay: 0,
+ monthNames: ['January','February','March','April','May','June','July','August','September','October','November','December'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'],
+ dayNames: ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],
+ dayNamesShort: ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'],
+ buttonText: {
+ prev: '&nbsp;&#9668;&nbsp;',
+ next: '&nbsp;&#9658;&nbsp;',
+ prevYear: '&nbsp;&lt;&lt;&nbsp;',
+ nextYear: '&nbsp;&gt;&gt;&nbsp;',
+ today: 'today',
+ month: 'month',
+ week: 'week',
+ day: 'day'
+ },
+
+ // jquery-ui theming
+ theme: false,
+ buttonIcons: {
+ prev: 'circle-triangle-w',
+ next: 'circle-triangle-e'
+ },
+
+ //selectable: false,
+ unselectAuto: true,
+
+ dropAccept: '*'
+
+};
+
+// right-to-left defaults
+var rtlDefaults = {
+ header: {
+ left: 'next,prev today',
+ center: '',
+ right: 'title'
+ },
+ buttonText: {
+ prev: '&nbsp;&#9658;&nbsp;',
+ next: '&nbsp;&#9668;&nbsp;',
+ prevYear: '&nbsp;&gt;&gt;&nbsp;',
+ nextYear: '&nbsp;&lt;&lt;&nbsp;'
+ },
+ buttonIcons: {
+ prev: 'circle-triangle-e',
+ next: 'circle-triangle-w'
+ }
+};
+
+
+
+var fc = $.fullCalendar = { version: "1.5.3" };
+var fcViews = fc.views = {};
+
+
+$.fn.fullCalendar = function(options) {
+
+
+ // method calling
+ if (typeof options == 'string') {
+ var args = Array.prototype.slice.call(arguments, 1);
+ var res;
+ this.each(function() {
+ var calendar = $.data(this, 'fullCalendar');
+ if (calendar && $.isFunction(calendar[options])) {
+ var r = calendar[options].apply(calendar, args);
+ if (res === undefined) {
+ res = r;
+ }
+ if (options == 'destroy') {
+ $.removeData(this, 'fullCalendar');
+ }
+ }
+ });
+ if (res !== undefined) {
+ return res;
+ }
+ return this;
+ }
+
+
+ // would like to have this logic in EventManager, but needs to happen before options are recursively extended
+ var eventSources = options.eventSources || [];
+ delete options.eventSources;
+ if (options.events) {
+ eventSources.push(options.events);
+ delete options.events;
+ }
+
+
+ options = $.extend(true, {},
+ defaults,
+ (options.isRTL || options.isRTL===undefined && defaults.isRTL) ? rtlDefaults : {},
+ options
+ );
+
+
+ this.each(function(i, _element) {
+ var element = $(_element);
+ var calendar = new Calendar(element, options, eventSources);
+ element.data('fullCalendar', calendar); // TODO: look into memory leak implications
+ calendar.render();
+ });
+
+
+ return this;
+
+};
+
+
+// function for adding/overriding defaults
+function setDefaults(d) {
+ $.extend(true, defaults, d);
+}
+
+
+
+
+function Calendar(element, options, eventSources) {
+ var t = this;
+
+
+ // exports
+ t.options = options;
+ t.render = render;
+ t.destroy = destroy;
+ t.refetchEvents = refetchEvents;
+ t.reportEvents = reportEvents;
+ t.reportEventChange = reportEventChange;
+ t.rerenderEvents = rerenderEvents;
+ t.changeView = changeView;
+ t.select = select;
+ t.unselect = unselect;
+ t.prev = prev;
+ t.next = next;
+ t.prevYear = prevYear;
+ t.nextYear = nextYear;
+ t.today = today;
+ t.gotoDate = gotoDate;
+ t.incrementDate = incrementDate;
+ t.formatDate = function(format, date) { return formatDate(format, date, options) };
+ t.formatDates = function(format, date1, date2) { return formatDates(format, date1, date2, options) };
+ t.getDate = getDate;
+ t.getView = getView;
+ t.option = option;
+ t.trigger = trigger;
+
+
+ // imports
+ EventManager.call(t, options, eventSources);
+ var isFetchNeeded = t.isFetchNeeded;
+ var fetchEvents = t.fetchEvents;
+
+
+ // locals
+ var _element = element[0];
+ var header;
+ var headerElement;
+ var content;
+ var tm; // for making theme classes
+ var currentView;
+ var viewInstances = {};
+ var elementOuterWidth;
+ var suggestedViewHeight;
+ var absoluteViewElement;
+ var resizeUID = 0;
+ var ignoreWindowResize = 0;
+ var date = new Date();
+ var events = [];
+ var _dragElement;
+
+
+
+ /* Main Rendering
+ -----------------------------------------------------------------------------*/
+
+
+ setYMD(date, options.year, options.month, options.date);
+
+
+ function render(inc) {
+ if (!content) {
+ initialRender();
+ }else{
+ calcSize();
+ markSizesDirty();
+ markEventsDirty();
+ renderView(inc);
+ }
+ }
+
+
+ function initialRender() {
+ tm = options.theme ? 'ui' : 'fc';
+ element.addClass('fc');
+ if (options.isRTL) {
+ element.addClass('fc-rtl');
+ }
+ if (options.theme) {
+ element.addClass('ui-widget');
+ }
+ content = $("<div class='fc-content' style='position:relative'/>")
+ .prependTo(element);
+ header = new Header(t, options);
+ headerElement = header.render();
+ if (headerElement) {
+ element.prepend(headerElement);
+ }
+ changeView(options.defaultView);
+ $(window).resize(windowResize);
+ // needed for IE in a 0x0 iframe, b/c when it is resized, never triggers a windowResize
+ if (!bodyVisible()) {
+ lateRender();
+ }
+ }
+
+
+ // called when we know the calendar couldn't be rendered when it was initialized,
+ // but we think it's ready now
+ function lateRender() {
+ setTimeout(function() { // IE7 needs this so dimensions are calculated correctly
+ if (!currentView.start && bodyVisible()) { // !currentView.start makes sure this never happens more than once
+ renderView();
+ }
+ },0);
+ }
+
+
+ function destroy() {
+ $(window).unbind('resize', windowResize);
+ header.destroy();
+ content.remove();
+ element.removeClass('fc fc-rtl ui-widget');
+ }
+
+
+
+ function elementVisible() {
+ return _element.offsetWidth !== 0;
+ }
+
+
+ function bodyVisible() {
+ return $('body')[0].offsetWidth !== 0;
+ }
+
+
+
+ /* View Rendering
+ -----------------------------------------------------------------------------*/
+
+ // TODO: improve view switching (still weird transition in IE, and FF has whiteout problem)
+
+ function changeView(newViewName) {
+ if (!currentView || newViewName != currentView.name) {
+ ignoreWindowResize++; // because setMinHeight might change the height before render (and subsequently setSize) is reached
+
+ unselect();
+
+ var oldView = currentView;
+ var newViewElement;
+
+ if (oldView) {
+ (oldView.beforeHide || noop)(); // called before changing min-height. if called after, scroll state is reset (in Opera)
+ setMinHeight(content, content.height());
+ oldView.element.hide();
+ }else{
+ setMinHeight(content, 1); // needs to be 1 (not 0) for IE7, or else view dimensions miscalculated
+ }
+ content.css('overflow', 'hidden');
+
+ currentView = viewInstances[newViewName];
+ if (currentView) {
+ currentView.element.show();
+ }else{
+ currentView = viewInstances[newViewName] = new fcViews[newViewName](
+ newViewElement = absoluteViewElement =
+ $("<div class='fc-view fc-view-" + newViewName + "' style='position:absolute'/>")
+ .appendTo(content),
+ t // the calendar object
+ );
+ }
+
+ if (oldView) {
+ header.deactivateButton(oldView.name);
+ }
+ header.activateButton(newViewName);
+
+ renderView(); // after height has been set, will make absoluteViewElement's position=relative, then set to null
+
+ content.css('overflow', '');
+ if (oldView) {
+ setMinHeight(content, 1);
+ }
+
+ if (!newViewElement) {
+ (currentView.afterShow || noop)(); // called after setting min-height/overflow, so in final scroll state (for Opera)
+ }
+
+ ignoreWindowResize--;
+ }
+ }
+
+
+
+ function renderView(inc) {
+ if (elementVisible()) {
+ ignoreWindowResize++; // because renderEvents might temporarily change the height before setSize is reached
+
+ unselect();
+
+ if (suggestedViewHeight === undefined) {
+ calcSize();
+ }
+
+ var forceEventRender = false;
+ if (!currentView.start || inc || date < currentView.start || date >= currentView.end) {
+ // view must render an entire new date range (and refetch/render events)
+ currentView.render(date, inc || 0); // responsible for clearing events
+ setSize(true);
+ forceEventRender = true;
+ }
+ else if (currentView.sizeDirty) {
+ // view must resize (and rerender events)
+ currentView.clearEvents();
+ setSize();
+ forceEventRender = true;
+ }
+ else if (currentView.eventsDirty) {
+ currentView.clearEvents();
+ forceEventRender = true;
+ }
+ currentView.sizeDirty = false;
+ currentView.eventsDirty = false;
+ updateEvents(forceEventRender);
+
+ elementOuterWidth = element.outerWidth();
+
+ header.updateTitle(currentView.title);
+ var today = new Date();
+ if (today >= currentView.start && today < currentView.end) {
+ header.disableButton('today');
+ }else{
+ header.enableButton('today');
+ }
+
+ ignoreWindowResize--;
+ currentView.trigger('viewDisplay', _element);
+ }
+ }
+
+
+
+ /* Resizing
+ -----------------------------------------------------------------------------*/
+
+
+ function updateSize() {
+ markSizesDirty();
+ if (elementVisible()) {
+ calcSize();
+ setSize();
+ unselect();
+ currentView.clearEvents();
+ currentView.renderEvents(events);
+ currentView.sizeDirty = false;
+ }
+ }
+
+
+ function markSizesDirty() {
+ $.each(viewInstances, function(i, inst) {
+ inst.sizeDirty = true;
+ });
+ }
+
+
+ function calcSize() {
+ if (options.contentHeight) {
+ suggestedViewHeight = options.contentHeight;
+ }
+ else if (options.height) {
+ suggestedViewHeight = options.height - (headerElement ? headerElement.height() : 0) - vsides(content);
+ }
+ else {
+ suggestedViewHeight = Math.round(content.width() / Math.max(options.aspectRatio, .5));
+ }
+ }
+
+
+ function setSize(dateChanged) { // todo: dateChanged?
+ ignoreWindowResize++;
+ currentView.setHeight(suggestedViewHeight, dateChanged);
+ if (absoluteViewElement) {
+ absoluteViewElement.css('position', 'relative');
+ absoluteViewElement = null;
+ }
+ currentView.setWidth(content.width(), dateChanged);
+ ignoreWindowResize--;
+ }
+
+
+ function windowResize() {
+ if (!ignoreWindowResize) {
+ if (currentView.start) { // view has already been rendered
+ var uid = ++resizeUID;
+ setTimeout(function() { // add a delay
+ if (uid == resizeUID && !ignoreWindowResize && elementVisible()) {
+ if (elementOuterWidth != (elementOuterWidth = element.outerWidth())) {
+ ignoreWindowResize++; // in case the windowResize callback changes the height
+ updateSize();
+ currentView.trigger('windowResize', _element);
+ ignoreWindowResize--;
+ }
+ }
+ }, 200);
+ }else{
+ // calendar must have been initialized in a 0x0 iframe that has just been resized
+ lateRender();
+ }
+ }
+ }
+
+
+
+ /* Event Fetching/Rendering
+ -----------------------------------------------------------------------------*/
+
+
+ // fetches events if necessary, rerenders events if necessary (or if forced)
+ function updateEvents(forceRender) {
+ if (!options.lazyFetching || isFetchNeeded(currentView.visStart, currentView.visEnd)) {
+ refetchEvents();
+ }
+ else if (forceRender) {
+ rerenderEvents();
+ }
+ }
+
+
+ function refetchEvents() {
+ fetchEvents(currentView.visStart, currentView.visEnd); // will call reportEvents
+ }
+
+
+ // called when event data arrives
+ function reportEvents(_events) {
+ events = _events;
+ rerenderEvents();
+ }
+
+
+ // called when a single event's data has been changed
+ function reportEventChange(eventID) {
+ rerenderEvents(eventID);
+ }
+
+
+ // attempts to rerenderEvents
+ function rerenderEvents(modifiedEventID) {
+ markEventsDirty();
+ if (elementVisible()) {
+ currentView.clearEvents();
+ currentView.renderEvents(events, modifiedEventID);
+ currentView.eventsDirty = false;
+ }
+ }
+
+
+ function markEventsDirty() {
+ $.each(viewInstances, function(i, inst) {
+ inst.eventsDirty = true;
+ });
+ }
+
+
+
+ /* Selection
+ -----------------------------------------------------------------------------*/
+
+
+ function select(start, end, allDay) {
+ currentView.select(start, end, allDay===undefined ? true : allDay);
+ }
+
+
+ function unselect() { // safe to be called before renderView
+ if (currentView) {
+ currentView.unselect();
+ }
+ }
+
+
+
+ /* Date
+ -----------------------------------------------------------------------------*/
+
+
+ function prev() {
+ renderView(-1);
+ }
+
+
+ function next() {
+ renderView(1);
+ }
+
+
+ function prevYear() {
+ addYears(date, -1);
+ renderView();
+ }
+
+
+ function nextYear() {
+ addYears(date, 1);
+ renderView();
+ }
+
+
+ function today() {
+ date = new Date();
+ renderView();
+ }
+
+
+ function gotoDate(year, month, dateOfMonth) {
+ if (year instanceof Date) {
+ date = cloneDate(year); // provided 1 argument, a Date
+ }else{
+ setYMD(date, year, month, dateOfMonth);
+ }
+ renderView();
+ }
+
+
+ function incrementDate(years, months, days) {
+ if (years !== undefined) {
+ addYears(date, years);
+ }
+ if (months !== undefined) {
+ addMonths(date, months);
+ }
+ if (days !== undefined) {
+ addDays(date, days);
+ }
+ renderView();
+ }
+
+
+ function getDate() {
+ return cloneDate(date);
+ }
+
+
+
+ /* Misc
+ -----------------------------------------------------------------------------*/
+
+
+ function getView() {
+ return currentView;
+ }
+
+
+ function option(name, value) {
+ if (value === undefined) {
+ return options[name];
+ }
+ if (name == 'height' || name == 'contentHeight' || name == 'aspectRatio') {
+ options[name] = value;
+ updateSize();
+ }
+ }
+
+
+ function trigger(name, thisObj) {
+ if (options[name]) {
+ return options[name].apply(
+ thisObj || _element,
+ Array.prototype.slice.call(arguments, 2)
+ );
+ }
+ }
+
+
+
+ /* External Dragging
+ ------------------------------------------------------------------------*/
+
+ if (options.droppable) {
+ $(document)
+ .bind('dragstart', function(ev, ui) {
+ var _e = ev.target;
+ var e = $(_e);
+ if (!e.parents('.fc').length) { // not already inside a calendar
+ var accept = options.dropAccept;
+ if ($.isFunction(accept) ? accept.call(_e, e) : e.is(accept)) {
+ _dragElement = _e;
+ currentView.dragStart(_dragElement, ev, ui);
+ }
+ }
+ })
+ .bind('dragstop', function(ev, ui) {
+ if (_dragElement) {
+ currentView.dragStop(_dragElement, ev, ui);
+ _dragElement = null;
+ }
+ });
+ }
+
+
+}
+
+function Header(calendar, options) {
+ var t = this;
+
+
+ // exports
+ t.render = render;
+ t.destroy = destroy;
+ t.updateTitle = updateTitle;
+ t.activateButton = activateButton;
+ t.deactivateButton = deactivateButton;
+ t.disableButton = disableButton;
+ t.enableButton = enableButton;
+
+
+ // locals
+ var element = $([]);
+ var tm;
+
+
+
+ function render() {
+ tm = options.theme ? 'ui' : 'fc';
+ var sections = options.header;
+ if (sections) {
+ element = $("<table class='fc-header' style='width:100%'/>")
+ .append(
+ $("<tr/>")
+ .append(renderSection('left'))
+ .append(renderSection('center'))
+ .append(renderSection('right'))
+ );
+ return element;
+ }
+ }
+
+
+ function destroy() {
+ element.remove();
+ }
+
+
+ function renderSection(position) {
+ var e = $("<td class='fc-header-" + position + "'/>");
+ var buttonStr = options.header[position];
+ if (buttonStr) {
+ $.each(buttonStr.split(' '), function(i) {
+ if (i > 0) {
+ e.append("<span class='fc-header-space'/>");
+ }
+ var prevButton;
+ $.each(this.split(','), function(j, buttonName) {
+ if (buttonName == 'title') {
+ e.append("<span class='fc-header-title'><h2>&nbsp;</h2></span>");
+ if (prevButton) {
+ prevButton.addClass(tm + '-corner-right');
+ }
+ prevButton = null;
+ }else{
+ var buttonClick;
+ if (calendar[buttonName]) {
+ buttonClick = calendar[buttonName]; // calendar method
+ }
+ else if (fcViews[buttonName]) {
+ buttonClick = function() {
+ button.removeClass(tm + '-state-hover'); // forget why
+ calendar.changeView(buttonName);
+ };
+ }
+ if (buttonClick) {
+ var icon = options.theme ? smartProperty(options.buttonIcons, buttonName) : null; // why are we using smartProperty here?
+ var text = smartProperty(options.buttonText, buttonName); // why are we using smartProperty here?
+ var button = $(
+ "<span class='fc-button fc-button-" + buttonName + " " + tm + "-state-default'>" +
+ "<span class='fc-button-inner'>" +
+ "<span class='fc-button-content'>" +
+ (icon ?
+ "<span class='fc-icon-wrap'>" +
+ "<span class='ui-icon ui-icon-" + icon + "'/>" +
+ "</span>" :
+ text
+ ) +
+ "</span>" +
+ "<span class='fc-button-effect'><span></span></span>" +
+ "</span>" +
+ "</span>"
+ );
+ if (button) {
+ button
+ .click(function() {
+ if (!button.hasClass(tm + '-state-disabled')) {
+ buttonClick();
+ }
+ })
+ .mousedown(function() {
+ button
+ .not('.' + tm + '-state-active')
+ .not('.' + tm + '-state-disabled')
+ .addClass(tm + '-state-down');
+ })
+ .mouseup(function() {
+ button.removeClass(tm + '-state-down');
+ })
+ .hover(
+ function() {
+ button
+ .not('.' + tm + '-state-active')
+ .not('.' + tm + '-state-disabled')
+ .addClass(tm + '-state-hover');
+ },
+ function() {
+ button
+ .removeClass(tm + '-state-hover')
+ .removeClass(tm + '-state-down');
+ }
+ )
+ .appendTo(e);
+ if (!prevButton) {
+ button.addClass(tm + '-corner-left');
+ }
+ prevButton = button;
+ }
+ }
+ }
+ });
+ if (prevButton) {
+ prevButton.addClass(tm + '-corner-right');
+ }
+ });
+ }
+ return e;
+ }
+
+
+ function updateTitle(html) {
+ element.find('h2')
+ .html(html);
+ }
+
+
+ function activateButton(buttonName) {
+ element.find('span.fc-button-' + buttonName)
+ .addClass(tm + '-state-active');
+ }
+
+
+ function deactivateButton(buttonName) {
+ element.find('span.fc-button-' + buttonName)
+ .removeClass(tm + '-state-active');
+ }
+
+
+ function disableButton(buttonName) {
+ element.find('span.fc-button-' + buttonName)
+ .addClass(tm + '-state-disabled');
+ }
+
+
+ function enableButton(buttonName) {
+ element.find('span.fc-button-' + buttonName)
+ .removeClass(tm + '-state-disabled');
+ }
+
+
+}
+
+fc.sourceNormalizers = [];
+fc.sourceFetchers = [];
+
+var ajaxDefaults = {
+ dataType: 'json',
+ cache: false
+};
+
+var eventGUID = 1;
+
+
+function EventManager(options, _sources) {
+ var t = this;
+
+
+ // exports
+ t.isFetchNeeded = isFetchNeeded;
+ t.fetchEvents = fetchEvents;
+ t.addEventSource = addEventSource;
+ t.removeEventSource = removeEventSource;
+ t.updateEvent = updateEvent;
+ t.renderEvent = renderEvent;
+ t.removeEvents = removeEvents;
+ t.clientEvents = clientEvents;
+ t.normalizeEvent = normalizeEvent;
+
+
+ // imports
+ var trigger = t.trigger;
+ var getView = t.getView;
+ var reportEvents = t.reportEvents;
+
+
+ // locals
+ var stickySource = { events: [] };
+ var sources = [ stickySource ];
+ var rangeStart, rangeEnd;
+ var currentFetchID = 0;
+ var pendingSourceCnt = 0;
+ var loadingLevel = 0;
+ var cache = [];
+
+
+ for (var i=0; i<_sources.length; i++) {
+ _addEventSource(_sources[i]);
+ }
+
+
+
+ /* Fetching
+ -----------------------------------------------------------------------------*/
+
+
+ function isFetchNeeded(start, end) {
+ return !rangeStart || start < rangeStart || end > rangeEnd;
+ }
+
+
+ function fetchEvents(start, end) {
+ rangeStart = start;
+ rangeEnd = end;
+ cache = [];
+ var fetchID = ++currentFetchID;
+ var len = sources.length;
+ pendingSourceCnt = len;
+ for (var i=0; i<len; i++) {
+ fetchEventSource(sources[i], fetchID);
+ }
+ }
+
+
+ function fetchEventSource(source, fetchID) {
+ _fetchEventSource(source, function(events) {
+ if (fetchID == currentFetchID) {
+ if (events) {
+ for (var i=0; i<events.length; i++) {
+ events[i].source = source;
+ normalizeEvent(events[i]);
+ }
+ cache = cache.concat(events);
+ }
+ pendingSourceCnt--;
+ if (!pendingSourceCnt) {
+ reportEvents(cache);
+ }
+ }
+ });
+ }
+
+
+ function _fetchEventSource(source, callback) {
+ var i;
+ var fetchers = fc.sourceFetchers;
+ var res;
+ for (i=0; i<fetchers.length; i++) {
+ res = fetchers[i](source, rangeStart, rangeEnd, callback);
+ if (res === true) {
+ // the fetcher is in charge. made its own async request
+ return;
+ }
+ else if (typeof res == 'object') {
+ // the fetcher returned a new source. process it
+ _fetchEventSource(res, callback);
+ return;
+ }
+ }
+ var events = source.events;
+ if (events) {
+ if ($.isFunction(events)) {
+ pushLoading();
+ events(cloneDate(rangeStart), cloneDate(rangeEnd), function(events) {
+ callback(events);
+ popLoading();
+ });
+ }
+ else if ($.isArray(events)) {
+ callback(events);
+ }
+ else {
+ callback();
+ }
+ }else{
+ var url = source.url;
+ if (url) {
+ var success = source.success;
+ var error = source.error;
+ var complete = source.complete;
+ var data = $.extend({}, source.data || {});
+ var startParam = firstDefined(source.startParam, options.startParam);
+ var endParam = firstDefined(source.endParam, options.endParam);
+ if (startParam) {
+ data[startParam] = Math.round(+rangeStart / 1000);
+ }
+ if (endParam) {
+ data[endParam] = Math.round(+rangeEnd / 1000);
+ }
+ pushLoading();
+ $.ajax($.extend({}, ajaxDefaults, source, {
+ data: data,
+ success: function(events) {
+ events = events || [];
+ var res = applyAll(success, this, arguments);
+ if ($.isArray(res)) {
+ events = res;
+ }
+ callback(events);
+ },
+ error: function() {
+ applyAll(error, this, arguments);
+ callback();
+ },
+ complete: function() {
+ applyAll(complete, this, arguments);
+ popLoading();
+ }
+ }));
+ }else{
+ callback();
+ }
+ }
+ }
+
+
+
+ /* Sources
+ -----------------------------------------------------------------------------*/
+
+
+ function addEventSource(source) {
+ source = _addEventSource(source);
+ if (source) {
+ pendingSourceCnt++;
+ fetchEventSource(source, currentFetchID); // will eventually call reportEvents
+ }
+ }
+
+
+ function _addEventSource(source) {
+ if ($.isFunction(source) || $.isArray(source)) {
+ source = { events: source };
+ }
+ else if (typeof source == 'string') {
+ source = { url: source };
+ }
+ if (typeof source == 'object') {
+ normalizeSource(source);
+ sources.push(source);
+ return source;
+ }
+ }
+
+
+ function removeEventSource(source) {
+ sources = $.grep(sources, function(src) {
+ return !isSourcesEqual(src, source);
+ });
+ // remove all client events from that source
+ cache = $.grep(cache, function(e) {
+ return !isSourcesEqual(e.source, source);
+ });
+ reportEvents(cache);
+ }
+
+
+
+ /* Manipulation
+ -----------------------------------------------------------------------------*/
+
+
+ function updateEvent(event) { // update an existing event
+ var i, len = cache.length, e,
+ defaultEventEnd = getView().defaultEventEnd, // getView???
+ startDelta = event.start - event._start,
+ endDelta = event.end ?
+ (event.end - (event._end || defaultEventEnd(event))) // event._end would be null if event.end
+ : 0; // was null and event was just resized
+ for (i=0; i<len; i++) {
+ e = cache[i];
+ if (e._id == event._id && e != event) {
+ e.start = new Date(+e.start + startDelta);
+ if (event.end) {
+ if (e.end) {
+ e.end = new Date(+e.end + endDelta);
+ }else{
+ e.end = new Date(+defaultEventEnd(e) + endDelta);
+ }
+ }else{
+ e.end = null;
+ }
+ e.title = event.title;
+ e.url = event.url;
+ e.allDay = event.allDay;
+ e.className = event.className;
+ e.editable = event.editable;
+ e.color = event.color;
+ e.backgroudColor = event.backgroudColor;
+ e.borderColor = event.borderColor;
+ e.textColor = event.textColor;
+ normalizeEvent(e);
+ }
+ }
+ normalizeEvent(event);
+ reportEvents(cache);
+ }
+
+
+ function renderEvent(event, stick) {
+ normalizeEvent(event);
+ if (!event.source) {
+ if (stick) {
+ stickySource.events.push(event);
+ event.source = stickySource;
+ }
+ cache.push(event);
+ }
+ reportEvents(cache);
+ }
+
+
+ function removeEvents(filter) {
+ if (!filter) { // remove all
+ cache = [];
+ // clear all array sources
+ for (var i=0; i<sources.length; i++) {
+ if ($.isArray(sources[i].events)) {
+ sources[i].events = [];
+ }
+ }
+ }else{
+ if (!$.isFunction(filter)) { // an event ID
+ var id = filter + '';
+ filter = function(e) {
+ return e._id == id;
+ };
+ }
+ cache = $.grep(cache, filter, true);
+ // remove events from array sources
+ for (var i=0; i<sources.length; i++) {
+ if ($.isArray(sources[i].events)) {
+ sources[i].events = $.grep(sources[i].events, filter, true);
+ }
+ }
+ }
+ reportEvents(cache);
+ }
+
+
+ function clientEvents(filter) {
+ if ($.isFunction(filter)) {
+ return $.grep(cache, filter);
+ }
+ else if (filter) { // an event ID
+ filter += '';
+ return $.grep(cache, function(e) {
+ return e._id == filter;
+ });
+ }
+ return cache; // else, return all
+ }
+
+
+
+ /* Loading State
+ -----------------------------------------------------------------------------*/
+
+
+ function pushLoading() {
+ if (!loadingLevel++) {
+ trigger('loading', null, true);
+ }
+ }
+
+
+ function popLoading() {
+ if (!--loadingLevel) {
+ trigger('loading', null, false);
+ }
+ }
+
+
+
+ /* Event Normalization
+ -----------------------------------------------------------------------------*/
+
+
+ function normalizeEvent(event) {
+ var source = event.source || {};
+ var ignoreTimezone = firstDefined(source.ignoreTimezone, options.ignoreTimezone);
+ event._id = event._id || (event.id === undefined ? '_fc' + eventGUID++ : event.id + '');
+ if (event.date) {
+ if (!event.start) {
+ event.start = event.date;
+ }
+ delete event.date;
+ }
+ event._start = cloneDate(event.start = parseDate(event.start, ignoreTimezone));
+ event.end = parseDate(event.end, ignoreTimezone);
+ if (event.end && event.end <= event.start) {
+ event.end = null;
+ }
+ event._end = event.end ? cloneDate(event.end) : null;
+ if (event.allDay === undefined) {
+ event.allDay = firstDefined(source.allDayDefault, options.allDayDefault);
+ }
+ if (event.className) {
+ if (typeof event.className == 'string') {
+ event.className = event.className.split(/\s+/);
+ }
+ }else{
+ event.className = [];
+ }
+ // TODO: if there is no start date, return false to indicate an invalid event
+ }
+
+
+
+ /* Utils
+ ------------------------------------------------------------------------------*/
+
+
+ function normalizeSource(source) {
+ if (source.className) {
+ // TODO: repeat code, same code for event classNames
+ if (typeof source.className == 'string') {
+ source.className = source.className.split(/\s+/);
+ }
+ }else{
+ source.className = [];
+ }
+ var normalizers = fc.sourceNormalizers;
+ for (var i=0; i<normalizers.length; i++) {
+ normalizers[i](source);
+ }
+ }
+
+
+ function isSourcesEqual(source1, source2) {
+ return source1 && source2 && getSourcePrimitive(source1) == getSourcePrimitive(source2);
+ }
+
+
+ function getSourcePrimitive(source) {
+ return ((typeof source == 'object') ? (source.events || source.url) : '') || source;
+ }
+
+
+}
+
+
+fc.addDays = addDays;
+fc.cloneDate = cloneDate;
+fc.parseDate = parseDate;
+fc.parseISO8601 = parseISO8601;
+fc.parseTime = parseTime;
+fc.formatDate = formatDate;
+fc.formatDates = formatDates;
+
+
+
+/* Date Math
+-----------------------------------------------------------------------------*/
+
+var dayIDs = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'],
+ DAY_MS = 86400000,
+ HOUR_MS = 3600000,
+ MINUTE_MS = 60000;
+
+
+function addYears(d, n, keepTime) {
+ d.setFullYear(d.getFullYear() + n);
+ if (!keepTime) {
+ clearTime(d);
+ }
+ return d;
+}
+
+
+function addMonths(d, n, keepTime) { // prevents day overflow/underflow
+ if (+d) { // prevent infinite looping on invalid dates
+ var m = d.getMonth() + n,
+ check = cloneDate(d);
+ check.setDate(1);
+ check.setMonth(m);
+ d.setMonth(m);
+ if (!keepTime) {
+ clearTime(d);
+ }
+ while (d.getMonth() != check.getMonth()) {
+ d.setDate(d.getDate() + (d < check ? 1 : -1));
+ }
+ }
+ return d;
+}
+
+
+function addDays(d, n, keepTime) { // deals with daylight savings
+ if (+d) {
+ var dd = d.getDate() + n,
+ check = cloneDate(d);
+ check.setHours(9); // set to middle of day
+ check.setDate(dd);
+ d.setDate(dd);
+ if (!keepTime) {
+ clearTime(d);
+ }
+ fixDate(d, check);
+ }
+ return d;
+}
+
+
+function fixDate(d, check) { // force d to be on check's YMD, for daylight savings purposes
+ if (+d) { // prevent infinite looping on invalid dates
+ while (d.getDate() != check.getDate()) {
+ d.setTime(+d + (d < check ? 1 : -1) * HOUR_MS);
+ }
+ }
+}
+
+
+function addMinutes(d, n) {
+ d.setMinutes(d.getMinutes() + n);
+ return d;
+}
+
+
+function clearTime(d) {
+ d.setHours(0);
+ d.setMinutes(0);
+ d.setSeconds(0);
+ d.setMilliseconds(0);
+ return d;
+}
+
+
+function cloneDate(d, dontKeepTime) {
+ if (dontKeepTime) {
+ return clearTime(new Date(+d));
+ }
+ return new Date(+d);
+}
+
+
+function zeroDate() { // returns a Date with time 00:00:00 and dateOfMonth=1
+ var i=0, d;
+ do {
+ d = new Date(1970, i++, 1);
+ } while (d.getHours()); // != 0
+ return d;
+}
+
+
+function skipWeekend(date, inc, excl) {
+ inc = inc || 1;
+ while (!date.getDay() || (excl && date.getDay()==1 || !excl && date.getDay()==6)) {
+ addDays(date, inc);
+ }
+ return date;
+}
+
+
+function dayDiff(d1, d2) { // d1 - d2
+ return Math.round((cloneDate(d1, true) - cloneDate(d2, true)) / DAY_MS);
+}
+
+
+function setYMD(date, y, m, d) {
+ if (y !== undefined && y != date.getFullYear()) {
+ date.setDate(1);
+ date.setMonth(0);
+ date.setFullYear(y);
+ }
+ if (m !== undefined && m != date.getMonth()) {
+ date.setDate(1);
+ date.setMonth(m);
+ }
+ if (d !== undefined) {
+ date.setDate(d);
+ }
+}
+
+
+
+/* Date Parsing
+-----------------------------------------------------------------------------*/
+
+
+function parseDate(s, ignoreTimezone) { // ignoreTimezone defaults to true
+ if (typeof s == 'object') { // already a Date object
+ return s;
+ }
+ if (typeof s == 'number') { // a UNIX timestamp
+ return new Date(s * 1000);
+ }
+ if (typeof s == 'string') {
+ if (s.match(/^\d+(\.\d+)?$/)) { // a UNIX timestamp
+ return new Date(parseFloat(s) * 1000);
+ }
+ if (ignoreTimezone === undefined) {
+ ignoreTimezone = true;
+ }
+ return parseISO8601(s, ignoreTimezone) || (s ? new Date(s) : null);
+ }
+ // TODO: never return invalid dates (like from new Date(<string>)), return null instead
+ return null;
+}
+
+
+function parseISO8601(s, ignoreTimezone) { // ignoreTimezone defaults to false
+ // derived from http://delete.me.uk/2005/03/iso8601.html
+ // TODO: for a know glitch/feature, read tests/issue_206_parseDate_dst.html
+ var m = s.match(/^([0-9]{4})(-([0-9]{2})(-([0-9]{2})([T ]([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?(Z|(([-+])([0-9]{2})(:?([0-9]{2}))?))?)?)?)?$/);
+ if (!m) {
+ return null;
+ }
+ var date = new Date(m[1], 0, 1);
+ if (ignoreTimezone || !m[13]) {
+ var check = new Date(m[1], 0, 1, 9, 0);
+ if (m[3]) {
+ date.setMonth(m[3] - 1);
+ check.setMonth(m[3] - 1);
+ }
+ if (m[5]) {
+ date.setDate(m[5]);
+ check.setDate(m[5]);
+ }
+ fixDate(date, check);
+ if (m[7]) {
+ date.setHours(m[7]);
+ }
+ if (m[8]) {
+ date.setMinutes(m[8]);
+ }
+ if (m[10]) {
+ date.setSeconds(m[10]);
+ }
+ if (m[12]) {
+ date.setMilliseconds(Number("0." + m[12]) * 1000);
+ }
+ fixDate(date, check);
+ }else{
+ date.setUTCFullYear(
+ m[1],
+ m[3] ? m[3] - 1 : 0,
+ m[5] || 1
+ );
+ date.setUTCHours(
+ m[7] || 0,
+ m[8] || 0,
+ m[10] || 0,
+ m[12] ? Number("0." + m[12]) * 1000 : 0
+ );
+ if (m[14]) {
+ var offset = Number(m[16]) * 60 + (m[18] ? Number(m[18]) : 0);
+ offset *= m[15] == '-' ? 1 : -1;
+ date = new Date(+date + (offset * 60 * 1000));
+ }
+ }
+ return date;
+}
+
+
+function parseTime(s) { // returns minutes since start of day
+ if (typeof s == 'number') { // an hour
+ return s * 60;
+ }
+ if (typeof s == 'object') { // a Date object
+ return s.getHours() * 60 + s.getMinutes();
+ }
+ var m = s.match(/(\d+)(?::(\d+))?\s*(\w+)?/);
+ if (m) {
+ var h = parseInt(m[1], 10);
+ if (m[3]) {
+ h %= 12;
+ if (m[3].toLowerCase().charAt(0) == 'p') {
+ h += 12;
+ }
+ }
+ return h * 60 + (m[2] ? parseInt(m[2], 10) : 0);
+ }
+}
+
+
+
+/* Date Formatting
+-----------------------------------------------------------------------------*/
+// TODO: use same function formatDate(date, [date2], format, [options])
+
+
+function formatDate(date, format, options) {
+ return formatDates(date, null, format, options);
+}
+
+
+function formatDates(date1, date2, format, options) {
+ options = options || defaults;
+ var date = date1,
+ otherDate = date2,
+ i, len = format.length, c,
+ i2, formatter,
+ res = '';
+ for (i=0; i<len; i++) {
+ c = format.charAt(i);
+ if (c == "'") {
+ for (i2=i+1; i2<len; i2++) {
+ if (format.charAt(i2) == "'") {
+ if (date) {
+ if (i2 == i+1) {
+ res += "'";
+ }else{
+ res += format.substring(i+1, i2);
+ }
+ i = i2;
+ }
+ break;
+ }
+ }
+ }
+ else if (c == '(') {
+ for (i2=i+1; i2<len; i2++) {
+ if (format.charAt(i2) == ')') {
+ var subres = formatDate(date, format.substring(i+1, i2), options);
+ if (parseInt(subres.replace(/\D/, ''), 10)) {
+ res += subres;
+ }
+ i = i2;
+ break;
+ }
+ }
+ }
+ else if (c == '[') {
+ for (i2=i+1; i2<len; i2++) {
+ if (format.charAt(i2) == ']') {
+ var subformat = format.substring(i+1, i2);
+ var subres = formatDate(date, subformat, options);
+ if (subres != formatDate(otherDate, subformat, options)) {
+ res += subres;
+ }
+ i = i2;
+ break;
+ }
+ }
+ }
+ else if (c == '{') {
+ date = date2;
+ otherDate = date1;
+ }
+ else if (c == '}') {
+ date = date1;
+ otherDate = date2;
+ }
+ else {
+ for (i2=len; i2>i; i2--) {
+ if (formatter = dateFormatters[format.substring(i, i2)]) {
+ if (date) {
+ res += formatter(date, options);
+ }
+ i = i2 - 1;
+ break;
+ }
+ }
+ if (i2 == i) {
+ if (date) {
+ res += c;
+ }
+ }
+ }
+ }
+ return res;
+};
+
+
+var dateFormatters = {
+ s : function(d) { return d.getSeconds() },
+ ss : function(d) { return zeroPad(d.getSeconds()) },
+ m : function(d) { return d.getMinutes() },
+ mm : function(d) { return zeroPad(d.getMinutes()) },
+ h : function(d) { return d.getHours() % 12 || 12 },
+ hh : function(d) { return zeroPad(d.getHours() % 12 || 12) },
+ H : function(d) { return d.getHours() },
+ HH : function(d) { return zeroPad(d.getHours()) },
+ d : function(d) { return d.getDate() },
+ dd : function(d) { return zeroPad(d.getDate()) },
+ ddd : function(d,o) { return o.dayNamesShort[d.getDay()] },
+ dddd: function(d,o) { return o.dayNames[d.getDay()] },
+ M : function(d) { return d.getMonth() + 1 },
+ MM : function(d) { return zeroPad(d.getMonth() + 1) },
+ MMM : function(d,o) { return o.monthNamesShort[d.getMonth()] },
+ MMMM: function(d,o) { return o.monthNames[d.getMonth()] },
+ yy : function(d) { return (d.getFullYear()+'').substring(2) },
+ yyyy: function(d) { return d.getFullYear() },
+ t : function(d) { return d.getHours() < 12 ? 'a' : 'p' },
+ tt : function(d) { return d.getHours() < 12 ? 'am' : 'pm' },
+ T : function(d) { return d.getHours() < 12 ? 'A' : 'P' },
+ TT : function(d) { return d.getHours() < 12 ? 'AM' : 'PM' },
+ u : function(d) { return formatDate(d, "yyyy-MM-dd'T'HH:mm:ss'Z'") },
+ S : function(d) {
+ var date = d.getDate();
+ if (date > 10 && date < 20) {
+ return 'th';
+ }
+ return ['st', 'nd', 'rd'][date%10-1] || 'th';
+ }
+};
+
+
+
+fc.applyAll = applyAll;
+
+
+/* Event Date Math
+-----------------------------------------------------------------------------*/
+
+
+function exclEndDay(event) {
+ if (event.end) {
+ return _exclEndDay(event.end, event.allDay);
+ }else{
+ return addDays(cloneDate(event.start), 1);
+ }
+}
+
+
+function _exclEndDay(end, allDay) {
+ end = cloneDate(end);
+ return allDay || end.getHours() || end.getMinutes() ? addDays(end, 1) : clearTime(end);
+}
+
+
+function segCmp(a, b) {
+ return (b.msLength - a.msLength) * 100 + (a.event.start - b.event.start);
+}
+
+
+function segsCollide(seg1, seg2) {
+ return seg1.end > seg2.start && seg1.start < seg2.end;
+}
+
+
+
+/* Event Sorting
+-----------------------------------------------------------------------------*/
+
+
+// event rendering utilities
+function sliceSegs(events, visEventEnds, start, end) {
+ var segs = [],
+ i, len=events.length, event,
+ eventStart, eventEnd,
+ segStart, segEnd,
+ isStart, isEnd;
+ for (i=0; i<len; i++) {
+ event = events[i];
+ eventStart = event.start;
+ eventEnd = visEventEnds[i];
+ if (eventEnd > start && eventStart < end) {
+ if (eventStart < start) {
+ segStart = cloneDate(start);
+ isStart = false;
+ }else{
+ segStart = eventStart;
+ isStart = true;
+ }
+ if (eventEnd > end) {
+ segEnd = cloneDate(end);
+ isEnd = false;
+ }else{
+ segEnd = eventEnd;
+ isEnd = true;
+ }
+ segs.push({
+ event: event,
+ start: segStart,
+ end: segEnd,
+ isStart: isStart,
+ isEnd: isEnd,
+ msLength: segEnd - segStart
+ });
+ }
+ }
+ return segs.sort(segCmp);
+}
+
+
+// event rendering calculation utilities
+function stackSegs(segs) {
+ var levels = [],
+ i, len = segs.length, seg,
+ j, collide, k;
+ for (i=0; i<len; i++) {
+ seg = segs[i];
+ j = 0; // the level index where seg should belong
+ while (true) {
+ collide = false;
+ if (levels[j]) {
+ for (k=0; k<levels[j].length; k++) {
+ if (segsCollide(levels[j][k], seg)) {
+ collide = true;
+ break;
+ }
+ }
+ }
+ if (collide) {
+ j++;
+ }else{
+ break;
+ }
+ }
+ if (levels[j]) {
+ levels[j].push(seg);
+ }else{
+ levels[j] = [seg];
+ }
+ }
+ return levels;
+}
+
+
+
+/* Event Element Binding
+-----------------------------------------------------------------------------*/
+
+
+function lazySegBind(container, segs, bindHandlers) {
+ container.unbind('mouseover').mouseover(function(ev) {
+ var parent=ev.target, e,
+ i, seg;
+ while (parent != this) {
+ e = parent;
+ parent = parent.parentNode;
+ }
+ if ((i = e._fci) !== undefined) {
+ e._fci = undefined;
+ seg = segs[i];
+ bindHandlers(seg.event, seg.element, seg);
+ $(ev.target).trigger(ev);
+ }
+ ev.stopPropagation();
+ });
+}
+
+
+
+/* Element Dimensions
+-----------------------------------------------------------------------------*/
+
+
+function setOuterWidth(element, width, includeMargins) {
+ for (var i=0, e; i<element.length; i++) {
+ e = $(element[i]);
+ e.width(Math.max(0, width - hsides(e, includeMargins)));
+ }
+}
+
+
+function setOuterHeight(element, height, includeMargins) {
+ for (var i=0, e; i<element.length; i++) {
+ e = $(element[i]);
+ e.height(Math.max(0, height - vsides(e, includeMargins)));
+ }
+}
+
+
+// TODO: curCSS has been deprecated (jQuery 1.4.3 - 10/16/2010)
+
+
+function hsides(element, includeMargins) {
+ return hpadding(element) + hborders(element) + (includeMargins ? hmargins(element) : 0);
+}
+
+
+function hpadding(element) {
+ return (parseFloat($.curCSS(element[0], 'paddingLeft', true)) || 0) +
+ (parseFloat($.curCSS(element[0], 'paddingRight', true)) || 0);
+}
+
+
+function hmargins(element) {
+ return (parseFloat($.curCSS(element[0], 'marginLeft', true)) || 0) +
+ (parseFloat($.curCSS(element[0], 'marginRight', true)) || 0);
+}
+
+
+function hborders(element) {
+ return (parseFloat($.curCSS(element[0], 'borderLeftWidth', true)) || 0) +
+ (parseFloat($.curCSS(element[0], 'borderRightWidth', true)) || 0);
+}
+
+
+function vsides(element, includeMargins) {
+ return vpadding(element) + vborders(element) + (includeMargins ? vmargins(element) : 0);
+}
+
+
+function vpadding(element) {
+ return (parseFloat($.curCSS(element[0], 'paddingTop', true)) || 0) +
+ (parseFloat($.curCSS(element[0], 'paddingBottom', true)) || 0);
+}
+
+
+function vmargins(element) {
+ return (parseFloat($.curCSS(element[0], 'marginTop', true)) || 0) +
+ (parseFloat($.curCSS(element[0], 'marginBottom', true)) || 0);
+}
+
+
+function vborders(element) {
+ return (parseFloat($.curCSS(element[0], 'borderTopWidth', true)) || 0) +
+ (parseFloat($.curCSS(element[0], 'borderBottomWidth', true)) || 0);
+}
+
+
+function setMinHeight(element, height) {
+ height = (typeof height == 'number' ? height + 'px' : height);
+ element.each(function(i, _element) {
+ _element.style.cssText += ';min-height:' + height + ';_height:' + height;
+ // why can't we just use .css() ? i forget
+ });
+}
+
+
+
+/* Misc Utils
+-----------------------------------------------------------------------------*/
+
+
+//TODO: arraySlice
+//TODO: isFunction, grep ?
+
+
+function noop() { }
+
+
+function cmp(a, b) {
+ return a - b;
+}
+
+
+function arrayMax(a) {
+ return Math.max.apply(Math, a);
+}
+
+
+function zeroPad(n) {
+ return (n < 10 ? '0' : '') + n;
+}
+
+
+function smartProperty(obj, name) { // get a camel-cased/namespaced property of an object
+ if (obj[name] !== undefined) {
+ return obj[name];
+ }
+ var parts = name.split(/(?=[A-Z])/),
+ i=parts.length-1, res;
+ for (; i>=0; i--) {
+ res = obj[parts[i].toLowerCase()];
+ if (res !== undefined) {
+ return res;
+ }
+ }
+ return obj[''];
+}
+
+
+function htmlEscape(s) {
+ return s.replace(/&/g, '&amp;')
+ .replace(/</g, '&lt;')
+ .replace(/>/g, '&gt;')
+ .replace(/'/g, '&#039;')
+ .replace(/"/g, '&quot;')
+ .replace(/\n/g, '<br />');
+}
+
+
+function cssKey(_element) {
+ return _element.id + '/' + _element.className + '/' + _element.style.cssText.replace(/(^|;)\s*(top|left|width|height)\s*:[^;]*/ig, '');
+}
+
+
+function disableTextSelection(element) {
+ element
+ .attr('unselectable', 'on')
+ .css('MozUserSelect', 'none')
+ .bind('selectstart.ui', function() { return false; });
+}
+
+
+/*
+function enableTextSelection(element) {
+ element
+ .attr('unselectable', 'off')
+ .css('MozUserSelect', '')
+ .unbind('selectstart.ui');
+}
+*/
+
+
+function markFirstLast(e) {
+ e.children()
+ .removeClass('fc-first fc-last')
+ .filter(':first-child')
+ .addClass('fc-first')
+ .end()
+ .filter(':last-child')
+ .addClass('fc-last');
+}
+
+
+function setDayID(cell, date) {
+ cell.each(function(i, _cell) {
+ _cell.className = _cell.className.replace(/^fc-\w*/, 'fc-' + dayIDs[date.getDay()]);
+ // TODO: make a way that doesn't rely on order of classes
+ });
+}
+
+
+function getSkinCss(event, opt) {
+ var source = event.source || {};
+ var eventColor = event.color;
+ var sourceColor = source.color;
+ var optionColor = opt('eventColor');
+ var backgroundColor =
+ event.backgroundColor ||
+ eventColor ||
+ source.backgroundColor ||
+ sourceColor ||
+ opt('eventBackgroundColor') ||
+ optionColor;
+ var borderColor =
+ event.borderColor ||
+ eventColor ||
+ source.borderColor ||
+ sourceColor ||
+ opt('eventBorderColor') ||
+ optionColor;
+ var textColor =
+ event.textColor ||
+ source.textColor ||
+ opt('eventTextColor');
+ var statements = [];
+ if (backgroundColor) {
+ statements.push('background-color:' + backgroundColor);
+ }
+ if (borderColor) {
+ statements.push('border-color:' + borderColor);
+ }
+ if (textColor) {
+ statements.push('color:' + textColor);
+ }
+ return statements.join(';');
+}
+
+
+function applyAll(functions, thisObj, args) {
+ if ($.isFunction(functions)) {
+ functions = [ functions ];
+ }
+ if (functions) {
+ var i;
+ var ret;
+ for (i=0; i<functions.length; i++) {
+ ret = functions[i].apply(thisObj, args) || ret;
+ }
+ return ret;
+ }
+}
+
+
+function firstDefined() {
+ for (var i=0; i<arguments.length; i++) {
+ if (arguments[i] !== undefined) {
+ return arguments[i];
+ }
+ }
+}
+
+
+
+fcViews.month = MonthView;
+
+function MonthView(element, calendar) {
+ var t = this;
+
+
+ // exports
+ t.render = render;
+
+
+ // imports
+ BasicView.call(t, element, calendar, 'month');
+ var opt = t.opt;
+ var renderBasic = t.renderBasic;
+ var formatDate = calendar.formatDate;
+
+
+
+ function render(date, delta) {
+ if (delta) {
+ addMonths(date, delta);
+ date.setDate(1);
+ }
+ var start = cloneDate(date, true);
+ start.setDate(1);
+ var end = addMonths(cloneDate(start), 1);
+ var visStart = cloneDate(start);
+ var visEnd = cloneDate(end);
+ var firstDay = opt('firstDay');
+ var nwe = opt('weekends') ? 0 : 1;
+ if (nwe) {
+ skipWeekend(visStart);
+ skipWeekend(visEnd, -1, true);
+ }
+ addDays(visStart, -((visStart.getDay() - Math.max(firstDay, nwe) + 7) % 7));
+ addDays(visEnd, (7 - visEnd.getDay() + Math.max(firstDay, nwe)) % 7);
+ var rowCnt = Math.round((visEnd - visStart) / (DAY_MS * 7));
+ if (opt('weekMode') == 'fixed') {
+ addDays(visEnd, (6 - rowCnt) * 7);
+ rowCnt = 6;
+ }
+ t.title = formatDate(start, opt('titleFormat'));
+ t.start = start;
+ t.end = end;
+ t.visStart = visStart;
+ t.visEnd = visEnd;
+ renderBasic(6, rowCnt, nwe ? 5 : 7, true);
+ }
+
+
+}
+
+fcViews.basicWeek = BasicWeekView;
+
+function BasicWeekView(element, calendar) {
+ var t = this;
+
+
+ // exports
+ t.render = render;
+
+
+ // imports
+ BasicView.call(t, element, calendar, 'basicWeek');
+ var opt = t.opt;
+ var renderBasic = t.renderBasic;
+ var formatDates = calendar.formatDates;
+
+
+
+ function render(date, delta) {
+ if (delta) {
+ addDays(date, delta * 7);
+ }
+ var start = addDays(cloneDate(date), -((date.getDay() - opt('firstDay') + 7) % 7));
+ var end = addDays(cloneDate(start), 7);
+ var visStart = cloneDate(start);
+ var visEnd = cloneDate(end);
+ var weekends = opt('weekends');
+ if (!weekends) {
+ skipWeekend(visStart);
+ skipWeekend(visEnd, -1, true);
+ }
+ t.title = formatDates(
+ visStart,
+ addDays(cloneDate(visEnd), -1),
+ opt('titleFormat')
+ );
+ t.start = start;
+ t.end = end;
+ t.visStart = visStart;
+ t.visEnd = visEnd;
+ renderBasic(1, 1, weekends ? 7 : 5, false);
+ }
+
+
+}
+
+fcViews.basicDay = BasicDayView;
+
+//TODO: when calendar's date starts out on a weekend, shouldn't happen
+
+
+function BasicDayView(element, calendar) {
+ var t = this;
+
+
+ // exports
+ t.render = render;
+
+
+ // imports
+ BasicView.call(t, element, calendar, 'basicDay');
+ var opt = t.opt;
+ var renderBasic = t.renderBasic;
+ var formatDate = calendar.formatDate;
+
+
+
+ function render(date, delta) {
+ if (delta) {
+ addDays(date, delta);
+ if (!opt('weekends')) {
+ skipWeekend(date, delta < 0 ? -1 : 1);
+ }
+ }
+ t.title = formatDate(date, opt('titleFormat'));
+ t.start = t.visStart = cloneDate(date, true);
+ t.end = t.visEnd = addDays(cloneDate(t.start), 1);
+ renderBasic(1, 1, 1, false);
+ }
+
+
+}
+
+setDefaults({
+ weekMode: 'fixed'
+});
+
+
+function BasicView(element, calendar, viewName) {
+ var t = this;
+
+
+ // exports
+ t.renderBasic = renderBasic;
+ t.setHeight = setHeight;
+ t.setWidth = setWidth;
+ t.renderDayOverlay = renderDayOverlay;
+ t.defaultSelectionEnd = defaultSelectionEnd;
+ t.renderSelection = renderSelection;
+ t.clearSelection = clearSelection;
+ t.reportDayClick = reportDayClick; // for selection (kinda hacky)
+ t.dragStart = dragStart;
+ t.dragStop = dragStop;
+ t.defaultEventEnd = defaultEventEnd;
+ t.getHoverListener = function() { return hoverListener };
+ t.colContentLeft = colContentLeft;
+ t.colContentRight = colContentRight;
+ t.dayOfWeekCol = dayOfWeekCol;
+ t.dateCell = dateCell;
+ t.cellDate = cellDate;
+ t.cellIsAllDay = function() { return true };
+ t.allDayRow = allDayRow;
+ t.allDayBounds = allDayBounds;
+ t.getRowCnt = function() { return rowCnt };
+ t.getColCnt = function() { return colCnt };
+ t.getColWidth = function() { return colWidth };
+ t.getDaySegmentContainer = function() { return daySegmentContainer };
+
+
+ // imports
+ View.call(t, element, calendar, viewName);
+ OverlayManager.call(t);
+ SelectionManager.call(t);
+ BasicEventRenderer.call(t);
+ var opt = t.opt;
+ var trigger = t.trigger;
+ var clearEvents = t.clearEvents;
+ var renderOverlay = t.renderOverlay;
+ var clearOverlays = t.clearOverlays;
+ var daySelectionMousedown = t.daySelectionMousedown;
+ var formatDate = calendar.formatDate;
+
+
+ // locals
+
+ var head;
+ var headCells;
+ var body;
+ var bodyRows;
+ var bodyCells;
+ var bodyFirstCells;
+ var bodyCellTopInners;
+ var daySegmentContainer;
+
+ var viewWidth;
+ var viewHeight;
+ var colWidth;
+
+ var rowCnt, colCnt;
+ var coordinateGrid;
+ var hoverListener;
+ var colContentPositions;
+
+ var rtl, dis, dit;
+ var firstDay;
+ var nwe;
+ var tm;
+ var colFormat;
+
+
+
+ /* Rendering
+ ------------------------------------------------------------*/
+
+
+ disableTextSelection(element.addClass('fc-grid'));
+
+
+ function renderBasic(maxr, r, c, showNumbers) {
+ rowCnt = r;
+ colCnt = c;
+ updateOptions();
+ var firstTime = !body;
+ if (firstTime) {
+ buildSkeleton(maxr, showNumbers);
+ }else{
+ clearEvents();
+ }
+ updateCells(firstTime);
+ }
+
+
+
+ function updateOptions() {
+ rtl = opt('isRTL');
+ if (rtl) {
+ dis = -1;
+ dit = colCnt - 1;
+ }else{
+ dis = 1;
+ dit = 0;
+ }
+ firstDay = opt('firstDay');
+ nwe = opt('weekends') ? 0 : 1;
+ tm = opt('theme') ? 'ui' : 'fc';
+ colFormat = opt('columnFormat');
+ }
+
+
+
+ function buildSkeleton(maxRowCnt, showNumbers) {
+ var s;
+ var headerClass = tm + "-widget-header";
+ var contentClass = tm + "-widget-content";
+ var i, j;
+ var table;
+
+ s =
+ "<table class='fc-border-separate' style='width:100%' cellspacing='0'>" +
+ "<thead>" +
+ "<tr>";
+ for (i=0; i<colCnt; i++) {
+ s +=
+ "<th class='fc- " + headerClass + "'/>"; // need fc- for setDayID
+ }
+ s +=
+ "</tr>" +
+ "</thead>" +
+ "<tbody>";
+ for (i=0; i<maxRowCnt; i++) {
+ s +=
+ "<tr class='fc-week" + i + "'>";
+ for (j=0; j<colCnt; j++) {
+ s +=
+ "<td class='fc- " + contentClass + " fc-day" + (i*colCnt+j) + "'>" + // need fc- for setDayID
+ "<div>" +
+ (showNumbers ?
+ "<div class='fc-day-number'/>" :
+ ''
+ ) +
+ "<div class='fc-day-content'>" +
+ "<div style='position:relative'>&nbsp;</div>" +
+ "</div>" +
+ "</div>" +
+ "</td>";
+ }
+ s +=
+ "</tr>";
+ }
+ s +=
+ "</tbody>" +
+ "</table>";
+ table = $(s).appendTo(element);
+
+ head = table.find('thead');
+ headCells = head.find('th');
+ body = table.find('tbody');
+ bodyRows = body.find('tr');
+ bodyCells = body.find('td');
+ bodyFirstCells = bodyCells.filter(':first-child');
+ bodyCellTopInners = bodyRows.eq(0).find('div.fc-day-content div');
+
+ markFirstLast(head.add(head.find('tr'))); // marks first+last tr/th's
+ markFirstLast(bodyRows); // marks first+last td's
+ bodyRows.eq(0).addClass('fc-first'); // fc-last is done in updateCells
+
+ dayBind(bodyCells);
+
+ daySegmentContainer =
+ $("<div style='position:absolute;z-index:8;top:0;left:0'/>")
+ .appendTo(element);
+ }
+
+
+
+ function updateCells(firstTime) {
+ var dowDirty = firstTime || rowCnt == 1; // could the cells' day-of-weeks need updating?
+ var month = t.start.getMonth();
+ var today = clearTime(new Date());
+ var cell;
+ var date;
+ var row;
+
+ if (dowDirty) {
+ headCells.each(function(i, _cell) {
+ cell = $(_cell);
+ date = indexDate(i);
+ cell.html(formatDate(date, colFormat));
+ setDayID(cell, date);
+ });
+ }
+
+ bodyCells.each(function(i, _cell) {
+ cell = $(_cell);
+ date = indexDate(i);
+ if (date.getMonth() == month) {
+ cell.removeClass('fc-other-month');
+ }else{
+ cell.addClass('fc-other-month');
+ }
+ if (+date == +today) {
+ cell.addClass(tm + '-state-highlight fc-today');
+ }else{
+ cell.removeClass(tm + '-state-highlight fc-today');
+ }
+ cell.find('div.fc-day-number').text(date.getDate());
+ if (dowDirty) {
+ setDayID(cell, date);
+ }
+ });
+
+ bodyRows.each(function(i, _row) {
+ row = $(_row);
+ if (i < rowCnt) {
+ row.show();
+ if (i == rowCnt-1) {
+ row.addClass('fc-last');
+ }else{
+ row.removeClass('fc-last');
+ }
+ }else{
+ row.hide();
+ }
+ });
+ }
+
+
+
+ function setHeight(height) {
+ viewHeight = height;
+
+ var bodyHeight = viewHeight - head.height();
+ var rowHeight;
+ var rowHeightLast;
+ var cell;
+
+ if (opt('weekMode') == 'variable') {
+ rowHeight = rowHeightLast = Math.floor(bodyHeight / (rowCnt==1 ? 2 : 6));
+ }else{
+ rowHeight = Math.floor(bodyHeight / rowCnt);
+ rowHeightLast = bodyHeight - rowHeight * (rowCnt-1);
+ }
+
+ bodyFirstCells.each(function(i, _cell) {
+ if (i < rowCnt) {
+ cell = $(_cell);
+ setMinHeight(
+ cell.find('> div'),
+ (i==rowCnt-1 ? rowHeightLast : rowHeight) - vsides(cell)
+ );
+ }
+ });
+
+ }
+
+
+ function setWidth(width) {
+ viewWidth = width;
+ colContentPositions.clear();
+ colWidth = Math.floor(viewWidth / colCnt);
+ setOuterWidth(headCells.slice(0, -1), colWidth);
+ }
+
+
+
+ /* Day clicking and binding
+ -----------------------------------------------------------*/
+
+
+ function dayBind(days) {
+ days.click(dayClick)
+ .mousedown(daySelectionMousedown);
+ }
+
+
+ function dayClick(ev) {
+ if (!opt('selectable')) { // if selectable, SelectionManager will worry about dayClick
+ var index = parseInt(this.className.match(/fc\-day(\d+)/)[1]); // TODO: maybe use .data
+ var date = indexDate(index);
+ trigger('dayClick', this, date, true, ev);
+ }
+ }
+
+
+
+ /* Semi-transparent Overlay Helpers
+ ------------------------------------------------------*/
+
+
+ function renderDayOverlay(overlayStart, overlayEnd, refreshCoordinateGrid) { // overlayEnd is exclusive
+ if (refreshCoordinateGrid) {
+ coordinateGrid.build();
+ }
+ var rowStart = cloneDate(t.visStart);
+ var rowEnd = addDays(cloneDate(rowStart), colCnt);
+ for (var i=0; i<rowCnt; i++) {
+ var stretchStart = new Date(Math.max(rowStart, overlayStart));
+ var stretchEnd = new Date(Math.min(rowEnd, overlayEnd));
+ if (stretchStart < stretchEnd) {
+ var colStart, colEnd;
+ if (rtl) {
+ colStart = dayDiff(stretchEnd, rowStart)*dis+dit+1;
+ colEnd = dayDiff(stretchStart, rowStart)*dis+dit+1;
+ }else{
+ colStart = dayDiff(stretchStart, rowStart);
+ colEnd = dayDiff(stretchEnd, rowStart);
+ }
+ dayBind(
+ renderCellOverlay(i, colStart, i, colEnd-1)
+ );
+ }
+ addDays(rowStart, 7);
+ addDays(rowEnd, 7);
+ }
+ }
+
+
+ function renderCellOverlay(row0, col0, row1, col1) { // row1,col1 is inclusive
+ var rect = coordinateGrid.rect(row0, col0, row1, col1, element);
+ return renderOverlay(rect, element);
+ }
+
+
+
+ /* Selection
+ -----------------------------------------------------------------------*/
+
+
+ function defaultSelectionEnd(startDate, allDay) {
+ return cloneDate(startDate);
+ }
+
+
+ function renderSelection(startDate, endDate, allDay) {
+ renderDayOverlay(startDate, addDays(cloneDate(endDate), 1), true); // rebuild every time???
+ }
+
+
+ function clearSelection() {
+ clearOverlays();
+ }
+
+
+ function reportDayClick(date, allDay, ev) {
+ var cell = dateCell(date);
+ var _element = bodyCells[cell.row*colCnt + cell.col];
+ trigger('dayClick', _element, date, allDay, ev);
+ }
+
+
+
+ /* External Dragging
+ -----------------------------------------------------------------------*/
+
+
+ function dragStart(_dragElement, ev, ui) {
+ hoverListener.start(function(cell) {
+ clearOverlays();
+ if (cell) {
+ renderCellOverlay(cell.row, cell.col, cell.row, cell.col);
+ }
+ }, ev);
+ }
+
+
+ function dragStop(_dragElement, ev, ui) {
+ var cell = hoverListener.stop();
+ clearOverlays();
+ if (cell) {
+ var d = cellDate(cell);
+ trigger('drop', _dragElement, d, true, ev, ui);
+ }
+ }
+
+
+
+ /* Utilities
+ --------------------------------------------------------*/
+
+
+ function defaultEventEnd(event) {
+ return cloneDate(event.start);
+ }
+
+
+ coordinateGrid = new CoordinateGrid(function(rows, cols) {
+ var e, n, p;
+ headCells.each(function(i, _e) {
+ e = $(_e);
+ n = e.offset().left;
+ if (i) {
+ p[1] = n;
+ }
+ p = [n];
+ cols[i] = p;
+ });
+ p[1] = n + e.outerWidth();
+ bodyRows.each(function(i, _e) {
+ if (i < rowCnt) {
+ e = $(_e);
+ n = e.offset().top;
+ if (i) {
+ p[1] = n;
+ }
+ p = [n];
+ rows[i] = p;
+ }
+ });
+ p[1] = n + e.outerHeight();
+ });
+
+
+ hoverListener = new HoverListener(coordinateGrid);
+
+
+ colContentPositions = new HorizontalPositionCache(function(col) {
+ return bodyCellTopInners.eq(col);
+ });
+
+
+ function colContentLeft(col) {
+ return colContentPositions.left(col);
+ }
+
+
+ function colContentRight(col) {
+ return colContentPositions.right(col);
+ }
+
+
+
+
+ function dateCell(date) {
+ return {
+ row: Math.floor(dayDiff(date, t.visStart) / 7),
+ col: dayOfWeekCol(date.getDay())
+ };
+ }
+
+
+ function cellDate(cell) {
+ return _cellDate(cell.row, cell.col);
+ }
+
+
+ function _cellDate(row, col) {
+ return addDays(cloneDate(t.visStart), row*7 + col*dis+dit);
+ // what about weekends in middle of week?
+ }
+
+
+ function indexDate(index) {
+ return _cellDate(Math.floor(index/colCnt), index%colCnt);
+ }
+
+
+ function dayOfWeekCol(dayOfWeek) {
+ return ((dayOfWeek - Math.max(firstDay, nwe) + colCnt) % colCnt) * dis + dit;
+ }
+
+
+
+
+ function allDayRow(i) {
+ return bodyRows.eq(i);
+ }
+
+
+ function allDayBounds(i) {
+ return {
+ left: 0,
+ right: viewWidth
+ };
+ }
+
+
+}
+
+function BasicEventRenderer() {
+ var t = this;
+
+
+ // exports
+ t.renderEvents = renderEvents;
+ t.compileDaySegs = compileSegs; // for DayEventRenderer
+ t.clearEvents = clearEvents;
+ t.bindDaySeg = bindDaySeg;
+
+
+ // imports
+ DayEventRenderer.call(t);
+ var opt = t.opt;
+ var trigger = t.trigger;
+ //var setOverflowHidden = t.setOverflowHidden;
+ var isEventDraggable = t.isEventDraggable;
+ var isEventResizable = t.isEventResizable;
+ var reportEvents = t.reportEvents;
+ var reportEventClear = t.reportEventClear;
+ var eventElementHandlers = t.eventElementHandlers;
+ var showEvents = t.showEvents;
+ var hideEvents = t.hideEvents;
+ var eventDrop = t.eventDrop;
+ var getDaySegmentContainer = t.getDaySegmentContainer;
+ var getHoverListener = t.getHoverListener;
+ var renderDayOverlay = t.renderDayOverlay;
+ var clearOverlays = t.clearOverlays;
+ var getRowCnt = t.getRowCnt;
+ var getColCnt = t.getColCnt;
+ var renderDaySegs = t.renderDaySegs;
+ var resizableDayEvent = t.resizableDayEvent;
+
+
+
+ /* Rendering
+ --------------------------------------------------------------------*/
+
+
+ function renderEvents(events, modifiedEventId) {
+ reportEvents(events);
+ renderDaySegs(compileSegs(events), modifiedEventId);
+ }
+
+
+ function clearEvents() {
+ reportEventClear();
+ getDaySegmentContainer().empty();
+ }
+
+
+ function compileSegs(events) {
+ var rowCnt = getRowCnt(),
+ colCnt = getColCnt(),
+ d1 = cloneDate(t.visStart),
+ d2 = addDays(cloneDate(d1), colCnt),
+ visEventsEnds = $.map(events, exclEndDay),
+ i, row,
+ j, level,
+ k, seg,
+ segs=[];
+ for (i=0; i<rowCnt; i++) {
+ row = stackSegs(sliceSegs(events, visEventsEnds, d1, d2));
+ for (j=0; j<row.length; j++) {
+ level = row[j];
+ for (k=0; k<level.length; k++) {
+ seg = level[k];
+ seg.row = i;
+ seg.level = j; // not needed anymore
+ segs.push(seg);
+ }
+ }
+ addDays(d1, 7);
+ addDays(d2, 7);
+ }
+ return segs;
+ }
+
+
+ function bindDaySeg(event, eventElement, seg) {
+ if (isEventDraggable(event)) {
+ draggableDayEvent(event, eventElement);
+ }
+ if (seg.isEnd && isEventResizable(event)) {
+ resizableDayEvent(event, eventElement, seg);
+ }
+ eventElementHandlers(event, eventElement);
+ // needs to be after, because resizableDayEvent might stopImmediatePropagation on click
+ }
+
+
+
+ /* Dragging
+ ----------------------------------------------------------------------------*/
+
+
+ function draggableDayEvent(event, eventElement) {
+ var hoverListener = getHoverListener();
+ var dayDelta;
+ eventElement.draggable({
+ zIndex: 9,
+ delay: 50,
+ opacity: opt('dragOpacity'),
+ revertDuration: opt('dragRevertDuration'),
+ start: function(ev, ui) {
+ trigger('eventDragStart', eventElement, event, ev, ui);
+ hideEvents(event, eventElement);
+ hoverListener.start(function(cell, origCell, rowDelta, colDelta) {
+ eventElement.draggable('option', 'revert', !cell || !rowDelta && !colDelta);
+ clearOverlays();
+ if (cell) {
+ //setOverflowHidden(true);
+ dayDelta = rowDelta*7 + colDelta * (opt('isRTL') ? -1 : 1);
+ renderDayOverlay(
+ addDays(cloneDate(event.start), dayDelta),
+ addDays(exclEndDay(event), dayDelta)
+ );
+ }else{
+ //setOverflowHidden(false);
+ dayDelta = 0;
+ }
+ }, ev, 'drag');
+ },
+ stop: function(ev, ui) {
+ hoverListener.stop();
+ clearOverlays();
+ trigger('eventDragStop', eventElement, event, ev, ui);
+ if (dayDelta) {
+ eventDrop(this, event, dayDelta, 0, event.allDay, ev, ui);
+ }else{
+ eventElement.css('filter', ''); // clear IE opacity side-effects
+ showEvents(event, eventElement);
+ }
+ //setOverflowHidden(false);
+ }
+ });
+ }
+
+
+}
+
+fcViews.agendaWeek = AgendaWeekView;
+
+function AgendaWeekView(element, calendar) {
+ var t = this;
+
+
+ // exports
+ t.render = render;
+
+
+ // imports
+ AgendaView.call(t, element, calendar, 'agendaWeek');
+ var opt = t.opt;
+ var renderAgenda = t.renderAgenda;
+ var formatDates = calendar.formatDates;
+
+
+
+ function render(date, delta) {
+ if (delta) {
+ addDays(date, delta * 7);
+ }
+ var start = addDays(cloneDate(date), -((date.getDay() - opt('firstDay') + 7) % 7));
+ var end = addDays(cloneDate(start), 7);
+ var visStart = cloneDate(start);
+ var visEnd = cloneDate(end);
+ var weekends = opt('weekends');
+ if (!weekends) {
+ skipWeekend(visStart);
+ skipWeekend(visEnd, -1, true);
+ }
+ t.title = formatDates(
+ visStart,
+ addDays(cloneDate(visEnd), -1),
+ opt('titleFormat')
+ );
+ t.start = start;
+ t.end = end;
+ t.visStart = visStart;
+ t.visEnd = visEnd;
+ renderAgenda(weekends ? 7 : 5);
+ }
+
+
+}
+
+fcViews.agendaDay = AgendaDayView;
+
+function AgendaDayView(element, calendar) {
+ var t = this;
+
+
+ // exports
+ t.render = render;
+
+
+ // imports
+ AgendaView.call(t, element, calendar, 'agendaDay');
+ var opt = t.opt;
+ var renderAgenda = t.renderAgenda;
+ var formatDate = calendar.formatDate;
+
+
+
+ function render(date, delta) {
+ if (delta) {
+ addDays(date, delta);
+ if (!opt('weekends')) {
+ skipWeekend(date, delta < 0 ? -1 : 1);
+ }
+ }
+ var start = cloneDate(date, true);
+ var end = addDays(cloneDate(start), 1);
+ t.title = formatDate(date, opt('titleFormat'));
+ t.start = t.visStart = start;
+ t.end = t.visEnd = end;
+ renderAgenda(1);
+ }
+
+
+}
+
+setDefaults({
+ allDaySlot: true,
+ allDayText: 'all-day',
+ firstHour: 6,
+ slotMinutes: 30,
+ defaultEventMinutes: 120,
+ axisFormat: 'h(:mm)tt',
+ timeFormat: {
+ agenda: 'h:mm{ - h:mm}'
+ },
+ dragOpacity: {
+ agenda: .5
+ },
+ minTime: 0,
+ maxTime: 24
+});
+
+
+// TODO: make it work in quirks mode (event corners, all-day height)
+// TODO: test liquid width, especially in IE6
+
+
+function AgendaView(element, calendar, viewName) {
+ var t = this;
+
+
+ // exports
+ t.renderAgenda = renderAgenda;
+ t.setWidth = setWidth;
+ t.setHeight = setHeight;
+ t.beforeHide = beforeHide;
+ t.afterShow = afterShow;
+ t.defaultEventEnd = defaultEventEnd;
+ t.timePosition = timePosition;
+ t.dayOfWeekCol = dayOfWeekCol;
+ t.dateCell = dateCell;
+ t.cellDate = cellDate;
+ t.cellIsAllDay = cellIsAllDay;
+ t.allDayRow = getAllDayRow;
+ t.allDayBounds = allDayBounds;
+ t.getHoverListener = function() { return hoverListener };
+ t.colContentLeft = colContentLeft;
+ t.colContentRight = colContentRight;
+ t.getDaySegmentContainer = function() { return daySegmentContainer };
+ t.getSlotSegmentContainer = function() { return slotSegmentContainer };
+ t.getMinMinute = function() { return minMinute };
+ t.getMaxMinute = function() { return maxMinute };
+ t.getBodyContent = function() { return slotContent }; // !!??
+ t.getRowCnt = function() { return 1 };
+ t.getColCnt = function() { return colCnt };
+ t.getColWidth = function() { return colWidth };
+ t.getSlotHeight = function() { return slotHeight };
+ t.defaultSelectionEnd = defaultSelectionEnd;
+ t.renderDayOverlay = renderDayOverlay;
+ t.renderSelection = renderSelection;
+ t.clearSelection = clearSelection;
+ t.reportDayClick = reportDayClick; // selection mousedown hack
+ t.dragStart = dragStart;
+ t.dragStop = dragStop;
+
+
+ // imports
+ View.call(t, element, calendar, viewName);
+ OverlayManager.call(t);
+ SelectionManager.call(t);
+ AgendaEventRenderer.call(t);
+ var opt = t.opt;
+ var trigger = t.trigger;
+ var clearEvents = t.clearEvents;
+ var renderOverlay = t.renderOverlay;
+ var clearOverlays = t.clearOverlays;
+ var reportSelection = t.reportSelection;
+ var unselect = t.unselect;
+ var daySelectionMousedown = t.daySelectionMousedown;
+ var slotSegHtml = t.slotSegHtml;
+ var formatDate = calendar.formatDate;
+
+
+ // locals
+
+ var dayTable;
+ var dayHead;
+ var dayHeadCells;
+ var dayBody;
+ var dayBodyCells;
+ var dayBodyCellInners;
+ var dayBodyFirstCell;
+ var dayBodyFirstCellStretcher;
+ var slotLayer;
+ var daySegmentContainer;
+ var allDayTable;
+ var allDayRow;
+ var slotScroller;
+ var slotContent;
+ var slotSegmentContainer;
+ var slotTable;
+ var slotTableFirstInner;
+ var axisFirstCells;
+ var gutterCells;
+ var selectionHelper;
+
+ var viewWidth;
+ var viewHeight;
+ var axisWidth;
+ var colWidth;
+ var gutterWidth;
+ var slotHeight; // TODO: what if slotHeight changes? (see issue 650)
+ var savedScrollTop;
+
+ var colCnt;
+ var slotCnt;
+ var coordinateGrid;
+ var hoverListener;
+ var colContentPositions;
+ var slotTopCache = {};
+
+ var tm;
+ var firstDay;
+ var nwe; // no weekends (int)
+ var rtl, dis, dit; // day index sign / translate
+ var minMinute, maxMinute;
+ var colFormat;
+
+
+
+ /* Rendering
+ -----------------------------------------------------------------------------*/
+
+
+ disableTextSelection(element.addClass('fc-agenda'));
+
+
+ function renderAgenda(c) {
+ colCnt = c;
+ updateOptions();
+ if (!dayTable) {
+ buildSkeleton();
+ }else{
+ clearEvents();
+ }
+ updateCells();
+ }
+
+
+
+ function updateOptions() {
+ tm = opt('theme') ? 'ui' : 'fc';
+ nwe = opt('weekends') ? 0 : 1;
+ firstDay = opt('firstDay');
+ if (rtl = opt('isRTL')) {
+ dis = -1;
+ dit = colCnt - 1;
+ }else{
+ dis = 1;
+ dit = 0;
+ }
+ minMinute = parseTime(opt('minTime'));
+ maxMinute = parseTime(opt('maxTime'));
+ colFormat = opt('columnFormat');
+ }
+
+
+
+ function buildSkeleton() {
+ var headerClass = tm + "-widget-header";
+ var contentClass = tm + "-widget-content";
+ var s;
+ var i;
+ var d;
+ var maxd;
+ var minutes;
+ var slotNormal = opt('slotMinutes') % 15 == 0;
+
+ s =
+ "<table style='width:100%' class='fc-agenda-days fc-border-separate' cellspacing='0'>" +
+ "<thead>" +
+ "<tr>" +
+ "<th class='fc-agenda-axis " + headerClass + "'>&nbsp;</th>";
+ for (i=0; i<colCnt; i++) {
+ s +=
+ "<th class='fc- fc-col" + i + ' ' + headerClass + "'/>"; // fc- needed for setDayID
+ }
+ s +=
+ "<th class='fc-agenda-gutter " + headerClass + "'>&nbsp;</th>" +
+ "</tr>" +
+ "</thead>" +
+ "<tbody>" +
+ "<tr>" +
+ "<th class='fc-agenda-axis " + headerClass + "'>&nbsp;</th>";
+ for (i=0; i<colCnt; i++) {
+ s +=
+ "<td class='fc- fc-col" + i + ' ' + contentClass + "'>" + // fc- needed for setDayID
+ "<div>" +
+ "<div class='fc-day-content'>" +
+ "<div style='position:relative'>&nbsp;</div>" +
+ "</div>" +
+ "</div>" +
+ "</td>";
+ }
+ s +=
+ "<td class='fc-agenda-gutter " + contentClass + "'>&nbsp;</td>" +
+ "</tr>" +
+ "</tbody>" +
+ "</table>";
+ dayTable = $(s).appendTo(element);
+ dayHead = dayTable.find('thead');
+ dayHeadCells = dayHead.find('th').slice(1, -1);
+ dayBody = dayTable.find('tbody');
+ dayBodyCells = dayBody.find('td').slice(0, -1);
+ dayBodyCellInners = dayBodyCells.find('div.fc-day-content div');
+ dayBodyFirstCell = dayBodyCells.eq(0);
+ dayBodyFirstCellStretcher = dayBodyFirstCell.find('> div');
+
+ markFirstLast(dayHead.add(dayHead.find('tr')));
+ markFirstLast(dayBody.add(dayBody.find('tr')));
+
+ axisFirstCells = dayHead.find('th:first');
+ gutterCells = dayTable.find('.fc-agenda-gutter');
+
+ slotLayer =
+ $("<div style='position:absolute;z-index:2;left:0;width:100%'/>")
+ .appendTo(element);
+
+ if (opt('allDaySlot')) {
+
+ daySegmentContainer =
+ $("<div style='position:absolute;z-index:8;top:0;left:0'/>")
+ .appendTo(slotLayer);
+
+ s =
+ "<table style='width:100%' class='fc-agenda-allday' cellspacing='0'>" +
+ "<tr>" +
+ "<th class='" + headerClass + " fc-agenda-axis'>" + opt('allDayText') + "</th>" +
+ "<td>" +
+ "<div class='fc-day-content'><div style='position:relative'/></div>" +
+ "</td>" +
+ "<th class='" + headerClass + " fc-agenda-gutter'>&nbsp;</th>" +
+ "</tr>" +
+ "</table>";
+ allDayTable = $(s).appendTo(slotLayer);
+ allDayRow = allDayTable.find('tr');
+
+ dayBind(allDayRow.find('td'));
+
+ axisFirstCells = axisFirstCells.add(allDayTable.find('th:first'));
+ gutterCells = gutterCells.add(allDayTable.find('th.fc-agenda-gutter'));
+
+ slotLayer.append(
+ "<div class='fc-agenda-divider " + headerClass + "'>" +
+ "<div class='fc-agenda-divider-inner'/>" +
+ "</div>"
+ );
+
+ }else{
+
+ daySegmentContainer = $([]); // in jQuery 1.4, we can just do $()
+
+ }
+
+ slotScroller =
+ $("<div style='position:absolute;width:100%;overflow-x:hidden;overflow-y:auto'/>")
+ .appendTo(slotLayer);
+
+ slotContent =
+ $("<div style='position:relative;width:100%;overflow:hidden'/>")
+ .appendTo(slotScroller);
+
+ slotSegmentContainer =
+ $("<div style='position:absolute;z-index:8;top:0;left:0'/>")
+ .appendTo(slotContent);
+
+ s =
+ "<table class='fc-agenda-slots' style='width:100%' cellspacing='0'>" +
+ "<tbody>";
+ d = zeroDate();
+ maxd = addMinutes(cloneDate(d), maxMinute);
+ addMinutes(d, minMinute);
+ slotCnt = 0;
+ for (i=0; d < maxd; i++) {
+ minutes = d.getMinutes();
+ s +=
+ "<tr class='fc-slot" + i + ' ' + (!minutes ? '' : 'fc-minor') + "'>" +
+ "<th class='fc-agenda-axis " + headerClass + "'>" +
+ ((!slotNormal || !minutes) ? formatDate(d, opt('axisFormat')) : '&nbsp;') +
+ "</th>" +
+ "<td class='" + contentClass + "'>" +
+ "<div style='position:relative'>&nbsp;</div>" +
+ "</td>" +
+ "</tr>";
+ addMinutes(d, opt('slotMinutes'));
+ slotCnt++;
+ }
+ s +=
+ "</tbody>" +
+ "</table>";
+ slotTable = $(s).appendTo(slotContent);
+ slotTableFirstInner = slotTable.find('div:first');
+
+ slotBind(slotTable.find('td'));
+
+ axisFirstCells = axisFirstCells.add(slotTable.find('th:first'));
+ }
+
+
+
+ function updateCells() {
+ var i;
+ var headCell;
+ var bodyCell;
+ var date;
+ var today = clearTime(new Date());
+ for (i=0; i<colCnt; i++) {
+ date = colDate(i);
+ headCell = dayHeadCells.eq(i);
+ headCell.html(formatDate(date, colFormat));
+ bodyCell = dayBodyCells.eq(i);
+ if (+date == +today) {
+ bodyCell.addClass(tm + '-state-highlight fc-today');
+ }else{
+ bodyCell.removeClass(tm + '-state-highlight fc-today');
+ }
+ setDayID(headCell.add(bodyCell), date);
+ }
+ }
+
+
+
+ function setHeight(height, dateChanged) {
+ if (height === undefined) {
+ height = viewHeight;
+ }
+ viewHeight = height;
+ slotTopCache = {};
+
+ var headHeight = dayBody.position().top;
+ var allDayHeight = slotScroller.position().top; // including divider
+ var bodyHeight = Math.min( // total body height, including borders
+ height - headHeight, // when scrollbars
+ slotTable.height() + allDayHeight + 1 // when no scrollbars. +1 for bottom border
+ );
+
+ dayBodyFirstCellStretcher
+ .height(bodyHeight - vsides(dayBodyFirstCell));
+
+ slotLayer.css('top', headHeight);
+
+ slotScroller.height(bodyHeight - allDayHeight - 1);
+
+ slotHeight = slotTableFirstInner.height() + 1; // +1 for border
+
+ if (dateChanged) {
+ resetScroll();
+ }
+ }
+
+
+
+ function setWidth(width) {
+ viewWidth = width;
+ colContentPositions.clear();
+
+ axisWidth = 0;
+ setOuterWidth(
+ axisFirstCells
+ .width('')
+ .each(function(i, _cell) {
+ axisWidth = Math.max(axisWidth, $(_cell).outerWidth());
+ }),
+ axisWidth
+ );
+
+ var slotTableWidth = slotScroller[0].clientWidth; // needs to be done after axisWidth (for IE7)
+ //slotTable.width(slotTableWidth);
+
+ gutterWidth = slotScroller.width() - slotTableWidth;
+ if (gutterWidth) {
+ setOuterWidth(gutterCells, gutterWidth);
+ gutterCells
+ .show()
+ .prev()
+ .removeClass('fc-last');
+ }else{
+ gutterCells
+ .hide()
+ .prev()
+ .addClass('fc-last');
+ }
+
+ colWidth = Math.floor((slotTableWidth - axisWidth) / colCnt);
+ setOuterWidth(dayHeadCells.slice(0, -1), colWidth);
+ }
+
+
+
+ function resetScroll() {
+ var d0 = zeroDate();
+ var scrollDate = cloneDate(d0);
+ scrollDate.setHours(opt('firstHour'));
+ var top = timePosition(d0, scrollDate) + 1; // +1 for the border
+ function scroll() {
+ slotScroller.scrollTop(top);
+ }
+ scroll();
+ setTimeout(scroll, 0); // overrides any previous scroll state made by the browser
+ }
+
+
+ function beforeHide() {
+ savedScrollTop = slotScroller.scrollTop();
+ }
+
+
+ function afterShow() {
+ slotScroller.scrollTop(savedScrollTop);
+ }
+
+
+
+ /* Slot/Day clicking and binding
+ -----------------------------------------------------------------------*/
+
+
+ function dayBind(cells) {
+ cells.click(slotClick)
+ .mousedown(daySelectionMousedown);
+ }
+
+
+ function slotBind(cells) {
+ cells.click(slotClick)
+ .mousedown(slotSelectionMousedown);
+ }
+
+
+ function slotClick(ev) {
+ if (!opt('selectable')) { // if selectable, SelectionManager will worry about dayClick
+ var col = Math.min(colCnt-1, Math.floor((ev.pageX - dayTable.offset().left - axisWidth) / colWidth));
+ var date = colDate(col);
+ var rowMatch = this.parentNode.className.match(/fc-slot(\d+)/); // TODO: maybe use data
+ if (rowMatch) {
+ var mins = parseInt(rowMatch[1]) * opt('slotMinutes');
+ var hours = Math.floor(mins/60);
+ date.setHours(hours);
+ date.setMinutes(mins%60 + minMinute);
+ trigger('dayClick', dayBodyCells[col], date, false, ev);
+ }else{
+ trigger('dayClick', dayBodyCells[col], date, true, ev);
+ }
+ }
+ }
+
+
+
+ /* Semi-transparent Overlay Helpers
+ -----------------------------------------------------*/
+
+
+ function renderDayOverlay(startDate, endDate, refreshCoordinateGrid) { // endDate is exclusive
+ if (refreshCoordinateGrid) {
+ coordinateGrid.build();
+ }
+ var visStart = cloneDate(t.visStart);
+ var startCol, endCol;
+ if (rtl) {
+ startCol = dayDiff(endDate, visStart)*dis+dit+1;
+ endCol = dayDiff(startDate, visStart)*dis+dit+1;
+ }else{
+ startCol = dayDiff(startDate, visStart);
+ endCol = dayDiff(endDate, visStart);
+ }
+ startCol = Math.max(0, startCol);
+ endCol = Math.min(colCnt, endCol);
+ if (startCol < endCol) {
+ dayBind(
+ renderCellOverlay(0, startCol, 0, endCol-1)
+ );
+ }
+ }
+
+
+ function renderCellOverlay(row0, col0, row1, col1) { // only for all-day?
+ var rect = coordinateGrid.rect(row0, col0, row1, col1, slotLayer);
+ return renderOverlay(rect, slotLayer);
+ }
+
+
+ function renderSlotOverlay(overlayStart, overlayEnd) {
+ var dayStart = cloneDate(t.visStart);
+ var dayEnd = addDays(cloneDate(dayStart), 1);
+ for (var i=0; i<colCnt; i++) {
+ var stretchStart = new Date(Math.max(dayStart, overlayStart));
+ var stretchEnd = new Date(Math.min(dayEnd, overlayEnd));
+ if (stretchStart < stretchEnd) {
+ var col = i*dis+dit;
+ var rect = coordinateGrid.rect(0, col, 0, col, slotContent); // only use it for horizontal coords
+ var top = timePosition(dayStart, stretchStart);
+ var bottom = timePosition(dayStart, stretchEnd);
+ rect.top = top;
+ rect.height = bottom - top;
+ slotBind(
+ renderOverlay(rect, slotContent)
+ );
+ }
+ addDays(dayStart, 1);
+ addDays(dayEnd, 1);
+ }
+ }
+
+
+
+ /* Coordinate Utilities
+ -----------------------------------------------------------------------------*/
+
+
+ coordinateGrid = new CoordinateGrid(function(rows, cols) {
+ var e, n, p;
+ dayHeadCells.each(function(i, _e) {
+ e = $(_e);
+ n = e.offset().left;
+ if (i) {
+ p[1] = n;
+ }
+ p = [n];
+ cols[i] = p;
+ });
+ p[1] = n + e.outerWidth();
+ if (opt('allDaySlot')) {
+ e = allDayRow;
+ n = e.offset().top;
+ rows[0] = [n, n+e.outerHeight()];
+ }
+ var slotTableTop = slotContent.offset().top;
+ var slotScrollerTop = slotScroller.offset().top;
+ var slotScrollerBottom = slotScrollerTop + slotScroller.outerHeight();
+ function constrain(n) {
+ return Math.max(slotScrollerTop, Math.min(slotScrollerBottom, n));
+ }
+ for (var i=0; i<slotCnt; i++) {
+ rows.push([
+ constrain(slotTableTop + slotHeight*i),
+ constrain(slotTableTop + slotHeight*(i+1))
+ ]);
+ }
+ });
+
+
+ hoverListener = new HoverListener(coordinateGrid);
+
+
+ colContentPositions = new HorizontalPositionCache(function(col) {
+ return dayBodyCellInners.eq(col);
+ });
+
+
+ function colContentLeft(col) {
+ return colContentPositions.left(col);
+ }
+
+
+ function colContentRight(col) {
+ return colContentPositions.right(col);
+ }
+
+
+
+
+ function dateCell(date) { // "cell" terminology is now confusing
+ return {
+ row: Math.floor(dayDiff(date, t.visStart) / 7),
+ col: dayOfWeekCol(date.getDay())
+ };
+ }
+
+
+ function cellDate(cell) {
+ var d = colDate(cell.col);
+ var slotIndex = cell.row;
+ if (opt('allDaySlot')) {
+ slotIndex--;
+ }
+ if (slotIndex >= 0) {
+ addMinutes(d, minMinute + slotIndex * opt('slotMinutes'));
+ }
+ return d;
+ }
+
+
+ function colDate(col) { // returns dates with 00:00:00
+ return addDays(cloneDate(t.visStart), col*dis+dit);
+ }
+
+
+ function cellIsAllDay(cell) {
+ return opt('allDaySlot') && !cell.row;
+ }
+
+
+ function dayOfWeekCol(dayOfWeek) {
+ return ((dayOfWeek - Math.max(firstDay, nwe) + colCnt) % colCnt)*dis+dit;
+ }
+
+
+
+
+ // get the Y coordinate of the given time on the given day (both Date objects)
+ function timePosition(day, time) { // both date objects. day holds 00:00 of current day
+ day = cloneDate(day, true);
+ if (time < addMinutes(cloneDate(day), minMinute)) {
+ return 0;
+ }
+ if (time >= addMinutes(cloneDate(day), maxMinute)) {
+ return slotTable.height();
+ }
+ var slotMinutes = opt('slotMinutes'),
+ minutes = time.getHours()*60 + time.getMinutes() - minMinute,
+ slotI = Math.floor(minutes / slotMinutes),
+ slotTop = slotTopCache[slotI];
+ if (slotTop === undefined) {
+ slotTop = slotTopCache[slotI] = slotTable.find('tr:eq(' + slotI + ') td div')[0].offsetTop; //.position().top; // need this optimization???
+ }
+ return Math.max(0, Math.round(
+ slotTop - 1 + slotHeight * ((minutes % slotMinutes) / slotMinutes)
+ ));
+ }
+
+
+ function allDayBounds() {
+ return {
+ left: axisWidth,
+ right: viewWidth - gutterWidth
+ }
+ }
+
+
+ function getAllDayRow(index) {
+ return allDayRow;
+ }
+
+
+ function defaultEventEnd(event) {
+ var start = cloneDate(event.start);
+ if (event.allDay) {
+ return start;
+ }
+ return addMinutes(start, opt('defaultEventMinutes'));
+ }
+
+
+
+ /* Selection
+ ---------------------------------------------------------------------------------*/
+
+
+ function defaultSelectionEnd(startDate, allDay) {
+ if (allDay) {
+ return cloneDate(startDate);
+ }
+ return addMinutes(cloneDate(startDate), opt('slotMinutes'));
+ }
+
+
+ function renderSelection(startDate, endDate, allDay) { // only for all-day
+ if (allDay) {
+ if (opt('allDaySlot')) {
+ renderDayOverlay(startDate, addDays(cloneDate(endDate), 1), true);
+ }
+ }else{
+ renderSlotSelection(startDate, endDate);
+ }
+ }
+
+
+ function renderSlotSelection(startDate, endDate) {
+ var helperOption = opt('selectHelper');
+ coordinateGrid.build();
+ if (helperOption) {
+ var col = dayDiff(startDate, t.visStart) * dis + dit;
+ if (col >= 0 && col < colCnt) { // only works when times are on same day
+ var rect = coordinateGrid.rect(0, col, 0, col, slotContent); // only for horizontal coords
+ var top = timePosition(startDate, startDate);
+ var bottom = timePosition(startDate, endDate);
+ if (bottom > top) { // protect against selections that are entirely before or after visible range
+ rect.top = top;
+ rect.height = bottom - top;
+ rect.left += 2;
+ rect.width -= 5;
+ if ($.isFunction(helperOption)) {
+ var helperRes = helperOption(startDate, endDate);
+ if (helperRes) {
+ rect.position = 'absolute';
+ rect.zIndex = 8;
+ selectionHelper = $(helperRes)
+ .css(rect)
+ .appendTo(slotContent);
+ }
+ }else{
+ rect.isStart = true; // conside rect a "seg" now
+ rect.isEnd = true; //
+ selectionHelper = $(slotSegHtml(
+ {
+ title: '',
+ start: startDate,
+ end: endDate,
+ className: ['fc-select-helper'],
+ editable: false
+ },
+ rect
+ ));
+ selectionHelper.css('opacity', opt('dragOpacity'));
+ }
+ if (selectionHelper) {
+ slotBind(selectionHelper);
+ slotContent.append(selectionHelper);
+ setOuterWidth(selectionHelper, rect.width, true); // needs to be after appended
+ setOuterHeight(selectionHelper, rect.height, true);
+ }
+ }
+ }
+ }else{
+ renderSlotOverlay(startDate, endDate);
+ }
+ }
+
+
+ function clearSelection() {
+ clearOverlays();
+ if (selectionHelper) {
+ selectionHelper.remove();
+ selectionHelper = null;
+ }
+ }
+
+
+ function slotSelectionMousedown(ev) {
+ if (ev.which == 1 && opt('selectable')) { // ev.which==1 means left mouse button
+ unselect(ev);
+ var dates;
+ hoverListener.start(function(cell, origCell) {
+ clearSelection();
+ if (cell && cell.col == origCell.col && !cellIsAllDay(cell)) {
+ var d1 = cellDate(origCell);
+ var d2 = cellDate(cell);
+ dates = [
+ d1,
+ addMinutes(cloneDate(d1), opt('slotMinutes')),
+ d2,
+ addMinutes(cloneDate(d2), opt('slotMinutes'))
+ ].sort(cmp);
+ renderSlotSelection(dates[0], dates[3]);
+ }else{
+ dates = null;
+ }
+ }, ev);
+ $(document).one('mouseup', function(ev) {
+ hoverListener.stop();
+ if (dates) {
+ if (+dates[0] == +dates[1]) {
+ reportDayClick(dates[0], false, ev);
+ }
+ reportSelection(dates[0], dates[3], false, ev);
+ }
+ });
+ }
+ }
+
+
+ function reportDayClick(date, allDay, ev) {
+ trigger('dayClick', dayBodyCells[dayOfWeekCol(date.getDay())], date, allDay, ev);
+ }
+
+
+
+ /* External Dragging
+ --------------------------------------------------------------------------------*/
+
+
+ function dragStart(_dragElement, ev, ui) {
+ hoverListener.start(function(cell) {
+ clearOverlays();
+ if (cell) {
+ if (cellIsAllDay(cell)) {
+ renderCellOverlay(cell.row, cell.col, cell.row, cell.col);
+ }else{
+ var d1 = cellDate(cell);
+ var d2 = addMinutes(cloneDate(d1), opt('defaultEventMinutes'));
+ renderSlotOverlay(d1, d2);
+ }
+ }
+ }, ev);
+ }
+
+
+ function dragStop(_dragElement, ev, ui) {
+ var cell = hoverListener.stop();
+ clearOverlays();
+ if (cell) {
+ trigger('drop', _dragElement, cellDate(cell), cellIsAllDay(cell), ev, ui);
+ }
+ }
+
+
+}
+
+function AgendaEventRenderer() {
+ var t = this;
+
+
+ // exports
+ t.renderEvents = renderEvents;
+ t.compileDaySegs = compileDaySegs; // for DayEventRenderer
+ t.clearEvents = clearEvents;
+ t.slotSegHtml = slotSegHtml;
+ t.bindDaySeg = bindDaySeg;
+
+
+ // imports
+ DayEventRenderer.call(t);
+ var opt = t.opt;
+ var trigger = t.trigger;
+ //var setOverflowHidden = t.setOverflowHidden;
+ var isEventDraggable = t.isEventDraggable;
+ var isEventResizable = t.isEventResizable;
+ var eventEnd = t.eventEnd;
+ var reportEvents = t.reportEvents;
+ var reportEventClear = t.reportEventClear;
+ var eventElementHandlers = t.eventElementHandlers;
+ var setHeight = t.setHeight;
+ var getDaySegmentContainer = t.getDaySegmentContainer;
+ var getSlotSegmentContainer = t.getSlotSegmentContainer;
+ var getHoverListener = t.getHoverListener;
+ var getMaxMinute = t.getMaxMinute;
+ var getMinMinute = t.getMinMinute;
+ var timePosition = t.timePosition;
+ var colContentLeft = t.colContentLeft;
+ var colContentRight = t.colContentRight;
+ var renderDaySegs = t.renderDaySegs;
+ var resizableDayEvent = t.resizableDayEvent; // TODO: streamline binding architecture
+ var getColCnt = t.getColCnt;
+ var getColWidth = t.getColWidth;
+ var getSlotHeight = t.getSlotHeight;
+ var getBodyContent = t.getBodyContent;
+ var reportEventElement = t.reportEventElement;
+ var showEvents = t.showEvents;
+ var hideEvents = t.hideEvents;
+ var eventDrop = t.eventDrop;
+ var eventResize = t.eventResize;
+ var renderDayOverlay = t.renderDayOverlay;
+ var clearOverlays = t.clearOverlays;
+ var calendar = t.calendar;
+ var formatDate = calendar.formatDate;
+ var formatDates = calendar.formatDates;
+
+
+
+ /* Rendering
+ ----------------------------------------------------------------------------*/
+
+
+ function renderEvents(events, modifiedEventId) {
+ reportEvents(events);
+ var i, len=events.length,
+ dayEvents=[],
+ slotEvents=[];
+ for (i=0; i<len; i++) {
+ if (events[i].allDay) {
+ dayEvents.push(events[i]);
+ }else{
+ slotEvents.push(events[i]);
+ }
+ }
+ if (opt('allDaySlot')) {
+ renderDaySegs(compileDaySegs(dayEvents), modifiedEventId);
+ setHeight(); // no params means set to viewHeight
+ }
+ renderSlotSegs(compileSlotSegs(slotEvents), modifiedEventId);
+ }
+
+
+ function clearEvents() {
+ reportEventClear();
+ getDaySegmentContainer().empty();
+ getSlotSegmentContainer().empty();
+ }
+
+
+ function compileDaySegs(events) {
+ var levels = stackSegs(sliceSegs(events, $.map(events, exclEndDay), t.visStart, t.visEnd)),
+ i, levelCnt=levels.length, level,
+ j, seg,
+ segs=[];
+ for (i=0; i<levelCnt; i++) {
+ level = levels[i];
+ for (j=0; j<level.length; j++) {
+ seg = level[j];
+ seg.row = 0;
+ seg.level = i; // not needed anymore
+ segs.push(seg);
+ }
+ }
+ return segs;
+ }
+
+
+ function compileSlotSegs(events) {
+ var colCnt = getColCnt(),
+ minMinute = getMinMinute(),
+ maxMinute = getMaxMinute(),
+ d = addMinutes(cloneDate(t.visStart), minMinute),
+ visEventEnds = $.map(events, slotEventEnd),
+ i, col,
+ j, level,
+ k, seg,
+ segs=[];
+ for (i=0; i<colCnt; i++) {
+ col = stackSegs(sliceSegs(events, visEventEnds, d, addMinutes(cloneDate(d), maxMinute-minMinute)));
+ countForwardSegs(col);
+ for (j=0; j<col.length; j++) {
+ level = col[j];
+ for (k=0; k<level.length; k++) {
+ seg = level[k];
+ seg.col = i;
+ seg.level = j;
+ segs.push(seg);
+ }
+ }
+ addDays(d, 1, true);
+ }
+ return segs;
+ }
+
+
+ function slotEventEnd(event) {
+ if (event.end) {
+ return cloneDate(event.end);
+ }else{
+ return addMinutes(cloneDate(event.start), opt('defaultEventMinutes'));
+ }
+ }
+
+
+ // renders events in the 'time slots' at the bottom
+
+ function renderSlotSegs(segs, modifiedEventId) {
+
+ var i, segCnt=segs.length, seg,
+ event,
+ classes,
+ top, bottom,
+ colI, levelI, forward,
+ leftmost,
+ availWidth,
+ outerWidth,
+ left,
+ html='',
+ eventElements,
+ eventElement,
+ triggerRes,
+ vsideCache={},
+ hsideCache={},
+ key, val,
+ contentElement,
+ height,
+ slotSegmentContainer = getSlotSegmentContainer(),
+ rtl, dis, dit,
+ colCnt = getColCnt();
+
+ if (rtl = opt('isRTL')) {
+ dis = -1;
+ dit = colCnt - 1;
+ }else{
+ dis = 1;
+ dit = 0;
+ }
+
+ // calculate position/dimensions, create html
+ for (i=0; i<segCnt; i++) {
+ seg = segs[i];
+ event = seg.event;
+ top = timePosition(seg.start, seg.start);
+ bottom = timePosition(seg.start, seg.end);
+ colI = seg.col;
+ levelI = seg.level;
+ forward = seg.forward || 0;
+ leftmost = colContentLeft(colI*dis + dit);
+ availWidth = colContentRight(colI*dis + dit) - leftmost;
+ availWidth = Math.min(availWidth-6, availWidth*.95); // TODO: move this to CSS
+ if (levelI) {
+ // indented and thin
+ outerWidth = availWidth / (levelI + forward + 1);
+ }else{
+ if (forward) {
+ // moderately wide, aligned left still
+ outerWidth = ((availWidth / (forward + 1)) - (12/2)) * 2; // 12 is the predicted width of resizer =
+ }else{
+ // can be entire width, aligned left
+ outerWidth = availWidth;
+ }
+ }
+ left = leftmost + // leftmost possible
+ (availWidth / (levelI + forward + 1) * levelI) // indentation
+ * dis + (rtl ? availWidth - outerWidth : 0); // rtl
+ seg.top = top;
+ seg.left = left;
+ seg.outerWidth = outerWidth;
+ seg.outerHeight = bottom - top;
+ html += slotSegHtml(event, seg);
+ }
+ slotSegmentContainer[0].innerHTML = html; // faster than html()
+ eventElements = slotSegmentContainer.children();
+
+ // retrieve elements, run through eventRender callback, bind event handlers
+ for (i=0; i<segCnt; i++) {
+ seg = segs[i];
+ event = seg.event;
+ eventElement = $(eventElements[i]); // faster than eq()
+ triggerRes = trigger('eventRender', event, event, eventElement);
+ if (triggerRes === false) {
+ eventElement.remove();
+ }else{
+ if (triggerRes && triggerRes !== true) {
+ eventElement.remove();
+ eventElement = $(triggerRes)
+ .css({
+ position: 'absolute',
+ top: seg.top,
+ left: seg.left
+ })
+ .appendTo(slotSegmentContainer);
+ }
+ seg.element = eventElement;
+ if (event._id === modifiedEventId) {
+ bindSlotSeg(event, eventElement, seg);
+ }else{
+ eventElement[0]._fci = i; // for lazySegBind
+ }
+ reportEventElement(event, eventElement);
+ }
+ }
+
+ lazySegBind(slotSegmentContainer, segs, bindSlotSeg);
+
+ // record event sides and title positions
+ for (i=0; i<segCnt; i++) {
+ seg = segs[i];
+ if (eventElement = seg.element) {
+ val = vsideCache[key = seg.key = cssKey(eventElement[0])];
+ seg.vsides = val === undefined ? (vsideCache[key] = vsides(eventElement, true)) : val;
+ val = hsideCache[key];
+ seg.hsides = val === undefined ? (hsideCache[key] = hsides(eventElement, true)) : val;
+ contentElement = eventElement.find('div.fc-event-content');
+ if (contentElement.length) {
+ seg.contentTop = contentElement[0].offsetTop;
+ }
+ }
+ }
+
+ // set all positions/dimensions at once
+ for (i=0; i<segCnt; i++) {
+ seg = segs[i];
+ if (eventElement = seg.element) {
+ eventElement[0].style.width = Math.max(0, seg.outerWidth - seg.hsides) + 'px';
+ height = Math.max(0, seg.outerHeight - seg.vsides);
+ eventElement[0].style.height = height + 'px';
+ event = seg.event;
+ if (seg.contentTop !== undefined && height - seg.contentTop < 10) {
+ // not enough room for title, put it in the time header
+ eventElement.find('div.fc-event-time')
+ .text(formatDate(event.start, opt('timeFormat')) + ' - ' + event.title);
+ eventElement.find('div.fc-event-title')
+ .remove();
+ }
+ trigger('eventAfterRender', event, event, eventElement);
+ }
+ }
+
+ }
+
+
+ function slotSegHtml(event, seg) {
+ var html = "<";
+ var url = event.url;
+ var skinCss = getSkinCss(event, opt);
+ var skinCssAttr = (skinCss ? " style='" + skinCss + "'" : '');
+ var classes = ['fc-event', 'fc-event-skin', 'fc-event-vert'];
+ if (isEventDraggable(event)) {
+ classes.push('fc-event-draggable');
+ }
+ if (seg.isStart) {
+ classes.push('fc-corner-top');
+ }
+ if (seg.isEnd) {
+ classes.push('fc-corner-bottom');
+ }
+ classes = classes.concat(event.className);
+ if (event.source) {
+ classes = classes.concat(event.source.className || []);
+ }
+ if (url) {
+ html += "a href='" + htmlEscape(event.url) + "'";
+ }else{
+ html += "div";
+ }
+ html +=
+ " class='" + classes.join(' ') + "'" +
+ " style='position:absolute;z-index:8;top:" + seg.top + "px;left:" + seg.left + "px;" + skinCss + "'" +
+ ">" +
+ "<div class='fc-event-inner fc-event-skin'" + skinCssAttr + ">" +
+ "<div class='fc-event-head fc-event-skin'" + skinCssAttr + ">" +
+ "<div class='fc-event-time'>" +
+ htmlEscape(formatDates(event.start, event.end, opt('timeFormat'))) +
+ "</div>" +
+ "</div>" +
+ "<div class='fc-event-content'>" +
+ "<div class='fc-event-title'>" +
+ htmlEscape(event.title) +
+ "</div>" +
+ "</div>" +
+ "<div class='fc-event-bg'></div>" +
+ "</div>"; // close inner
+ if (seg.isEnd && isEventResizable(event)) {
+ html +=
+ "<div class='ui-resizable-handle ui-resizable-s'>=</div>";
+ }
+ html +=
+ "</" + (url ? "a" : "div") + ">";
+ return html;
+ }
+
+
+ function bindDaySeg(event, eventElement, seg) {
+ if (isEventDraggable(event)) {
+ draggableDayEvent(event, eventElement, seg.isStart);
+ }
+ if (seg.isEnd && isEventResizable(event)) {
+ resizableDayEvent(event, eventElement, seg);
+ }
+ eventElementHandlers(event, eventElement);
+ // needs to be after, because resizableDayEvent might stopImmediatePropagation on click
+ }
+
+
+ function bindSlotSeg(event, eventElement, seg) {
+ var timeElement = eventElement.find('div.fc-event-time');
+ if (isEventDraggable(event)) {
+ draggableSlotEvent(event, eventElement, timeElement);
+ }
+ if (seg.isEnd && isEventResizable(event)) {
+ resizableSlotEvent(event, eventElement, timeElement);
+ }
+ eventElementHandlers(event, eventElement);
+ }
+
+
+
+ /* Dragging
+ -----------------------------------------------------------------------------------*/
+
+
+ // when event starts out FULL-DAY
+
+ function draggableDayEvent(event, eventElement, isStart) {
+ var origWidth;
+ var revert;
+ var allDay=true;
+ var dayDelta;
+ var dis = opt('isRTL') ? -1 : 1;
+ var hoverListener = getHoverListener();
+ var colWidth = getColWidth();
+ var slotHeight = getSlotHeight();
+ var minMinute = getMinMinute();
+ eventElement.draggable({
+ zIndex: 9,
+ opacity: opt('dragOpacity', 'month'), // use whatever the month view was using
+ revertDuration: opt('dragRevertDuration'),
+ start: function(ev, ui) {
+ trigger('eventDragStart', eventElement, event, ev, ui);
+ hideEvents(event, eventElement);
+ origWidth = eventElement.width();
+ hoverListener.start(function(cell, origCell, rowDelta, colDelta) {
+ clearOverlays();
+ if (cell) {
+ //setOverflowHidden(true);
+ revert = false;
+ dayDelta = colDelta * dis;
+ if (!cell.row) {
+ // on full-days
+ renderDayOverlay(
+ addDays(cloneDate(event.start), dayDelta),
+ addDays(exclEndDay(event), dayDelta)
+ );
+ resetElement();
+ }else{
+ // mouse is over bottom slots
+ if (isStart) {
+ if (allDay) {
+ // convert event to temporary slot-event
+ eventElement.width(colWidth - 10); // don't use entire width
+ setOuterHeight(
+ eventElement,
+ slotHeight * Math.round(
+ (event.end ? ((event.end - event.start) / MINUTE_MS) : opt('defaultEventMinutes'))
+ / opt('slotMinutes')
+ )
+ );
+ eventElement.draggable('option', 'grid', [colWidth, 1]);
+ allDay = false;
+ }
+ }else{
+ revert = true;
+ }
+ }
+ revert = revert || (allDay && !dayDelta);
+ }else{
+ resetElement();
+ //setOverflowHidden(false);
+ revert = true;
+ }
+ eventElement.draggable('option', 'revert', revert);
+ }, ev, 'drag');
+ },
+ stop: function(ev, ui) {
+ hoverListener.stop();
+ clearOverlays();
+ trigger('eventDragStop', eventElement, event, ev, ui);
+ if (revert) {
+ // hasn't moved or is out of bounds (draggable has already reverted)
+ resetElement();
+ eventElement.css('filter', ''); // clear IE opacity side-effects
+ showEvents(event, eventElement);
+ }else{
+ // changed!
+ var minuteDelta = 0;
+ if (!allDay) {
+ minuteDelta = Math.round((eventElement.offset().top - getBodyContent().offset().top) / slotHeight)
+ * opt('slotMinutes')
+ + minMinute
+ - (event.start.getHours() * 60 + event.start.getMinutes());
+ }
+ eventDrop(this, event, dayDelta, minuteDelta, allDay, ev, ui);
+ }
+ //setOverflowHidden(false);
+ }
+ });
+ function resetElement() {
+ if (!allDay) {
+ eventElement
+ .width(origWidth)
+ .height('')
+ .draggable('option', 'grid', null);
+ allDay = true;
+ }
+ }
+ }
+
+
+ // when event starts out IN TIMESLOTS
+
+ function draggableSlotEvent(event, eventElement, timeElement) {
+ var origPosition;
+ var allDay=false;
+ var dayDelta;
+ var minuteDelta;
+ var prevMinuteDelta;
+ var dis = opt('isRTL') ? -1 : 1;
+ var hoverListener = getHoverListener();
+ var colCnt = getColCnt();
+ var colWidth = getColWidth();
+ var slotHeight = getSlotHeight();
+ eventElement.draggable({
+ zIndex: 9,
+ scroll: false,
+ grid: [colWidth, slotHeight],
+ axis: colCnt==1 ? 'y' : false,
+ opacity: opt('dragOpacity'),
+ revertDuration: opt('dragRevertDuration'),
+ start: function(ev, ui) {
+ trigger('eventDragStart', eventElement, event, ev, ui);
+ hideEvents(event, eventElement);
+ origPosition = eventElement.position();
+ minuteDelta = prevMinuteDelta = 0;
+ hoverListener.start(function(cell, origCell, rowDelta, colDelta) {
+ eventElement.draggable('option', 'revert', !cell);
+ clearOverlays();
+ if (cell) {
+ dayDelta = colDelta * dis;
+ if (opt('allDaySlot') && !cell.row) {
+ // over full days
+ if (!allDay) {
+ // convert to temporary all-day event
+ allDay = true;
+ timeElement.hide();
+ eventElement.draggable('option', 'grid', null);
+ }
+ renderDayOverlay(
+ addDays(cloneDate(event.start), dayDelta),
+ addDays(exclEndDay(event), dayDelta)
+ );
+ }else{
+ // on slots
+ resetElement();
+ }
+ }
+ }, ev, 'drag');
+ },
+ drag: function(ev, ui) {
+ minuteDelta = Math.round((ui.position.top - origPosition.top) / slotHeight) * opt('slotMinutes');
+ if (minuteDelta != prevMinuteDelta) {
+ if (!allDay) {
+ updateTimeText(minuteDelta);
+ }
+ prevMinuteDelta = minuteDelta;
+ }
+ },
+ stop: function(ev, ui) {
+ var cell = hoverListener.stop();
+ clearOverlays();
+ trigger('eventDragStop', eventElement, event, ev, ui);
+ if (cell && (dayDelta || minuteDelta || allDay)) {
+ // changed!
+ eventDrop(this, event, dayDelta, allDay ? 0 : minuteDelta, allDay, ev, ui);
+ }else{
+ // either no change or out-of-bounds (draggable has already reverted)
+ resetElement();
+ eventElement.css('filter', ''); // clear IE opacity side-effects
+ eventElement.css(origPosition); // sometimes fast drags make event revert to wrong position
+ updateTimeText(0);
+ showEvents(event, eventElement);
+ }
+ }
+ });
+ function updateTimeText(minuteDelta) {
+ var newStart = addMinutes(cloneDate(event.start), minuteDelta);
+ var newEnd;
+ if (event.end) {
+ newEnd = addMinutes(cloneDate(event.end), minuteDelta);
+ }
+ timeElement.text(formatDates(newStart, newEnd, opt('timeFormat')));
+ }
+ function resetElement() {
+ // convert back to original slot-event
+ if (allDay) {
+ timeElement.css('display', ''); // show() was causing display=inline
+ eventElement.draggable('option', 'grid', [colWidth, slotHeight]);
+ allDay = false;
+ }
+ }
+ }
+
+
+
+ /* Resizing
+ --------------------------------------------------------------------------------------*/
+
+
+ function resizableSlotEvent(event, eventElement, timeElement) {
+ var slotDelta, prevSlotDelta;
+ var slotHeight = getSlotHeight();
+ eventElement.resizable({
+ handles: {
+ s: 'div.ui-resizable-s'
+ },
+ grid: slotHeight,
+ start: function(ev, ui) {
+ slotDelta = prevSlotDelta = 0;
+ hideEvents(event, eventElement);
+ eventElement.css('z-index', 9);
+ trigger('eventResizeStart', this, event, ev, ui);
+ },
+ resize: function(ev, ui) {
+ // don't rely on ui.size.height, doesn't take grid into account
+ slotDelta = Math.round((Math.max(slotHeight, eventElement.height()) - ui.originalSize.height) / slotHeight);
+ if (slotDelta != prevSlotDelta) {
+ timeElement.text(
+ formatDates(
+ event.start,
+ (!slotDelta && !event.end) ? null : // no change, so don't display time range
+ addMinutes(eventEnd(event), opt('slotMinutes')*slotDelta),
+ opt('timeFormat')
+ )
+ );
+ prevSlotDelta = slotDelta;
+ }
+ },
+ stop: function(ev, ui) {
+ trigger('eventResizeStop', this, event, ev, ui);
+ if (slotDelta) {
+ eventResize(this, event, 0, opt('slotMinutes')*slotDelta, ev, ui);
+ }else{
+ eventElement.css('z-index', 8);
+ showEvents(event, eventElement);
+ // BUG: if event was really short, need to put title back in span
+ }
+ }
+ });
+ }
+
+
+}
+
+
+function countForwardSegs(levels) {
+ var i, j, k, level, segForward, segBack;
+ for (i=levels.length-1; i>0; i--) {
+ level = levels[i];
+ for (j=0; j<level.length; j++) {
+ segForward = level[j];
+ for (k=0; k<levels[i-1].length; k++) {
+ segBack = levels[i-1][k];
+ if (segsCollide(segForward, segBack)) {
+ segBack.forward = Math.max(segBack.forward||0, (segForward.forward||0)+1);
+ }
+ }
+ }
+ }
+}
+
+
+
+
+function View(element, calendar, viewName) {
+ var t = this;
+
+
+ // exports
+ t.element = element;
+ t.calendar = calendar;
+ t.name = viewName;
+ t.opt = opt;
+ t.trigger = trigger;
+ //t.setOverflowHidden = setOverflowHidden;
+ t.isEventDraggable = isEventDraggable;
+ t.isEventResizable = isEventResizable;
+ t.reportEvents = reportEvents;
+ t.eventEnd = eventEnd;
+ t.reportEventElement = reportEventElement;
+ t.reportEventClear = reportEventClear;
+ t.eventElementHandlers = eventElementHandlers;
+ t.showEvents = showEvents;
+ t.hideEvents = hideEvents;
+ t.eventDrop = eventDrop;
+ t.eventResize = eventResize;
+ // t.title
+ // t.start, t.end
+ // t.visStart, t.visEnd
+
+
+ // imports
+ var defaultEventEnd = t.defaultEventEnd;
+ var normalizeEvent = calendar.normalizeEvent; // in EventManager
+ var reportEventChange = calendar.reportEventChange;
+
+
+ // locals
+ var eventsByID = {};
+ var eventElements = [];
+ var eventElementsByID = {};
+ var options = calendar.options;
+
+
+
+ function opt(name, viewNameOverride) {
+ var v = options[name];
+ if (typeof v == 'object') {
+ return smartProperty(v, viewNameOverride || viewName);
+ }
+ return v;
+ }
+
+
+ function trigger(name, thisObj) {
+ return calendar.trigger.apply(
+ calendar,
+ [name, thisObj || t].concat(Array.prototype.slice.call(arguments, 2), [t])
+ );
+ }
+
+
+ /*
+ function setOverflowHidden(bool) {
+ element.css('overflow', bool ? 'hidden' : '');
+ }
+ */
+
+
+ function isEventDraggable(event) {
+ return isEventEditable(event) && !opt('disableDragging');
+ }
+
+
+ function isEventResizable(event) { // but also need to make sure the seg.isEnd == true
+ return isEventEditable(event) && !opt('disableResizing');
+ }
+
+
+ function isEventEditable(event) {
+ return firstDefined(event.editable, (event.source || {}).editable, opt('editable'));
+ }
+
+
+
+ /* Event Data
+ ------------------------------------------------------------------------------*/
+
+
+ // report when view receives new events
+ function reportEvents(events) { // events are already normalized at this point
+ eventsByID = {};
+ var i, len=events.length, event;
+ for (i=0; i<len; i++) {
+ event = events[i];
+ if (eventsByID[event._id]) {
+ eventsByID[event._id].push(event);
+ }else{
+ eventsByID[event._id] = [event];
+ }
+ }
+ }
+
+
+ // returns a Date object for an event's end
+ function eventEnd(event) {
+ return event.end ? cloneDate(event.end) : defaultEventEnd(event);
+ }
+
+
+
+ /* Event Elements
+ ------------------------------------------------------------------------------*/
+
+
+ // report when view creates an element for an event
+ function reportEventElement(event, element) {
+ eventElements.push(element);
+ if (eventElementsByID[event._id]) {
+ eventElementsByID[event._id].push(element);
+ }else{
+ eventElementsByID[event._id] = [element];
+ }
+ }
+
+
+ function reportEventClear() {
+ eventElements = [];
+ eventElementsByID = {};
+ }
+
+
+ // attaches eventClick, eventMouseover, eventMouseout
+ function eventElementHandlers(event, eventElement) {
+ eventElement
+ .click(function(ev) {
+ if (!eventElement.hasClass('ui-draggable-dragging') &&
+ !eventElement.hasClass('ui-resizable-resizing')) {
+ return trigger('eventClick', this, event, ev);
+ }
+ })
+ .hover(
+ function(ev) {
+ trigger('eventMouseover', this, event, ev);
+ },
+ function(ev) {
+ trigger('eventMouseout', this, event, ev);
+ }
+ );
+ // TODO: don't fire eventMouseover/eventMouseout *while* dragging is occuring (on subject element)
+ // TODO: same for resizing
+ }
+
+
+ function showEvents(event, exceptElement) {
+ eachEventElement(event, exceptElement, 'show');
+ }
+
+
+ function hideEvents(event, exceptElement) {
+ eachEventElement(event, exceptElement, 'hide');
+ }
+
+
+ function eachEventElement(event, exceptElement, funcName) {
+ var elements = eventElementsByID[event._id],
+ i, len = elements.length;
+ for (i=0; i<len; i++) {
+ if (!exceptElement || elements[i][0] != exceptElement[0]) {
+ elements[i][funcName]();
+ }
+ }
+ }
+
+
+
+ /* Event Modification Reporting
+ ---------------------------------------------------------------------------------*/
+
+
+ function eventDrop(e, event, dayDelta, minuteDelta, allDay, ev, ui) {
+ var oldAllDay = event.allDay;
+ var eventId = event._id;
+ moveEvents(eventsByID[eventId], dayDelta, minuteDelta, allDay);
+ trigger(
+ 'eventDrop',
+ e,
+ event,
+ dayDelta,
+ minuteDelta,
+ allDay,
+ function() {
+ // TODO: investigate cases where this inverse technique might not work
+ moveEvents(eventsByID[eventId], -dayDelta, -minuteDelta, oldAllDay);
+ reportEventChange(eventId);
+ },
+ ev,
+ ui
+ );
+ reportEventChange(eventId);
+ }
+
+
+ function eventResize(e, event, dayDelta, minuteDelta, ev, ui) {
+ var eventId = event._id;
+ elongateEvents(eventsByID[eventId], dayDelta, minuteDelta);
+ trigger(
+ 'eventResize',
+ e,
+ event,
+ dayDelta,
+ minuteDelta,
+ function() {
+ // TODO: investigate cases where this inverse technique might not work
+ elongateEvents(eventsByID[eventId], -dayDelta, -minuteDelta);
+ reportEventChange(eventId);
+ },
+ ev,
+ ui
+ );
+ reportEventChange(eventId);
+ }
+
+
+
+ /* Event Modification Math
+ ---------------------------------------------------------------------------------*/
+
+
+ function moveEvents(events, dayDelta, minuteDelta, allDay) {
+ minuteDelta = minuteDelta || 0;
+ for (var e, len=events.length, i=0; i<len; i++) {
+ e = events[i];
+ if (allDay !== undefined) {
+ e.allDay = allDay;
+ }
+ addMinutes(addDays(e.start, dayDelta, true), minuteDelta);
+ if (e.end) {
+ e.end = addMinutes(addDays(e.end, dayDelta, true), minuteDelta);
+ }
+ normalizeEvent(e, options);
+ }
+ }
+
+
+ function elongateEvents(events, dayDelta, minuteDelta) {
+ minuteDelta = minuteDelta || 0;
+ for (var e, len=events.length, i=0; i<len; i++) {
+ e = events[i];
+ e.end = addMinutes(addDays(eventEnd(e), dayDelta, true), minuteDelta);
+ normalizeEvent(e, options);
+ }
+ }
+
+
+}
+
+function DayEventRenderer() {
+ var t = this;
+
+
+ // exports
+ t.renderDaySegs = renderDaySegs;
+ t.resizableDayEvent = resizableDayEvent;
+
+
+ // imports
+ var opt = t.opt;
+ var trigger = t.trigger;
+ var isEventDraggable = t.isEventDraggable;
+ var isEventResizable = t.isEventResizable;
+ var eventEnd = t.eventEnd;
+ var reportEventElement = t.reportEventElement;
+ var showEvents = t.showEvents;
+ var hideEvents = t.hideEvents;
+ var eventResize = t.eventResize;
+ var getRowCnt = t.getRowCnt;
+ var getColCnt = t.getColCnt;
+ var getColWidth = t.getColWidth;
+ var allDayRow = t.allDayRow;
+ var allDayBounds = t.allDayBounds;
+ var colContentLeft = t.colContentLeft;
+ var colContentRight = t.colContentRight;
+ var dayOfWeekCol = t.dayOfWeekCol;
+ var dateCell = t.dateCell;
+ var compileDaySegs = t.compileDaySegs;
+ var getDaySegmentContainer = t.getDaySegmentContainer;
+ var bindDaySeg = t.bindDaySeg; //TODO: streamline this
+ var formatDates = t.calendar.formatDates;
+ var renderDayOverlay = t.renderDayOverlay;
+ var clearOverlays = t.clearOverlays;
+ var clearSelection = t.clearSelection;
+
+
+
+ /* Rendering
+ -----------------------------------------------------------------------------*/
+
+
+ function renderDaySegs(segs, modifiedEventId) {
+ var segmentContainer = getDaySegmentContainer();
+ var rowDivs;
+ var rowCnt = getRowCnt();
+ var colCnt = getColCnt();
+ var i = 0;
+ var rowI;
+ var levelI;
+ var colHeights;
+ var j;
+ var segCnt = segs.length;
+ var seg;
+ var top;
+ var k;
+ segmentContainer[0].innerHTML = daySegHTML(segs); // faster than .html()
+ daySegElementResolve(segs, segmentContainer.children());
+ daySegElementReport(segs);
+ daySegHandlers(segs, segmentContainer, modifiedEventId);
+ daySegCalcHSides(segs);
+ daySegSetWidths(segs);
+ daySegCalcHeights(segs);
+ rowDivs = getRowDivs();
+ // set row heights, calculate event tops (in relation to row top)
+ for (rowI=0; rowI<rowCnt; rowI++) {
+ levelI = 0;
+ colHeights = [];
+ for (j=0; j<colCnt; j++) {
+ colHeights[j] = 0;
+ }
+ while (i<segCnt && (seg = segs[i]).row == rowI) {
+ // loop through segs in a row
+ top = arrayMax(colHeights.slice(seg.startCol, seg.endCol));
+ seg.top = top;
+ top += seg.outerHeight;
+ for (k=seg.startCol; k<seg.endCol; k++) {
+ colHeights[k] = top;
+ }
+ i++;
+ }
+ rowDivs[rowI].height(arrayMax(colHeights));
+ }
+ daySegSetTops(segs, getRowTops(rowDivs));
+ }
+
+
+ function renderTempDaySegs(segs, adjustRow, adjustTop) {
+ var tempContainer = $("<div/>");
+ var elements;
+ var segmentContainer = getDaySegmentContainer();
+ var i;
+ var segCnt = segs.length;
+ var element;
+ tempContainer[0].innerHTML = daySegHTML(segs); // faster than .html()
+ elements = tempContainer.children();
+ segmentContainer.append(elements);
+ daySegElementResolve(segs, elements);
+ daySegCalcHSides(segs);
+ daySegSetWidths(segs);
+ daySegCalcHeights(segs);
+ daySegSetTops(segs, getRowTops(getRowDivs()));
+ elements = [];
+ for (i=0; i<segCnt; i++) {
+ element = segs[i].element;
+ if (element) {
+ if (segs[i].row === adjustRow) {
+ element.css('top', adjustTop);
+ }
+ elements.push(element[0]);
+ }
+ }
+ return $(elements);
+ }
+
+
+ function daySegHTML(segs) { // also sets seg.left and seg.outerWidth
+ var rtl = opt('isRTL');
+ var i;
+ var segCnt=segs.length;
+ var seg;
+ var event;
+ var url;
+ var classes;
+ var bounds = allDayBounds();
+ var minLeft = bounds.left;
+ var maxLeft = bounds.right;
+ var leftCol;
+ var rightCol;
+ var left;
+ var right;
+ var skinCss;
+ var html = '';
+ // calculate desired position/dimensions, create html
+ for (i=0; i<segCnt; i++) {
+ seg = segs[i];
+ event = seg.event;
+ classes = ['fc-event', 'fc-event-skin', 'fc-event-hori'];
+ if (isEventDraggable(event)) {
+ classes.push('fc-event-draggable');
+ }
+ if (rtl) {
+ if (seg.isStart) {
+ classes.push('fc-corner-right');
+ }
+ if (seg.isEnd) {
+ classes.push('fc-corner-left');
+ }
+ leftCol = dayOfWeekCol(seg.end.getDay()-1);
+ rightCol = dayOfWeekCol(seg.start.getDay());
+ left = seg.isEnd ? colContentLeft(leftCol) : minLeft;
+ right = seg.isStart ? colContentRight(rightCol) : maxLeft;
+ }else{
+ if (seg.isStart) {
+ classes.push('fc-corner-left');
+ }
+ if (seg.isEnd) {
+ classes.push('fc-corner-right');
+ }
+ leftCol = dayOfWeekCol(seg.start.getDay());
+ rightCol = dayOfWeekCol(seg.end.getDay()-1);
+ left = seg.isStart ? colContentLeft(leftCol) : minLeft;
+ right = seg.isEnd ? colContentRight(rightCol) : maxLeft;
+ }
+ classes = classes.concat(event.className);
+ if (event.source) {
+ classes = classes.concat(event.source.className || []);
+ }
+ url = event.url;
+ skinCss = getSkinCss(event, opt);
+ if (url) {
+ html += "<a href='" + htmlEscape(url) + "'";
+ }else{
+ html += "<div";
+ }
+ html +=
+ " class='" + classes.join(' ') + "'" +
+ " style='position:absolute;z-index:8;left:"+left+"px;" + skinCss + "'" +
+ ">" +
+ "<div" +
+ " class='fc-event-inner fc-event-skin'" +
+ (skinCss ? " style='" + skinCss + "'" : '') +
+ ">";
+ if (!event.allDay && seg.isStart) {
+ html +=
+ "<span class='fc-event-time'>" +
+ htmlEscape(formatDates(event.start, event.end, opt('timeFormat'))) +
+ "</span>";
+ }
+ html +=
+ "<span class='fc-event-title'>" + htmlEscape(event.title) + "</span>" +
+ "</div>";
+ if (seg.isEnd && isEventResizable(event)) {
+ html +=
+ "<div class='ui-resizable-handle ui-resizable-" + (rtl ? 'w' : 'e') + "'>" +
+ "&nbsp;&nbsp;&nbsp;" + // makes hit area a lot better for IE6/7
+ "</div>";
+ }
+ html +=
+ "</" + (url ? "a" : "div" ) + ">";
+ seg.left = left;
+ seg.outerWidth = right - left;
+ seg.startCol = leftCol;
+ seg.endCol = rightCol + 1; // needs to be exclusive
+ }
+ return html;
+ }
+
+
+ function daySegElementResolve(segs, elements) { // sets seg.element
+ var i;
+ var segCnt = segs.length;
+ var seg;
+ var event;
+ var element;
+ var triggerRes;
+ for (i=0; i<segCnt; i++) {
+ seg = segs[i];
+ event = seg.event;
+ element = $(elements[i]); // faster than .eq()
+ triggerRes = trigger('eventRender', event, event, element);
+ if (triggerRes === false) {
+ element.remove();
+ }else{
+ if (triggerRes && triggerRes !== true) {
+ triggerRes = $(triggerRes)
+ .css({
+ position: 'absolute',
+ left: seg.left
+ });
+ element.replaceWith(triggerRes);
+ element = triggerRes;
+ }
+ seg.element = element;
+ }
+ }
+ }
+
+
+ function daySegElementReport(segs) {
+ var i;
+ var segCnt = segs.length;
+ var seg;
+ var element;
+ for (i=0; i<segCnt; i++) {
+ seg = segs[i];
+ element = seg.element;
+ if (element) {
+ reportEventElement(seg.event, element);
+ }
+ }
+ }
+
+
+ function daySegHandlers(segs, segmentContainer, modifiedEventId) {
+ var i;
+ var segCnt = segs.length;
+ var seg;
+ var element;
+ var event;
+ // retrieve elements, run through eventRender callback, bind handlers
+ for (i=0; i<segCnt; i++) {
+ seg = segs[i];
+ element = seg.element;
+ if (element) {
+ event = seg.event;
+ if (event._id === modifiedEventId) {
+ bindDaySeg(event, element, seg);
+ }else{
+ element[0]._fci = i; // for lazySegBind
+ }
+ }
+ }
+ lazySegBind(segmentContainer, segs, bindDaySeg);
+ }
+
+
+ function daySegCalcHSides(segs) { // also sets seg.key
+ var i;
+ var segCnt = segs.length;
+ var seg;
+ var element;
+ var key, val;
+ var hsideCache = {};
+ // record event horizontal sides
+ for (i=0; i<segCnt; i++) {
+ seg = segs[i];
+ element = seg.element;
+ if (element) {
+ key = seg.key = cssKey(element[0]);
+ val = hsideCache[key];
+ if (val === undefined) {
+ val = hsideCache[key] = hsides(element, true);
+ }
+ seg.hsides = val;
+ }
+ }
+ }
+
+
+ function daySegSetWidths(segs) {
+ var i;
+ var segCnt = segs.length;
+ var seg;
+ var element;
+ for (i=0; i<segCnt; i++) {
+ seg = segs[i];
+ element = seg.element;
+ if (element) {
+ element[0].style.width = Math.max(0, seg.outerWidth - seg.hsides) + 'px';
+ }
+ }
+ }
+
+
+ function daySegCalcHeights(segs) {
+ var i;
+ var segCnt = segs.length;
+ var seg;
+ var element;
+ var key, val;
+ var vmarginCache = {};
+ // record event heights
+ for (i=0; i<segCnt; i++) {
+ seg = segs[i];
+ element = seg.element;
+ if (element) {
+ key = seg.key; // created in daySegCalcHSides
+ val = vmarginCache[key];
+ if (val === undefined) {
+ val = vmarginCache[key] = vmargins(element);
+ }
+ seg.outerHeight = element[0].offsetHeight + val;
+ }
+ }
+ }
+
+
+ function getRowDivs() {
+ var i;
+ var rowCnt = getRowCnt();
+ var rowDivs = [];
+ for (i=0; i<rowCnt; i++) {
+ rowDivs[i] = allDayRow(i)
+ .find('td:first div.fc-day-content > div'); // optimal selector?
+ }
+ return rowDivs;
+ }
+
+
+ function getRowTops(rowDivs) {
+ var i;
+ var rowCnt = rowDivs.length;
+ var tops = [];
+ for (i=0; i<rowCnt; i++) {
+ tops[i] = rowDivs[i][0].offsetTop; // !!?? but this means the element needs position:relative if in a table cell!!!!
+ }
+ return tops;
+ }
+
+
+ function daySegSetTops(segs, rowTops) { // also triggers eventAfterRender
+ var i;
+ var segCnt = segs.length;
+ var seg;
+ var element;
+ var event;
+ for (i=0; i<segCnt; i++) {
+ seg = segs[i];
+ element = seg.element;
+ if (element) {
+ element[0].style.top = rowTops[seg.row] + (seg.top||0) + 'px';
+ event = seg.event;
+ trigger('eventAfterRender', event, event, element);
+ }
+ }
+ }
+
+
+
+ /* Resizing
+ -----------------------------------------------------------------------------------*/
+
+
+ function resizableDayEvent(event, element, seg) {
+ var rtl = opt('isRTL');
+ var direction = rtl ? 'w' : 'e';
+ var handle = element.find('div.ui-resizable-' + direction);
+ var isResizing = false;
+
+ // TODO: look into using jquery-ui mouse widget for this stuff
+ disableTextSelection(element); // prevent native <a> selection for IE
+ element
+ .mousedown(function(ev) { // prevent native <a> selection for others
+ ev.preventDefault();
+ })
+ .click(function(ev) {
+ if (isResizing) {
+ ev.preventDefault(); // prevent link from being visited (only method that worked in IE6)
+ ev.stopImmediatePropagation(); // prevent fullcalendar eventClick handler from being called
+ // (eventElementHandlers needs to be bound after resizableDayEvent)
+ }
+ });
+
+ handle.mousedown(function(ev) {
+ if (ev.which != 1) {
+ return; // needs to be left mouse button
+ }
+ isResizing = true;
+ var hoverListener = t.getHoverListener();
+ var rowCnt = getRowCnt();
+ var colCnt = getColCnt();
+ var dis = rtl ? -1 : 1;
+ var dit = rtl ? colCnt-1 : 0;
+ var elementTop = element.css('top');
+ var dayDelta;
+ var helpers;
+ var eventCopy = $.extend({}, event);
+ var minCell = dateCell(event.start);
+ clearSelection();
+ $('body')
+ .css('cursor', direction + '-resize')
+ .one('mouseup', mouseup);
+ trigger('eventResizeStart', this, event, ev);
+ hoverListener.start(function(cell, origCell) {
+ if (cell) {
+ var r = Math.max(minCell.row, cell.row);
+ var c = cell.col;
+ if (rowCnt == 1) {
+ r = 0; // hack for all-day area in agenda views
+ }
+ if (r == minCell.row) {
+ if (rtl) {
+ c = Math.min(minCell.col, c);
+ }else{
+ c = Math.max(minCell.col, c);
+ }
+ }
+ dayDelta = (r*7 + c*dis+dit) - (origCell.row*7 + origCell.col*dis+dit);
+ var newEnd = addDays(eventEnd(event), dayDelta, true);
+ if (dayDelta) {
+ eventCopy.end = newEnd;
+ var oldHelpers = helpers;
+ helpers = renderTempDaySegs(compileDaySegs([eventCopy]), seg.row, elementTop);
+ helpers.find('*').css('cursor', direction + '-resize');
+ if (oldHelpers) {
+ oldHelpers.remove();
+ }
+ hideEvents(event);
+ }else{
+ if (helpers) {
+ showEvents(event);
+ helpers.remove();
+ helpers = null;
+ }
+ }
+ clearOverlays();
+ renderDayOverlay(event.start, addDays(cloneDate(newEnd), 1)); // coordinate grid already rebuild at hoverListener.start
+ }
+ }, ev);
+
+ function mouseup(ev) {
+ trigger('eventResizeStop', this, event, ev);
+ $('body').css('cursor', '');
+ hoverListener.stop();
+ clearOverlays();
+ if (dayDelta) {
+ eventResize(this, event, dayDelta, 0, ev);
+ // event redraw will clear helpers
+ }
+ // otherwise, the drag handler already restored the old events
+
+ setTimeout(function() { // make this happen after the element's click event
+ isResizing = false;
+ },0);
+ }
+
+ });
+ }
+
+
+}
+
+//BUG: unselect needs to be triggered when events are dragged+dropped
+
+function SelectionManager() {
+ var t = this;
+
+
+ // exports
+ t.select = select;
+ t.unselect = unselect;
+ t.reportSelection = reportSelection;
+ t.daySelectionMousedown = daySelectionMousedown;
+
+
+ // imports
+ var opt = t.opt;
+ var trigger = t.trigger;
+ var defaultSelectionEnd = t.defaultSelectionEnd;
+ var renderSelection = t.renderSelection;
+ var clearSelection = t.clearSelection;
+
+
+ // locals
+ var selected = false;
+
+
+
+ // unselectAuto
+ if (opt('selectable') && opt('unselectAuto')) {
+ $(document).mousedown(function(ev) {
+ var ignore = opt('unselectCancel');
+ if (ignore) {
+ if ($(ev.target).parents(ignore).length) { // could be optimized to stop after first match
+ return;
+ }
+ }
+ unselect(ev);
+ });
+ }
+
+
+ function select(startDate, endDate, allDay) {
+ unselect();
+ if (!endDate) {
+ endDate = defaultSelectionEnd(startDate, allDay);
+ }
+ renderSelection(startDate, endDate, allDay);
+ reportSelection(startDate, endDate, allDay);
+ }
+
+
+ function unselect(ev) {
+ if (selected) {
+ selected = false;
+ clearSelection();
+ trigger('unselect', null, ev);
+ }
+ }
+
+
+ function reportSelection(startDate, endDate, allDay, ev) {
+ selected = true;
+ trigger('select', null, startDate, endDate, allDay, ev);
+ }
+
+
+ function daySelectionMousedown(ev) { // not really a generic manager method, oh well
+ var cellDate = t.cellDate;
+ var cellIsAllDay = t.cellIsAllDay;
+ var hoverListener = t.getHoverListener();
+ var reportDayClick = t.reportDayClick; // this is hacky and sort of weird
+ if (ev.which == 1 && opt('selectable')) { // which==1 means left mouse button
+ unselect(ev);
+ var _mousedownElement = this;
+ var dates;
+ hoverListener.start(function(cell, origCell) { // TODO: maybe put cellDate/cellIsAllDay info in cell
+ clearSelection();
+ if (cell && cellIsAllDay(cell)) {
+ dates = [ cellDate(origCell), cellDate(cell) ].sort(cmp);
+ renderSelection(dates[0], dates[1], true);
+ }else{
+ dates = null;
+ }
+ }, ev);
+ $(document).one('mouseup', function(ev) {
+ hoverListener.stop();
+ if (dates) {
+ if (+dates[0] == +dates[1]) {
+ reportDayClick(dates[0], true, ev);
+ }
+ reportSelection(dates[0], dates[1], true, ev);
+ }
+ });
+ }
+ }
+
+
+}
+
+function OverlayManager() {
+ var t = this;
+
+
+ // exports
+ t.renderOverlay = renderOverlay;
+ t.clearOverlays = clearOverlays;
+
+
+ // locals
+ var usedOverlays = [];
+ var unusedOverlays = [];
+
+
+ function renderOverlay(rect, parent) {
+ var e = unusedOverlays.shift();
+ if (!e) {
+ e = $("<div class='fc-cell-overlay' style='position:absolute;z-index:3'/>");
+ }
+ if (e[0].parentNode != parent[0]) {
+ e.appendTo(parent);
+ }
+ usedOverlays.push(e.css(rect).show());
+ return e;
+ }
+
+
+ function clearOverlays() {
+ var e;
+ while (e = usedOverlays.shift()) {
+ unusedOverlays.push(e.hide().unbind());
+ }
+ }
+
+
+}
+
+function CoordinateGrid(buildFunc) {
+
+ var t = this;
+ var rows;
+ var cols;
+
+
+ t.build = function() {
+ rows = [];
+ cols = [];
+ buildFunc(rows, cols);
+ };
+
+
+ t.cell = function(x, y) {
+ var rowCnt = rows.length;
+ var colCnt = cols.length;
+ var i, r=-1, c=-1;
+ for (i=0; i<rowCnt; i++) {
+ if (y >= rows[i][0] && y < rows[i][1]) {
+ r = i;
+ break;
+ }
+ }
+ for (i=0; i<colCnt; i++) {
+ if (x >= cols[i][0] && x < cols[i][1]) {
+ c = i;
+ break;
+ }
+ }
+ return (r>=0 && c>=0) ? { row:r, col:c } : null;
+ };
+
+
+ t.rect = function(row0, col0, row1, col1, originElement) { // row1,col1 is inclusive
+ var origin = originElement.offset();
+ return {
+ top: rows[row0][0] - origin.top,
+ left: cols[col0][0] - origin.left,
+ width: cols[col1][1] - cols[col0][0],
+ height: rows[row1][1] - rows[row0][0]
+ };
+ };
+
+}
+
+function HoverListener(coordinateGrid) {
+
+
+ var t = this;
+ var bindType;
+ var change;
+ var firstCell;
+ var cell;
+
+
+ t.start = function(_change, ev, _bindType) {
+ change = _change;
+ firstCell = cell = null;
+ coordinateGrid.build();
+ mouse(ev);
+ bindType = _bindType || 'mousemove';
+ $(document).bind(bindType, mouse);
+ };
+
+
+ function mouse(ev) {
+ _fixUIEvent(ev); // see below
+ var newCell = coordinateGrid.cell(ev.pageX, ev.pageY);
+ if (!newCell != !cell || newCell && (newCell.row != cell.row || newCell.col != cell.col)) {
+ if (newCell) {
+ if (!firstCell) {
+ firstCell = newCell;
+ }
+ change(newCell, firstCell, newCell.row-firstCell.row, newCell.col-firstCell.col);
+ }else{
+ change(newCell, firstCell);
+ }
+ cell = newCell;
+ }
+ }
+
+
+ t.stop = function() {
+ $(document).unbind(bindType, mouse);
+ return cell;
+ };
+
+
+}
+
+
+
+// this fix was only necessary for jQuery UI 1.8.16 (and jQuery 1.7 or 1.7.1)
+// upgrading to jQuery UI 1.8.17 (and using either jQuery 1.7 or 1.7.1) fixed the problem
+// but keep this in here for 1.8.16 users
+// and maybe remove it down the line
+
+function _fixUIEvent(event) { // for issue 1168
+ if (event.pageX === undefined) {
+ event.pageX = event.originalEvent.pageX;
+ event.pageY = event.originalEvent.pageY;
+ }
+}
+function HorizontalPositionCache(getElement) {
+
+ var t = this,
+ elements = {},
+ lefts = {},
+ rights = {};
+
+ function e(i) {
+ return elements[i] = elements[i] || getElement(i);
+ }
+
+ t.left = function(i) {
+ return lefts[i] = lefts[i] === undefined ? e(i).position().left : lefts[i];
+ };
+
+ t.right = function(i) {
+ return rights[i] = rights[i] === undefined ? t.left(i) + e(i).width() : rights[i];
+ };
+
+ t.clear = function() {
+ elements = {};
+ lefts = {};
+ rights = {};
+ };
+
+}
+
+})(jQuery);
diff --git a/library/fullcalendar/fullcalendar.min.js b/library/fullcalendar/fullcalendar.min.js
new file mode 100644
index 000000000..df37bdfd8
--- /dev/null
+++ b/library/fullcalendar/fullcalendar.min.js
@@ -0,0 +1,114 @@
+/*
+
+ FullCalendar v1.5.3
+ http://arshaw.com/fullcalendar/
+
+ Use fullcalendar.css for basic styling.
+ For event drag & drop, requires jQuery UI draggable.
+ For event resizing, requires jQuery UI resizable.
+
+ Copyright (c) 2011 Adam Shaw
+ Dual licensed under the MIT and GPL licenses, located in
+ MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
+
+ Date: Mon Feb 6 22:40:40 2012 -0800
+
+*/
+(function(m,ma){function wb(a){m.extend(true,Ya,a)}function Yb(a,b,e){function d(k){if(E){u();q();na();S(k)}else f()}function f(){B=b.theme?"ui":"fc";a.addClass("fc");b.isRTL&&a.addClass("fc-rtl");b.theme&&a.addClass("ui-widget");E=m("<div class='fc-content' style='position:relative'/>").prependTo(a);C=new Zb(X,b);(P=C.render())&&a.prepend(P);y(b.defaultView);m(window).resize(oa);t()||g()}function g(){setTimeout(function(){!n.start&&t()&&S()},0)}function l(){m(window).unbind("resize",oa);C.destroy();
+E.remove();a.removeClass("fc fc-rtl ui-widget")}function j(){return i.offsetWidth!==0}function t(){return m("body")[0].offsetWidth!==0}function y(k){if(!n||k!=n.name){F++;pa();var D=n,Z;if(D){(D.beforeHide||xb)();Za(E,E.height());D.element.hide()}else Za(E,1);E.css("overflow","hidden");if(n=Y[k])n.element.show();else n=Y[k]=new Ja[k](Z=s=m("<div class='fc-view fc-view-"+k+"' style='position:absolute'/>").appendTo(E),X);D&&C.deactivateButton(D.name);C.activateButton(k);S();E.css("overflow","");D&&
+Za(E,1);Z||(n.afterShow||xb)();F--}}function S(k){if(j()){F++;pa();o===ma&&u();var D=false;if(!n.start||k||r<n.start||r>=n.end){n.render(r,k||0);fa(true);D=true}else if(n.sizeDirty){n.clearEvents();fa();D=true}else if(n.eventsDirty){n.clearEvents();D=true}n.sizeDirty=false;n.eventsDirty=false;ga(D);W=a.outerWidth();C.updateTitle(n.title);k=new Date;k>=n.start&&k<n.end?C.disableButton("today"):C.enableButton("today");F--;n.trigger("viewDisplay",i)}}function Q(){q();if(j()){u();fa();pa();n.clearEvents();
+n.renderEvents(J);n.sizeDirty=false}}function q(){m.each(Y,function(k,D){D.sizeDirty=true})}function u(){o=b.contentHeight?b.contentHeight:b.height?b.height-(P?P.height():0)-Sa(E):Math.round(E.width()/Math.max(b.aspectRatio,0.5))}function fa(k){F++;n.setHeight(o,k);if(s){s.css("position","relative");s=null}n.setWidth(E.width(),k);F--}function oa(){if(!F)if(n.start){var k=++v;setTimeout(function(){if(k==v&&!F&&j())if(W!=(W=a.outerWidth())){F++;Q();n.trigger("windowResize",i);F--}},200)}else g()}function ga(k){if(!b.lazyFetching||
+ya(n.visStart,n.visEnd))ra();else k&&da()}function ra(){K(n.visStart,n.visEnd)}function sa(k){J=k;da()}function ha(k){da(k)}function da(k){na();if(j()){n.clearEvents();n.renderEvents(J,k);n.eventsDirty=false}}function na(){m.each(Y,function(k,D){D.eventsDirty=true})}function ua(k,D,Z){n.select(k,D,Z===ma?true:Z)}function pa(){n&&n.unselect()}function U(){S(-1)}function ca(){S(1)}function ka(){gb(r,-1);S()}function qa(){gb(r,1);S()}function G(){r=new Date;S()}function p(k,D,Z){if(k instanceof Date)r=
+N(k);else yb(r,k,D,Z);S()}function L(k,D,Z){k!==ma&&gb(r,k);D!==ma&&hb(r,D);Z!==ma&&ba(r,Z);S()}function c(){return N(r)}function z(){return n}function H(k,D){if(D===ma)return b[k];if(k=="height"||k=="contentHeight"||k=="aspectRatio"){b[k]=D;Q()}}function T(k,D){if(b[k])return b[k].apply(D||i,Array.prototype.slice.call(arguments,2))}var X=this;X.options=b;X.render=d;X.destroy=l;X.refetchEvents=ra;X.reportEvents=sa;X.reportEventChange=ha;X.rerenderEvents=da;X.changeView=y;X.select=ua;X.unselect=pa;
+X.prev=U;X.next=ca;X.prevYear=ka;X.nextYear=qa;X.today=G;X.gotoDate=p;X.incrementDate=L;X.formatDate=function(k,D){return Oa(k,D,b)};X.formatDates=function(k,D,Z){return ib(k,D,Z,b)};X.getDate=c;X.getView=z;X.option=H;X.trigger=T;$b.call(X,b,e);var ya=X.isFetchNeeded,K=X.fetchEvents,i=a[0],C,P,E,B,n,Y={},W,o,s,v=0,F=0,r=new Date,J=[],M;yb(r,b.year,b.month,b.date);b.droppable&&m(document).bind("dragstart",function(k,D){var Z=k.target,ja=m(Z);if(!ja.parents(".fc").length){var ia=b.dropAccept;if(m.isFunction(ia)?
+ia.call(Z,ja):ja.is(ia)){M=Z;n.dragStart(M,k,D)}}}).bind("dragstop",function(k,D){if(M){n.dragStop(M,k,D);M=null}})}function Zb(a,b){function e(){q=b.theme?"ui":"fc";if(b.header)return Q=m("<table class='fc-header' style='width:100%'/>").append(m("<tr/>").append(f("left")).append(f("center")).append(f("right")))}function d(){Q.remove()}function f(u){var fa=m("<td class='fc-header-"+u+"'/>");(u=b.header[u])&&m.each(u.split(" "),function(oa){oa>0&&fa.append("<span class='fc-header-space'/>");var ga;
+m.each(this.split(","),function(ra,sa){if(sa=="title"){fa.append("<span class='fc-header-title'><h2>&nbsp;</h2></span>");ga&&ga.addClass(q+"-corner-right");ga=null}else{var ha;if(a[sa])ha=a[sa];else if(Ja[sa])ha=function(){na.removeClass(q+"-state-hover");a.changeView(sa)};if(ha){ra=b.theme?jb(b.buttonIcons,sa):null;var da=jb(b.buttonText,sa),na=m("<span class='fc-button fc-button-"+sa+" "+q+"-state-default'><span class='fc-button-inner'><span class='fc-button-content'>"+(ra?"<span class='fc-icon-wrap'><span class='ui-icon ui-icon-"+
+ra+"'/></span>":da)+"</span><span class='fc-button-effect'><span></span></span></span></span>");if(na){na.click(function(){na.hasClass(q+"-state-disabled")||ha()}).mousedown(function(){na.not("."+q+"-state-active").not("."+q+"-state-disabled").addClass(q+"-state-down")}).mouseup(function(){na.removeClass(q+"-state-down")}).hover(function(){na.not("."+q+"-state-active").not("."+q+"-state-disabled").addClass(q+"-state-hover")},function(){na.removeClass(q+"-state-hover").removeClass(q+"-state-down")}).appendTo(fa);
+ga||na.addClass(q+"-corner-left");ga=na}}}});ga&&ga.addClass(q+"-corner-right")});return fa}function g(u){Q.find("h2").html(u)}function l(u){Q.find("span.fc-button-"+u).addClass(q+"-state-active")}function j(u){Q.find("span.fc-button-"+u).removeClass(q+"-state-active")}function t(u){Q.find("span.fc-button-"+u).addClass(q+"-state-disabled")}function y(u){Q.find("span.fc-button-"+u).removeClass(q+"-state-disabled")}var S=this;S.render=e;S.destroy=d;S.updateTitle=g;S.activateButton=l;S.deactivateButton=
+j;S.disableButton=t;S.enableButton=y;var Q=m([]),q}function $b(a,b){function e(c,z){return!ca||c<ca||z>ka}function d(c,z){ca=c;ka=z;L=[];c=++qa;G=z=U.length;for(var H=0;H<z;H++)f(U[H],c)}function f(c,z){g(c,function(H){if(z==qa){if(H){for(var T=0;T<H.length;T++){H[T].source=c;oa(H[T])}L=L.concat(H)}G--;G||ua(L)}})}function g(c,z){var H,T=Aa.sourceFetchers,X;for(H=0;H<T.length;H++){X=T[H](c,ca,ka,z);if(X===true)return;else if(typeof X=="object"){g(X,z);return}}if(H=c.events)if(m.isFunction(H)){u();
+H(N(ca),N(ka),function(C){z(C);fa()})}else m.isArray(H)?z(H):z();else if(c.url){var ya=c.success,K=c.error,i=c.complete;H=m.extend({},c.data||{});T=Ta(c.startParam,a.startParam);X=Ta(c.endParam,a.endParam);if(T)H[T]=Math.round(+ca/1E3);if(X)H[X]=Math.round(+ka/1E3);u();m.ajax(m.extend({},ac,c,{data:H,success:function(C){C=C||[];var P=$a(ya,this,arguments);if(m.isArray(P))C=P;z(C)},error:function(){$a(K,this,arguments);z()},complete:function(){$a(i,this,arguments);fa()}}))}else z()}function l(c){if(c=
+j(c)){G++;f(c,qa)}}function j(c){if(m.isFunction(c)||m.isArray(c))c={events:c};else if(typeof c=="string")c={url:c};if(typeof c=="object"){ga(c);U.push(c);return c}}function t(c){U=m.grep(U,function(z){return!ra(z,c)});L=m.grep(L,function(z){return!ra(z.source,c)});ua(L)}function y(c){var z,H=L.length,T,X=na().defaultEventEnd,ya=c.start-c._start,K=c.end?c.end-(c._end||X(c)):0;for(z=0;z<H;z++){T=L[z];if(T._id==c._id&&T!=c){T.start=new Date(+T.start+ya);T.end=c.end?T.end?new Date(+T.end+K):new Date(+X(T)+
+K):null;T.title=c.title;T.url=c.url;T.allDay=c.allDay;T.className=c.className;T.editable=c.editable;T.color=c.color;T.backgroudColor=c.backgroudColor;T.borderColor=c.borderColor;T.textColor=c.textColor;oa(T)}}oa(c);ua(L)}function S(c,z){oa(c);if(!c.source){if(z){pa.events.push(c);c.source=pa}L.push(c)}ua(L)}function Q(c){if(c){if(!m.isFunction(c)){var z=c+"";c=function(T){return T._id==z}}L=m.grep(L,c,true);for(H=0;H<U.length;H++)if(m.isArray(U[H].events))U[H].events=m.grep(U[H].events,c,true)}else{L=
+[];for(var H=0;H<U.length;H++)if(m.isArray(U[H].events))U[H].events=[]}ua(L)}function q(c){if(m.isFunction(c))return m.grep(L,c);else if(c){c+="";return m.grep(L,function(z){return z._id==c})}return L}function u(){p++||da("loading",null,true)}function fa(){--p||da("loading",null,false)}function oa(c){var z=c.source||{},H=Ta(z.ignoreTimezone,a.ignoreTimezone);c._id=c._id||(c.id===ma?"_fc"+bc++:c.id+"");if(c.date){if(!c.start)c.start=c.date;delete c.date}c._start=N(c.start=kb(c.start,H));c.end=kb(c.end,
+H);if(c.end&&c.end<=c.start)c.end=null;c._end=c.end?N(c.end):null;if(c.allDay===ma)c.allDay=Ta(z.allDayDefault,a.allDayDefault);if(c.className){if(typeof c.className=="string")c.className=c.className.split(/\s+/)}else c.className=[]}function ga(c){if(c.className){if(typeof c.className=="string")c.className=c.className.split(/\s+/)}else c.className=[];for(var z=Aa.sourceNormalizers,H=0;H<z.length;H++)z[H](c)}function ra(c,z){return c&&z&&sa(c)==sa(z)}function sa(c){return(typeof c=="object"?c.events||
+c.url:"")||c}var ha=this;ha.isFetchNeeded=e;ha.fetchEvents=d;ha.addEventSource=l;ha.removeEventSource=t;ha.updateEvent=y;ha.renderEvent=S;ha.removeEvents=Q;ha.clientEvents=q;ha.normalizeEvent=oa;var da=ha.trigger,na=ha.getView,ua=ha.reportEvents,pa={events:[]},U=[pa],ca,ka,qa=0,G=0,p=0,L=[];for(ha=0;ha<b.length;ha++)j(b[ha])}function gb(a,b,e){a.setFullYear(a.getFullYear()+b);e||Ka(a);return a}function hb(a,b,e){if(+a){b=a.getMonth()+b;var d=N(a);d.setDate(1);d.setMonth(b);a.setMonth(b);for(e||Ka(a);a.getMonth()!=
+d.getMonth();)a.setDate(a.getDate()+(a<d?1:-1))}return a}function ba(a,b,e){if(+a){b=a.getDate()+b;var d=N(a);d.setHours(9);d.setDate(b);a.setDate(b);e||Ka(a);lb(a,d)}return a}function lb(a,b){if(+a)for(;a.getDate()!=b.getDate();)a.setTime(+a+(a<b?1:-1)*cc)}function xa(a,b){a.setMinutes(a.getMinutes()+b);return a}function Ka(a){a.setHours(0);a.setMinutes(0);a.setSeconds(0);a.setMilliseconds(0);return a}function N(a,b){if(b)return Ka(new Date(+a));return new Date(+a)}function zb(){var a=0,b;do b=new Date(1970,
+a++,1);while(b.getHours());return b}function Fa(a,b,e){for(b=b||1;!a.getDay()||e&&a.getDay()==1||!e&&a.getDay()==6;)ba(a,b);return a}function Ca(a,b){return Math.round((N(a,true)-N(b,true))/Ab)}function yb(a,b,e,d){if(b!==ma&&b!=a.getFullYear()){a.setDate(1);a.setMonth(0);a.setFullYear(b)}if(e!==ma&&e!=a.getMonth()){a.setDate(1);a.setMonth(e)}d!==ma&&a.setDate(d)}function kb(a,b){if(typeof a=="object")return a;if(typeof a=="number")return new Date(a*1E3);if(typeof a=="string"){if(a.match(/^\d+(\.\d+)?$/))return new Date(parseFloat(a)*
+1E3);if(b===ma)b=true;return Bb(a,b)||(a?new Date(a):null)}return null}function Bb(a,b){a=a.match(/^([0-9]{4})(-([0-9]{2})(-([0-9]{2})([T ]([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?(Z|(([-+])([0-9]{2})(:?([0-9]{2}))?))?)?)?)?$/);if(!a)return null;var e=new Date(a[1],0,1);if(b||!a[13]){b=new Date(a[1],0,1,9,0);if(a[3]){e.setMonth(a[3]-1);b.setMonth(a[3]-1)}if(a[5]){e.setDate(a[5]);b.setDate(a[5])}lb(e,b);a[7]&&e.setHours(a[7]);a[8]&&e.setMinutes(a[8]);a[10]&&e.setSeconds(a[10]);a[12]&&e.setMilliseconds(Number("0."+
+a[12])*1E3);lb(e,b)}else{e.setUTCFullYear(a[1],a[3]?a[3]-1:0,a[5]||1);e.setUTCHours(a[7]||0,a[8]||0,a[10]||0,a[12]?Number("0."+a[12])*1E3:0);if(a[14]){b=Number(a[16])*60+(a[18]?Number(a[18]):0);b*=a[15]=="-"?1:-1;e=new Date(+e+b*60*1E3)}}return e}function mb(a){if(typeof a=="number")return a*60;if(typeof a=="object")return a.getHours()*60+a.getMinutes();if(a=a.match(/(\d+)(?::(\d+))?\s*(\w+)?/)){var b=parseInt(a[1],10);if(a[3]){b%=12;if(a[3].toLowerCase().charAt(0)=="p")b+=12}return b*60+(a[2]?parseInt(a[2],
+10):0)}}function Oa(a,b,e){return ib(a,null,b,e)}function ib(a,b,e,d){d=d||Ya;var f=a,g=b,l,j=e.length,t,y,S,Q="";for(l=0;l<j;l++){t=e.charAt(l);if(t=="'")for(y=l+1;y<j;y++){if(e.charAt(y)=="'"){if(f){Q+=y==l+1?"'":e.substring(l+1,y);l=y}break}}else if(t=="(")for(y=l+1;y<j;y++){if(e.charAt(y)==")"){l=Oa(f,e.substring(l+1,y),d);if(parseInt(l.replace(/\D/,""),10))Q+=l;l=y;break}}else if(t=="[")for(y=l+1;y<j;y++){if(e.charAt(y)=="]"){t=e.substring(l+1,y);l=Oa(f,t,d);if(l!=Oa(g,t,d))Q+=l;l=y;break}}else if(t==
+"{"){f=b;g=a}else if(t=="}"){f=a;g=b}else{for(y=j;y>l;y--)if(S=dc[e.substring(l,y)]){if(f)Q+=S(f,d);l=y-1;break}if(y==l)if(f)Q+=t}}return Q}function Ua(a){return a.end?ec(a.end,a.allDay):ba(N(a.start),1)}function ec(a,b){a=N(a);return b||a.getHours()||a.getMinutes()?ba(a,1):Ka(a)}function fc(a,b){return(b.msLength-a.msLength)*100+(a.event.start-b.event.start)}function Cb(a,b){return a.end>b.start&&a.start<b.end}function nb(a,b,e,d){var f=[],g,l=a.length,j,t,y,S,Q;for(g=0;g<l;g++){j=a[g];t=j.start;
+y=b[g];if(y>e&&t<d){if(t<e){t=N(e);S=false}else{t=t;S=true}if(y>d){y=N(d);Q=false}else{y=y;Q=true}f.push({event:j,start:t,end:y,isStart:S,isEnd:Q,msLength:y-t})}}return f.sort(fc)}function ob(a){var b=[],e,d=a.length,f,g,l,j;for(e=0;e<d;e++){f=a[e];for(g=0;;){l=false;if(b[g])for(j=0;j<b[g].length;j++)if(Cb(b[g][j],f)){l=true;break}if(l)g++;else break}if(b[g])b[g].push(f);else b[g]=[f]}return b}function Db(a,b,e){a.unbind("mouseover").mouseover(function(d){for(var f=d.target,g;f!=this;){g=f;f=f.parentNode}if((f=
+g._fci)!==ma){g._fci=ma;g=b[f];e(g.event,g.element,g);m(d.target).trigger(d)}d.stopPropagation()})}function Va(a,b,e){for(var d=0,f;d<a.length;d++){f=m(a[d]);f.width(Math.max(0,b-pb(f,e)))}}function Eb(a,b,e){for(var d=0,f;d<a.length;d++){f=m(a[d]);f.height(Math.max(0,b-Sa(f,e)))}}function pb(a,b){return gc(a)+hc(a)+(b?ic(a):0)}function gc(a){return(parseFloat(m.curCSS(a[0],"paddingLeft",true))||0)+(parseFloat(m.curCSS(a[0],"paddingRight",true))||0)}function ic(a){return(parseFloat(m.curCSS(a[0],
+"marginLeft",true))||0)+(parseFloat(m.curCSS(a[0],"marginRight",true))||0)}function hc(a){return(parseFloat(m.curCSS(a[0],"borderLeftWidth",true))||0)+(parseFloat(m.curCSS(a[0],"borderRightWidth",true))||0)}function Sa(a,b){return jc(a)+kc(a)+(b?Fb(a):0)}function jc(a){return(parseFloat(m.curCSS(a[0],"paddingTop",true))||0)+(parseFloat(m.curCSS(a[0],"paddingBottom",true))||0)}function Fb(a){return(parseFloat(m.curCSS(a[0],"marginTop",true))||0)+(parseFloat(m.curCSS(a[0],"marginBottom",true))||0)}
+function kc(a){return(parseFloat(m.curCSS(a[0],"borderTopWidth",true))||0)+(parseFloat(m.curCSS(a[0],"borderBottomWidth",true))||0)}function Za(a,b){b=typeof b=="number"?b+"px":b;a.each(function(e,d){d.style.cssText+=";min-height:"+b+";_height:"+b})}function xb(){}function Gb(a,b){return a-b}function Hb(a){return Math.max.apply(Math,a)}function Pa(a){return(a<10?"0":"")+a}function jb(a,b){if(a[b]!==ma)return a[b];b=b.split(/(?=[A-Z])/);for(var e=b.length-1,d;e>=0;e--){d=a[b[e].toLowerCase()];if(d!==
+ma)return d}return a[""]}function Qa(a){return a.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#039;").replace(/"/g,"&quot;").replace(/\n/g,"<br />")}function Ib(a){return a.id+"/"+a.className+"/"+a.style.cssText.replace(/(^|;)\s*(top|left|width|height)\s*:[^;]*/ig,"")}function qb(a){a.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})}function ab(a){a.children().removeClass("fc-first fc-last").filter(":first-child").addClass("fc-first").end().filter(":last-child").addClass("fc-last")}
+function rb(a,b){a.each(function(e,d){d.className=d.className.replace(/^fc-\w*/,"fc-"+lc[b.getDay()])})}function Jb(a,b){var e=a.source||{},d=a.color,f=e.color,g=b("eventColor"),l=a.backgroundColor||d||e.backgroundColor||f||b("eventBackgroundColor")||g;d=a.borderColor||d||e.borderColor||f||b("eventBorderColor")||g;a=a.textColor||e.textColor||b("eventTextColor");b=[];l&&b.push("background-color:"+l);d&&b.push("border-color:"+d);a&&b.push("color:"+a);return b.join(";")}function $a(a,b,e){if(m.isFunction(a))a=
+[a];if(a){var d,f;for(d=0;d<a.length;d++)f=a[d].apply(b,e)||f;return f}}function Ta(){for(var a=0;a<arguments.length;a++)if(arguments[a]!==ma)return arguments[a]}function mc(a,b){function e(j,t){if(t){hb(j,t);j.setDate(1)}j=N(j,true);j.setDate(1);t=hb(N(j),1);var y=N(j),S=N(t),Q=f("firstDay"),q=f("weekends")?0:1;if(q){Fa(y);Fa(S,-1,true)}ba(y,-((y.getDay()-Math.max(Q,q)+7)%7));ba(S,(7-S.getDay()+Math.max(Q,q))%7);Q=Math.round((S-y)/(Ab*7));if(f("weekMode")=="fixed"){ba(S,(6-Q)*7);Q=6}d.title=l(j,
+f("titleFormat"));d.start=j;d.end=t;d.visStart=y;d.visEnd=S;g(6,Q,q?5:7,true)}var d=this;d.render=e;sb.call(d,a,b,"month");var f=d.opt,g=d.renderBasic,l=b.formatDate}function nc(a,b){function e(j,t){t&&ba(j,t*7);j=ba(N(j),-((j.getDay()-f("firstDay")+7)%7));t=ba(N(j),7);var y=N(j),S=N(t),Q=f("weekends");if(!Q){Fa(y);Fa(S,-1,true)}d.title=l(y,ba(N(S),-1),f("titleFormat"));d.start=j;d.end=t;d.visStart=y;d.visEnd=S;g(1,1,Q?7:5,false)}var d=this;d.render=e;sb.call(d,a,b,"basicWeek");var f=d.opt,g=d.renderBasic,
+l=b.formatDates}function oc(a,b){function e(j,t){if(t){ba(j,t);f("weekends")||Fa(j,t<0?-1:1)}d.title=l(j,f("titleFormat"));d.start=d.visStart=N(j,true);d.end=d.visEnd=ba(N(d.start),1);g(1,1,1,false)}var d=this;d.render=e;sb.call(d,a,b,"basicDay");var f=d.opt,g=d.renderBasic,l=b.formatDate}function sb(a,b,e){function d(w,I,R,V){v=I;F=R;f();(I=!C)?g(w,V):z();l(I)}function f(){if(k=L("isRTL")){D=-1;Z=F-1}else{D=1;Z=0}ja=L("firstDay");ia=L("weekends")?0:1;la=L("theme")?"ui":"fc";$=L("columnFormat")}function g(w,
+I){var R,V=la+"-widget-header",ea=la+"-widget-content",aa;R="<table class='fc-border-separate' style='width:100%' cellspacing='0'><thead><tr>";for(aa=0;aa<F;aa++)R+="<th class='fc- "+V+"'/>";R+="</tr></thead><tbody>";for(aa=0;aa<w;aa++){R+="<tr class='fc-week"+aa+"'>";for(V=0;V<F;V++)R+="<td class='fc- "+ea+" fc-day"+(aa*F+V)+"'><div>"+(I?"<div class='fc-day-number'/>":"")+"<div class='fc-day-content'><div style='position:relative'>&nbsp;</div></div></div></td>";R+="</tr>"}R+="</tbody></table>";w=
+m(R).appendTo(a);K=w.find("thead");i=K.find("th");C=w.find("tbody");P=C.find("tr");E=C.find("td");B=E.filter(":first-child");n=P.eq(0).find("div.fc-day-content div");ab(K.add(K.find("tr")));ab(P);P.eq(0).addClass("fc-first");y(E);Y=m("<div style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(a)}function l(w){var I=w||v==1,R=p.start.getMonth(),V=Ka(new Date),ea,aa,va;I&&i.each(function(wa,Ga){ea=m(Ga);aa=ca(wa);ea.html(ya(aa,$));rb(ea,aa)});E.each(function(wa,Ga){ea=m(Ga);aa=ca(wa);aa.getMonth()==
+R?ea.removeClass("fc-other-month"):ea.addClass("fc-other-month");+aa==+V?ea.addClass(la+"-state-highlight fc-today"):ea.removeClass(la+"-state-highlight fc-today");ea.find("div.fc-day-number").text(aa.getDate());I&&rb(ea,aa)});P.each(function(wa,Ga){va=m(Ga);if(wa<v){va.show();wa==v-1?va.addClass("fc-last"):va.removeClass("fc-last")}else va.hide()})}function j(w){o=w;w=o-K.height();var I,R,V;if(L("weekMode")=="variable")I=R=Math.floor(w/(v==1?2:6));else{I=Math.floor(w/v);R=w-I*(v-1)}B.each(function(ea,
+aa){if(ea<v){V=m(aa);Za(V.find("> div"),(ea==v-1?R:I)-Sa(V))}})}function t(w){W=w;M.clear();s=Math.floor(W/F);Va(i.slice(0,-1),s)}function y(w){w.click(S).mousedown(X)}function S(w){if(!L("selectable")){var I=parseInt(this.className.match(/fc\-day(\d+)/)[1]);I=ca(I);c("dayClick",this,I,true,w)}}function Q(w,I,R){R&&r.build();R=N(p.visStart);for(var V=ba(N(R),F),ea=0;ea<v;ea++){var aa=new Date(Math.max(R,w)),va=new Date(Math.min(V,I));if(aa<va){var wa;if(k){wa=Ca(va,R)*D+Z+1;aa=Ca(aa,R)*D+Z+1}else{wa=
+Ca(aa,R);aa=Ca(va,R)}y(q(ea,wa,ea,aa-1))}ba(R,7);ba(V,7)}}function q(w,I,R,V){w=r.rect(w,I,R,V,a);return H(w,a)}function u(w){return N(w)}function fa(w,I){Q(w,ba(N(I),1),true)}function oa(){T()}function ga(w,I,R){var V=ua(w);c("dayClick",E[V.row*F+V.col],w,I,R)}function ra(w,I){J.start(function(R){T();R&&q(R.row,R.col,R.row,R.col)},I)}function sa(w,I,R){var V=J.stop();T();if(V){V=pa(V);c("drop",w,V,true,I,R)}}function ha(w){return N(w.start)}function da(w){return M.left(w)}function na(w){return M.right(w)}
+function ua(w){return{row:Math.floor(Ca(w,p.visStart)/7),col:ka(w.getDay())}}function pa(w){return U(w.row,w.col)}function U(w,I){return ba(N(p.visStart),w*7+I*D+Z)}function ca(w){return U(Math.floor(w/F),w%F)}function ka(w){return(w-Math.max(ja,ia)+F)%F*D+Z}function qa(w){return P.eq(w)}function G(){return{left:0,right:W}}var p=this;p.renderBasic=d;p.setHeight=j;p.setWidth=t;p.renderDayOverlay=Q;p.defaultSelectionEnd=u;p.renderSelection=fa;p.clearSelection=oa;p.reportDayClick=ga;p.dragStart=ra;p.dragStop=
+sa;p.defaultEventEnd=ha;p.getHoverListener=function(){return J};p.colContentLeft=da;p.colContentRight=na;p.dayOfWeekCol=ka;p.dateCell=ua;p.cellDate=pa;p.cellIsAllDay=function(){return true};p.allDayRow=qa;p.allDayBounds=G;p.getRowCnt=function(){return v};p.getColCnt=function(){return F};p.getColWidth=function(){return s};p.getDaySegmentContainer=function(){return Y};Kb.call(p,a,b,e);Lb.call(p);Mb.call(p);pc.call(p);var L=p.opt,c=p.trigger,z=p.clearEvents,H=p.renderOverlay,T=p.clearOverlays,X=p.daySelectionMousedown,
+ya=b.formatDate,K,i,C,P,E,B,n,Y,W,o,s,v,F,r,J,M,k,D,Z,ja,ia,la,$;qb(a.addClass("fc-grid"));r=new Nb(function(w,I){var R,V,ea;i.each(function(aa,va){R=m(va);V=R.offset().left;if(aa)ea[1]=V;ea=[V];I[aa]=ea});ea[1]=V+R.outerWidth();P.each(function(aa,va){if(aa<v){R=m(va);V=R.offset().top;if(aa)ea[1]=V;ea=[V];w[aa]=ea}});ea[1]=V+R.outerHeight()});J=new Ob(r);M=new Pb(function(w){return n.eq(w)})}function pc(){function a(U,ca){S(U);ua(e(U),ca)}function b(){Q();ga().empty()}function e(U){var ca=da(),ka=
+na(),qa=N(g.visStart);ka=ba(N(qa),ka);var G=m.map(U,Ua),p,L,c,z,H,T,X=[];for(p=0;p<ca;p++){L=ob(nb(U,G,qa,ka));for(c=0;c<L.length;c++){z=L[c];for(H=0;H<z.length;H++){T=z[H];T.row=p;T.level=c;X.push(T)}}ba(qa,7);ba(ka,7)}return X}function d(U,ca,ka){t(U)&&f(U,ca);ka.isEnd&&y(U)&&pa(U,ca,ka);q(U,ca)}function f(U,ca){var ka=ra(),qa;ca.draggable({zIndex:9,delay:50,opacity:l("dragOpacity"),revertDuration:l("dragRevertDuration"),start:function(G,p){j("eventDragStart",ca,U,G,p);fa(U,ca);ka.start(function(L,
+c,z,H){ca.draggable("option","revert",!L||!z&&!H);ha();if(L){qa=z*7+H*(l("isRTL")?-1:1);sa(ba(N(U.start),qa),ba(Ua(U),qa))}else qa=0},G,"drag")},stop:function(G,p){ka.stop();ha();j("eventDragStop",ca,U,G,p);if(qa)oa(this,U,qa,0,U.allDay,G,p);else{ca.css("filter","");u(U,ca)}}})}var g=this;g.renderEvents=a;g.compileDaySegs=e;g.clearEvents=b;g.bindDaySeg=d;Qb.call(g);var l=g.opt,j=g.trigger,t=g.isEventDraggable,y=g.isEventResizable,S=g.reportEvents,Q=g.reportEventClear,q=g.eventElementHandlers,u=g.showEvents,
+fa=g.hideEvents,oa=g.eventDrop,ga=g.getDaySegmentContainer,ra=g.getHoverListener,sa=g.renderDayOverlay,ha=g.clearOverlays,da=g.getRowCnt,na=g.getColCnt,ua=g.renderDaySegs,pa=g.resizableDayEvent}function qc(a,b){function e(j,t){t&&ba(j,t*7);j=ba(N(j),-((j.getDay()-f("firstDay")+7)%7));t=ba(N(j),7);var y=N(j),S=N(t),Q=f("weekends");if(!Q){Fa(y);Fa(S,-1,true)}d.title=l(y,ba(N(S),-1),f("titleFormat"));d.start=j;d.end=t;d.visStart=y;d.visEnd=S;g(Q?7:5)}var d=this;d.render=e;Rb.call(d,a,b,"agendaWeek");
+var f=d.opt,g=d.renderAgenda,l=b.formatDates}function rc(a,b){function e(j,t){if(t){ba(j,t);f("weekends")||Fa(j,t<0?-1:1)}t=N(j,true);var y=ba(N(t),1);d.title=l(j,f("titleFormat"));d.start=d.visStart=t;d.end=d.visEnd=y;g(1)}var d=this;d.render=e;Rb.call(d,a,b,"agendaDay");var f=d.opt,g=d.renderAgenda,l=b.formatDate}function Rb(a,b,e){function d(h){Ba=h;f();v?P():g();l()}function f(){Wa=i("theme")?"ui":"fc";Sb=i("weekends")?0:1;Tb=i("firstDay");if(Ub=i("isRTL")){Ha=-1;Ia=Ba-1}else{Ha=1;Ia=0}La=mb(i("minTime"));
+bb=mb(i("maxTime"));Vb=i("columnFormat")}function g(){var h=Wa+"-widget-header",O=Wa+"-widget-content",x,A,ta,za,Da,Ea=i("slotMinutes")%15==0;x="<table style='width:100%' class='fc-agenda-days fc-border-separate' cellspacing='0'><thead><tr><th class='fc-agenda-axis "+h+"'>&nbsp;</th>";for(A=0;A<Ba;A++)x+="<th class='fc- fc-col"+A+" "+h+"'/>";x+="<th class='fc-agenda-gutter "+h+"'>&nbsp;</th></tr></thead><tbody><tr><th class='fc-agenda-axis "+h+"'>&nbsp;</th>";for(A=0;A<Ba;A++)x+="<td class='fc- fc-col"+
+A+" "+O+"'><div><div class='fc-day-content'><div style='position:relative'>&nbsp;</div></div></div></td>";x+="<td class='fc-agenda-gutter "+O+"'>&nbsp;</td></tr></tbody></table>";v=m(x).appendTo(a);F=v.find("thead");r=F.find("th").slice(1,-1);J=v.find("tbody");M=J.find("td").slice(0,-1);k=M.find("div.fc-day-content div");D=M.eq(0);Z=D.find("> div");ab(F.add(F.find("tr")));ab(J.add(J.find("tr")));aa=F.find("th:first");va=v.find(".fc-agenda-gutter");ja=m("<div style='position:absolute;z-index:2;left:0;width:100%'/>").appendTo(a);
+if(i("allDaySlot")){ia=m("<div style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(ja);x="<table style='width:100%' class='fc-agenda-allday' cellspacing='0'><tr><th class='"+h+" fc-agenda-axis'>"+i("allDayText")+"</th><td><div class='fc-day-content'><div style='position:relative'/></div></td><th class='"+h+" fc-agenda-gutter'>&nbsp;</th></tr></table>";la=m(x).appendTo(ja);$=la.find("tr");q($.find("td"));aa=aa.add(la.find("th:first"));va=va.add(la.find("th.fc-agenda-gutter"));ja.append("<div class='fc-agenda-divider "+
+h+"'><div class='fc-agenda-divider-inner'/></div>")}else ia=m([]);w=m("<div style='position:absolute;width:100%;overflow-x:hidden;overflow-y:auto'/>").appendTo(ja);I=m("<div style='position:relative;width:100%;overflow:hidden'/>").appendTo(w);R=m("<div style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(I);x="<table class='fc-agenda-slots' style='width:100%' cellspacing='0'><tbody>";ta=zb();za=xa(N(ta),bb);xa(ta,La);for(A=tb=0;ta<za;A++){Da=ta.getMinutes();x+="<tr class='fc-slot"+A+" "+
+(!Da?"":"fc-minor")+"'><th class='fc-agenda-axis "+h+"'>"+(!Ea||!Da?s(ta,i("axisFormat")):"&nbsp;")+"</th><td class='"+O+"'><div style='position:relative'>&nbsp;</div></td></tr>";xa(ta,i("slotMinutes"));tb++}x+="</tbody></table>";V=m(x).appendTo(I);ea=V.find("div:first");u(V.find("td"));aa=aa.add(V.find("th:first"))}function l(){var h,O,x,A,ta=Ka(new Date);for(h=0;h<Ba;h++){A=ua(h);O=r.eq(h);O.html(s(A,Vb));x=M.eq(h);+A==+ta?x.addClass(Wa+"-state-highlight fc-today"):x.removeClass(Wa+"-state-highlight fc-today");
+rb(O.add(x),A)}}function j(h,O){if(h===ma)h=Wb;Wb=h;ub={};var x=J.position().top,A=w.position().top;h=Math.min(h-x,V.height()+A+1);Z.height(h-Sa(D));ja.css("top",x);w.height(h-A-1);Xa=ea.height()+1;O&&y()}function t(h){Ga=h;cb.clear();Ma=0;Va(aa.width("").each(function(O,x){Ma=Math.max(Ma,m(x).outerWidth())}),Ma);h=w[0].clientWidth;if(vb=w.width()-h){Va(va,vb);va.show().prev().removeClass("fc-last")}else va.hide().prev().addClass("fc-last");db=Math.floor((h-Ma)/Ba);Va(r.slice(0,-1),db)}function y(){function h(){w.scrollTop(A)}
+var O=zb(),x=N(O);x.setHours(i("firstHour"));var A=ca(O,x)+1;h();setTimeout(h,0)}function S(){Xb=w.scrollTop()}function Q(){w.scrollTop(Xb)}function q(h){h.click(fa).mousedown(W)}function u(h){h.click(fa).mousedown(H)}function fa(h){if(!i("selectable")){var O=Math.min(Ba-1,Math.floor((h.pageX-v.offset().left-Ma)/db)),x=ua(O),A=this.parentNode.className.match(/fc-slot(\d+)/);if(A){A=parseInt(A[1])*i("slotMinutes");var ta=Math.floor(A/60);x.setHours(ta);x.setMinutes(A%60+La);C("dayClick",M[O],x,false,
+h)}else C("dayClick",M[O],x,true,h)}}function oa(h,O,x){x&&Na.build();var A=N(K.visStart);if(Ub){x=Ca(O,A)*Ha+Ia+1;h=Ca(h,A)*Ha+Ia+1}else{x=Ca(h,A);h=Ca(O,A)}x=Math.max(0,x);h=Math.min(Ba,h);x<h&&q(ga(0,x,0,h-1))}function ga(h,O,x,A){h=Na.rect(h,O,x,A,ja);return E(h,ja)}function ra(h,O){for(var x=N(K.visStart),A=ba(N(x),1),ta=0;ta<Ba;ta++){var za=new Date(Math.max(x,h)),Da=new Date(Math.min(A,O));if(za<Da){var Ea=ta*Ha+Ia;Ea=Na.rect(0,Ea,0,Ea,I);za=ca(x,za);Da=ca(x,Da);Ea.top=za;Ea.height=Da-za;u(E(Ea,
+I))}ba(x,1);ba(A,1)}}function sa(h){return cb.left(h)}function ha(h){return cb.right(h)}function da(h){return{row:Math.floor(Ca(h,K.visStart)/7),col:U(h.getDay())}}function na(h){var O=ua(h.col);h=h.row;i("allDaySlot")&&h--;h>=0&&xa(O,La+h*i("slotMinutes"));return O}function ua(h){return ba(N(K.visStart),h*Ha+Ia)}function pa(h){return i("allDaySlot")&&!h.row}function U(h){return(h-Math.max(Tb,Sb)+Ba)%Ba*Ha+Ia}function ca(h,O){h=N(h,true);if(O<xa(N(h),La))return 0;if(O>=xa(N(h),bb))return V.height();
+h=i("slotMinutes");O=O.getHours()*60+O.getMinutes()-La;var x=Math.floor(O/h),A=ub[x];if(A===ma)A=ub[x]=V.find("tr:eq("+x+") td div")[0].offsetTop;return Math.max(0,Math.round(A-1+Xa*(O%h/h)))}function ka(){return{left:Ma,right:Ga-vb}}function qa(){return $}function G(h){var O=N(h.start);if(h.allDay)return O;return xa(O,i("defaultEventMinutes"))}function p(h,O){if(O)return N(h);return xa(N(h),i("slotMinutes"))}function L(h,O,x){if(x)i("allDaySlot")&&oa(h,ba(N(O),1),true);else c(h,O)}function c(h,O){var x=
+i("selectHelper");Na.build();if(x){var A=Ca(h,K.visStart)*Ha+Ia;if(A>=0&&A<Ba){A=Na.rect(0,A,0,A,I);var ta=ca(h,h),za=ca(h,O);if(za>ta){A.top=ta;A.height=za-ta;A.left+=2;A.width-=5;if(m.isFunction(x)){if(h=x(h,O)){A.position="absolute";A.zIndex=8;wa=m(h).css(A).appendTo(I)}}else{A.isStart=true;A.isEnd=true;wa=m(o({title:"",start:h,end:O,className:["fc-select-helper"],editable:false},A));wa.css("opacity",i("dragOpacity"))}if(wa){u(wa);I.append(wa);Va(wa,A.width,true);Eb(wa,A.height,true)}}}}else ra(h,
+O)}function z(){B();if(wa){wa.remove();wa=null}}function H(h){if(h.which==1&&i("selectable")){Y(h);var O;Ra.start(function(x,A){z();if(x&&x.col==A.col&&!pa(x)){A=na(A);x=na(x);O=[A,xa(N(A),i("slotMinutes")),x,xa(N(x),i("slotMinutes"))].sort(Gb);c(O[0],O[3])}else O=null},h);m(document).one("mouseup",function(x){Ra.stop();if(O){+O[0]==+O[1]&&T(O[0],false,x);n(O[0],O[3],false,x)}})}}function T(h,O,x){C("dayClick",M[U(h.getDay())],h,O,x)}function X(h,O){Ra.start(function(x){B();if(x)if(pa(x))ga(x.row,
+x.col,x.row,x.col);else{x=na(x);var A=xa(N(x),i("defaultEventMinutes"));ra(x,A)}},O)}function ya(h,O,x){var A=Ra.stop();B();A&&C("drop",h,na(A),pa(A),O,x)}var K=this;K.renderAgenda=d;K.setWidth=t;K.setHeight=j;K.beforeHide=S;K.afterShow=Q;K.defaultEventEnd=G;K.timePosition=ca;K.dayOfWeekCol=U;K.dateCell=da;K.cellDate=na;K.cellIsAllDay=pa;K.allDayRow=qa;K.allDayBounds=ka;K.getHoverListener=function(){return Ra};K.colContentLeft=sa;K.colContentRight=ha;K.getDaySegmentContainer=function(){return ia};
+K.getSlotSegmentContainer=function(){return R};K.getMinMinute=function(){return La};K.getMaxMinute=function(){return bb};K.getBodyContent=function(){return I};K.getRowCnt=function(){return 1};K.getColCnt=function(){return Ba};K.getColWidth=function(){return db};K.getSlotHeight=function(){return Xa};K.defaultSelectionEnd=p;K.renderDayOverlay=oa;K.renderSelection=L;K.clearSelection=z;K.reportDayClick=T;K.dragStart=X;K.dragStop=ya;Kb.call(K,a,b,e);Lb.call(K);Mb.call(K);sc.call(K);var i=K.opt,C=K.trigger,
+P=K.clearEvents,E=K.renderOverlay,B=K.clearOverlays,n=K.reportSelection,Y=K.unselect,W=K.daySelectionMousedown,o=K.slotSegHtml,s=b.formatDate,v,F,r,J,M,k,D,Z,ja,ia,la,$,w,I,R,V,ea,aa,va,wa,Ga,Wb,Ma,db,vb,Xa,Xb,Ba,tb,Na,Ra,cb,ub={},Wa,Tb,Sb,Ub,Ha,Ia,La,bb,Vb;qb(a.addClass("fc-agenda"));Na=new Nb(function(h,O){function x(eb){return Math.max(Ea,Math.min(tc,eb))}var A,ta,za;r.each(function(eb,uc){A=m(uc);ta=A.offset().left;if(eb)za[1]=ta;za=[ta];O[eb]=za});za[1]=ta+A.outerWidth();if(i("allDaySlot")){A=
+$;ta=A.offset().top;h[0]=[ta,ta+A.outerHeight()]}for(var Da=I.offset().top,Ea=w.offset().top,tc=Ea+w.outerHeight(),fb=0;fb<tb;fb++)h.push([x(Da+Xa*fb),x(Da+Xa*(fb+1))])});Ra=new Ob(Na);cb=new Pb(function(h){return k.eq(h)})}function sc(){function a(o,s){sa(o);var v,F=o.length,r=[],J=[];for(v=0;v<F;v++)o[v].allDay?r.push(o[v]):J.push(o[v]);if(u("allDaySlot")){L(e(r),s);na()}g(d(J),s)}function b(){ha();ua().empty();pa().empty()}function e(o){o=ob(nb(o,m.map(o,Ua),q.visStart,q.visEnd));var s,v=o.length,
+F,r,J,M=[];for(s=0;s<v;s++){F=o[s];for(r=0;r<F.length;r++){J=F[r];J.row=0;J.level=s;M.push(J)}}return M}function d(o){var s=z(),v=ka(),F=ca(),r=xa(N(q.visStart),v),J=m.map(o,f),M,k,D,Z,ja,ia,la=[];for(M=0;M<s;M++){k=ob(nb(o,J,r,xa(N(r),F-v)));vc(k);for(D=0;D<k.length;D++){Z=k[D];for(ja=0;ja<Z.length;ja++){ia=Z[ja];ia.col=M;ia.level=D;la.push(ia)}}ba(r,1,true)}return la}function f(o){return o.end?N(o.end):xa(N(o.start),u("defaultEventMinutes"))}function g(o,s){var v,F=o.length,r,J,M,k,D,Z,ja,ia,la,
+$="",w,I,R={},V={},ea=pa(),aa;v=z();if(w=u("isRTL")){I=-1;aa=v-1}else{I=1;aa=0}for(v=0;v<F;v++){r=o[v];J=r.event;M=qa(r.start,r.start);k=qa(r.start,r.end);D=r.col;Z=r.level;ja=r.forward||0;ia=G(D*I+aa);la=p(D*I+aa)-ia;la=Math.min(la-6,la*0.95);D=Z?la/(Z+ja+1):ja?(la/(ja+1)-6)*2:la;Z=ia+la/(Z+ja+1)*Z*I+(w?la-D:0);r.top=M;r.left=Z;r.outerWidth=D;r.outerHeight=k-M;$+=l(J,r)}ea[0].innerHTML=$;w=ea.children();for(v=0;v<F;v++){r=o[v];J=r.event;$=m(w[v]);I=fa("eventRender",J,J,$);if(I===false)$.remove();
+else{if(I&&I!==true){$.remove();$=m(I).css({position:"absolute",top:r.top,left:r.left}).appendTo(ea)}r.element=$;if(J._id===s)t(J,$,r);else $[0]._fci=v;ya(J,$)}}Db(ea,o,t);for(v=0;v<F;v++){r=o[v];if($=r.element){J=R[s=r.key=Ib($[0])];r.vsides=J===ma?(R[s]=Sa($,true)):J;J=V[s];r.hsides=J===ma?(V[s]=pb($,true)):J;s=$.find("div.fc-event-content");if(s.length)r.contentTop=s[0].offsetTop}}for(v=0;v<F;v++){r=o[v];if($=r.element){$[0].style.width=Math.max(0,r.outerWidth-r.hsides)+"px";R=Math.max(0,r.outerHeight-
+r.vsides);$[0].style.height=R+"px";J=r.event;if(r.contentTop!==ma&&R-r.contentTop<10){$.find("div.fc-event-time").text(Y(J.start,u("timeFormat"))+" - "+J.title);$.find("div.fc-event-title").remove()}fa("eventAfterRender",J,J,$)}}}function l(o,s){var v="<",F=o.url,r=Jb(o,u),J=r?" style='"+r+"'":"",M=["fc-event","fc-event-skin","fc-event-vert"];oa(o)&&M.push("fc-event-draggable");s.isStart&&M.push("fc-corner-top");s.isEnd&&M.push("fc-corner-bottom");M=M.concat(o.className);if(o.source)M=M.concat(o.source.className||
+[]);v+=F?"a href='"+Qa(o.url)+"'":"div";v+=" class='"+M.join(" ")+"' style='position:absolute;z-index:8;top:"+s.top+"px;left:"+s.left+"px;"+r+"'><div class='fc-event-inner fc-event-skin'"+J+"><div class='fc-event-head fc-event-skin'"+J+"><div class='fc-event-time'>"+Qa(W(o.start,o.end,u("timeFormat")))+"</div></div><div class='fc-event-content'><div class='fc-event-title'>"+Qa(o.title)+"</div></div><div class='fc-event-bg'></div></div>";if(s.isEnd&&ga(o))v+="<div class='ui-resizable-handle ui-resizable-s'>=</div>";
+v+="</"+(F?"a":"div")+">";return v}function j(o,s,v){oa(o)&&y(o,s,v.isStart);v.isEnd&&ga(o)&&c(o,s,v);da(o,s)}function t(o,s,v){var F=s.find("div.fc-event-time");oa(o)&&S(o,s,F);v.isEnd&&ga(o)&&Q(o,s,F);da(o,s)}function y(o,s,v){function F(){if(!M){s.width(r).height("").draggable("option","grid",null);M=true}}var r,J,M=true,k,D=u("isRTL")?-1:1,Z=U(),ja=H(),ia=T(),la=ka();s.draggable({zIndex:9,opacity:u("dragOpacity","month"),revertDuration:u("dragRevertDuration"),start:function($,w){fa("eventDragStart",
+s,o,$,w);i(o,s);r=s.width();Z.start(function(I,R,V,ea){B();if(I){J=false;k=ea*D;if(I.row)if(v){if(M){s.width(ja-10);Eb(s,ia*Math.round((o.end?(o.end-o.start)/wc:u("defaultEventMinutes"))/u("slotMinutes")));s.draggable("option","grid",[ja,1]);M=false}}else J=true;else{E(ba(N(o.start),k),ba(Ua(o),k));F()}J=J||M&&!k}else{F();J=true}s.draggable("option","revert",J)},$,"drag")},stop:function($,w){Z.stop();B();fa("eventDragStop",s,o,$,w);if(J){F();s.css("filter","");K(o,s)}else{var I=0;M||(I=Math.round((s.offset().top-
+X().offset().top)/ia)*u("slotMinutes")+la-(o.start.getHours()*60+o.start.getMinutes()));C(this,o,k,I,M,$,w)}}})}function S(o,s,v){function F(I){var R=xa(N(o.start),I),V;if(o.end)V=xa(N(o.end),I);v.text(W(R,V,u("timeFormat")))}function r(){if(M){v.css("display","");s.draggable("option","grid",[$,w]);M=false}}var J,M=false,k,D,Z,ja=u("isRTL")?-1:1,ia=U(),la=z(),$=H(),w=T();s.draggable({zIndex:9,scroll:false,grid:[$,w],axis:la==1?"y":false,opacity:u("dragOpacity"),revertDuration:u("dragRevertDuration"),
+start:function(I,R){fa("eventDragStart",s,o,I,R);i(o,s);J=s.position();D=Z=0;ia.start(function(V,ea,aa,va){s.draggable("option","revert",!V);B();if(V){k=va*ja;if(u("allDaySlot")&&!V.row){if(!M){M=true;v.hide();s.draggable("option","grid",null)}E(ba(N(o.start),k),ba(Ua(o),k))}else r()}},I,"drag")},drag:function(I,R){D=Math.round((R.position.top-J.top)/w)*u("slotMinutes");if(D!=Z){M||F(D);Z=D}},stop:function(I,R){var V=ia.stop();B();fa("eventDragStop",s,o,I,R);if(V&&(k||D||M))C(this,o,k,M?0:D,M,I,R);
+else{r();s.css("filter","");s.css(J);F(0);K(o,s)}}})}function Q(o,s,v){var F,r,J=T();s.resizable({handles:{s:"div.ui-resizable-s"},grid:J,start:function(M,k){F=r=0;i(o,s);s.css("z-index",9);fa("eventResizeStart",this,o,M,k)},resize:function(M,k){F=Math.round((Math.max(J,s.height())-k.originalSize.height)/J);if(F!=r){v.text(W(o.start,!F&&!o.end?null:xa(ra(o),u("slotMinutes")*F),u("timeFormat")));r=F}},stop:function(M,k){fa("eventResizeStop",this,o,M,k);if(F)P(this,o,0,u("slotMinutes")*F,M,k);else{s.css("z-index",
+8);K(o,s)}}})}var q=this;q.renderEvents=a;q.compileDaySegs=e;q.clearEvents=b;q.slotSegHtml=l;q.bindDaySeg=j;Qb.call(q);var u=q.opt,fa=q.trigger,oa=q.isEventDraggable,ga=q.isEventResizable,ra=q.eventEnd,sa=q.reportEvents,ha=q.reportEventClear,da=q.eventElementHandlers,na=q.setHeight,ua=q.getDaySegmentContainer,pa=q.getSlotSegmentContainer,U=q.getHoverListener,ca=q.getMaxMinute,ka=q.getMinMinute,qa=q.timePosition,G=q.colContentLeft,p=q.colContentRight,L=q.renderDaySegs,c=q.resizableDayEvent,z=q.getColCnt,
+H=q.getColWidth,T=q.getSlotHeight,X=q.getBodyContent,ya=q.reportEventElement,K=q.showEvents,i=q.hideEvents,C=q.eventDrop,P=q.eventResize,E=q.renderDayOverlay,B=q.clearOverlays,n=q.calendar,Y=n.formatDate,W=n.formatDates}function vc(a){var b,e,d,f,g,l;for(b=a.length-1;b>0;b--){f=a[b];for(e=0;e<f.length;e++){g=f[e];for(d=0;d<a[b-1].length;d++){l=a[b-1][d];if(Cb(g,l))l.forward=Math.max(l.forward||0,(g.forward||0)+1)}}}}function Kb(a,b,e){function d(G,p){G=qa[G];if(typeof G=="object")return jb(G,p||e);
+return G}function f(G,p){return b.trigger.apply(b,[G,p||da].concat(Array.prototype.slice.call(arguments,2),[da]))}function g(G){return j(G)&&!d("disableDragging")}function l(G){return j(G)&&!d("disableResizing")}function j(G){return Ta(G.editable,(G.source||{}).editable,d("editable"))}function t(G){U={};var p,L=G.length,c;for(p=0;p<L;p++){c=G[p];if(U[c._id])U[c._id].push(c);else U[c._id]=[c]}}function y(G){return G.end?N(G.end):na(G)}function S(G,p){ca.push(p);if(ka[G._id])ka[G._id].push(p);else ka[G._id]=
+[p]}function Q(){ca=[];ka={}}function q(G,p){p.click(function(L){if(!p.hasClass("ui-draggable-dragging")&&!p.hasClass("ui-resizable-resizing"))return f("eventClick",this,G,L)}).hover(function(L){f("eventMouseover",this,G,L)},function(L){f("eventMouseout",this,G,L)})}function u(G,p){oa(G,p,"show")}function fa(G,p){oa(G,p,"hide")}function oa(G,p,L){G=ka[G._id];var c,z=G.length;for(c=0;c<z;c++)if(!p||G[c][0]!=p[0])G[c][L]()}function ga(G,p,L,c,z,H,T){var X=p.allDay,ya=p._id;sa(U[ya],L,c,z);f("eventDrop",
+G,p,L,c,z,function(){sa(U[ya],-L,-c,X);pa(ya)},H,T);pa(ya)}function ra(G,p,L,c,z,H){var T=p._id;ha(U[T],L,c);f("eventResize",G,p,L,c,function(){ha(U[T],-L,-c);pa(T)},z,H);pa(T)}function sa(G,p,L,c){L=L||0;for(var z,H=G.length,T=0;T<H;T++){z=G[T];if(c!==ma)z.allDay=c;xa(ba(z.start,p,true),L);if(z.end)z.end=xa(ba(z.end,p,true),L);ua(z,qa)}}function ha(G,p,L){L=L||0;for(var c,z=G.length,H=0;H<z;H++){c=G[H];c.end=xa(ba(y(c),p,true),L);ua(c,qa)}}var da=this;da.element=a;da.calendar=b;da.name=e;da.opt=
+d;da.trigger=f;da.isEventDraggable=g;da.isEventResizable=l;da.reportEvents=t;da.eventEnd=y;da.reportEventElement=S;da.reportEventClear=Q;da.eventElementHandlers=q;da.showEvents=u;da.hideEvents=fa;da.eventDrop=ga;da.eventResize=ra;var na=da.defaultEventEnd,ua=b.normalizeEvent,pa=b.reportEventChange,U={},ca=[],ka={},qa=b.options}function Qb(){function a(i,C){var P=z(),E=pa(),B=U(),n=0,Y,W,o=i.length,s,v;P[0].innerHTML=e(i);d(i,P.children());f(i);g(i,P,C);l(i);j(i);t(i);C=y();for(P=0;P<E;P++){Y=[];for(W=
+0;W<B;W++)Y[W]=0;for(;n<o&&(s=i[n]).row==P;){W=Hb(Y.slice(s.startCol,s.endCol));s.top=W;W+=s.outerHeight;for(v=s.startCol;v<s.endCol;v++)Y[v]=W;n++}C[P].height(Hb(Y))}Q(i,S(C))}function b(i,C,P){var E=m("<div/>"),B=z(),n=i.length,Y;E[0].innerHTML=e(i);E=E.children();B.append(E);d(i,E);l(i);j(i);t(i);Q(i,S(y()));E=[];for(B=0;B<n;B++)if(Y=i[B].element){i[B].row===C&&Y.css("top",P);E.push(Y[0])}return m(E)}function e(i){var C=fa("isRTL"),P,E=i.length,B,n,Y,W;P=ka();var o=P.left,s=P.right,v,F,r,J,M,k=
+"";for(P=0;P<E;P++){B=i[P];n=B.event;W=["fc-event","fc-event-skin","fc-event-hori"];ga(n)&&W.push("fc-event-draggable");if(C){B.isStart&&W.push("fc-corner-right");B.isEnd&&W.push("fc-corner-left");v=p(B.end.getDay()-1);F=p(B.start.getDay());r=B.isEnd?qa(v):o;J=B.isStart?G(F):s}else{B.isStart&&W.push("fc-corner-left");B.isEnd&&W.push("fc-corner-right");v=p(B.start.getDay());F=p(B.end.getDay()-1);r=B.isStart?qa(v):o;J=B.isEnd?G(F):s}W=W.concat(n.className);if(n.source)W=W.concat(n.source.className||
+[]);Y=n.url;M=Jb(n,fa);k+=Y?"<a href='"+Qa(Y)+"'":"<div";k+=" class='"+W.join(" ")+"' style='position:absolute;z-index:8;left:"+r+"px;"+M+"'><div class='fc-event-inner fc-event-skin'"+(M?" style='"+M+"'":"")+">";if(!n.allDay&&B.isStart)k+="<span class='fc-event-time'>"+Qa(T(n.start,n.end,fa("timeFormat")))+"</span>";k+="<span class='fc-event-title'>"+Qa(n.title)+"</span></div>";if(B.isEnd&&ra(n))k+="<div class='ui-resizable-handle ui-resizable-"+(C?"w":"e")+"'>&nbsp;&nbsp;&nbsp;</div>";k+="</"+(Y?
+"a":"div")+">";B.left=r;B.outerWidth=J-r;B.startCol=v;B.endCol=F+1}return k}function d(i,C){var P,E=i.length,B,n,Y;for(P=0;P<E;P++){B=i[P];n=B.event;Y=m(C[P]);n=oa("eventRender",n,n,Y);if(n===false)Y.remove();else{if(n&&n!==true){n=m(n).css({position:"absolute",left:B.left});Y.replaceWith(n);Y=n}B.element=Y}}}function f(i){var C,P=i.length,E,B;for(C=0;C<P;C++){E=i[C];(B=E.element)&&ha(E.event,B)}}function g(i,C,P){var E,B=i.length,n,Y,W;for(E=0;E<B;E++){n=i[E];if(Y=n.element){W=n.event;if(W._id===
+P)H(W,Y,n);else Y[0]._fci=E}}Db(C,i,H)}function l(i){var C,P=i.length,E,B,n,Y,W={};for(C=0;C<P;C++){E=i[C];if(B=E.element){n=E.key=Ib(B[0]);Y=W[n];if(Y===ma)Y=W[n]=pb(B,true);E.hsides=Y}}}function j(i){var C,P=i.length,E,B;for(C=0;C<P;C++){E=i[C];if(B=E.element)B[0].style.width=Math.max(0,E.outerWidth-E.hsides)+"px"}}function t(i){var C,P=i.length,E,B,n,Y,W={};for(C=0;C<P;C++){E=i[C];if(B=E.element){n=E.key;Y=W[n];if(Y===ma)Y=W[n]=Fb(B);E.outerHeight=B[0].offsetHeight+Y}}}function y(){var i,C=pa(),
+P=[];for(i=0;i<C;i++)P[i]=ca(i).find("td:first div.fc-day-content > div");return P}function S(i){var C,P=i.length,E=[];for(C=0;C<P;C++)E[C]=i[C][0].offsetTop;return E}function Q(i,C){var P,E=i.length,B,n;for(P=0;P<E;P++){B=i[P];if(n=B.element){n[0].style.top=C[B.row]+(B.top||0)+"px";B=B.event;oa("eventAfterRender",B,B,n)}}}function q(i,C,P){var E=fa("isRTL"),B=E?"w":"e",n=C.find("div.ui-resizable-"+B),Y=false;qb(C);C.mousedown(function(W){W.preventDefault()}).click(function(W){if(Y){W.preventDefault();
+W.stopImmediatePropagation()}});n.mousedown(function(W){function o(ia){oa("eventResizeStop",this,i,ia);m("body").css("cursor","");s.stop();ya();k&&ua(this,i,k,0,ia);setTimeout(function(){Y=false},0)}if(W.which==1){Y=true;var s=u.getHoverListener(),v=pa(),F=U(),r=E?-1:1,J=E?F-1:0,M=C.css("top"),k,D,Z=m.extend({},i),ja=L(i.start);K();m("body").css("cursor",B+"-resize").one("mouseup",o);oa("eventResizeStart",this,i,W);s.start(function(ia,la){if(ia){var $=Math.max(ja.row,ia.row);ia=ia.col;if(v==1)$=0;
+if($==ja.row)ia=E?Math.min(ja.col,ia):Math.max(ja.col,ia);k=$*7+ia*r+J-(la.row*7+la.col*r+J);la=ba(sa(i),k,true);if(k){Z.end=la;$=D;D=b(c([Z]),P.row,M);D.find("*").css("cursor",B+"-resize");$&&$.remove();na(i)}else if(D){da(i);D.remove();D=null}ya();X(i.start,ba(N(la),1))}},W)}})}var u=this;u.renderDaySegs=a;u.resizableDayEvent=q;var fa=u.opt,oa=u.trigger,ga=u.isEventDraggable,ra=u.isEventResizable,sa=u.eventEnd,ha=u.reportEventElement,da=u.showEvents,na=u.hideEvents,ua=u.eventResize,pa=u.getRowCnt,
+U=u.getColCnt,ca=u.allDayRow,ka=u.allDayBounds,qa=u.colContentLeft,G=u.colContentRight,p=u.dayOfWeekCol,L=u.dateCell,c=u.compileDaySegs,z=u.getDaySegmentContainer,H=u.bindDaySeg,T=u.calendar.formatDates,X=u.renderDayOverlay,ya=u.clearOverlays,K=u.clearSelection}function Mb(){function a(Q,q,u){b();q||(q=j(Q,u));t(Q,q,u);e(Q,q,u)}function b(Q){if(S){S=false;y();l("unselect",null,Q)}}function e(Q,q,u,fa){S=true;l("select",null,Q,q,u,fa)}function d(Q){var q=f.cellDate,u=f.cellIsAllDay,fa=f.getHoverListener(),
+oa=f.reportDayClick;if(Q.which==1&&g("selectable")){b(Q);var ga;fa.start(function(ra,sa){y();if(ra&&u(ra)){ga=[q(sa),q(ra)].sort(Gb);t(ga[0],ga[1],true)}else ga=null},Q);m(document).one("mouseup",function(ra){fa.stop();if(ga){+ga[0]==+ga[1]&&oa(ga[0],true,ra);e(ga[0],ga[1],true,ra)}})}}var f=this;f.select=a;f.unselect=b;f.reportSelection=e;f.daySelectionMousedown=d;var g=f.opt,l=f.trigger,j=f.defaultSelectionEnd,t=f.renderSelection,y=f.clearSelection,S=false;g("selectable")&&g("unselectAuto")&&m(document).mousedown(function(Q){var q=
+g("unselectCancel");if(q)if(m(Q.target).parents(q).length)return;b(Q)})}function Lb(){function a(g,l){var j=f.shift();j||(j=m("<div class='fc-cell-overlay' style='position:absolute;z-index:3'/>"));j[0].parentNode!=l[0]&&j.appendTo(l);d.push(j.css(g).show());return j}function b(){for(var g;g=d.shift();)f.push(g.hide().unbind())}var e=this;e.renderOverlay=a;e.clearOverlays=b;var d=[],f=[]}function Nb(a){var b=this,e,d;b.build=function(){e=[];d=[];a(e,d)};b.cell=function(f,g){var l=e.length,j=d.length,
+t,y=-1,S=-1;for(t=0;t<l;t++)if(g>=e[t][0]&&g<e[t][1]){y=t;break}for(t=0;t<j;t++)if(f>=d[t][0]&&f<d[t][1]){S=t;break}return y>=0&&S>=0?{row:y,col:S}:null};b.rect=function(f,g,l,j,t){t=t.offset();return{top:e[f][0]-t.top,left:d[g][0]-t.left,width:d[j][1]-d[g][0],height:e[l][1]-e[f][0]}}}function Ob(a){function b(j){xc(j);j=a.cell(j.pageX,j.pageY);if(!j!=!l||j&&(j.row!=l.row||j.col!=l.col)){if(j){g||(g=j);f(j,g,j.row-g.row,j.col-g.col)}else f(j,g);l=j}}var e=this,d,f,g,l;e.start=function(j,t,y){f=j;
+g=l=null;a.build();b(t);d=y||"mousemove";m(document).bind(d,b)};e.stop=function(){m(document).unbind(d,b);return l}}function xc(a){if(a.pageX===ma){a.pageX=a.originalEvent.pageX;a.pageY=a.originalEvent.pageY}}function Pb(a){function b(l){return d[l]=d[l]||a(l)}var e=this,d={},f={},g={};e.left=function(l){return f[l]=f[l]===ma?b(l).position().left:f[l]};e.right=function(l){return g[l]=g[l]===ma?e.left(l)+b(l).width():g[l]};e.clear=function(){d={};f={};g={}}}var Ya={defaultView:"month",aspectRatio:1.35,
+header:{left:"title",center:"",right:"today prev,next"},weekends:true,allDayDefault:true,ignoreTimezone:true,lazyFetching:true,startParam:"start",endParam:"end",titleFormat:{month:"MMMM yyyy",week:"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",day:"dddd, MMM d, yyyy"},columnFormat:{month:"ddd",week:"ddd M/d",day:"dddd M/d"},timeFormat:{"":"h(:mm)t"},isRTL:false,firstDay:0,monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan",
+"Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],buttonText:{prev:"&nbsp;&#9668;&nbsp;",next:"&nbsp;&#9658;&nbsp;",prevYear:"&nbsp;&lt;&lt;&nbsp;",nextYear:"&nbsp;&gt;&gt;&nbsp;",today:"today",month:"month",week:"week",day:"day"},theme:false,buttonIcons:{prev:"circle-triangle-w",next:"circle-triangle-e"},unselectAuto:true,dropAccept:"*"},yc=
+{header:{left:"next,prev today",center:"",right:"title"},buttonText:{prev:"&nbsp;&#9658;&nbsp;",next:"&nbsp;&#9668;&nbsp;",prevYear:"&nbsp;&gt;&gt;&nbsp;",nextYear:"&nbsp;&lt;&lt;&nbsp;"},buttonIcons:{prev:"circle-triangle-e",next:"circle-triangle-w"}},Aa=m.fullCalendar={version:"1.5.3"},Ja=Aa.views={};m.fn.fullCalendar=function(a){if(typeof a=="string"){var b=Array.prototype.slice.call(arguments,1),e;this.each(function(){var f=m.data(this,"fullCalendar");if(f&&m.isFunction(f[a])){f=f[a].apply(f,
+b);if(e===ma)e=f;a=="destroy"&&m.removeData(this,"fullCalendar")}});if(e!==ma)return e;return this}var d=a.eventSources||[];delete a.eventSources;if(a.events){d.push(a.events);delete a.events}a=m.extend(true,{},Ya,a.isRTL||a.isRTL===ma&&Ya.isRTL?yc:{},a);this.each(function(f,g){f=m(g);g=new Yb(f,a,d);f.data("fullCalendar",g);g.render()});return this};Aa.sourceNormalizers=[];Aa.sourceFetchers=[];var ac={dataType:"json",cache:false},bc=1;Aa.addDays=ba;Aa.cloneDate=N;Aa.parseDate=kb;Aa.parseISO8601=
+Bb;Aa.parseTime=mb;Aa.formatDate=Oa;Aa.formatDates=ib;var lc=["sun","mon","tue","wed","thu","fri","sat"],Ab=864E5,cc=36E5,wc=6E4,dc={s:function(a){return a.getSeconds()},ss:function(a){return Pa(a.getSeconds())},m:function(a){return a.getMinutes()},mm:function(a){return Pa(a.getMinutes())},h:function(a){return a.getHours()%12||12},hh:function(a){return Pa(a.getHours()%12||12)},H:function(a){return a.getHours()},HH:function(a){return Pa(a.getHours())},d:function(a){return a.getDate()},dd:function(a){return Pa(a.getDate())},
+ddd:function(a,b){return b.dayNamesShort[a.getDay()]},dddd:function(a,b){return b.dayNames[a.getDay()]},M:function(a){return a.getMonth()+1},MM:function(a){return Pa(a.getMonth()+1)},MMM:function(a,b){return b.monthNamesShort[a.getMonth()]},MMMM:function(a,b){return b.monthNames[a.getMonth()]},yy:function(a){return(a.getFullYear()+"").substring(2)},yyyy:function(a){return a.getFullYear()},t:function(a){return a.getHours()<12?"a":"p"},tt:function(a){return a.getHours()<12?"am":"pm"},T:function(a){return a.getHours()<
+12?"A":"P"},TT:function(a){return a.getHours()<12?"AM":"PM"},u:function(a){return Oa(a,"yyyy-MM-dd'T'HH:mm:ss'Z'")},S:function(a){a=a.getDate();if(a>10&&a<20)return"th";return["st","nd","rd"][a%10-1]||"th"}};Aa.applyAll=$a;Ja.month=mc;Ja.basicWeek=nc;Ja.basicDay=oc;wb({weekMode:"fixed"});Ja.agendaWeek=qc;Ja.agendaDay=rc;wb({allDaySlot:true,allDayText:"all-day",firstHour:6,slotMinutes:30,defaultEventMinutes:120,axisFormat:"h(:mm)tt",timeFormat:{agenda:"h:mm{ - h:mm}"},dragOpacity:{agenda:0.5},minTime:0,
+maxTime:24})})(jQuery);
diff --git a/library/fullcalendar/fullcalendar.print.css b/library/fullcalendar/fullcalendar.print.css
new file mode 100644
index 000000000..e11c18163
--- /dev/null
+++ b/library/fullcalendar/fullcalendar.print.css
@@ -0,0 +1,61 @@
+/*
+ * FullCalendar v1.5.3 Print Stylesheet
+ *
+ * Include this stylesheet on your page to get a more printer-friendly calendar.
+ * When including this stylesheet, use the media='print' attribute of the <link> tag.
+ * Make sure to include this stylesheet IN ADDITION to the regular fullcalendar.css.
+ *
+ * Copyright (c) 2011 Adam Shaw
+ * Dual licensed under the MIT and GPL licenses, located in
+ * MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
+ *
+ * Date: Mon Feb 6 22:40:40 2012 -0800
+ *
+ */
+
+
+ /* Events
+-----------------------------------------------------*/
+
+.fc-event-skin {
+ background: none !important;
+ color: #000 !important;
+ }
+
+/* horizontal events */
+
+.fc-event-hori {
+ border-width: 0 0 1px 0 !important;
+ border-bottom-style: dotted !important;
+ border-bottom-color: #000 !important;
+ padding: 1px 0 0 0 !important;
+ }
+
+.fc-event-hori .fc-event-inner {
+ border-width: 0 !important;
+ padding: 0 1px !important;
+ }
+
+/* vertical events */
+
+.fc-event-vert {
+ border-width: 0 0 0 1px !important;
+ border-left-style: dotted !important;
+ border-left-color: #000 !important;
+ padding: 0 1px 0 0 !important;
+ }
+
+.fc-event-vert .fc-event-inner {
+ border-width: 0 !important;
+ padding: 1px 0 !important;
+ }
+
+.fc-event-bg {
+ display: none !important;
+ }
+
+.fc-event .ui-resizable-handle {
+ display: none !important;
+ }
+
+
diff --git a/library/fullcalendar/gcal.js b/library/fullcalendar/gcal.js
new file mode 100644
index 000000000..e9bbe26d8
--- /dev/null
+++ b/library/fullcalendar/gcal.js
@@ -0,0 +1,112 @@
+/*
+ * FullCalendar v1.5.3 Google Calendar Plugin
+ *
+ * Copyright (c) 2011 Adam Shaw
+ * Dual licensed under the MIT and GPL licenses, located in
+ * MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
+ *
+ * Date: Mon Feb 6 22:40:40 2012 -0800
+ *
+ */
+
+(function($) {
+
+
+var fc = $.fullCalendar;
+var formatDate = fc.formatDate;
+var parseISO8601 = fc.parseISO8601;
+var addDays = fc.addDays;
+var applyAll = fc.applyAll;
+
+
+fc.sourceNormalizers.push(function(sourceOptions) {
+ if (sourceOptions.dataType == 'gcal' ||
+ sourceOptions.dataType === undefined &&
+ (sourceOptions.url || '').match(/^(http|https):\/\/www.google.com\/calendar\/feeds\//)) {
+ sourceOptions.dataType = 'gcal';
+ if (sourceOptions.editable === undefined) {
+ sourceOptions.editable = false;
+ }
+ }
+});
+
+
+fc.sourceFetchers.push(function(sourceOptions, start, end) {
+ if (sourceOptions.dataType == 'gcal') {
+ return transformOptions(sourceOptions, start, end);
+ }
+});
+
+
+function transformOptions(sourceOptions, start, end) {
+
+ var success = sourceOptions.success;
+ var data = $.extend({}, sourceOptions.data || {}, {
+ 'start-min': formatDate(start, 'u'),
+ 'start-max': formatDate(end, 'u'),
+ 'singleevents': true,
+ 'max-results': 9999
+ });
+
+ var ctz = sourceOptions.currentTimezone;
+ if (ctz) {
+ data.ctz = ctz = ctz.replace(' ', '_');
+ }
+
+ return $.extend({}, sourceOptions, {
+ url: sourceOptions.url.replace(/\/basic$/, '/full') + '?alt=json-in-script&callback=?',
+ dataType: 'jsonp',
+ data: data,
+ startParam: false,
+ endParam: false,
+ success: function(data) {
+ var events = [];
+ if (data.feed.entry) {
+ $.each(data.feed.entry, function(i, entry) {
+ var startStr = entry['gd$when'][0]['startTime'];
+ var start = parseISO8601(startStr, true);
+ var end = parseISO8601(entry['gd$when'][0]['endTime'], true);
+ var allDay = startStr.indexOf('T') == -1;
+ var url;
+ $.each(entry.link, function(i, link) {
+ if (link.type == 'text/html') {
+ url = link.href;
+ if (ctz) {
+ url += (url.indexOf('?') == -1 ? '?' : '&') + 'ctz=' + ctz;
+ }
+ }
+ });
+ if (allDay) {
+ addDays(end, -1); // make inclusive
+ }
+ events.push({
+ id: entry['gCal$uid']['value'],
+ title: entry['title']['$t'],
+ url: url,
+ start: start,
+ end: end,
+ allDay: allDay,
+ location: entry['gd$where'][0]['valueString'],
+ description: entry['content']['$t']
+ });
+ });
+ }
+ var args = [events].concat(Array.prototype.slice.call(arguments, 1));
+ var res = applyAll(success, this, args);
+ if ($.isArray(res)) {
+ return res;
+ }
+ return events;
+ }
+ });
+
+}
+
+
+// legacy
+fc.gcalFeed = function(url, sourceOptions) {
+ return $.extend({}, sourceOptions, { url: url, dataType: 'gcal' });
+};
+
+
+})(jQuery);
diff --git a/library/slinky.php b/library/slinky.php
index 51432c3f5..cae1f755f 100755
--- a/library/slinky.php
+++ b/library/slinky.php
@@ -153,7 +153,7 @@ class Slinky {
public function set_service_from_url( $url = false ) {
if ( !$url )
$url = $this->url;
-
+
$host = parse_url( $url, PHP_URL_HOST );
switch ( str_replace( 'www.', '', $host ) ) {
case 'bit.ly':
@@ -181,6 +181,11 @@ class Slinky {
$this->service = new Slinky_Fongs();
break;
}
+ case $this->get( 'yourls-url' ):
+ if ( class_exists( 'Slinky_YourLS' ) ) {
+ $this->service = new Slinky_YourLS();
+ break;
+ }
case 'micurl.com':
if ( class_exists( 'Slinky_Micurl' ) ) {
$this->service = new Slinky_Micurl();
@@ -574,6 +579,31 @@ class Slinky_Fongs extends Slinky_Service {
}
}
+// yourls
+class Slinky_YourLS extends Slinky_Service {
+ function url_is_short( $url ) {
+ return stristr( $url, 'shit.li/' );
+ }
+
+ function url_is_long( $url ) {
+ return !stristr( $url, 'shit.li/' );
+ }
+
+ function make_short( $url ) {
+ echo $this->get( 'username' );
+ $use_ssl = $this->get( 'ssl' );
+ if ( $use_ssl )
+ $use_ssl = 's';
+ else
+ $use_ssl = '';
+ $result = $this->url_get( 'http'. $use_ssl . '://' . $this->get( 'yourls-url' ) . '/yourls-api.php?username=' . $this->get( 'username' ) . '&password=' . $this->get( 'password' ) . '&action=shorturl&format=simple&url=' . urlencode( $url ) );
+ if ( 1 != $result && 2 != $result )
+ return $result;
+ else
+ return $url;
+ }
+}
+
// Micu.rl
class Slinky_Micurl extends Slinky_Service {
function url_is_short( $url ) {
diff --git a/library/spam/README b/library/spam/README
new file mode 100644
index 000000000..a0d67fca7
--- /dev/null
+++ b/library/spam/README
@@ -0,0 +1,12 @@
+B8 for Friendica
+
+B8 is an excellent bayesian spam implementation for PHP. However when evaluating it for use in Friendica there were a few shortcomings. B8's primary audience is guestbooks and blogs - single user situations.
+
+Friendica is a multi-user distributed social environment. So the first thing we need to add to b8 is a concept of user ID.
+
+Second we don't want to use a second stored set of DB login credentials so we're going to implemetn Friendica's MySQL driver and use our existing connection and credentials.
+
+The third requirement is that the B8 processing model is to load a set of word/data sets from the DB, perform processing (which may change the value of the data) and then store the results back to the DB. We're in a highly dynamic environment with lots of sometimes concurrent message processing. So the plan is to alter the storage architecture to read data in, do processing, and then apply a somewhat atomic change operation where the changes are performed in a single query using the current data in storage rather than something passed through outside processing and where the data may be outdated come time to store it.
+
+In accordance with the LGPL of the B8 package these changes are available in source form at http://github.com/friendica/friendica in the directory library/spam
+ \ No newline at end of file
diff --git a/library/spam/b8/b8.php b/library/spam/b8/b8.php
new file mode 100644
index 000000000..28a3dd29f
--- /dev/null
+++ b/library/spam/b8/b8.php
@@ -0,0 +1,503 @@
+<?php
+
+# Copyright (C) 2006-2010 Tobias Leupold <tobias.leupold@web.de>
+#
+# b8 - A Bayesian spam filter written in PHP 5
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation in version 2.1 of the License.
+#
+# This program 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 Lesser General Public
+# License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+/**
+ * Copyright (C) 2006-2010 Tobias Leupold <tobias.leupold@web.de>
+ *
+ * @license LGPL
+ * @access public
+ * @package b8
+ * @author Tobias Leupold
+ * @author Oliver Lillie (aka buggedcom) (original PHP 5 port)
+ */
+
+class b8
+{
+
+ public $config = array(
+ 'min_size' => 3,
+ 'max_size' => 30,
+ 'allow_numbers' => FALSE,
+ 'lexer' => 'default',
+ 'degenerator' => 'default',
+ 'storage' => 'dba',
+ 'use_relevant' => 15,
+ 'min_dev' => 0.2,
+ 'rob_s' => 0.3,
+ 'rob_x' => 0.5
+ );
+
+ private $_lexer = NULL;
+ private $_database = NULL;
+ private $_token_data = NULL;
+
+ const SPAM = 'spam';
+ const HAM = 'ham';
+ const LEARN = 'learn';
+ const UNLEARN = 'unlearn';
+
+ const STARTUP_FAIL_DATABASE = 'STARTUP_FAIL_DATABASE';
+ const STARTUP_FAIL_LEXER = 'STARTUP_FAIL_LEXER';
+ const TRAINER_CATEGORY_FAIL = 'TRAINER_CATEGORY_FAIL';
+
+ /**
+ * Constructs b8
+ *
+ * @access public
+ * @return void
+ */
+
+ function __construct($config = array(), $database_config)
+ {
+
+ # Validate config data
+
+ if(count($config) > 0) {
+
+ foreach ($config as $name=>$value) {
+
+ switch($name) {
+
+ case 'min_dev':
+ case 'rob_s':
+ case 'rob_x':
+ $this->config[$name] = (float) $value;
+ break;
+
+ case 'min_size':
+ case 'max_size':
+ case 'use_relevant':
+ $this->config[$name] = (int) $value;
+ break;
+
+ case 'allow_numbers':
+ $this->config[$name] = (bool) $value;
+ break;
+
+ case 'lexer':
+ $value = (string) strtolower($value);
+ $this->config[$name] = is_file(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'lexer' . DIRECTORY_SEPARATOR . "lexer_" . $value . '.php') === TRUE ? $value : 'default';
+ break;
+
+ case 'storage':
+ $this->config[$name] = (string) $value;
+ break;
+
+ }
+
+ }
+
+ }
+
+ # Setup the database backend
+
+ # Get the basic storage class used by all backends
+ if($this->load_class('b8_storage_base', dirname(__FILE__) . DIRECTORY_SEPARATOR . 'storage' . DIRECTORY_SEPARATOR . 'storage_base.php') === FALSE)
+ return;
+
+ # Get the degenerator we need
+ if($this->load_class('b8_degenerator_' . $this->config['degenerator'], dirname(__FILE__) . DIRECTORY_SEPARATOR . 'degenerator' . DIRECTORY_SEPARATOR . 'degenerator_' . $this->config['degenerator'] . '.php') === FALSE)
+ return;
+
+ # Get the actual storage backend we need
+ if($this->load_class('b8_storage_' . $this->config['storage'], dirname(__FILE__) . DIRECTORY_SEPARATOR . 'storage' . DIRECTORY_SEPARATOR . 'storage_' . $this->config['storage'] . '.php') === FALSE)
+ return;
+
+ # Setup the backend
+ $class = 'b8_storage_' . $this->config['storage'];
+ $this->_database = new $class(
+ $database_config,
+ $this->config['degenerator'], date('ymd')
+ );
+
+ # Setup the lexer class
+
+ if($this->load_class('b8_lexer_' . $this->config['lexer'], dirname(__FILE__) . DIRECTORY_SEPARATOR . 'lexer' . DIRECTORY_SEPARATOR . 'lexer_' . $this->config['lexer'] . '.php') === FALSE)
+ return;
+
+ $class = 'b8_lexer_' . $this->config['lexer'];
+ $this->_lexer = new $class(
+ array(
+ 'min_size' => $this->config['min_size'],
+ 'max_size' => $this->config['max_size'],
+ 'allow_numbers' => $this->config['allow_numbers']
+ )
+ );
+
+ }
+
+ /**
+ * Load a class file if a class has not been defined yet.
+ *
+ * @access public
+ * @return boolean Returns TRUE if everything is okay, otherwise FALSE.
+ */
+
+ public function load_class($class_name, $class_file)
+ {
+
+ if(class_exists($class_name, FALSE) === FALSE) {
+
+ $included = require_once $class_file;
+
+ if($included === FALSE or class_exists($class_name, FALSE) === FALSE)
+ return FALSE;
+
+ }
+
+ return TRUE;
+
+ }
+
+ /**
+ * Validates the class has all it needs to work.
+ *
+ * @access public
+ * @return mixed Returns TRUE if everything is okay, otherwise an error code.
+ */
+
+ public function validate()
+ {
+
+ if($this->_database === NULL)
+ return self::STARTUP_FAIL_DATABASE;
+
+ # Connect the database backend if we aren't connected yet
+
+ elseif($this->_database->connected === FALSE) {
+
+ $connection = $this->_database->connect();
+
+ if($connection !== TRUE)
+ return $connection;
+
+ }
+
+ if($this->_lexer === NULL)
+ return self::STARTUP_FAIL_LEXER;
+
+ return TRUE;
+
+ }
+
+ /**
+ * Classifies a text
+ *
+ * @access public
+ * @package default
+ * @param string $text
+ * @return float The rating between 0 (ham) and 1 (spam)
+ */
+
+ public function classify($uid,$text)
+ {
+
+ # Validate the startup
+
+ $started_up = $this->validate();
+
+ if($started_up !== TRUE)
+ return $started_up;
+
+ # Get the internal database variables, containing the number of ham and
+ # spam texts so the spam probability can be calculated in relation to them
+ $internals = $this->_database->get_internals($uid);
+
+ # Calculate the spamminess of all tokens
+
+ # Get all tokens we want to rate
+
+ $tokens = $this->_lexer->get_tokens($text);
+
+ # Check if the lexer failed
+ # (if so, $tokens will be a lexer error code, if not, $tokens will be an array)
+ if(!is_array($tokens))
+ return $tokens;
+
+ # Fetch all availible data for the token set from the database
+ $this->_token_data = $this->_database->get(array_keys($tokens),$uid);
+
+ # Calculate the spamminess and importance for each token (or a degenerated form of it)
+
+ $word_count = array();
+ $rating = array();
+ $importance = array();
+
+ foreach($tokens as $word => $count) {
+
+ $word_count[$word] = $count;
+
+ # Although we only call this function only here ... let's do the
+ # calculation stuff in a function to make this a bit less confusing ;-)
+ $rating[$word] = $this->_get_probability($word, $internals['texts_ham'], $internals['texts_spam']);
+
+ $importance[$word] = abs(0.5 - $rating[$word]);
+
+ }
+
+ # Order by importance
+ arsort($importance);
+ reset($importance);
+
+ # Get the most interesting tokens (use all if we have less than the given number)
+
+ $relevant = array();
+
+ for($i = 0; $i < $this->config['use_relevant']; $i++) {
+
+ if($tmp = each($importance)) {
+
+ # Important tokens remain
+
+ # If the token's rating is relevant enough, use it
+
+ if(abs(0.5 - $rating[$tmp['key']]) > $this->config['min_dev']) {
+
+ # Tokens that appear more than once also count more than once
+
+ for($x = 0, $l = $word_count[$tmp['key']]; $x < $l; $x++)
+ array_push($relevant, $rating[$tmp['key']]);
+
+ }
+
+ }
+
+ else {
+ # We have less than words to use, so we already
+ # use what we have and can break here
+ break;
+ }
+
+ }
+
+ # Calculate the spamminess of the text (thanks to Mr. Robinson ;-)
+ # We set both hamminess and Spamminess to 1 for the first multiplying
+ $hamminess = 1;
+ $spamminess = 1;
+
+ # Consider all relevant ratings
+ foreach($relevant as $value) {
+ $hamminess *= (1.0 - $value);
+ $spamminess *= $value;
+ }
+
+ # If no token was good for calculation, we really don't know how
+ # to rate this text; so we assume a spam and ham probability of 0.5
+
+ if($hamminess === 1 and $spamminess === 1) {
+ $hamminess = 0.5;
+ $spamminess = 0.5;
+ $n = 1;
+ }
+ else {
+ # Get the number of relevant ratings
+ $n = count($relevant);
+ }
+
+ # Calculate the combined rating
+
+ # The actual hamminess and spamminess
+ $hamminess = 1 - pow($hamminess, (1 / $n));
+ $spamminess = 1 - pow($spamminess, (1 / $n));
+
+ # Calculate the combined indicator
+ $probability = ($hamminess - $spamminess) / ($hamminess + $spamminess);
+
+ # We want a value between 0 and 1, not between -1 and +1, so ...
+ $probability = (1 + $probability) / 2;
+
+ # Alea iacta est
+ return $probability;
+
+ }
+
+ /**
+ * Calculate the spamminess of a single token also considering "degenerated" versions
+ *
+ * @access private
+ * @param string $word
+ * @param string $texts_ham
+ * @param string $texts_spam
+ * @return void
+ */
+
+ private function _get_probability($word, $texts_ham, $texts_spam)
+ {
+
+ # Let's see what we have!
+
+ if(isset($this->_token_data['tokens'][$word]) === TRUE) {
+ # The token was in the database, so we can use it's data as-is
+ # and calculate the spamminess of this token directly
+ return $this->_calc_probability($this->_token_data['tokens'][$word], $texts_ham, $texts_spam);
+ }
+
+ # Damn. The token was not found, so do we have at least similar words?
+
+ if(isset($this->_token_data['degenerates'][$word]) === TRUE) {
+
+ # We found similar words, so calculate the spamminess for each one
+ # and choose the most important one for the further calculation
+
+ # The default rating is 0.5 simply saying nothing
+ $rating = 0.5;
+
+ foreach($this->_token_data['degenerates'][$word] as $degenerate => $count) {
+
+ # Calculate the rating of the current degenerated token
+ $rating_tmp = $this->_calc_probability($count, $texts_ham, $texts_spam);
+
+ # Is it more important than the rating of another degenerated version?
+ if(abs(0.5 - $rating_tmp) > abs(0.5 - $rating))
+ $rating = $rating_tmp;
+
+ }
+
+ return $rating;
+
+ }
+
+ else {
+ # The token is really unknown, so choose the default rating
+ # for completely unknown tokens. This strips down to the
+ # robX parameter so we can cheap out the freaky math ;-)
+ return $this->config['rob_x'];
+ }
+
+ }
+
+ /**
+ * Do the actual spamminess calculation of a single token
+ *
+ * @access private
+ * @param array $data
+ * @param string $texts_ham
+ * @param string $texts_spam
+ * @return void
+ */
+
+ private function _calc_probability($data, $texts_ham, $texts_spam)
+ {
+
+ # Calculate the basic probability by Mr. Graham
+
+ # But: consider the number of ham and spam texts saved instead of the
+ # number of entries where the token appeared to calculate a relative
+ # spamminess because we count tokens appearing multiple times not just
+ # once but as often as they appear in the learned texts
+
+ $rel_ham = $data['count_ham'];
+ $rel_spam = $data['count_spam'];
+
+ if($texts_ham > 0)
+ $rel_ham = $data['count_ham'] / $texts_ham;
+
+ if($texts_spam > 0)
+ $rel_spam = $data['count_spam'] / $texts_spam;
+
+ $rating = $rel_spam / ($rel_ham + $rel_spam);
+
+ # Calculate the better probability proposed by Mr. Robinson
+ $all = $data['count_ham'] + $data['count_spam'];
+ return (($this->config['rob_s'] * $this->config['rob_x']) + ($all * $rating)) / ($this->config['rob_s'] + $all);
+
+ }
+
+ /**
+ * Check the validity of the category of a request
+ *
+ * @access private
+ * @param string $category
+ * @return void
+ */
+
+ private function _check_category($category)
+ {
+ return $category === self::HAM or $category === self::SPAM;
+ }
+
+ /**
+ * Learn a reference text
+ *
+ * @access public
+ * @param string $text
+ * @param const $category Either b8::SPAM or b8::HAM
+ * @return void
+ */
+
+ public function learn($text, $category, $uid)
+ {
+ return $this->_process_text($text, $category, self::LEARN, $uid);
+ }
+
+ /**
+ * Unlearn a reference text
+ *
+ * @access public
+ * @param string $text
+ * @param const $category Either b8::SPAM or b8::HAM
+ * @return void
+ */
+
+ public function unlearn($text, $category, $uid)
+ {
+ return $this->_process_text($text, $category, self::UNLEARN, $uid);
+ }
+
+ /**
+ * Does the actual interaction with the storage backend for learning or unlearning texts
+ *
+ * @access private
+ * @param string $text
+ * @param const $category Either b8::SPAM or b8::HAM
+ * @param const $action Either b8::LEARN or b8::UNLEARN
+ * @return void
+ */
+
+ private function _process_text($text, $category, $action, $uid = 0)
+ {
+
+ # Validate the startup
+
+ $started_up = $this->validate();
+
+ if($started_up !== TRUE)
+ return $started_up;
+
+ # Look if the request is okay
+ if($this->_check_category($category) === FALSE)
+ return self::TRAINER_CATEGORY_FAIL;
+
+ # Get all tokens from $text
+
+ $tokens = $this->_lexer->get_tokens($text);
+
+ # Check if the lexer failed
+ # (if so, $tokens will be a lexer error code, if not, $tokens will be an array)
+ if(!is_array($tokens))
+ return $tokens;
+
+ # Pass the tokens and what to do with it to the storage backend
+ return $this->_database->process_text($tokens, $category, $action, $uid);
+
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/library/spam/b8/b8.php.ORIG b/library/spam/b8/b8.php.ORIG
new file mode 100644
index 000000000..ea1e15ffa
--- /dev/null
+++ b/library/spam/b8/b8.php.ORIG
@@ -0,0 +1,503 @@
+<?php
+
+# Copyright (C) 2006-2010 Tobias Leupold <tobias.leupold@web.de>
+#
+# b8 - A Bayesian spam filter written in PHP 5
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation in version 2.1 of the License.
+#
+# This program 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 Lesser General Public
+# License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+/**
+ * Copyright (C) 2006-2010 Tobias Leupold <tobias.leupold@web.de>
+ *
+ * @license LGPL
+ * @access public
+ * @package b8
+ * @author Tobias Leupold
+ * @author Oliver Lillie (aka buggedcom) (original PHP 5 port)
+ */
+
+class b8
+{
+
+ public $config = array(
+ 'min_size' => 3,
+ 'max_size' => 30,
+ 'allow_numbers' => FALSE,
+ 'lexer' => 'default',
+ 'degenerator' => 'default',
+ 'storage' => 'dba',
+ 'use_relevant' => 15,
+ 'min_dev' => 0.2,
+ 'rob_s' => 0.3,
+ 'rob_x' => 0.5
+ );
+
+ private $_lexer = NULL;
+ private $_database = NULL;
+ private $_token_data = NULL;
+
+ const SPAM = 'spam';
+ const HAM = 'ham';
+ const LEARN = 'learn';
+ const UNLEARN = 'unlearn';
+
+ const STARTUP_FAIL_DATABASE = 'STARTUP_FAIL_DATABASE';
+ const STARTUP_FAIL_LEXER = 'STARTUP_FAIL_LEXER';
+ const TRAINER_CATEGORY_FAIL = 'TRAINER_CATEGORY_FAIL';
+
+ /**
+ * Constructs b8
+ *
+ * @access public
+ * @return void
+ */
+
+ function __construct($config = array(), $database_config)
+ {
+
+ # Validate config data
+
+ if(count($config) > 0) {
+
+ foreach ($config as $name=>$value) {
+
+ switch($name) {
+
+ case 'min_dev':
+ case 'rob_s':
+ case 'rob_x':
+ $this->config[$name] = (float) $value;
+ break;
+
+ case 'min_size':
+ case 'max_size':
+ case 'use_relevant':
+ $this->config[$name] = (int) $value;
+ break;
+
+ case 'allow_numbers':
+ $this->config[$name] = (bool) $value;
+ break;
+
+ case 'lexer':
+ $value = (string) strtolower($value);
+ $this->config[$name] = is_file(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'lexer' . DIRECTORY_SEPARATOR . "lexer_" . $value . '.php') === TRUE ? $value : 'default';
+ break;
+
+ case 'storage':
+ $this->config[$name] = (string) $value;
+ break;
+
+ }
+
+ }
+
+ }
+
+ # Setup the database backend
+
+ # Get the basic storage class used by all backends
+ if($this->load_class('b8_storage_base', dirname(__FILE__) . DIRECTORY_SEPARATOR . 'storage' . DIRECTORY_SEPARATOR . 'storage_base.php') === FALSE)
+ return;
+
+ # Get the degenerator we need
+ if($this->load_class('b8_degenerator_' . $this->config['degenerator'], dirname(__FILE__) . DIRECTORY_SEPARATOR . 'degenerator' . DIRECTORY_SEPARATOR . 'degenerator_' . $this->config['degenerator'] . '.php') === FALSE)
+ return;
+
+ # Get the actual storage backend we need
+ if($this->load_class('b8_storage_' . $this->config['storage'], dirname(__FILE__) . DIRECTORY_SEPARATOR . 'storage' . DIRECTORY_SEPARATOR . 'storage_' . $this->config['storage'] . '.php') === FALSE)
+ return;
+
+ # Setup the backend
+ $class = 'b8_storage_' . $this->config['storage'];
+ $this->_database = new $class(
+ $database_config,
+ $this->config['degenerator'], date('ymd')
+ );
+
+ # Setup the lexer class
+
+ if($this->load_class('b8_lexer_' . $this->config['lexer'], dirname(__FILE__) . DIRECTORY_SEPARATOR . 'lexer' . DIRECTORY_SEPARATOR . 'lexer_' . $this->config['lexer'] . '.php') === FALSE)
+ return;
+
+ $class = 'b8_lexer_' . $this->config['lexer'];
+ $this->_lexer = new $class(
+ array(
+ 'min_size' => $this->config['min_size'],
+ 'max_size' => $this->config['max_size'],
+ 'allow_numbers' => $this->config['allow_numbers']
+ )
+ );
+
+ }
+
+ /**
+ * Load a class file if a class has not been defined yet.
+ *
+ * @access public
+ * @return boolean Returns TRUE if everything is okay, otherwise FALSE.
+ */
+
+ public function load_class($class_name, $class_file)
+ {
+
+ if(class_exists($class_name, FALSE) === FALSE) {
+
+ $included = require_once $class_file;
+
+ if($included === FALSE or class_exists($class_name, FALSE) === FALSE)
+ return FALSE;
+
+ }
+
+ return TRUE;
+
+ }
+
+ /**
+ * Validates the class has all it needs to work.
+ *
+ * @access public
+ * @return mixed Returns TRUE if everything is okay, otherwise an error code.
+ */
+
+ public function validate()
+ {
+
+ if($this->_database === NULL)
+ return self::STARTUP_FAIL_DATABASE;
+
+ # Connect the database backend if we aren't connected yet
+
+ elseif($this->_database->connected === FALSE) {
+
+ $connection = $this->_database->connect();
+
+ if($connection !== TRUE)
+ return $connection;
+
+ }
+
+ if($this->_lexer === NULL)
+ return self::STARTUP_FAIL_LEXER;
+
+ return TRUE;
+
+ }
+
+ /**
+ * Classifies a text
+ *
+ * @access public
+ * @package default
+ * @param string $text
+ * @return float The rating between 0 (ham) and 1 (spam)
+ */
+
+ public function classify($text)
+ {
+
+ # Validate the startup
+
+ $started_up = $this->validate();
+
+ if($started_up !== TRUE)
+ return $started_up;
+
+ # Get the internal database variables, containing the number of ham and
+ # spam texts so the spam probability can be calculated in relation to them
+ $internals = $this->_database->get_internals();
+
+ # Calculate the spamminess of all tokens
+
+ # Get all tokens we want to rate
+
+ $tokens = $this->_lexer->get_tokens($text);
+
+ # Check if the lexer failed
+ # (if so, $tokens will be a lexer error code, if not, $tokens will be an array)
+ if(!is_array($tokens))
+ return $tokens;
+
+ # Fetch all availible data for the token set from the database
+ $this->_token_data = $this->_database->get(array_keys($tokens));
+
+ # Calculate the spamminess and importance for each token (or a degenerated form of it)
+
+ $word_count = array();
+ $rating = array();
+ $importance = array();
+
+ foreach($tokens as $word => $count) {
+
+ $word_count[$word] = $count;
+
+ # Although we only call this function only here ... let's do the
+ # calculation stuff in a function to make this a bit less confusing ;-)
+ $rating[$word] = $this->_get_probability($word, $internals['texts_ham'], $internals['texts_spam']);
+
+ $importance[$word] = abs(0.5 - $rating[$word]);
+
+ }
+
+ # Order by importance
+ arsort($importance);
+ reset($importance);
+
+ # Get the most interesting tokens (use all if we have less than the given number)
+
+ $relevant = array();
+
+ for($i = 0; $i < $this->config['use_relevant']; $i++) {
+
+ if($tmp = each($importance)) {
+
+ # Important tokens remain
+
+ # If the token's rating is relevant enough, use it
+
+ if(abs(0.5 - $rating[$tmp['key']]) > $this->config['min_dev']) {
+
+ # Tokens that appear more than once also count more than once
+
+ for($x = 0, $l = $word_count[$tmp['key']]; $x < $l; $x++)
+ array_push($relevant, $rating[$tmp['key']]);
+
+ }
+
+ }
+
+ else {
+ # We have less than words to use, so we already
+ # use what we have and can break here
+ break;
+ }
+
+ }
+
+ # Calculate the spamminess of the text (thanks to Mr. Robinson ;-)
+ # We set both hamminess and Spamminess to 1 for the first multiplying
+ $hamminess = 1;
+ $spamminess = 1;
+
+ # Consider all relevant ratings
+ foreach($relevant as $value) {
+ $hamminess *= (1.0 - $value);
+ $spamminess *= $value;
+ }
+
+ # If no token was good for calculation, we really don't know how
+ # to rate this text; so we assume a spam and ham probability of 0.5
+
+ if($hamminess === 1 and $spamminess === 1) {
+ $hamminess = 0.5;
+ $spamminess = 0.5;
+ $n = 1;
+ }
+ else {
+ # Get the number of relevant ratings
+ $n = count($relevant);
+ }
+
+ # Calculate the combined rating
+
+ # The actual hamminess and spamminess
+ $hamminess = 1 - pow($hamminess, (1 / $n));
+ $spamminess = 1 - pow($spamminess, (1 / $n));
+
+ # Calculate the combined indicator
+ $probability = ($hamminess - $spamminess) / ($hamminess + $spamminess);
+
+ # We want a value between 0 and 1, not between -1 and +1, so ...
+ $probability = (1 + $probability) / 2;
+
+ # Alea iacta est
+ return $probability;
+
+ }
+
+ /**
+ * Calculate the spamminess of a single token also considering "degenerated" versions
+ *
+ * @access private
+ * @param string $word
+ * @param string $texts_ham
+ * @param string $texts_spam
+ * @return void
+ */
+
+ private function _get_probability($word, $texts_ham, $texts_spam)
+ {
+
+ # Let's see what we have!
+
+ if(isset($this->_token_data['tokens'][$word]) === TRUE) {
+ # The token was in the database, so we can use it's data as-is
+ # and calculate the spamminess of this token directly
+ return $this->_calc_probability($this->_token_data['tokens'][$word], $texts_ham, $texts_spam);
+ }
+
+ # Damn. The token was not found, so do we have at least similar words?
+
+ if(isset($this->_token_data['degenerates'][$word]) === TRUE) {
+
+ # We found similar words, so calculate the spamminess for each one
+ # and choose the most important one for the further calculation
+
+ # The default rating is 0.5 simply saying nothing
+ $rating = 0.5;
+
+ foreach($this->_token_data['degenerates'][$word] as $degenerate => $count) {
+
+ # Calculate the rating of the current degenerated token
+ $rating_tmp = $this->_calc_probability($count, $texts_ham, $texts_spam);
+
+ # Is it more important than the rating of another degenerated version?
+ if(abs(0.5 - $rating_tmp) > abs(0.5 - $rating))
+ $rating = $rating_tmp;
+
+ }
+
+ return $rating;
+
+ }
+
+ else {
+ # The token is really unknown, so choose the default rating
+ # for completely unknown tokens. This strips down to the
+ # robX parameter so we can cheap out the freaky math ;-)
+ return $this->config['rob_x'];
+ }
+
+ }
+
+ /**
+ * Do the actual spamminess calculation of a single token
+ *
+ * @access private
+ * @param array $data
+ * @param string $texts_ham
+ * @param string $texts_spam
+ * @return void
+ */
+
+ private function _calc_probability($data, $texts_ham, $texts_spam)
+ {
+
+ # Calculate the basic probability by Mr. Graham
+
+ # But: consider the number of ham and spam texts saved instead of the
+ # number of entries where the token appeared to calculate a relative
+ # spamminess because we count tokens appearing multiple times not just
+ # once but as often as they appear in the learned texts
+
+ $rel_ham = $data['count_ham'];
+ $rel_spam = $data['count_spam'];
+
+ if($texts_ham > 0)
+ $rel_ham = $data['count_ham'] / $texts_ham;
+
+ if($texts_spam > 0)
+ $rel_spam = $data['count_spam'] / $texts_spam;
+
+ $rating = $rel_spam / ($rel_ham + $rel_spam);
+
+ # Calculate the better probability proposed by Mr. Robinson
+ $all = $data['count_ham'] + $data['count_spam'];
+ return (($this->config['rob_s'] * $this->config['rob_x']) + ($all * $rating)) / ($this->config['rob_s'] + $all);
+
+ }
+
+ /**
+ * Check the validity of the category of a request
+ *
+ * @access private
+ * @param string $category
+ * @return void
+ */
+
+ private function _check_category($category)
+ {
+ return $category === self::HAM or $category === self::SPAM;
+ }
+
+ /**
+ * Learn a reference text
+ *
+ * @access public
+ * @param string $text
+ * @param const $category Either b8::SPAM or b8::HAM
+ * @return void
+ */
+
+ public function learn($text, $category)
+ {
+ return $this->_process_text($text, $category, self::LEARN);
+ }
+
+ /**
+ * Unlearn a reference text
+ *
+ * @access public
+ * @param string $text
+ * @param const $category Either b8::SPAM or b8::HAM
+ * @return void
+ */
+
+ public function unlearn($text, $category)
+ {
+ return $this->_process_text($text, $category, self::UNLEARN);
+ }
+
+ /**
+ * Does the actual interaction with the storage backend for learning or unlearning texts
+ *
+ * @access private
+ * @param string $text
+ * @param const $category Either b8::SPAM or b8::HAM
+ * @param const $action Either b8::LEARN or b8::UNLEARN
+ * @return void
+ */
+
+ private function _process_text($text, $category, $action)
+ {
+
+ # Validate the startup
+
+ $started_up = $this->validate();
+
+ if($started_up !== TRUE)
+ return $started_up;
+
+ # Look if the request is okay
+ if($this->_check_category($category) === FALSE)
+ return self::TRAINER_CATEGORY_FAIL;
+
+ # Get all tokens from $text
+
+ $tokens = $this->_lexer->get_tokens($text);
+
+ # Check if the lexer failed
+ # (if so, $tokens will be a lexer error code, if not, $tokens will be an array)
+ if(!is_array($tokens))
+ return $tokens;
+
+ # Pass the tokens and what to do with it to the storage backend
+ return $this->_database->process_text($tokens, $category, $action);
+
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/library/spam/b8/degenerator/degenerator_default.php b/library/spam/b8/degenerator/degenerator_default.php
new file mode 100644
index 000000000..4ff6d882b
--- /dev/null
+++ b/library/spam/b8/degenerator/degenerator_default.php
@@ -0,0 +1,127 @@
+<?php
+
+# Copyright (C) 2006-2010 Tobias Leupold <tobias.leupold@web.de>
+#
+# This file is part of the b8 package
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation in version 2.1 of the License.
+#
+# This program 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 Lesser General Public
+# License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+/**
+ * Copyright (C) 2006-2010 Tobias Leupold <tobias.leupold@web.de>
+ *
+ * @license LGPL
+ * @access public
+ * @package b8
+ * @author Tobias Leupold
+ */
+
+class b8_degenerator_default
+{
+
+ public $degenerates = array();
+
+ /**
+ * Generates a list of "degenerated" words for a list of words.
+ *
+ * @access public
+ * @param array $tokens
+ * @return array An array containing an array of degenerated tokens for each token
+ */
+
+ public function degenerate(array $words)
+ {
+
+ $degenerates = array();
+
+ foreach($words as $word)
+ $degenerates[$word] = $this->_degenerate_word($word);
+
+ return $degenerates;
+
+ }
+
+ /**
+ * If the original word is not found in the database then
+ * we build "degenerated" versions of the word to lookup.
+ *
+ * @access private
+ * @param string $word
+ * @return array An array of degenerated words
+ */
+
+ protected function _degenerate_word($word)
+ {
+
+ # Check for any stored words so the process doesn't have to repeat
+ if(isset($this->degenerates[$word]) === TRUE)
+ return $this->degenerates[$word];
+
+ $degenerate = array();
+
+ # Add different version of upper and lower case and ucfirst
+ array_push($degenerate, strtolower($word));
+ array_push($degenerate, strtoupper($word));
+ array_push($degenerate, ucfirst($word));
+
+ # Degenerate all versions
+
+ foreach($degenerate as $alt_word) {
+
+ # Look for stuff like !!! and ???
+
+ if(preg_match('/[!?]$/', $alt_word) > 0) {
+
+ # Add versions with different !s and ?s
+
+ if(preg_match('/[!?]{2,}$/', $alt_word) > 0) {
+ $tmp = preg_replace('/([!?])+$/', '$1', $alt_word);
+ array_push($degenerate, $tmp);
+ }
+
+ $tmp = preg_replace('/([!?])+$/', '', $alt_word);
+ array_push($degenerate, $tmp);
+
+ }
+
+ # Look for ... at the end of the word
+
+ $alt_word_int = $alt_word;
+
+ while(preg_match('/[\.]$/', $alt_word_int) > 0) {
+ $alt_word_int = substr($alt_word_int, 0, strlen($alt_word_int) - 1);
+ array_push($degenerate, $alt_word_int);
+ }
+
+ }
+
+ # Some degenerates are the same as the original word. These don't have
+ # to be fetched, so we create a new array with only new tokens
+
+ $real_degenerate = array();
+
+ foreach($degenerate as $deg_word) {
+ if($word != $deg_word)
+ array_push($real_degenerate, $deg_word);
+ }
+
+ # Store the list of degenerates for the token
+ $this->degenerates[$word] = $real_degenerate;
+
+ return $real_degenerate;
+
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/library/spam/b8/lexer/lexer_default.php b/library/spam/b8/lexer/lexer_default.php
new file mode 100644
index 000000000..7b5ca22bf
--- /dev/null
+++ b/library/spam/b8/lexer/lexer_default.php
@@ -0,0 +1,205 @@
+<?php
+
+# Copyright (C) 2006-2010 Tobias Leupold <tobias.leupold@web.de>
+#
+# This file is part of the b8 package
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation in version 2.1 of the License.
+#
+# This program 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 Lesser General Public
+# License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+/**
+ * Copyright (C) 2006-2010 Tobias Leupold <tobias.leupold@web.de>
+ *
+ * @license LGPL
+ * @access public
+ * @package b8
+ * @author Tobias Leupold
+ * @author Oliver Lillie (aka buggedcom) (original PHP 5 port)
+ */
+
+class b8_lexer_default
+{
+
+ const LEXER_TEXT_NOT_STRING = 'LEXER_TEXT_NOT_STRING';
+ const LEXER_TEXT_EMPTY = 'LEXER_TEXT_EMPTY';
+
+ public $config = NULL;
+
+ # The regular expressions we use to split the text to tokens
+
+ public $regexp = array(
+ 'ip' => '/([A-Za-z0-9\_\-\.]+)/',
+ 'raw_split' => '/[\s,\.\/"\:;\|<>\-_\[\]{}\+=\)\(\*\&\^%]+/',
+ 'html' => '/(<.+?>)/',
+ 'tagname' => '/(.+?)\s/',
+ 'numbers' => '/^[0-9]+$/'
+ );
+
+ /**
+ * Constructs the lexer.
+ *
+ * @access public
+ * @return void
+ */
+
+ function __construct($config)
+ {
+ $this->config = $config;
+ }
+
+ /**
+ * Generates the tokens required for the bayesian filter.
+ *
+ * @access public
+ * @param string $text
+ * @return array Returns the list of tokens
+ */
+
+ public function get_tokens($text)
+ {
+
+ # Check that we actually have a string ...
+ if(is_string($text) === FALSE)
+ return self::LEXER_TEXT_NOT_STRING;
+
+ # ... and that it's not empty
+ if(empty($text) === TRUE)
+ return self::LEXER_TEXT_EMPTY;
+
+ # Re-convert the text to the original characters coded in UTF-8, as
+ # they have been coded in html entities during the post process
+ $text = html_entity_decode($text, ENT_QUOTES, 'UTF-8');
+
+ $tokens = array();
+
+ # Find URLs and IP addresses
+
+ preg_match_all($this->regexp['ip'], $text, $raw_tokens);
+
+ foreach($raw_tokens[1] as $word) {
+
+ # Check for a dot
+ if(strpos($word, '.') === FALSE)
+ continue;
+
+ # Check that the word is valid, min and max sizes, etc.
+ if($this->_is_valid($word) === FALSE)
+ continue;
+
+ if(isset($tokens[$word]) === FALSE)
+ $tokens[$word] = 1;
+ else
+ $tokens[$word] += 1;
+
+ # Delete the word from the text so it doesn't get re-added.
+ $text = str_replace($word, '', $text);
+
+ # Also process the parts of the URLs
+ $url_parts = preg_split($this->regexp['raw_split'], $word);
+
+ foreach($url_parts as $word) {
+
+ # Again validate the part
+
+ if($this->_is_valid($word) === FALSE)
+ continue;
+
+ if(isset($tokens[$word]) === FALSE)
+ $tokens[$word] = 1;
+ else
+ $tokens[$word] += 1;
+
+ }
+
+ }
+
+ # Split the remaining text
+
+ $raw_tokens = preg_split($this->regexp['raw_split'], $text);
+
+ foreach($raw_tokens as $word) {
+
+ # Again validate the part
+
+ if($this->_is_valid($word) === FALSE)
+ continue;
+
+ if(isset($tokens[$word]) === FALSE)
+ $tokens[$word] = 1;
+ else
+ $tokens[$word] += 1;
+
+ }
+
+ # Process the HTML
+
+ preg_match_all($this->regexp['html'], $text, $raw_tokens);
+
+ foreach($raw_tokens[1] as $word) {
+
+ # Again validate the part
+
+ if($this->_is_valid($word) === FALSE)
+ continue;
+
+ # If the tag has parameters, just use the tag itself
+
+ if(strpos($word, ' ') !== FALSE) {
+ preg_match($this->regexp['tagname'], $word, $tmp);
+ $word = "{$tmp[1]}...>";
+ }
+
+ if(isset($tokens[$word]) === FALSE)
+ $tokens[$word] = 1;
+ else
+ $tokens[$word] += 1;
+
+ }
+
+ # Return a list of all found tokens
+ return $tokens;
+
+ }
+
+ /**
+ * Validates a token.
+ *
+ * @access private
+ * @param string $token The token string.
+ * @return boolean Returns TRUE if the token is valid, otherwise returns FALSE
+ */
+
+ private function _is_valid($token)
+ {
+
+ # Validate the size of the token
+
+ $len = strlen($token);
+
+ if($len < $this->config['min_size'] or $len > $this->config['max_size'])
+ return FALSE;
+
+ # We may want to exclude pure numbers
+ if($this->config['allow_numbers'] === FALSE) {
+ if(preg_match($this->regexp['numbers'], $token) > 0)
+ return FALSE;
+ }
+
+ # Token is okay
+ return TRUE;
+
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/library/spam/b8/storage/storage_base.php b/library/spam/b8/storage/storage_base.php
new file mode 100644
index 000000000..6b181ee96
--- /dev/null
+++ b/library/spam/b8/storage/storage_base.php
@@ -0,0 +1,396 @@
+<?php
+
+# Copyright (C) 2010 Tobias Leupold <tobias.leupold@web.de>
+#
+# This file is part of the b8 package
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation in version 2.1 of the License.
+#
+# This program 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 Lesser General Public
+# License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+/**
+ * Functions used by all storage backends
+ * Copyright (C) 2010 Tobias Leupold <tobias.leupold@web.de>
+ *
+ * @license LGPL
+ * @access public
+ * @package b8
+ * @author Tobias Leupold
+ */
+
+abstract class b8_storage_base
+{
+
+ public $connected = FALSE;
+
+ protected $_degenerator = NULL;
+
+ const INTERNALS_TEXTS_HAM = 'bayes*texts.ham';
+ const INTERNALS_TEXTS_SPAM = 'bayes*texts.spam';
+ const INTERNALS_DBVERSION = 'bayes*dbversion';
+
+ const BACKEND_NOT_CONNECTED = 'BACKEND_NOT_CONNECTED';
+ const DATABASE_WRONG_VERSION = 'DATABASE_WRONG_VERSION';
+ const DATABASE_NOT_B8 = 'DATABASE_NOT_B8';
+
+ /**
+ * Validates the class has all it needs to work.
+ *
+ * @access protected
+ * @return mixed Returns TRUE if everything is okay, otherwise an error code.
+ */
+
+ protected function validate()
+ {
+
+ # We set up the degenerator here, as we would have to duplicate code if it
+ # was done in the constructor of the respective storage backend.
+ $class = 'b8_degenerator_' . $this->b8_config['degenerator'];
+ $this->_degenerator = new $class();
+
+ if($this->connected !== TRUE)
+ return self::BACKEND_NOT_CONNECTED;
+
+ return TRUE;
+
+ }
+
+ /**
+ * Checks if a b8 database is used and if it's version is okay
+ *
+ * @access protected
+ * @return mixed Returns TRUE if everything is okay, otherwise an error code.
+ */
+
+ protected function check_database($uid)
+ {
+
+ $internals = $this->get_internals($uid);
+
+ if(isset($internals['dbversion'])) {
+ if($internals['dbversion'] == "2") {
+ return TRUE;
+ }
+ else {
+ $this->connected = FALSE;
+ return self::DATABASE_WRONG_VERSION;
+ }
+ }
+ else {
+ $this->connected = FALSE;
+ return self::DATABASE_NOT_B8;
+ }
+
+ }
+
+ /**
+ * Parses the "count" data of a token.
+ *
+ * @access private
+ * @param string $data
+ * @return array Returns an array of the parsed data: array(count_ham, count_spam, lastseen).
+ */
+
+ private function _parse_count($data)
+ {
+
+ list($count_ham, $count_spam, $lastseen) = explode(' ', $data);
+
+ $count_ham = (int) $count_ham;
+ $count_spam = (int) $count_spam;
+
+ return array(
+ 'count_ham' => $count_ham,
+ 'count_spam' => $count_spam
+ );
+
+ }
+
+ /**
+ * Get the database's internal variables.
+ *
+ * @access public
+ * @return array Returns an array of all internals.
+ */
+
+ public function get_internals($uid)
+ {
+
+ $internals = $this->_get_query(
+ array(
+ self::INTERNALS_TEXTS_HAM,
+ self::INTERNALS_TEXTS_SPAM,
+ self::INTERNALS_DBVERSION
+ ),
+ $uid
+ );
+
+ return array(
+ 'texts_ham' => (int) $internals[self::INTERNALS_TEXTS_HAM],
+ 'texts_spam' => (int) $internals[self::INTERNALS_TEXTS_SPAM],
+ 'dbversion' => (int) $internals[self::INTERNALS_DBVERSION]
+ );
+
+ }
+
+ /**
+ * Get all data about a list of tags from the database.
+ *
+ * @access public
+ * @param array $tokens
+ * @return mixed Returns FALSE on failure, otherwise returns array of returned data in the format array('tokens' => array(token => count), 'degenerates' => array(token => array(degenerate => count))).
+ */
+
+ public function get($tokens, $uid)
+ {
+
+ # Validate the startup
+
+ $started_up = $this->validate();
+
+ if($started_up !== TRUE)
+ return $started_up;
+
+ # First we see what we have in the database.
+ $token_data = $this->_get_query($tokens, $uid);
+
+ # Check if we have to degenerate some tokens
+
+ $missing_tokens = array();
+
+ foreach($tokens as $token) {
+ if(!isset($token_data[$token]))
+ $missing_tokens[] = $token;
+ }
+
+ if(count($missing_tokens) > 0) {
+
+ # We have to degenerate some tokens
+ $degenerates_list = array();
+
+ # Generate a list of degenerated tokens for the missing tokens ...
+ $degenerates = $this->_degenerator->degenerate($missing_tokens);
+
+ # ... and look them up
+
+ foreach($degenerates as $token => $token_degenerates)
+ $degenerates_list = array_merge($degenerates_list, $token_degenerates);
+
+ $token_data = array_merge($token_data, $this->_get_query($degenerates_list));
+
+ }
+
+ # Here, we have all availible data in $token_data.
+
+ $return_data_tokens = array();
+ $return_data_degenerates = array();
+
+ foreach($tokens as $token) {
+
+ if(isset($token_data[$token]) === TRUE) {
+
+ # The token was found in the database
+
+ # Add the data ...
+ $return_data_tokens[$token] = $this->_parse_count($token_data[$token]);
+
+ # ... and update it's lastseen parameter
+ $this->_update($token, "{$return_data_tokens[$token]['count_ham']} {$return_data_tokens[$token]['count_spam']} " . $this->b8_config['today'], $uid );
+
+ }
+
+ else {
+
+ # The token was not found, so we look if we
+ # can return data for degenerated tokens
+
+ # Check all degenerated forms of the token
+
+ foreach($this->_degenerator->degenerates[$token] as $degenerate) {
+
+ if(isset($token_data[$degenerate]) === TRUE) {
+
+ # A degeneration of the token way found in the database
+
+ # Add the data ...
+ $return_data_degenerates[$token][$degenerate] = $this->_parse_count($token_data[$degenerate]);
+
+ # ... and update it's lastseen parameter
+ $this->_update($degenerate, "{$return_data_degenerates[$token][$degenerate]['count_ham']} {$return_data_degenerates[$token][$degenerate]['count_spam']} " . $this->b8_config['today'], $uid);
+
+ }
+
+ }
+
+ }
+
+ }
+
+ # Now, all token data directly found in the database is in $return_data_tokens
+ # and all data for degenerated versions is in $return_data_degenerates
+
+ # First, we commit the changes to the lastseen parameters
+ $this->_commit();
+
+ # Then, we return what we have
+ return array(
+ 'tokens' => $return_data_tokens,
+ 'degenerates' => $return_data_degenerates
+ );
+
+ }
+
+ /**
+ * Stores or deletes a list of tokens from the given category.
+ *
+ * @access public
+ * @param array $tokens
+ * @param const $category Either b8::HAM or b8::SPAM
+ * @param const $action Either b8::LEARN or b8::UNLEARN
+ * @return void
+ */
+
+ public function process_text($tokens, $category, $action, $uid)
+ {
+
+ # Validate the startup
+
+ $started_up = $this->validate();
+
+ if($started_up !== TRUE)
+ return $started_up;
+
+ # No matter what we do, we first have to check what data we have.
+
+ # First get the internals, including the ham texts and spam texts counter
+ $internals = $this->get_internals($uid);
+
+ # Then, fetch all data for all tokens we have (and update their lastseen parameters)
+ $token_data = $this->_get_query(array_keys($tokens), $uid);
+
+ # Process all tokens to learn/unlearn
+
+ foreach($tokens as $token => $count) {
+
+ if(isset($token_data[$token])) {
+
+ # We already have this token, so update it's data
+
+ # Get the existing data
+ list($count_ham, $count_spam, $lastseen) = explode(' ', $token_data[$token]);
+ $count_ham = (int) $count_ham;
+ $count_spam = (int) $count_spam;
+
+ # Increase or decrease the right counter
+
+ if($action === b8::LEARN) {
+ if($category === b8::HAM)
+ $count_ham += $count;
+ elseif($category === b8::SPAM)
+ $count_spam += $count;
+ }
+
+ elseif($action == b8::UNLEARN) {
+ if($category === b8::HAM)
+ $count_ham -= $count;
+ elseif($category === b8::SPAM)
+ $count_spam -= $count;
+ }
+
+ # We don't want to have negative values
+
+ if($count_ham < 0)
+ $count_ham = 0;
+
+ if($count_spam < 0)
+ $count_spam = 0;
+
+ # Now let's see if we have to update or delete the token
+ if($count_ham !== 0 or $count_spam !== 0)
+ $this->_update($token, "$count_ham $count_spam " . $this->b8_config['today'], $uid);
+ else
+ $this->_del($token, $uid);
+
+ }
+
+ else {
+
+ # We don't have the token. If we unlearn a text, we can't delete it
+ # as we don't have it anyway, so just do something if we learn a text
+
+ if($action === b8::LEARN) {
+
+ if($category === b8::HAM)
+ $data = '1 0 ';
+ elseif($category === b8::SPAM)
+ $data = '0 1 ';
+
+ $data .= $this->b8_config['today'];
+
+ $this->_put($token, $data, $uid);
+
+ }
+
+ }
+
+ }
+
+ # Now, all token have been processed, so let's update the right text
+
+ if($action === b8::LEARN) {
+
+ if($category === b8::HAM) {
+ $internals['texts_ham']++;
+ $this->_update(self::INTERNALS_TEXTS_HAM, $internals['texts_ham'], $uid);
+ }
+
+ elseif($category === b8::SPAM) {
+ $internals['texts_spam']++;
+ $this->_update(self::INTERNALS_TEXTS_SPAM, $internals['texts_spam'], $uid);
+ }
+
+ }
+
+ elseif($action == b8::UNLEARN) {
+
+ if($category === b8::HAM) {
+
+ $internals['texts_ham']--;
+
+ if($internals['texts_ham'] < 0)
+ $internals['texts_ham'] = 0;
+
+ $this->_update(self::INTERNALS_TEXTS_HAM, $internals['texts_ham'], $uid);
+
+ }
+
+ elseif($category === b8::SPAM) {
+
+ $internals['texts_spam']--;
+
+ if($internals['texts_spam'] < 0)
+ $internals['texts_spam'] = 0;
+
+ $this->_update(self::INTERNALS_TEXTS_SPAM, $internals['texts_spam'], $uid);
+
+ }
+
+ }
+
+ # We're done and can commit all changes to the database now
+ $this->_commit($uid);
+
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/library/spam/b8/storage/storage_base.php.ORIG b/library/spam/b8/storage/storage_base.php.ORIG
new file mode 100644
index 000000000..01f5a69d7
--- /dev/null
+++ b/library/spam/b8/storage/storage_base.php.ORIG
@@ -0,0 +1,395 @@
+<?php
+
+# Copyright (C) 2010 Tobias Leupold <tobias.leupold@web.de>
+#
+# This file is part of the b8 package
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation in version 2.1 of the License.
+#
+# This program 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 Lesser General Public
+# License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+/**
+ * Functions used by all storage backends
+ * Copyright (C) 2010 Tobias Leupold <tobias.leupold@web.de>
+ *
+ * @license LGPL
+ * @access public
+ * @package b8
+ * @author Tobias Leupold
+ */
+
+abstract class b8_storage_base
+{
+
+ public $connected = FALSE;
+
+ protected $_degenerator = NULL;
+
+ const INTERNALS_TEXTS_HAM = 'bayes*texts.ham';
+ const INTERNALS_TEXTS_SPAM = 'bayes*texts.spam';
+ const INTERNALS_DBVERSION = 'bayes*dbversion';
+
+ const BACKEND_NOT_CONNECTED = 'BACKEND_NOT_CONNECTED';
+ const DATABASE_WRONG_VERSION = 'DATABASE_WRONG_VERSION';
+ const DATABASE_NOT_B8 = 'DATABASE_NOT_B8';
+
+ /**
+ * Validates the class has all it needs to work.
+ *
+ * @access protected
+ * @return mixed Returns TRUE if everything is okay, otherwise an error code.
+ */
+
+ protected function validate()
+ {
+
+ # We set up the degenerator here, as we would have to duplicate code if it
+ # was done in the constructor of the respective storage backend.
+ $class = 'b8_degenerator_' . $this->b8_config['degenerator'];
+ $this->_degenerator = new $class();
+
+ if($this->connected !== TRUE)
+ return self::BACKEND_NOT_CONNECTED;
+
+ return TRUE;
+
+ }
+
+ /**
+ * Checks if a b8 database is used and if it's version is okay
+ *
+ * @access protected
+ * @return mixed Returns TRUE if everything is okay, otherwise an error code.
+ */
+
+ protected function check_database()
+ {
+
+ $internals = $this->get_internals();
+
+ if(isset($internals['dbversion'])) {
+ if($internals['dbversion'] == "2") {
+ return TRUE;
+ }
+ else {
+ $this->connected = FALSE;
+ return self::DATABASE_WRONG_VERSION;
+ }
+ }
+ else {
+ $this->connected = FALSE;
+ return self::DATABASE_NOT_B8;
+ }
+
+ }
+
+ /**
+ * Parses the "count" data of a token.
+ *
+ * @access private
+ * @param string $data
+ * @return array Returns an array of the parsed data: array(count_ham, count_spam, lastseen).
+ */
+
+ private function _parse_count($data)
+ {
+
+ list($count_ham, $count_spam, $lastseen) = explode(' ', $data);
+
+ $count_ham = (int) $count_ham;
+ $count_spam = (int) $count_spam;
+
+ return array(
+ 'count_ham' => $count_ham,
+ 'count_spam' => $count_spam
+ );
+
+ }
+
+ /**
+ * Get the database's internal variables.
+ *
+ * @access public
+ * @return array Returns an array of all internals.
+ */
+
+ public function get_internals()
+ {
+
+ $internals = $this->_get_query(
+ array(
+ self::INTERNALS_TEXTS_HAM,
+ self::INTERNALS_TEXTS_SPAM,
+ self::INTERNALS_DBVERSION
+ )
+ );
+
+ return array(
+ 'texts_ham' => (int) $internals[self::INTERNALS_TEXTS_HAM],
+ 'texts_spam' => (int) $internals[self::INTERNALS_TEXTS_SPAM],
+ 'dbversion' => (int) $internals[self::INTERNALS_DBVERSION]
+ );
+
+ }
+
+ /**
+ * Get all data about a list of tags from the database.
+ *
+ * @access public
+ * @param array $tokens
+ * @return mixed Returns FALSE on failure, otherwise returns array of returned data in the format array('tokens' => array(token => count), 'degenerates' => array(token => array(degenerate => count))).
+ */
+
+ public function get($tokens)
+ {
+
+ # Validate the startup
+
+ $started_up = $this->validate();
+
+ if($started_up !== TRUE)
+ return $started_up;
+
+ # First we see what we have in the database.
+ $token_data = $this->_get_query($tokens);
+
+ # Check if we have to degenerate some tokens
+
+ $missing_tokens = array();
+
+ foreach($tokens as $token) {
+ if(!isset($token_data[$token]))
+ $missing_tokens[] = $token;
+ }
+
+ if(count($missing_tokens) > 0) {
+
+ # We have to degenerate some tokens
+ $degenerates_list = array();
+
+ # Generate a list of degenerated tokens for the missing tokens ...
+ $degenerates = $this->_degenerator->degenerate($missing_tokens);
+
+ # ... and look them up
+
+ foreach($degenerates as $token => $token_degenerates)
+ $degenerates_list = array_merge($degenerates_list, $token_degenerates);
+
+ $token_data = array_merge($token_data, $this->_get_query($degenerates_list));
+
+ }
+
+ # Here, we have all availible data in $token_data.
+
+ $return_data_tokens = array();
+ $return_data_degenerates = array();
+
+ foreach($tokens as $token) {
+
+ if(isset($token_data[$token]) === TRUE) {
+
+ # The token was found in the database
+
+ # Add the data ...
+ $return_data_tokens[$token] = $this->_parse_count($token_data[$token]);
+
+ # ... and update it's lastseen parameter
+ $this->_update($token, "{$return_data_tokens[$token]['count_ham']} {$return_data_tokens[$token]['count_spam']} " . $this->b8_config['today']);
+
+ }
+
+ else {
+
+ # The token was not found, so we look if we
+ # can return data for degenerated tokens
+
+ # Check all degenerated forms of the token
+
+ foreach($this->_degenerator->degenerates[$token] as $degenerate) {
+
+ if(isset($token_data[$degenerate]) === TRUE) {
+
+ # A degeneration of the token way found in the database
+
+ # Add the data ...
+ $return_data_degenerates[$token][$degenerate] = $this->_parse_count($token_data[$degenerate]);
+
+ # ... and update it's lastseen parameter
+ $this->_update($degenerate, "{$return_data_degenerates[$token][$degenerate]['count_ham']} {$return_data_degenerates[$token][$degenerate]['count_spam']} " . $this->b8_config['today']);
+
+ }
+
+ }
+
+ }
+
+ }
+
+ # Now, all token data directly found in the database is in $return_data_tokens
+ # and all data for degenerated versions is in $return_data_degenerates
+
+ # First, we commit the changes to the lastseen parameters
+ $this->_commit();
+
+ # Then, we return what we have
+ return array(
+ 'tokens' => $return_data_tokens,
+ 'degenerates' => $return_data_degenerates
+ );
+
+ }
+
+ /**
+ * Stores or deletes a list of tokens from the given category.
+ *
+ * @access public
+ * @param array $tokens
+ * @param const $category Either b8::HAM or b8::SPAM
+ * @param const $action Either b8::LEARN or b8::UNLEARN
+ * @return void
+ */
+
+ public function process_text($tokens, $category, $action)
+ {
+
+ # Validate the startup
+
+ $started_up = $this->validate();
+
+ if($started_up !== TRUE)
+ return $started_up;
+
+ # No matter what we do, we first have to check what data we have.
+
+ # First get the internals, including the ham texts and spam texts counter
+ $internals = $this->get_internals();
+
+ # Then, fetch all data for all tokens we have (and update their lastseen parameters)
+ $token_data = $this->_get_query(array_keys($tokens));
+
+ # Process all tokens to learn/unlearn
+
+ foreach($tokens as $token => $count) {
+
+ if(isset($token_data[$token])) {
+
+ # We already have this token, so update it's data
+
+ # Get the existing data
+ list($count_ham, $count_spam, $lastseen) = explode(' ', $token_data[$token]);
+ $count_ham = (int) $count_ham;
+ $count_spam = (int) $count_spam;
+
+ # Increase or decrease the right counter
+
+ if($action === b8::LEARN) {
+ if($category === b8::HAM)
+ $count_ham += $count;
+ elseif($category === b8::SPAM)
+ $count_spam += $count;
+ }
+
+ elseif($action == b8::UNLEARN) {
+ if($category === b8::HAM)
+ $count_ham -= $count;
+ elseif($category === b8::SPAM)
+ $count_spam -= $count;
+ }
+
+ # We don't want to have negative values
+
+ if($count_ham < 0)
+ $count_ham = 0;
+
+ if($count_spam < 0)
+ $count_spam = 0;
+
+ # Now let's see if we have to update or delete the token
+ if($count_ham !== 0 or $count_spam !== 0)
+ $this->_update($token, "$count_ham $count_spam " . $this->b8_config['today']);
+ else
+ $this->_del($token);
+
+ }
+
+ else {
+
+ # We don't have the token. If we unlearn a text, we can't delete it
+ # as we don't have it anyway, so just do something if we learn a text
+
+ if($action === b8::LEARN) {
+
+ if($category === b8::HAM)
+ $data = '1 0 ';
+ elseif($category === b8::SPAM)
+ $data = '0 1 ';
+
+ $data .= $this->b8_config['today'];
+
+ $this->_put($token, $data);
+
+ }
+
+ }
+
+ }
+
+ # Now, all token have been processed, so let's update the right text
+
+ if($action === b8::LEARN) {
+
+ if($category === b8::HAM) {
+ $internals['texts_ham']++;
+ $this->_update(self::INTERNALS_TEXTS_HAM, $internals['texts_ham']);
+ }
+
+ elseif($category === b8::SPAM) {
+ $internals['texts_spam']++;
+ $this->_update(self::INTERNALS_TEXTS_SPAM, $internals['texts_spam']);
+ }
+
+ }
+
+ elseif($action == b8::UNLEARN) {
+
+ if($category === b8::HAM) {
+
+ $internals['texts_ham']--;
+
+ if($internals['texts_ham'] < 0)
+ $internals['texts_ham'] = 0;
+
+ $this->_update(self::INTERNALS_TEXTS_HAM, $internals['texts_ham']);
+
+ }
+
+ elseif($category === b8::SPAM) {
+
+ $internals['texts_spam']--;
+
+ if($internals['texts_spam'] < 0)
+ $internals['texts_spam'] = 0;
+
+ $this->_update(self::INTERNALS_TEXTS_SPAM, $internals['texts_spam']);
+
+ }
+
+ }
+
+ # We're done and can commit all changes to the database now
+ $this->_commit();
+
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/library/spam/b8/storage/storage_dba.php b/library/spam/b8/storage/storage_dba.php
new file mode 100644
index 000000000..04618b23e
--- /dev/null
+++ b/library/spam/b8/storage/storage_dba.php
@@ -0,0 +1,198 @@
+<?php
+
+# Copyright (C) 2006-2010 Tobias Leupold <tobias.leupold@web.de>
+#
+# This file is part of the b8 package
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation in version 2.1 of the License.
+#
+# This program 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 Lesser General Public
+# License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+/**
+ * The DBA (Berkeley DB) abstraction layer for communicating with the database.
+ * Copyright (C) 2006-2010 Tobias Leupold <tobias.leupold@web.de>
+ *
+ * @license LGPL
+ * @access public
+ * @package b8
+ * @author Tobias Leupold
+ */
+
+class b8_storage_dba extends b8_storage_base
+{
+
+ public $config = array(
+ 'database' => 'wordlist.db',
+ 'handler' => 'db4',
+ );
+
+ public $b8_config = array(
+ 'degenerator' => NULL,
+ 'today' => NULL
+ );
+
+ private $_db = NULL;
+
+ const DATABASE_CONNECTION_FAIL = 'DATABASE_CONNECTION_FAIL';
+
+ /**
+ * Constructs the database layer.
+ *
+ * @access public
+ * @param string $config
+ */
+
+ function __construct($config, $degenerator, $today)
+ {
+
+ # Pass some variables of the main b8 config to this class
+ $this->b8_config['degenerator'] = $degenerator;
+ $this->b8_config['today'] = $today;
+
+ # Validate the config items
+ if(count($config) > 0) {
+ foreach ($config as $name => $value) {
+ $this->config[$name] = (string) $value;
+ }
+ }
+
+ }
+
+ /**
+ * Closes the database connection.
+ *
+ * @access public
+ * @return void
+ */
+
+ function __destruct()
+ {
+ if($this->_db !== NULL) {
+ dba_close($this->_db);
+ $this->connected = FALSE;
+ }
+ }
+
+ /**
+ * Connect to the database and do some checks.
+ *
+ * @access public
+ * @return mixed Returns TRUE on a successful database connection, otherwise returns a constant from b8.
+ */
+
+ public function connect()
+ {
+
+ # Have we already connected?
+ if($this->_db !== NULL)
+ return TRUE;
+
+ # Open the database connection
+ $this->_db = dba_open(dirname(__FILE__) . DIRECTORY_SEPARATOR . ".." . DIRECTORY_SEPARATOR . $this->config['database'], "w", $this->config['handler']);
+
+ if($this->_db === FALSE) {
+ $this->connected = FALSE;
+ $this->_db = NULL;
+ return self::DATABASE_CONNECTION_FAIL;
+ }
+
+ # Everything is okay and connected
+
+ $this->connected = TRUE;
+
+ # Let's see if this is a b8 database and the version is okay
+ return $this->check_database();
+
+ }
+
+ /**
+ * Does the actual interaction with the database when fetching data.
+ *
+ * @access protected
+ * @param array $tokens
+ * @return mixed Returns an array of the returned data in the format array(token => data) or an empty array if there was no data.
+ */
+
+ protected function _get_query($tokens)
+ {
+
+ $data = array();
+
+ foreach ($tokens as $token) {
+
+ $count = dba_fetch($token, $this->_db);
+
+ if($count !== FALSE)
+ $data[$token] = $count;
+
+ }
+
+ return $data;
+
+ }
+
+ /**
+ * Store a token to the database.
+ *
+ * @access protected
+ * @param string $token
+ * @param string $count
+ * @return bool TRUE on success or FALSE on failure
+ */
+
+ protected function _put($token, $count) {
+ return dba_insert($token, $count, $this->_db);
+ }
+
+ /**
+ * Update an existing token.
+ *
+ * @access protected
+ * @param string $token
+ * @param string $count
+ * @return bool TRUE on success or FALSE on failure
+ */
+
+ protected function _update($token, $count)
+ {
+ return dba_replace($token, $count, $this->_db);
+ }
+
+ /**
+ * Remove a token from the database.
+ *
+ * @access protected
+ * @param string $token
+ * @return bool TRUE on success or FALSE on failure
+ */
+
+ protected function _del($token)
+ {
+ return dba_delete($token, $this->_db);
+ }
+
+ /**
+ * Does nothing :-D
+ *
+ * @access protected
+ * @return void
+ */
+
+ protected function _commit()
+ {
+ # We just need this function because the (My)SQL backend(s) need it.
+ return;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/library/spam/b8/storage/storage_frndc.php b/library/spam/b8/storage/storage_frndc.php
new file mode 100644
index 000000000..2b9374f67
--- /dev/null
+++ b/library/spam/b8/storage/storage_frndc.php
@@ -0,0 +1,344 @@
+<?php
+
+# Copyright (C) 2006-2011 Tobias Leupold <tobias.leupold@web.de>
+#
+# This file is part of the b8 package
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation in version 2.1 of the License.
+#
+# This program 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 Lesser General Public
+# License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+/**
+ * The MySQL abstraction layer for communicating with the database.
+ * Copyright (C) 2009 Oliver Lillie (aka buggedcom)
+ * Copyright (C) 2010-2011 Tobias Leupold <tobias.leupold@web.de>
+ *
+ * @license LGPL
+ * @access public
+ * @package b8
+ * @author Oliver Lillie (aka buggedcom) (original PHP 5 port and optimizations)
+ * @author Tobias Leupold
+ */
+
+class b8_storage_frndc extends b8_storage_base
+{
+
+ public $config = array(
+ 'database' => 'b8_wordlist',
+ 'table_name' => 'b8_wordlist',
+ 'host' => 'localhost',
+ 'user' => FALSE,
+ 'pass' => FALSE,
+ 'connection' => NULL
+ );
+
+ public $b8_config = array(
+ 'degenerator' => NULL,
+ 'today' => NULL
+ );
+
+ private $_connection = NULL;
+ private $_deletes = array();
+ private $_puts = array();
+ private $_updates = array();
+ private $uid = 0;
+
+ const DATABASE_CONNECTION_FAIL = 'DATABASE_CONNECTION_FAIL';
+ const DATABASE_CONNECTION_ERROR = 'DATABASE_CONNECTION_ERROR';
+ const DATABASE_CONNECTION_BAD_RESOURCE = 'DATABASE_CONNECTION_BAD_RESOURCE';
+ const DATABASE_SELECT_ERROR = 'DATABASE_SELECT_ERROR';
+ const DATABASE_TABLE_ACCESS_FAIL = 'DATABASE_TABLE_ACCESS_FAIL';
+ const DATABASE_WRONG_VERSION = 'DATABASE_WRONG_VERSION';
+
+ /**
+ * Constructs the database layer.
+ *
+ * @access public
+ * @param string $config
+ */
+
+ function __construct($config, $degenerator, $today)
+ {
+
+ # Pass some variables of the main b8 config to this class
+ $this->b8_config['degenerator'] = $degenerator;
+ $this->b8_config['today'] = $today;
+
+ # Validate the config items
+
+ if(count($config) > 0) {
+
+ foreach ($config as $name => $value) {
+
+ switch($name) {
+
+ case 'table_name':
+ case 'host':
+ case 'user':
+ case 'pass':
+ case 'database':
+ $this->config[$name] = (string) $value;
+ break;
+
+ case 'connection':
+
+ if($value !== NULL) {
+
+ if(is_resource($value) === TRUE) {
+ $resource_type = get_resource_type($value);
+ $this->config['connection'] = $resource_type !== 'mysql link' && $resource_type !== 'mysql link persistent' ? FALSE : $value;
+ }
+
+ else
+ $this->config['connection'] = FALSE;
+
+ }
+
+ break;
+
+ }
+
+ }
+
+ }
+
+ }
+
+ /**
+ * Closes the database connection.
+ *
+ * @access public
+ * @return void
+ */
+
+ function __destruct()
+ {
+
+ if($this->_connection === NULL)
+ return;
+
+ # Commit any changes before closing
+ $this->_commit();
+
+ # Just close the connection if no link-resource was passed and b8 created it's own connection
+ if($this->config['connection'] === NULL)
+ mysql_close($this->_connection);
+
+ $this->connected = FALSE;
+
+ }
+
+ /**
+ * Connect to the database and do some checks.
+ *
+ * @access public
+ * @return mixed Returns TRUE on a successful database connection, otherwise returns a constant from b8.
+ */
+
+ public function connect()
+ {
+
+ return TRUE;
+
+ # Are we already connected?
+ if($this->connected === TRUE)
+ return TRUE;
+
+ # Are we using an existing passed resource?
+ if($this->config['connection'] === FALSE) {
+ # ... yes we are, but the connection is not a resource, so return an error
+ $this->connected = FALSE;
+ return self::DATABASE_CONNECTION_BAD_RESOURCE;
+ }
+
+ elseif($this->config['connection'] === NULL) {
+
+ # ... no we aren't so we have to connect.
+
+ if($this->_connection = mysql_connect($this->config['host'], $this->config['user'], $this->config['pass'])) {
+ if(mysql_select_db($this->config['database'], $this->_connection) === FALSE) {
+ $this->connected = FALSE;
+ return self::DATABASE_SELECT_ERROR . ": " . mysql_error();
+ }
+ }
+ else {
+ $this->connected = FALSE;
+ return self::DATABASE_CONNECTION_ERROR;
+ }
+
+ }
+
+ else {
+ # ... yes we are
+ $this->_connection = $this->config['connection'];
+ }
+
+ # Just in case ...
+ if($this->_connection === NULL) {
+ $this->connected = FALSE;
+ return self::DATABASE_CONNECTION_FAIL;
+ }
+
+ # Check to see if the wordlist table exists
+ if(mysql_query('DESCRIBE ' . $this->config['table_name'], $this->_connection) === FALSE) {
+ $this->connected = FALSE;
+ return self::DATABASE_TABLE_ACCESS_FAIL . ": " . mysql_error();
+ }
+
+ # Everything is okay and connected
+ $this->connected = TRUE;
+
+ # Let's see if this is a b8 database and the version is okay
+ return $this->check_database();
+
+ }
+
+ /**
+ * Does the actual interaction with the database when fetching data.
+ *
+ * @access protected
+ * @param array $tokens
+ * @return mixed Returns an array of the returned data in the format array(token => data) or an empty array if there was no data.
+ */
+
+ protected function _get_query($tokens, $uid)
+ {
+
+ # Construct the query ...
+
+ if(count($tokens) > 0) {
+
+ $where = array();
+
+ foreach ($tokens as $token) {
+ $token = dbesc($token);
+ array_push($where, $token);
+ }
+
+ $where = 'token IN ("' . implode('", "', $where) . '")';
+ }
+
+ else {
+ $token = dbesc($token);
+ $where = 'token = "' . $token . '"';
+ }
+
+ # ... and fetch the data
+
+ $result = q('
+ SELECT token, count
+ FROM ' . $this->config['table_name'] . '
+ WHERE ' . $where . ' AND uid = ' . $uid );
+
+ return $result;
+
+ }
+
+ /**
+ * Store a token to the database.
+ *
+ * @access protected
+ * @param string $token
+ * @param string $count
+ * @return void
+ */
+
+ protected function _put($token, $count, $uid) {
+ $token = dbesc($token);
+ $count = dbesc($count);
+ $uid = dbesc($uid);
+ array_push($this->_puts, '("' . $token . '", "' . $count . '", '"' . $uid .'")');
+ }
+
+ /**
+ * Update an existing token.
+ *
+ * @access protected
+ * @param string $token
+ * @param string $count
+ * @return void
+ */
+
+ protected function _update($token, $count, $uid)
+ {
+ $token = dbesc($token);
+ $count = dbesc($count);
+ $uid = dbesc($uid);
+ array_push($this->_puts, '("' . $token . '", "' . $count . '", '"' . $uid .'")');
+ }
+
+ /**
+ * Remove a token from the database.
+ *
+ * @access protected
+ * @param string $token
+ * @return void
+ */
+
+ protected function _del($token, $uid)
+ {
+ $token = dbesc($token);
+ $uid = dbesc($uid);
+ $this->uid = $uid;
+ array_push($this->_deletes, $token);
+ }
+
+ /**
+ * Commits any modification queries.
+ *
+ * @access protected
+ * @return void
+ */
+
+ protected function _commit($uid)
+ {
+
+ if(count($this->_deletes) > 0) {
+
+ $result = q('
+ DELETE FROM ' . $this->config['table_name'] . '
+ WHERE token IN ("' . implode('", "', $this->_deletes) . '") AND uid = ' . $this->uid);
+
+ $this->_deletes = array();
+
+ }
+
+ if(count($this->_puts) > 0) {
+
+ $result = q('
+ INSERT INTO ' . $this->config['table_name'] . '(token, count, uid)
+ VALUES ' . implode(', ', $this->_puts));
+
+ $this->_puts = array();
+
+ }
+
+ if(count($this->_updates) > 0) {
+
+ // this still needs work
+ $result = q("select * from " . $this->config['table_name'] . ' where token = ';
+
+
+ $result = q('
+ INSERT INTO ' . $this->config['table_name'] . '(token, count, uid)
+ VALUES ' . implode(', ', $this->_updates) . ', ' . $uid . '
+ ON DUPLICATE KEY UPDATE ' . $this->config['table_name'] . '.count = VALUES(count);', $this->_connection);
+
+ $this->_updates = array();
+
+ }
+
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/library/spam/b8/storage/storage_mysql.php b/library/spam/b8/storage/storage_mysql.php
new file mode 100644
index 000000000..022536350
--- /dev/null
+++ b/library/spam/b8/storage/storage_mysql.php
@@ -0,0 +1,351 @@
+<?php
+
+# Copyright (C) 2006-2011 Tobias Leupold <tobias.leupold@web.de>
+#
+# This file is part of the b8 package
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation in version 2.1 of the License.
+#
+# This program 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 Lesser General Public
+# License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+/**
+ * The MySQL abstraction layer for communicating with the database.
+ * Copyright (C) 2009 Oliver Lillie (aka buggedcom)
+ * Copyright (C) 2010-2011 Tobias Leupold <tobias.leupold@web.de>
+ *
+ * @license LGPL
+ * @access public
+ * @package b8
+ * @author Oliver Lillie (aka buggedcom) (original PHP 5 port and optimizations)
+ * @author Tobias Leupold
+ */
+
+class b8_storage_mysql extends b8_storage_base
+{
+
+ public $config = array(
+ 'database' => 'b8_wordlist',
+ 'table_name' => 'b8_wordlist',
+ 'host' => 'localhost',
+ 'user' => FALSE,
+ 'pass' => FALSE,
+ 'connection' => NULL
+ );
+
+ public $b8_config = array(
+ 'degenerator' => NULL,
+ 'today' => NULL
+ );
+
+ private $_connection = NULL;
+ private $_deletes = array();
+ private $_puts = array();
+ private $_updates = array();
+
+ const DATABASE_CONNECTION_FAIL = 'DATABASE_CONNECTION_FAIL';
+ const DATABASE_CONNECTION_ERROR = 'DATABASE_CONNECTION_ERROR';
+ const DATABASE_CONNECTION_BAD_RESOURCE = 'DATABASE_CONNECTION_BAD_RESOURCE';
+ const DATABASE_SELECT_ERROR = 'DATABASE_SELECT_ERROR';
+ const DATABASE_TABLE_ACCESS_FAIL = 'DATABASE_TABLE_ACCESS_FAIL';
+ const DATABASE_WRONG_VERSION = 'DATABASE_WRONG_VERSION';
+
+ /**
+ * Constructs the database layer.
+ *
+ * @access public
+ * @param string $config
+ */
+
+ function __construct($config, $degenerator, $today)
+ {
+
+ # Pass some variables of the main b8 config to this class
+ $this->b8_config['degenerator'] = $degenerator;
+ $this->b8_config['today'] = $today;
+
+ # Validate the config items
+
+ if(count($config) > 0) {
+
+ foreach ($config as $name => $value) {
+
+ switch($name) {
+
+ case 'table_name':
+ case 'host':
+ case 'user':
+ case 'pass':
+ case 'database':
+ $this->config[$name] = (string) $value;
+ break;
+
+ case 'connection':
+
+ if($value !== NULL) {
+
+ if(is_resource($value) === TRUE) {
+ $resource_type = get_resource_type($value);
+ $this->config['connection'] = $resource_type !== 'mysql link' && $resource_type !== 'mysql link persistent' ? FALSE : $value;
+ }
+
+ else
+ $this->config['connection'] = FALSE;
+
+ }
+
+ break;
+
+ }
+
+ }
+
+ }
+
+ }
+
+ /**
+ * Closes the database connection.
+ *
+ * @access public
+ * @return void
+ */
+
+ function __destruct()
+ {
+
+ if($this->_connection === NULL)
+ return;
+
+ # Commit any changes before closing
+ $this->_commit();
+
+ # Just close the connection if no link-resource was passed and b8 created it's own connection
+ if($this->config['connection'] === NULL)
+ mysql_close($this->_connection);
+
+ $this->connected = FALSE;
+
+ }
+
+ /**
+ * Connect to the database and do some checks.
+ *
+ * @access public
+ * @return mixed Returns TRUE on a successful database connection, otherwise returns a constant from b8.
+ */
+
+ public function connect()
+ {
+
+ # Are we already connected?
+ if($this->connected === TRUE)
+ return TRUE;
+
+ # Are we using an existing passed resource?
+ if($this->config['connection'] === FALSE) {
+ # ... yes we are, but the connection is not a resource, so return an error
+ $this->connected = FALSE;
+ return self::DATABASE_CONNECTION_BAD_RESOURCE;
+ }
+
+ elseif($this->config['connection'] === NULL) {
+
+ # ... no we aren't so we have to connect.
+
+ if($this->_connection = mysql_connect($this->config['host'], $this->config['user'], $this->config['pass'])) {
+ if(mysql_select_db($this->config['database'], $this->_connection) === FALSE) {
+ $this->connected = FALSE;
+ return self::DATABASE_SELECT_ERROR . ": " . mysql_error();
+ }
+ }
+ else {
+ $this->connected = FALSE;
+ return self::DATABASE_CONNECTION_ERROR;
+ }
+
+ }
+
+ else {
+ # ... yes we are
+ $this->_connection = $this->config['connection'];
+ }
+
+ # Just in case ...
+ if($this->_connection === NULL) {
+ $this->connected = FALSE;
+ return self::DATABASE_CONNECTION_FAIL;
+ }
+
+ # Check to see if the wordlist table exists
+ if(mysql_query('DESCRIBE ' . $this->config['table_name'], $this->_connection) === FALSE) {
+ $this->connected = FALSE;
+ return self::DATABASE_TABLE_ACCESS_FAIL . ": " . mysql_error();
+ }
+
+ # Everything is okay and connected
+ $this->connected = TRUE;
+
+ # Let's see if this is a b8 database and the version is okay
+ return $this->check_database();
+
+ }
+
+ /**
+ * Does the actual interaction with the database when fetching data.
+ *
+ * @access protected
+ * @param array $tokens
+ * @return mixed Returns an array of the returned data in the format array(token => data) or an empty array if there was no data.
+ */
+
+ protected function _get_query($tokens)
+ {
+
+ # Construct the query ...
+
+ if(count($tokens) > 0) {
+
+ $where = array();
+
+ foreach ($tokens as $token) {
+ $token = mysql_real_escape_string($token, $this->_connection);
+ array_push($where, $token);
+ }
+
+ $where = 'token IN ("' . implode('", "', $where) . '")';
+ }
+
+ else {
+ $token = mysql_real_escape_string($token, $this->_connection);
+ $where = 'token = "' . $token . '"';
+ }
+
+ # ... and fetch the data
+
+ $result = mysql_query('
+ SELECT token, count
+ FROM ' . $this->config['table_name'] . '
+ WHERE ' . $where . ';
+ ', $this->_connection);
+
+ $data = array();
+
+ while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
+ $data[$row['token']] = $row['count'];
+
+ mysql_free_result($result);
+
+ return $data;
+
+ }
+
+ /**
+ * Store a token to the database.
+ *
+ * @access protected
+ * @param string $token
+ * @param string $count
+ * @return void
+ */
+
+ protected function _put($token, $count) {
+ $token = mysql_real_escape_string($token, $this->_connection);
+ $count = mysql_real_escape_string($count, $this->_connection);;
+ array_push($this->_puts, '("' . $token . '", "' . $count . '")');
+ }
+
+ /**
+ * Update an existing token.
+ *
+ * @access protected
+ * @param string $token
+ * @param string $count
+ * @return void
+ */
+
+ protected function _update($token, $count)
+ {
+ $token = mysql_real_escape_string($token, $this->_connection);
+ $count = mysql_real_escape_string($count, $this->_connection);
+ array_push($this->_updates, '("' . $token . '", "' . $count . '")');
+ }
+
+ /**
+ * Remove a token from the database.
+ *
+ * @access protected
+ * @param string $token
+ * @return void
+ */
+
+ protected function _del($token)
+ {
+ $token = mysql_real_escape_string($token, $this->_connection);
+ array_push($this->_deletes, $token);
+ }
+
+ /**
+ * Commits any modification queries.
+ *
+ * @access protected
+ * @return void
+ */
+
+ protected function _commit()
+ {
+
+ if(count($this->_deletes) > 0) {
+
+ $result = mysql_query('
+ DELETE FROM ' . $this->config['table_name'] . '
+ WHERE token IN ("' . implode('", "', $this->_deletes) . '");
+ ', $this->_connection);
+
+ if(is_resource($result) === TRUE)
+ mysql_free_result($result);
+
+ $this->_deletes = array();
+
+ }
+
+ if(count($this->_puts) > 0) {
+
+ $result = mysql_query('
+ INSERT INTO ' . $this->config['table_name'] . '(token, count)
+ VALUES ' . implode(', ', $this->_puts) . ';', $this->_connection);
+
+ if(is_resource($result) === TRUE)
+ mysql_free_result($result);
+
+ $this->_puts = array();
+
+ }
+
+ if(count($this->_updates) > 0) {
+
+ $result = mysql_query('
+ INSERT INTO ' . $this->config['table_name'] . '(token, count)
+ VALUES ' . implode(', ', $this->_updates) . '
+ ON DUPLICATE KEY UPDATE ' . $this->config['table_name'] . '.count = VALUES(count);', $this->_connection);
+
+ if(is_resource($result) === TRUE)
+ mysql_free_result($result);
+
+ $this->_updates = array();
+
+ }
+
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/library/spam/doc/COPYING b/library/spam/doc/COPYING
new file mode 100644
index 000000000..8add30ad5
--- /dev/null
+++ b/library/spam/doc/COPYING
@@ -0,0 +1,504 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff --git a/library/spam/doc/ChangeLog b/library/spam/doc/ChangeLog
new file mode 100644
index 000000000..78a4fc77f
--- /dev/null
+++ b/library/spam/doc/ChangeLog
@@ -0,0 +1,179 @@
+2010-12-30 Tobias Leupold <tobias.leupold@web.de>
+
+ * Release: Version 0.5.1
+
+ * Bigger changes:
+ - Fixed some issues with the scope of variables leading to problems when multiple instances of b8 are created. Thanks to Mike Creuzer for the bug report :-)
+ - Centralized the loading of class definition files in the b8 constructor and created a function to handle the inclusion.
+
+ * b8.php: Return a lexer error code instead of a rating if the lexer failed. The lexer never returned FALSE but b8 checked only for this value to validate the lexer didn't fail. Thanks to Matt Friedman for the bug report :-)
+
+ * lexer/lexer_default.php: A bit of code cleanup: less useless nesting.
+
+ * doc/readme.*: Updated the documentation, added a FAQ.
+
+2010-06-27 Tobias Leupold <tobias.leupold@web.de>
+
+ * Release: Version 0.5-r1
+
+ * doc/readme.*: Updated the documentation; forgot the newly introduced b8::HAM and b8::SPAM variables. Added some additional information about the storage model.
+
+2010-06-02 Tobias Leupold <tobias.leupold@web.de>
+
+ * Release: Version 0.5
+
+ * 100.000 Changes (new major release!), at a glance:
+ - No PHP 4 compatibility anymore. Much cleaner code base with less hacks.
+ - Completely reworked storage model. The SQL performance increased dramatically, the Berkeley DB performance remains as fast as it always has been.
+ - Better lexer which can also handle non-latin1 texts in a nice way, so that e. g. Cyrillic or Chinese texts can be classified more performant.
+ - No config files anymore, multiple instances of b8 can be now created in the same script with different configuration, databases and no problems.
+ - No spooky administration interface anymore that needs an SQL database, even if Berkeley DB is used (anybody who actually used this?! I never did ;-).
+ - No "install" scripts and routines and a less end-user compatible documentation. Anybody integrating b8 in his homepage won't be an end-user, will he?
+
+2009-02-03 Oliver Lillie (aka buggedcom)
+
+ * Revision: 221 (the original PHP 5 port)
+
+ * Rewrote Tobias' original class for optimisation and PHP 5 functionality.
+
+ * Improved database mysql query useage by over ~820%
+
+ * Class is faster, ~20%.
+
+ * Slight increase in memory usage, but it's small and given the advantages of the speed increase and query reduction it's worth it.
+
+ * Removed install code from mysql class and added a sql file. Anyone who wants to use this is generally going to be more advanced anyway and see the sql to install.
+
+2009-02-03 Tobias Leupold <tobias.leupold@web.de>
+
+ * Release: Version 0.4.4 -- changed the license type from GPL to LGPL
+
+2008-06-27 Tobias Leupold <tobias.leupold@web.de>
+
+ * Release: Version 0.4.3 -- no bugs found ... so let's make a release with only small changes ;-)
+
+ * b8.php: Removed debugging messages that were commented out anyway
+
+ * storage/storage_mysql.php: Made it possible to pass both a MySQL-link resource and a table name to b8. This makes b8 useable in the Redaxo CMS (and probably others)
+
+ * doc/readme.htm: Updated documentation accordingly
+
+2008-02-17 Tobias Leupold <tobias.leupold@web.de>
+
+ * Release: Version 0.4.2
+
+ * interface/backup.php: the bayes*dbversion tag is now written to a database emptied by drop(), so that it will be useable without an error message even if no backup is recovered afterwards.
+
+ * doc/readme.htm: added a security note to the configuration section (htaccess should be used to avoid everybody to be able to see the configuration)
+
+2007-09-17 Tobias Leupold <tobias.leupold@web.de>
+
+ * Release: Version 0.4.1
+
+ * storage/storage_mysql.php: fixed b8 crashing when getting passed a persistent MySQL resource link. Thanks to Paul Chapman for the bug report :-)
+
+2007-06-08 Tobias Leupold <tobias.leupold@web.de>
+
+ * Release: Version 0.4
+
+ * Let's go the whole hog. b8's class is now "b8" and no more "bayes", and all internal variables have now according names.
+
+ * Reworked the whole (surprisingly crappy) implementation of b8. No more global() calls, everything happens inside the classes now. Made that whole stuff really object oriented (as good as possible with PHP's poor OOP model ;-).
+
+ * No more PHP code in the configuration files.
+
+ * Created an extra lexer class. This is now also configurable.
+
+ * Storage classes now can create their own databases when this is requested by the configuration.
+
+ * MySQL calls are no random shots anymore: either, a MySQL-link resource is passed to b8 on startup which will be used for the queries, or the class sets up it's own link. Same for SQLite.
+
+ * The interface now uses a separate storage backend capable of SQL. In this way, we _really_ can query the database for e. g. an ordered list of tokens. After doing what we wanted with this work database, the b8 database can be synced with it.
+
+ * Added a lot of verbose error handling.
+
+ * Fixed a dumb error: all tokens from a text were used for the spamminess calculation, because two for() loops both used $i as their counter. D'oh!!! Now, the filter's performance is way better.
+
+ * Catched on the way how that whole math stuff works a little more ;-) Now, the calculation of the single probabilities proposed by Mr. Robinson does a little more the stuff it was intended to do, because ...
+
+ * Made some calculation constants parameters: the number of tokens to use, the default rating for unknown tokens and Gary Robinson's s constant.
+
+ * Introduced an optional minimum deviation that a token's rating must have to be considered in the spamminess calculation.
+
+ * The default extreme ratings for tokens only in ham or spam are now optional. One can also choose to calculate all ratings by Mr. Robinson's method.
+
+ * Noticed that text primary keys are not case sensitive by default in MySQL, which has a noticeable impact on the filter's performance. Informed the MySQL users about that.
+
+ * The whole code sucks much less ;-) b8 should be way more user friendly now.
+
+ * Re-wrote the whole documentation.
+
+ * Fixed the ChangeLog :-)
+
+2007-02-08 Tobias Leupold <tobias.leupold@web.de>
+
+ * Release: Version 0.3.3 again ;-)
+
+ * bayes-php is now b8. See http://www.nasauber.de/blog/text.php?text=58 for details :-) Thanks to Tobias Lang (http://langt.net/) for this cool new name!
+
+2007-01-05 Tobias Leupold <tobias.leupold@web.de>
+
+ * Release: Version 0.3.3
+
+ * Renamed the internal BerkeleyDB handle from "$db" to the less general name "$bayes_php_db" due to an collision with phpwcms's (http://www.phpwcms.de/) global $db variable and potentially other php programs.
+
+ * Commented out Laurent Goussard's SQLite storage class by default, as it's try { } catch { } calls break PHP 4
+
+2006-09-03 Tobias Leupold <tobias.leupold@web.de>
+
+ * Release: Version 0.3.2
+
+ * Laurent Goussard (loranger@free.fr) contributed an SQLite storage class(which needs PHP 5).
+
+ * I finally added my eMail address to the sources ;-)
+
+2006-07-24 Tobias Leupold <tobias.leupold@web.de>
+
+ * Release: Version 0.3.1
+
+ * Fixed a problem in the unlearn() function: If a text was unlearned that wasn't learned before (accidentaly), it could happen that the count parameter for this text was smaller than 0, breaking the spamminess calulation
+
+2006-07-02 Tobias Leupold <tobias.leupold@web.de>
+
+ * Release: Version 0.3
+
+ * Improved the get_tokens() function; the filter should now be a lot more performant, especially with short texts
+
+ * Added the "lastseen" parameter for each token to make the database maintainable (outdated tokens can be deleted)
+
+ * Added a real database maintainance interface
+
+2006-06-12 Tobias Leupold <tobias.leupold@web.de>
+
+ * Release: Version 0.2.1
+
+ * Fixed a problem in get_tokens() (if it was called more than once, tokens were counted more often than they appeared in the text)
+
+ * Slightly enhanced the default index.php interface: after learning a text as Ham or Spam, the rating before and after it is displayed to inform the user about it
+
+2006-05-21 Tobias Leupold <tobias.leupold@web.de>
+
+ * Release: Version 0.2
+
+ * Comments now in English (to pretend international success of bayes-php ;-)
+
+ * Recommendations of Paul Graham's article "Better Bayesian Filtering" ( http://www.paulgraham.com/better.html ) are now considered: Tokens that only appear in Ham or Spam and not in the other category are rated with 0.9998 or 0.0002 if they were less than 10 times in Ham or Spam and with 0.9999 or 0.0001 if they appeared more that 10 times. This should allow the filter to differentiate spam texts more sharp from ham texts. Also, token "degeneration" as described in the article is performed for unknown tokens to estimate their spamminess.
+
+ * The database connect is now swapped in a separate configuration file, so only this file has to be preserved if bayes-php is updated and only this file has to be changed to configure the script.
+
+2006-03-29 Tobias Leupold <tobias.leupold@web.de>
+
+ * Release: Version 0.1.1
+
+ * get_tokens() beachtet jetzt auch HTML-Tags und Wörter mit Akzenten und Apostrophen
+
+ * Verschiedene Kleinigkeiten "sauber" gemacht :-)
+
+2006-03-05 Tobias Leupold <tobias.leupold@web.de>
+
+ * Added 2007-06-08: Initial release (Version 0.1)
diff --git a/library/spam/doc/readme.htm b/library/spam/doc/readme.htm
new file mode 100644
index 000000000..727d5ae5f
--- /dev/null
+++ b/library/spam/doc/readme.htm
@@ -0,0 +1,707 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="Docutils 0.7: http://docutils.sourceforge.net/" />
+<title>b8: readme</title>
+<meta name="author" content="Tobias Leupold" />
+<meta name="date" content="2010-12-23" />
+<style type="text/css">
+
+/*
+:Author: David Goodger (goodger@python.org)
+:Id: $Id: html4css1.css 6253 2010-03-02 00:24:53Z milde $
+:Copyright: This stylesheet has been placed in the public domain.
+
+Default cascading style sheet for the HTML output of Docutils.
+
+See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
+customize this style sheet.
+*/
+
+/* used to remove borders from tables and images */
+.borderless, table.borderless td, table.borderless th {
+ border: 0 }
+
+table.borderless td, table.borderless th {
+ /* Override padding for "table.docutils td" with "! important".
+ The right padding separates the table cells. */
+ padding: 0 0.5em 0 0 ! important }
+
+.first {
+ /* Override more specific margin styles with "! important". */
+ margin-top: 0 ! important }
+
+.last, .with-subtitle {
+ margin-bottom: 0 ! important }
+
+.hidden {
+ display: none }
+
+a.toc-backref {
+ text-decoration: none ;
+ color: black }
+
+blockquote.epigraph {
+ margin: 2em 5em ; }
+
+dl.docutils dd {
+ margin-bottom: 0.5em }
+
+/* Uncomment (and remove this text!) to get bold-faced definition list terms
+dl.docutils dt {
+ font-weight: bold }
+*/
+
+div.abstract {
+ margin: 2em 5em }
+
+div.abstract p.topic-title {
+ font-weight: bold ;
+ text-align: center }
+
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+ margin: 2em ;
+ border: medium outset ;
+ padding: 1em }
+
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title {
+ font-weight: bold ;
+ font-family: sans-serif }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title {
+ color: red ;
+ font-weight: bold ;
+ font-family: sans-serif }
+
+/* Uncomment (and remove this text!) to get reduced vertical space in
+ compound paragraphs.
+div.compound .compound-first, div.compound .compound-middle {
+ margin-bottom: 0.5em }
+
+div.compound .compound-last, div.compound .compound-middle {
+ margin-top: 0.5em }
+*/
+
+div.dedication {
+ margin: 2em 5em ;
+ text-align: center ;
+ font-style: italic }
+
+div.dedication p.topic-title {
+ font-weight: bold ;
+ font-style: normal }
+
+div.figure {
+ margin-left: 2em ;
+ margin-right: 2em }
+
+div.footer, div.header {
+ clear: both;
+ font-size: smaller }
+
+div.line-block {
+ display: block ;
+ margin-top: 1em ;
+ margin-bottom: 1em }
+
+div.line-block div.line-block {
+ margin-top: 0 ;
+ margin-bottom: 0 ;
+ margin-left: 1.5em }
+
+div.sidebar {
+ margin: 0 0 0.5em 1em ;
+ border: medium outset ;
+ padding: 1em ;
+ background-color: #ffffee ;
+ width: 40% ;
+ float: right ;
+ clear: right }
+
+div.sidebar p.rubric {
+ font-family: sans-serif ;
+ font-size: medium }
+
+div.system-messages {
+ margin: 5em }
+
+div.system-messages h1 {
+ color: red }
+
+div.system-message {
+ border: medium outset ;
+ padding: 1em }
+
+div.system-message p.system-message-title {
+ color: red ;
+ font-weight: bold }
+
+div.topic {
+ margin: 2em }
+
+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
+ margin-top: 0.4em }
+
+h1.title {
+ text-align: center }
+
+h2.subtitle {
+ text-align: center }
+
+hr.docutils {
+ width: 75% }
+
+img.align-left, .figure.align-left, object.align-left {
+ clear: left ;
+ float: left ;
+ margin-right: 1em }
+
+img.align-right, .figure.align-right, object.align-right {
+ clear: right ;
+ float: right ;
+ margin-left: 1em }
+
+img.align-center, .figure.align-center, object.align-center {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.align-left {
+ text-align: left }
+
+.align-center {
+ clear: both ;
+ text-align: center }
+
+.align-right {
+ text-align: right }
+
+/* reset inner alignment in figures */
+div.align-right {
+ text-align: left }
+
+/* div.align-center * { */
+/* text-align: left } */
+
+ol.simple, ul.simple {
+ margin-bottom: 1em }
+
+ol.arabic {
+ list-style: decimal }
+
+ol.loweralpha {
+ list-style: lower-alpha }
+
+ol.upperalpha {
+ list-style: upper-alpha }
+
+ol.lowerroman {
+ list-style: lower-roman }
+
+ol.upperroman {
+ list-style: upper-roman }
+
+p.attribution {
+ text-align: right ;
+ margin-left: 50% }
+
+p.caption {
+ font-style: italic }
+
+p.credits {
+ font-style: italic ;
+ font-size: smaller }
+
+p.label {
+ white-space: nowrap }
+
+p.rubric {
+ font-weight: bold ;
+ font-size: larger ;
+ color: maroon ;
+ text-align: center }
+
+p.sidebar-title {
+ font-family: sans-serif ;
+ font-weight: bold ;
+ font-size: larger }
+
+p.sidebar-subtitle {
+ font-family: sans-serif ;
+ font-weight: bold }
+
+p.topic-title {
+ font-weight: bold }
+
+pre.address {
+ margin-bottom: 0 ;
+ margin-top: 0 ;
+ font: inherit }
+
+pre.literal-block, pre.doctest-block {
+ margin-left: 2em ;
+ margin-right: 2em }
+
+span.classifier {
+ font-family: sans-serif ;
+ font-style: oblique }
+
+span.classifier-delimiter {
+ font-family: sans-serif ;
+ font-weight: bold }
+
+span.interpreted {
+ font-family: sans-serif }
+
+span.option {
+ white-space: nowrap }
+
+span.pre {
+ white-space: pre }
+
+span.problematic {
+ color: red }
+
+span.section-subtitle {
+ /* font-size relative to parent (h1..h6 element) */
+ font-size: 80% }
+
+table.citation {
+ border-left: solid 1px gray;
+ margin-left: 1px }
+
+table.docinfo {
+ margin: 2em 4em }
+
+table.docutils {
+ margin-top: 0.5em ;
+ margin-bottom: 0.5em }
+
+table.footnote {
+ border-left: solid 1px black;
+ margin-left: 1px }
+
+table.docutils td, table.docutils th,
+table.docinfo td, table.docinfo th {
+ padding-left: 0.5em ;
+ padding-right: 0.5em ;
+ vertical-align: top }
+
+table.docutils th.field-name, table.docinfo th.docinfo-name {
+ font-weight: bold ;
+ text-align: left ;
+ white-space: nowrap ;
+ padding-left: 0 }
+
+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
+ font-size: 100% }
+
+ul.auto-toc {
+ list-style-type: none }
+
+</style>
+</head>
+<body>
+<div class="document" id="b8-readme">
+<h1 class="title">b8: readme</h1>
+<table class="docinfo" frame="void" rules="none">
+<col class="docinfo-name" />
+<col class="docinfo-content" />
+<tbody valign="top">
+<tr><th class="docinfo-name">Author:</th>
+<td>Tobias Leupold</td></tr>
+<tr class="field"><th class="docinfo-name">Homepage:</th><td class="field-body"><a class="reference external" href="http://nasauber.de/">http://nasauber.de/</a></td>
+</tr>
+<tr><th class="docinfo-name">Contact:</th>
+<td><a class="first last reference external" href="mailto:tobias.leupold&#64;web.de">tobias.leupold&#64;web.de</a></td></tr>
+<tr><th class="docinfo-name">Date:</th>
+<td>2010-12-23</td></tr>
+</tbody>
+</table>
+<div class="contents topic" id="table-of-contents">
+<p class="topic-title first">Table of Contents</p>
+<ul class="auto-toc simple">
+<li><a class="reference internal" href="#description-of-b8" id="id18">1&nbsp;&nbsp;&nbsp;Description of b8</a><ul class="auto-toc">
+<li><a class="reference internal" href="#what-is-b8" id="id19">1.1&nbsp;&nbsp;&nbsp;What is b8?</a></li>
+<li><a class="reference internal" href="#how-does-it-work" id="id20">1.2&nbsp;&nbsp;&nbsp;How does it work?</a></li>
+<li><a class="reference internal" href="#what-do-i-need-for-it" id="id21">1.3&nbsp;&nbsp;&nbsp;What do I need for it?</a></li>
+<li><a class="reference internal" href="#what-s-different" id="id22">1.4&nbsp;&nbsp;&nbsp;What's different?</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#update-from-prior-versions" id="id23">2&nbsp;&nbsp;&nbsp;Update from prior versions</a><ul class="auto-toc">
+<li><a class="reference internal" href="#update-from-bayes-php-version-0-2-1-or-earlier" id="id24">2.1&nbsp;&nbsp;&nbsp;Update from bayes-php version 0.2.1 or earlier</a></li>
+<li><a class="reference internal" href="#update-from-bayes-php-version-0-3-or-later" id="id25">2.2&nbsp;&nbsp;&nbsp;Update from bayes-php version 0.3 or later</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#installation" id="id26">3&nbsp;&nbsp;&nbsp;Installation</a></li>
+<li><a class="reference internal" href="#configuration" id="id27">4&nbsp;&nbsp;&nbsp;Configuration</a><ul class="auto-toc">
+<li><a class="reference internal" href="#b8-s-base-configuration" id="id28">4.1&nbsp;&nbsp;&nbsp;b8's base configuration</a></li>
+<li><a class="reference internal" href="#configuration-of-the-storage-backend" id="id29">4.2&nbsp;&nbsp;&nbsp;Configuration of the storage backend</a><ul class="auto-toc">
+<li><a class="reference internal" href="#settings-for-the-berkeley-db-dba-backend" id="id30">4.2.1&nbsp;&nbsp;&nbsp;Settings for the Berkeley DB (DBA) backend</a></li>
+<li><a class="reference internal" href="#settings-for-the-mysql-backend" id="id31">4.2.2&nbsp;&nbsp;&nbsp;Settings for the MySQL backend</a></li>
+</ul>
+</li>
+</ul>
+</li>
+<li><a class="reference internal" href="#using-b8" id="id32">5&nbsp;&nbsp;&nbsp;Using b8</a><ul class="auto-toc">
+<li><a class="reference internal" href="#setting-up-a-new-database" id="id33">5.1&nbsp;&nbsp;&nbsp;Setting up a new database</a><ul class="auto-toc">
+<li><a class="reference internal" href="#setting-up-a-new-berkeley-db" id="id34">5.1.1&nbsp;&nbsp;&nbsp;Setting up a new Berkeley DB</a></li>
+<li><a class="reference internal" href="#setting-up-a-new-mysql-table" id="id35">5.1.2&nbsp;&nbsp;&nbsp;Setting up a new MySQL table</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#using-b8-in-your-scripts" id="id36">5.2&nbsp;&nbsp;&nbsp;Using b8 in your scripts</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#tips-on-operation" id="id37">6&nbsp;&nbsp;&nbsp;Tips on operation</a></li>
+<li><a class="reference internal" href="#closing" id="id38">7&nbsp;&nbsp;&nbsp;Closing</a></li>
+<li><a class="reference internal" href="#references" id="id39">8&nbsp;&nbsp;&nbsp;References</a></li>
+<li><a class="reference internal" href="#appendix" id="id40">9&nbsp;&nbsp;&nbsp;Appendix</a><ul class="auto-toc">
+<li><a class="reference internal" href="#faq" id="id41">9.1&nbsp;&nbsp;&nbsp;FAQ</a><ul class="auto-toc">
+<li><a class="reference internal" href="#what-about-more-than-two-categories" id="id42">9.1.1&nbsp;&nbsp;&nbsp;What about more than two categories?</a></li>
+<li><a class="reference internal" href="#what-about-a-list-with-words-to-ignore" id="id43">9.1.2&nbsp;&nbsp;&nbsp;What about a list with words to ignore?</a></li>
+<li><a class="reference internal" href="#why-is-it-called-b8" id="id44">9.1.3&nbsp;&nbsp;&nbsp;Why is it called &quot;b8&quot;?</a></li>
+</ul>
+</li>
+<li><a class="reference internal" href="#about-the-database" id="id45">9.2&nbsp;&nbsp;&nbsp;About the database</a><ul class="auto-toc">
+<li><a class="reference internal" href="#the-database-layout" id="id46">9.2.1&nbsp;&nbsp;&nbsp;The database layout</a></li>
+<li><a class="reference internal" href="#the-lastseen-parameter" id="id47">9.2.2&nbsp;&nbsp;&nbsp;The &quot;lastseen&quot; parameter</a></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</div>
+<div class="section" id="description-of-b8">
+<h1><a class="toc-backref" href="#id18">1&nbsp;&nbsp;&nbsp;Description of b8</a></h1>
+<div class="section" id="what-is-b8">
+<h2><a class="toc-backref" href="#id19">1.1&nbsp;&nbsp;&nbsp;What is b8?</a></h2>
+<p>b8 is a spam filter implemented in <a class="reference external" href="http://www.php.net/">PHP</a>. It is intended to keep your weblog or guestbook spam-free. The filter can be used anywhere in your PHP code and tells you whether a text is spam or not, using statistical text analysis. See <a class="reference internal" href="#how-does-it-work">How does it work?</a> for details about this. To be able to do this, b8 first has to learn some spam and some ham example texts to decide what's good and what's not. If it makes mistakes classifying unknown texts, they can be corrected and b8 learns from the corrections, getting better with each learned text.</p>
+<p>At the moment of this writing, b8 has classified 14411 guestbook entries and weblog comments on my homepage since december 2006. 131 were ham. 39 spam texts (0.27 %) have been rated as ham (false negatives), with not even one false positive (ham message classified as spam). This results in a sensitivity of 99.73 % (the probability that a spam text will actually be rated as spam) and a specifity of 100 % (the probability that a ham text will actually be rated as ham) for me. I hope, you'll get the same good results :-)</p>
+<p>Basically, b8 is a statistical (&quot;Bayesian&quot;<a class="footnote-reference" href="#id2" id="id1">[1]</a>) spam filter like <a class="reference external" href="http://bogofilter.sourceforge.net/">Bogofilter</a> or <a class="reference external" href="http://spambayes.sourceforge.net/">SpamBayes</a>, but it is not intended to classify e-mails. When I started to write b8, I didn't find a good PHP spam filter (or any spam filter that wasn't just some example code how one <em>could</em> implement a Bayesian spam filter in PHP) that was intended to filter weblog or guestbook entries. That's why I had to write my own ;-) <br />
+Caused by it's purpose, the way b8 works is slightly different from most of the Bayesian email spam filters out there. See <a class="reference internal" href="#what-s-different">What's different?</a> if you're interested in the details.</p>
+<table class="docutils footnote" frame="void" id="id2" rules="none">
+<colgroup><col class="label" /><col /></colgroup>
+<tbody valign="top">
+<tr><td class="label"><a class="fn-backref" href="#id1">[1]</a></td><td>A mathematician told me that the math in b8 actually does not use Bayes' theorem but some derived algorithms that are just related to it. So … let's simply believe that and stop claiming b8 was a <em>Bayesian</em> spam filter ;-)</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="how-does-it-work">
+<h2><a class="toc-backref" href="#id20">1.2&nbsp;&nbsp;&nbsp;How does it work?</a></h2>
+<p>b8 basically uses the math and technique described in Paul Graham's article &quot;A Plan For Spam&quot; <a class="footnote-reference" href="#planforspam" id="id3">[2]</a> to distinguish ham and spam. The improvements proposed in Graham's article &quot;Better Bayesian Filtering&quot; <a class="footnote-reference" href="#betterbayesian" id="id4">[3]</a> and Gary Robinson's article &quot;Spam Detection&quot; <a class="footnote-reference" href="#spamdetection" id="id5">[4]</a> have also been considered. See also the article &quot;A Statistical Approach to the Spam Problem&quot; <a class="footnote-reference" href="#statisticalapproach" id="id6">[5]</a>.</p>
+<p>b8 cuts the text to classify to pieces, extracting stuff like e-mail addresses, links and HTML tags. For each such token, it calculates a single probability for a text containing it being spam, based on what the filter has learned so far. When the token was not seen before, b8 tries to find similar ones using the &quot;degeneration&quot; described in <a class="footnote-reference" href="#betterbayesian" id="id7">[3]</a> and uses the most relevant value found. If really nothing is found, b8 assumes a default rating for this token for the further calculations. <br />
+Then, b8 takes the most relevant values (which have a rating far from 0.5, which would mean we don't know what it is) and calculates the probability that the whole text is spam by the inverse chi-square function described in <a class="footnote-reference" href="#spamdetection" id="id8">[4]</a>.
+There are some parameters that can be set which influence the filter's behaviour (see below).</p>
+<p>In short words: you give b8 a text and it returns a value between 0 and 1, saying it's ham when it's near 0 and saying it's spam when it's near 1.</p>
+</div>
+<div class="section" id="what-do-i-need-for-it">
+<h2><a class="toc-backref" href="#id21">1.3&nbsp;&nbsp;&nbsp;What do I need for it?</a></h2>
+<p>Not much! You just need PHP 5 on the server where b8 will be used (b8 version 0.5 finally dropped PHP 4 compatibility – thankfully ;-) and a proper storage possibility for the wordlists. I strongly recommend using <a class="reference external" href="http://www.oracle.com/database/berkeley-db/index.html">Berkeley DB</a>. See below how you can check if you can use it and why you should use it. If the server's PHP wasn't compiled with Berkeley DB support, a <a class="reference external" href="http://mysql.com/">MySQL</a> table can be used alternatively.</p>
+</div>
+<div class="section" id="what-s-different">
+<h2><a class="toc-backref" href="#id22">1.4&nbsp;&nbsp;&nbsp;What's different?</a></h2>
+<p>b8 is designed to classify weblog or guestbook entries, not e-mails. For this reason, it uses a slightly different technique than most of the other statistical spam filters out there use.</p>
+<p>My experience was that spam entries on my weblog or guestbook were often quite short, sometimes just something like &quot;123abc&quot; as text and a link to a suspect homepage. Some spam bots don't even made a difference between e. g. the &quot;name&quot; and &quot;text&quot; fields and posted their text as email address, for example. Considering this, b8 just takes one string to classify, making no difference between &quot;headers&quot; and &quot;text&quot;. <br />
+The other thing is that most statistical spam filters count one token one time, no matter how often it appears in the text (as Graham describes it in <a class="footnote-reference" href="#planforspam" id="id9">[2]</a>). b8 does count how often a token was seen and learns or considers this. Additionally, the number of learned ham and spam texts are saved and used as the calculation base for the single probabilities. Why this? Because a text containing one link (no matter where it points to, just indicated by a &quot;http://&quot; or a &quot;www.&quot;) might not be spam, but a text containing 20 links might be.</p>
+<p>This means that b8 might be good for classifying weblog or guestbook entries (I really think it is ;-) – but very likely, it will work quite poor when being used for something else (like classifying e-mails). But as said above, for this task, there are a lot of very good filters out there to choose from.</p>
+</div>
+</div>
+<div class="section" id="update-from-prior-versions">
+<h1><a class="toc-backref" href="#id23">2&nbsp;&nbsp;&nbsp;Update from prior versions</a></h1>
+<p>If this is a new b8 installation, read on at the <a class="reference internal" href="#installation">Installation</a> section!</p>
+<div class="section" id="update-from-bayes-php-version-0-2-1-or-earlier">
+<h2><a class="toc-backref" href="#id24">2.1&nbsp;&nbsp;&nbsp;Update from bayes-php version 0.2.1 or earlier</a></h2>
+<p>Please first follow the database update instructions of the bayes-php-0.3 release if you update from a version prior to bayes-php-0.3 and then read the following paragraph about updating from a version &lt;0.3.3.</p>
+</div>
+<div class="section" id="update-from-bayes-php-version-0-3-or-later">
+<h2><a class="toc-backref" href="#id25">2.2&nbsp;&nbsp;&nbsp;Update from bayes-php version 0.3 or later</a></h2>
+<dl class="docutils">
+<dt><strong>You use Berkeley DB?</strong></dt>
+<dd>Everything's fine, you can simply continue using your database.</dd>
+<dt><strong>You use MySQL?</strong></dt>
+<dd>The <tt class="docutils literal">CREATE</tt> statement of b8's wordlist has changed. The best is probably to create a dump via your favorite administration tool or script, create the new table and re-insert all data. The layout is still the same: there's one &quot;token&quot; column and one &quot;data&quot; column. Having done that, you can keep using your data.</dd>
+<dt><strong>You use SQLite?</strong></dt>
+<dd>Sorry, at the moment, there's no SQLite backend for b8. But we're working on it :-)</dd>
+</dl>
+<p>The configuration model of b8 has changed. Please read through the <a class="reference internal" href="#configuration">Configuration</a> section and update your configuration accordingly.</p>
+<p>b8's lexer has been partially re-written. It should now be able to handle all kind of non-latin-1 input, like cyrillic, chinese or japanese texts. Caused by this fact, much more tokens will be recognized when classifying such texts. Therefore, you could get different results in b8's ratings, even if the same database is used and although the math is still the same.</p>
+<p>b8 0.5 introduced two constants that can be used in the <tt class="docutils literal">learn()</tt> and <tt class="docutils literal">unlearn()</tt> functions: <tt class="docutils literal"><span class="pre">b8::HAM</span></tt> and <tt class="docutils literal"><span class="pre">b8::SPAM</span></tt>. The literal values &quot;ham&quot; and &quot;spam&quot; can still be used anyway.</p>
+</div>
+</div>
+<div class="section" id="installation">
+<h1><a class="toc-backref" href="#id26">3&nbsp;&nbsp;&nbsp;Installation</a></h1>
+<p>Installing b8 on your server is quite easy. You just have to provide the needed files. To do this, you could just upload the whole <tt class="docutils literal">b8</tt> subdirectory to the base directory of your homepage. It contains the filter itself and all needed backend classes. The other directories (<tt class="docutils literal">doc</tt>, <tt class="docutils literal">example</tt> and <tt class="docutils literal">install</tt>) are not used by b8.</p>
+<p>That's it ;-)</p>
+</div>
+<div class="section" id="configuration">
+<h1><a class="toc-backref" href="#id27">4&nbsp;&nbsp;&nbsp;Configuration</a></h1>
+<p>The configuration is passed as arrays when instantiating a new b8 object. Two arrays can be passed to b8, one containing b8's base configuration and some settings for the lexer (which should be common for all lexer classes, in case some other lexer than the default one will be written one day) and one for the storage backend. <br />
+You can have a look at <tt class="docutils literal">example/index.php</tt> to see how this can be done. <a class="reference internal" href="#using-b8-in-your-scripts">Using b8 in your scripts</a> also shows example code showing how b8 can be included in a PHP script.</p>
+<p>Not all values have to be set. When some values are missing, the default ones will be used. If you do use the default settings, you don't have to pass them to b8.</p>
+<div class="section" id="b8-s-base-configuration">
+<h2><a class="toc-backref" href="#id28">4.1&nbsp;&nbsp;&nbsp;b8's base configuration</a></h2>
+<p>All these values can be set in the &quot;config_b8&quot; array (the first parameter) passed to b8. The name of the array doesn't matter (of course), it just has to be the first argument.</p>
+<p>These are some basic settings telling b8 which backend classes to use:</p>
+<blockquote>
+<dl class="docutils">
+<dt><strong>storage</strong></dt>
+<dd><p class="first">This defines which storage backend will be used to save b8's wordlist. Currently, two backends are available: <a class="reference external" href="http://www.oracle.com/database/berkeley-db/index.html">Berkeley DB</a> (<tt class="docutils literal">dba</tt>) and <a class="reference external" href="http://mysql.com/">MySQL</a> (<tt class="docutils literal">mysql</tt>). At the moment, b8 does not support <a class="reference external" href="http://sqlite.org/">SQLite</a> (as the previous version did), but it will be (hopefully) re-added in one of the next releases. The default is <tt class="docutils literal">dba</tt> (string).</p>
+<dl class="docutils">
+<dt><em>Berkeley DB</em></dt>
+<dd>This is the preferred storage backend. It was the original backend for the filter and remains the most performant. b8's storage model is optimized for this database, as it is really fast and fits perfectly to what the filter needs to do the job. All content is saved in a single file, you don't need special user rights or a database server. <br />
+If you don't know whether your server's PHP can use a Berkeley DB, simply run the script <tt class="docutils literal">install/setup_berkeleydb.php</tt>. If it shows a Berkeley DB handler, please use this backend.</dd>
+<dt><em>MySQL</em></dt>
+<dd>As some webspace hosters don't allow using a Berkeley DB (but please be sure to check if you can use it!), but most do provide a MySQL server, using a MySQL table for the wordlist is provided as an alternative storage method. As said above, b8 was always intended to use a Berkeley DB. It doesn't use or need SQL to query the database. So, very likely, this will work less performant, produce a lot of unnecessary overhead and waste computing power. But it will do fine anyway!</dd>
+</dl>
+<p class="last">See <a class="reference internal" href="#configuration-of-the-storage-backend">Configuration of the storage backend</a> for the settings of the chosen backend.</p>
+</dd>
+<dt><strong>degenerator</strong></dt>
+<dd>The degenerator class to be used. See <a class="reference internal" href="#how-does-it-work">How does it work?</a> and <a class="footnote-reference" href="#betterbayesian" id="id12">[3]</a> if you're interested in what &quot;degeneration&quot; is. Defaults to <tt class="docutils literal">default</tt> (string). At the moment, only one degenerator exists, so you probably don't want to change this unless you have written your own degenerator.</dd>
+<dt><strong>lexer</strong></dt>
+<dd><p class="first">The lexer class to be used. Defaults to <tt class="docutils literal">default</tt> (string). At the moment, only one lexer exists, so you probably don't want to change this unless you have written your own lexer.</p>
+<p>The behaviour of the lexer can be additionally configured with the following variables:</p>
+<blockquote class="last">
+<dl class="docutils">
+<dt><strong>min_size</strong></dt>
+<dd>The minimal length for a token to be considered when calculating the rating of a text. Defaults to <tt class="docutils literal">3</tt> (integer).</dd>
+<dt><strong>max_size</strong></dt>
+<dd>The maximal length for a token to be considered when calculating the rating of a text. Defaults to <tt class="docutils literal">30</tt> (integer).</dd>
+<dt><strong>allow_numbers</strong></dt>
+<dd>Should pure numbers also be considered? Defaults to <tt class="docutils literal">FALSE</tt> (boolean).</dd>
+</dl>
+</blockquote>
+</dd>
+</dl>
+</blockquote>
+<p>The following settings influence the mathematical internals of b8. If you want to experiment, feel free to play around with them; but be warned: wrong settings of these values will result in poor performance or could even &quot;short-circuit&quot; the filter. <br />
+Leave these values as they are unless you know what you are doing!</p>
+<p>The &quot;Statistical discussion about b8&quot; <a class="footnote-reference" href="#b8statistic" id="id13">[6]</a> shows why the default values are the default ones.</p>
+<blockquote>
+<dl class="docutils">
+<dt><strong>use_relevant</strong></dt>
+<dd>This tells b8 how many tokens should be used when calculating the spamminess of a text. The default setting is <tt class="docutils literal">15</tt> (integer). This seems to be a quite reasonable value. When using to many tokens, the filter will fail on texts filled with useless stuff or with passages from a newspaper, etc. not being very spammish. <br />
+The tokens counted multiple times (see above) are added in addition to this value. They don't replace other ratings.</dd>
+<dt><strong>min_dev</strong></dt>
+<dd>This defines a minimum deviation from 0.5 that a token's rating must have to be considered when calculating the spamminess. Tokens with a rating closer to 0.5 than this value will simply be skipped. <br />
+If you don't want to use this feature, set this to <tt class="docutils literal">0</tt>. Defaults to <tt class="docutils literal">0.2</tt> (float). Read <a class="footnote-reference" href="#b8statistic" id="id14">[6]</a> before increasing this.</dd>
+<dt><strong>rob_x</strong></dt>
+<dd>This is Gary Robinson's <em>x</em> constant (cf. <a class="footnote-reference" href="#spamdetection" id="id15">[4]</a>). A completely unknown token will be rated with the value of <tt class="docutils literal">rob_x</tt>. The default <tt class="docutils literal">0.5</tt> (float) seems to be quite reasonable, as we can't say if a token that also can't be rated by degeneration is good or bad. <br />
+If you receive much more spam than ham or vice versa, you could change this setting accordingly.</dd>
+<dt><strong>rob_s</strong></dt>
+<dd>This is Gary Robinson's <em>s</em> constant. This is essentially the probability that the <em>rob_x</em> value is correct for a completely unknown token. It will also shift the probability of rarely seen tokens towards this value. The default is <tt class="docutils literal">0.3</tt> (float) <br />
+See <a class="footnote-reference" href="#spamdetection" id="id16">[4]</a> for a closer description of the <em>s</em> constant and read <a class="footnote-reference" href="#b8statistic" id="id17">[6]</a> for specific information about this constant in b8's algorithms.</dd>
+</dl>
+</blockquote>
+</div>
+<div class="section" id="configuration-of-the-storage-backend">
+<h2><a class="toc-backref" href="#id29">4.2&nbsp;&nbsp;&nbsp;Configuration of the storage backend</a></h2>
+<p>All the following values can be set in the &quot;config_database&quot; array (the second parameter) passed to b8. The name of the array doesn't matter (of course), it just has to be the second argument.</p>
+<div class="section" id="settings-for-the-berkeley-db-dba-backend">
+<h3><a class="toc-backref" href="#id30">4.2.1&nbsp;&nbsp;&nbsp;Settings for the Berkeley DB (DBA) backend</a></h3>
+<dl class="docutils">
+<dt><strong>database</strong></dt>
+<dd>The filename of the database file, relative to the location of <tt class="docutils literal">b8.php</tt>. Defaults to <tt class="docutils literal">wordlist.db</tt> (string).</dd>
+<dt><strong>handler</strong></dt>
+<dd>The DBA handler to use (cf. <a class="reference external" href="http://php.net/manual/en/dba.requirements.php">the PHP documentation</a> and <a class="reference internal" href="#setting-up-a-new-berkeley-db">Setting up a new Berkeley DB</a>). Defaults to <tt class="docutils literal">db4</tt> (string).</dd>
+</dl>
+</div>
+<div class="section" id="settings-for-the-mysql-backend">
+<h3><a class="toc-backref" href="#id31">4.2.2&nbsp;&nbsp;&nbsp;Settings for the MySQL backend</a></h3>
+<dl class="docutils">
+<dt><strong>database</strong></dt>
+<dd>The database containing b8's wordlist table. Defaults to <tt class="docutils literal">b8_wordlist</tt> (string).</dd>
+<dt><strong>table_name</strong></dt>
+<dd>The table containing b8's wordlist. Defaults to <tt class="docutils literal">b8_wordlist</tt> (string).</dd>
+<dt><strong>host</strong></dt>
+<dd>The host of the MySQL server. Defaults to <tt class="docutils literal">localhost</tt> (string).</dd>
+<dt><strong>user</strong></dt>
+<dd>The user name used to open the database connection. Defaults to <tt class="docutils literal">FALSE</tt> (boolean).</dd>
+<dt><strong>pass</strong></dt>
+<dd>The password required to open the database connection. Defaults to <tt class="docutils literal">FALSE</tt> (boolean).</dd>
+<dt><strong>connection</strong></dt>
+<dd>An existing MySQL link-resource that can be used by b8. Defaults to <tt class="docutils literal">NULL</tt> (NULL).</dd>
+</dl>
+</div>
+</div>
+</div>
+<div class="section" id="using-b8">
+<h1><a class="toc-backref" href="#id32">5&nbsp;&nbsp;&nbsp;Using b8</a></h1>
+<p>Now, that everything is configured, you can start to use b8. A sample script that shows what can be done with the filter exists in <tt class="docutils literal">example/index.php</tt>. The best thing for testing how all this works is to use this script before using b8 in your own scripts.</p>
+<p>Before you can start, you have to setup a database so that b8 can store a wordlist.</p>
+<div class="section" id="setting-up-a-new-database">
+<h2><a class="toc-backref" href="#id33">5.1&nbsp;&nbsp;&nbsp;Setting up a new database</a></h2>
+<div class="section" id="setting-up-a-new-berkeley-db">
+<h3><a class="toc-backref" href="#id34">5.1.1&nbsp;&nbsp;&nbsp;Setting up a new Berkeley DB</a></h3>
+<p>I wrote a script to setup a new Berkeley DB for b8. It is located in <tt class="docutils literal">install/setup_berkeleydb.php</tt>. Just run this script on your server and be sure that the directory containing it has the proper access rights set so that the server's HTTP server user or PHP user can create a new file in it (probably <tt class="docutils literal">0777</tt>). The script is quite self-explaining, just run it.</p>
+<p>Of course, you can also create a Berkeley DB by hand. In this case, you just have to insert three keys:</p>
+<pre class="literal-block">
+bayes*dbversion =&gt; 2
+bayes*texts.ham =&gt; 0
+bayes*texts.spam =&gt; 0
+</pre>
+<p>Be sure to set the right DBA handler in the storage backend configuration if it's not <tt class="docutils literal">db4</tt>.</p>
+</div>
+<div class="section" id="setting-up-a-new-mysql-table">
+<h3><a class="toc-backref" href="#id35">5.1.2&nbsp;&nbsp;&nbsp;Setting up a new MySQL table</a></h3>
+<p>The SQL file <tt class="docutils literal">install/setup_mysql.sql</tt> contains both the create statement for the wordlist table of b8 and the <tt class="docutils literal">INSERT</tt> statements for adding the necessary internal variables.</p>
+<p>Simply change the table name according to your needs (or leave it as it is ;-) and run the SQL to setup a b8 wordlist MySQL table.</p>
+</div>
+</div>
+<div class="section" id="using-b8-in-your-scripts">
+<h2><a class="toc-backref" href="#id36">5.2&nbsp;&nbsp;&nbsp;Using b8 in your scripts</a></h2>
+<p>Just have a look at the example script located in <tt class="docutils literal">example/index.php</tt> to see how you can include b8 in your scripts. Essentially, this strips down to:</p>
+<pre class="literal-block">
+# Include the b8 code
+require &quot;{$_SERVER['DOCUMENT_ROOT']}/b8/b8.php&quot;;
+
+# Do some configuration
+
+$config_b8 = array(
+ 'some_key' =&gt; 'some_value',
+ 'foo' =&gt; 'bar'
+);
+
+$config_database = array(
+ 'some_key' =&gt; 'some_value',
+ 'foo' =&gt; 'bar'
+);
+
+# Create a new b8 instance
+$b8 = new b8($config_b8, $config_database);
+</pre>
+<p>b8 provides three functions in an object oriented way (called e. g. via <tt class="docutils literal"><span class="pre">$b8-&gt;classify($text)</span></tt>):</p>
+<dl class="docutils">
+<dt><strong>learn($text, $category)</strong></dt>
+<dd>This saves the reference text <tt class="docutils literal">$text</tt> (string) in the category <tt class="docutils literal">$category</tt> (b8 constant). <br />
+b8 0.5 introduced two constants that can be used as <tt class="docutils literal">$category</tt>: <tt class="docutils literal"><span class="pre">b8::HAM</span></tt> and <tt class="docutils literal"><span class="pre">b8::SPAM</span></tt>. To be downward compatible with older versions of b8, the literal values &quot;ham&quot; and &quot;spam&quot; (case-sensitive strings) can still be used here.</dd>
+<dt><strong>unlearn($text, $category)</strong></dt>
+<dd>This function just exists to delete a text from a category in which is has been stored accidentally before. It deletes the reference text <tt class="docutils literal">$text</tt> (string) from the category <tt class="docutils literal">$category</tt> (either the constants <tt class="docutils literal"><span class="pre">b8::HAM</span></tt> or <tt class="docutils literal"><span class="pre">b8::SPAM</span></tt> or the literal case-sensitive strings &quot;ham&quot; or &quot;spam&quot; – cf. above). <br />
+<strong>Don't delete a spam text from ham after saving it in spam or vice versa, as long you don't have stored it accidentally in the wrong category before!</strong> This will not improve performance, quite the opposite: it will actually break the filter after a time, as the counter for saved ham or spam texts will reach 0, although you have ham or spam tokens stored: the filter will try to remove texts from the ham or spam data which have never been stored there, decrease the counter for tokens which are found just skip the non-existing words.</dd>
+<dt><strong>classify($text)</strong></dt>
+<dd>This function takes the text <tt class="docutils literal">$text</tt> (string), calculates it's probability for being spam it and returns a value between 0 and 1 (float). <br />
+A value close to 0 says the text is more likely ham and a value close to 1 says the text is more likely spam. What to do with this value is <em>your</em> business ;-) See also <a class="reference internal" href="#tips-on-operation">Tips on operation</a> below.</dd>
+</dl>
+</div>
+</div>
+<div class="section" id="tips-on-operation">
+<h1><a class="toc-backref" href="#id37">6&nbsp;&nbsp;&nbsp;Tips on operation</a></h1>
+<p>Before b8 can decide whether a text is spam or ham, you have to tell it what you consider as spam or ham. At least one learned spam or one learned ham text is needed to calculate anything. To get good ratings, you need both learned ham and learned spam texts, the more the better. <br />
+What's considered as &quot;ham&quot; or &quot;spam&quot; can be very different, depending on the operation site. On my homepage, practically each and every text posted in English or using cyrillic letters is spam. On an English or Russian homepage, this will be not the case. So I think it's not really meaningful to provide some &quot;spam data&quot; to start. Just train b8 with &quot;your&quot; spam and ham.</p>
+<p>For the practical use, I advise to give the filter all data availible. E. g. name, email address, homepage, IP address und of course the text itself should be stored in a variable (e. g. separated with an <tt class="docutils literal">\n</tt> or just a space or tab after each block) and then be classified. The learning should also be done with all data availible. <br />
+Saving the IP address is probably only meaningful for spam entries, because spammers often use the same IP address multiple times. In principle, you can leave out the IP of ham entries.</p>
+<p>You can use b8 e. g. in a guestbook script and let it classify the text before saving it. Everyone has to decide which rating is necessary to classify a text as &quot;spam&quot;, but a rating of &gt;= 0.8 seems to be reasonable for me. If one expects the spam to be in another language that the ham entries or the spams are very short normally, one could also think about a limit of 0.7. <br />
+The email filters out there mostly use &gt; 0.9 or even &gt; 0.99; but keep in mind that they have way more data to analyze in most of the cases. A guestbook entry may be quite short, especially when it's spam.</p>
+<p>In my opinion, a autolearn function is very handy. I save spam messages with a rating higher than 0.7 but less than 0.9 automatically as spam. I don't do this with ham messages in an automated way to prevent the filter from saving a false negative as ham and then classifying and learning all the spam as ham when I'm on holidays ;-)</p>
+</div>
+<div class="section" id="closing">
+<h1><a class="toc-backref" href="#id38">7&nbsp;&nbsp;&nbsp;Closing</a></h1>
+<p>So … that's it. Thanks for using b8! If you find a bug or have an idea how to make b8 better, let me know. I'm also always looking forward to get e-mails from people using b8 on their homepages :-)</p>
+</div>
+<div class="section" id="references">
+<h1><a class="toc-backref" href="#id39">8&nbsp;&nbsp;&nbsp;References</a></h1>
+<table class="docutils footnote" frame="void" id="planforspam" rules="none">
+<colgroup><col class="label" /><col /></colgroup>
+<tbody valign="top">
+<tr><td class="label">[2]</td><td><em>(<a class="fn-backref" href="#id3">1</a>, <a class="fn-backref" href="#id9">2</a>)</em> Paul Graham, <em>A Plan For Spam</em> (<a class="reference external" href="http://paulgraham.com/spam.html">http://paulgraham.com/spam.html</a>)</td></tr>
+</tbody>
+</table>
+<table class="docutils footnote" frame="void" id="betterbayesian" rules="none">
+<colgroup><col class="label" /><col /></colgroup>
+<tbody valign="top">
+<tr><td class="label">[3]</td><td><em>(<a class="fn-backref" href="#id4">1</a>, <a class="fn-backref" href="#id7">2</a>, <a class="fn-backref" href="#id12">3</a>)</em> Paul Graham, <em>Better Bayesian Filtering</em> (<a class="reference external" href="http://paulgraham.com/better.html">http://paulgraham.com/better.html</a>)</td></tr>
+</tbody>
+</table>
+<table class="docutils footnote" frame="void" id="spamdetection" rules="none">
+<colgroup><col class="label" /><col /></colgroup>
+<tbody valign="top">
+<tr><td class="label">[4]</td><td><em>(<a class="fn-backref" href="#id5">1</a>, <a class="fn-backref" href="#id8">2</a>, <a class="fn-backref" href="#id15">3</a>, <a class="fn-backref" href="#id16">4</a>)</em> Gary Robinson, <em>Spam Detection</em> (<a class="reference external" href="http://radio.weblogs.com/0101454/stories/2002/09/16/spamDetection.html">http://radio.weblogs.com/0101454/stories/2002/09/16/spamDetection.html</a>)</td></tr>
+</tbody>
+</table>
+<table class="docutils footnote" frame="void" id="statisticalapproach" rules="none">
+<colgroup><col class="label" /><col /></colgroup>
+<tbody valign="top">
+<tr><td class="label"><a class="fn-backref" href="#id6">[5]</a></td><td><em>A Statistical Approach to the Spam Problem</em> (<a class="reference external" href="http://linuxjournal.com/article/6467">http://linuxjournal.com/article/6467</a>)</td></tr>
+</tbody>
+</table>
+<table class="docutils footnote" frame="void" id="b8statistic" rules="none">
+<colgroup><col class="label" /><col /></colgroup>
+<tbody valign="top">
+<tr><td class="label">[6]</td><td><em>(<a class="fn-backref" href="#id13">1</a>, <a class="fn-backref" href="#id14">2</a>, <a class="fn-backref" href="#id17">3</a>)</em> Tobias Leupold, <em>Statistical discussion about b8</em> (<a class="reference external" href="http://nasauber.de/opensource/b8/discussion/">http://nasauber.de/opensource/b8/discussion/</a>)</td></tr>
+</tbody>
+</table>
+</div>
+<div class="section" id="appendix">
+<h1><a class="toc-backref" href="#id40">9&nbsp;&nbsp;&nbsp;Appendix</a></h1>
+<div class="section" id="faq">
+<h2><a class="toc-backref" href="#id41">9.1&nbsp;&nbsp;&nbsp;FAQ</a></h2>
+<div class="section" id="what-about-more-than-two-categories">
+<h3><a class="toc-backref" href="#id42">9.1.1&nbsp;&nbsp;&nbsp;What about more than two categories?</a></h3>
+<p>I wrote b8 with the <a class="reference external" href="http://en.wikipedia.org/wiki/KISS_principle">KISS principle</a> in mind. For the &quot;end-user&quot;, we have a class with almost no setup to do that can do three things: classify a text, learn a text and un-learn a text. Normally, there's no need to un-learn a text, so essentially, there are only two functions we need. <br />
+This simplicity is only possible because b8 only knows two categories (normally &quot;Ham&quot; and &quot;Spam&quot; or some other category pair) and tells you, in one float number between 0 and 1, if a given texts rather fits in the first or the second category. If we would support multiple categories, more work would have to be done and things would become more complicated. One would have to setup the categories, have another database layout (perhaps making it mandatory to have SQL) and one float number would not be sufficient to describe b8's output, so more code would be needed – even outside of b8.</p>
+<p>All the code, the database layout and particularly the math is intended to do exactly one thing: distinguish between two categories. I think it would be a lot of work to change b8 so that it would support more than two categories. Probably, this is possible to do, but don't ask me in which way we would have to change the math to get multiple-category support – I'm a dentist, not a mathematician ;-) <br />
+Apart from this I do believe that most people using b8 don't want or need multiple categories. They just want to know if a text is spam or not, don't they? I do, at least ;-)</p>
+<p>But let's think about the multiple-category thing. How would we calculate a rating for more than two categories? If we had a third one, let's call it &quot;<a class="reference external" href="http://en.wikipedia.org/wiki/Treet">Treet</a>&quot;, how would we calculate a rating? We could calculate three different ratings. One for &quot;Ham&quot;, one for &quot;Spam&quot; and one for &quot;Treet&quot; and choose the highest one to tell the user what category fits best for the text. This could be done by using a small wrapper script using three instances of b8 as-is and three different databases, each containing texts being &quot;Ham&quot;, &quot;Spam&quot;, &quot;Treet&quot; and the respective counterparts. <br />
+But here's the problem: if we have &quot;Ham&quot; and &quot;Spam&quot;, &quot;Spam&quot; is the counterpart of &quot;Ham&quot;. But what's the counterpart of &quot;Spam&quot; if we have more than one additional category? Where do the &quot;Non-Ham&quot;, &quot;Non-Spam&quot; and &quot;Non-Treet&quot; texts come from?</p>
+<p>Another approach, a direct calculation of more than two probabilities (the &quot;Ham&quot; probability is simply 1 minus the &quot;Spam&quot; probability, so we actually get two probabilities with the return value of b8) out of one database would require big changes in b8's structure and math.</p>
+<p>There's a project called <a class="reference external" href="http://xhtml.net/scripts/PHPNaiveBayesianFilter">PHPNaiveBayesianFilter</a> which supports multiple categories by default. The author calls his software &quot;Version 1.0&quot;, but I think this is the very first release, not a stable or mature one. The most recent change of that release dates back to 2003 according to the &quot;changed&quot; date of the files inside the zip archive, so probably, this project is dead or has never been alive and under active development at all. <br />
+Actually, I played around with that code but the results weren't really good, so I decided to write my own spam filter from scratch back in early 2006 ;-)</p>
+<p>All in all, there seems to be no easy way to implement multiple (meaning more than two) categories using b8's current code base and probably, b8 will never support more than two categories. Perhaps, a fork or a complete re-write would be better than implementing such a feature. Anyway, I don't close my mind to multiple categories in b8. Feel free to tell me how multiple categories could be implementented in b8 or how a multiple-category version using the same code base (sharing a common abstract class?) could be written.</p>
+</div>
+<div class="section" id="what-about-a-list-with-words-to-ignore">
+<h3><a class="toc-backref" href="#id43">9.1.2&nbsp;&nbsp;&nbsp;What about a list with words to ignore?</a></h3>
+<p>Some people suggested to introduce a list with words that b8 will simply ignore. Like &quot;and&quot;, &quot;or&quot;, &quot;the&quot;, and so on. I don't think this is very meaningful.</p>
+<p>First, it would just work for the particular language that has been stored in the list. Speaking of my homepage, most of my spam is English, almost all my ham is German. So I would have to maintain a list with the probably less interesting words for at least two languages. Additionally, I get spam in Chinese, Japanese and Cyrillic writing or something else I can't read as well. What word should be ignored in those texts? <br />
+Second, why should we ever exclude words? Who tells us those words are <em>actually</em> meaningless? If a word appears both in ham and spam, it's rating will be near 0.5 and so, it won't be used for the final calculation if a appropriate minimum deviation was set. So b8 will exclude it anyway without any blacklist. And think of this: if we excluded a word of which we only <em>think</em> it doesn't mean anything but it actually does appear more often in ham or spam, the results will get even worse.</p>
+<p>So why should we care about things we do not have to care about? ;-)</p>
+</div>
+<div class="section" id="why-is-it-called-b8">
+<h3><a class="toc-backref" href="#id44">9.1.3&nbsp;&nbsp;&nbsp;Why is it called &quot;b8&quot;?</a></h3>
+<p>The initial name for the filter was (damn creative!) &quot;bayes-php&quot;. There were two main reasons for searching another name: 1. &quot;bayes-php&quot; sucks. 2. the <a class="reference external" href="http://php.net/license/3_01.txt">PHP License</a> says the PHP guys do not like when the name of a script written in PHP contains the word &quot;PHP&quot;. Read the <a class="reference external" href="http://www.php.net/license/index.php#faq-lic">License FAQ</a> for a reasonable argumentation about this.</p>
+<p>Luckily, <a class="reference external" href="http://langt.net/">Tobias Lang</a> proposed the new name &quot;b8&quot;. And these are the reasons why I chose this name:</p>
+<ul class="simple">
+<li>&quot;bayes-php&quot; is a &quot;b&quot; followed by 8 letters.</li>
+<li>&quot;b8&quot; is short and handy. Additionally, there was no program with the name &quot;b8&quot; or &quot;bate&quot;</li>
+<li>The English verb &quot;to bate&quot; means &quot;to decrease&quot; – and that's what b8 does: it decreases the number of spam entries in your weblog or guestbook!</li>
+<li>&quot;b8&quot; just sounds way cooler than &quot;bayes-php&quot; ;-)</li>
+</ul>
+</div>
+</div>
+<div class="section" id="about-the-database">
+<h2><a class="toc-backref" href="#id45">9.2&nbsp;&nbsp;&nbsp;About the database</a></h2>
+<div class="section" id="the-database-layout">
+<h3><a class="toc-backref" href="#id46">9.2.1&nbsp;&nbsp;&nbsp;The database layout</a></h3>
+<p>The database layout is quite simple. It's just key:value for everything stored. There are three &quot;internal&quot; variables stored as normal tokens (but all containing a <tt class="docutils literal">*</tt> which is always used as a split character by the lexer, so we can't get collisions):</p>
+<dl class="docutils">
+<dt><strong>bayes*dbversion</strong></dt>
+<dd>This indicates the database's &quot;version&quot;. The first versions of b8 did not set this. Version &quot;2&quot; indicates that we have a database created by a b8 version already storing <a class="reference internal" href="#the-lastseen-parameter">the &quot;lastseen&quot; parameter</a>.</dd>
+<dt><strong>bayes*texts.ham</strong></dt>
+<dd>The number of ham texts learned.</dd>
+<dt><strong>bayes*texts.spam</strong></dt>
+<dd>The number of spam texts learned.</dd>
+</dl>
+<p>Each &quot;normal&quot; token is stored with it's literal name as the key and it's data as the value. The data consists of the count of the token in all ham and spam texts and the date when the token was used the last time, all in one string and separated by spaces. So we have the following scheme:</p>
+<pre class="literal-block">
+&quot;token&quot; =&gt; &quot;count_ham count_spam lastseen&quot;
+</pre>
+</div>
+<div class="section" id="the-lastseen-parameter">
+<h3><a class="toc-backref" href="#id47">9.2.2&nbsp;&nbsp;&nbsp;The &quot;lastseen&quot; parameter</a></h3>
+<p>Somebody looking at the code might be wondering why b8 stores this &quot;lastseen&quot; parameter. This value is not used for any calculation at the moment. Initially, it was intended to keep the database maintainable in a way that &quot;old&quot; data could be removed. When e. g. a token only appeared once in ham or spam and has not been seen for a year, one could simply delete it from the database. <br />
+I actually never used this feature (does anybody?). So probably, some changes will be done to this one day. Perhaps, I find a way to include this data in the spamminess calculation in a meaningful way, or at least for some statistics. One could also make this optional to keep the calculation effort small if this is needed.</p>
+<p>Feel free to send me any suggestions about this!</p>
+</div>
+</div>
+</div>
+</div>
+</body>
+</html>
diff --git a/library/spam/doc/readme.rst b/library/spam/doc/readme.rst
new file mode 100644
index 000000000..451b28326
--- /dev/null
+++ b/library/spam/doc/readme.rst
@@ -0,0 +1,371 @@
+==========
+b8: readme
+==========
+
+:Author: Tobias Leupold
+:Homepage: http://nasauber.de/
+:Contact: tobias.leupold@web.de
+:Date: |date|
+
+.. contents:: Table of Contents
+
+Description of b8
+=================
+
+What is b8?
+-----------
+
+b8 is a spam filter implemented in `PHP <http://www.php.net/>`__. It is intended to keep your weblog or guestbook spam-free. The filter can be used anywhere in your PHP code and tells you whether a text is spam or not, using statistical text analysis. See `How does it work?`_ for details about this. To be able to do this, b8 first has to learn some spam and some ham example texts to decide what's good and what's not. If it makes mistakes classifying unknown texts, they can be corrected and b8 learns from the corrections, getting better with each learned text.
+
+At the moment of this writing, b8 has classified 14411 guestbook entries and weblog comments on my homepage since december 2006. 131 were ham. 39 spam texts (0.27 %) have been rated as ham (false negatives), with not even one false positive (ham message classified as spam). This results in a sensitivity of 99.73 % (the probability that a spam text will actually be rated as spam) and a specifity of 100 % (the probability that a ham text will actually be rated as ham) for me. I hope, you'll get the same good results :-)
+
+Basically, b8 is a statistical ("Bayesian"[#]_) spam filter like `Bogofilter <http://bogofilter.sourceforge.net/>`__ or `SpamBayes <http://spambayes.sourceforge.net/>`__, but it is not intended to classify e-mails. When I started to write b8, I didn't find a good PHP spam filter (or any spam filter that wasn't just some example code how one *could* implement a Bayesian spam filter in PHP) that was intended to filter weblog or guestbook entries. That's why I had to write my own ;-) |br|
+Caused by it's purpose, the way b8 works is slightly different from most of the Bayesian email spam filters out there. See `What's different?`_ if you're interested in the details.
+
+.. [#] A mathematician told me that the math in b8 actually does not use Bayes' theorem but some derived algorithms that are just related to it. So … let's simply believe that and stop claiming b8 was a *Bayesian* spam filter ;-)
+
+How does it work?
+-----------------
+
+b8 basically uses the math and technique described in Paul Graham's article "A Plan For Spam" [#planforspam]_ to distinguish ham and spam. The improvements proposed in Graham's article "Better Bayesian Filtering" [#betterbayesian]_ and Gary Robinson's article "Spam Detection" [#spamdetection]_ have also been considered. See also the article "A Statistical Approach to the Spam Problem" [#statisticalapproach]_.
+
+b8 cuts the text to classify to pieces, extracting stuff like e-mail addresses, links and HTML tags. For each such token, it calculates a single probability for a text containing it being spam, based on what the filter has learned so far. When the token was not seen before, b8 tries to find similar ones using the "degeneration" described in [#betterbayesian]_ and uses the most relevant value found. If really nothing is found, b8 assumes a default rating for this token for the further calculations. |br|
+Then, b8 takes the most relevant values (which have a rating far from 0.5, which would mean we don't know what it is) and calculates the probability that the whole text is spam by the inverse chi-square function described in [#spamdetection]_.
+There are some parameters that can be set which influence the filter's behaviour (see below).
+
+In short words: you give b8 a text and it returns a value between 0 and 1, saying it's ham when it's near 0 and saying it's spam when it's near 1.
+
+What do I need for it?
+----------------------
+
+Not much! You just need PHP 5 on the server where b8 will be used (b8 version 0.5 finally dropped PHP 4 compatibility – thankfully ;-) and a proper storage possibility for the wordlists. I strongly recommend using `Berkeley DB <http://www.oracle.com/database/berkeley-db/index.html>`_. See below how you can check if you can use it and why you should use it. If the server's PHP wasn't compiled with Berkeley DB support, a `MySQL <http://mysql.com/>`_ table can be used alternatively.
+
+What's different?
+-----------------
+
+b8 is designed to classify weblog or guestbook entries, not e-mails. For this reason, it uses a slightly different technique than most of the other statistical spam filters out there use.
+
+My experience was that spam entries on my weblog or guestbook were often quite short, sometimes just something like "123abc" as text and a link to a suspect homepage. Some spam bots don't even made a difference between e. g. the "name" and "text" fields and posted their text as email address, for example. Considering this, b8 just takes one string to classify, making no difference between "headers" and "text". |br|
+The other thing is that most statistical spam filters count one token one time, no matter how often it appears in the text (as Graham describes it in [#planforspam]_). b8 does count how often a token was seen and learns or considers this. Additionally, the number of learned ham and spam texts are saved and used as the calculation base for the single probabilities. Why this? Because a text containing one link (no matter where it points to, just indicated by a "\h\t\t\p\:\/\/" or a "www.") might not be spam, but a text containing 20 links might be.
+
+This means that b8 might be good for classifying weblog or guestbook entries (I really think it is ;-) – but very likely, it will work quite poor when being used for something else (like classifying e-mails). But as said above, for this task, there are a lot of very good filters out there to choose from.
+
+Update from prior versions
+==========================
+
+If this is a new b8 installation, read on at the `Installation`_ section!
+
+Update from bayes-php version 0.2.1 or earlier
+----------------------------------------------
+
+Please first follow the database update instructions of the bayes-php-0.3 release if you update from a version prior to bayes-php-0.3 and then read the following paragraph about updating from a version <0.3.3.
+
+Update from bayes-php version 0.3 or later
+------------------------------------------
+
+**You use Berkeley DB?**
+ Everything's fine, you can simply continue using your database.
+
+**You use MySQL?**
+ The ``CREATE`` statement of b8's wordlist has changed. The best is probably to create a dump via your favorite administration tool or script, create the new table and re-insert all data. The layout is still the same: there's one "token" column and one "data" column. Having done that, you can keep using your data.
+
+**You use SQLite?**
+ Sorry, at the moment, there's no SQLite backend for b8. But we're working on it :-)
+
+The configuration model of b8 has changed. Please read through the `Configuration`_ section and update your configuration accordingly.
+
+b8's lexer has been partially re-written. It should now be able to handle all kind of non-latin-1 input, like cyrillic, chinese or japanese texts. Caused by this fact, much more tokens will be recognized when classifying such texts. Therefore, you could get different results in b8's ratings, even if the same database is used and although the math is still the same.
+
+b8 0.5 introduced two constants that can be used in the ``learn()`` and ``unlearn()`` functions: ``b8::HAM`` and ``b8::SPAM``. The literal values "ham" and "spam" can still be used anyway.
+
+Installation
+============
+
+Installing b8 on your server is quite easy. You just have to provide the needed files. To do this, you could just upload the whole ``b8`` subdirectory to the base directory of your homepage. It contains the filter itself and all needed backend classes. The other directories (``doc``, ``example`` and ``install``) are not used by b8.
+
+That's it ;-)
+
+Configuration
+=============
+
+The configuration is passed as arrays when instantiating a new b8 object. Two arrays can be passed to b8, one containing b8's base configuration and some settings for the lexer (which should be common for all lexer classes, in case some other lexer than the default one will be written one day) and one for the storage backend. |br|
+You can have a look at ``example/index.php`` to see how this can be done. `Using b8 in your scripts`_ also shows example code showing how b8 can be included in a PHP script.
+
+Not all values have to be set. When some values are missing, the default ones will be used. If you do use the default settings, you don't have to pass them to b8.
+
+b8's base configuration
+-----------------------
+
+All these values can be set in the "config_b8" array (the first parameter) passed to b8. The name of the array doesn't matter (of course), it just has to be the first argument.
+
+These are some basic settings telling b8 which backend classes to use:
+
+ **storage**
+ This defines which storage backend will be used to save b8's wordlist. Currently, two backends are available: `Berkeley DB <http://www.oracle.com/database/berkeley-db/index.html>`_ (``dba``) and `MySQL <http://mysql.com/>`_ (``mysql``). At the moment, b8 does not support `SQLite <http://sqlite.org/>`_ (as the previous version did), but it will be (hopefully) re-added in one of the next releases. The default is ``dba`` (string).
+
+ *Berkeley DB*
+ This is the preferred storage backend. It was the original backend for the filter and remains the most performant. b8's storage model is optimized for this database, as it is really fast and fits perfectly to what the filter needs to do the job. All content is saved in a single file, you don't need special user rights or a database server. |br|
+ If you don't know whether your server's PHP can use a Berkeley DB, simply run the script ``install/setup_berkeleydb.php``. If it shows a Berkeley DB handler, please use this backend.
+
+ *MySQL*
+ As some webspace hosters don't allow using a Berkeley DB (but please be sure to check if you can use it!), but most do provide a MySQL server, using a MySQL table for the wordlist is provided as an alternative storage method. As said above, b8 was always intended to use a Berkeley DB. It doesn't use or need SQL to query the database. So, very likely, this will work less performant, produce a lot of unnecessary overhead and waste computing power. But it will do fine anyway!
+
+ See `Configuration of the storage backend`_ for the settings of the chosen backend.
+
+ **degenerator**
+ The degenerator class to be used. See `How does it work?`_ and [#betterbayesian]_ if you're interested in what "degeneration" is. Defaults to ``default`` (string). At the moment, only one degenerator exists, so you probably don't want to change this unless you have written your own degenerator.
+
+ **lexer**
+ The lexer class to be used. Defaults to ``default`` (string). At the moment, only one lexer exists, so you probably don't want to change this unless you have written your own lexer.
+
+ The behaviour of the lexer can be additionally configured with the following variables:
+
+ **min_size**
+ The minimal length for a token to be considered when calculating the rating of a text. Defaults to ``3`` (integer).
+
+ **max_size**
+ The maximal length for a token to be considered when calculating the rating of a text. Defaults to ``30`` (integer).
+
+ **allow_numbers**
+ Should pure numbers also be considered? Defaults to ``FALSE`` (boolean).
+
+The following settings influence the mathematical internals of b8. If you want to experiment, feel free to play around with them; but be warned: wrong settings of these values will result in poor performance or could even "short-circuit" the filter. |br|
+Leave these values as they are unless you know what you are doing!
+
+The "Statistical discussion about b8" [#b8statistic]_ shows why the default values are the default ones.
+
+ **use_relevant**
+ This tells b8 how many tokens should be used when calculating the spamminess of a text. The default setting is ``15`` (integer). This seems to be a quite reasonable value. When using to many tokens, the filter will fail on texts filled with useless stuff or with passages from a newspaper, etc. not being very spammish. |br|
+ The tokens counted multiple times (see above) are added in addition to this value. They don't replace other ratings.
+
+ **min_dev**
+ This defines a minimum deviation from 0.5 that a token's rating must have to be considered when calculating the spamminess. Tokens with a rating closer to 0.5 than this value will simply be skipped. |br|
+ If you don't want to use this feature, set this to ``0``. Defaults to ``0.2`` (float). Read [#b8statistic]_ before increasing this.
+
+ **rob_x**
+ This is Gary Robinson's *x* constant (cf. [#spamdetection]_). A completely unknown token will be rated with the value of ``rob_x``. The default ``0.5`` (float) seems to be quite reasonable, as we can't say if a token that also can't be rated by degeneration is good or bad. |br|
+ If you receive much more spam than ham or vice versa, you could change this setting accordingly.
+
+ **rob_s**
+ This is Gary Robinson's *s* constant. This is essentially the probability that the *rob_x* value is correct for a completely unknown token. It will also shift the probability of rarely seen tokens towards this value. The default is ``0.3`` (float) |br|
+ See [#spamdetection]_ for a closer description of the *s* constant and read [#b8statistic]_ for specific information about this constant in b8's algorithms.
+
+Configuration of the storage backend
+------------------------------------
+
+All the following values can be set in the "config_database" array (the second parameter) passed to b8. The name of the array doesn't matter (of course), it just has to be the second argument.
+
+Settings for the Berkeley DB (DBA) backend
+``````````````````````````````````````````
+**database**
+ The filename of the database file, relative to the location of ``b8.php``. Defaults to ``wordlist.db`` (string).
+
+**handler**
+ The DBA handler to use (cf. `the PHP documentation <http://php.net/manual/en/dba.requirements.php>`_ and `Setting up a new Berkeley DB`_). Defaults to ``db4`` (string).
+
+Settings for the MySQL backend
+``````````````````````````````
+
+**database**
+ The database containing b8's wordlist table. Defaults to ``b8_wordlist`` (string).
+
+**table_name**
+ The table containing b8's wordlist. Defaults to ``b8_wordlist`` (string).
+
+**host**
+ The host of the MySQL server. Defaults to ``localhost`` (string).
+
+**user**
+ The user name used to open the database connection. Defaults to ``FALSE`` (boolean).
+
+**pass**
+ The password required to open the database connection. Defaults to ``FALSE`` (boolean).
+
+**connection**
+ An existing MySQL link-resource that can be used by b8. Defaults to ``NULL`` (NULL).
+
+Using b8
+========
+
+Now, that everything is configured, you can start to use b8. A sample script that shows what can be done with the filter exists in ``example/index.php``. The best thing for testing how all this works is to use this script before using b8 in your own scripts.
+
+Before you can start, you have to setup a database so that b8 can store a wordlist.
+
+Setting up a new database
+-------------------------
+
+Setting up a new Berkeley DB
+````````````````````````````
+
+I wrote a script to setup a new Berkeley DB for b8. It is located in ``install/setup_berkeleydb.php``. Just run this script on your server and be sure that the directory containing it has the proper access rights set so that the server's HTTP server user or PHP user can create a new file in it (probably ``0777``). The script is quite self-explaining, just run it.
+
+Of course, you can also create a Berkeley DB by hand. In this case, you just have to insert three keys:
+
+::
+
+ bayes*dbversion => 2
+ bayes*texts.ham => 0
+ bayes*texts.spam => 0
+
+Be sure to set the right DBA handler in the storage backend configuration if it's not ``db4``.
+
+Setting up a new MySQL table
+````````````````````````````
+
+The SQL file ``install/setup_mysql.sql`` contains both the create statement for the wordlist table of b8 and the ``INSERT`` statements for adding the necessary internal variables.
+
+Simply change the table name according to your needs (or leave it as it is ;-) and run the SQL to setup a b8 wordlist MySQL table.
+
+Using b8 in your scripts
+------------------------
+
+Just have a look at the example script located in ``example/index.php`` to see how you can include b8 in your scripts. Essentially, this strips down to:
+
+::
+
+ # Include the b8 code
+ require "{$_SERVER['DOCUMENT_ROOT']}/b8/b8.php";
+
+ # Do some configuration
+
+ $config_b8 = array(
+ 'some_key' => 'some_value',
+ 'foo' => 'bar'
+ );
+
+ $config_database = array(
+ 'some_key' => 'some_value',
+ 'foo' => 'bar'
+ );
+
+ # Create a new b8 instance
+ $b8 = new b8($config_b8, $config_database);
+
+b8 provides three functions in an object oriented way (called e. g. via ``$b8->classify($text)``):
+
+**learn($text, $category)**
+ This saves the reference text ``$text`` (string) in the category ``$category`` (b8 constant). |br|
+ b8 0.5 introduced two constants that can be used as ``$category``: ``b8::HAM`` and ``b8::SPAM``. To be downward compatible with older versions of b8, the literal values "ham" and "spam" (case-sensitive strings) can still be used here.
+
+**unlearn($text, $category)**
+ This function just exists to delete a text from a category in which is has been stored accidentally before. It deletes the reference text ``$text`` (string) from the category ``$category`` (either the constants ``b8::HAM`` or ``b8::SPAM`` or the literal case-sensitive strings "ham" or "spam" – cf. above). |br|
+ **Don't delete a spam text from ham after saving it in spam or vice versa, as long you don't have stored it accidentally in the wrong category before!** This will not improve performance, quite the opposite: it will actually break the filter after a time, as the counter for saved ham or spam texts will reach 0, although you have ham or spam tokens stored: the filter will try to remove texts from the ham or spam data which have never been stored there, decrease the counter for tokens which are found just skip the non-existing words.
+
+**classify($text)**
+ This function takes the text ``$text`` (string), calculates it's probability for being spam it and returns a value between 0 and 1 (float). |br|
+ A value close to 0 says the text is more likely ham and a value close to 1 says the text is more likely spam. What to do with this value is *your* business ;-) See also `Tips on operation`_ below.
+
+Tips on operation
+=================
+
+Before b8 can decide whether a text is spam or ham, you have to tell it what you consider as spam or ham. At least one learned spam or one learned ham text is needed to calculate anything. To get good ratings, you need both learned ham and learned spam texts, the more the better. |br|
+What's considered as "ham" or "spam" can be very different, depending on the operation site. On my homepage, practically each and every text posted in English or using cyrillic letters is spam. On an English or Russian homepage, this will be not the case. So I think it's not really meaningful to provide some "spam data" to start. Just train b8 with "your" spam and ham.
+
+For the practical use, I advise to give the filter all data availible. E. g. name, email address, homepage, IP address und of course the text itself should be stored in a variable (e. g. separated with an ``\n`` or just a space or tab after each block) and then be classified. The learning should also be done with all data availible. |br|
+Saving the IP address is probably only meaningful for spam entries, because spammers often use the same IP address multiple times. In principle, you can leave out the IP of ham entries.
+
+You can use b8 e. g. in a guestbook script and let it classify the text before saving it. Everyone has to decide which rating is necessary to classify a text as "spam", but a rating of >= 0.8 seems to be reasonable for me. If one expects the spam to be in another language that the ham entries or the spams are very short normally, one could also think about a limit of 0.7. |br|
+The email filters out there mostly use > 0.9 or even > 0.99; but keep in mind that they have way more data to analyze in most of the cases. A guestbook entry may be quite short, especially when it's spam.
+
+In my opinion, a autolearn function is very handy. I save spam messages with a rating higher than 0.7 but less than 0.9 automatically as spam. I don't do this with ham messages in an automated way to prevent the filter from saving a false negative as ham and then classifying and learning all the spam as ham when I'm on holidays ;-)
+
+Closing
+=======
+
+So … that's it. Thanks for using b8! If you find a bug or have an idea how to make b8 better, let me know. I'm also always looking forward to get e-mails from people using b8 on their homepages :-)
+
+References
+==========
+
+.. [#planforspam] Paul Graham, *A Plan For Spam* (http://paulgraham.com/spam.html)
+.. [#betterbayesian] Paul Graham, *Better Bayesian Filtering* (http://paulgraham.com/better.html)
+.. [#spamdetection] Gary Robinson, *Spam Detection* (http://radio.weblogs.com/0101454/stories/2002/09/16/spamDetection.html)
+.. [#statisticalapproach] *A Statistical Approach to the Spam Problem* (http://linuxjournal.com/article/6467)
+.. [#b8statistic] Tobias Leupold, *Statistical discussion about b8* (http://nasauber.de/opensource/b8/discussion/)
+
+Appendix
+========
+
+FAQ
+---
+
+What about more than two categories?
+````````````````````````````````````
+
+I wrote b8 with the `KISS principle <http://en.wikipedia.org/wiki/KISS_principle>`__ in mind. For the "end-user", we have a class with almost no setup to do that can do three things: classify a text, learn a text and un-learn a text. Normally, there's no need to un-learn a text, so essentially, there are only two functions we need. |br|
+This simplicity is only possible because b8 only knows two categories (normally "Ham" and "Spam" or some other category pair) and tells you, in one float number between 0 and 1, if a given texts rather fits in the first or the second category. If we would support multiple categories, more work would have to be done and things would become more complicated. One would have to setup the categories, have another database layout (perhaps making it mandatory to have SQL) and one float number would not be sufficient to describe b8's output, so more code would be needed – even outside of b8.
+
+All the code, the database layout and particularly the math is intended to do exactly one thing: distinguish between two categories. I think it would be a lot of work to change b8 so that it would support more than two categories. Probably, this is possible to do, but don't ask me in which way we would have to change the math to get multiple-category support – I'm a dentist, not a mathematician ;-) |br|
+Apart from this I do believe that most people using b8 don't want or need multiple categories. They just want to know if a text is spam or not, don't they? I do, at least ;-)
+
+But let's think about the multiple-category thing. How would we calculate a rating for more than two categories? If we had a third one, let's call it "`Treet <http://en.wikipedia.org/wiki/Treet>`__", how would we calculate a rating? We could calculate three different ratings. One for "Ham", one for "Spam" and one for "Treet" and choose the highest one to tell the user what category fits best for the text. This could be done by using a small wrapper script using three instances of b8 as-is and three different databases, each containing texts being "Ham", "Spam", "Treet" and the respective counterparts. |br|
+But here's the problem: if we have "Ham" and "Spam", "Spam" is the counterpart of "Ham". But what's the counterpart of "Spam" if we have more than one additional category? Where do the "Non-Ham", "Non-Spam" and "Non-Treet" texts come from?
+
+Another approach, a direct calculation of more than two probabilities (the "Ham" probability is simply 1 minus the "Spam" probability, so we actually get two probabilities with the return value of b8) out of one database would require big changes in b8's structure and math.
+
+There's a project called `PHPNaiveBayesianFilter <http://xhtml.net/scripts/PHPNaiveBayesianFilter>`__ which supports multiple categories by default. The author calls his software "Version 1.0", but I think this is the very first release, not a stable or mature one. The most recent change of that release dates back to 2003 according to the "changed" date of the files inside the zip archive, so probably, this project is dead or has never been alive and under active development at all. |br|
+Actually, I played around with that code but the results weren't really good, so I decided to write my own spam filter from scratch back in early 2006 ;-)
+
+All in all, there seems to be no easy way to implement multiple (meaning more than two) categories using b8's current code base and probably, b8 will never support more than two categories. Perhaps, a fork or a complete re-write would be better than implementing such a feature. Anyway, I don't close my mind to multiple categories in b8. Feel free to tell me how multiple categories could be implementented in b8 or how a multiple-category version using the same code base (sharing a common abstract class?) could be written.
+
+What about a list with words to ignore?
+```````````````````````````````````````
+
+Some people suggested to introduce a list with words that b8 will simply ignore. Like "and", "or", "the", and so on. I don't think this is very meaningful.
+
+First, it would just work for the particular language that has been stored in the list. Speaking of my homepage, most of my spam is English, almost all my ham is German. So I would have to maintain a list with the probably less interesting words for at least two languages. Additionally, I get spam in Chinese, Japanese and Cyrillic writing or something else I can't read as well. What word should be ignored in those texts? |br|
+Second, why should we ever exclude words? Who tells us those words are *actually* meaningless? If a word appears both in ham and spam, it's rating will be near 0.5 and so, it won't be used for the final calculation if a appropriate minimum deviation was set. So b8 will exclude it anyway without any blacklist. And think of this: if we excluded a word of which we only *think* it doesn't mean anything but it actually does appear more often in ham or spam, the results will get even worse.
+
+So why should we care about things we do not have to care about? ;-)
+
+
+Why is it called "b8"?
+``````````````````````
+
+The initial name for the filter was (damn creative!) "bayes-php". There were two main reasons for searching another name: 1. "bayes-php" sucks. 2. the `PHP License <http://php.net/license/3_01.txt>`_ says the PHP guys do not like when the name of a script written in PHP contains the word "PHP". Read the `License FAQ <http://www.php.net/license/index.php#faq-lic>`_ for a reasonable argumentation about this.
+
+Luckily, `Tobias Lang <http://langt.net/>`_ proposed the new name "b8". And these are the reasons why I chose this name:
+
+- "bayes-php" is a "b" followed by 8 letters.
+- "b8" is short and handy. Additionally, there was no program with the name "b8" or "bate"
+- The English verb "to bate" means "to decrease" – and that's what b8 does: it decreases the number of spam entries in your weblog or guestbook!
+- "b8" just sounds way cooler than "bayes-php" ;-)
+
+About the database
+------------------
+
+The database layout
+```````````````````
+
+The database layout is quite simple. It's just key:value for everything stored. There are three "internal" variables stored as normal tokens (but all containing a ``*`` which is always used as a split character by the lexer, so we can't get collisions):
+
+**bayes*dbversion**
+ This indicates the database's "version". The first versions of b8 did not set this. Version "2" indicates that we have a database created by a b8 version already storing `the "lastseen" parameter`_.
+
+**bayes*texts.ham**
+ The number of ham texts learned.
+
+**bayes*texts.spam**
+ The number of spam texts learned.
+
+Each "normal" token is stored with it's literal name as the key and it's data as the value. The data consists of the count of the token in all ham and spam texts and the date when the token was used the last time, all in one string and separated by spaces. So we have the following scheme:
+
+::
+
+ "token" => "count_ham count_spam lastseen"
+
+The "lastseen" parameter
+````````````````````````
+
+Somebody looking at the code might be wondering why b8 stores this "lastseen" parameter. This value is not used for any calculation at the moment. Initially, it was intended to keep the database maintainable in a way that "old" data could be removed. When e. g. a token only appeared once in ham or spam and has not been seen for a year, one could simply delete it from the database. |br|
+I actually never used this feature (does anybody?). So probably, some changes will be done to this one day. Perhaps, I find a way to include this data in the spamminess calculation in a meaningful way, or at least for some statistics. One could also make this optional to keep the calculation effort small if this is needed.
+
+Feel free to send me any suggestions about this!
+
+.. |br| raw:: html
+
+ <br />
+
+.. section-numbering::
+
+.. |date| date::
diff --git a/library/spam/example/index.php b/library/spam/example/index.php
new file mode 100644
index 000000000..6d3c14260
--- /dev/null
+++ b/library/spam/example/index.php
@@ -0,0 +1,241 @@
+<?php
+
+# Copyright (C) 2006-2010 Tobias Leupold <tobias.leupold@web.de>
+#
+# This file is part of the b8 package
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation in version 2.1 of the License.
+#
+# This program 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 Lesser General Public
+# License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+
+### This is an example script demonstrating how b8 can be used. ###
+
+#/*
+
+# Use this code block if you want to use Berkeley DB.
+
+# The database filename is interpreted relative to the b8.php script location.
+
+$config_b8 = array(
+ 'storage' => 'dba'
+);
+
+$config_database = array(
+ 'database' => 'wordlist.db',
+ 'handler' => 'db4'
+);
+
+#*/
+
+/*
+
+# Use this code block if you want to use MySQL.
+
+# An existing link resource can be passed to b8 by setting
+# $config_database['connection'] to this link resource.
+# Be sure to set your database access data otherwise!
+
+$config_b8 = array(
+ 'storage' => 'mysql'
+);
+
+$config_database = array(
+ 'database' => 'test',
+ 'table_name' => 'b8_wordlist',
+ 'host' => 'localhost',
+ 'user' => '',
+ 'pass' => ''
+);
+
+*/
+
+# To be able to calculate the time the classification took
+
+$time_start = NULL;
+
+function microtimeFloat()
+{
+ list($usec, $sec) = explode(" ", microtime());
+ return ((float) $usec + (float) $sec);
+}
+
+# Output a nicely colored rating
+
+function formatRating($rating)
+{
+
+ if($rating === FALSE)
+ return "<span style=\"color:red\">could not calculate spaminess</span>";
+
+ $red = floor(255 * $rating);
+ $green = floor(255 * (1 - $rating));
+
+ return "<span style=\"color:rgb($red, $green, 0);\"><b>" . sprintf("%5f", $rating) . "</b></span>";
+
+}
+
+echo <<<END
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+
+<head>
+
+<title>example b8 interface</title>
+
+<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
+
+<meta name="dc.creator" content="Tobias Leupold" />
+<meta name="dc.rights" content="Copyright (c) by Tobias Leupold" />
+
+</head>
+
+<body>
+
+<div>
+
+<h1>example b8 interface</h1>
+
+
+END;
+
+$postedText = "";
+
+if(isset($_POST['action']) and $_POST['text'] == "")
+ echo "<p style=\"color:red;\"><b>Please type in a text!</b></p>\n\n";
+
+elseif(isset($_POST['action']) and $_POST['text'] != "") {
+
+ $time_start = microtimeFloat();
+
+ # Include the b8 code
+ require dirname(__FILE__) . "/../b8/b8.php";
+
+ # Create a new b8 instance
+ $b8 = new b8($config_b8, $config_database);
+
+ # Check if everything worked smoothly
+
+ $started_up = $b8->validate();
+
+ if($started_up !== TRUE) {
+ echo "<b>example:</b> Could not initialize b8. error code: $started_up";
+ exit;
+ }
+
+ $text = stripslashes($_POST['text']);
+ $postedText = htmlentities($text, ENT_QUOTES, 'UTF-8');
+
+ switch($_POST['action']) {
+
+ case "Classify":
+ echo "<p><b>Spaminess: " . formatRating($b8->classify($text)) . "</b></p>\n";
+ break;
+
+ case "Save as Spam":
+
+ $ratingBefore = $b8->classify($text);
+ $b8->learn($text, b8::SPAM);
+ $ratingAfter = $b8->classify($text);
+
+ echo "<p>Saved the text as Spam</p>\n\n";
+
+ echo "<div><table>\n";
+ echo "<tr><td>Classification before learning:</td><td>" . formatRating($ratingBefore) . "</td></tr>\n";
+ echo "<tr><td>Classification after learning:</td><td>" . formatRating($ratingAfter) . "</td></tr>\n";
+ echo "</table></div>\n\n";
+
+ break;
+
+ case "Save as Ham":
+
+ $ratingBefore = $b8->classify($text);
+ $b8->learn($text, b8::HAM);
+ $ratingAfter = $b8->classify($text);
+
+ echo "<p>Saved the text as Ham</p>\n\n";
+
+ echo "<div><table>\n";
+ echo "<tr><td>Classification before learning:</td><td>" . formatRating($ratingBefore) . "</td></tr>\n";
+ echo "<tr><td>Classification after learning:</td><td>" . formatRating($ratingAfter) . "</td></tr>\n";
+ echo "</table></div>\n\n";
+
+ break;
+
+ case "Delete from Spam":
+ $b8->unlearn($text, b8::SPAM);
+ echo "<p style=\"color:green\">Deleted the text from Spam</p>\n\n";
+ break;
+
+ case "Delete from Ham":
+ $b8->unlearn($text, b8::HAM);
+ echo "<p style=\"color:green\">Deleted the text from Ham</p>\n\n";
+ break;
+
+ }
+
+ $mem_used = round(memory_get_usage() / 1048576, 5);
+ $peak_mem_used = round(memory_get_peak_usage() / 1048576, 5);
+ $time_taken = round(microtimeFloat() - $time_start, 5);
+
+}
+
+echo <<<END
+<div>
+<form action="{$_SERVER['PHP_SELF']}" method="post">
+<div>
+<textarea name="text" cols="50" rows="16">$postedText</textarea>
+</div>
+<table>
+<tr>
+<td><input type="submit" name="action" value="Classify" /></td>
+</tr>
+<tr>
+<td><input type="submit" name="action" value="Save as Spam" /></td>
+<td><input type="submit" name="action" value="Save as Ham" /></td>
+</tr>
+<tr>
+<td><input type="submit" name="action" value="Delete from Spam" /></td>
+<td><input type="submit" name="action" value="Delete from Ham" /></td>
+</tr>
+</table>
+</form>
+</div>
+
+</div>
+
+END;
+
+if($time_start !== NULL) {
+
+echo <<<END
+<div>
+<table border="0">
+<tr><td>Memory used: </td><td>$mem_used&thinsp;MB</td></tr>
+<tr><td>Peak memory used:</td><td>$peak_mem_used&thinsp;MB</td></tr>
+<tr><td>Time taken: </td><td>$time_taken&thinsp;sec</td></tr>
+</table>
+</div>
+
+END;
+
+}
+
+?>
+
+</body>
+
+</html>
diff --git a/library/spam/install/setup_berkeleydb.php b/library/spam/install/setup_berkeleydb.php
new file mode 100644
index 000000000..81e1d5afa
--- /dev/null
+++ b/library/spam/install/setup_berkeleydb.php
@@ -0,0 +1,240 @@
+<?php
+
+# Copyright (C) 2010 Tobias Leupold <tobias.leupold@web.de>
+#
+# This file is part of the b8 package
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation in version 2.1 of the License.
+#
+# This program 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 Lesser General Public
+# License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+echo <<<END
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+
+<head>
+
+<title>b8 Berkeley DB setup</title>
+
+<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
+
+<meta name="dc.creator" content="Tobias Leupold" />
+<meta name="dc.rights" content="Copyright (c) by Tobias Leupold" />
+
+</head>
+
+<body>
+
+<div>
+
+<h1>b8 Berkeley DB setup</h1>
+
+
+END;
+
+$failed = FALSE;
+
+if(isset($_POST['handler'])) {
+
+ $dbfile = $_POST['dbfile'];
+ $dbfile_directory = $_SERVER['DOCUMENT_ROOT'] . dirname($_SERVER['PHP_SELF']);
+
+ echo "<h2>Creating database</h2>\n\n";
+
+ echo "<p>\n";
+
+ echo "Checking database file name &hellip; ";
+
+ if($dbfile == "") {
+ echo "<span style=\"color:red;\">Please provide the name of the database file!</span><br />\n";
+ $failed = TRUE;
+ }
+ else
+ echo "$dbfile<br />\n";
+
+ if(!$failed) {
+
+ echo "Touching/Creating " . htmlentities($dbfile) . " &hellip; ";
+
+ if(touch($dbfile) === FALSE) {
+ echo "<span style=\"color:red;\">Failed to touch the database file. Please check the given filename and/or fix the permissions of $dbfile_directory.</span><br />\n";
+ $failed = TRUE;
+ }
+ else
+ echo "done<br />\n";
+
+ }
+
+ if(!$failed) {
+
+ echo "Setting file permissions to 0666 &hellip ";
+
+ if(chmod($dbfile, 0666) === FALSE) {
+ echo "<span style=\"color:red;\">Failed to change the permissions of $dbfile_directory/$dbfile. Please adjust them manually.</span><br />\n";
+ $failed = TRUE;
+ }
+ else
+ echo "done<br />\n";
+
+ }
+
+ if(!$failed) {
+
+ echo "Checking if the given file is empty &hellip ";
+
+ if(filesize($dbfile) > 0) {
+ echo "<span style=\"color:red;\">$dbfile_directory/$dbfile is not empty. Can't create a new database. Please delete/empty this file or give another filename.</span><br />\n";
+ $failed = TRUE;
+ }
+ else
+ echo "it is<br />\n";
+
+ }
+
+ if(!$failed) {
+
+ echo "Connecting to $dbfile &hellip; ";
+
+ $db = dba_open($dbfile, "c", $_POST['handler']);
+
+ if($db === FALSE) {
+ echo "<span style=\"color:red;\">Could not connect to the database!</span><br />\n";
+ $failed = TRUE;
+ }
+ else
+ echo "done<br />\n";
+
+ }
+
+ if(!$failed) {
+
+ echo "Storing necessary internal variables &hellip ";
+
+ $internals = array(
+ "bayes*dbversion" => "2",
+ "bayes*texts.ham" => "0",
+ "bayes*texts.spam" => "0"
+ );
+
+ foreach($internals as $key => $value) {
+ if(dba_insert($key, $value, $db) === FALSE) {
+ echo "<span style=\"color:red;\">Failed to insert data!</span><br />\n";
+ $failed = TRUE;
+ break;
+ }
+ }
+
+ if(!$failed)
+ echo "done<br />\n";
+
+ }
+
+ if(!$failed) {
+
+ echo "Trying to read data from the database &hellip ";
+
+ $dbversion = dba_fetch("bayes*dbversion", $db);
+
+ if($dbversion != "2") {
+ echo "<span style=\"color:red;\">Failed to read data!</span><br />\n";
+ $failed = TRUE;
+ }
+ else
+ echo "success<br />\n";
+ }
+
+ if(!$failed) {
+
+ dba_close($db);
+
+ echo "</p>\n\n";
+ echo "<p style=\"color:green;\">Successfully created a new b8 database!</p>\n\n";
+ echo "<table>\n";
+ echo "<tr><td>Filename:</td><td>$dbfile_directory/$dbfile</td></tr>\n";
+ echo "<tr><td>DBA handler:</td><td>{$_POST['handler']}</td><tr>\n";
+ echo "</table>\n\n";
+ echo "<p>Move this file to it's destination directory (default: the base directory of b8) to use it with b8. Be sure to use the right DBA handler in b8's configuration.";
+
+ }
+
+ echo "</p>\n\n";
+
+}
+
+if($failed === TRUE or !isset($_POST['handler'])) {
+
+echo <<<END
+<form action="{$_SERVER['PHP_SELF']}" method="post">
+
+<h2>DBA Handler</h2>
+
+<p>
+The following table shows all available DBA handlers. Please choose the "Berkeley DB" one.
+</p>
+
+<table>
+<tr><td></td><td><b>Handler</b></td><td><b>Description</b></td></tr>
+
+END;
+
+foreach(dba_handlers(TRUE) as $name => $version) {
+
+ $checked = "";
+
+ if(!isset($_POST['handler'])) {
+ if(strpos($version, "Berkeley") !== FALSE )
+ $checked = " checked=\"checked\"";
+ }
+ else {
+ if($_POST['handler'] == $name)
+ $checked = " checked=\"checked\"";
+ }
+
+ echo "<tr><td><input type=\"radio\" name=\"handler\" value=\"$name\"$checked /></td><td>$name</td><td>$version</td></tr>\n";
+
+}
+
+echo <<<END
+</table>
+
+<h2>Database file</h2>
+
+<p>
+Please the name of the desired database file. It will be created in the directory where this script is located.
+</p>
+
+<p>
+<input type="text" name="dbfile" value="wordlist.db" />
+</p>
+
+<p>
+<input type="submit" value="Create the database" />
+</p>
+
+</form>
+
+
+END;
+
+}
+
+?>
+
+</div>
+
+</body>
+
+</html>
diff --git a/library/spam/install/setup_mysql.sql b/library/spam/install/setup_mysql.sql
new file mode 100644
index 000000000..ac43274e9
--- /dev/null
+++ b/library/spam/install/setup_mysql.sql
@@ -0,0 +1,27 @@
+
+-- Copyright (C) 2010 Tobias Leupold <tobias.leupold@web.de>
+--
+-- This file is part of the b8 package
+--
+-- This program is free software; you can redistribute it and/or modify it
+-- under the terms of the GNU Lesser General Public License as published by
+-- the Free Software Foundation in version 2.1 of the License.
+--
+-- This program 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 Lesser General Public
+-- License for more details.
+--
+-- You should have received a copy of the GNU Lesser General Public License
+-- along with this program; if not, write to the Free Software Foundation,
+-- Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
+
+CREATE TABLE `b8_wordlist` (
+ `token` varchar(255) character set utf8 collate utf8_bin NOT NULL,
+ `count` varchar(255) default NULL,
+ PRIMARY KEY (`token`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+INSERT INTO `b8_wordlist` VALUES ('bayes*dbversion', '2');
+INSERT INTO `b8_wordlist` VALUES ('bayes*texts.ham', '0');
+INSERT INTO `b8_wordlist` VALUES ('bayes*texts.spam', '0');
diff --git a/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js b/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js
index b8a3abb31..e5f716b29 100755
--- a/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js
+++ b/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js
@@ -105,6 +105,7 @@
rep(/<u>/gi,"[u]");
rep(/<blockquote[^>]*>/gi,"[quote]");
rep(/<\/blockquote>/gi,"[/quote]");
+ rep(/<hr \/>/gi,"[hr]");
rep(/<br \/>/gi,"\n\n");
rep(/<br\/>/gi,"\n\n");
rep(/<br>/gi,"\n");
@@ -135,6 +136,7 @@
rep(/\[\/i\]/gi,"</em>");
rep(/\[u\]/gi,"<u>");
rep(/\[\/u\]/gi,"</u>");
+ rep(/\[hr\]/gi,"<hr />");
rep(/\[bookmark=([^\]]+)\](.*?)\[\/bookmark\]/gi,"<a class=\"bookmark\" href=\"$1\">$2</a>");
rep(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,"<a href=\"$1\">$2</a>");
rep(/\[url\](.*?)\[\/url\]/gi,"<a href=\"$1\">$1</a>");
diff --git a/mod/admin.php b/mod/admin.php
index e44404097..028ed8624 100755
--- a/mod/admin.php
+++ b/mod/admin.php
@@ -9,6 +9,10 @@ function admin_post(&$a){
if(!is_site_admin()) {
return;
}
+
+
+ if(x($_SESSION,'submanage') && intval($_SESSION['submanage']))
+ return;
// urls
if ($a->argc > 1){
@@ -50,6 +54,9 @@ function admin_content(&$a) {
return login(false);
}
+ if(x($_SESSION,'submanage') && intval($_SESSION['submanage']))
+ return;
+
/**
* Side bar links
*/
@@ -628,23 +635,36 @@ function admin_page_logs(&$a){
$t = get_markup_template("admin_logs.tpl");
$f = get_config('system','logfile');
- $size = filesize($f);
- if($size > 5000000 || $size < 0)
- $size = 5000000;
$data = '';
- $fp = fopen($f,'r');
- if($fp) {
- $seek = fseek($fp,0-$size,SEEK_END);
- if($seek === 0) {
- fgets($fp); // throw away the first partial line
- $data = escape_tags(fread($fp,$size));
- while(! feof($fp))
- $data .= escape_tags(fread($fp,4096));
- }
- fclose($fp);
- }
+ if(!file_exists($f)) {
+ $data = t("Error trying to open <strong>$f</strong> log file.\r\n<br/>Check to see if file $f exist and is
+readable.");
+ }
+ else {
+ $fp = fopen($f, 'r');
+ if(!$fp) {
+ $data = t("Couldn't open <strong>$f</strong> log file.\r\n<br/>Check to see if file $f is readable.");
+ }
+ else {
+ $fstat = fstat($fp);
+ $size = $fstat['size'];
+ if($size != 0)
+ {
+ if($size > 5000000 || $size < 0)
+ $size = 5000000;
+ $seek = fseek($fp,0-$size,SEEK_END);
+ if($seek === 0) {
+ fgets($fp); // throw away the first partial line
+ $data = escape_tags(fread($fp,$size));
+ while(! feof($fp))
+ $data .= escape_tags(fread($fp,4096));
+ }
+ }
+ fclose($fp);
+ }
+ }
return replace_macros($t, array(
'$title' => t('Administration'),
diff --git a/mod/community.php b/mod/community.php
index d578b469f..a98999942 100755
--- a/mod/community.php
+++ b/mod/community.php
@@ -80,12 +80,10 @@ function community_content(&$a, $update = 0) {
// we behave the same in message lists as the search module
- $o .= conversation($a,$r,'community',false);
+ $o .= conversation($a,$r,'community',$update);
$o .= paginate($a);
-// $o .= '<div class="cc-license">' . t('Shared content is covered by the <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a> license.') . '</div>';
-
return $o;
}
diff --git a/mod/contacts.php b/mod/contacts.php
index 51c6920d3..418cddf17 100755
--- a/mod/contacts.php
+++ b/mod/contacts.php
@@ -42,6 +42,7 @@ function contacts_init(&$a) {
$a->page['aside'] .= findpeople_widget();
+ $a->page['aside'] .= networks_widget('contacts',$_GET['nets']);
}
function contacts_post(&$a) {
@@ -99,6 +100,14 @@ function contacts_post(&$a) {
info( t('Contact updated.') . EOL);
else
notice( t('Failed to update contact record.') . EOL);
+
+ $r = q("select * from contact where id = %d and uid = %d limit 1",
+ intval($contact_id),
+ intval(local_user())
+ );
+ if($r && count($r))
+ $a->data['contact'] = $r[0];
+
return;
}
@@ -111,7 +120,6 @@ function contacts_content(&$a) {
$o = '';
nav_set_selected('contacts');
- $_SESSION['return_url'] = $a->get_baseurl() . '/' . $a->cmd;
if(! local_user()) {
notice( t('Permission denied.') . EOL);
@@ -211,7 +219,10 @@ function contacts_content(&$a) {
contact_remove($orig_record[0]['id']);
info( t('Contact has been removed.') . EOL );
- goaway($a->get_baseurl() . '/contacts');
+ if(x($_SESSION,'return_url'))
+ goaway($a->get_baseurl() . '/' . $_SESSION['return_url']);
+ else
+ goaway($a->get_baseurl() . '/contacts');
return; // NOTREACHED
}
}
@@ -354,32 +365,82 @@ function contacts_content(&$a) {
}
+ $blocked = false;
+ $hidden = false;
+ $ignored = false;
+ $all = false;
+
+ $_SESSION['return_url'] = $a->query_string;
- if(($a->argc == 2) && ($a->argv[1] === 'all'))
+ if(($a->argc == 2) && ($a->argv[1] === 'all')) {
$sql_extra = '';
+ $all = true;
+ }
+ elseif(($a->argc == 2) && ($a->argv[1] === 'blocked')) {
+ $sql_extra = " AND `blocked` = 1 ";
+ $blocked = true;
+ }
+ elseif(($a->argc == 2) && ($a->argv[1] === 'hidden')) {
+ $sql_extra = " AND `hidden` = 1 ";
+ $hidden = true;
+ }
+ elseif(($a->argc == 2) && ($a->argv[1] === 'ignored')) {
+ $sql_extra = " AND `readonly` = 1 ";
+ $ignored = true;
+ }
else
$sql_extra = " AND `blocked` = 0 ";
$search = ((x($_GET,'search')) ? notags(trim($_GET['search'])) : '');
+ $nets = ((x($_GET,'nets')) ? notags(trim($_GET['nets'])) : '');
+
+ $tabs = array(
+ array(
+ 'label' => t('All Contacts'),
+ 'url' => $a->get_baseurl() . '/contacts/all',
+ 'sel' => ($all) ? 'active' : '',
+ ),
+ array(
+ 'label' => t('Unblocked Contacts'),
+ 'url' => $a->get_baseurl() . '/contacts',
+ 'sel' => ((! $all) && (! $blocked) && (! $hidden) && (! $search) && (! $nets) && (! $ignored)) ? 'active' : '',
+ ),
+
+ array(
+ 'label' => t('Blocked Contacts'),
+ 'url' => $a->get_baseurl() . '/contacts/blocked',
+ 'sel' => ($blocked) ? 'active' : '',
+ ),
+
+ array(
+ 'label' => t('Ignored Contacts'),
+ 'url' => $a->get_baseurl() . '/contacts/ignored',
+ 'sel' => ($ignored) ? 'active' : '',
+ ),
+
+ array(
+ 'label' => t('Hidden Contacts'),
+ 'url' => $a->get_baseurl() . '/contacts/hidden',
+ 'sel' => ($hidden) ? 'active' : '',
+ ),
+
+ );
+
+ $tab_tpl = get_markup_template('common_tabs.tpl');
+ $t = replace_macros($tab_tpl, array('$tabs'=>$tabs));
- $tpl = get_markup_template("contacts-top.tpl");
- $o .= replace_macros($tpl,array(
- '$header' => t('Contacts'),
- '$hide_url' => ((strlen($sql_extra)) ? 'contacts/all' : 'contacts' ),
- '$hide_text' => ((strlen($sql_extra)) ? t('Show Blocked Connections') : t('Hide Blocked Connections')),
- '$search' => $search,
- '$desc' => t('Search your contacts'),
- '$finding' => (strlen($search) ? '<h4>' . t('Finding: ') . "'" . $search . "'" . '</h4>' : ""),
- '$submit' => t('Find'),
- '$cmd' => $a->cmd
- ));
- if($search)
+ if($search) {
+ $search_hdr = $search;
$search = dbesc($search.'*');
+ }
$sql_extra .= ((strlen($search)) ? " AND MATCH `name` AGAINST ('$search' IN BOOLEAN MODE) " : "");
+ if($nets)
+ $sql_extra .= sprintf(" AND network = '%s' ", dbesc($nets));
+
$sql_extra2 = ((($sort_type > 0) && ($sort_type <= CONTACT_IS_FRIEND)) ? sprintf(" AND `rel` = %d ",intval($sort_type)) : '');
@@ -389,6 +450,21 @@ function contacts_content(&$a) {
if(count($r))
$a->set_pager_total($r[0]['total']);
+
+ $tpl = get_markup_template("contacts-top.tpl");
+ $o .= replace_macros($tpl,array(
+ '$header' => t('Contacts') . (($nets) ? ' - ' . network_to_name($nets) : ''),
+ '$tabs' => $t,
+ '$total' => $r[0]['total'],
+ '$search' => $search_hdr,
+ '$desc' => t('Search your contacts'),
+ '$finding' => (strlen($search) ? '<h4>' . t('Finding: ') . "'" . $search . "'" . '</h4>' : ""),
+ '$submit' => t('Find'),
+ '$cmd' => $a->cmd
+
+
+ ));
+
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `pending` = 0 $sql_extra $sql_extra2 ORDER BY `name` ASC LIMIT %d , %d ",
intval($_SESSION['uid']),
intval($a->pager['start']),
diff --git a/mod/dfrn_confirm.php b/mod/dfrn_confirm.php
index 89b09ef77..abacd9906 100755
--- a/mod/dfrn_confirm.php
+++ b/mod/dfrn_confirm.php
@@ -72,6 +72,7 @@ function dfrn_confirm_post(&$a,$handsfree = null) {
$intro_id = $handsfree['intro_id'];
$duplex = $handsfree['duplex'];
$hidden = ((array_key_exists('hidden',$handsfree)) ? intval($handsfree['hidden']) : 0 );
+ $activity = ((array_key_exists('activity',$handsfree)) ? intval($handsfree['activity']) : 0 );
}
else {
$dfrn_id = ((x($_POST,'dfrn_id')) ? notags(trim($_POST['dfrn_id'])) : "");
@@ -79,6 +80,7 @@ function dfrn_confirm_post(&$a,$handsfree = null) {
$duplex = ((x($_POST,'duplex')) ? intval($_POST['duplex']) : 0 );
$cid = ((x($_POST,'contact_id')) ? intval($_POST['contact_id']) : 0 );
$hidden = ((x($_POST,'hidden')) ? intval($_POST['hidden']) : 0 );
+ $activity = ((x($_POST,'activity')) ? intval($_POST['activity']) : 0 );
}
/**
@@ -370,6 +372,9 @@ function dfrn_confirm_post(&$a,$handsfree = null) {
if($network === NETWORK_DIASPORA) {
if($duplex)
$new_relation = CONTACT_IS_FRIEND;
+ else
+ $new_relation = CONTACT_IS_SHARING;
+
if($new_relation != CONTACT_IS_FOLLOWER)
$writable = 1;
}
@@ -425,64 +430,65 @@ function dfrn_confirm_post(&$a,$handsfree = null) {
else
$contact = null;
- // Send a new friend post if we are allowed to...
-
- $r = q("SELECT `hide-friends` FROM `profile` WHERE `uid` = %d AND `is-default` = 1 LIMIT 1",
- intval($uid)
- );
- if((count($r)) && (! $hidden) && ($r[0]['hide-friends'] == 0) && (is_array($contact)) && isset($new_relation) && ($new_relation == CONTACT_IS_FRIEND)) {
+ if(isset($new_relation) && $new_relation == CONTACT_IS_FRIEND) {
- if($r[0]['network'] === NETWORK_DIASPORA) {
+ if(($contact) && ($contact['network'] === NETWORK_DIASPORA)) {
require_once('include/diaspora.php');
$ret = diaspora_share($user[0],$r[0]);
logger('mod_follow: diaspora_share returns: ' . $ret);
}
- require_once('include/items.php');
+ // Send a new friend post if we are allowed to...
- $self = q("SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1",
+ $r = q("SELECT `hide-friends` FROM `profile` WHERE `uid` = %d AND `is-default` = 1 LIMIT 1",
intval($uid)
);
+ if((count($r)) && ($activity) && (! $hidden)) {
- if(count($self)) {
-
- $arr = array();
- $arr['uri'] = $arr['parent-uri'] = item_new_uri($a->get_hostname(), $uid);
- $arr['uid'] = $uid;
- $arr['contact-id'] = $self[0]['id'];
- $arr['wall'] = 1;
- $arr['type'] = 'wall';
- $arr['gravity'] = 0;
- $arr['origin'] = 1;
- $arr['author-name'] = $arr['owner-name'] = $self[0]['name'];
- $arr['author-link'] = $arr['owner-link'] = $self[0]['url'];
- $arr['author-avatar'] = $arr['owner-avatar'] = $self[0]['thumb'];
- $arr['verb'] = ACTIVITY_FRIEND;
- $arr['object-type'] = ACTIVITY_OBJ_PERSON;
-
- $A = '[url=' . $self[0]['url'] . ']' . $self[0]['name'] . '[/url]';
- $B = '[url=' . $contact['url'] . ']' . $contact['name'] . '[/url]';
- $BPhoto = '[url=' . $contact['url'] . ']' . '[img]' . $contact['thumb'] . '[/img][/url]';
- $arr['body'] = sprintf( t('%1$s is now friends with %2$s'), $A, $B)."\n\n\n".$BPhoto;
-
- $arr['object'] = '<object><type>' . ACTIVITY_OBJ_PERSON . '</type><title>' . $contact['name'] . '</title>'
- . '<id>' . $contact['url'] . '/' . $contact['name'] . '</id>';
- $arr['object'] .= '<link>' . xmlify('<link rel="alternate" type="text/html" href="' . $contact['url'] . '" />' . "\n");
- $arr['object'] .= xmlify('<link rel="photo" type="image/jpeg" href="' . $contact['thumb'] . '" />' . "\n");
- $arr['object'] .= '</link></object>' . "\n";
- $arr['last-child'] = 1;
-
- $arr['allow_cid'] = $user[0]['allow_cid'];
- $arr['allow_gid'] = $user[0]['allow_gid'];
- $arr['deny_cid'] = $user[0]['deny_cid'];
- $arr['deny_gid'] = $user[0]['deny_gid'];
-
- $i = item_store($arr);
- if($i)
- proc_run('php',"include/notifier.php","activity","$i");
+ require_once('include/items.php');
- }
+ $self = q("SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1",
+ intval($uid)
+ );
+ if(count($self)) {
+
+ $arr = array();
+ $arr['uri'] = $arr['parent-uri'] = item_new_uri($a->get_hostname(), $uid);
+ $arr['uid'] = $uid;
+ $arr['contact-id'] = $self[0]['id'];
+ $arr['wall'] = 1;
+ $arr['type'] = 'wall';
+ $arr['gravity'] = 0;
+ $arr['origin'] = 1;
+ $arr['author-name'] = $arr['owner-name'] = $self[0]['name'];
+ $arr['author-link'] = $arr['owner-link'] = $self[0]['url'];
+ $arr['author-avatar'] = $arr['owner-avatar'] = $self[0]['thumb'];
+ $arr['verb'] = ACTIVITY_FRIEND;
+ $arr['object-type'] = ACTIVITY_OBJ_PERSON;
+
+ $A = '[url=' . $self[0]['url'] . ']' . $self[0]['name'] . '[/url]';
+ $B = '[url=' . $contact['url'] . ']' . $contact['name'] . '[/url]';
+ $BPhoto = '[url=' . $contact['url'] . ']' . '[img]' . $contact['thumb'] . '[/img][/url]';
+ $arr['body'] = sprintf( t('%1$s is now friends with %2$s'), $A, $B)."\n\n\n".$BPhoto;
+
+ $arr['object'] = '<object><type>' . ACTIVITY_OBJ_PERSON . '</type><title>' . $contact['name'] . '</title>'
+ . '<id>' . $contact['url'] . '/' . $contact['name'] . '</id>';
+ $arr['object'] .= '<link>' . xmlify('<link rel="alternate" type="text/html" href="' . $contact['url'] . '" />' . "\n");
+ $arr['object'] .= xmlify('<link rel="photo" type="image/jpeg" href="' . $contact['thumb'] . '" />' . "\n");
+ $arr['object'] .= '</link></object>' . "\n";
+ $arr['last-child'] = 1;
+
+ $arr['allow_cid'] = $user[0]['allow_cid'];
+ $arr['allow_gid'] = $user[0]['allow_gid'];
+ $arr['deny_cid'] = $user[0]['deny_cid'];
+ $arr['deny_gid'] = $user[0]['deny_gid'];
+
+ $i = item_store($arr);
+ if($i)
+ proc_run('php',"include/notifier.php","activity","$i");
+ }
+ }
}
// Let's send our user to the contact editor in case they want to
// do anything special with this new friend.
diff --git a/mod/dfrn_poll.php b/mod/dfrn_poll.php
index 09f198b81..b12e07132 100755
--- a/mod/dfrn_poll.php
+++ b/mod/dfrn_poll.php
@@ -86,6 +86,7 @@ function dfrn_poll_init(&$a) {
$_SESSION['authenticated'] = 1;
$_SESSION['visitor_id'] = $r[0]['id'];
$_SESSION['visitor_home'] = $r[0]['url'];
+ $_SESSION['visitor_handle'] = $r[0]['addr'];
$_SESSION['visitor_visiting'] = $r[0]['uid'];
info( sprintf(t('%s welcomes %s'), $r[0]['username'] , $r[0]['name']) . EOL);
// Visitors get 1 day session.
diff --git a/mod/dfrn_request.php b/mod/dfrn_request.php
index aa14bc473..ceec83e90 100755
--- a/mod/dfrn_request.php
+++ b/mod/dfrn_request.php
@@ -577,6 +577,7 @@ function dfrn_request_content(&$a) {
'language' => $r[0]['language'],
'to_name' => $r[0]['username'],
'to_email' => $r[0]['email'],
+ 'uid' => $r[0]['uid'],
'link' => $a->get_baseurl() . '/notifications/intros',
'source_name' => ((strlen(stripslashes($r[0]['name']))) ? stripslashes($r[0]['name']) : t('[Name Withheld]')),
'source_link' => $r[0]['url'],
diff --git a/mod/directory.php b/mod/directory.php
index 5f00b4f5a..962188945 100755
--- a/mod/directory.php
+++ b/mod/directory.php
@@ -26,6 +26,8 @@ function directory_post(&$a) {
function directory_content(&$a) {
$everything = (($a->argc > 1 && $a->argv[1] === 'all' && is_site_admin()) ? true : false);
+ if(x($_SESSION,'submanage') && intval($_SESSION['submanage']))
+ $everything = false;
if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
notice( t('Public access denied.') . EOL);
diff --git a/mod/display.php b/mod/display.php
index 02f080a79..d96be4333 100755
--- a/mod/display.php
+++ b/mod/display.php
@@ -11,6 +11,7 @@ function display_content(&$a) {
require_once("include/bbcode.php");
require_once('include/security.php');
require_once('include/conversation.php');
+ require_once('include/acl_selectors.php');
$o = '<div id="live-display"></div>' . "\r\n";
@@ -66,6 +67,23 @@ function display_content(&$a) {
notice( t('Access to this profile has been restricted.') . EOL);
return;
}
+
+ if ($is_owner)
+ $celeb = ((($a->user['page-flags'] == PAGE_SOAPBOX) || ($a->user['page-flags'] == PAGE_COMMUNITY)) ? true : false);
+
+ $x = array(
+ 'is_owner' => true,
+ 'allow_location' => $a->user['allow_location'],
+ 'default_location' => $a->user['default_location'],
+ 'nickname' => $a->user['nickname'],
+ 'lockstate' => ((($group) || (is_array($a->user) && ((strlen($a->user['allow_cid'])) || (strlen($a->user['allow_gid'])) || (strlen($a->user['deny_cid'])) || (strlen($a->user['deny_gid']))))) ? 'lock' : 'unlock'),
+ 'acl' => populate_acl((($group || $cid) ? $def_acl : $a->user), $celeb),
+ 'bang' => (($group || $cid) ? '!' : ''),
+ 'visitor' => 'block',
+ 'profile_uid' => local_user()
+ );
+ $o .= status_editor($a,$x,0,true);
+
$sql_extra = permissions_sql($a->profile['uid'],$remote_contact,$groups);
diff --git a/mod/editpost.php b/mod/editpost.php
index bceb9250a..778ac3dcc 100755
--- a/mod/editpost.php
+++ b/mod/editpost.php
@@ -28,6 +28,10 @@ function editpost_content(&$a) {
return;
}
+ $plaintext = false;
+ if(local_user() && intval(get_pconfig(local_user(),'system','plaintext')))
+ $plaintext = true;
+
$o .= '<h2>' . t('Edit post') . '</h2>';
@@ -35,6 +39,7 @@ function editpost_content(&$a) {
$a->page['htmlhead'] .= replace_macros($tpl, array(
'$baseurl' => $a->get_baseurl(),
+ '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
'$ispublic' => '&nbsp;', // t('Visible to <strong>everybody</strong>'),
'$geotag' => $geotag,
'$nickname' => $a->user['nickname']
@@ -108,11 +113,14 @@ function editpost_content(&$a) {
'$emailcc' => t('CC: email addresses'),
'$public' => t('Public post'),
'$jotnets' => $jotnets,
+ '$title' => $itm[0]['title'],
+ '$placeholdertitle' => t('Set title'),
'$emtitle' => t('Example: bob@example.com, mary@example.com'),
'$lockstate' => $lockstate,
'$acl' => '', // populate_acl((($group) ? $group_acl : $a->user), $celeb),
'$bang' => (($group) ? '!' : ''),
'$profile_uid' => $_SESSION['uid'],
+ '$preview' => t('Preview'),
'$jotplugins' => $jotplugins,
));
diff --git a/mod/events.php b/mod/events.php
index 5da8f17fc..0906d16c2 100755
--- a/mod/events.php
+++ b/mod/events.php
@@ -1,5 +1,6 @@
<?php
+require_once('include/bbcode.php');
require_once('include/datetime.php');
require_once('include/event.php');
require_once('include/items.php');
@@ -110,11 +111,14 @@ function events_content(&$a) {
return;
}
+
+ $htpl = get_markup_template('event_head.tpl');
+ $a->page['htmlhead'] .= replace_macros($htpl,array('$baseurl' => $a->get_baseurl()));
+
$o ="";
// tabs
- $o .= profile_tabs($a, True);
+ $tabs = profile_tabs($a, True);
- $o .= '<h2>' . t('Events') . '</h2>';
$mode = 'view';
@@ -138,6 +142,8 @@ function events_content(&$a) {
}
if($mode == 'view') {
+
+
$thisyear = datetime_convert('UTC',date_default_timezone_get(),'now','Y');
$thismonth = datetime_convert('UTC',date_default_timezone_get(),'now','m');
if(! $y)
@@ -167,11 +173,16 @@ function events_content(&$a) {
$prevmonth = 12;
$prevyear --;
}
-
$dim = get_dim($y,$m);
$start = sprintf('%d-%d-%d %d:%d:%d',$y,$m,1,0,0,0);
$finish = sprintf('%d-%d-%d %d:%d:%d',$y,$m,$dim,23,59,59);
+
+
+ if ($a->argv[1] === 'json'){
+ if (x($_GET,'start')) $start = date("Y-m-d h:i:s", $_GET['start']);
+ if (x($_GET,'end')) $finish = date("Y-m-d h:i:s", $_GET['end']);
+ }
$start = datetime_convert('UTC','UTC',$start);
$finish = datetime_convert('UTC','UTC',$finish);
@@ -180,17 +191,26 @@ function events_content(&$a) {
$adjust_finish = datetime_convert('UTC', date_default_timezone_get(), $finish);
- $r = q("SELECT `event`.*, `item`.`id` AS `itemid`,`item`.`plink`,
- `item`.`author-name`, `item`.`author-avatar`, `item`.`author-link` FROM `event` LEFT JOIN `item` ON `item`.`event-id` = `event`.`id`
- WHERE `event`.`uid` = %d
- AND (( `adjust` = 0 AND `start` >= '%s' AND `start` <= '%s' )
- OR ( `adjust` = 1 AND `start` >= '%s' AND `start` <= '%s' )) ",
- intval(local_user()),
- dbesc($start),
- dbesc($finish),
- dbesc($adjust_start),
- dbesc($adjust_finish)
- );
+ if (x($_GET,'id')){
+ $r = q("SELECT `event`.*, `item`.`id` AS `itemid`,`item`.`plink`,
+ `item`.`author-name`, `item`.`author-avatar`, `item`.`author-link` FROM `event` LEFT JOIN `item` ON `item`.`event-id` = `event`.`id`
+ WHERE `event`.`uid` = %d AND `event`.`id` = %d",
+ intval(local_user()),
+ intval($_GET['id'])
+ );
+ } else {
+ $r = q("SELECT `event`.*, `item`.`id` AS `itemid`,`item`.`plink`,
+ `item`.`author-name`, `item`.`author-avatar`, `item`.`author-link` FROM `event` LEFT JOIN `item` ON `item`.`event-id` = `event`.`id`
+ WHERE `event`.`uid` = %d
+ AND (( `adjust` = 0 AND `start` >= '%s' AND `start` <= '%s' )
+ OR ( `adjust` = 1 AND `start` >= '%s' AND `start` <= '%s' )) ",
+ intval(local_user()),
+ dbesc($start),
+ dbesc($finish),
+ dbesc($adjust_start),
+ dbesc($adjust_finish)
+ );
+ }
$links = array();
@@ -204,17 +224,7 @@ function events_content(&$a) {
}
- $o .= '<div id="new-event-link"><a href="' . $a->get_baseurl() . '/events/new' . '" >' . t('Create New Event') . '</a></div>';
- $o .= '<div id="event-calendar-wrapper">';
-
- $o .= '<a href="' . $a->get_baseurl() . '/events/' . $prevyear . '/' . $prevmonth . '" class="prevcal"><div id="event-calendar-prev" class="icon prev" title="' . t('Previous') . '"></div></a>';
- $o .= cal($y,$m,$links, ' eventcal');
-
- $o .= '<a href="' . $a->get_baseurl() . '/events/' . $nextyear . '/' . $nextmonth . '" class="nextcal"><div id="event-calendar-next" class="icon next" title="' . t('Next') . '"></div></a>';
- $o .= '</div>';
- $o .= '<div class="event-calendar-end"></div>';
-
-
+ $events=array();
$last_date = '';
$fmt = t('l, F j');
@@ -222,25 +232,82 @@ function events_content(&$a) {
if(count($r)) {
$r = sort_by_date($r);
foreach($r as $rr) {
+
+
$j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'j') : datetime_convert('UTC','UTC',$rr['start'],'j'));
$d = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], $fmt) : datetime_convert('UTC','UTC',$rr['start'],$fmt));
$d = day_translate($d);
- if($d !== $last_date)
- $o .= '<hr /><a name="link-' . $j . '" ><div class="event-list-date">' . $d . '</div></a>';
- $last_date = $d;
- if($rr['author-name']) {
- $o .= '<a href="' . $rr['author-link'] . '" ><img src="' . $rr['author-avatar'] . '" height="32" width="32" />' . $rr['author-name'] . '</a>';
+
+ $start = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'c') : datetime_convert('UTC','UTC',$rr['start'],'c'));
+ if ($rr['nofinish']){
+ $end = null;
+ } else {
+ $end = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['finish'], 'c') : datetime_convert('UTC','UTC',$rr['finish'],'c'));
}
- $o .= format_event_html($rr);
- $o .= ((! $rr['cid']) ? '<a href="' . $a->get_baseurl() . '/events/event/' . $rr['id'] . '" title="' . t('Edit event') . '" class="edit-event-link icon pencil"></a>' : '');
- if($rr['plink'])
- $o .= '<a href="' . $rr['plink'] . '" title="' . t('link to source') . '" target="external-link" class="plink-event-link icon remote-link"></a></div>';
+
+
+ $is_first = ($d !== $last_date);
+
+ $last_date = $d;
+ $edit = ((! $rr['cid']) ? array($a->get_baseurl().'/events/event/'.$rr['id'],t('Edit event'),'','') : null);
+
+ list($title, $_trash) = explode("<br",bbcode($rr['desc']),2);
+ $title = strip_tags($title);
+ $html = format_event_html($rr);
+ $rr['desc'] = bbcode($rr['desc']);
+ $rr['location'] = bbcode($rr['location']);
+ $events[] = array(
+ 'id'=>$rr['id'],
+ 'start'=> $start,
+ 'end' => $end,
+ 'allDay' => false,
+ 'title' => $title,
+
+ 'j' => $j,
+ 'd' => $d,
+ 'edit' => $edit,
+ 'is_first'=>$is_first,
+ 'item'=>$rr,
+ 'html'=>$html,
+ 'plink' => array($rr['plink'],t('link to source'),'',''),
+ );
- $o .= '<div class="clear"></div>';
}
}
+
+ if ($a->argv[1] === 'json'){
+ echo json_encode($events); killme();
+ }
+
+ // links: array('href', 'text', 'extra css classes', 'title')
+ if (x($_GET,'id')){
+ $tpl = get_markup_template("event.tpl");
+ } else {
+ if (get_config('experimentals','new_calendar')==1){
+ $tpl = get_markup_template("events-js.tpl");
+ } else {
+ $tpl = get_markup_template("events.tpl");
+ }
+ }
+ $o = replace_macros($tpl, array(
+ '$baseurl' => $a->get_baseurl(),
+ '$tabs' => $tabs,
+ '$title' => t('Events'),
+ '$new_event'=> array($a->get_baseurl().'/events/new',t('Create New Event'),'',''),
+ '$previus' => array($a->get_baseurl()."/events/$prevyear/$prevmonth",t('Previous'),'',''),
+ '$next' => array($a->get_baseurl()."/events/$nextyear/$nextmonth",t('Next'),'',''),
+ '$calendar' => cal($y,$m,$links, ' eventcal'),
+
+ '$events' => $events,
+
+
+ ));
+
+ if (x($_GET,'id')){ echo $o; killme(); }
+
return $o;
+
}
if($mode === 'edit' && $event_id) {
@@ -271,8 +338,7 @@ function events_content(&$a) {
if($cid)
$sh_checked .= ' disabled="disabled" ';
- $htpl = get_markup_template('event_head.tpl');
- $a->page['htmlhead'] .= replace_macros($htpl,array('$baseurl' => $a->get_baseurl()));
+
$tpl = get_markup_template('event_form.tpl');
@@ -311,8 +377,9 @@ function events_content(&$a) {
'$eid' => $eid,
'$cid' => $cid,
'$uri' => $uri,
- '$e_text' => t('Event details'),
- '$e_desc' => sprintf( t('Format is %s %s. Starting date and Description are required.'),$dateformat,$timeformat),
+ '$title' => t('Event details'),
+ '$desc' => sprintf( t('Format is %s %s. Starting date and Description are required.'),$dateformat,$timeformat),
+
'$s_text' => t('Event Starts:') . ' <span class="required">*</span> ',
'$s_dsel' => datesel($f,'start',$syear+5,$syear,false,$syear,$smonth,$sday),
'$s_tsel' => timesel('start',$shour,$sminute),
diff --git a/mod/install.php b/mod/install.php
index f7820fc80..003d81c6a 100755
--- a/mod/install.php
+++ b/mod/install.php
@@ -186,8 +186,8 @@ function install_content(&$a) {
check_keys($checks);
- if(x($_POST,'phppath'))
- $phpath = notags(trim($_POST['phppath']));
+ if(x($_POST,'phpath'))
+ $phpath = notags(trim($_POST['phpath']));
check_php($phpath, $checks);
@@ -210,6 +210,7 @@ function install_content(&$a) {
'$next' => t('Next'),
'$reload' => t('Check again'),
'$phpath' => $phpath,
+ '$baseurl' => $a->get_baseurl(),
));
return $o;
}; break;
@@ -220,7 +221,7 @@ function install_content(&$a) {
$dbuser = notags(trim($_POST['dbuser']));
$dbpass = notags(trim($_POST['dbpass']));
$dbdata = notags(trim($_POST['dbdata']));
- $phpath = notags(trim($_POST['phppath']));
+ $phpath = notags(trim($_POST['phpath']));
$tpl = get_markup_template('install_db.tpl');
@@ -258,7 +259,7 @@ function install_content(&$a) {
$dbuser = notags(trim($_POST['dbuser']));
$dbpass = notags(trim($_POST['dbpass']));
$dbdata = notags(trim($_POST['dbdata']));
- $phpath = notags(trim($_POST['phppath']));
+ $phpath = notags(trim($_POST['phpath']));
$adminmail = notags(trim($_POST['adminmail']));
$timezone = ((x($_POST,'timezone')) ? ($_POST['timezone']) : 'America/Los_Angeles');
@@ -322,7 +323,7 @@ function check_php(&$phpath, &$checks) {
$help .= t('Could not find a command line version of PHP in the web server PATH.'). EOL;
$tpl = get_markup_template('field_input.tpl');
$help .= replace_macros($tpl, array(
- '$field' => array('phppath', t('PHP executable path'), $phpath, t('Enter full path to php executable')),
+ '$field' => array('phpath', t('PHP executable path'), $phpath, t('Enter full path to php executable')),
));
$phpath="";
}
diff --git a/mod/item.php b/mod/item.php
index ed3d7749c..3035989f3 100755
--- a/mod/item.php
+++ b/mod/item.php
@@ -4,7 +4,7 @@
*
* This is the POST destination for most all locally posted
* text stuff. This function handles status, wall-to-wall status,
- * local comments, and remote coments - that are posted on this site
+ * local comments, and remote coments that are posted on this site
* (as opposed to being delivered in a feed).
* Also processed here are posts and comments coming through the
* statusnet/twitter API.
@@ -17,6 +17,7 @@
require_once('include/crypto.php');
require_once('include/enotify.php');
+require_once('include/email.php');
function item_post(&$a) {
@@ -42,6 +43,7 @@ function item_post(&$a) {
$api_source = ((x($_REQUEST,'api_source') && $_REQUEST['api_source']) ? true : false);
$return_path = ((x($_REQUEST,'return')) ? $_REQUEST['return'] : '');
+ $preview = ((x($_REQUEST,'preview')) ? intval($_REQUEST['preview']) : 0);
/**
* Is this a reply to something?
@@ -56,8 +58,6 @@ function item_post(&$a) {
$parid = 0;
$r = false;
- $preview = ((x($_REQUEST,'preview')) ? intval($_REQUEST['preview']) : 0);
-
if($parent || $parent_uri) {
if(! x($_REQUEST,'type'))
@@ -110,8 +110,6 @@ function item_post(&$a) {
if($parent) logger('mod_post: parent=' . $parent);
-
-
$profile_uid = ((x($_REQUEST,'profile_uid')) ? intval($_REQUEST['profile_uid']) : 0);
$post_id = ((x($_REQUEST,'post_id')) ? intval($_REQUEST['post_id']) : 0);
$app = ((x($_REQUEST,'source')) ? strip_tags($_REQUEST['source']) : '');
@@ -606,6 +604,7 @@ function item_post(&$a) {
$datarray['thr-parent'] = $thr_parent;
$datarray['postopts'] = '';
$datarray['origin'] = $origin;
+ $datarray['moderated'] = $allow_moderated;
/**
* These fields are for the convenience of plugins...
@@ -635,9 +634,24 @@ function item_post(&$a) {
call_hooks('post_local',$datarray);
+ if(x($datarray,'cancel')) {
+ logger('mod_item: post cancelled by plugin.');
+ if($return_path) {
+ goaway($a->get_baseurl() . "/" . $return_path);
+ }
+
+ $json = array('cancel' => 1);
+ if(x($_REQUEST,'jsreload') && strlen($_REQUEST['jsreload']))
+ $json['reload'] = $a->get_baseurl() . '/' . $_REQUEST['jsreload'];
+
+ echo json_encode($json);
+ killme();
+ }
+
if($orig_post) {
- $r = q("UPDATE `item` SET `body` = '%s', `edited` = '%s' WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `edited` = '%s' WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ dbesc($title),
dbesc($body),
dbesc(datetime_convert()),
intval($post_id),
@@ -657,8 +671,8 @@ function item_post(&$a) {
$r = q("INSERT INTO `item` (`guid`, `uid`,`type`,`wall`,`gravity`,`contact-id`,`owner-name`,`owner-link`,`owner-avatar`,
`author-name`, `author-link`, `author-avatar`, `created`, `edited`, `commented`, `received`, `changed`, `uri`, `thr-parent`, `title`, `body`, `app`, `location`, `coord`,
- `tag`, `inform`, `verb`, `postopts`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid`, `private`, `pubmail`, `attach`, `bookmark`,`origin` )
- VALUES( '%s', %d, '%s', %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d )",
+ `tag`, `inform`, `verb`, `postopts`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid`, `private`, `pubmail`, `attach`, `bookmark`,`origin`, `moderated` )
+ VALUES( '%s', %d, '%s', %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, %d )",
dbesc($datarray['guid']),
intval($datarray['uid']),
dbesc($datarray['type']),
@@ -695,7 +709,8 @@ function item_post(&$a) {
intval($datarray['pubmail']),
dbesc($datarray['attach']),
intval($datarray['bookmark']),
- intval($datarray['origin'])
+ intval($datarray['origin']),
+ intval($datarry['moderated'])
);
$r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' LIMIT 1",
@@ -731,6 +746,7 @@ function item_post(&$a) {
'language' => $user['language'],
'to_name' => $user['username'],
'to_email' => $user['email'],
+ 'uid' => $user['uid'],
'item' => $datarray,
'link' => $a->get_baseurl() . '/display/' . $user['nickname'] . '/' . $post_id,
'source_name' => $datarray['author-name'],
@@ -773,6 +789,7 @@ function item_post(&$a) {
'language' => $user['language'],
'to_name' => $user['username'],
'to_email' => $user['email'],
+ 'uid' => $user['uid'],
'item' => $datarray,
'link' => $a->get_baseurl() . '/display/' . $user['nickname'] . '/' . $post_id,
'source_name' => $datarray['author-name'],
@@ -840,8 +857,8 @@ function item_post(&$a) {
$disclaimer .= sprintf( t('You may visit them online at %s'), $a->get_baseurl() . '/profile/' . $a->user['nickname']) . EOL;
$disclaimer .= t('Please contact the sender by replying to this post if you do not wish to receive these messages.') . EOL;
- $subject = '[Friendica]' . ' ' . sprintf( t('%s posted an update.'),$a->user['username']);
- $headers = 'From: ' . $a->user['username'] . ' <' . $a->user['email'] . '>' . "\n";
+ $subject = email_header_encode('[Friendica]' . ' ' . sprintf( t('%s posted an update.'),$a->user['username']),'UTF-8');
+ $headers = 'From: ' . email_header_encode($a->user['username'],'UTF-8') . ' <' . $a->user['email'] . '>' . "\n";
$headers .= 'MIME-Version: 1.0' . "\n";
$headers .= 'Content-Type: text/html; charset=UTF-8' . "\n";
$headers .= 'Content-Transfer-Encoding: 8bit' . "\n\n";
diff --git a/mod/network.php b/mod/network.php
index 271a1236d..03a671b61 100755
--- a/mod/network.php
+++ b/mod/network.php
@@ -56,7 +56,9 @@ function saved_searches($search) {
. ((x($_GET,'star')) ? '?star=' . $_GET['star'] : '')
. ((x($_GET,'bmark')) ? '?bmark=' . $_GET['bmark'] : '')
. ((x($_GET,'conv')) ? '?conv=' . $_GET['conv'] : '')
- . ((x($_GET,'nets')) ? '?nets=' . $_GET['nets'] : '');
+ . ((x($_GET,'nets')) ? '?nets=' . $_GET['nets'] : '')
+ . ((x($_GET,'cmin')) ? '?cmin=' . $_GET['cmin'] : '')
+ . ((x($_GET,'cmax')) ? '?cmax=' . $_GET['cmax'] : '');
$o = '';
@@ -113,6 +115,7 @@ function network_content(&$a, $update = 0) {
$all_active = '';
$search_active = '';
$conv_active = '';
+ $spam_active = '';
if(($a->argc > 1 && $a->argv[1] === 'new')
|| ($a->argc > 2 && $a->argv[2] === 'new')) {
@@ -135,12 +138,17 @@ function network_content(&$a, $update = 0) {
$conv_active = 'active';
}
+ if($_GET['spam']) {
+ $spam_active = 'active';
+ }
+
if (($new_active == '')
&& ($starred_active == '')
&& ($bookmarked_active == '')
&& ($conv_active == '')
- && ($search_active == '')) {
+ && ($search_active == '')
+ && ($spam_active == '')) {
$all_active = 'active';
}
@@ -151,9 +159,7 @@ function network_content(&$a, $update = 0) {
$all_active = '';
$postord_active = 'active';
}
-
-
-
+
// tabs
$tabs = array(
array(
@@ -187,6 +193,13 @@ function network_content(&$a, $update = 0) {
'url'=>$a->get_baseurl() . '/' . str_replace('/new', '', $a->cmd) . ((x($_GET,'cid')) ? '/?cid=' . $_GET['cid'] : '') . '&bmark=1',
'sel'=>$bookmarked_active,
),
+// array(
+// 'label' => t('Spam'),
+// 'url'=>$a->get_baseurl() . '/network?f=&spam=1'
+// 'sel'=> $spam_active,
+// ),
+
+
);
$tpl = get_markup_template('common_tabs.tpl');
$o .= replace_macros($tpl, array('$tabs'=>$tabs));
@@ -209,7 +222,10 @@ function network_content(&$a, $update = 0) {
$order = ((x($_GET,'order')) ? notags($_GET['order']) : 'comment');
$liked = ((x($_GET,'liked')) ? intval($_GET['liked']) : 0);
$conv = ((x($_GET,'conv')) ? intval($_GET['conv']) : 0);
+ $spam = ((x($_GET,'spam')) ? intval($_GET['spam']) : 0);
$nets = ((x($_GET,'nets')) ? $_GET['nets'] : '');
+ $cmin = ((x($_GET,'cmin')) ? intval($_GET['cmin']) : 0);
+ $cmax = ((x($_GET,'cmax')) ? intval($_GET['cmax']) : 99);
if(($a->argc > 2) && $a->argv[2] === 'new')
$nouveau = true;
@@ -271,11 +287,7 @@ function network_content(&$a, $update = 0) {
$sql_nets = (($nets) ? sprintf(" and `contact`.`network` = '%s' ", dbesc($nets)) : '');
- // We'll need the following line if starred/bookmarks are allowed in comments in the future
- // $sql_extra = " AND `item`.`parent` IN ( SELECT `parent` FROM `item` WHERE `id` = `parent` $sql_options ) ";
-
- // Otherwise, this is a bit faster:
- $sql_extra = $sql_options;
+ $sql_extra = " AND `item`.`parent` IN ( SELECT `parent` FROM `item` WHERE `id` = `parent` $sql_options ) ";
if($group) {
$r = q("SELECT `name`, `id` FROM `group` WHERE `id` = %d AND `uid` = %d LIMIT 1",
@@ -337,14 +349,18 @@ function network_content(&$a, $update = 0) {
$o .= "<script> var profile_uid = " . $_SESSION['uid']
. "; var netargs = '" . substr($a->cmd,8)
. '?f='
- . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : '')
+ . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : '')
. ((x($_GET,'search')) ? '&search=' . $_GET['search'] : '')
- . ((x($_GET,'star')) ? '&star=' . $_GET['star'] : '')
- . ((x($_GET,'order')) ? '&order=' . $_GET['order'] : '')
- . ((x($_GET,'bmark')) ? '&bmark=' . $_GET['bmark'] : '')
- . ((x($_GET,'liked')) ? '&liked=' . $_GET['liked'] : '')
- . ((x($_GET,'conv')) ? '&conv=' . $_GET['conv'] : '')
- . ((x($_GET,'nets')) ? '&nets=' . $_GET['nets'] : '')
+ . ((x($_GET,'star')) ? '&star=' . $_GET['star'] : '')
+ . ((x($_GET,'order')) ? '&order=' . $_GET['order'] : '')
+ . ((x($_GET,'bmark')) ? '&bmark=' . $_GET['bmark'] : '')
+ . ((x($_GET,'liked')) ? '&liked=' . $_GET['liked'] : '')
+ . ((x($_GET,'conv')) ? '&conv=' . $_GET['conv'] : '')
+ . ((x($_GET,'spam')) ? '&spam=' . $_GET['spam'] : '')
+ . ((x($_GET,'nets')) ? '&nets=' . $_GET['nets'] : '')
+ . ((x($_GET,'cmin')) ? '&cmin=' . $_GET['cmin'] : '')
+ . ((x($_GET,'cmax')) ? '&cmax=' . $_GET['cmax'] : '')
+
. "'; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
}
diff --git a/mod/newmember.php b/mod/newmember.php
index 60ca49757..2ecc89024 100755
--- a/mod/newmember.php
+++ b/mod/newmember.php
@@ -9,35 +9,39 @@ function newmember_content(&$a) {
$o .= '<div style="font-size: 120%;">';
- $o .= t('We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page.');
+ $o .= t('We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page. A link to this page will be visible from your home page for two weeks after your initial registration and then will quietly disappear.');
$o .= '<ul>';
- $o .= '<li>' . '<a href="settings">' . t('On your <em>Settings</em> page - change your initial password. Also make a note of your Identity Address. This will be useful in making friends.') . '</a></li>' . EOL;
+ $o .= '<li>' . '<a target="newmember" href="settings">' . t('On your <em>Settings</em> page - change your initial password. Also make a note of your Identity Address. This looks just like an email address - and will be useful in making friends on the free social web.') . '</a></li>' . EOL;
- $o .= '<li>' . '<a href="settings">' . t('Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you.') . '</a></li>' . EOL;
+ $o .= '<li>' . '<a target="newmember" href="settings">' . t('Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you.') . '</a></li>' . EOL;
- $o .= '<li>' . '<a href="profile_photo">' . t('Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not.') . '</a></li>' . EOL;
+ $o .= '<li>' . '<a target="newmember" href="profile_photo">' . t('Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not.') . '</a></li>' . EOL;
if(in_array('facebook', $a->plugins))
- $o .= '<li>' . '<a href="facebook">' . t("Authorise the Facebook Connector if you currently have a Facebook account and we will \x28optionally\x29 import all your Facebook friends and conversations.") . '</a></li>' . EOL;
+ $o .= '<li>' . '<a target="newmember" href="facebook">' . t("Authorise the Facebook Connector if you currently have a Facebook account and we will \x28optionally\x29 import all your Facebook friends and conversations.") . '</a></li>' . EOL;
+ else
+ $o .= '<li>' . '<a target="newmember" href="help/Installing-Connectors">' . t("<em>If</em> this is your own personal server, installing the Facebook addon may ease your transition to the free social web.") . '</a></li>' . EOL;
$mail_disabled = ((function_exists('imap_open') && (! get_config('system','imap_disabled'))) ? 0 : 1);
if(! $mail_disabled)
- $o .= '<li>' . '<a href="settings/connectors">' . t('Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX') . '</a></li>' . EOL;
+ $o .= '<li>' . '<a target="newmember" href="settings/connectors">' . t('Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX') . '</a></li>' . EOL;
- $o .= '<li>' . '<a href="profiles">' . t('Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors.') . '</a></li>' . EOL;
+ $o .= '<li>' . '<a target="newmember" href="profiles">' . t('Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors.') . '</a></li>' . EOL;
- $o .= '<li>' . '<a href="profiles">' . t('Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships.') . '</a></li>' . EOL;
+ $o .= '<li>' . '<a target="newmember" href="profiles">' . t('Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships.') . '</a></li>' . EOL;
- $o .= '<li>' . '<a href="contacts">' . t('Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Add New Contact</em> dialog.') . '</a></li>' . EOL;
+ $o .= '<li>' . '<a target="newmember" href="contacts">' . t('Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Add New Contact</em> dialog.') . '</a></li>' . EOL;
- $o .= '<li>' . '<a href="directory">' . t('The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested.') . '</a></li>' . EOL;
+ $o .= '<li>' . '<a target="newmember" href="directory">' . t('The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested.') . '</a></li>' . EOL;
- $o .= '<li>' . '<a href="contacts">' . t('Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page.') . '</a></li>' . EOL;
+ $o .= '<li>' . '<a target="newmember" href="contacts">' . t("On the side panel of the Contacts page are several tools to find new friends. We can match people by interest, look up people by name or interest, and provide suggestions based on network relationships. On a brand new site, friend suggestions will usually begin to be populated within 24 hours.") . '</a></li>' . EOL;
- $o .= '<li>' . '<a href="help">' . t('Our <strong>help</strong> pages may be consulted for detail on other program features and resources.') . '</a></li>' . EOL;
+ $o .= '<li>' . '<a target="newmember" href="contacts">' . t('Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page.') . '</a></li>' . EOL;
+
+ $o .= '<li>' . '<a target="newmember" href="help">' . t('Our <strong>help</strong> pages may be consulted for detail on other program features and resources.') . '</a></li>' . EOL;
$o .= '</div>';
diff --git a/mod/notifications.php b/mod/notifications.php
index 82d450a88..635639d89 100755
--- a/mod/notifications.php
+++ b/mod/notifications.php
@@ -142,6 +142,8 @@ function notifications_content(&$a) {
'$fullname' => $rr['fname'],
'$url' => $rr['furl'],
'$hidden' => array('hidden', t('Hide this contact from others'), ($rr['hidden'] == 1), ''),
+ '$activity' => array('activity', t('Post a new friend activity'), 1, t('if applicable')),
+
'$knowyou' => $knowyou,
'$approve' => t('Approve'),
'$note' => $rr['note'],
@@ -187,6 +189,7 @@ function notifications_content(&$a) {
'$photo' => ((x($rr,'photo')) ? $rr['photo'] : "images/default-profile.jpg"),
'$fullname' => $rr['name'],
'$hidden' => array('hidden', t('Hide this contact from others'), ($rr['hidden'] == 1), ''),
+ '$activity' => array('activity', t('Post a new friend activity'), 1, t('if applicable')),
'$url' => $rr['url'],
'$knowyou' => $knowyou,
'$approve' => t('Approve'),
diff --git a/mod/oembed.php b/mod/oembed.php
index 25995813a..236625f68 100755
--- a/mod/oembed.php
+++ b/mod/oembed.php
@@ -2,11 +2,26 @@
require_once("include/oembed.php");
function oembed_content(&$a){
+ // logger('mod_oembed ' . $a->query_string, LOGGER_ALL);
+
+ if ($a->argv[1]=='b2h'){
+ $url = array( "", trim(hex2bin($_REQUEST['url'])));
+ echo oembed_replacecb($url);
+ killme();
+ }
+
+ if ($a->argv[1]=='h2b'){
+ $text = trim(hex2bin($_REQUEST['text']));
+ echo oembed_html2bbcode($text);
+ killme();
+ }
+
if ($a->argc == 2){
echo "<html><body>";
$url = base64url_decode($a->argv[1]);
$j = oembed_fetch_url($url);
echo $j->html;
+// logger('mod-oembed ' . $j->html, LOGGER_ALL);
echo "</body></html>";
}
killme();
diff --git a/mod/oexchange.php b/mod/oexchange.php
index 53dce6446..bbb436e70 100755
--- a/mod/oexchange.php
+++ b/mod/oexchange.php
@@ -11,8 +11,6 @@ function oexchange_init(&$a) {
killme();
}
-
-
}
@@ -28,14 +26,14 @@ function oexchange_content(&$a) {
return;
}
- $url = (((x($_GET,'url')) && strlen($_GET['url']))
- ? urlencode(notags(trim($_GET['url']))) : '');
- $title = (((x($_GET,'title')) && strlen($_GET['title']))
- ? '&title=' . urlencode(notags(trim($_GET['title']))) : '');
- $description = (((x($_GET,'description')) && strlen($_GET['description']))
- ? '&description=' . urlencode(notags(trim($_GET['description']))) : '');
- $tags = (((x($_GET,'tags')) && strlen($_GET['tags']))
- ? '&tags=' . urlencode(notags(trim($_GET['tags']))) : '');
+ $url = (((x($_REQUEST,'url')) && strlen($_REQUEST['url']))
+ ? urlencode(notags(trim($_REQUEST['url']))) : '');
+ $title = (((x($_REQUEST,'title')) && strlen($_REQUEST['title']))
+ ? '&title=' . urlencode(notags(trim($_REQUEST['title']))) : '');
+ $description = (((x($_REQUEST,'description')) && strlen($_REQUEST['description']))
+ ? '&description=' . urlencode(notags(trim($_REQUEST['description']))) : '');
+ $tags = (((x($_REQUEST,'tags')) && strlen($_REQUEST['tags']))
+ ? '&tags=' . urlencode(notags(trim($_REQUEST['tags']))) : '');
$s = fetch_url($a->get_baseurl() . '/parse_url?f=&url=' . $url . $title . $description . $tags);
@@ -51,7 +49,7 @@ function oexchange_content(&$a) {
$post['body'] = html2bbcode($s);
$post['type'] = 'wall';
- $_POST = $post;
+ $_REQUEST = $post;
require_once('mod/item.php');
item_post($a);
diff --git a/mod/parse_url.php b/mod/parse_url.php
index 2df9de476..e0b378f68 100755
--- a/mod/parse_url.php
+++ b/mod/parse_url.php
@@ -12,6 +12,13 @@ function parse_url_content(&$a) {
$text = null;
$str_tags = '';
+ $textmode = false;
+ if(local_user() && intval(get_pconfig(local_user(),'system','plaintext')))
+ $textmode = true;
+
+ if($textmode)
+ $br = (($textmode) ? "\n" : '<br /?');
+
if(x($_GET,'binurl'))
$url = trim(hex2bin($_GET['binurl']));
else
@@ -27,14 +34,17 @@ function parse_url_content(&$a) {
$arr_tags = str_getcsv($_GET['tags']);
if(count($arr_tags)) {
array_walk($arr_tags,'arr_add_hashes');
- $str_tags = '<br />' . implode(' ',$arr_tags) . '<br />';
+ $str_tags = $br . implode(' ',$arr_tags) . $br;
}
}
logger('parse_url: ' . $url);
- $template = "<br /><a class=\"bookmark\" href=\"%s\" >%s</a>%s<br />";
+ if($textmode)
+ $template = $br . '[bookmark=%s]%s[/bookmark]%s' . $br;
+ else
+ $template = "<br /><a class=\"bookmark\" href=\"%s\" >%s</a>%s<br />";
$arr = array('url' => $url, 'text' => '');
@@ -49,7 +59,11 @@ function parse_url_content(&$a) {
if($url && $title && $text) {
- $text = '<br /><br /><blockquote>' . $text . '</blockquote><br />';
+ if($textmode)
+ $text = $br . $br . '[quote]' . $text . '[/quote]' . $br;
+ else
+ $text = '<br /><br /><blockquote>' . $text . '</blockquote><br />';
+
$title = str_replace(array("\r","\n"),array('',''),$title);
$result = sprintf($template,$url,($title) ? $title : $url,$text) . $str_tags;
@@ -208,10 +222,17 @@ function parse_url_content(&$a) {
$ph->scaleImage(300);
$new_width = $ph->getWidth();
$new_height = $ph->getHeight();
- $image = '<br /><br /><img height="' . $new_height . '" width="' . $new_width . '" src="' .$image . '" alt="photo" />';
+ if($textmode)
+ $image = $br . $br . '[img=' . $new_width . 'x' . $new_height . ']' . $image . '[/img]';
+ else
+ $image = '<br /><br /><img height="' . $new_height . '" width="' . $new_width . '" src="' .$image . '" alt="photo" />';
+ }
+ else {
+ if($textmode)
+ $image = $br . $br . '[img]' . $image . '[/img]';
+ else
+ $image = '<br /><br /><img src="' . $image . '" alt="photo" />';
}
- else
- $image = '<br /><br /><img src="' . $image . '" alt="photo" />';
}
else
$image = '';
@@ -223,11 +244,14 @@ function parse_url_content(&$a) {
}
if(strlen($text)) {
- $text = '<br /><br /><blockquote>' . $text . '</blockquote><br />';
+ if($textmode)
+ $text = $br .$br . '[quote]' . $text . '[/quote]' . $br ;
+ else
+ $text = '<br /><br /><blockquote>' . $text . '</blockquote><br />';
}
if($image) {
- $text = $image . '<br />' . $text;
+ $text = $image . $br . $text;
}
$title = str_replace(array("\r","\n"),array('',''),$title);
diff --git a/mod/profile.php b/mod/profile.php
index 5d89db93e..eba9874a8 100755
--- a/mod/profile.php
+++ b/mod/profile.php
@@ -128,7 +128,7 @@ function profile_content(&$a, $update = 0) {
}
if(x($_SESSION,'new_member') && $_SESSION['new_member'] && $is_owner)
- $o .= '<a href="newmember">' . t('Tips for New Members') . '</a>' . EOL;
+ $o .= '<a href="newmember" id="newmember-tips" style="font-size: 1.2em;"><b>' . t('Tips for New Members') . '</b></a>' . EOL;
$commpage = (($a->profile['page-flags'] == PAGE_COMMUNITY) ? true : false);
$commvisitor = (($commpage && $remote_contact == true) ? true : false);
diff --git a/mod/redir.php b/mod/redir.php
index eb9702b04..9223e5483 100755
--- a/mod/redir.php
+++ b/mod/redir.php
@@ -2,44 +2,59 @@
function redir_init(&$a) {
- if((! local_user()) || (! ($a->argc == 2)) || (! intval($a->argv[1])))
- goaway(z_root());
- $cid = $a->argv[1];
$url = ((x($_GET,'url')) ? $_GET['url'] : '');
- $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($cid),
- intval(local_user())
- );
+ // traditional DFRN
- if((! count($r)) || ($r[0]['network'] !== 'dfrn'))
- goaway(z_root());
+ if(local_user() && $a->argc == 2 && intval($a->argv[1])) {
- $dfrn_id = $orig_id = (($r[0]['issued-id']) ? $r[0]['issued-id'] : $r[0]['dfrn-id']);
+ $cid = $a->argv[1];
- if($r[0]['duplex'] && $r[0]['issued-id']) {
- $orig_id = $r[0]['issued-id'];
- $dfrn_id = '1:' . $orig_id;
+ $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ intval($cid),
+ intval(local_user())
+ );
+
+ if((! count($r)) || ($r[0]['network'] !== NETWORK_DFRN))
+ goaway(z_root());
+
+ $dfrn_id = $orig_id = (($r[0]['issued-id']) ? $r[0]['issued-id'] : $r[0]['dfrn-id']);
+
+ if($r[0]['duplex'] && $r[0]['issued-id']) {
+ $orig_id = $r[0]['issued-id'];
+ $dfrn_id = '1:' . $orig_id;
+ }
+ if($r[0]['duplex'] && $r[0]['dfrn-id']) {
+ $orig_id = $r[0]['dfrn-id'];
+ $dfrn_id = '0:' . $orig_id;
+ }
+
+ $sec = random_string();
+
+ q("INSERT INTO `profile_check` ( `uid`, `cid`, `dfrn_id`, `sec`, `expire`)
+ VALUES( %d, %s, '%s', '%s', %d )",
+ intval(local_user()),
+ intval($cid),
+ dbesc($dfrn_id),
+ dbesc($sec),
+ intval(time() + 45)
+ );
+
+ logger('mod_redir: ' . $r[0]['name'] . ' ' . $sec, LOGGER_DEBUG);
+ $dest = (($url) ? '&destination_url=' . $url : '');
+ goaway ($r[0]['poll'] . '?dfrn_id=' . $dfrn_id
+ . '&dfrn_version=' . DFRN_PROTOCOL_VERSION . '&type=profile&sec=' . $sec . $dest );
}
- if($r[0]['duplex'] && $r[0]['dfrn-id']) {
- $orig_id = $r[0]['dfrn-id'];
- $dfrn_id = '0:' . $orig_id;
+
+ if(local_user())
+ $handle = $a->user['nickname'] . '@' . substr($a->get_baseurl(),strpos($a->get_baseurl(),'://')+3);
+ if(remote_user())
+ $handle = $_SESSION['handle'];
+
+ if($url) {
+ $url = str_replace('{zid}','&zid=' . $handle,$url);
+ goaway($url);
}
- $sec = random_string();
-
- q("INSERT INTO `profile_check` ( `uid`, `cid`, `dfrn_id`, `sec`, `expire`)
- VALUES( %d, %s, '%s', '%s', %d )",
- intval(local_user()),
- intval($cid),
- dbesc($dfrn_id),
- dbesc($sec),
- intval(time() + 45)
- );
-
- logger('mod_redir: ' . $r[0]['name'] . ' ' . $sec, LOGGER_DEBUG);
- $dest = (($url) ? '&destination_url=' . $url : '');
- goaway ($r[0]['poll'] . '?dfrn_id=' . $dfrn_id
- . '&dfrn_version=' . DFRN_PROTOCOL_VERSION . '&type=profile&sec=' . $sec . $dest );
-
+ goaway(z_root());
}
diff --git a/mod/register.php b/mod/register.php
index 89f561642..388b3e250 100755
--- a/mod/register.php
+++ b/mod/register.php
@@ -278,8 +278,8 @@ function register_post(&$a) {
return;
}
$r = q("INSERT INTO `contact` ( `uid`, `created`, `self`, `name`, `nick`, `photo`, `thumb`, `micro`, `blocked`, `pending`, `url`, `nurl`,
- `request`, `notify`, `poll`, `confirm`, `poco`, `name-date`, `uri-date`, `avatar-date` )
- VALUES ( %d, '%s', 1, '%s', '%s', '%s', '%s', '%s', 0, 0, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
+ `request`, `notify`, `poll`, `confirm`, `poco`, `name-date`, `uri-date`, `avatar-date`, `closeness` )
+ VALUES ( %d, '%s', 1, '%s', '%s', '%s', '%s', '%s', 0, 0, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', 0 ) ",
intval($newuid),
datetime_convert(),
dbesc($username),
diff --git a/mod/regmod.php b/mod/regmod.php
index 76ea4062e..17e728ba2 100755
--- a/mod/regmod.php
+++ b/mod/regmod.php
@@ -107,7 +107,7 @@ function regmod_content(&$a) {
return $o;
}
- if(!is_site_admin()) {
+ if((!is_site_admin()) || (x($_SESSION,'submanage') && intval($_SESSION['submanage']))) {
notice( t('Permission denied.') . EOL);
return '';
}
diff --git a/mod/settings.php b/mod/settings.php
index c61d5c227..57a4e6db0 100755
--- a/mod/settings.php
+++ b/mod/settings.php
@@ -734,8 +734,11 @@ function settings_content(&$a) {
if($files) {
foreach($files as $file) {
$f = basename($file);
- $theme_name = ((file_exists($file . '/experimental')) ? sprintf("%s - \x28Experimental\x29", $f) : $f);
- $themes[$f]=$theme_name;
+ $is_experimental = file_exists($file . '/experimental');
+ if (!$is_experimental or ($is_experimental && (get_config('experimentals','exp_themes')==1 or get_config('experimentals','exp_themes')===false))){
+ $theme_name = (($is_experimental) ? sprintf("%s - \x28Experimental\x29", $f) : $f);
+ $themes[$f]=$theme_name;
+ }
}
}
$theme_selected = (!x($_SESSION,'theme')? $default_theme : $_SESSION['theme']);
@@ -757,7 +760,7 @@ function settings_content(&$a) {
$celeb = ((($a->user['page-flags'] == PAGE_SOAPBOX) || ($a->user['page-flags'] == PAGE_COMMUNITY)) ? true : false);
$expire_arr = array(
- 'days' => array('expire', t("Automatically expire posts after days:"), $expire, t('If empty, posts will not expire. Expired posts will be deleted')),
+ 'days' => array('expire', t("Automatically expire posts after this many days:"), $expire, t('If empty, posts will not expire. Expired posts will be deleted')),
'advanced' => t('Advanced expiration settings'),
'label' => t('Advanced Expiration'),
'items' => array('expire_items', t("Expire posts:"), $expire_items, '', array(t('No'),t('Yes'))),
@@ -818,6 +821,7 @@ function settings_content(&$a) {
'$notify4' => array('notify4', t('Someone writes a followup comment'), ($notify & NOTIFY_COMMENT), NOTIFY_COMMENT, ''),
'$notify5' => array('notify5', t('You receive a private message'), ($notify & NOTIFY_MAIL), NOTIFY_MAIL, ''),
'$notify6' => array('notify6', t('You receive a friend suggestion'), ($notify & NOTIFY_SUGGEST), NOTIFY_SUGGEST, ''),
+ '$notify7' => array('notify7', t('You are tagged in a post'), ($notify & NOTIFY_TAGSELF), NOTIFY_TAGSELF, ''),
'$h_advn' => t('Advanced Page Settings'),
diff --git a/mod/smilies.php b/mod/smilies.php
new file mode 100755
index 000000000..c47f95da7
--- /dev/null
+++ b/mod/smilies.php
@@ -0,0 +1,3 @@
+<?php
+
+function smilies_content(&$a) { return smilies('',true); }
diff --git a/mod/wall_attach.php b/mod/wall_attach.php
index a66ed0d05..ecf475291 100755
--- a/mod/wall_attach.php
+++ b/mod/wall_attach.php
@@ -61,8 +61,6 @@ function wall_attach_post(&$a) {
$filedata = @file_get_contents($src);
$mimetype = z_mime_content_type($filename);
- if(((! strlen($mimetype)) || ($mimetype === 'application/octet-stream')) && function_exists('mime_content_type'))
- $mimetype = mime_content_type($filename);
$hash = random_string();
$created = datetime_convert();
$r = q("INSERT INTO `attach` ( `uid`, `hash`, `filename`, `filetype`, `filesize`, `data`, `created`, `edited`, `allow_cid`, `allow_gid`,`deny_cid`, `deny_gid` )
diff --git a/mod/wall_upload.php b/mod/wall_upload.php
index b34f2cf6b..278c21354 100755
--- a/mod/wall_upload.php
+++ b/mod/wall_upload.php
@@ -100,7 +100,11 @@ function wall_upload_post(&$a) {
}
$basename = basename($filename);
- echo '<br /><br /><a href="' . $a->get_baseurl() . '/photos/' . $page_owner_nick . '/image/' . $hash . '" ><img src="' . $a->get_baseurl() . "/photo/{$hash}-{$smallest}.jpg\" alt=\"$basename\" /></a><br /><br />";
+
+ if(local_user() && intval(get_pconfig(local_user(),'system','plaintext')))
+ echo "\n\n" . '[url=' . $a->get_baseurl() . '/photos/' . $page_owner_nick . '/image/' . $hash . '][img]' . $a->get_baseurl() . "/photo/{$hash}-{$smallest}.jpg[/img][/url]\n\n";
+ else
+ echo '<br /><br /><a href="' . $a->get_baseurl() . '/photos/' . $page_owner_nick . '/image/' . $hash . '" ><img src="' . $a->get_baseurl() . "/photo/{$hash}-{$smallest}.jpg\" alt=\"$basename\" /></a><br /><br />";
killme();
// NOTREACHED
diff --git a/update.php b/update.php
index d961f2932..24138450a 100755
--- a/update.php
+++ b/update.php
@@ -1,6 +1,6 @@
<?php
-define( 'UPDATE_VERSION' , 1118 );
+define( 'UPDATE_VERSION' , 1122 );
/**
*
@@ -1012,3 +1012,56 @@ INDEX ( `mid` )
}
+function update_1118() {
+ // rolled forward
+}
+
+function update_1119() {
+q("ALTER TABLE `contact` ADD `closeness` TINYINT( 2 ) NOT NULL DEFAULT '99' AFTER `reason` , ADD INDEX (`closeness`) ");
+q("update contact set closeness = 0 where self = 1");
+q("ALTER TABLE `item` ADD `spam` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `visible` , ADD INDEX (`spam`) ");
+}
+
+
+function update_1120() {
+
+ // item table update from 1119 did not get into database.sql file.
+ // might be missing on new installs. We'll check.
+
+ $r = q("describe item");
+ if($r && count($r)) {
+ foreach($r as $rr)
+ if($rr['Field'] == 'spam')
+ return;
+ }
+ q("ALTER TABLE `item` ADD `spam` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `visible` , ADD INDEX (`spam`) ");
+
+}
+
+function update_1121() {
+ q("CREATE TABLE IF NOT EXISTS `poll_result` (
+ `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+ `poll_id` INT NOT NULL ,
+ `choice` INT NOT NULL ,
+ INDEX ( `poll_id` ),
+ INDEX ( `choice` )
+ ) ENGINE = MYISAM ");
+
+ q("CREATE TABLE IF NOT EXISTS `poll` (
+ `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+ `uid` INT NOT NULL ,
+ `q0` MEDIUMTEXT NOT NULL ,
+ `q1` MEDIUMTEXT NOT NULL ,
+ `q2` MEDIUMTEXT NOT NULL ,
+ `q3` MEDIUMTEXT NOT NULL ,
+ `q4` MEDIUMTEXT NOT NULL ,
+ `q5` MEDIUMTEXT NOT NULL ,
+ `q6` MEDIUMTEXT NOT NULL ,
+ `q7` MEDIUMTEXT NOT NULL ,
+ `q8` MEDIUMTEXT NOT NULL ,
+ `q9` MEDIUMTEXT NOT NULL ,
+ INDEX ( `uid` )
+ ) ENGINE = MYISAM ");
+
+}
+
diff --git a/util/fpostit/README b/util/fpostit/README
new file mode 100644
index 000000000..39b7c5761
--- /dev/null
+++ b/util/fpostit/README
@@ -0,0 +1,8 @@
+fpostit
+
+original author: Devlon Duthied
+
+see his blog posting:
+http://blog.duthied.com/2011/09/13/node-agnostic-friendika-bookmarklet/
+
+original published at github https://github.com/duthied/Friendika-Bookmarklet
diff --git a/util/fpostit/fpostit.js b/util/fpostit/fpostit.js
new file mode 100644
index 000000000..a6c75aba8
--- /dev/null
+++ b/util/fpostit/fpostit.js
@@ -0,0 +1,11 @@
+javascript: (function() {
+ the_url = 'http://testbubble.com/fpostit.php?url=' + encodeURIComponent(window.location.href) + '&title=' + encodeURIComponent(document.title) + '&text=' + encodeURIComponent('' (window.getSelection ? window.getSelection() : document.getSelection ? document.getSelection() : document.selection.createRange().text));
+ a_funct = function() {
+ if (!window.open(the_url, 'fpostit', 'location=yes,links=no,scrollbars=no,toolbar=no,width=600,height=300')) location.href = the_url;
+ };
+ if (/Firefox/.test(navigator.userAgent)) {
+ setTimeout(a_funct, 0)
+ } else {
+ a_funct()
+ }
+})() \ No newline at end of file
diff --git a/util/fpostit/fpostit.php b/util/fpostit/fpostit.php
new file mode 100644
index 000000000..491d81f6d
--- /dev/null
+++ b/util/fpostit/fpostit.php
@@ -0,0 +1,129 @@
+<?php
+
+if (($_POST["friendika_acct_name"] != '') && ($_POST["friendika_password"] != '')) {
+ setcookie("username", $_POST["friendika_acct_name"], time()+60*60*24*300);
+ setcookie("password", $_POST["friendika_password"], time()+60*60*24*300);
+}
+
+?>
+<html>
+<head>
+ <style>
+ body {
+ font-family: arial, Helvetica,sans-serif;
+ margin: 0px;
+ }
+ .wrap1 {
+ padding: 2px 5px;
+ background-color: #729FCF;
+ margin-bottom: 10px;
+ }
+ .wrap2 {
+ margin-left: 10px;
+ font-size: 12px;
+ }
+ .logo {
+ margin-left: 3px;
+ margin-right: 5px;
+ float: left;
+ }
+ h2 {
+ color: #ffffff;
+ }
+ .error {
+ background-color: #FFFF66;
+ font-size: 12px;
+ margin-left: 10px;
+ }
+ </style>
+</head>
+
+<body>
+<?php
+
+if (isset($_GET['title'])) {
+ $title = $_GET['title'];
+}
+if (isset($_GET['text'])) {
+ $text = $_GET['text'];
+}
+if (isset($_GET['url'])) {
+ $url = $_GET['url'];
+}
+
+if ((isset($title)) && (isset($text)) && (isset($url))) {
+ $content = "$title\nsource:$url\n\n$text";
+} else {
+ $content = $_POST['content'];
+}
+
+if (isset($_POST['submit'])) {
+
+ if (($_POST["friendika_acct_name"] != '') && ($_POST["friendika_password"] != '')) {
+ $acctname = $_POST["friendika_acct_name"];
+ $tmp_account_array = explode("@", $acctname);
+ if (isset($tmp_account_array[1])) {
+ $username = $tmp_account_array[0];
+ $hostname = $tmp_account_array[1];
+ }
+ $password = $_POST["friendika_password"];
+ $content = $_POST["content"];
+
+ $url = "http://" . $hostname . '/api/statuses/update';
+ $data = array('status' => $content);
+
+ // echo "posting to: $url<br/>";
+
+ $c = curl_init();
+ curl_setopt($c, CURLOPT_URL, $url);
+ curl_setopt($c, CURLOPT_USERPWD, "$username:$password");
+ curl_setopt($c, CURLOPT_POSTFIELDS, $data);
+ curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
+ curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);
+ $c_result = curl_exec($c);
+ if(curl_errno($c)){
+ $error = curl_error($c);
+ showForm($error, $content);
+ }
+
+ curl_close($c);
+ if (!isset($error)) {
+ echo '<script language="javascript" type="text/javascript">window.close();</script>';
+ }
+
+ } else {
+ $error = "Missing account name and/or password...try again please";
+ showForm($error, $content);
+ }
+
+} else {
+ showForm(null, $content);
+}
+
+function showForm($error, $content) {
+ $username_cookie = $_COOKIE['username'];
+ $password_cookie = $_COOKIE['password'];
+
+ echo <<<EOF
+ <div class='wrap1'>
+ <h2><img class='logo' src='friendika-32.png' align='middle';/>
+ Friendika Bookmarklet</h2>
+ </div>
+
+ <div class="wrap2">
+ <form method="post" action="{$_SERVER['PHP_SELF']}">
+ Enter the email address of the Friendika Account that you want to cross-post to:(example: user@friendika.org)<br /><br />
+ Account ID: <input type="text" name="friendika_acct_name" value="{$username_cookie}" size="50"/><br />
+ Password: <input type="password" name="friendika_password" value="{$password_cookie}" size="50"/><br />
+ <textarea name="content" id="content" rows="6" cols="70">{$content}</textarea><br />
+ <input type="submit" value="PostIt!" name="submit" />&nbsp;&nbsp;<span class='error'>$error</span>
+ </form>
+ <p></p>
+ </div>
+EOF;
+
+}
+?>
+
+</body>
+</html> \ No newline at end of file
diff --git a/util/fpostit/friendika-32.png b/util/fpostit/friendika-32.png
new file mode 100644
index 000000000..61764bf20
--- /dev/null
+++ b/util/fpostit/friendika-32.png
Binary files differ
diff --git a/util/messages.po b/util/messages.po
index f553041b2..6e1652b39 100755
--- a/util/messages.po
+++ b/util/messages.po
@@ -6,9 +6,9 @@
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: 2.3.1221\n"
+"Project-Id-Version: 2.3.1250\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-01-10 08:21-0800\n"
+"POT-Creation-Date: 2012-02-12 17:14-0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,1205 +17,1154 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
#"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-#: ../../mod/allfriends.php:9 ../../mod/follow.php:8
-#: ../../mod/contacts.php:117 ../../mod/settings.php:43
-#: ../../mod/settings.php:48 ../../mod/settings.php:403
-#: ../../mod/crepair.php:113 ../../mod/notifications.php:62
-#: ../../mod/message.php:9 ../../mod/message.php:46
-#: ../../mod/wall_upload.php:42 ../../mod/wall_attach.php:43
-#: ../../mod/profile_photo.php:19 ../../mod/profile_photo.php:137
-#: ../../mod/profile_photo.php:148 ../../mod/profile_photo.php:159
-#: ../../mod/manage.php:75 ../../mod/common.php:9 ../../mod/profiles.php:7
-#: ../../mod/profiles.php:229 ../../mod/invite.php:13 ../../mod/invite.php:81
-#: ../../mod/register.php:36 ../../mod/fsuggest.php:78
-#: ../../mod/editpost.php:10 ../../mod/regmod.php:111
-#: ../../mod/install.php:171 ../../mod/suggest.php:28
-#: ../../mod/display.php:111 ../../mod/notes.php:20
-#: ../../mod/dfrn_confirm.php:53 ../../mod/item.php:118
-#: ../../mod/photos.php:125 ../../mod/photos.php:860 ../../mod/network.php:6
-#: ../../mod/api.php:26 ../../mod/api.php:31 ../../mod/attach.php:33
-#: ../../mod/viewcontacts.php:21 ../../mod/group.php:19
-#: ../../mod/events.php:109 ../../index.php:288 ../../include/items.php:2867
-#: ../../addon/facebook/facebook.php:331
-msgid "Permission denied."
-msgstr ""
-
-#: ../../mod/allfriends.php:34
-#, php-format
-msgid "Friends of %s"
-msgstr ""
-
-#: ../../mod/allfriends.php:40
-msgid "No friends to display."
+#: ../../mod/oexchange.php:27
+msgid "Post successful."
msgstr ""
-#: ../../mod/update_profile.php:41 ../../mod/update_network.php:22
#: ../../mod/update_notes.php:41 ../../mod/update_community.php:18
+#: ../../mod/update_network.php:22 ../../mod/update_profile.php:41
msgid "[Embedded content - reload page to view]"
msgstr ""
-#: ../../mod/directory.php:31 ../../mod/dfrn_request.php:624
-#: ../../mod/community.php:16 ../../mod/display.php:7 ../../mod/search.php:71
-#: ../../mod/photos.php:754 ../../mod/viewcontacts.php:16
-msgid "Public access denied."
-msgstr ""
-
-#: ../../mod/directory.php:49
-msgid "Global Directory"
+#: ../../mod/crepair.php:102
+msgid "Contact settings applied."
msgstr ""
-#: ../../mod/directory.php:55
-msgid "Normal site view"
+#: ../../mod/crepair.php:104
+msgid "Contact update failed."
msgstr ""
-#: ../../mod/directory.php:57
-msgid "Admin - View all site entries"
+#: ../../mod/crepair.php:115 ../../mod/wall_attach.php:43
+#: ../../mod/fsuggest.php:78 ../../mod/events.php:109 ../../mod/api.php:26
+#: ../../mod/api.php:31 ../../mod/photos.php:129 ../../mod/photos.php:865
+#: ../../mod/editpost.php:10 ../../mod/install.php:171
+#: ../../mod/notifications.php:62 ../../mod/contacts.php:125
+#: ../../mod/settings.php:49 ../../mod/settings.php:404
+#: ../../mod/settings.php:409 ../../mod/manage.php:86 ../../mod/network.php:6
+#: ../../mod/notes.php:20 ../../mod/attach.php:33 ../../mod/group.php:19
+#: ../../mod/viewcontacts.php:21 ../../mod/register.php:36
+#: ../../mod/regmod.php:111 ../../mod/item.php:123 ../../mod/item.php:139
+#: ../../mod/profile_photo.php:19 ../../mod/profile_photo.php:137
+#: ../../mod/profile_photo.php:148 ../../mod/profile_photo.php:159
+#: ../../mod/message.php:9 ../../mod/message.php:46 ../../mod/allfriends.php:9
+#: ../../mod/wall_upload.php:42 ../../mod/follow.php:8 ../../mod/common.php:9
+#: ../../mod/display.php:112 ../../mod/profiles.php:7
+#: ../../mod/profiles.php:229 ../../mod/delegate.php:6
+#: ../../mod/suggest.php:28 ../../mod/invite.php:13 ../../mod/invite.php:81
+#: ../../mod/dfrn_confirm.php:53 ../../addon/facebook/facebook.php:331
+#: ../../include/items.php:2907 ../../index.php:288
+msgid "Permission denied."
msgstr ""
-#: ../../mod/directory.php:63
-msgid "Find on this site"
+#: ../../mod/crepair.php:129 ../../mod/fsuggest.php:20
+#: ../../mod/fsuggest.php:92 ../../mod/dfrn_confirm.php:118
+msgid "Contact not found."
msgstr ""
-#: ../../mod/directory.php:65 ../../mod/contacts.php:372
-msgid "Finding: "
+#: ../../mod/crepair.php:135
+msgid "Repair Contact Settings"
msgstr ""
-#: ../../mod/directory.php:66
-msgid "Site Directory"
+#: ../../mod/crepair.php:137
+msgid ""
+"<strong>WARNING: This is highly advanced</strong> and if you enter incorrect "
+"information your communications with this contact may stop working."
msgstr ""
-#: ../../mod/directory.php:67 ../../mod/contacts.php:373
-#: ../../include/contact_widgets.php:34
-msgid "Find"
+#: ../../mod/crepair.php:138
+msgid ""
+"Please use your browser 'Back' button <strong>now</strong> if you are "
+"uncertain what to do on this page."
msgstr ""
-#: ../../mod/directory.php:122 ../../mod/profiles.php:426
-msgid "Age: "
+#: ../../mod/crepair.php:144
+msgid "Return to contact editor"
msgstr ""
-#: ../../mod/directory.php:125
-msgid "Gender: "
+#: ../../mod/crepair.php:148 ../../mod/settings.php:455
+#: ../../mod/settings.php:481 ../../mod/admin.php:464 ../../mod/admin.php:473
+msgid "Name"
msgstr ""
-#: ../../mod/directory.php:151
-msgid "No entries (some entries may be hidden)."
+#: ../../mod/crepair.php:149
+msgid "Account Nickname"
msgstr ""
-#: ../../mod/notice.php:15 ../../mod/viewsrc.php:15 ../../mod/admin.php:111
-#: ../../mod/admin.php:502 ../../mod/display.php:28 ../../mod/display.php:115
-#: ../../include/items.php:2779
-msgid "Item not found."
+#: ../../mod/crepair.php:150
+msgid "@Tagname - overrides Name/Nickname"
msgstr ""
-#: ../../mod/viewsrc.php:7
-msgid "Access denied."
+#: ../../mod/crepair.php:151
+msgid "Account URL"
msgstr ""
-#: ../../mod/newmember.php:6
-msgid "Welcome to Friendica"
+#: ../../mod/crepair.php:152
+msgid "Friend Request URL"
msgstr ""
-#: ../../mod/newmember.php:8
-msgid "New Member Checklist"
+#: ../../mod/crepair.php:153
+msgid "Friend Confirm URL"
msgstr ""
-#: ../../mod/newmember.php:12
-msgid ""
-"We would like to offer some tips and links to help make your experience "
-"enjoyable. Click any item to visit the relevant page."
+#: ../../mod/crepair.php:154
+msgid "Notification Endpoint URL"
msgstr ""
-#: ../../mod/newmember.php:16
-msgid ""
-"On your <em>Settings</em> page - change your initial password. Also make a "
-"note of your Identity Address. This will be useful in making friends."
+#: ../../mod/crepair.php:155
+msgid "Poll/Feed URL"
msgstr ""
-#: ../../mod/newmember.php:18
-msgid ""
-"Review the other settings, particularly the privacy settings. An unpublished "
-"directory listing is like having an unlisted phone number. In general, you "
-"should probably publish your listing - unless all of your friends and "
-"potential friends know exactly how to find you."
+#: ../../mod/crepair.php:156
+msgid "New photo from this URL"
msgstr ""
-#: ../../mod/newmember.php:20
-msgid ""
-"Upload a profile photo if you have not done so already. Studies have shown "
-"that people with real photos of themselves are ten times more likely to make "
-"friends than people who do not."
+#: ../../mod/crepair.php:166 ../../mod/fsuggest.php:107
+#: ../../mod/events.php:333 ../../mod/photos.php:900 ../../mod/photos.php:958
+#: ../../mod/photos.php:1182 ../../mod/photos.php:1222
+#: ../../mod/photos.php:1262 ../../mod/photos.php:1293
+#: ../../mod/install.php:251 ../../mod/install.php:289
+#: ../../mod/localtime.php:45 ../../mod/contacts.php:319
+#: ../../mod/settings.php:453 ../../mod/settings.php:592
+#: ../../mod/settings.php:773 ../../mod/manage.php:109 ../../mod/group.php:84
+#: ../../mod/group.php:167 ../../mod/admin.php:296 ../../mod/admin.php:461
+#: ../../mod/admin.php:587 ../../mod/admin.php:652 ../../mod/profiles.php:375
+#: ../../mod/invite.php:106 ../../addon/facebook/facebook.php:410
+#: ../../addon/yourls/yourls.php:76 ../../addon/nsfw/nsfw.php:57
+#: ../../addon/uhremotestorage/uhremotestorage.php:89
+#: ../../addon/randplace/randplace.php:179 ../../addon/drpost/drpost.php:110
+#: ../../addon/geonames/geonames.php:187 ../../addon/oembed.old/oembed.php:41
+#: ../../addon/impressum/impressum.php:69 ../../addon/blockem/blockem.php:57
+#: ../../addon/editplain/editplain.php:84 ../../addon/blackout/blackout.php:94
+#: ../../addon/pageheader/pageheader.php:52
+#: ../../addon/statusnet/statusnet.php:280
+#: ../../addon/statusnet/statusnet.php:294
+#: ../../addon/statusnet/statusnet.php:320
+#: ../../addon/statusnet/statusnet.php:327
+#: ../../addon/statusnet/statusnet.php:349
+#: ../../addon/statusnet/statusnet.php:495 ../../addon/tumblr/tumblr.php:90
+#: ../../addon/numfriends/numfriends.php:85 ../../addon/wppost/wppost.php:102
+#: ../../addon/piwik/piwik.php:81 ../../addon/twitter/twitter.php:180
+#: ../../addon/twitter/twitter.php:203 ../../addon/twitter/twitter.php:315
+#: ../../addon/posterous/posterous.php:90 ../../include/conversation.php:515
+msgid "Submit"
msgstr ""
-#: ../../mod/newmember.php:23
-msgid ""
-"Authorise the Facebook Connector if you currently have a Facebook account "
-"and we will (optionally) import all your Facebook friends and conversations."
+#: ../../mod/help.php:30
+msgid "Help:"
msgstr ""
-#: ../../mod/newmember.php:28
-msgid ""
-"Enter your email access information on your Connector Settings page if you "
-"wish to import and interact with friends or mailing lists from your email "
-"INBOX"
+#: ../../mod/help.php:34 ../../include/nav.php:82
+msgid "Help"
msgstr ""
-#: ../../mod/newmember.php:30
-msgid ""
-"Edit your <strong>default</strong> profile to your liking. Review the "
-"settings for hiding your list of friends and hiding the profile from unknown "
-"visitors."
+#: ../../mod/help.php:38 ../../index.php:221
+msgid "Not Found"
msgstr ""
-#: ../../mod/newmember.php:32
-msgid ""
-"Set some public keywords for your default profile which describe your "
-"interests. We may be able to find other people with similar interests and "
-"suggest friendships."
+#: ../../mod/help.php:41 ../../index.php:224
+msgid "Page not found."
msgstr ""
-#: ../../mod/newmember.php:34
-msgid ""
-"Your Contacts page is your gateway to managing friendships and connecting "
-"with friends on other networks. Typically you enter their address or site "
-"URL in the <em>Add New Contact</em> dialog."
+#: ../../mod/wall_attach.php:57
+#, php-format
+msgid "File exceeds size limit of %d"
msgstr ""
-#: ../../mod/newmember.php:36
-msgid ""
-"The Directory page lets you find other people in this network or other "
-"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
-"their profile page. Provide your own Identity Address if requested."
+#: ../../mod/wall_attach.php:85 ../../mod/wall_attach.php:96
+msgid "File upload failed."
msgstr ""
-#: ../../mod/newmember.php:38
-msgid ""
-"Once you have made some friends, organize them into private conversation "
-"groups from the sidebar of your Contacts page and then you can interact with "
-"each group privately on your Network page."
+#: ../../mod/fsuggest.php:63
+msgid "Friend suggestion sent."
msgstr ""
-#: ../../mod/newmember.php:40
-msgid ""
-"Our <strong>help</strong> pages may be consulted for detail on other program "
-"features and resources."
+#: ../../mod/fsuggest.php:97
+msgid "Suggest Friends"
msgstr ""
-#: ../../mod/follow.php:20 ../../mod/dfrn_request.php:370
-msgid "Disallowed profile URL."
+#: ../../mod/fsuggest.php:99
+#, php-format
+msgid "Suggest a friend for %s"
msgstr ""
-#: ../../mod/follow.php:27
-msgid "Connect URL missing."
+#: ../../mod/events.php:61
+msgid "Event description and start time are required."
msgstr ""
-#: ../../mod/follow.php:47
-msgid ""
-"This site is not configured to allow communications with other networks."
+#: ../../mod/events.php:117 ../../include/nav.php:50 ../../boot.php:1345
+msgid "Events"
msgstr ""
-#: ../../mod/follow.php:48 ../../mod/follow.php:58
-msgid "No compatible communication protocols or feeds were discovered."
+#: ../../mod/events.php:207
+msgid "Create New Event"
msgstr ""
-#: ../../mod/follow.php:56
-msgid "The profile address specified does not provide adequate information."
+#: ../../mod/events.php:210
+msgid "Previous"
msgstr ""
-#: ../../mod/follow.php:60
-msgid "An author or name was not found."
+#: ../../mod/events.php:213 ../../mod/install.php:210
+msgid "Next"
msgstr ""
-#: ../../mod/follow.php:62
-msgid "No browser URL could be matched to this address."
+#: ../../mod/events.php:220
+msgid "l, F j"
msgstr ""
-#: ../../mod/follow.php:69
-msgid ""
-"The profile address specified belongs to a network which has been disabled "
-"on this site."
+#: ../../mod/events.php:235
+msgid "Edit event"
msgstr ""
-#: ../../mod/follow.php:74
-msgid ""
-"Limited profile. This person will be unable to receive direct/personal "
-"notifications from you."
+#: ../../mod/events.php:237 ../../include/text.php:883
+msgid "link to source"
msgstr ""
-#: ../../mod/follow.php:144
-msgid "Unable to retrieve contact information."
+#: ../../mod/events.php:305
+msgid "hour:minute"
msgstr ""
-#: ../../mod/follow.php:190
-msgid "following"
+#: ../../mod/events.php:314
+msgid "Event details"
msgstr ""
-#: ../../mod/dirfind.php:23
-msgid "People Search"
+#: ../../mod/events.php:315
+#, php-format
+msgid "Format is %s %s. Starting date and Description are required."
msgstr ""
-#: ../../mod/dirfind.php:57 ../../mod/match.php:65
-msgid "No matches"
+#: ../../mod/events.php:316
+msgid "Event Starts:"
msgstr ""
-#: ../../mod/contacts.php:62 ../../mod/contacts.php:135
-msgid "Could not access contact record."
+#: ../../mod/events.php:319
+msgid "Finish date/time is not known or not relevant"
msgstr ""
-#: ../../mod/contacts.php:76
-msgid "Could not locate selected profile."
+#: ../../mod/events.php:321
+msgid "Event Finishes:"
msgstr ""
-#: ../../mod/contacts.php:99
-msgid "Contact updated."
+#: ../../mod/events.php:324
+msgid "Adjust for viewer timezone"
msgstr ""
-#: ../../mod/contacts.php:101 ../../mod/dfrn_request.php:439
-msgid "Failed to update contact record."
+#: ../../mod/events.php:326
+msgid "Description:"
msgstr ""
-#: ../../mod/contacts.php:157
-msgid "Contact has been blocked"
+#: ../../mod/events.php:328 ../../include/event.php:37
+#: ../../include/bb2diaspora.php:271 ../../boot.php:976
+msgid "Location:"
msgstr ""
-#: ../../mod/contacts.php:157
-msgid "Contact has been unblocked"
+#: ../../mod/events.php:330
+msgid "Share this event"
msgstr ""
-#: ../../mod/contacts.php:171
-msgid "Contact has been ignored"
+#: ../../mod/tagrm.php:11 ../../mod/tagrm.php:94
+#: ../../mod/dfrn_request.php:685 ../../mod/settings.php:454
+#: ../../mod/settings.php:480 ../../addon/js_upload/js_upload.php:45
+msgid "Cancel"
msgstr ""
-#: ../../mod/contacts.php:171
-msgid "Contact has been unignored"
+#: ../../mod/tagrm.php:41
+msgid "Tag removed"
msgstr ""
-#: ../../mod/contacts.php:192
-msgid "stopped following"
+#: ../../mod/tagrm.php:79
+msgid "Remove Item Tag"
msgstr ""
-#: ../../mod/contacts.php:213
-msgid "Contact has been removed."
+#: ../../mod/tagrm.php:81
+msgid "Select a tag to remove: "
msgstr ""
-#: ../../mod/contacts.php:234
-#, php-format
-msgid "You are mutual friends with %s"
+#: ../../mod/tagrm.php:93 ../../mod/delegate.php:130
+msgid "Remove"
msgstr ""
-#: ../../mod/contacts.php:238
+#: ../../mod/dfrn_poll.php:91 ../../mod/dfrn_poll.php:517
#, php-format
-msgid "You are sharing with %s"
+msgid "%s welcomes %s"
msgstr ""
-#: ../../mod/contacts.php:243
-#, php-format
-msgid "%s is sharing with you"
+#: ../../mod/api.php:76 ../../mod/api.php:102
+msgid "Authorize application connection"
msgstr ""
-#: ../../mod/contacts.php:260
-msgid "Private communications are not available for this contact."
+#: ../../mod/api.php:77
+msgid "Return to your app and insert this Securty Code:"
msgstr ""
-#: ../../mod/contacts.php:263
-msgid "Never"
+#: ../../mod/api.php:89
+msgid "Please login to continue."
msgstr ""
-#: ../../mod/contacts.php:267
-msgid "(Update was successful)"
+#: ../../mod/api.php:104
+msgid ""
+"Do you want to authorize this application to access your posts and contacts, "
+"and/or create new posts for you?"
msgstr ""
-#: ../../mod/contacts.php:267
-msgid "(Update was not successful)"
+#: ../../mod/api.php:105 ../../mod/dfrn_request.php:675
+#: ../../mod/settings.php:681 ../../mod/settings.php:687
+#: ../../mod/settings.php:695 ../../mod/settings.php:699
+#: ../../mod/settings.php:704 ../../mod/settings.php:710
+#: ../../mod/settings.php:716 ../../mod/settings.php:763
+#: ../../mod/settings.php:764 ../../mod/settings.php:765
+#: ../../mod/settings.php:766 ../../mod/register.php:524
+#: ../../mod/profiles.php:357
+msgid "Yes"
msgstr ""
-#: ../../mod/contacts.php:269
-msgid "Suggest friends"
+#: ../../mod/api.php:106 ../../mod/dfrn_request.php:676
+#: ../../mod/settings.php:681 ../../mod/settings.php:687
+#: ../../mod/settings.php:695 ../../mod/settings.php:699
+#: ../../mod/settings.php:704 ../../mod/settings.php:710
+#: ../../mod/settings.php:716 ../../mod/settings.php:763
+#: ../../mod/settings.php:764 ../../mod/settings.php:765
+#: ../../mod/settings.php:766 ../../mod/register.php:525
+#: ../../mod/profiles.php:358
+msgid "No"
msgstr ""
-#: ../../mod/contacts.php:273
-#, php-format
-msgid "Network type: %s"
+#: ../../mod/photos.php:42
+msgid "Photo Albums"
msgstr ""
-#: ../../mod/contacts.php:276
-#, php-format
-msgid "%d contact in common"
-msgid_plural "%d contacts in common"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../mod/contacts.php:281
-msgid "View all contacts"
+#: ../../mod/photos.php:50 ../../mod/photos.php:150 ../../mod/photos.php:879
+#: ../../mod/photos.php:950 ../../mod/photos.php:965 ../../mod/photos.php:1371
+#: ../../mod/photos.php:1383 ../../addon/communityhome/communityhome.php:110
+msgid "Contact Photos"
msgstr ""
-#: ../../mod/contacts.php:286 ../../mod/contacts.php:333
-#: ../../mod/admin.php:470
-msgid "Unblock"
+#: ../../mod/photos.php:57 ../../mod/photos.php:975 ../../mod/photos.php:1413
+msgid "Upload New Photos"
msgstr ""
-#: ../../mod/contacts.php:286 ../../mod/contacts.php:333
-#: ../../mod/admin.php:469
-msgid "Block"
+#: ../../mod/photos.php:68 ../../mod/settings.php:11
+msgid "everybody"
msgstr ""
-#: ../../mod/contacts.php:291 ../../mod/contacts.php:334
-msgid "Unignore"
+#: ../../mod/photos.php:139
+msgid "Contact information unavailable"
msgstr ""
-#: ../../mod/contacts.php:291 ../../mod/contacts.php:334
-#: ../../mod/notifications.php:47 ../../mod/notifications.php:149
-#: ../../mod/notifications.php:194
-msgid "Ignore"
+#: ../../mod/photos.php:150 ../../mod/photos.php:597 ../../mod/photos.php:950
+#: ../../mod/photos.php:965 ../../mod/register.php:327
+#: ../../mod/register.php:334 ../../mod/register.php:341
+#: ../../mod/profile_photo.php:58 ../../mod/profile_photo.php:65
+#: ../../mod/profile_photo.php:72 ../../mod/profile_photo.php:170
+#: ../../mod/profile_photo.php:246 ../../mod/profile_photo.php:255
+#: ../../addon/communityhome/communityhome.php:111
+msgid "Profile Photos"
msgstr ""
-#: ../../mod/contacts.php:296
-msgid "Repair"
+#: ../../mod/photos.php:160
+msgid "Album not found."
msgstr ""
-#: ../../mod/contacts.php:306
-msgid "Contact Editor"
+#: ../../mod/photos.php:178 ../../mod/photos.php:959
+msgid "Delete Album"
msgstr ""
-#: ../../mod/contacts.php:308 ../../mod/settings.php:447
-#: ../../mod/settings.php:586 ../../mod/settings.php:767
-#: ../../mod/crepair.php:162 ../../mod/manage.php:106
-#: ../../mod/profiles.php:375 ../../mod/localtime.php:45
-#: ../../mod/invite.php:106 ../../mod/fsuggest.php:107
-#: ../../mod/install.php:250 ../../mod/install.php:288 ../../mod/admin.php:296
-#: ../../mod/admin.php:461 ../../mod/admin.php:587 ../../mod/admin.php:652
-#: ../../mod/photos.php:888 ../../mod/photos.php:946 ../../mod/photos.php:1165
-#: ../../mod/photos.php:1205 ../../mod/photos.php:1245
-#: ../../mod/photos.php:1276 ../../mod/group.php:84 ../../mod/group.php:167
-#: ../../mod/events.php:333 ../../include/conversation.php:488
-#: ../../addon/facebook/facebook.php:410 ../../addon/wppost/wppost.php:101
-#: ../../addon/uhremotestorage/uhremotestorage.php:58
-#: ../../addon/tumblr/tumblr.php:89 ../../addon/oembed/oembed.php:41
-#: ../../addon/posterous/posterous.php:89
-#: ../../addon/statusnet/statusnet.php:282
-#: ../../addon/statusnet/statusnet.php:296
-#: ../../addon/statusnet/statusnet.php:322
-#: ../../addon/statusnet/statusnet.php:329
-#: ../../addon/statusnet/statusnet.php:351
-#: ../../addon/statusnet/statusnet.php:486 ../../addon/twitter/twitter.php:179
-#: ../../addon/twitter/twitter.php:202 ../../addon/twitter/twitter.php:299
-#: ../../addon/impressum/impressum.php:69 ../../addon/piwik/piwik.php:81
-#: ../../addon/pageheader/pageheader.php:52
-#: ../../addon/randplace/randplace.php:178 ../../addon/blockem/blockem.php:53
-#: ../../addon/nsfw/nsfw.php:53
-msgid "Submit"
+#: ../../mod/photos.php:241 ../../mod/photos.php:1183
+msgid "Delete Photo"
msgstr ""
-#: ../../mod/contacts.php:309
-msgid "Profile Visibility"
+#: ../../mod/photos.php:528
+msgid "was tagged in a"
msgstr ""
-#: ../../mod/contacts.php:310
-#, php-format
-msgid ""
-"Please choose the profile you would like to display to %s when viewing your "
-"profile securely."
+#: ../../mod/photos.php:528 ../../mod/like.php:127 ../../mod/tagger.php:70
+#: ../../addon/communityhome/communityhome.php:163
+#: ../../include/diaspora.php:1587 ../../include/conversation.php:31
+#: ../../include/conversation.php:104
+msgid "photo"
msgstr ""
-#: ../../mod/contacts.php:311
-msgid "Contact Information / Notes"
+#: ../../mod/photos.php:528
+msgid "by"
msgstr ""
-#: ../../mod/contacts.php:312
-msgid "Edit contact notes"
+#: ../../mod/photos.php:631 ../../addon/js_upload/js_upload.php:312
+msgid "Image exceeds size limit of "
msgstr ""
-#: ../../mod/contacts.php:317 ../../mod/contacts.php:433
-#: ../../mod/viewcontacts.php:61
-#, php-format
-msgid "Visit %s's profile [%s]"
+#: ../../mod/photos.php:639
+msgid "Image file is empty."
msgstr ""
-#: ../../mod/contacts.php:318
-msgid "Block/Unblock contact"
+#: ../../mod/photos.php:653 ../../mod/profile_photo.php:122
+#: ../../mod/wall_upload.php:65
+msgid "Unable to process image."
msgstr ""
-#: ../../mod/contacts.php:319
-msgid "Ignore contact"
+#: ../../mod/photos.php:673 ../../mod/profile_photo.php:251
+#: ../../mod/wall_upload.php:84
+msgid "Image upload failed."
msgstr ""
-#: ../../mod/contacts.php:320
-msgid "Repair URL settings"
+#: ../../mod/photos.php:759 ../../mod/community.php:16
+#: ../../mod/dfrn_request.php:624 ../../mod/viewcontacts.php:16
+#: ../../mod/display.php:7 ../../mod/search.php:71 ../../mod/directory.php:31
+msgid "Public access denied."
msgstr ""
-#: ../../mod/contacts.php:321
-msgid "View conversations"
+#: ../../mod/photos.php:769
+msgid "No photos selected"
msgstr ""
-#: ../../mod/contacts.php:323
-msgid "Delete contact"
+#: ../../mod/photos.php:846
+msgid "Access to this item is restricted."
msgstr ""
-#: ../../mod/contacts.php:327
-msgid "Last update:"
+#: ../../mod/photos.php:907
+msgid "Upload Photos"
msgstr ""
-#: ../../mod/contacts.php:328
-msgid "Update public posts"
+#: ../../mod/photos.php:910 ../../mod/photos.php:954
+msgid "New album name: "
msgstr ""
-#: ../../mod/contacts.php:330 ../../mod/admin.php:701
-msgid "Update now"
+#: ../../mod/photos.php:911
+msgid "or existing album name: "
msgstr ""
-#: ../../mod/contacts.php:337
-msgid "Currently blocked"
+#: ../../mod/photos.php:912
+msgid "Do not show a status post for this upload"
msgstr ""
-#: ../../mod/contacts.php:338
-msgid "Currently ignored"
+#: ../../mod/photos.php:914 ../../mod/photos.php:1178
+msgid "Permissions"
msgstr ""
-#: ../../mod/contacts.php:339 ../../mod/notifications.php:144
-#: ../../mod/notifications.php:189
-msgid "Hide this contact from others"
+#: ../../mod/photos.php:969
+msgid "Edit Album"
msgstr ""
-#: ../../mod/contacts.php:339
-msgid ""
-"Replies/likes to your public posts <strong>may</strong> still be visible"
+#: ../../mod/photos.php:984 ../../mod/photos.php:1396
+msgid "View Photo"
msgstr ""
-#: ../../mod/contacts.php:367 ../../include/nav.php:130
-msgid "Contacts"
+#: ../../mod/photos.php:1019
+msgid "Permission denied. Access to this item may be restricted."
msgstr ""
-#: ../../mod/contacts.php:369
-msgid "Show Blocked Connections"
+#: ../../mod/photos.php:1021
+msgid "Photo not available"
msgstr ""
-#: ../../mod/contacts.php:369
-msgid "Hide Blocked Connections"
+#: ../../mod/photos.php:1071
+msgid "View photo"
msgstr ""
-#: ../../mod/contacts.php:371
-msgid "Search your contacts"
+#: ../../mod/photos.php:1071
+msgid "Edit photo"
msgstr ""
-#: ../../mod/contacts.php:409
-msgid "Mutual Friendship"
+#: ../../mod/photos.php:1072
+msgid "Use as profile photo"
msgstr ""
-#: ../../mod/contacts.php:413
-msgid "is a fan of yours"
+#: ../../mod/photos.php:1078 ../../include/conversation.php:450
+msgid "Private Message"
msgstr ""
-#: ../../mod/contacts.php:417
-msgid "you are a fan of"
+#: ../../mod/photos.php:1089
+msgid "View Full Size"
msgstr ""
-#: ../../mod/contacts.php:434 ../../include/Contact.php:129
-#: ../../include/conversation.php:727
-msgid "Edit contact"
+#: ../../mod/photos.php:1157
+msgid "Tags: "
msgstr ""
-#: ../../mod/settings.php:11 ../../mod/photos.php:64
-msgid "everybody"
+#: ../../mod/photos.php:1160
+msgid "[Remove any tag]"
msgstr ""
-#: ../../mod/settings.php:69
-msgid "Missing some important data!"
+#: ../../mod/photos.php:1171
+msgid "New album name"
msgstr ""
-#: ../../mod/settings.php:72 ../../mod/settings.php:473 ../../mod/admin.php:62
-msgid "Update"
+#: ../../mod/photos.php:1174
+msgid "Caption"
msgstr ""
-#: ../../mod/settings.php:167
-msgid "Failed to connect with email account using the settings provided."
+#: ../../mod/photos.php:1176
+msgid "Add a Tag"
msgstr ""
-#: ../../mod/settings.php:172
-msgid "Email settings updated."
+#: ../../mod/photos.php:1180
+msgid "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
msgstr ""
-#: ../../mod/settings.php:190
-msgid "Passwords do not match. Password unchanged."
+#: ../../mod/photos.php:1200 ../../include/conversation.php:497
+msgid "I like this (toggle)"
msgstr ""
-#: ../../mod/settings.php:195
-msgid "Empty passwords are not allowed. Password unchanged."
+#: ../../mod/photos.php:1201 ../../include/conversation.php:498
+msgid "I don't like this (toggle)"
msgstr ""
-#: ../../mod/settings.php:206
-msgid "Password changed."
+#: ../../mod/photos.php:1202 ../../include/conversation.php:889
+msgid "Share"
msgstr ""
-#: ../../mod/settings.php:208
-msgid "Password update failed. Please try again."
+#: ../../mod/photos.php:1203 ../../mod/editpost.php:100
+#: ../../mod/message.php:155 ../../mod/message.php:296
+#: ../../include/conversation.php:321 ../../include/conversation.php:652
+#: ../../include/conversation.php:906
+msgid "Please wait"
msgstr ""
-#: ../../mod/settings.php:272
-msgid " Please use a shorter name."
+#: ../../mod/photos.php:1219 ../../mod/photos.php:1259
+#: ../../mod/photos.php:1290 ../../include/conversation.php:512
+msgid "This is you"
msgstr ""
-#: ../../mod/settings.php:274
-msgid " Name too short."
+#: ../../mod/photos.php:1221 ../../mod/photos.php:1261
+#: ../../mod/photos.php:1292 ../../include/conversation.php:514
+#: ../../boot.php:443
+msgid "Comment"
msgstr ""
-#: ../../mod/settings.php:280
-msgid " Not valid email."
+#: ../../mod/photos.php:1223 ../../mod/editpost.php:119
+#: ../../include/conversation.php:516 ../../include/conversation.php:924
+msgid "Preview"
msgstr ""
-#: ../../mod/settings.php:282
-msgid " Cannot change to that email."
+#: ../../mod/photos.php:1320 ../../mod/settings.php:513
+#: ../../mod/group.php:154 ../../mod/admin.php:468
+#: ../../include/conversation.php:280 ../../include/conversation.php:536
+msgid "Delete"
msgstr ""
-#: ../../mod/settings.php:350 ../../addon/facebook/facebook.php:320
-#: ../../addon/twitter/twitter.php:294 ../../addon/impressum/impressum.php:64
-#: ../../addon/piwik/piwik.php:94
-msgid "Settings updated."
+#: ../../mod/photos.php:1402
+msgid "View Album"
msgstr ""
-#: ../../mod/settings.php:409 ../../include/nav.php:128
-msgid "Account settings"
+#: ../../mod/photos.php:1411
+msgid "Recent Photos"
msgstr ""
-#: ../../mod/settings.php:414
-msgid "Connector settings"
+#: ../../mod/community.php:21
+msgid "Not available."
msgstr ""
-#: ../../mod/settings.php:419
-msgid "Plugin settings"
+#: ../../mod/community.php:30 ../../include/nav.php:97
+msgid "Community"
msgstr ""
-#: ../../mod/settings.php:424
-msgid "Connections"
+#: ../../mod/community.php:60 ../../mod/search.php:118
+msgid "No results."
msgstr ""
-#: ../../mod/settings.php:429
-msgid "Export personal data"
+#: ../../mod/friendica.php:43
+msgid "This is Friendica, version"
msgstr ""
-#: ../../mod/settings.php:446 ../../mod/settings.php:472
-#: ../../mod/settings.php:505
-msgid "Add application"
+#: ../../mod/friendica.php:44
+msgid "running at web location"
msgstr ""
-#: ../../mod/settings.php:448 ../../mod/settings.php:474
-#: ../../mod/dfrn_request.php:685 ../../mod/tagrm.php:11
-#: ../../mod/tagrm.php:94 ../../addon/js_upload/js_upload.php:45
-msgid "Cancel"
+#: ../../mod/friendica.php:46
+msgid ""
+"Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn "
+"more about the Friendica project."
msgstr ""
-#: ../../mod/settings.php:449 ../../mod/settings.php:475
-#: ../../mod/crepair.php:144 ../../mod/admin.php:464 ../../mod/admin.php:473
-msgid "Name"
+#: ../../mod/friendica.php:48
+msgid "Bug reports and issues: please visit"
msgstr ""
-#: ../../mod/settings.php:450 ../../mod/settings.php:476
-#: ../../addon/statusnet/statusnet.php:480
-msgid "Consumer Key"
+#: ../../mod/friendica.php:49
+msgid ""
+"Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - "
+"dot com"
msgstr ""
-#: ../../mod/settings.php:451 ../../mod/settings.php:477
-#: ../../addon/statusnet/statusnet.php:479
-msgid "Consumer Secret"
+#: ../../mod/friendica.php:54
+msgid "Installed plugins/addons/apps"
msgstr ""
-#: ../../mod/settings.php:452 ../../mod/settings.php:478
-msgid "Redirect"
+#: ../../mod/friendica.php:62
+msgid "No installed plugins/addons/apps"
msgstr ""
-#: ../../mod/settings.php:453 ../../mod/settings.php:479
-msgid "Icon url"
+#: ../../mod/editpost.php:17 ../../mod/editpost.php:27
+msgid "Item not found"
msgstr ""
-#: ../../mod/settings.php:464
-msgid "You can't edit this application."
+#: ../../mod/editpost.php:32
+msgid "Edit post"
msgstr ""
-#: ../../mod/settings.php:504
-msgid "Connected Apps"
+#: ../../mod/editpost.php:76 ../../include/conversation.php:875
+msgid "Post to Email"
msgstr ""
-#: ../../mod/settings.php:506 ../../mod/editpost.php:90
-#: ../../include/conversation.php:496
+#: ../../mod/editpost.php:91 ../../mod/settings.php:512
+#: ../../include/conversation.php:523
msgid "Edit"
msgstr ""
-#: ../../mod/settings.php:507 ../../mod/admin.php:468
-#: ../../mod/photos.php:1303 ../../mod/group.php:154
-#: ../../include/conversation.php:253 ../../include/conversation.php:509
-msgid "Delete"
-msgstr ""
-
-#: ../../mod/settings.php:508
-msgid "Client key starts with"
-msgstr ""
-
-#: ../../mod/settings.php:509
-msgid "No name"
-msgstr ""
-
-#: ../../mod/settings.php:510
-msgid "Remove authorization"
-msgstr ""
-
-#: ../../mod/settings.php:522
-msgid "No Plugin settings configured"
+#: ../../mod/editpost.php:92 ../../mod/message.php:153
+#: ../../mod/message.php:294 ../../include/conversation.php:890
+msgid "Upload photo"
msgstr ""
-#: ../../mod/settings.php:529 ../../addon/widgets/widgets.php:122
-msgid "Plugin Settings"
+#: ../../mod/editpost.php:93 ../../include/conversation.php:892
+msgid "Attach file"
msgstr ""
-#: ../../mod/settings.php:542 ../../mod/settings.php:543
-#, php-format
-msgid "Built-in support for %s connectivity is %s"
+#: ../../mod/editpost.php:94 ../../mod/message.php:154
+#: ../../mod/message.php:295 ../../include/conversation.php:894
+msgid "Insert web link"
msgstr ""
-#: ../../mod/settings.php:542 ../../mod/dfrn_request.php:681
-#: ../../include/contact_selectors.php:80
-msgid "Diaspora"
+#: ../../mod/editpost.php:95
+msgid "Insert YouTube video"
msgstr ""
-#: ../../mod/settings.php:542 ../../mod/settings.php:543
-msgid "enabled"
+#: ../../mod/editpost.php:96
+msgid "Insert Vorbis [.ogg] video"
msgstr ""
-#: ../../mod/settings.php:542 ../../mod/settings.php:543
-msgid "disabled"
+#: ../../mod/editpost.php:97
+msgid "Insert Vorbis [.ogg] audio"
msgstr ""
-#: ../../mod/settings.php:543
-msgid "StatusNet"
+#: ../../mod/editpost.php:98 ../../include/conversation.php:900
+msgid "Set your location"
msgstr ""
-#: ../../mod/settings.php:569
-msgid "Connector Settings"
+#: ../../mod/editpost.php:99 ../../include/conversation.php:902
+msgid "Clear browser location"
msgstr ""
-#: ../../mod/settings.php:575
-msgid "Email/Mailbox Setup"
+#: ../../mod/editpost.php:101 ../../include/conversation.php:907
+msgid "Permission settings"
msgstr ""
-#: ../../mod/settings.php:576
-msgid ""
-"If you wish to communicate with email contacts using this service "
-"(optional), please specify how to connect to your mailbox."
+#: ../../mod/editpost.php:109 ../../include/conversation.php:916
+msgid "CC: email addresses"
msgstr ""
-#: ../../mod/settings.php:577
-msgid "Last successful email check:"
+#: ../../mod/editpost.php:110 ../../include/conversation.php:917
+msgid "Public post"
msgstr ""
-#: ../../mod/settings.php:578
-msgid "Email access is disabled on this site."
+#: ../../mod/editpost.php:113 ../../include/conversation.php:905
+msgid "Set title"
msgstr ""
-#: ../../mod/settings.php:579
-msgid "IMAP server name:"
+#: ../../mod/editpost.php:114 ../../include/conversation.php:919
+msgid "Example: bob@example.com, mary@example.com"
msgstr ""
-#: ../../mod/settings.php:580
-msgid "IMAP port:"
+#: ../../mod/dfrn_request.php:92
+msgid "This introduction has already been accepted."
msgstr ""
-#: ../../mod/settings.php:581
-msgid "Security:"
+#: ../../mod/dfrn_request.php:116 ../../mod/dfrn_request.php:381
+msgid "Profile location is not valid or does not contain profile information."
msgstr ""
-#: ../../mod/settings.php:581
-msgid "None"
+#: ../../mod/dfrn_request.php:121 ../../mod/dfrn_request.php:386
+msgid "Warning: profile location has no identifiable owner name."
msgstr ""
-#: ../../mod/settings.php:582
-msgid "Email login name:"
+#: ../../mod/dfrn_request.php:123 ../../mod/dfrn_request.php:388
+msgid "Warning: profile location has no profile photo."
msgstr ""
-#: ../../mod/settings.php:583
-msgid "Email password:"
-msgstr ""
+#: ../../mod/dfrn_request.php:126 ../../mod/dfrn_request.php:391
+#, php-format
+msgid "%d required parameter was not found at the given location"
+msgid_plural "%d required parameters were not found at the given location"
+msgstr[0] ""
+msgstr[1] ""
-#: ../../mod/settings.php:584
-msgid "Reply-to address:"
+#: ../../mod/dfrn_request.php:167
+msgid "Introduction complete."
msgstr ""
-#: ../../mod/settings.php:585
-msgid "Send public posts to all email contacts:"
+#: ../../mod/dfrn_request.php:191
+msgid "Unrecoverable protocol error."
msgstr ""
-#: ../../mod/settings.php:642 ../../mod/admin.php:126 ../../mod/admin.php:443
-msgid "Normal Account"
+#: ../../mod/dfrn_request.php:219
+msgid "Profile unavailable."
msgstr ""
-#: ../../mod/settings.php:643
-msgid "This account is a normal personal profile"
+#: ../../mod/dfrn_request.php:244
+#, php-format
+msgid "%s has received too many connection requests today."
msgstr ""
-#: ../../mod/settings.php:646 ../../mod/admin.php:127 ../../mod/admin.php:444
-msgid "Soapbox Account"
+#: ../../mod/dfrn_request.php:245
+msgid "Spam protection measures have been invoked."
msgstr ""
-#: ../../mod/settings.php:647
-msgid "Automatically approve all connection/friend requests as read-only fans"
+#: ../../mod/dfrn_request.php:246
+msgid "Friends are advised to please try again in 24 hours."
msgstr ""
-#: ../../mod/settings.php:650 ../../mod/admin.php:128 ../../mod/admin.php:445
-msgid "Community/Celebrity Account"
+#: ../../mod/dfrn_request.php:306
+msgid "Invalid locator"
msgstr ""
-#: ../../mod/settings.php:651
-msgid "Automatically approve all connection/friend requests as read-write fans"
+#: ../../mod/dfrn_request.php:326
+msgid "Unable to resolve your name at the provided location."
msgstr ""
-#: ../../mod/settings.php:654 ../../mod/admin.php:129 ../../mod/admin.php:446
-msgid "Automatic Friend Account"
+#: ../../mod/dfrn_request.php:339
+msgid "You have already introduced yourself here."
msgstr ""
-#: ../../mod/settings.php:655
-msgid "Automatically approve all connection/friend requests as friends"
+#: ../../mod/dfrn_request.php:343
+#, php-format
+msgid "Apparently you are already friends with %s."
msgstr ""
-#: ../../mod/settings.php:665
-msgid "OpenID:"
+#: ../../mod/dfrn_request.php:364
+msgid "Invalid profile URL."
msgstr ""
-#: ../../mod/settings.php:665
-msgid "(Optional) Allow this OpenID to login to this account."
+#: ../../mod/dfrn_request.php:370 ../../mod/follow.php:20
+msgid "Disallowed profile URL."
msgstr ""
-#: ../../mod/settings.php:675
-msgid "Publish your default profile in your local site directory?"
+#: ../../mod/dfrn_request.php:439 ../../mod/contacts.php:102
+msgid "Failed to update contact record."
msgstr ""
-#: ../../mod/settings.php:675 ../../mod/settings.php:681
-#: ../../mod/settings.php:689 ../../mod/settings.php:693
-#: ../../mod/settings.php:698 ../../mod/settings.php:704
-#: ../../mod/settings.php:710 ../../mod/settings.php:757
-#: ../../mod/settings.php:758 ../../mod/settings.php:759
-#: ../../mod/settings.php:760 ../../mod/dfrn_request.php:676
-#: ../../mod/profiles.php:358 ../../mod/register.php:525 ../../mod/api.php:106
-msgid "No"
+#: ../../mod/dfrn_request.php:460
+msgid "Your introduction has been sent."
msgstr ""
-#: ../../mod/settings.php:675 ../../mod/settings.php:681
-#: ../../mod/settings.php:689 ../../mod/settings.php:693
-#: ../../mod/settings.php:698 ../../mod/settings.php:704
-#: ../../mod/settings.php:710 ../../mod/settings.php:757
-#: ../../mod/settings.php:758 ../../mod/settings.php:759
-#: ../../mod/settings.php:760 ../../mod/dfrn_request.php:675
-#: ../../mod/profiles.php:357 ../../mod/register.php:524 ../../mod/api.php:105
-msgid "Yes"
+#: ../../mod/dfrn_request.php:513
+msgid "Please login to confirm introduction."
msgstr ""
-#: ../../mod/settings.php:681
-msgid "Publish your default profile in the global social directory?"
+#: ../../mod/dfrn_request.php:527
+msgid ""
+"Incorrect identity currently logged in. Please login to <strong>this</"
+"strong> profile."
msgstr ""
-#: ../../mod/settings.php:689
-msgid "Hide your contact/friend list from viewers of your default profile?"
+#: ../../mod/dfrn_request.php:539
+#, php-format
+msgid "Welcome home %s."
msgstr ""
-#: ../../mod/settings.php:693
-msgid "Hide your profile details from unknown viewers?"
+#: ../../mod/dfrn_request.php:540
+#, php-format
+msgid "Please confirm your introduction/connection request to %s."
msgstr ""
-#: ../../mod/settings.php:698
-msgid "Allow friends to post to your profile page?"
+#: ../../mod/dfrn_request.php:541
+msgid "Confirm"
msgstr ""
-#: ../../mod/settings.php:704
-msgid "Allow friends to tag your posts?"
+#: ../../mod/dfrn_request.php:581 ../../include/items.php:2443
+msgid "[Name Withheld]"
msgstr ""
-#: ../../mod/settings.php:710
-msgid "Allow us to suggest you as a potential friend to new members?"
+#: ../../mod/dfrn_request.php:665
+#, php-format
+msgid ""
+"Diaspora members: Please do not use this form. Instead, enter \"%s\" into "
+"your Diaspora search bar."
msgstr ""
-#: ../../mod/settings.php:719
-msgid "Profile is <strong>not published</strong>."
+#: ../../mod/dfrn_request.php:668
+msgid ""
+"Please enter your 'Identity Address' from one of the following supported "
+"social networks:"
msgstr ""
-#: ../../mod/settings.php:738 ../../mod/profile_photo.php:206
-msgid "or"
+#: ../../mod/dfrn_request.php:671
+msgid "Friend/Connection Request"
msgstr ""
-#: ../../mod/settings.php:743
-msgid "Your Identity Address is"
+#: ../../mod/dfrn_request.php:672
+msgid ""
+"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
+"testuser@identi.ca"
msgstr ""
-#: ../../mod/settings.php:754
-msgid "Automatically expire posts after days:"
+#: ../../mod/dfrn_request.php:673
+msgid "Please answer the following:"
msgstr ""
-#: ../../mod/settings.php:754
-msgid "If empty, posts will not expire. Expired posts will be deleted"
+#: ../../mod/dfrn_request.php:674
+#, php-format
+msgid "Does %s know you?"
msgstr ""
-#: ../../mod/settings.php:755
-msgid "Advanced expiration settings"
+#: ../../mod/dfrn_request.php:677
+msgid "Add a personal note:"
msgstr ""
-#: ../../mod/settings.php:756
-msgid "Advanced Expiration"
+#: ../../mod/dfrn_request.php:679 ../../include/contact_selectors.php:76
+msgid "Friendica"
msgstr ""
-#: ../../mod/settings.php:757
-msgid "Expire posts:"
+#: ../../mod/dfrn_request.php:680
+msgid "StatusNet/Federated Social Web"
msgstr ""
-#: ../../mod/settings.php:758
-msgid "Expire personal notes:"
+#: ../../mod/dfrn_request.php:681 ../../mod/settings.php:548
+#: ../../include/contact_selectors.php:80
+msgid "Diaspora"
msgstr ""
-#: ../../mod/settings.php:759
-msgid "Expire starred posts:"
+#: ../../mod/dfrn_request.php:682
+msgid "- please share from your own site as noted above"
msgstr ""
-#: ../../mod/settings.php:760
-msgid "Expire photos:"
+#: ../../mod/dfrn_request.php:683
+msgid "Your Identity Address:"
msgstr ""
-#: ../../mod/settings.php:765
-msgid "Account Settings"
+#: ../../mod/dfrn_request.php:684
+msgid "Submit Request"
msgstr ""
-#: ../../mod/settings.php:773
-msgid "Password Settings"
+#: ../../mod/install.php:111
+msgid "Friendica Social Communications Server - Setup"
msgstr ""
-#: ../../mod/settings.php:774
-msgid "New Password:"
+#: ../../mod/install.php:117 ../../mod/install.php:157
+#: ../../mod/install.php:230
+msgid "Database connection"
msgstr ""
-#: ../../mod/settings.php:775
-msgid "Confirm:"
+#: ../../mod/install.php:124
+msgid "Could not connect to database."
msgstr ""
-#: ../../mod/settings.php:775
-msgid "Leave password fields blank unless changing"
+#: ../../mod/install.php:128
+msgid "Could not create table."
msgstr ""
-#: ../../mod/settings.php:779
-msgid "Basic Settings"
+#: ../../mod/install.php:133
+msgid "Your Friendica site database has been installed."
msgstr ""
-#: ../../mod/settings.php:780 ../../include/profile_advanced.php:15
-msgid "Full Name:"
+#: ../../mod/install.php:134
+msgid ""
+"IMPORTANT: You will need to [manually] setup a scheduled task for the poller."
msgstr ""
-#: ../../mod/settings.php:781
-msgid "Email Address:"
+#: ../../mod/install.php:135 ../../mod/install.php:151
+#: ../../mod/install.php:209
+msgid "Please see the file \"INSTALL.txt\"."
msgstr ""
-#: ../../mod/settings.php:782
-msgid "Your Timezone:"
+#: ../../mod/install.php:137
+msgid "Proceed to registration"
msgstr ""
-#: ../../mod/settings.php:783
-msgid "Default Post Location:"
+#: ../../mod/install.php:143
+msgid "Proceed with Installation"
msgstr ""
-#: ../../mod/settings.php:784
-msgid "Use Browser Location:"
+#: ../../mod/install.php:150
+msgid ""
+"You may need to import the file \"database.sql\" manually using phpmyadmin "
+"or mysql."
msgstr ""
-#: ../../mod/settings.php:785
-msgid "Display Theme:"
+#: ../../mod/install.php:158
+msgid "Database import failed."
msgstr ""
-#: ../../mod/settings.php:786
-msgid "Update browser every xx seconds"
+#: ../../mod/install.php:206
+msgid "System check"
msgstr ""
-#: ../../mod/settings.php:786
-msgid "Minimum of 10 seconds, no maximum"
+#: ../../mod/install.php:211
+msgid "Check again"
msgstr ""
-#: ../../mod/settings.php:788
-msgid "Security and Privacy Settings"
+#: ../../mod/install.php:231
+msgid ""
+"In order to install Friendica we need to know how to connect to your "
+"database."
msgstr ""
-#: ../../mod/settings.php:790
-msgid "Maximum Friend Requests/Day:"
+#: ../../mod/install.php:232
+msgid ""
+"Please contact your hosting provider or site administrator if you have "
+"questions about these settings."
msgstr ""
-#: ../../mod/settings.php:790
-msgid "(to prevent spam abuse)"
+#: ../../mod/install.php:233
+msgid ""
+"The database you specify below should already exist. If it does not, please "
+"create it before continuing."
msgstr ""
-#: ../../mod/settings.php:791
-msgid "Default Post Permissions"
+#: ../../mod/install.php:237
+msgid "Database Server Name"
msgstr ""
-#: ../../mod/settings.php:792
-msgid "(click to open/close)"
+#: ../../mod/install.php:238
+msgid "Database Login Name"
msgstr ""
-#: ../../mod/settings.php:807
-msgid "Notification Settings"
+#: ../../mod/install.php:239
+msgid "Database Login Password"
msgstr ""
-#: ../../mod/settings.php:808
-msgid "Send a notification email when:"
+#: ../../mod/install.php:240
+msgid "Database Name"
msgstr ""
-#: ../../mod/settings.php:809
-msgid "You receive an introduction"
+#: ../../mod/install.php:241 ../../mod/install.php:280
+msgid "Site administrator email address"
msgstr ""
-#: ../../mod/settings.php:810
-msgid "Your introductions are confirmed"
+#: ../../mod/install.php:241 ../../mod/install.php:280
+msgid ""
+"Your account email address must match this in order to use the web admin "
+"panel."
msgstr ""
-#: ../../mod/settings.php:811
-msgid "Someone writes on your profile wall"
+#: ../../mod/install.php:245 ../../mod/install.php:283
+msgid "Please select a default timezone for your website"
msgstr ""
-#: ../../mod/settings.php:812
-msgid "Someone writes a followup comment"
+#: ../../mod/install.php:270
+msgid "Site settings"
msgstr ""
-#: ../../mod/settings.php:813
-msgid "You receive a private message"
+#: ../../mod/install.php:323
+msgid "Could not find a command line version of PHP in the web server PATH."
msgstr ""
-#: ../../mod/settings.php:814
-msgid "You receive a friend suggestion"
+#: ../../mod/install.php:326
+msgid "PHP executable path"
msgstr ""
-#: ../../mod/settings.php:817
-msgid "Advanced Page Settings"
+#: ../../mod/install.php:326
+msgid "Enter full path to php executable"
msgstr ""
-#: ../../mod/crepair.php:100
-msgid "Contact settings applied."
+#: ../../mod/install.php:331
+msgid "Command line PHP"
msgstr ""
-#: ../../mod/crepair.php:102
-msgid "Contact update failed."
+#: ../../mod/install.php:340
+msgid ""
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
msgstr ""
-#: ../../mod/crepair.php:127 ../../mod/fsuggest.php:20
-#: ../../mod/fsuggest.php:92 ../../mod/dfrn_confirm.php:116
-msgid "Contact not found."
+#: ../../mod/install.php:341
+msgid "This is required for message delivery to work."
msgstr ""
-#: ../../mod/crepair.php:133
-msgid "Repair Contact Settings"
+#: ../../mod/install.php:343
+msgid "PHP \"register_argc_argv\""
msgstr ""
-#: ../../mod/crepair.php:135
+#: ../../mod/install.php:364
msgid ""
-"<strong>WARNING: This is highly advanced</strong> and if you enter incorrect "
-"information your communications with this contact may stop working."
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
msgstr ""
-#: ../../mod/crepair.php:136
+#: ../../mod/install.php:365
msgid ""
-"Please use your browser 'Back' button <strong>now</strong> if you are "
-"uncertain what to do on this page."
-msgstr ""
-
-#: ../../mod/crepair.php:145
-msgid "Account Nickname"
-msgstr ""
-
-#: ../../mod/crepair.php:146
-msgid "@Tagname - overrides Name/Nickname"
-msgstr ""
-
-#: ../../mod/crepair.php:147
-msgid "Account URL"
+"If running under Windows, please see \"http://www.php.net/manual/en/openssl."
+"installation.php\"."
msgstr ""
-#: ../../mod/crepair.php:148
-msgid "Friend Request URL"
+#: ../../mod/install.php:367
+msgid "Generate encryption keys"
msgstr ""
-#: ../../mod/crepair.php:149
-msgid "Friend Confirm URL"
+#: ../../mod/install.php:374
+msgid "libCurl PHP module"
msgstr ""
-#: ../../mod/crepair.php:150
-msgid "Notification Endpoint URL"
+#: ../../mod/install.php:375
+msgid "GD graphics PHP module"
msgstr ""
-#: ../../mod/crepair.php:151
-msgid "Poll/Feed URL"
+#: ../../mod/install.php:376
+msgid "OpenSSL PHP module"
msgstr ""
-#: ../../mod/crepair.php:152
-msgid "New photo from this URL"
+#: ../../mod/install.php:377
+msgid "mysqli PHP module"
msgstr ""
-#: ../../mod/dfrn_request.php:92
-msgid "This introduction has already been accepted."
+#: ../../mod/install.php:378
+msgid "mb_string PHP module"
msgstr ""
-#: ../../mod/dfrn_request.php:116 ../../mod/dfrn_request.php:381
-msgid "Profile location is not valid or does not contain profile information."
+#: ../../mod/install.php:383 ../../mod/install.php:385
+msgid "Apace mod_rewrite module"
msgstr ""
-#: ../../mod/dfrn_request.php:121 ../../mod/dfrn_request.php:386
-msgid "Warning: profile location has no identifiable owner name."
+#: ../../mod/install.php:383
+msgid ""
+"Error: Apache webserver mod-rewrite module is required but not installed."
msgstr ""
-#: ../../mod/dfrn_request.php:123 ../../mod/dfrn_request.php:388
-msgid "Warning: profile location has no profile photo."
+#: ../../mod/install.php:390
+msgid "Error: libCURL PHP module required but not installed."
msgstr ""
-#: ../../mod/dfrn_request.php:126 ../../mod/dfrn_request.php:391
-#, php-format
-msgid "%d required parameter was not found at the given location"
-msgid_plural "%d required parameters were not found at the given location"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../mod/dfrn_request.php:167
-msgid "Introduction complete."
+#: ../../mod/install.php:394
+msgid ""
+"Error: GD graphics PHP module with JPEG support required but not installed."
msgstr ""
-#: ../../mod/dfrn_request.php:191
-msgid "Unrecoverable protocol error."
+#: ../../mod/install.php:398
+msgid "Error: openssl PHP module required but not installed."
msgstr ""
-#: ../../mod/dfrn_request.php:219
-msgid "Profile unavailable."
+#: ../../mod/install.php:402
+msgid "Error: mysqli PHP module required but not installed."
msgstr ""
-#: ../../mod/dfrn_request.php:244
-#, php-format
-msgid "%s has received too many connection requests today."
+#: ../../mod/install.php:406
+msgid "Error: mb_string PHP module required but not installed."
msgstr ""
-#: ../../mod/dfrn_request.php:245
-msgid "Spam protection measures have been invoked."
+#: ../../mod/install.php:423
+msgid ""
+"The web installer needs to be able to create a file called \".htconfig.php\" "
+"in the top folder of your web server and it is unable to do so."
msgstr ""
-#: ../../mod/dfrn_request.php:246
-msgid "Friends are advised to please try again in 24 hours."
+#: ../../mod/install.php:424
+msgid ""
+"This is most often a permission setting, as the web server may not be able "
+"to write files in your folder - even if you can."
msgstr ""
-#: ../../mod/dfrn_request.php:306
-msgid "Invalid locator"
+#: ../../mod/install.php:425
+msgid ""
+"Please check with your site documentation or support people to see if this "
+"situation can be corrected."
msgstr ""
-#: ../../mod/dfrn_request.php:326
-msgid "Unable to resolve your name at the provided location."
+#: ../../mod/install.php:426
+msgid ""
+"If not, you may be required to perform a manual installation. Please see the "
+"file \"INSTALL.txt\" for instructions."
msgstr ""
-#: ../../mod/dfrn_request.php:339
-msgid "You have already introduced yourself here."
+#: ../../mod/install.php:429
+msgid ".htconfig.php is writable"
msgstr ""
-#: ../../mod/dfrn_request.php:343
-#, php-format
-msgid "Apparently you are already friends with %s."
+#: ../../mod/install.php:436
+msgid ""
+"The database configuration file \".htconfig.php\" could not be written. "
+"Please use the enclosed text to create a configuration file in your web "
+"server root."
msgstr ""
-#: ../../mod/dfrn_request.php:364
-msgid "Invalid profile URL."
+#: ../../mod/install.php:461
+msgid "Errors encountered creating database tables."
msgstr ""
-#: ../../mod/dfrn_request.php:460
-msgid "Your introduction has been sent."
+#: ../../mod/localtime.php:12 ../../include/event.php:11
+#: ../../include/bb2diaspora.php:249
+msgid "l F d, Y \\@ g:i A"
msgstr ""
-#: ../../mod/dfrn_request.php:513
-msgid "Please login to confirm introduction."
+#: ../../mod/localtime.php:24
+msgid "Time Conversion"
msgstr ""
-#: ../../mod/dfrn_request.php:527
+#: ../../mod/localtime.php:26
msgid ""
-"Incorrect identity currently logged in. Please login to <strong>this</"
-"strong> profile."
+"Friendika provides this service for sharing events with other networks and "
+"friends in unknown timezones."
msgstr ""
-#: ../../mod/dfrn_request.php:539
+#: ../../mod/localtime.php:30
#, php-format
-msgid "Welcome home %s."
+msgid "UTC time: %s"
msgstr ""
-#: ../../mod/dfrn_request.php:540
+#: ../../mod/localtime.php:33
#, php-format
-msgid "Please confirm your introduction/connection request to %s."
-msgstr ""
-
-#: ../../mod/dfrn_request.php:541
-msgid "Confirm"
-msgstr ""
-
-#: ../../mod/dfrn_request.php:581 ../../include/items.php:2406
-msgid "[Name Withheld]"
+msgid "Current timezone: %s"
msgstr ""
-#: ../../mod/dfrn_request.php:665
+#: ../../mod/localtime.php:36
#, php-format
-msgid ""
-"Diaspora members: Please do not use this form. Instead, enter \"%s\" into "
-"your Diaspora search bar."
-msgstr ""
-
-#: ../../mod/dfrn_request.php:668
-msgid ""
-"Please enter your 'Identity Address' from one of the following supported "
-"social networks:"
-msgstr ""
-
-#: ../../mod/dfrn_request.php:671
-msgid "Friend/Connection Request"
+msgid "Converted localtime: %s"
msgstr ""
-#: ../../mod/dfrn_request.php:672
-msgid ""
-"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
-"testuser@identi.ca"
+#: ../../mod/localtime.php:41
+msgid "Please select your timezone:"
msgstr ""
-#: ../../mod/dfrn_request.php:673
-msgid "Please answer the following:"
+#: ../../mod/match.php:12
+msgid "Profile Match"
msgstr ""
-#: ../../mod/dfrn_request.php:674
-#, php-format
-msgid "Does %s know you?"
+#: ../../mod/match.php:20
+msgid "No keywords to match. Please add keywords to your default profile."
msgstr ""
-#: ../../mod/dfrn_request.php:677
-msgid "Add a personal note:"
+#: ../../mod/match.php:57
+msgid "is interested in:"
msgstr ""
-#: ../../mod/dfrn_request.php:679 ../../include/contact_selectors.php:76
-msgid "Friendica"
+#: ../../mod/match.php:58 ../../mod/suggest.php:59
+#: ../../include/contact_widgets.php:9 ../../boot.php:926
+msgid "Connect"
msgstr ""
-#: ../../mod/dfrn_request.php:680
-msgid "StatusNet/Federated Social Web"
+#: ../../mod/match.php:65 ../../mod/dirfind.php:57
+msgid "No matches"
msgstr ""
-#: ../../mod/dfrn_request.php:682
-msgid "- please share from your own site as noted above"
+#: ../../mod/lockview.php:39
+msgid "Remote privacy information not available."
msgstr ""
-#: ../../mod/dfrn_request.php:683
-msgid "Your Identity Address:"
+#: ../../mod/lockview.php:43
+msgid "Visible to:"
msgstr ""
-#: ../../mod/dfrn_request.php:684
-msgid "Submit Request"
+#: ../../mod/home.php:26 ../../addon/communityhome/communityhome.php:179
+#, php-format
+msgid "Welcome to %s"
msgstr ""
#: ../../mod/notifications.php:26
msgid "Invalid request identifier."
msgstr ""
-#: ../../mod/notifications.php:35 ../../mod/notifications.php:150
-#: ../../mod/notifications.php:195
+#: ../../mod/notifications.php:35 ../../mod/notifications.php:152
+#: ../../mod/notifications.php:198
msgid "Discard"
msgstr ""
+#: ../../mod/notifications.php:47 ../../mod/notifications.php:151
+#: ../../mod/notifications.php:197 ../../mod/contacts.php:302
+#: ../../mod/contacts.php:345
+msgid "Ignore"
+msgstr ""
+
#: ../../mod/notifications.php:71 ../../include/nav.php:109
msgid "Network"
msgstr ""
-#: ../../mod/notifications.php:76 ../../mod/network.php:169
+#: ../../mod/notifications.php:76 ../../mod/network.php:177
msgid "Personal"
msgstr ""
@@ -1229,7 +1178,7 @@ msgid "Introductions"
msgstr ""
#: ../../mod/notifications.php:91 ../../mod/message.php:76
-#: ../../include/nav.php:122
+#: ../../include/nav.php:123
msgid "Messages"
msgstr ""
@@ -1241,7 +1190,7 @@ msgstr ""
msgid "Hide Ignored Requests"
msgstr ""
-#: ../../mod/notifications.php:136 ../../mod/notifications.php:180
+#: ../../mod/notifications.php:136 ../../mod/notifications.php:182
msgid "Notification type: "
msgstr ""
@@ -1254,1296 +1203,1513 @@ msgstr ""
msgid "suggested by %s"
msgstr ""
-#: ../../mod/notifications.php:146 ../../mod/notifications.php:192
+#: ../../mod/notifications.php:144 ../../mod/notifications.php:191
+#: ../../mod/contacts.php:350
+msgid "Hide this contact from others"
+msgstr ""
+
+#: ../../mod/notifications.php:145 ../../mod/notifications.php:192
+msgid "Post a new friend activity"
+msgstr ""
+
+#: ../../mod/notifications.php:145 ../../mod/notifications.php:192
+msgid "if applicable"
+msgstr ""
+
+#: ../../mod/notifications.php:148 ../../mod/notifications.php:195
#: ../../mod/admin.php:466
msgid "Approve"
msgstr ""
-#: ../../mod/notifications.php:166
+#: ../../mod/notifications.php:168
msgid "Claims to be known to you: "
msgstr ""
-#: ../../mod/notifications.php:166
+#: ../../mod/notifications.php:168
msgid "yes"
msgstr ""
-#: ../../mod/notifications.php:166
+#: ../../mod/notifications.php:168
msgid "no"
msgstr ""
-#: ../../mod/notifications.php:173
+#: ../../mod/notifications.php:175
msgid "Approve as: "
msgstr ""
-#: ../../mod/notifications.php:174
+#: ../../mod/notifications.php:176
msgid "Friend"
msgstr ""
-#: ../../mod/notifications.php:175
+#: ../../mod/notifications.php:177
msgid "Sharer"
msgstr ""
-#: ../../mod/notifications.php:175
+#: ../../mod/notifications.php:177
msgid "Fan/Admirer"
msgstr ""
-#: ../../mod/notifications.php:181
+#: ../../mod/notifications.php:183
msgid "Friend/Connect Request"
msgstr ""
-#: ../../mod/notifications.php:181
+#: ../../mod/notifications.php:183
msgid "New Follower"
msgstr ""
-#: ../../mod/notifications.php:201
+#: ../../mod/notifications.php:204
msgid "No introductions."
msgstr ""
-#: ../../mod/notifications.php:204 ../../mod/notifications.php:290
-#: ../../mod/notifications.php:385 ../../mod/notifications.php:466
+#: ../../mod/notifications.php:207 ../../mod/notifications.php:293
+#: ../../mod/notifications.php:388 ../../mod/notifications.php:469
#: ../../include/nav.php:118
msgid "Notifications"
msgstr ""
-#: ../../mod/notifications.php:241 ../../mod/notifications.php:336
-#: ../../mod/notifications.php:423
+#: ../../mod/notifications.php:244 ../../mod/notifications.php:339
+#: ../../mod/notifications.php:426
#, php-format
msgid "%s liked %s's post"
msgstr ""
-#: ../../mod/notifications.php:250 ../../mod/notifications.php:345
-#: ../../mod/notifications.php:432
+#: ../../mod/notifications.php:253 ../../mod/notifications.php:348
+#: ../../mod/notifications.php:435
#, php-format
msgid "%s disliked %s's post"
msgstr ""
-#: ../../mod/notifications.php:264 ../../mod/notifications.php:359
-#: ../../mod/notifications.php:446
+#: ../../mod/notifications.php:267 ../../mod/notifications.php:362
+#: ../../mod/notifications.php:449
#, php-format
msgid "%s is now friends with %s"
msgstr ""
-#: ../../mod/notifications.php:271 ../../mod/notifications.php:366
+#: ../../mod/notifications.php:274 ../../mod/notifications.php:369
#, php-format
msgid "%s created a new post"
msgstr ""
-#: ../../mod/notifications.php:272 ../../mod/notifications.php:367
-#: ../../mod/notifications.php:455
+#: ../../mod/notifications.php:275 ../../mod/notifications.php:370
+#: ../../mod/notifications.php:458
#, php-format
msgid "%s commented on %s's post"
msgstr ""
-#: ../../mod/notifications.php:286
+#: ../../mod/notifications.php:289
msgid "No more network notifications."
msgstr ""
-#: ../../mod/notifications.php:381
+#: ../../mod/notifications.php:384
msgid "No more personal notifications."
msgstr ""
-#: ../../mod/notifications.php:462
+#: ../../mod/notifications.php:465
msgid "No more home notifications."
msgstr ""
-#: ../../mod/message.php:23
-msgid "No recipient selected."
+#: ../../mod/contacts.php:63 ../../mod/contacts.php:143
+msgid "Could not access contact record."
msgstr ""
-#: ../../mod/message.php:26
-msgid "Unable to locate contact information."
+#: ../../mod/contacts.php:77
+msgid "Could not locate selected profile."
msgstr ""
-#: ../../mod/message.php:29
-msgid "Message could not be sent."
+#: ../../mod/contacts.php:100
+msgid "Contact updated."
msgstr ""
-#: ../../mod/message.php:32
-msgid "Message collection failure."
+#: ../../mod/contacts.php:165
+msgid "Contact has been blocked"
msgstr ""
-#: ../../mod/message.php:35
-msgid "Message sent."
+#: ../../mod/contacts.php:165
+msgid "Contact has been unblocked"
msgstr ""
-#: ../../mod/message.php:55
-msgid "Inbox"
+#: ../../mod/contacts.php:179
+msgid "Contact has been ignored"
msgstr ""
-#: ../../mod/message.php:60
-msgid "Outbox"
+#: ../../mod/contacts.php:179
+msgid "Contact has been unignored"
msgstr ""
-#: ../../mod/message.php:65
-msgid "New Message"
+#: ../../mod/contacts.php:200
+msgid "stopped following"
msgstr ""
-#: ../../mod/message.php:91
-msgid "Message deleted."
+#: ../../mod/contacts.php:221
+msgid "Contact has been removed."
msgstr ""
-#: ../../mod/message.php:121
-msgid "Conversation removed."
+#: ../../mod/contacts.php:245
+#, php-format
+msgid "You are mutual friends with %s"
msgstr ""
-#: ../../mod/message.php:137 ../../include/conversation.php:815
-msgid "Please enter a link URL:"
+#: ../../mod/contacts.php:249
+#, php-format
+msgid "You are sharing with %s"
msgstr ""
-#: ../../mod/message.php:145
-msgid "Send Private Message"
+#: ../../mod/contacts.php:254
+#, php-format
+msgid "%s is sharing with you"
msgstr ""
-#: ../../mod/message.php:146 ../../mod/message.php:287
-msgid "To:"
+#: ../../mod/contacts.php:271
+msgid "Private communications are not available for this contact."
msgstr ""
-#: ../../mod/message.php:147 ../../mod/message.php:288
-msgid "Subject:"
+#: ../../mod/contacts.php:274
+msgid "Never"
msgstr ""
-#: ../../mod/message.php:150 ../../mod/message.php:291
-#: ../../mod/invite.php:101
-msgid "Your message:"
+#: ../../mod/contacts.php:278
+msgid "(Update was successful)"
msgstr ""
-#: ../../mod/message.php:153 ../../mod/message.php:294
-#: ../../mod/editpost.php:91 ../../include/conversation.php:863
-msgid "Upload photo"
+#: ../../mod/contacts.php:278
+msgid "(Update was not successful)"
msgstr ""
-#: ../../mod/message.php:154 ../../mod/message.php:295
-#: ../../mod/editpost.php:93 ../../include/conversation.php:867
-msgid "Insert web link"
+#: ../../mod/contacts.php:280
+msgid "Suggest friends"
msgstr ""
-#: ../../mod/message.php:155 ../../mod/message.php:296
-#: ../../mod/editpost.php:99 ../../mod/photos.php:1186
-#: ../../include/conversation.php:294 ../../include/conversation.php:631
-#: ../../include/conversation.php:879
-msgid "Please wait"
+#: ../../mod/contacts.php:284
+#, php-format
+msgid "Network type: %s"
msgstr ""
-#: ../../mod/message.php:188
-msgid "No messages."
+#: ../../mod/contacts.php:287
+#, php-format
+msgid "%d contact in common"
+msgid_plural "%d contacts in common"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../mod/contacts.php:292
+msgid "View all contacts"
msgstr ""
-#: ../../mod/message.php:201
-msgid "Delete conversation"
+#: ../../mod/contacts.php:297 ../../mod/contacts.php:344
+#: ../../mod/admin.php:470
+msgid "Unblock"
msgstr ""
-#: ../../mod/message.php:204
-msgid "D, d M Y - g:i A"
+#: ../../mod/contacts.php:297 ../../mod/contacts.php:344
+#: ../../mod/admin.php:469
+msgid "Block"
msgstr ""
-#: ../../mod/message.php:239
-msgid "Message not available."
+#: ../../mod/contacts.php:302 ../../mod/contacts.php:345
+msgid "Unignore"
msgstr ""
-#: ../../mod/message.php:276
-msgid "Delete message"
+#: ../../mod/contacts.php:307
+msgid "Repair"
msgstr ""
-#: ../../mod/message.php:286
-msgid "Send Reply"
+#: ../../mod/contacts.php:317
+msgid "Contact Editor"
msgstr ""
-#: ../../mod/wall_upload.php:56 ../../mod/profile_photo.php:113
-#, php-format
-msgid "Image exceeds size limit of %d"
+#: ../../mod/contacts.php:320
+msgid "Profile Visibility"
msgstr ""
-#: ../../mod/wall_upload.php:65 ../../mod/profile_photo.php:122
-#: ../../mod/photos.php:649
-msgid "Unable to process image."
+#: ../../mod/contacts.php:321
+#, php-format
+msgid ""
+"Please choose the profile you would like to display to %s when viewing your "
+"profile securely."
msgstr ""
-#: ../../mod/wall_upload.php:81 ../../mod/wall_upload.php:90
-#: ../../mod/wall_upload.php:97 ../../mod/item.php:318
-#: ../../include/message.php:143
-msgid "Wall Photos"
+#: ../../mod/contacts.php:322
+msgid "Contact Information / Notes"
msgstr ""
-#: ../../mod/wall_upload.php:84 ../../mod/profile_photo.php:251
-#: ../../mod/photos.php:669
-msgid "Image upload failed."
+#: ../../mod/contacts.php:323
+msgid "Edit contact notes"
msgstr ""
-#: ../../mod/wall_attach.php:57
+#: ../../mod/contacts.php:328 ../../mod/contacts.php:458
+#: ../../mod/viewcontacts.php:61
#, php-format
-msgid "File exceeds size limit of %d"
+msgid "Visit %s's profile [%s]"
msgstr ""
-#: ../../mod/wall_attach.php:87 ../../mod/wall_attach.php:98
-msgid "File upload failed."
+#: ../../mod/contacts.php:329
+msgid "Block/Unblock contact"
msgstr ""
-#: ../../mod/profile_photo.php:28
-msgid "Image uploaded but image cropping failed."
+#: ../../mod/contacts.php:330
+msgid "Ignore contact"
msgstr ""
-#: ../../mod/profile_photo.php:58 ../../mod/profile_photo.php:65
-#: ../../mod/profile_photo.php:72 ../../mod/profile_photo.php:170
-#: ../../mod/profile_photo.php:246 ../../mod/profile_photo.php:255
-#: ../../mod/register.php:327 ../../mod/register.php:334
-#: ../../mod/register.php:341 ../../mod/photos.php:146
-#: ../../mod/photos.php:593 ../../mod/photos.php:938 ../../mod/photos.php:953
-#: ../../addon/communityhome/communityhome.php:111
-msgid "Profile Photos"
+#: ../../mod/contacts.php:331
+msgid "Repair URL settings"
msgstr ""
-#: ../../mod/profile_photo.php:61 ../../mod/profile_photo.php:68
-#: ../../mod/profile_photo.php:75 ../../mod/profile_photo.php:258
-#, php-format
-msgid "Image size reduction [%s] failed."
+#: ../../mod/contacts.php:332
+msgid "View conversations"
msgstr ""
-#: ../../mod/profile_photo.php:89
+#: ../../mod/contacts.php:334
+msgid "Delete contact"
+msgstr ""
+
+#: ../../mod/contacts.php:338
+msgid "Last update:"
+msgstr ""
+
+#: ../../mod/contacts.php:339
+msgid "Update public posts"
+msgstr ""
+
+#: ../../mod/contacts.php:341 ../../mod/admin.php:701
+msgid "Update now"
+msgstr ""
+
+#: ../../mod/contacts.php:348
+msgid "Currently blocked"
+msgstr ""
+
+#: ../../mod/contacts.php:349
+msgid "Currently ignored"
+msgstr ""
+
+#: ../../mod/contacts.php:350
msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
+"Replies/likes to your public posts <strong>may</strong> still be visible"
msgstr ""
-#: ../../mod/profile_photo.php:99
-msgid "Unable to process image"
+#: ../../mod/contacts.php:387 ../../include/nav.php:131
+msgid "Contacts"
msgstr ""
-#: ../../mod/profile_photo.php:203
-msgid "Upload File:"
+#: ../../mod/contacts.php:389
+msgid "Show Unblocked Contacts"
msgstr ""
-#: ../../mod/profile_photo.php:204
-msgid "Upload Profile Photo"
+#: ../../mod/contacts.php:389
+msgid "Show Blocked Contacts"
msgstr ""
-#: ../../mod/profile_photo.php:205
-msgid "Upload"
+#: ../../mod/contacts.php:391
+msgid "Show All Contacts"
msgstr ""
-#: ../../mod/profile_photo.php:206
-msgid "skip this step"
+#: ../../mod/contacts.php:393
+msgid "Search your contacts"
msgstr ""
-#: ../../mod/profile_photo.php:206
-msgid "select a photo from your photo albums"
+#: ../../mod/contacts.php:394 ../../mod/directory.php:65
+msgid "Finding: "
msgstr ""
-#: ../../mod/profile_photo.php:219
-msgid "Crop Image"
+#: ../../mod/contacts.php:395 ../../mod/directory.php:67
+#: ../../include/contact_widgets.php:34
+msgid "Find"
msgstr ""
-#: ../../mod/profile_photo.php:220
-msgid "Please adjust the image cropping for optimum viewing."
+#: ../../mod/contacts.php:434
+msgid "Mutual Friendship"
msgstr ""
-#: ../../mod/profile_photo.php:221
-msgid "Done Editing"
+#: ../../mod/contacts.php:438
+msgid "is a fan of yours"
msgstr ""
-#: ../../mod/profile_photo.php:249
-msgid "Image uploaded successfully."
+#: ../../mod/contacts.php:442
+msgid "you are a fan of"
msgstr ""
-#: ../../mod/manage.php:37
+#: ../../mod/contacts.php:459 ../../include/Contact.php:135
+#: ../../include/conversation.php:748
+msgid "Edit contact"
+msgstr ""
+
+#: ../../mod/lostpass.php:16
+msgid "No valid account found."
+msgstr ""
+
+#: ../../mod/lostpass.php:31
+msgid "Password reset request issued. Check your email."
+msgstr ""
+
+#: ../../mod/lostpass.php:42
#, php-format
-msgid "Welcome back %s"
+msgid "Password reset requested at %s"
msgstr ""
-#: ../../mod/manage.php:87
-msgid "Manage Identities and/or Pages"
+#: ../../mod/lostpass.php:44 ../../mod/lostpass.php:106
+#: ../../mod/register.php:380 ../../mod/register.php:434
+#: ../../mod/regmod.php:54 ../../mod/dfrn_confirm.php:716
+#: ../../include/items.php:2452
+msgid "Administrator"
msgstr ""
-#: ../../mod/manage.php:90
+#: ../../mod/lostpass.php:64
msgid ""
-"(Toggle between different identities or community/group pages which share "
-"your account details.)"
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
msgstr ""
-#: ../../mod/manage.php:92
-msgid "Select an identity to manage: "
+#: ../../mod/lostpass.php:82 ../../boot.php:719
+msgid "Password Reset"
msgstr ""
-#: ../../mod/tagger.php:70 ../../mod/like.php:127 ../../mod/photos.php:524
-#: ../../include/conversation.php:31 ../../include/conversation.php:104
-#: ../../include/diaspora.php:1554
-#: ../../addon/communityhome/communityhome.php:163
-msgid "photo"
+#: ../../mod/lostpass.php:83
+msgid "Your password has been reset as requested."
msgstr ""
-#: ../../mod/tagger.php:70 ../../mod/like.php:127
-#: ../../include/conversation.php:26 ../../include/conversation.php:35
-#: ../../include/conversation.php:99 ../../include/conversation.php:108
-#: ../../include/diaspora.php:1554 ../../addon/facebook/facebook.php:1084
-#: ../../addon/communityhome/communityhome.php:158
-#: ../../addon/communityhome/communityhome.php:167
-msgid "status"
+#: ../../mod/lostpass.php:84
+msgid "Your new password is"
msgstr ""
-#: ../../mod/tagger.php:103 ../../include/conversation.php:116
-#, php-format
-msgid "%1$s tagged %2$s's %3$s with %4$s"
+#: ../../mod/lostpass.php:85
+msgid "Save or copy your new password - and then"
msgstr ""
-#: ../../mod/common.php:34
-msgid "Common Friends"
+#: ../../mod/lostpass.php:86
+msgid "click here to login"
msgstr ""
-#: ../../mod/common.php:42
-msgid "No friends in common."
+#: ../../mod/lostpass.php:87
+msgid ""
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
msgstr ""
-#: ../../mod/profiles.php:21 ../../mod/profiles.php:239
-#: ../../mod/profiles.php:344 ../../mod/dfrn_confirm.php:62
-msgid "Profile not found."
+#: ../../mod/lostpass.php:118
+msgid "Forgot your Password?"
msgstr ""
-#: ../../mod/profiles.php:28
-msgid "Profile Name is required."
+#: ../../mod/lostpass.php:119
+msgid ""
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
msgstr ""
-#: ../../mod/profiles.php:198
-msgid "Profile updated."
+#: ../../mod/lostpass.php:120
+msgid "Nickname or Email: "
msgstr ""
-#: ../../mod/profiles.php:256
-msgid "Profile deleted."
+#: ../../mod/lostpass.php:121
+msgid "Reset"
msgstr ""
-#: ../../mod/profiles.php:272 ../../mod/profiles.php:303
-msgid "Profile-"
+#: ../../mod/settings.php:70
+msgid "Missing some important data!"
msgstr ""
-#: ../../mod/profiles.php:291 ../../mod/profiles.php:330
-msgid "New profile created."
+#: ../../mod/settings.php:73 ../../mod/settings.php:479 ../../mod/admin.php:62
+msgid "Update"
msgstr ""
-#: ../../mod/profiles.php:309
-msgid "Profile unavailable to clone."
+#: ../../mod/settings.php:168
+msgid "Failed to connect with email account using the settings provided."
msgstr ""
-#: ../../mod/profiles.php:356
-msgid "Hide your contact/friend list from viewers of this profile?"
+#: ../../mod/settings.php:173
+msgid "Email settings updated."
msgstr ""
-#: ../../mod/profiles.php:374
-msgid "Edit Profile Details"
+#: ../../mod/settings.php:191
+msgid "Passwords do not match. Password unchanged."
msgstr ""
-#: ../../mod/profiles.php:376
-msgid "View this profile"
+#: ../../mod/settings.php:196
+msgid "Empty passwords are not allowed. Password unchanged."
msgstr ""
-#: ../../mod/profiles.php:377
-msgid "Create a new profile using these settings"
+#: ../../mod/settings.php:207
+msgid "Password changed."
msgstr ""
-#: ../../mod/profiles.php:378
-msgid "Clone this profile"
+#: ../../mod/settings.php:209
+msgid "Password update failed. Please try again."
msgstr ""
-#: ../../mod/profiles.php:379
-msgid "Delete this profile"
+#: ../../mod/settings.php:273
+msgid " Please use a shorter name."
msgstr ""
-#: ../../mod/profiles.php:380
-msgid "Profile Name:"
+#: ../../mod/settings.php:275
+msgid " Name too short."
msgstr ""
-#: ../../mod/profiles.php:381
-msgid "Your Full Name:"
+#: ../../mod/settings.php:281
+msgid " Not valid email."
msgstr ""
-#: ../../mod/profiles.php:382
-msgid "Title/Description:"
+#: ../../mod/settings.php:283
+msgid " Cannot change to that email."
msgstr ""
-#: ../../mod/profiles.php:383
-msgid "Your Gender:"
+#: ../../mod/settings.php:351 ../../addon/facebook/facebook.php:320
+#: ../../addon/impressum/impressum.php:64 ../../addon/piwik/piwik.php:94
+#: ../../addon/twitter/twitter.php:310
+msgid "Settings updated."
msgstr ""
-#: ../../mod/profiles.php:384
-#, php-format
-msgid "Birthday (%s):"
+#: ../../mod/settings.php:415 ../../include/nav.php:129
+msgid "Account settings"
msgstr ""
-#: ../../mod/profiles.php:385
-msgid "Street Address:"
+#: ../../mod/settings.php:420
+msgid "Connector settings"
msgstr ""
-#: ../../mod/profiles.php:386
-msgid "Locality/City:"
+#: ../../mod/settings.php:425
+msgid "Plugin settings"
msgstr ""
-#: ../../mod/profiles.php:387
-msgid "Postal/Zip Code:"
+#: ../../mod/settings.php:430
+msgid "Connections"
msgstr ""
-#: ../../mod/profiles.php:388
-msgid "Country:"
+#: ../../mod/settings.php:435
+msgid "Export personal data"
msgstr ""
-#: ../../mod/profiles.php:389
-msgid "Region/State:"
+#: ../../mod/settings.php:452 ../../mod/settings.php:478
+#: ../../mod/settings.php:511
+msgid "Add application"
msgstr ""
-#: ../../mod/profiles.php:390
-msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
+#: ../../mod/settings.php:456 ../../mod/settings.php:482
+#: ../../addon/statusnet/statusnet.php:489
+msgid "Consumer Key"
msgstr ""
-#: ../../mod/profiles.php:391
-msgid "Who: (if applicable)"
+#: ../../mod/settings.php:457 ../../mod/settings.php:483
+#: ../../addon/statusnet/statusnet.php:488
+msgid "Consumer Secret"
msgstr ""
-#: ../../mod/profiles.php:392
-msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+#: ../../mod/settings.php:458 ../../mod/settings.php:484
+msgid "Redirect"
msgstr ""
-#: ../../mod/profiles.php:393 ../../include/profile_advanced.php:43
-msgid "Sexual Preference:"
+#: ../../mod/settings.php:459 ../../mod/settings.php:485
+msgid "Icon url"
msgstr ""
-#: ../../mod/profiles.php:394
-msgid "Homepage URL:"
+#: ../../mod/settings.php:470
+msgid "You can't edit this application."
msgstr ""
-#: ../../mod/profiles.php:395 ../../include/profile_advanced.php:47
-msgid "Political Views:"
+#: ../../mod/settings.php:510
+msgid "Connected Apps"
msgstr ""
-#: ../../mod/profiles.php:396
-msgid "Religious Views:"
+#: ../../mod/settings.php:514
+msgid "Client key starts with"
msgstr ""
-#: ../../mod/profiles.php:397
-msgid "Public Keywords:"
+#: ../../mod/settings.php:515
+msgid "No name"
msgstr ""
-#: ../../mod/profiles.php:398
-msgid "Private Keywords:"
+#: ../../mod/settings.php:516
+msgid "Remove authorization"
msgstr ""
-#: ../../mod/profiles.php:399
-msgid "Example: fishing photography software"
+#: ../../mod/settings.php:528
+msgid "No Plugin settings configured"
msgstr ""
-#: ../../mod/profiles.php:400
-msgid "(Used for suggesting potential friends, can be seen by others)"
+#: ../../mod/settings.php:535 ../../addon/widgets/widgets.php:122
+msgid "Plugin Settings"
msgstr ""
-#: ../../mod/profiles.php:401
-msgid "(Used for searching profiles, never shown to others)"
+#: ../../mod/settings.php:548 ../../mod/settings.php:549
+#, php-format
+msgid "Built-in support for %s connectivity is %s"
msgstr ""
-#: ../../mod/profiles.php:402
-msgid "Tell us about yourself..."
+#: ../../mod/settings.php:548 ../../mod/settings.php:549
+msgid "enabled"
msgstr ""
-#: ../../mod/profiles.php:403
-msgid "Hobbies/Interests"
+#: ../../mod/settings.php:548 ../../mod/settings.php:549
+msgid "disabled"
msgstr ""
-#: ../../mod/profiles.php:404
-msgid "Contact information and Social Networks"
+#: ../../mod/settings.php:549
+msgid "StatusNet"
msgstr ""
-#: ../../mod/profiles.php:405
-msgid "Musical interests"
+#: ../../mod/settings.php:575
+msgid "Connector Settings"
msgstr ""
-#: ../../mod/profiles.php:406
-msgid "Books, literature"
+#: ../../mod/settings.php:581
+msgid "Email/Mailbox Setup"
msgstr ""
-#: ../../mod/profiles.php:407
-msgid "Television"
+#: ../../mod/settings.php:582
+msgid ""
+"If you wish to communicate with email contacts using this service "
+"(optional), please specify how to connect to your mailbox."
msgstr ""
-#: ../../mod/profiles.php:408
-msgid "Film/dance/culture/entertainment"
+#: ../../mod/settings.php:583
+msgid "Last successful email check:"
msgstr ""
-#: ../../mod/profiles.php:409
-msgid "Love/romance"
+#: ../../mod/settings.php:584
+msgid "Email access is disabled on this site."
msgstr ""
-#: ../../mod/profiles.php:410
-msgid "Work/employment"
+#: ../../mod/settings.php:585
+msgid "IMAP server name:"
msgstr ""
-#: ../../mod/profiles.php:411
-msgid "School/education"
+#: ../../mod/settings.php:586
+msgid "IMAP port:"
msgstr ""
-#: ../../mod/profiles.php:416
-msgid ""
-"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
-"be visible to anybody using the internet."
+#: ../../mod/settings.php:587
+msgid "Security:"
msgstr ""
-#: ../../mod/profiles.php:461
-msgid "Edit/Manage Profiles"
+#: ../../mod/settings.php:587
+msgid "None"
msgstr ""
-#: ../../mod/profiles.php:462 ../../boot.php:927
-msgid "Change profile photo"
+#: ../../mod/settings.php:588
+msgid "Email login name:"
msgstr ""
-#: ../../mod/profiles.php:463 ../../boot.php:928
-msgid "Create New Profile"
+#: ../../mod/settings.php:589
+msgid "Email password:"
msgstr ""
-#: ../../mod/profiles.php:473 ../../boot.php:938
-msgid "Profile Image"
+#: ../../mod/settings.php:590
+msgid "Reply-to address:"
msgstr ""
-#: ../../mod/profiles.php:475 ../../boot.php:941
-msgid "visible to everybody"
+#: ../../mod/settings.php:591
+msgid "Send public posts to all email contacts:"
msgstr ""
-#: ../../mod/profiles.php:476 ../../boot.php:942
-msgid "Edit visibility"
+#: ../../mod/settings.php:648 ../../mod/admin.php:126 ../../mod/admin.php:443
+msgid "Normal Account"
msgstr ""
-#: ../../mod/openid.php:63 ../../mod/openid.php:123 ../../include/auth.php:122
-#: ../../include/auth.php:147 ../../include/auth.php:201
-msgid "Login failed."
+#: ../../mod/settings.php:649
+msgid "This account is a normal personal profile"
msgstr ""
-#: ../../mod/openid.php:79 ../../include/auth.php:217
-msgid "Welcome "
+#: ../../mod/settings.php:652 ../../mod/admin.php:127 ../../mod/admin.php:444
+msgid "Soapbox Account"
msgstr ""
-#: ../../mod/openid.php:80 ../../include/auth.php:218
-msgid "Please upload a profile photo."
+#: ../../mod/settings.php:653
+msgid "Automatically approve all connection/friend requests as read-only fans"
msgstr ""
-#: ../../mod/openid.php:83 ../../include/auth.php:221
-msgid "Welcome back "
+#: ../../mod/settings.php:656 ../../mod/admin.php:128 ../../mod/admin.php:445
+msgid "Community/Celebrity Account"
msgstr ""
-#: ../../mod/localtime.php:12 ../../include/event.php:11
-#: ../../include/bb2diaspora.php:237
-msgid "l F d, Y \\@ g:i A"
+#: ../../mod/settings.php:657
+msgid "Automatically approve all connection/friend requests as read-write fans"
msgstr ""
-#: ../../mod/localtime.php:24
-msgid "Time Conversion"
+#: ../../mod/settings.php:660 ../../mod/admin.php:129 ../../mod/admin.php:446
+msgid "Automatic Friend Account"
msgstr ""
-#: ../../mod/localtime.php:26
-msgid ""
-"Friendika provides this service for sharing events with other networks and "
-"friends in unknown timezones."
+#: ../../mod/settings.php:661
+msgid "Automatically approve all connection/friend requests as friends"
msgstr ""
-#: ../../mod/localtime.php:30
-#, php-format
-msgid "UTC time: %s"
+#: ../../mod/settings.php:671
+msgid "OpenID:"
msgstr ""
-#: ../../mod/localtime.php:33
-#, php-format
-msgid "Current timezone: %s"
+#: ../../mod/settings.php:671
+msgid "(Optional) Allow this OpenID to login to this account."
msgstr ""
-#: ../../mod/localtime.php:36
-#, php-format
-msgid "Converted localtime: %s"
+#: ../../mod/settings.php:681
+msgid "Publish your default profile in your local site directory?"
msgstr ""
-#: ../../mod/localtime.php:41
-msgid "Please select your timezone:"
+#: ../../mod/settings.php:687
+msgid "Publish your default profile in the global social directory?"
msgstr ""
-#: ../../mod/invite.php:35
-#, php-format
-msgid "%s : Not a valid email address."
+#: ../../mod/settings.php:695
+msgid "Hide your contact/friend list from viewers of your default profile?"
msgstr ""
-#: ../../mod/invite.php:59
-#, php-format
-msgid "Please join my network on %s"
+#: ../../mod/settings.php:699
+msgid "Hide your profile details from unknown viewers?"
msgstr ""
-#: ../../mod/invite.php:69
-#, php-format
-msgid "%s : Message delivery failed."
+#: ../../mod/settings.php:704
+msgid "Allow friends to post to your profile page?"
msgstr ""
-#: ../../mod/invite.php:73
-#, php-format
-msgid "%d message sent."
-msgid_plural "%d messages sent."
-msgstr[0] ""
-msgstr[1] ""
+#: ../../mod/settings.php:710
+msgid "Allow friends to tag your posts?"
+msgstr ""
-#: ../../mod/invite.php:92
-msgid "You have no more invitations available"
+#: ../../mod/settings.php:716
+msgid "Allow us to suggest you as a potential friend to new members?"
msgstr ""
-#: ../../mod/invite.php:99
-msgid "Send invitations"
+#: ../../mod/settings.php:725
+msgid "Profile is <strong>not published</strong>."
msgstr ""
-#: ../../mod/invite.php:100
-msgid "Enter email addresses, one per line:"
+#: ../../mod/settings.php:744 ../../mod/profile_photo.php:206
+msgid "or"
msgstr ""
-#: ../../mod/invite.php:102
-#, php-format
-msgid "Please join my social network on %s"
+#: ../../mod/settings.php:749
+msgid "Your Identity Address is"
msgstr ""
-#: ../../mod/invite.php:103
-msgid "To accept this invitation, please visit:"
+#: ../../mod/settings.php:760
+msgid "Automatically expire posts after this many days:"
msgstr ""
-#: ../../mod/invite.php:104
-msgid "You will need to supply this invitation code: $invite_code"
+#: ../../mod/settings.php:760
+msgid "If empty, posts will not expire. Expired posts will be deleted"
msgstr ""
-#: ../../mod/invite.php:104
-msgid ""
-"Once you have registered, please connect with me via my profile page at:"
+#: ../../mod/settings.php:761
+msgid "Advanced expiration settings"
msgstr ""
-#: ../../mod/register.php:62
-msgid "An invitation is required."
+#: ../../mod/settings.php:762
+msgid "Advanced Expiration"
msgstr ""
-#: ../../mod/register.php:67
-msgid "Invitation could not be verified."
+#: ../../mod/settings.php:763
+msgid "Expire posts:"
msgstr ""
-#: ../../mod/register.php:75
-msgid "Invalid OpenID url"
+#: ../../mod/settings.php:764
+msgid "Expire personal notes:"
msgstr ""
-#: ../../mod/register.php:90
-msgid "Please enter the required information."
+#: ../../mod/settings.php:765
+msgid "Expire starred posts:"
msgstr ""
-#: ../../mod/register.php:104
-msgid "Please use a shorter name."
+#: ../../mod/settings.php:766
+msgid "Expire photos:"
msgstr ""
-#: ../../mod/register.php:106
-msgid "Name too short."
+#: ../../mod/settings.php:771
+msgid "Account Settings"
msgstr ""
-#: ../../mod/register.php:121
-msgid "That doesn't appear to be your full (First Last) name."
+#: ../../mod/settings.php:779
+msgid "Password Settings"
msgstr ""
-#: ../../mod/register.php:126
-msgid "Your email domain is not among those allowed on this site."
+#: ../../mod/settings.php:780
+msgid "New Password:"
msgstr ""
-#: ../../mod/register.php:129
-msgid "Not a valid email address."
+#: ../../mod/settings.php:781
+msgid "Confirm:"
msgstr ""
-#: ../../mod/register.php:139
-msgid "Cannot use that email."
+#: ../../mod/settings.php:781
+msgid "Leave password fields blank unless changing"
msgstr ""
-#: ../../mod/register.php:145
-msgid ""
-"Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and "
-"must also begin with a letter."
+#: ../../mod/settings.php:785
+msgid "Basic Settings"
msgstr ""
-#: ../../mod/register.php:151 ../../mod/register.php:252
-msgid "Nickname is already registered. Please choose another."
+#: ../../mod/settings.php:786 ../../include/profile_advanced.php:15
+msgid "Full Name:"
msgstr ""
-#: ../../mod/register.php:170
-msgid "SERIOUS ERROR: Generation of security keys failed."
+#: ../../mod/settings.php:787
+msgid "Email Address:"
msgstr ""
-#: ../../mod/register.php:238
-msgid "An error occurred during registration. Please try again."
+#: ../../mod/settings.php:788
+msgid "Your Timezone:"
msgstr ""
-#: ../../mod/register.php:274
-msgid "An error occurred creating your default profile. Please try again."
+#: ../../mod/settings.php:789
+msgid "Default Post Location:"
msgstr ""
-#: ../../mod/register.php:378 ../../mod/regmod.php:52
-#, php-format
-msgid "Registration details for %s"
+#: ../../mod/settings.php:790
+msgid "Use Browser Location:"
msgstr ""
-#: ../../mod/register.php:380 ../../mod/register.php:434
-#: ../../mod/lostpass.php:44 ../../mod/lostpass.php:106
-#: ../../mod/regmod.php:54 ../../mod/dfrn_confirm.php:710
-#: ../../include/items.php:2415
-msgid "Administrator"
+#: ../../mod/settings.php:791
+msgid "Display Theme:"
msgstr ""
-#: ../../mod/register.php:386
-msgid ""
-"Registration successful. Please check your email for further instructions."
+#: ../../mod/settings.php:792
+msgid "Update browser every xx seconds"
msgstr ""
-#: ../../mod/register.php:390
-msgid "Failed to send email message. Here is the message that failed."
+#: ../../mod/settings.php:792
+msgid "Minimum of 10 seconds, no maximum"
msgstr ""
-#: ../../mod/register.php:395
-msgid "Your registration can not be processed."
+#: ../../mod/settings.php:794
+msgid "Security and Privacy Settings"
msgstr ""
-#: ../../mod/register.php:432
-#, php-format
-msgid "Registration request at %s"
+#: ../../mod/settings.php:796
+msgid "Maximum Friend Requests/Day:"
msgstr ""
-#: ../../mod/register.php:441
-msgid "Your registration is pending approval by the site owner."
+#: ../../mod/settings.php:796
+msgid "(to prevent spam abuse)"
msgstr ""
-#: ../../mod/register.php:479
-msgid ""
-"This site has exceeded the number of allowed daily account registrations. "
-"Please try again tomorrow."
+#: ../../mod/settings.php:797
+msgid "Default Post Permissions"
msgstr ""
-#: ../../mod/register.php:505
-msgid ""
-"You may (optionally) fill in this form via OpenID by supplying your OpenID "
-"and clicking 'Register'."
+#: ../../mod/settings.php:798
+msgid "(click to open/close)"
msgstr ""
-#: ../../mod/register.php:506
-msgid ""
-"If you are not familiar with OpenID, please leave that field blank and fill "
-"in the rest of the items."
+#: ../../mod/settings.php:813
+msgid "Notification Settings"
msgstr ""
-#: ../../mod/register.php:507
-msgid "Your OpenID (optional): "
+#: ../../mod/settings.php:814
+msgid "Send a notification email when:"
msgstr ""
-#: ../../mod/register.php:521
-msgid "Include your profile in member directory?"
+#: ../../mod/settings.php:815
+msgid "You receive an introduction"
msgstr ""
-#: ../../mod/register.php:536
-msgid "Membership on this site is by invitation only."
+#: ../../mod/settings.php:816
+msgid "Your introductions are confirmed"
msgstr ""
-#: ../../mod/register.php:537
-msgid "Your invitation ID: "
+#: ../../mod/settings.php:817
+msgid "Someone writes on your profile wall"
msgstr ""
-#: ../../mod/register.php:540 ../../mod/admin.php:297
-msgid "Registration"
+#: ../../mod/settings.php:818
+msgid "Someone writes a followup comment"
msgstr ""
-#: ../../mod/register.php:548
-msgid "Your Full Name (e.g. Joe Smith): "
+#: ../../mod/settings.php:819
+msgid "You receive a private message"
msgstr ""
-#: ../../mod/register.php:549
-msgid "Your Email Address: "
+#: ../../mod/settings.php:820
+msgid "You receive a friend suggestion"
msgstr ""
-#: ../../mod/register.php:550
+#: ../../mod/settings.php:821
+msgid "You are tagged in a post"
+msgstr ""
+
+#: ../../mod/settings.php:824
+msgid "Advanced Page Settings"
+msgstr ""
+
+#: ../../mod/manage.php:90
+msgid "Manage Identities and/or Pages"
+msgstr ""
+
+#: ../../mod/manage.php:93
msgid ""
-"Choose a profile nickname. This must begin with a text character. Your "
-"profile address on this site will then be '<strong>nickname@$sitename</"
-"strong>'."
+"Toggle between different identities or community/group pages which share "
+"your account details or which you have been granted \"manage\" permissions"
msgstr ""
-#: ../../mod/register.php:551
-msgid "Choose a nickname: "
+#: ../../mod/manage.php:95
+msgid "Select an identity to manage: "
msgstr ""
-#: ../../mod/register.php:554 ../../include/nav.php:77 ../../boot.php:684
-msgid "Register"
+#: ../../mod/network.php:43
+msgid "Search Results For:"
msgstr ""
-#: ../../mod/apps.php:4
-msgid "Applications"
+#: ../../mod/network.php:77 ../../mod/search.php:16
+msgid "Remove term"
msgstr ""
-#: ../../mod/apps.php:7
-msgid "No installed applications."
+#: ../../mod/network.php:86 ../../mod/search.php:13
+msgid "Saved Searches"
msgstr ""
-#: ../../mod/hcard.php:10
-msgid "No profile"
+#: ../../mod/network.php:87 ../../include/group.php:216
+msgid "add"
msgstr ""
-#: ../../mod/fsuggest.php:63
-msgid "Friend suggestion sent."
+#: ../../mod/network.php:166
+msgid "Commented Order"
msgstr ""
-#: ../../mod/fsuggest.php:97
-msgid "Suggest Friends"
+#: ../../mod/network.php:171
+msgid "Posted Order"
msgstr ""
-#: ../../mod/fsuggest.php:99
+#: ../../mod/network.php:182
+msgid "New"
+msgstr ""
+
+#: ../../mod/network.php:187
+msgid "Starred"
+msgstr ""
+
+#: ../../mod/network.php:192
+msgid "Bookmarks"
+msgstr ""
+
+#: ../../mod/network.php:250
#, php-format
-msgid "Suggest a friend for %s"
+msgid "Warning: This group contains %s member from an insecure network."
+msgid_plural ""
+"Warning: This group contains %s members from an insecure network."
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../mod/network.php:253
+msgid "Private messages to this group are at risk of public disclosure."
msgstr ""
-#: ../../mod/ping.php:148
-msgid "{0} wants to be your friend"
+#: ../../mod/network.php:304
+msgid "No such group"
msgstr ""
-#: ../../mod/ping.php:153
-msgid "{0} sent you a message"
+#: ../../mod/network.php:315
+msgid "Group is empty"
msgstr ""
-#: ../../mod/ping.php:158
-msgid "{0} requested registration"
+#: ../../mod/network.php:319
+msgid "Group: "
msgstr ""
-#: ../../mod/ping.php:164
-#, php-format
-msgid "{0} commented %s's post"
+#: ../../mod/network.php:329
+msgid "Contact: "
msgstr ""
-#: ../../mod/ping.php:169
-#, php-format
-msgid "{0} liked %s's post"
+#: ../../mod/network.php:331
+msgid "Private messages to this person are at risk of public disclosure."
msgstr ""
-#: ../../mod/ping.php:174
-#, php-format
-msgid "{0} disliked %s's post"
+#: ../../mod/network.php:336
+msgid "Invalid contact."
msgstr ""
-#: ../../mod/ping.php:179
-#, php-format
-msgid "{0} is now friends with %s"
+#: ../../mod/notes.php:44 ../../boot.php:1350
+msgid "Personal Notes"
msgstr ""
-#: ../../mod/ping.php:184
-msgid "{0} posted"
+#: ../../mod/notes.php:63 ../../include/text.php:639
+msgid "Save"
msgstr ""
-#: ../../mod/ping.php:189
-#, php-format
-msgid "{0} tagged %s's post with #%s"
+#: ../../mod/newmember.php:6
+msgid "Welcome to Friendica"
msgstr ""
-#: ../../mod/ping.php:195
-msgid "{0} mentioned you in a post"
+#: ../../mod/newmember.php:8
+msgid "New Member Checklist"
msgstr ""
-#: ../../mod/lostpass.php:16
-msgid "No valid account found."
+#: ../../mod/newmember.php:12
+msgid ""
+"We would like to offer some tips and links to help make your experience "
+"enjoyable. Click any item to visit the relevant page."
msgstr ""
-#: ../../mod/lostpass.php:31
-msgid "Password reset request issued. Check your email."
+#: ../../mod/newmember.php:16
+msgid ""
+"On your <em>Settings</em> page - change your initial password. Also make a "
+"note of your Identity Address. This will be useful in making friends."
msgstr ""
-#: ../../mod/lostpass.php:42
-#, php-format
-msgid "Password reset requested at %s"
+#: ../../mod/newmember.php:18
+msgid ""
+"Review the other settings, particularly the privacy settings. An unpublished "
+"directory listing is like having an unlisted phone number. In general, you "
+"should probably publish your listing - unless all of your friends and "
+"potential friends know exactly how to find you."
msgstr ""
-#: ../../mod/lostpass.php:64
+#: ../../mod/newmember.php:20
msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
+"Upload a profile photo if you have not done so already. Studies have shown "
+"that people with real photos of themselves are ten times more likely to make "
+"friends than people who do not."
msgstr ""
-#: ../../mod/lostpass.php:82 ../../boot.php:714
-msgid "Password Reset"
+#: ../../mod/newmember.php:23
+msgid ""
+"Authorise the Facebook Connector if you currently have a Facebook account "
+"and we will (optionally) import all your Facebook friends and conversations."
msgstr ""
-#: ../../mod/lostpass.php:83
-msgid "Your password has been reset as requested."
+#: ../../mod/newmember.php:28
+msgid ""
+"Enter your email access information on your Connector Settings page if you "
+"wish to import and interact with friends or mailing lists from your email "
+"INBOX"
msgstr ""
-#: ../../mod/lostpass.php:84
-msgid "Your new password is"
+#: ../../mod/newmember.php:30
+msgid ""
+"Edit your <strong>default</strong> profile to your liking. Review the "
+"settings for hiding your list of friends and hiding the profile from unknown "
+"visitors."
msgstr ""
-#: ../../mod/lostpass.php:85
-msgid "Save or copy your new password - and then"
+#: ../../mod/newmember.php:32
+msgid ""
+"Set some public keywords for your default profile which describe your "
+"interests. We may be able to find other people with similar interests and "
+"suggest friendships."
msgstr ""
-#: ../../mod/lostpass.php:86
-msgid "click here to login"
+#: ../../mod/newmember.php:34
+msgid ""
+"Your Contacts page is your gateway to managing friendships and connecting "
+"with friends on other networks. Typically you enter their address or site "
+"URL in the <em>Add New Contact</em> dialog."
msgstr ""
-#: ../../mod/lostpass.php:87
+#: ../../mod/newmember.php:36
msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
+"The Directory page lets you find other people in this network or other "
+"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
+"their profile page. Provide your own Identity Address if requested."
msgstr ""
-#: ../../mod/lostpass.php:118
-msgid "Forgot your Password?"
+#: ../../mod/newmember.php:38
+msgid ""
+"Once you have made some friends, organize them into private conversation "
+"groups from the sidebar of your Contacts page and then you can interact with "
+"each group privately on your Network page."
msgstr ""
-#: ../../mod/lostpass.php:119
+#: ../../mod/newmember.php:40
msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
+"Our <strong>help</strong> pages may be consulted for detail on other program "
+"features and resources."
msgstr ""
-#: ../../mod/lostpass.php:120
-msgid "Nickname or Email: "
+#: ../../mod/attach.php:8
+msgid "Item not available."
msgstr ""
-#: ../../mod/lostpass.php:121
-msgid "Reset"
+#: ../../mod/attach.php:20
+msgid "Item was not found."
msgstr ""
-#: ../../mod/editpost.php:17 ../../mod/editpost.php:27
-msgid "Item not found"
+#: ../../mod/group.php:27
+msgid "Group created."
msgstr ""
-#: ../../mod/editpost.php:32
-msgid "Edit post"
+#: ../../mod/group.php:33
+msgid "Could not create group."
msgstr ""
-#: ../../mod/editpost.php:75 ../../include/conversation.php:848
-msgid "Post to Email"
+#: ../../mod/group.php:43 ../../mod/group.php:123
+msgid "Group not found."
msgstr ""
-#: ../../mod/editpost.php:92 ../../include/conversation.php:865
-msgid "Attach file"
+#: ../../mod/group.php:56
+msgid "Group name changed."
msgstr ""
-#: ../../mod/editpost.php:94
-msgid "Insert YouTube video"
+#: ../../mod/group.php:67 ../../mod/profperm.php:19 ../../index.php:287
+msgid "Permission denied"
msgstr ""
-#: ../../mod/editpost.php:95
-msgid "Insert Vorbis [.ogg] video"
+#: ../../mod/group.php:82
+msgid "Create a group of contacts/friends."
msgstr ""
-#: ../../mod/editpost.php:96
-msgid "Insert Vorbis [.ogg] audio"
+#: ../../mod/group.php:83 ../../mod/group.php:166
+msgid "Group Name: "
msgstr ""
-#: ../../mod/editpost.php:97 ../../include/conversation.php:873
-msgid "Set your location"
+#: ../../mod/group.php:98
+msgid "Group removed."
msgstr ""
-#: ../../mod/editpost.php:98 ../../include/conversation.php:875
-msgid "Clear browser location"
+#: ../../mod/group.php:100
+msgid "Unable to remove group."
msgstr ""
-#: ../../mod/editpost.php:100 ../../include/conversation.php:880
-msgid "Permission settings"
+#: ../../mod/group.php:164 ../../mod/profperm.php:105
+msgid "Click on a contact to add or remove."
msgstr ""
-#: ../../mod/editpost.php:108 ../../include/conversation.php:889
-msgid "CC: email addresses"
+#: ../../mod/group.php:165
+msgid "Group Editor"
msgstr ""
-#: ../../mod/editpost.php:109 ../../include/conversation.php:890
-msgid "Public post"
+#: ../../mod/group.php:179
+msgid "Members"
msgstr ""
-#: ../../mod/editpost.php:111 ../../include/conversation.php:892
-msgid "Example: bob@example.com, mary@example.com"
+#: ../../mod/group.php:194
+msgid "All Contacts"
msgstr ""
-#: ../../mod/removeme.php:42 ../../mod/removeme.php:45
-msgid "Remove My Account"
+#: ../../mod/profperm.php:25 ../../mod/profperm.php:55
+msgid "Invalid profile identifier."
msgstr ""
-#: ../../mod/removeme.php:43
-msgid ""
-"This will completely remove your account. Once this has been done it is not "
-"recoverable."
+#: ../../mod/profperm.php:101
+msgid "Profile Visibility Editor"
msgstr ""
-#: ../../mod/removeme.php:44
-msgid "Please enter your password for verification:"
+#: ../../mod/profperm.php:103 ../../include/profile_advanced.php:7
+#: ../../include/profile_advanced.php:76 ../../include/nav.php:48
+#: ../../boot.php:1332
+msgid "Profile"
msgstr ""
-#: ../../mod/regmod.php:61
-msgid "Account approved."
+#: ../../mod/profperm.php:114
+msgid "Visible To"
msgstr ""
-#: ../../mod/regmod.php:93
-#, php-format
-msgid "Registration revoked for %s"
+#: ../../mod/profperm.php:130
+msgid "All Contacts (with secure profile access)"
msgstr ""
-#: ../../mod/regmod.php:105
-msgid "Please login."
+#: ../../mod/viewcontacts.php:25 ../../include/text.php:578
+msgid "View Contacts"
msgstr ""
-#: ../../mod/install.php:111
-msgid "Friendica Social Communications Server - Setup"
+#: ../../mod/viewcontacts.php:40
+msgid "No contacts."
msgstr ""
-#: ../../mod/install.php:117 ../../mod/install.php:157
-#: ../../mod/install.php:229
-msgid "Database connection"
+#: ../../mod/register.php:62
+msgid "An invitation is required."
msgstr ""
-#: ../../mod/install.php:124
-msgid "Could not connect to database."
+#: ../../mod/register.php:67
+msgid "Invitation could not be verified."
msgstr ""
-#: ../../mod/install.php:128
-msgid "Could not create table."
+#: ../../mod/register.php:75
+msgid "Invalid OpenID url"
msgstr ""
-#: ../../mod/install.php:133
-msgid "Your Friendica site database has been installed."
+#: ../../mod/register.php:90
+msgid "Please enter the required information."
msgstr ""
-#: ../../mod/install.php:134
+#: ../../mod/register.php:104
+msgid "Please use a shorter name."
+msgstr ""
+
+#: ../../mod/register.php:106
+msgid "Name too short."
+msgstr ""
+
+#: ../../mod/register.php:121
+msgid "That doesn't appear to be your full (First Last) name."
+msgstr ""
+
+#: ../../mod/register.php:126
+msgid "Your email domain is not among those allowed on this site."
+msgstr ""
+
+#: ../../mod/register.php:129
+msgid "Not a valid email address."
+msgstr ""
+
+#: ../../mod/register.php:139
+msgid "Cannot use that email."
+msgstr ""
+
+#: ../../mod/register.php:145
msgid ""
-"IMPORTANT: You will need to [manually] setup a scheduled task for the poller."
+"Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and "
+"must also begin with a letter."
msgstr ""
-#: ../../mod/install.php:135 ../../mod/install.php:151
-#: ../../mod/install.php:209
-msgid "Please see the file \"INSTALL.txt\"."
+#: ../../mod/register.php:151 ../../mod/register.php:252
+msgid "Nickname is already registered. Please choose another."
msgstr ""
-#: ../../mod/install.php:137
-msgid "Proceed to registration"
+#: ../../mod/register.php:170
+msgid "SERIOUS ERROR: Generation of security keys failed."
msgstr ""
-#: ../../mod/install.php:143
-msgid "Proceed with Installation"
+#: ../../mod/register.php:238
+msgid "An error occurred during registration. Please try again."
msgstr ""
-#: ../../mod/install.php:150
+#: ../../mod/register.php:274
+msgid "An error occurred creating your default profile. Please try again."
+msgstr ""
+
+#: ../../mod/register.php:378 ../../mod/regmod.php:52
+#, php-format
+msgid "Registration details for %s"
+msgstr ""
+
+#: ../../mod/register.php:386
msgid ""
-"You may need to import the file \"database.sql\" manually using phpmyadmin "
-"or mysql."
+"Registration successful. Please check your email for further instructions."
msgstr ""
-#: ../../mod/install.php:158
-msgid "Database import failed."
+#: ../../mod/register.php:390
+msgid "Failed to send email message. Here is the message that failed."
msgstr ""
-#: ../../mod/install.php:206
-msgid "System check"
+#: ../../mod/register.php:395
+msgid "Your registration can not be processed."
msgstr ""
-#: ../../mod/install.php:210 ../../mod/events.php:213
-msgid "Next"
+#: ../../mod/register.php:432
+#, php-format
+msgid "Registration request at %s"
msgstr ""
-#: ../../mod/install.php:211
-msgid "Check again"
+#: ../../mod/register.php:441
+msgid "Your registration is pending approval by the site owner."
msgstr ""
-#: ../../mod/install.php:230
+#: ../../mod/register.php:479
msgid ""
-"In order to install Friendica we need to know how to connect to your "
-"database."
+"This site has exceeded the number of allowed daily account registrations. "
+"Please try again tomorrow."
msgstr ""
-#: ../../mod/install.php:231
+#: ../../mod/register.php:505
msgid ""
-"Please contact your hosting provider or site administrator if you have "
-"questions about these settings."
+"You may (optionally) fill in this form via OpenID by supplying your OpenID "
+"and clicking 'Register'."
msgstr ""
-#: ../../mod/install.php:232
+#: ../../mod/register.php:506
msgid ""
-"The database you specify below should already exist. If it does not, please "
-"create it before continuing."
+"If you are not familiar with OpenID, please leave that field blank and fill "
+"in the rest of the items."
msgstr ""
-#: ../../mod/install.php:236
-msgid "Database Server Name"
+#: ../../mod/register.php:507
+msgid "Your OpenID (optional): "
msgstr ""
-#: ../../mod/install.php:237
-msgid "Database Login Name"
+#: ../../mod/register.php:521
+msgid "Include your profile in member directory?"
msgstr ""
-#: ../../mod/install.php:238
-msgid "Database Login Password"
+#: ../../mod/register.php:536
+msgid "Membership on this site is by invitation only."
msgstr ""
-#: ../../mod/install.php:239
-msgid "Database Name"
+#: ../../mod/register.php:537
+msgid "Your invitation ID: "
msgstr ""
-#: ../../mod/install.php:240 ../../mod/install.php:279
-msgid "Site administrator email address"
+#: ../../mod/register.php:540 ../../mod/admin.php:297
+msgid "Registration"
+msgstr ""
+
+#: ../../mod/register.php:548
+msgid "Your Full Name (e.g. Joe Smith): "
+msgstr ""
+
+#: ../../mod/register.php:549
+msgid "Your Email Address: "
msgstr ""
-#: ../../mod/install.php:240 ../../mod/install.php:279
+#: ../../mod/register.php:550
msgid ""
-"Your account email address must match this in order to use the web admin "
-"panel."
+"Choose a profile nickname. This must begin with a text character. Your "
+"profile address on this site will then be '<strong>nickname@$sitename</"
+"strong>'."
msgstr ""
-#: ../../mod/install.php:244 ../../mod/install.php:282
-msgid "Please select a default timezone for your website"
+#: ../../mod/register.php:551
+msgid "Choose a nickname: "
msgstr ""
-#: ../../mod/install.php:269
-msgid "Site settings"
+#: ../../mod/register.php:554 ../../include/nav.php:77 ../../boot.php:689
+msgid "Register"
msgstr ""
-#: ../../mod/install.php:322
-msgid "Could not find a command line version of PHP in the web server PATH."
+#: ../../mod/dirfind.php:23
+msgid "People Search"
msgstr ""
-#: ../../mod/install.php:325
-msgid "PHP executable path"
+#: ../../mod/like.php:127 ../../mod/tagger.php:70
+#: ../../addon/facebook/facebook.php:1091
+#: ../../addon/communityhome/communityhome.php:158
+#: ../../addon/communityhome/communityhome.php:167
+#: ../../include/diaspora.php:1587 ../../include/conversation.php:26
+#: ../../include/conversation.php:35 ../../include/conversation.php:99
+#: ../../include/conversation.php:108
+msgid "status"
msgstr ""
-#: ../../mod/install.php:325
-msgid "Enter full path to php executable"
+#: ../../mod/like.php:144 ../../addon/facebook/facebook.php:1095
+#: ../../addon/communityhome/communityhome.php:172
+#: ../../include/diaspora.php:1603 ../../include/conversation.php:43
+#, php-format
+msgid "%1$s likes %2$s's %3$s"
msgstr ""
-#: ../../mod/install.php:330
-msgid "Command line PHP"
+#: ../../mod/like.php:146 ../../include/conversation.php:46
+#, php-format
+msgid "%1$s doesn't like %2$s's %3$s"
msgstr ""
-#: ../../mod/install.php:339
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
+#: ../../mod/notice.php:15 ../../mod/viewsrc.php:15 ../../mod/admin.php:111
+#: ../../mod/admin.php:502 ../../mod/display.php:28 ../../mod/display.php:116
+#: ../../mod/viewd.php:14 ../../include/items.php:2819
+msgid "Item not found."
msgstr ""
-#: ../../mod/install.php:340
-msgid "This is required for message delivery to work."
+#: ../../mod/viewsrc.php:7 ../../mod/viewd.php:6
+msgid "Access denied."
msgstr ""
-#: ../../mod/install.php:342
-msgid "PHP \"register_argc_argv\""
+#: ../../mod/regmod.php:61
+msgid "Account approved."
+msgstr ""
+
+#: ../../mod/regmod.php:93
+#, php-format
+msgid "Registration revoked for %s"
msgstr ""
-#: ../../mod/install.php:363
+#: ../../mod/regmod.php:105
+msgid "Please login."
+msgstr ""
+
+#: ../../mod/item.php:88
+msgid "Unable to locate original post."
+msgstr ""
+
+#: ../../mod/item.php:248
+msgid "Empty post discarded."
+msgstr ""
+
+#: ../../mod/item.php:350 ../../mod/wall_upload.php:81
+#: ../../mod/wall_upload.php:90 ../../mod/wall_upload.php:97
+#: ../../include/message.php:143
+msgid "Wall Photos"
+msgstr ""
+
+#: ../../mod/item.php:827
+msgid "System error. Post not saved."
+msgstr ""
+
+#: ../../mod/item.php:852
+#, php-format
msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
+"This message was sent to you by %s, a member of the Friendica social network."
msgstr ""
-#: ../../mod/install.php:364
+#: ../../mod/item.php:854
+#, php-format
+msgid "You may visit them online at %s"
+msgstr ""
+
+#: ../../mod/item.php:855
msgid ""
-"If running under Windows, please see \"http://www.php.net/manual/en/openssl."
-"installation.php\"."
+"Please contact the sender by replying to this post if you do not wish to "
+"receive these messages."
msgstr ""
-#: ../../mod/install.php:366
-msgid "Generate encryption keys"
+#: ../../mod/item.php:857
+#, php-format
+msgid "%s posted an update."
msgstr ""
-#: ../../mod/install.php:373
-msgid "libCurl PHP module"
+#: ../../mod/profile_photo.php:28
+msgid "Image uploaded but image cropping failed."
msgstr ""
-#: ../../mod/install.php:374
-msgid "GD graphics PHP module"
+#: ../../mod/profile_photo.php:61 ../../mod/profile_photo.php:68
+#: ../../mod/profile_photo.php:75 ../../mod/profile_photo.php:258
+#, php-format
+msgid "Image size reduction [%s] failed."
msgstr ""
-#: ../../mod/install.php:375
-msgid "OpenSSL PHP module"
+#: ../../mod/profile_photo.php:89
+msgid ""
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
msgstr ""
-#: ../../mod/install.php:376
-msgid "mysqli PHP module"
+#: ../../mod/profile_photo.php:99
+msgid "Unable to process image"
msgstr ""
-#: ../../mod/install.php:377
-msgid "mb_string PHP module"
+#: ../../mod/profile_photo.php:113 ../../mod/wall_upload.php:56
+#, php-format
+msgid "Image exceeds size limit of %d"
msgstr ""
-#: ../../mod/install.php:382 ../../mod/install.php:384
-msgid "Apace mod_rewrite module"
+#: ../../mod/profile_photo.php:203
+msgid "Upload File:"
msgstr ""
-#: ../../mod/install.php:382
-msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
+#: ../../mod/profile_photo.php:204
+msgid "Upload Profile Photo"
msgstr ""
-#: ../../mod/install.php:389
-msgid "Error: libCURL PHP module required but not installed."
+#: ../../mod/profile_photo.php:205
+msgid "Upload"
msgstr ""
-#: ../../mod/install.php:393
-msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
+#: ../../mod/profile_photo.php:206
+msgid "skip this step"
msgstr ""
-#: ../../mod/install.php:397
-msgid "Error: openssl PHP module required but not installed."
+#: ../../mod/profile_photo.php:206
+msgid "select a photo from your photo albums"
msgstr ""
-#: ../../mod/install.php:401
-msgid "Error: mysqli PHP module required but not installed."
+#: ../../mod/profile_photo.php:219
+msgid "Crop Image"
msgstr ""
-#: ../../mod/install.php:405
-msgid "Error: mb_string PHP module required but not installed."
+#: ../../mod/profile_photo.php:220
+msgid "Please adjust the image cropping for optimum viewing."
msgstr ""
-#: ../../mod/install.php:422
-msgid ""
-"The web installer needs to be able to create a file called \".htconfig.php\" "
-"in the top folder of your web server and it is unable to do so."
+#: ../../mod/profile_photo.php:221
+msgid "Done Editing"
msgstr ""
-#: ../../mod/install.php:423
-msgid ""
-"This is most often a permission setting, as the web server may not be able "
-"to write files in your folder - even if you can."
+#: ../../mod/profile_photo.php:249
+msgid "Image uploaded successfully."
msgstr ""
-#: ../../mod/install.php:424
-msgid ""
-"Please check with your site documentation or support people to see if this "
-"situation can be corrected."
+#: ../../mod/hcard.php:10
+msgid "No profile"
msgstr ""
-#: ../../mod/install.php:425
+#: ../../mod/removeme.php:45 ../../mod/removeme.php:48
+msgid "Remove My Account"
+msgstr ""
+
+#: ../../mod/removeme.php:46
msgid ""
-"If not, you may be required to perform a manual installation. Please see the "
-"file \"INSTALL.txt\" for instructions."
+"This will completely remove your account. Once this has been done it is not "
+"recoverable."
msgstr ""
-#: ../../mod/install.php:428
-msgid ".htconfig.php is writable"
+#: ../../mod/removeme.php:47
+msgid "Please enter your password for verification:"
msgstr ""
-#: ../../mod/install.php:435
-msgid ""
-"The database configuration file \".htconfig.php\" could not be written. "
-"Please use the enclosed text to create a configuration file in your web "
-"server root."
+#: ../../mod/message.php:23
+msgid "No recipient selected."
msgstr ""
-#: ../../mod/install.php:460
-msgid "Errors encountered creating database tables."
+#: ../../mod/message.php:26
+msgid "Unable to locate contact information."
msgstr ""
-#: ../../mod/community.php:21
-msgid "Not available."
+#: ../../mod/message.php:29
+msgid "Message could not be sent."
msgstr ""
-#: ../../mod/community.php:30 ../../include/nav.php:97
-msgid "Community"
+#: ../../mod/message.php:32
+msgid "Message collection failure."
msgstr ""
-#: ../../mod/community.php:60 ../../mod/search.php:118
-msgid "No results."
+#: ../../mod/message.php:35
+msgid "Message sent."
msgstr ""
-#: ../../mod/community.php:87
-msgid ""
-"Shared content is covered by the <a href=\"http://creativecommons.org/"
-"licenses/by/3.0/\">Creative Commons Attribution 3.0</a> license."
+#: ../../mod/message.php:55
+msgid "Inbox"
msgstr ""
-#: ../../mod/oexchange.php:27
-msgid "Post successful."
+#: ../../mod/message.php:60
+msgid "Outbox"
+msgstr ""
+
+#: ../../mod/message.php:65
+msgid "New Message"
+msgstr ""
+
+#: ../../mod/message.php:91
+msgid "Message deleted."
+msgstr ""
+
+#: ../../mod/message.php:121
+msgid "Conversation removed."
+msgstr ""
+
+#: ../../mod/message.php:137 ../../include/conversation.php:843
+msgid "Please enter a link URL:"
+msgstr ""
+
+#: ../../mod/message.php:145
+msgid "Send Private Message"
+msgstr ""
+
+#: ../../mod/message.php:146 ../../mod/message.php:287
+msgid "To:"
+msgstr ""
+
+#: ../../mod/message.php:147 ../../mod/message.php:288
+msgid "Subject:"
+msgstr ""
+
+#: ../../mod/message.php:150 ../../mod/message.php:291
+#: ../../mod/invite.php:101
+msgid "Your message:"
+msgstr ""
+
+#: ../../mod/message.php:188
+msgid "No messages."
+msgstr ""
+
+#: ../../mod/message.php:201
+msgid "Delete conversation"
+msgstr ""
+
+#: ../../mod/message.php:204
+msgid "D, d M Y - g:i A"
+msgstr ""
+
+#: ../../mod/message.php:239
+msgid "Message not available."
+msgstr ""
+
+#: ../../mod/message.php:276
+msgid "Delete message"
+msgstr ""
+
+#: ../../mod/message.php:286
+msgid "Send Reply"
+msgstr ""
+
+#: ../../mod/allfriends.php:34
+#, php-format
+msgid "Friends of %s"
+msgstr ""
+
+#: ../../mod/allfriends.php:40
+msgid "No friends to display."
msgstr ""
#: ../../mod/admin.php:59 ../../mod/admin.php:295
@@ -2619,7 +2785,7 @@ msgstr ""
msgid "Advanced"
msgstr ""
-#: ../../mod/admin.php:304 ../../addon/statusnet/statusnet.php:477
+#: ../../mod/admin.php:304 ../../addon/statusnet/statusnet.php:486
msgid "Site name"
msgstr ""
@@ -2833,7 +2999,7 @@ msgstr ""
msgid "Toggle"
msgstr ""
-#: ../../mod/admin.php:551 ../../include/nav.php:128
+#: ../../mod/admin.php:551 ../../include/nav.php:129
msgid "Settings"
msgstr ""
@@ -2883,1028 +3049,1342 @@ msgstr ""
msgid "FTP Password"
msgstr ""
-#: ../../mod/suggest.php:38 ../../include/contact_widgets.php:35
-msgid "Friend Suggestions"
+#: ../../mod/profile.php:15 ../../boot.php:841
+msgid "Requested profile is not available."
msgstr ""
-#: ../../mod/suggest.php:44
-msgid ""
-"No suggestions available. If this is a new site, please try again in 24 "
-"hours."
+#: ../../mod/profile.php:111 ../../mod/display.php:66
+msgid "Access to this profile has been restricted."
msgstr ""
-#: ../../mod/suggest.php:59 ../../mod/match.php:58
-#: ../../include/contact_widgets.php:9 ../../boot.php:911
-msgid "Connect"
+#: ../../mod/profile.php:131
+msgid "Tips for New Members"
msgstr ""
-#: ../../mod/suggest.php:61
-msgid "Ignore/Hide"
+#: ../../mod/ping.php:148
+msgid "{0} wants to be your friend"
msgstr ""
-#: ../../mod/display.php:66 ../../mod/profile.php:111
-msgid "Access to this profile has been restricted."
+#: ../../mod/ping.php:153
+msgid "{0} sent you a message"
msgstr ""
-#: ../../mod/display.php:108
-msgid "Item has been removed."
+#: ../../mod/ping.php:158
+msgid "{0} requested registration"
msgstr ""
-#: ../../mod/like.php:144 ../../include/conversation.php:43
-#: ../../include/diaspora.php:1570 ../../addon/facebook/facebook.php:1088
-#: ../../addon/communityhome/communityhome.php:172
+#: ../../mod/ping.php:164
#, php-format
-msgid "%1$s likes %2$s's %3$s"
+msgid "{0} commented %s's post"
msgstr ""
-#: ../../mod/like.php:146 ../../include/conversation.php:46
+#: ../../mod/ping.php:169
#, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
+msgid "{0} liked %s's post"
msgstr ""
-#: ../../mod/match.php:12
-msgid "Profile Match"
+#: ../../mod/ping.php:174
+#, php-format
+msgid "{0} disliked %s's post"
msgstr ""
-#: ../../mod/match.php:20
-msgid "No keywords to match. Please add keywords to your default profile."
+#: ../../mod/ping.php:179
+#, php-format
+msgid "{0} is now friends with %s"
msgstr ""
-#: ../../mod/match.php:57
-msgid "is interested in:"
+#: ../../mod/ping.php:184
+msgid "{0} posted"
msgstr ""
-#: ../../mod/notes.php:44 ../../boot.php:1335
-msgid "Personal Notes"
+#: ../../mod/ping.php:189
+#, php-format
+msgid "{0} tagged %s's post with #%s"
msgstr ""
-#: ../../mod/notes.php:63 ../../include/text.php:635
-msgid "Save"
+#: ../../mod/ping.php:195
+msgid "{0} mentioned you in a post"
msgstr ""
-#: ../../mod/help.php:30
-msgid "Help:"
+#: ../../mod/openid.php:63 ../../mod/openid.php:77 ../../include/auth.php:90
+#: ../../include/auth.php:115 ../../include/auth.php:169
+msgid "Login failed."
msgstr ""
-#: ../../mod/help.php:34 ../../include/nav.php:82
-msgid "Help"
+#: ../../mod/follow.php:27
+msgid "Connect URL missing."
msgstr ""
-#: ../../mod/help.php:38 ../../index.php:221
-msgid "Not Found"
+#: ../../mod/follow.php:47
+msgid ""
+"This site is not configured to allow communications with other networks."
msgstr ""
-#: ../../mod/help.php:41 ../../index.php:224
-msgid "Page not found."
+#: ../../mod/follow.php:48 ../../mod/follow.php:58
+msgid "No compatible communication protocols or feeds were discovered."
msgstr ""
-#: ../../mod/dfrn_confirm.php:236
-msgid "Response from remote site was not understood."
+#: ../../mod/follow.php:56
+msgid "The profile address specified does not provide adequate information."
msgstr ""
-#: ../../mod/dfrn_confirm.php:245
-msgid "Unexpected response from remote site: "
+#: ../../mod/follow.php:60
+msgid "An author or name was not found."
msgstr ""
-#: ../../mod/dfrn_confirm.php:253
-msgid "Confirmation completed successfully."
+#: ../../mod/follow.php:62
+msgid "No browser URL could be matched to this address."
msgstr ""
-#: ../../mod/dfrn_confirm.php:255 ../../mod/dfrn_confirm.php:269
-#: ../../mod/dfrn_confirm.php:276
-msgid "Remote site reported: "
+#: ../../mod/follow.php:69
+msgid ""
+"The profile address specified belongs to a network which has been disabled "
+"on this site."
msgstr ""
-#: ../../mod/dfrn_confirm.php:267
-msgid "Temporary failure. Please wait and try again."
+#: ../../mod/follow.php:74
+msgid ""
+"Limited profile. This person will be unable to receive direct/personal "
+"notifications from you."
msgstr ""
-#: ../../mod/dfrn_confirm.php:274
-msgid "Introduction failed or was revoked."
+#: ../../mod/follow.php:144
+msgid "Unable to retrieve contact information."
msgstr ""
-#: ../../mod/dfrn_confirm.php:416
-msgid "Unable to set contact photo."
+#: ../../mod/follow.php:190
+msgid "following"
msgstr ""
-#: ../../mod/dfrn_confirm.php:466 ../../include/conversation.php:79
-#: ../../include/diaspora.php:495
-#, php-format
-msgid "%1$s is now friends with %2$s"
+#: ../../mod/common.php:34
+msgid "Common Friends"
msgstr ""
-#: ../../mod/dfrn_confirm.php:537
-#, php-format
-msgid "No user record found for '%s' "
+#: ../../mod/common.php:42
+msgid "No friends in common."
msgstr ""
-#: ../../mod/dfrn_confirm.php:547
-msgid "Our site encryption key is apparently messed up."
+#: ../../mod/display.php:109
+msgid "Item has been removed."
msgstr ""
-#: ../../mod/dfrn_confirm.php:558
-msgid "Empty site URL was provided or URL could not be decrypted by us."
+#: ../../mod/apps.php:4
+msgid "Applications"
msgstr ""
-#: ../../mod/dfrn_confirm.php:579
-msgid "Contact record was not found for you on our site."
+#: ../../mod/apps.php:7
+msgid "No installed applications."
msgstr ""
-#: ../../mod/dfrn_confirm.php:593
-#, php-format
-msgid "Site public key not available in contact record for URL %s."
+#: ../../mod/search.php:83
+msgid "Search This Site"
msgstr ""
-#: ../../mod/dfrn_confirm.php:613
-msgid ""
-"The ID provided by your system is a duplicate on our system. It should work "
-"if you try again."
+#: ../../mod/profiles.php:21 ../../mod/profiles.php:239
+#: ../../mod/profiles.php:344 ../../mod/dfrn_confirm.php:62
+msgid "Profile not found."
msgstr ""
-#: ../../mod/dfrn_confirm.php:624
-msgid "Unable to set your contact credentials on our system."
+#: ../../mod/profiles.php:28
+msgid "Profile Name is required."
msgstr ""
-#: ../../mod/dfrn_confirm.php:678
-msgid "Unable to update your contact profile details on our system"
+#: ../../mod/profiles.php:198
+msgid "Profile updated."
msgstr ""
-#: ../../mod/dfrn_confirm.php:708
-#, php-format
-msgid "Connection accepted at %s"
+#: ../../mod/profiles.php:256
+msgid "Profile deleted."
msgstr ""
-#: ../../mod/profile.php:15 ../../boot.php:836
-msgid "Requested profile is not available."
+#: ../../mod/profiles.php:272 ../../mod/profiles.php:303
+msgid "Profile-"
msgstr ""
-#: ../../mod/profile.php:131
-msgid "Tips for New Members"
+#: ../../mod/profiles.php:291 ../../mod/profiles.php:330
+msgid "New profile created."
msgstr ""
-#: ../../mod/item.php:89
-msgid "Unable to locate original post."
+#: ../../mod/profiles.php:309
+msgid "Profile unavailable to clone."
msgstr ""
-#: ../../mod/item.php:206
-msgid "Empty post discarded."
+#: ../../mod/profiles.php:356
+msgid "Hide your contact/friend list from viewers of this profile?"
msgstr ""
-#: ../../mod/item.php:778
-msgid "System error. Post not saved."
+#: ../../mod/profiles.php:374
+msgid "Edit Profile Details"
msgstr ""
-#: ../../mod/item.php:803
-#, php-format
-msgid ""
-"This message was sent to you by %s, a member of the Friendica social network."
+#: ../../mod/profiles.php:376
+msgid "View this profile"
msgstr ""
-#: ../../mod/item.php:805
-#, php-format
-msgid "You may visit them online at %s"
+#: ../../mod/profiles.php:377
+msgid "Create a new profile using these settings"
msgstr ""
-#: ../../mod/item.php:806
-msgid ""
-"Please contact the sender by replying to this post if you do not wish to "
-"receive these messages."
+#: ../../mod/profiles.php:378
+msgid "Clone this profile"
+msgstr ""
+
+#: ../../mod/profiles.php:379
+msgid "Delete this profile"
+msgstr ""
+
+#: ../../mod/profiles.php:380
+msgid "Profile Name:"
+msgstr ""
+
+#: ../../mod/profiles.php:381
+msgid "Your Full Name:"
+msgstr ""
+
+#: ../../mod/profiles.php:382
+msgid "Title/Description:"
+msgstr ""
+
+#: ../../mod/profiles.php:383
+msgid "Your Gender:"
msgstr ""
-#: ../../mod/item.php:808
+#: ../../mod/profiles.php:384
#, php-format
-msgid "%s posted an update."
+msgid "Birthday (%s):"
msgstr ""
-#: ../../mod/search.php:13 ../../mod/network.php:84
-msgid "Saved Searches"
+#: ../../mod/profiles.php:385
+msgid "Street Address:"
msgstr ""
-#: ../../mod/search.php:16 ../../mod/network.php:75
-msgid "Remove term"
+#: ../../mod/profiles.php:386
+msgid "Locality/City:"
msgstr ""
-#: ../../mod/search.php:83
-msgid "Search This Site"
+#: ../../mod/profiles.php:387
+msgid "Postal/Zip Code:"
msgstr ""
-#: ../../mod/photos.php:42
-msgid "Photo Albums"
+#: ../../mod/profiles.php:388
+msgid "Country:"
msgstr ""
-#: ../../mod/photos.php:50 ../../mod/photos.php:146 ../../mod/photos.php:868
-#: ../../mod/photos.php:938 ../../mod/photos.php:953 ../../mod/photos.php:1354
-#: ../../mod/photos.php:1366 ../../addon/communityhome/communityhome.php:110
-msgid "Contact Photos"
+#: ../../mod/profiles.php:389
+msgid "Region/State:"
msgstr ""
-#: ../../mod/photos.php:135
-msgid "Contact information unavailable"
+#: ../../mod/profiles.php:390
+msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
msgstr ""
-#: ../../mod/photos.php:156
-msgid "Album not found."
+#: ../../mod/profiles.php:391
+msgid "Who: (if applicable)"
msgstr ""
-#: ../../mod/photos.php:174 ../../mod/photos.php:947
-msgid "Delete Album"
+#: ../../mod/profiles.php:392
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
msgstr ""
-#: ../../mod/photos.php:237 ../../mod/photos.php:1166
-msgid "Delete Photo"
+#: ../../mod/profiles.php:393 ../../include/profile_advanced.php:43
+msgid "Sexual Preference:"
msgstr ""
-#: ../../mod/photos.php:524
-msgid "was tagged in a"
+#: ../../mod/profiles.php:394
+msgid "Homepage URL:"
msgstr ""
-#: ../../mod/photos.php:524
-msgid "by"
+#: ../../mod/profiles.php:395 ../../include/profile_advanced.php:49
+msgid "Political Views:"
msgstr ""
-#: ../../mod/photos.php:627 ../../addon/js_upload/js_upload.php:312
-msgid "Image exceeds size limit of "
+#: ../../mod/profiles.php:396
+msgid "Religious Views:"
msgstr ""
-#: ../../mod/photos.php:635
-msgid "Image file is empty."
+#: ../../mod/profiles.php:397
+msgid "Public Keywords:"
msgstr ""
-#: ../../mod/photos.php:764
-msgid "No photos selected"
+#: ../../mod/profiles.php:398
+msgid "Private Keywords:"
msgstr ""
-#: ../../mod/photos.php:841
-msgid "Access to this item is restricted."
+#: ../../mod/profiles.php:399
+msgid "Example: fishing photography software"
msgstr ""
-#: ../../mod/photos.php:895
-msgid "Upload Photos"
+#: ../../mod/profiles.php:400
+msgid "(Used for suggesting potential friends, can be seen by others)"
msgstr ""
-#: ../../mod/photos.php:898 ../../mod/photos.php:942
-msgid "New album name: "
+#: ../../mod/profiles.php:401
+msgid "(Used for searching profiles, never shown to others)"
msgstr ""
-#: ../../mod/photos.php:899
-msgid "or existing album name: "
+#: ../../mod/profiles.php:402
+msgid "Tell us about yourself..."
msgstr ""
-#: ../../mod/photos.php:900
-msgid "Do not show a status post for this upload"
+#: ../../mod/profiles.php:403
+msgid "Hobbies/Interests"
msgstr ""
-#: ../../mod/photos.php:902 ../../mod/photos.php:1161
-msgid "Permissions"
+#: ../../mod/profiles.php:404
+msgid "Contact information and Social Networks"
msgstr ""
-#: ../../mod/photos.php:957
-msgid "Edit Album"
+#: ../../mod/profiles.php:405
+msgid "Musical interests"
msgstr ""
-#: ../../mod/photos.php:967 ../../mod/photos.php:1379
-msgid "View Photo"
+#: ../../mod/profiles.php:406
+msgid "Books, literature"
msgstr ""
-#: ../../mod/photos.php:1002
-msgid "Permission denied. Access to this item may be restricted."
+#: ../../mod/profiles.php:407
+msgid "Television"
msgstr ""
-#: ../../mod/photos.php:1004
-msgid "Photo not available"
+#: ../../mod/profiles.php:408
+msgid "Film/dance/culture/entertainment"
msgstr ""
-#: ../../mod/photos.php:1054
-msgid "View photo"
+#: ../../mod/profiles.php:409
+msgid "Love/romance"
msgstr ""
-#: ../../mod/photos.php:1054
-msgid "Edit photo"
+#: ../../mod/profiles.php:410
+msgid "Work/employment"
msgstr ""
-#: ../../mod/photos.php:1055
-msgid "Use as profile photo"
+#: ../../mod/profiles.php:411
+msgid "School/education"
msgstr ""
-#: ../../mod/photos.php:1061 ../../include/conversation.php:423
-msgid "Private Message"
+#: ../../mod/profiles.php:416
+msgid ""
+"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
+"be visible to anybody using the internet."
msgstr ""
-#: ../../mod/photos.php:1072
-msgid "View Full Size"
+#: ../../mod/profiles.php:426 ../../mod/directory.php:122
+msgid "Age: "
msgstr ""
-#: ../../mod/photos.php:1140
-msgid "Tags: "
+#: ../../mod/profiles.php:461
+msgid "Edit/Manage Profiles"
msgstr ""
-#: ../../mod/photos.php:1143
-msgid "[Remove any tag]"
+#: ../../mod/profiles.php:462 ../../boot.php:942
+msgid "Change profile photo"
msgstr ""
-#: ../../mod/photos.php:1154
-msgid "New album name"
+#: ../../mod/profiles.php:463 ../../boot.php:943
+msgid "Create New Profile"
msgstr ""
-#: ../../mod/photos.php:1157
-msgid "Caption"
+#: ../../mod/profiles.php:473 ../../boot.php:953
+msgid "Profile Image"
msgstr ""
-#: ../../mod/photos.php:1159
-msgid "Add a Tag"
+#: ../../mod/profiles.php:475 ../../boot.php:956
+msgid "visible to everybody"
msgstr ""
-#: ../../mod/photos.php:1163
-msgid "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+#: ../../mod/profiles.php:476 ../../boot.php:957
+msgid "Edit visibility"
msgstr ""
-#: ../../mod/photos.php:1183 ../../include/conversation.php:470
-msgid "I like this (toggle)"
+#: ../../mod/tagger.php:103 ../../include/conversation.php:116
+#, php-format
+msgid "%1$s tagged %2$s's %3$s with %4$s"
msgstr ""
-#: ../../mod/photos.php:1184 ../../include/conversation.php:471
-msgid "I don't like this (toggle)"
+#: ../../mod/delegate.php:95
+msgid "No potential page delegates located."
msgstr ""
-#: ../../mod/photos.php:1185 ../../include/conversation.php:862
-msgid "Share"
+#: ../../mod/delegate.php:121
+msgid "Delegate Page Management"
msgstr ""
-#: ../../mod/photos.php:1202 ../../mod/photos.php:1242
-#: ../../mod/photos.php:1273 ../../include/conversation.php:485
-msgid "This is you"
+#: ../../mod/delegate.php:123
+msgid ""
+"Delegates are able to manage all aspects of this account/page except for "
+"basic account settings. Please do not delegate your personal account to "
+"anybody that you do not trust completely."
msgstr ""
-#: ../../mod/photos.php:1204 ../../mod/photos.php:1244
-#: ../../mod/photos.php:1275 ../../include/conversation.php:487
-#: ../../boot.php:438
-msgid "Comment"
+#: ../../mod/delegate.php:124
+msgid "Existing Page Managers"
msgstr ""
-#: ../../mod/photos.php:1206 ../../include/conversation.php:489
-#: ../../include/conversation.php:897
-msgid "Preview"
+#: ../../mod/delegate.php:126
+msgid "Existing Page Delegates"
msgstr ""
-#: ../../mod/photos.php:1385
-msgid "View Album"
+#: ../../mod/delegate.php:128
+msgid "Potential Delegates"
msgstr ""
-#: ../../mod/photos.php:1394
-msgid "Recent Photos"
+#: ../../mod/delegate.php:131
+msgid "Add"
msgstr ""
-#: ../../mod/photos.php:1396
-msgid "Upload New Photos"
+#: ../../mod/delegate.php:132
+msgid "No entries."
msgstr ""
-#: ../../mod/network.php:43
-msgid "Search Results For:"
+#: ../../mod/suggest.php:38 ../../include/contact_widgets.php:35
+msgid "Friend Suggestions"
msgstr ""
-#: ../../mod/network.php:85 ../../include/group.php:216
-msgid "add"
+#: ../../mod/suggest.php:44
+msgid ""
+"No suggestions available. If this is a new site, please try again in 24 "
+"hours."
msgstr ""
-#: ../../mod/network.php:158
-msgid "Commented Order"
+#: ../../mod/suggest.php:61
+msgid "Ignore/Hide"
msgstr ""
-#: ../../mod/network.php:163
-msgid "Posted Order"
+#: ../../mod/directory.php:49
+msgid "Global Directory"
msgstr ""
-#: ../../mod/network.php:174
-msgid "New"
+#: ../../mod/directory.php:55
+msgid "Normal site view"
msgstr ""
-#: ../../mod/network.php:179
-msgid "Starred"
+#: ../../mod/directory.php:57
+msgid "Admin - View all site entries"
msgstr ""
-#: ../../mod/network.php:184
-msgid "Bookmarks"
+#: ../../mod/directory.php:63
+msgid "Find on this site"
+msgstr ""
+
+#: ../../mod/directory.php:66
+msgid "Site Directory"
+msgstr ""
+
+#: ../../mod/directory.php:125
+msgid "Gender: "
+msgstr ""
+
+#: ../../mod/directory.php:151
+msgid "No entries (some entries may be hidden)."
msgstr ""
-#: ../../mod/network.php:232
+#: ../../mod/invite.php:35
#, php-format
-msgid "Warning: This group contains %s member from an insecure network."
-msgid_plural ""
-"Warning: This group contains %s members from an insecure network."
+msgid "%s : Not a valid email address."
+msgstr ""
+
+#: ../../mod/invite.php:59
+#, php-format
+msgid "Please join my network on %s"
+msgstr ""
+
+#: ../../mod/invite.php:69
+#, php-format
+msgid "%s : Message delivery failed."
+msgstr ""
+
+#: ../../mod/invite.php:73
+#, php-format
+msgid "%d message sent."
+msgid_plural "%d messages sent."
msgstr[0] ""
msgstr[1] ""
-#: ../../mod/network.php:235
-msgid "Private messages to this group are at risk of public disclosure."
+#: ../../mod/invite.php:92
+msgid "You have no more invitations available"
msgstr ""
-#: ../../mod/network.php:286
-msgid "No such group"
+#: ../../mod/invite.php:99
+msgid "Send invitations"
msgstr ""
-#: ../../mod/network.php:297
-msgid "Group is empty"
+#: ../../mod/invite.php:100
+msgid "Enter email addresses, one per line:"
msgstr ""
-#: ../../mod/network.php:301
-msgid "Group: "
+#: ../../mod/invite.php:102
+#, php-format
+msgid "Please join my social network on %s"
msgstr ""
-#: ../../mod/network.php:311
-msgid "Contact: "
+#: ../../mod/invite.php:103
+msgid "To accept this invitation, please visit:"
msgstr ""
-#: ../../mod/network.php:313
-msgid "Private messages to this person are at risk of public disclosure."
+#: ../../mod/invite.php:104
+msgid "You will need to supply this invitation code: $invite_code"
msgstr ""
-#: ../../mod/network.php:318
-msgid "Invalid contact."
+#: ../../mod/invite.php:104
+msgid ""
+"Once you have registered, please connect with me via my profile page at:"
msgstr ""
-#: ../../mod/api.php:76 ../../mod/api.php:102
-msgid "Authorize application connection"
+#: ../../mod/dfrn_confirm.php:238
+msgid "Response from remote site was not understood."
msgstr ""
-#: ../../mod/api.php:77
-msgid "Return to your app and insert this Securty Code:"
+#: ../../mod/dfrn_confirm.php:247
+msgid "Unexpected response from remote site: "
msgstr ""
-#: ../../mod/api.php:89
-msgid "Please login to continue."
+#: ../../mod/dfrn_confirm.php:255
+msgid "Confirmation completed successfully."
msgstr ""
-#: ../../mod/api.php:104
+#: ../../mod/dfrn_confirm.php:257 ../../mod/dfrn_confirm.php:271
+#: ../../mod/dfrn_confirm.php:278
+msgid "Remote site reported: "
+msgstr ""
+
+#: ../../mod/dfrn_confirm.php:269
+msgid "Temporary failure. Please wait and try again."
+msgstr ""
+
+#: ../../mod/dfrn_confirm.php:276
+msgid "Introduction failed or was revoked."
+msgstr ""
+
+#: ../../mod/dfrn_confirm.php:421
+msgid "Unable to set contact photo."
+msgstr ""
+
+#: ../../mod/dfrn_confirm.php:473 ../../include/diaspora.php:495
+#: ../../include/conversation.php:79
+#, php-format
+msgid "%1$s is now friends with %2$s"
+msgstr ""
+
+#: ../../mod/dfrn_confirm.php:543
+#, php-format
+msgid "No user record found for '%s' "
+msgstr ""
+
+#: ../../mod/dfrn_confirm.php:553
+msgid "Our site encryption key is apparently messed up."
+msgstr ""
+
+#: ../../mod/dfrn_confirm.php:564
+msgid "Empty site URL was provided or URL could not be decrypted by us."
+msgstr ""
+
+#: ../../mod/dfrn_confirm.php:585
+msgid "Contact record was not found for you on our site."
+msgstr ""
+
+#: ../../mod/dfrn_confirm.php:599
+#, php-format
+msgid "Site public key not available in contact record for URL %s."
+msgstr ""
+
+#: ../../mod/dfrn_confirm.php:619
msgid ""
-"Do you want to authorize this application to access your posts and contacts, "
-"and/or create new posts for you?"
+"The ID provided by your system is a duplicate on our system. It should work "
+"if you try again."
msgstr ""
-#: ../../mod/friendica.php:43
-msgid "This is Friendica, version"
+#: ../../mod/dfrn_confirm.php:630
+msgid "Unable to set your contact credentials on our system."
msgstr ""
-#: ../../mod/friendica.php:44
-msgid "running at web location"
+#: ../../mod/dfrn_confirm.php:684
+msgid "Unable to update your contact profile details on our system"
msgstr ""
-#: ../../mod/friendica.php:46
+#: ../../mod/dfrn_confirm.php:714
+#, php-format
+msgid "Connection accepted at %s"
+msgstr ""
+
+#: ../../addon/facebook/facebook.php:337
+msgid "Facebook disabled"
+msgstr ""
+
+#: ../../addon/facebook/facebook.php:342
+msgid "Updating contacts"
+msgstr ""
+
+#: ../../addon/facebook/facebook.php:351
+msgid "Facebook API key is missing."
+msgstr ""
+
+#: ../../addon/facebook/facebook.php:358
+msgid "Facebook Connect"
+msgstr ""
+
+#: ../../addon/facebook/facebook.php:364
+msgid "Install Facebook connector for this account."
+msgstr ""
+
+#: ../../addon/facebook/facebook.php:371
+msgid "Remove Facebook connector"
+msgstr ""
+
+#: ../../addon/facebook/facebook.php:376
msgid ""
-"Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn "
-"more about the Friendica project."
+"Re-authenticate [This is necessary whenever your Facebook password is "
+"changed.]"
msgstr ""
-#: ../../mod/friendica.php:48
-msgid "Bug reports and issues: please visit"
+#: ../../addon/facebook/facebook.php:383
+msgid "Post to Facebook by default"
msgstr ""
-#: ../../mod/friendica.php:49
+#: ../../addon/facebook/facebook.php:387
+msgid "Link all your Facebook friends and conversations on this website"
+msgstr ""
+
+#: ../../addon/facebook/facebook.php:389
msgid ""
-"Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - "
-"dot com"
+"Facebook conversations consist of your <em>profile wall</em> and your friend "
+"<em>stream</em>."
msgstr ""
-#: ../../mod/friendica.php:54
-msgid "Installed plugins/addons/apps"
+#: ../../addon/facebook/facebook.php:390
+msgid "On this website, your Facebook friend stream is only visible to you."
msgstr ""
-#: ../../mod/friendica.php:62
-msgid "No installed plugins/addons/apps"
+#: ../../addon/facebook/facebook.php:391
+msgid ""
+"The following settings determine the privacy of your Facebook profile wall "
+"on this website."
msgstr ""
-#: ../../mod/attach.php:8
-msgid "Item not available."
+#: ../../addon/facebook/facebook.php:395
+msgid ""
+"On this website your Facebook profile wall conversations will only be "
+"visible to you"
msgstr ""
-#: ../../mod/attach.php:20
-msgid "Item was not found."
+#: ../../addon/facebook/facebook.php:400
+msgid "Do not import your Facebook profile wall conversations"
msgstr ""
-#: ../../mod/viewcontacts.php:25 ../../include/text.php:574
-msgid "View Contacts"
+#: ../../addon/facebook/facebook.php:402
+msgid ""
+"If you choose to link conversations and leave both of these boxes unchecked, "
+"your Facebook profile wall will be merged with your profile wall on this "
+"website and your privacy settings on this website will be used to determine "
+"who may see the conversations."
msgstr ""
-#: ../../mod/viewcontacts.php:40
-msgid "No contacts."
+#: ../../addon/facebook/facebook.php:407
+msgid "Comma separated applications to ignore"
msgstr ""
-#: ../../mod/tagrm.php:41
-msgid "Tag removed"
+#: ../../addon/facebook/facebook.php:475
+#: ../../include/contact_selectors.php:81
+msgid "Facebook"
msgstr ""
-#: ../../mod/tagrm.php:79
-msgid "Remove Item Tag"
+#: ../../addon/facebook/facebook.php:476
+msgid "Facebook Connector Settings"
msgstr ""
-#: ../../mod/tagrm.php:81
-msgid "Select a tag to remove: "
+#: ../../addon/facebook/facebook.php:490
+msgid "Post to Facebook"
msgstr ""
-#: ../../mod/tagrm.php:93
-msgid "Remove"
+#: ../../addon/facebook/facebook.php:581
+msgid ""
+"Post to Facebook cancelled because of multi-network access permission "
+"conflict."
msgstr ""
-#: ../../mod/group.php:27
-msgid "Group created."
+#: ../../addon/facebook/facebook.php:650
+msgid "Image: "
msgstr ""
-#: ../../mod/group.php:33
-msgid "Could not create group."
+#: ../../addon/facebook/facebook.php:727
+msgid "View on Friendica"
msgstr ""
-#: ../../mod/group.php:43 ../../mod/group.php:123
-msgid "Group not found."
+#: ../../addon/facebook/facebook.php:751
+msgid "Facebook post failed. Queued for retry."
msgstr ""
-#: ../../mod/group.php:56
-msgid "Group name changed."
+#: ../../addon/facebook/facebook.php:876 ../../addon/facebook/facebook.php:885
+#: ../../include/bb2diaspora.php:113
+msgid "link"
msgstr ""
-#: ../../mod/group.php:67 ../../mod/profperm.php:19 ../../index.php:287
-msgid "Permission denied"
+#: ../../addon/widgets/widget_like.php:58
+#, php-format
+msgid "%d person likes this"
+msgid_plural "%d people like this"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../addon/widgets/widget_like.php:61
+#, php-format
+msgid "%d person doesn't like this"
+msgid_plural "%d people don't like this"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../addon/widgets/widgets.php:55
+msgid "Generate new key"
msgstr ""
-#: ../../mod/group.php:82
-msgid "Create a group of contacts/friends."
+#: ../../addon/widgets/widgets.php:58
+msgid "Widgets key"
msgstr ""
-#: ../../mod/group.php:83 ../../mod/group.php:166
-msgid "Group Name: "
+#: ../../addon/widgets/widgets.php:60
+msgid "Widgets available"
msgstr ""
-#: ../../mod/group.php:98
-msgid "Group removed."
+#: ../../addon/widgets/widget_friends.php:40
+msgid "Connect on Friendica!"
msgstr ""
-#: ../../mod/group.php:100
-msgid "Unable to remove group."
+#: ../../addon/yourls/yourls.php:55
+msgid "YourLS Settings"
msgstr ""
-#: ../../mod/group.php:164 ../../mod/profperm.php:105
-msgid "Click on a contact to add or remove."
+#: ../../addon/yourls/yourls.php:57
+msgid "URL: http://"
msgstr ""
-#: ../../mod/group.php:165
-msgid "Group Editor"
+#: ../../addon/yourls/yourls.php:62
+msgid "Username:"
msgstr ""
-#: ../../mod/group.php:179
-msgid "Members"
+#: ../../addon/yourls/yourls.php:67
+msgid "Password:"
msgstr ""
-#: ../../mod/group.php:194
-msgid "All Contacts"
+#: ../../addon/yourls/yourls.php:72
+msgid "Use SSL "
msgstr ""
-#: ../../mod/events.php:61
-msgid "Event description and start time are required."
+#: ../../addon/yourls/yourls.php:92
+msgid "yourls Settings saved."
msgstr ""
-#: ../../mod/events.php:117 ../../include/nav.php:50 ../../boot.php:1330
-msgid "Events"
+#: ../../addon/nsfw/nsfw.php:47
+msgid "\"Not Safe For Work\" Settings"
msgstr ""
-#: ../../mod/events.php:207
-msgid "Create New Event"
+#: ../../addon/nsfw/nsfw.php:50
+msgid "Enable NSFW filter"
msgstr ""
-#: ../../mod/events.php:210
-msgid "Previous"
+#: ../../addon/nsfw/nsfw.php:53
+msgid "Comma separated words to treat as NSFW"
msgstr ""
-#: ../../mod/events.php:220
-msgid "l, F j"
+#: ../../addon/nsfw/nsfw.php:58
+msgid "Use /expression/ to provide regular expressions"
msgstr ""
-#: ../../mod/events.php:235
-msgid "Edit event"
+#: ../../addon/nsfw/nsfw.php:74
+msgid "NSFW Settings saved."
msgstr ""
-#: ../../mod/events.php:237 ../../include/text.php:867
-msgid "link to source"
+#: ../../addon/nsfw/nsfw.php:120
+#, php-format
+msgid "%s - Click to open/close"
msgstr ""
-#: ../../mod/events.php:305
-msgid "hour:minute"
+#: ../../addon/communityhome/communityhome.php:28
+#: ../../addon/communityhome/communityhome.php:34 ../../include/nav.php:62
+#: ../../boot.php:706
+msgid "Login"
msgstr ""
-#: ../../mod/events.php:314
-msgid "Event details"
+#: ../../addon/communityhome/communityhome.php:29
+msgid "OpenID"
msgstr ""
-#: ../../mod/events.php:315
+#: ../../addon/communityhome/communityhome.php:38
+msgid "Last users"
+msgstr ""
+
+#: ../../addon/communityhome/communityhome.php:81
+msgid "Most active users"
+msgstr ""
+
+#: ../../addon/communityhome/communityhome.php:98
+msgid "Last photos"
+msgstr ""
+
+#: ../../addon/communityhome/communityhome.php:133
+msgid "Last likes"
+msgstr ""
+
+#: ../../addon/communityhome/communityhome.php:155
+#: ../../include/conversation.php:23 ../../include/conversation.php:96
+msgid "event"
+msgstr ""
+
+#: ../../addon/uhremotestorage/uhremotestorage.php:84
#, php-format
-msgid "Format is %s %s. Starting date and Description are required."
+msgid ""
+"Allow to use your friendica id (%s) to connecto to external unhosted-enabled "
+"storage (like ownCloud). See <a href=\"http://www.w3.org/community/unhosted/"
+"wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>"
msgstr ""
-#: ../../mod/events.php:316
-msgid "Event Starts:"
+#: ../../addon/uhremotestorage/uhremotestorage.php:85
+msgid "Template URL (with {category})"
msgstr ""
-#: ../../mod/events.php:319
-msgid "Finish date/time is not known or not relevant"
+#: ../../addon/uhremotestorage/uhremotestorage.php:86
+msgid "OAuth end-point"
msgstr ""
-#: ../../mod/events.php:321
-msgid "Event Finishes:"
+#: ../../addon/uhremotestorage/uhremotestorage.php:87
+msgid "Api"
msgstr ""
-#: ../../mod/events.php:324
-msgid "Adjust for viewer timezone"
+#: ../../addon/membersince/membersince.php:18
+msgid "Member since:"
msgstr ""
-#: ../../mod/events.php:326
-msgid "Description:"
+#: ../../addon/tictac/tictac.php:20
+msgid "Three Dimensional Tic-Tac-Toe"
msgstr ""
-#: ../../mod/events.php:328 ../../include/event.php:37
-#: ../../include/bb2diaspora.php:259 ../../boot.php:961
-msgid "Location:"
+#: ../../addon/tictac/tictac.php:53
+msgid "3D Tic-Tac-Toe"
msgstr ""
-#: ../../mod/events.php:330
-msgid "Share this event"
+#: ../../addon/tictac/tictac.php:58
+msgid "New game"
msgstr ""
-#: ../../mod/profperm.php:25 ../../mod/profperm.php:55
-msgid "Invalid profile identifier."
+#: ../../addon/tictac/tictac.php:59
+msgid "New game with handicap"
msgstr ""
-#: ../../mod/profperm.php:101
-msgid "Profile Visibility Editor"
+#: ../../addon/tictac/tictac.php:60
+msgid ""
+"Three dimensional tic-tac-toe is just like the traditional game except that "
+"it is played on multiple levels simultaneously. "
msgstr ""
-#: ../../mod/profperm.php:103 ../../include/nav.php:48
-#: ../../include/profile_advanced.php:7 ../../include/profile_advanced.php:74
-#: ../../boot.php:1317
-msgid "Profile"
+#: ../../addon/tictac/tictac.php:61
+msgid ""
+"In this case there are three levels. You win by getting three in a row on "
+"any level, as well as up, down, and diagonally across the different levels."
msgstr ""
-#: ../../mod/profperm.php:114
-msgid "Visible To"
+#: ../../addon/tictac/tictac.php:63
+msgid ""
+"The handicap game disables the center position on the middle level because "
+"the player claiming this square often has an unfair advantage."
msgstr ""
-#: ../../mod/profperm.php:130
-msgid "All Contacts (with secure profile access)"
+#: ../../addon/tictac/tictac.php:182
+msgid "You go first..."
msgstr ""
-#: ../../mod/dfrn_poll.php:90 ../../mod/dfrn_poll.php:516
-#, php-format
-msgid "%s welcomes %s"
+#: ../../addon/tictac/tictac.php:187
+msgid "I'm going first this time..."
msgstr ""
-#: ../../mod/lockview.php:39
-msgid "Remote privacy information not available."
+#: ../../addon/tictac/tictac.php:193
+msgid "You won!"
msgstr ""
-#: ../../mod/lockview.php:43
-msgid "Visible to:"
+#: ../../addon/tictac/tictac.php:199 ../../addon/tictac/tictac.php:224
+msgid "\"Cat\" game!"
msgstr ""
-#: ../../mod/home.php:26 ../../addon/communityhome/communityhome.php:179
-#, php-format
-msgid "Welcome to %s"
+#: ../../addon/tictac/tictac.php:222
+msgid "I won!"
msgstr ""
-#: ../../include/datetime.php:43 ../../include/datetime.php:45
-msgid "Miscellaneous"
+#: ../../addon/randplace/randplace.php:171
+msgid "Randplace Settings"
msgstr ""
-#: ../../include/datetime.php:121 ../../include/datetime.php:253
-msgid "year"
+#: ../../addon/randplace/randplace.php:173
+msgid "Enable Randplace Plugin"
msgstr ""
-#: ../../include/datetime.php:126 ../../include/datetime.php:254
-msgid "month"
+#: ../../addon/drpost/drpost.php:35
+msgid "Post to Drupal"
msgstr ""
-#: ../../include/datetime.php:131 ../../include/datetime.php:256
-msgid "day"
+#: ../../addon/drpost/drpost.php:72
+msgid "Drupal Post Settings"
msgstr ""
-#: ../../include/datetime.php:244
-msgid "never"
+#: ../../addon/drpost/drpost.php:74
+msgid "Enable Drupal Post Plugin"
msgstr ""
-#: ../../include/datetime.php:250
-msgid "less than a second ago"
+#: ../../addon/drpost/drpost.php:79
+msgid "Drupal username"
msgstr ""
-#: ../../include/datetime.php:253
-msgid "years"
+#: ../../addon/drpost/drpost.php:84
+msgid "Drupal password"
msgstr ""
-#: ../../include/datetime.php:254
-msgid "months"
+#: ../../addon/drpost/drpost.php:89
+msgid "Post Type - article,page,or blog"
msgstr ""
-#: ../../include/datetime.php:255
-msgid "week"
+#: ../../addon/drpost/drpost.php:94
+msgid "Drupal site URL"
msgstr ""
-#: ../../include/datetime.php:255
-msgid "weeks"
+#: ../../addon/drpost/drpost.php:99
+msgid "Drupal site uses clean URLS"
msgstr ""
-#: ../../include/datetime.php:256
-msgid "days"
+#: ../../addon/drpost/drpost.php:104
+msgid "Post to Drupal by default"
msgstr ""
-#: ../../include/datetime.php:257
-msgid "hour"
+#: ../../addon/drpost/drpost.php:184 ../../addon/wppost/wppost.php:172
+#: ../../addon/posterous/posterous.php:173
+msgid "Post from Friendica"
msgstr ""
-#: ../../include/datetime.php:257
-msgid "hours"
+#: ../../addon/geonames/geonames.php:143
+msgid "Geonames settings updated."
msgstr ""
-#: ../../include/datetime.php:258
-msgid "minute"
+#: ../../addon/geonames/geonames.php:179
+msgid "Geonames Settings"
msgstr ""
-#: ../../include/datetime.php:258
-msgid "minutes"
+#: ../../addon/geonames/geonames.php:181
+msgid "Enable Geonames Plugin"
msgstr ""
-#: ../../include/datetime.php:259
-msgid "second"
+#: ../../addon/js_upload/js_upload.php:43
+msgid "Upload a file"
msgstr ""
-#: ../../include/datetime.php:259
-msgid "seconds"
+#: ../../addon/js_upload/js_upload.php:44
+msgid "Drop files here to upload"
msgstr ""
-#: ../../include/datetime.php:266
-msgid " ago"
+#: ../../addon/js_upload/js_upload.php:46
+msgid "Failed"
msgstr ""
-#: ../../include/datetime.php:437 ../../include/profile_advanced.php:30
-#: ../../include/items.php:1285
-msgid "Birthday:"
+#: ../../addon/js_upload/js_upload.php:294
+msgid "No files were uploaded."
msgstr ""
-#: ../../include/dba.php:39
-#, php-format
-msgid "Cannot locate DNS info for database server '%s'"
+#: ../../addon/js_upload/js_upload.php:300
+msgid "Uploaded file is empty"
msgstr ""
-#: ../../include/text.php:232
-msgid "prev"
+#: ../../addon/js_upload/js_upload.php:323
+msgid "File has an invalid extension, it should be one of "
msgstr ""
-#: ../../include/text.php:234
-msgid "first"
+#: ../../addon/js_upload/js_upload.php:334
+msgid "Upload was cancelled, or server error encountered"
msgstr ""
-#: ../../include/text.php:263
-msgid "last"
+#: ../../addon/oembed.old/oembed.php:30
+msgid "OEmbed settings updated"
msgstr ""
-#: ../../include/text.php:266
-msgid "next"
+#: ../../addon/oembed.old/oembed.php:43
+msgid "Use OEmbed for YouTube videos"
msgstr ""
-#: ../../include/text.php:553
-msgid "No contacts"
+#: ../../addon/oembed.old/oembed.php:71
+msgid "URL to embed:"
+msgstr ""
+
+#: ../../addon/impressum/impressum.php:25
+msgid "Impressum"
msgstr ""
-#: ../../include/text.php:562
+#: ../../addon/impressum/impressum.php:38
+#: ../../addon/impressum/impressum.php:40
+#: ../../addon/impressum/impressum.php:70
+msgid "Site Owner"
+msgstr ""
+
+#: ../../addon/impressum/impressum.php:38
+#: ../../addon/impressum/impressum.php:74
+msgid "Email Address"
+msgstr ""
+
+#: ../../addon/impressum/impressum.php:43
+#: ../../addon/impressum/impressum.php:72
+msgid "Postal Address"
+msgstr ""
+
+#: ../../addon/impressum/impressum.php:49
+msgid ""
+"The impressum addon needs to be configured!<br />Please add at least the "
+"<tt>owner</tt> variable to your config file. For other variables please "
+"refer to the README file of the addon."
+msgstr ""
+
+#: ../../addon/impressum/impressum.php:71
+msgid "Site Owners Profile"
+msgstr ""
+
+#: ../../addon/impressum/impressum.php:73
+msgid "Notes"
+msgstr ""
+
+#: ../../addon/buglink/buglink.php:15
+msgid "Report Bug"
+msgstr ""
+
+#: ../../addon/blockem/blockem.php:51
+msgid "\"Blockem\" Settings"
+msgstr ""
+
+#: ../../addon/blockem/blockem.php:53
+msgid "Comma separated profile URLS to block"
+msgstr ""
+
+#: ../../addon/blockem/blockem.php:70
+msgid "BLOCKEM Settings saved."
+msgstr ""
+
+#: ../../addon/blockem/blockem.php:105
#, php-format
-msgid "%d Contact"
-msgid_plural "%d Contacts"
-msgstr[0] ""
-msgstr[1] ""
+msgid "Blocked %s - Click to open/close"
+msgstr ""
-#: ../../include/text.php:633 ../../include/nav.php:87
-msgid "Search"
+#: ../../addon/blockem/blockem.php:160
+msgid "Unblock Author"
msgstr ""
-#: ../../include/text.php:719
-msgid "Monday"
+#: ../../addon/blockem/blockem.php:162
+msgid "Block Author"
msgstr ""
-#: ../../include/text.php:719
-msgid "Tuesday"
+#: ../../addon/blockem/blockem.php:194
+msgid "blockem settings updated"
msgstr ""
-#: ../../include/text.php:719
-msgid "Wednesday"
+#: ../../addon/editplain/editplain.php:46
+msgid "Editplain settings updated."
msgstr ""
-#: ../../include/text.php:719
-msgid "Thursday"
+#: ../../addon/editplain/editplain.php:76
+msgid "Editplain Settings"
msgstr ""
-#: ../../include/text.php:719
-msgid "Friday"
+#: ../../addon/editplain/editplain.php:78
+msgid "Disable richtext status editor"
msgstr ""
-#: ../../include/text.php:719
-msgid "Saturday"
+#: ../../addon/pageheader/pageheader.php:47
+msgid "\"pageheader\" Settings"
msgstr ""
-#: ../../include/text.php:719
-msgid "Sunday"
+#: ../../addon/pageheader/pageheader.php:65
+msgid "pageheader Settings saved."
msgstr ""
-#: ../../include/text.php:723
-msgid "January"
+#: ../../addon/viewsrc/viewsrc.php:25
+msgid "View Source"
msgstr ""
-#: ../../include/text.php:723
-msgid "February"
+#: ../../addon/statusnet/statusnet.php:140
+msgid "Post to StatusNet"
msgstr ""
-#: ../../include/text.php:723
-msgid "March"
+#: ../../addon/statusnet/statusnet.php:182
+msgid ""
+"Please contact your site administrator.<br />The provided API URL is not "
+"valid."
msgstr ""
-#: ../../include/text.php:723
-msgid "April"
+#: ../../addon/statusnet/statusnet.php:210
+msgid "We could not contact the StatusNet API with the Path you entered."
msgstr ""
-#: ../../include/text.php:723
-msgid "May"
+#: ../../addon/statusnet/statusnet.php:236
+msgid "StatusNet settings updated."
msgstr ""
-#: ../../include/text.php:723
-msgid "June"
+#: ../../addon/statusnet/statusnet.php:259
+msgid "StatusNet Posting Settings"
msgstr ""
-#: ../../include/text.php:723
-msgid "July"
+#: ../../addon/statusnet/statusnet.php:273
+msgid "Globally Available StatusNet OAuthKeys"
msgstr ""
-#: ../../include/text.php:723
-msgid "August"
+#: ../../addon/statusnet/statusnet.php:274
+msgid ""
+"There are preconfigured OAuth key pairs for some StatusNet servers "
+"available. If you are useing one of them, please use these credentials. If "
+"not feel free to connect to any other StatusNet instance (see below)."
msgstr ""
-#: ../../include/text.php:723
-msgid "September"
+#: ../../addon/statusnet/statusnet.php:282
+msgid "Provide your own OAuth Credentials"
msgstr ""
-#: ../../include/text.php:723
-msgid "October"
+#: ../../addon/statusnet/statusnet.php:283
+msgid ""
+"No consumer key pair for StatusNet found. Register your Friendica Account as "
+"an desktop client on your StatusNet account, copy the consumer key pair here "
+"and enter the API base root.<br />Before you register your own OAuth key "
+"pair ask the administrator if there is already a key pair for this Friendica "
+"installation at your favorited StatusNet installation."
msgstr ""
-#: ../../include/text.php:723
-msgid "November"
+#: ../../addon/statusnet/statusnet.php:285
+msgid "OAuth Consumer Key"
msgstr ""
-#: ../../include/text.php:723
-msgid "December"
+#: ../../addon/statusnet/statusnet.php:288
+msgid "OAuth Consumer Secret"
msgstr ""
-#: ../../include/text.php:793
-msgid "bytes"
+#: ../../addon/statusnet/statusnet.php:291
+msgid "Base API Path (remember the trailing /)"
msgstr ""
-#: ../../include/text.php:885
-msgid "Select an alternate language"
+#: ../../addon/statusnet/statusnet.php:312
+msgid ""
+"To connect to your StatusNet account click the button below to get a "
+"security code from StatusNet which you have to copy into the input box below "
+"and submit the form. Only your <strong>public</strong> posts will be posted "
+"to StatusNet."
msgstr ""
-#: ../../include/text.php:897
-msgid "default"
+#: ../../addon/statusnet/statusnet.php:313
+msgid "Log in with StatusNet"
msgstr ""
-#: ../../include/poller.php:459
-msgid "From: "
+#: ../../addon/statusnet/statusnet.php:315
+msgid "Copy the security code from StatusNet here"
msgstr ""
-#: ../../include/nav.php:44 ../../boot.php:700
-msgid "Logout"
+#: ../../addon/statusnet/statusnet.php:321
+msgid "Cancel Connection Process"
msgstr ""
-#: ../../include/nav.php:44
-msgid "End this session"
+#: ../../addon/statusnet/statusnet.php:323
+msgid "Current StatusNet API is"
msgstr ""
-#: ../../include/nav.php:47 ../../boot.php:1312
-msgid "Status"
+#: ../../addon/statusnet/statusnet.php:324
+msgid "Cancel StatusNet Connection"
msgstr ""
-#: ../../include/nav.php:47 ../../include/nav.php:111
-msgid "Your posts and conversations"
+#: ../../addon/statusnet/statusnet.php:335 ../../addon/twitter/twitter.php:189
+msgid "Currently connected to: "
msgstr ""
-#: ../../include/nav.php:48
-msgid "Your profile page"
+#: ../../addon/statusnet/statusnet.php:336
+msgid ""
+"If enabled all your <strong>public</strong> postings can be posted to the "
+"associated StatusNet account. You can choose to do so by default (here) or "
+"for every posting separately in the posting options when writing the entry."
msgstr ""
-#: ../../include/nav.php:49 ../../boot.php:1322
-msgid "Photos"
+#: ../../addon/statusnet/statusnet.php:338
+msgid "Allow posting to StatusNet"
msgstr ""
-#: ../../include/nav.php:49
-msgid "Your photos"
+#: ../../addon/statusnet/statusnet.php:341
+msgid "Send public postings to StatusNet by default"
msgstr ""
-#: ../../include/nav.php:50
-msgid "Your events"
+#: ../../addon/statusnet/statusnet.php:346 ../../addon/twitter/twitter.php:200
+msgid "Clear OAuth configuration"
msgstr ""
-#: ../../include/nav.php:51
-msgid "Personal notes"
+#: ../../addon/statusnet/statusnet.php:487
+msgid "API URL"
msgstr ""
-#: ../../include/nav.php:51
-msgid "Your personal photos"
+#: ../../addon/tumblr/tumblr.php:36
+msgid "Post to Tumblr"
msgstr ""
-#: ../../include/nav.php:62 ../../addon/communityhome/communityhome.php:28
-#: ../../addon/communityhome/communityhome.php:34 ../../boot.php:701
-msgid "Login"
+#: ../../addon/tumblr/tumblr.php:67
+msgid "Tumblr Post Settings"
msgstr ""
-#: ../../include/nav.php:62
-msgid "Sign in"
+#: ../../addon/tumblr/tumblr.php:69
+msgid "Enable Tumblr Post Plugin"
msgstr ""
-#: ../../include/nav.php:73
-msgid "Home Page"
+#: ../../addon/tumblr/tumblr.php:74
+msgid "Tumblr login"
msgstr ""
-#: ../../include/nav.php:77
-msgid "Create an account"
+#: ../../addon/tumblr/tumblr.php:79
+msgid "Tumblr password"
msgstr ""
-#: ../../include/nav.php:82
-msgid "Help and documentation"
+#: ../../addon/tumblr/tumblr.php:84
+msgid "Post to Tumblr by default"
msgstr ""
-#: ../../include/nav.php:85
-msgid "Apps"
+#: ../../addon/numfriends/numfriends.php:46
+msgid "Numfriends settings updated."
msgstr ""
-#: ../../include/nav.php:85
-msgid "Addon applications, utilities, games"
+#: ../../addon/numfriends/numfriends.php:77
+msgid "Numfriends Settings"
msgstr ""
-#: ../../include/nav.php:87
-msgid "Search site content"
+#: ../../addon/numfriends/numfriends.php:79
+msgid "How many contacts to display on profile sidebar"
msgstr ""
-#: ../../include/nav.php:97
-msgid "Conversations on this site"
+#: ../../addon/wppost/wppost.php:42
+msgid "Post to Wordpress"
msgstr ""
-#: ../../include/nav.php:99
-msgid "Directory"
+#: ../../addon/wppost/wppost.php:74
+msgid "WordPress Post Settings"
msgstr ""
-#: ../../include/nav.php:99
-msgid "People directory"
+#: ../../addon/wppost/wppost.php:76
+msgid "Enable WordPress Post Plugin"
msgstr ""
-#: ../../include/nav.php:109
-msgid "Conversations from your friends"
+#: ../../addon/wppost/wppost.php:81
+msgid "WordPress username"
msgstr ""
-#: ../../include/nav.php:117
-msgid "Friend Requests"
+#: ../../addon/wppost/wppost.php:86
+msgid "WordPress password"
msgstr ""
-#: ../../include/nav.php:122
-msgid "Private mail"
+#: ../../addon/wppost/wppost.php:91
+msgid "WordPress API URL"
msgstr ""
-#: ../../include/nav.php:125
-msgid "Manage"
+#: ../../addon/wppost/wppost.php:96
+msgid "Post to WordPress by default"
msgstr ""
-#: ../../include/nav.php:125
-msgid "Manage other pages"
+#: ../../addon/piwik/piwik.php:70
+msgid ""
+"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
+"analytics tool."
msgstr ""
-#: ../../include/nav.php:129 ../../boot.php:921
-msgid "Profiles"
+#: ../../addon/piwik/piwik.php:73
+#, php-format
+msgid ""
+"If you do not want that your visits are logged this way you <a href='%s'>can "
+"set a cookie to prevent Piwik from tracking further visits of the site</a> "
+"(opt-out)."
msgstr ""
-#: ../../include/nav.php:129 ../../boot.php:921
-msgid "Manage/edit profiles"
+#: ../../addon/piwik/piwik.php:82
+msgid "Piwik Base URL"
msgstr ""
-#: ../../include/nav.php:130
-msgid "Manage/edit friends and contacts"
+#: ../../addon/piwik/piwik.php:83
+msgid "Site ID"
msgstr ""
-#: ../../include/nav.php:137
-msgid "Admin"
+#: ../../addon/piwik/piwik.php:84
+msgid "Show opt-out cookie link?"
msgstr ""
-#: ../../include/nav.php:137
-msgid "Site setup and configuration"
+#: ../../addon/twitter/twitter.php:78
+msgid "Post to Twitter"
msgstr ""
-#: ../../include/nav.php:160
-msgid "Nothing new here"
+#: ../../addon/twitter/twitter.php:124
+msgid "Twitter settings updated."
msgstr ""
-#: ../../include/message.php:14
-msgid "[no subject]"
+#: ../../addon/twitter/twitter.php:146
+msgid "Twitter Posting Settings"
msgstr ""
-#: ../../include/profile_advanced.php:17 ../../boot.php:963
+#: ../../addon/twitter/twitter.php:153
+msgid ""
+"No consumer key pair for Twitter found. Please contact your site "
+"administrator."
+msgstr ""
+
+#: ../../addon/twitter/twitter.php:172
+msgid ""
+"At this Friendica instance the Twitter plugin was enabled but you have not "
+"yet connected your account to your Twitter account. To do so click the "
+"button below to get a PIN from Twitter which you have to copy into the input "
+"box below and submit the form. Only your <strong>public</strong> posts will "
+"be posted to Twitter."
+msgstr ""
+
+#: ../../addon/twitter/twitter.php:173
+msgid "Log in with Twitter"
+msgstr ""
+
+#: ../../addon/twitter/twitter.php:175
+msgid "Copy the PIN from Twitter here"
+msgstr ""
+
+#: ../../addon/twitter/twitter.php:190
+msgid ""
+"If enabled all your <strong>public</strong> postings can be posted to the "
+"associated Twitter account. You can choose to do so by default (here) or for "
+"every posting separately in the posting options when writing the entry."
+msgstr ""
+
+#: ../../addon/twitter/twitter.php:192
+msgid "Allow posting to Twitter"
+msgstr ""
+
+#: ../../addon/twitter/twitter.php:195
+msgid "Send public postings to Twitter by default"
+msgstr ""
+
+#: ../../addon/twitter/twitter.php:317
+msgid "Consumer key"
+msgstr ""
+
+#: ../../addon/twitter/twitter.php:318
+msgid "Consumer secret"
+msgstr ""
+
+#: ../../addon/posterous/posterous.php:36
+msgid "Post to Posterous"
+msgstr ""
+
+#: ../../addon/posterous/posterous.php:67
+msgid "Posterous Post Settings"
+msgstr ""
+
+#: ../../addon/posterous/posterous.php:69
+msgid "Enable Posterous Post Plugin"
+msgstr ""
+
+#: ../../addon/posterous/posterous.php:74
+msgid "Posterous login"
+msgstr ""
+
+#: ../../addon/posterous/posterous.php:79
+msgid "Posterous password"
+msgstr ""
+
+#: ../../addon/posterous/posterous.php:84
+msgid "Post to Posterous by default"
+msgstr ""
+
+#: ../../include/profile_advanced.php:17 ../../boot.php:978
msgid "Gender:"
msgstr ""
@@ -3916,76 +4396,141 @@ msgstr ""
msgid "j F"
msgstr ""
+#: ../../include/profile_advanced.php:30 ../../include/datetime.php:438
+#: ../../include/items.php:1318
+msgid "Birthday:"
+msgstr ""
+
#: ../../include/profile_advanced.php:34
msgid "Age:"
msgstr ""
-#: ../../include/profile_advanced.php:37 ../../boot.php:966
+#: ../../include/profile_advanced.php:37 ../../boot.php:981
msgid "Status:"
msgstr ""
-#: ../../include/profile_advanced.php:45 ../../boot.php:968
+#: ../../include/profile_advanced.php:45 ../../boot.php:983
msgid "Homepage:"
msgstr ""
-#: ../../include/profile_advanced.php:49
-msgid "Religion:"
+#: ../../include/profile_advanced.php:47
+msgid "Tags:"
msgstr ""
#: ../../include/profile_advanced.php:51
-msgid "About:"
+msgid "Religion:"
msgstr ""
#: ../../include/profile_advanced.php:53
-msgid "Hobbies/Interests:"
+msgid "About:"
msgstr ""
#: ../../include/profile_advanced.php:55
-msgid "Contact information and Social Networks:"
+msgid "Hobbies/Interests:"
msgstr ""
#: ../../include/profile_advanced.php:57
-msgid "Musical interests:"
+msgid "Contact information and Social Networks:"
msgstr ""
#: ../../include/profile_advanced.php:59
-msgid "Books, literature:"
+msgid "Musical interests:"
msgstr ""
#: ../../include/profile_advanced.php:61
-msgid "Television:"
+msgid "Books, literature:"
msgstr ""
#: ../../include/profile_advanced.php:63
-msgid "Film/dance/culture/entertainment:"
+msgid "Television:"
msgstr ""
#: ../../include/profile_advanced.php:65
-msgid "Love/Romance:"
+msgid "Film/dance/culture/entertainment:"
msgstr ""
#: ../../include/profile_advanced.php:67
-msgid "Work/employment:"
+msgid "Love/Romance:"
msgstr ""
#: ../../include/profile_advanced.php:69
+msgid "Work/employment:"
+msgstr ""
+
+#: ../../include/profile_advanced.php:71
msgid "School/education:"
msgstr ""
-#: ../../include/event.php:17 ../../include/bb2diaspora.php:243
-msgid "Starts:"
+#: ../../include/contact_selectors.php:32
+msgid "Unknown | Not categorised"
msgstr ""
-#: ../../include/event.php:27 ../../include/bb2diaspora.php:251
-msgid "Finishes:"
+#: ../../include/contact_selectors.php:33
+msgid "Block immediately"
msgstr ""
-#: ../../include/items.php:2413
-msgid "A new person is sharing with you at "
+#: ../../include/contact_selectors.php:34
+msgid "Shady, spammer, self-marketer"
msgstr ""
-#: ../../include/items.php:2413
-msgid "You have a new follower at "
+#: ../../include/contact_selectors.php:35
+msgid "Known to me, but no opinion"
+msgstr ""
+
+#: ../../include/contact_selectors.php:36
+msgid "OK, probably harmless"
+msgstr ""
+
+#: ../../include/contact_selectors.php:37
+msgid "Reputable, has my trust"
+msgstr ""
+
+#: ../../include/contact_selectors.php:56
+msgid "Frequently"
+msgstr ""
+
+#: ../../include/contact_selectors.php:57
+msgid "Hourly"
+msgstr ""
+
+#: ../../include/contact_selectors.php:58
+msgid "Twice daily"
+msgstr ""
+
+#: ../../include/contact_selectors.php:59
+msgid "Daily"
+msgstr ""
+
+#: ../../include/contact_selectors.php:60
+msgid "Weekly"
+msgstr ""
+
+#: ../../include/contact_selectors.php:61
+msgid "Monthly"
+msgstr ""
+
+#: ../../include/contact_selectors.php:77
+msgid "OStatus"
+msgstr ""
+
+#: ../../include/contact_selectors.php:78
+msgid "RSS/Atom"
+msgstr ""
+
+#: ../../include/contact_selectors.php:82
+msgid "Zot!"
+msgstr ""
+
+#: ../../include/contact_selectors.php:83
+msgid "LinkedIn"
+msgstr ""
+
+#: ../../include/contact_selectors.php:84
+msgid "XMPP/IM"
+msgstr ""
+
+#: ../../include/contact_selectors.php:85
+msgid "MySpace"
msgstr ""
#: ../../include/profile_selectors.php:6
@@ -4200,477 +4745,316 @@ msgstr ""
msgid "Ask me"
msgstr ""
-#: ../../include/Contact.php:125 ../../include/conversation.php:723
-msgid "View status"
-msgstr ""
-
-#: ../../include/Contact.php:126 ../../include/conversation.php:724
-msgid "View profile"
+#: ../../include/event.php:17 ../../include/bb2diaspora.php:255
+msgid "Starts:"
msgstr ""
-#: ../../include/Contact.php:127 ../../include/conversation.php:725
-msgid "View photos"
+#: ../../include/event.php:27 ../../include/bb2diaspora.php:263
+msgid "Finishes:"
msgstr ""
-#: ../../include/Contact.php:128 ../../include/Contact.php:141
-#: ../../include/conversation.php:726
-msgid "View recent"
+#: ../../include/delivery.php:416 ../../include/notifier.php:629
+msgid "(no subject)"
msgstr ""
-#: ../../include/Contact.php:130 ../../include/Contact.php:141
-#: ../../include/conversation.php:728
-msgid "Send PM"
+#: ../../include/delivery.php:423 ../../include/enotify.php:16
+#: ../../include/notifier.php:636
+msgid "noreply"
msgstr ""
-#: ../../include/conversation.php:23 ../../include/conversation.php:96
-#: ../../addon/communityhome/communityhome.php:155
-msgid "event"
+#: ../../include/text.php:232
+msgid "prev"
msgstr ""
-#: ../../include/conversation.php:252 ../../include/conversation.php:508
-msgid "Select"
+#: ../../include/text.php:234
+msgid "first"
msgstr ""
-#: ../../include/conversation.php:267 ../../include/conversation.php:602
-#: ../../include/conversation.php:603
-#, php-format
-msgid "View %s's profile @ %s"
+#: ../../include/text.php:263
+msgid "last"
msgstr ""
-#: ../../include/conversation.php:276 ../../include/conversation.php:614
-#, php-format
-msgid "%s from %s"
+#: ../../include/text.php:266
+msgid "next"
msgstr ""
-#: ../../include/conversation.php:292
-msgid "View in context"
+#: ../../include/text.php:557
+msgid "No contacts"
msgstr ""
-#: ../../include/conversation.php:407
+#: ../../include/text.php:566
#, php-format
-msgid "%d comment"
-msgid_plural "%d comments"
+msgid "%d Contact"
+msgid_plural "%d Contacts"
msgstr[0] ""
msgstr[1] ""
-#: ../../include/conversation.php:410 ../../boot.php:439
-msgid "show more"
-msgstr ""
-
-#: ../../include/conversation.php:470
-msgid "like"
-msgstr ""
-
-#: ../../include/conversation.php:471
-msgid "dislike"
-msgstr ""
-
-#: ../../include/conversation.php:473
-msgid "Share this"
-msgstr ""
-
-#: ../../include/conversation.php:473
-msgid "share"
-msgstr ""
-
-#: ../../include/conversation.php:518
-msgid "add star"
-msgstr ""
-
-#: ../../include/conversation.php:519
-msgid "remove star"
-msgstr ""
-
-#: ../../include/conversation.php:520
-msgid "toggle star status"
-msgstr ""
-
-#: ../../include/conversation.php:523
-msgid "starred"
-msgstr ""
-
-#: ../../include/conversation.php:524
-msgid "add tag"
-msgstr ""
-
-#: ../../include/conversation.php:604
-msgid "to"
-msgstr ""
-
-#: ../../include/conversation.php:605
-msgid "Wall-to-Wall"
-msgstr ""
-
-#: ../../include/conversation.php:606
-msgid "via Wall-To-Wall:"
-msgstr ""
-
-#: ../../include/conversation.php:648
-msgid "Delete Selected Items"
-msgstr ""
-
-#: ../../include/conversation.php:778
-#, php-format
-msgid "%s likes this."
-msgstr ""
-
-#: ../../include/conversation.php:778
-#, php-format
-msgid "%s doesn't like this."
-msgstr ""
-
-#: ../../include/conversation.php:782
-#, php-format
-msgid "<span %1$s>%2$d people</span> like this."
-msgstr ""
-
-#: ../../include/conversation.php:784
-#, php-format
-msgid "<span %1$s>%2$d people</span> don't like this."
-msgstr ""
-
-#: ../../include/conversation.php:790
-msgid "and"
+#: ../../include/text.php:637 ../../include/nav.php:87
+msgid "Search"
msgstr ""
-#: ../../include/conversation.php:793
-#, php-format
-msgid ", and %d other people"
+#: ../../include/text.php:735
+msgid "Monday"
msgstr ""
-#: ../../include/conversation.php:794
-#, php-format
-msgid "%s like this."
+#: ../../include/text.php:735
+msgid "Tuesday"
msgstr ""
-#: ../../include/conversation.php:794
-#, php-format
-msgid "%s don't like this."
+#: ../../include/text.php:735
+msgid "Wednesday"
msgstr ""
-#: ../../include/conversation.php:814
-msgid "Visible to <strong>everybody</strong>"
+#: ../../include/text.php:735
+msgid "Thursday"
msgstr ""
-#: ../../include/conversation.php:816
-msgid "Please enter a video link/URL:"
+#: ../../include/text.php:735
+msgid "Friday"
msgstr ""
-#: ../../include/conversation.php:817
-msgid "Please enter an audio link/URL:"
+#: ../../include/text.php:735
+msgid "Saturday"
msgstr ""
-#: ../../include/conversation.php:818
-msgid "Tag term:"
+#: ../../include/text.php:735
+msgid "Sunday"
msgstr ""
-#: ../../include/conversation.php:819
-msgid "Where are you right now?"
+#: ../../include/text.php:739
+msgid "January"
msgstr ""
-#: ../../include/conversation.php:820
-msgid "Enter a title for this item"
+#: ../../include/text.php:739
+msgid "February"
msgstr ""
-#: ../../include/conversation.php:864
-msgid "upload photo"
+#: ../../include/text.php:739
+msgid "March"
msgstr ""
-#: ../../include/conversation.php:866
-msgid "attach file"
+#: ../../include/text.php:739
+msgid "April"
msgstr ""
-#: ../../include/conversation.php:868
-msgid "web link"
+#: ../../include/text.php:739
+msgid "May"
msgstr ""
-#: ../../include/conversation.php:869
-msgid "Insert video link"
+#: ../../include/text.php:739
+msgid "June"
msgstr ""
-#: ../../include/conversation.php:870
-msgid "video link"
+#: ../../include/text.php:739
+msgid "July"
msgstr ""
-#: ../../include/conversation.php:871
-msgid "Insert audio link"
+#: ../../include/text.php:739
+msgid "August"
msgstr ""
-#: ../../include/conversation.php:872
-msgid "audio link"
+#: ../../include/text.php:739
+msgid "September"
msgstr ""
-#: ../../include/conversation.php:874
-msgid "set location"
+#: ../../include/text.php:739
+msgid "October"
msgstr ""
-#: ../../include/conversation.php:876
-msgid "clear location"
+#: ../../include/text.php:739
+msgid "November"
msgstr ""
-#: ../../include/conversation.php:878
-msgid "Set title"
+#: ../../include/text.php:739
+msgid "December"
msgstr ""
-#: ../../include/conversation.php:881
-msgid "permissions"
+#: ../../include/text.php:809
+msgid "bytes"
msgstr ""
-#: ../../include/notifier.php:628 ../../include/delivery.php:415
-msgid "(no subject)"
+#: ../../include/text.php:901
+msgid "Select an alternate language"
msgstr ""
-#: ../../include/notifier.php:635 ../../include/enotify.php:16
-msgid "noreply"
+#: ../../include/text.php:913
+msgid "default"
msgstr ""
#: ../../include/diaspora.php:570
msgid "Sharing notification from Diaspora network"
msgstr ""
-#: ../../include/diaspora.php:1862
+#: ../../include/diaspora.php:1895
msgid "Attachments:"
msgstr ""
-#: ../../include/diaspora.php:2045
+#: ../../include/diaspora.php:2078
#, php-format
msgid "[Relayed] Comment authored by %s from network %s"
msgstr ""
-#: ../../include/bb2diaspora.php:53
-msgid "view full size"
-msgstr ""
-
-#: ../../include/bb2diaspora.php:102 ../../include/bb2diaspora.php:112
-msgid "image/photo"
-msgstr ""
-
-#: ../../include/bb2diaspora.php:102 ../../addon/facebook/facebook.php:869
-#: ../../addon/facebook/facebook.php:878
-msgid "link"
-msgstr ""
-
-#: ../../include/acl_selectors.php:279
-msgid "Visible to everybody"
-msgstr ""
-
-#: ../../include/acl_selectors.php:280
-msgid "show"
-msgstr ""
-
-#: ../../include/acl_selectors.php:281
-msgid "don't show"
-msgstr ""
-
-#: ../../include/enotify.php:8
-msgid "Friendica Notification"
-msgstr ""
-
-#: ../../include/enotify.php:11
-msgid "Thank You,"
-msgstr ""
-
-#: ../../include/enotify.php:13
-#, php-format
-msgid "%s Administrator"
-msgstr ""
-
-#: ../../include/enotify.php:28
-#, php-format
-msgid "New mail received at %s"
-msgstr ""
-
-#: ../../include/enotify.php:30
-#, php-format
-msgid "%s sent you a new private message at %s."
-msgstr ""
-
-#: ../../include/enotify.php:32
-#, php-format
-msgid "Please visit %s to view and/or reply to your private messages."
-msgstr ""
-
-#: ../../include/enotify.php:40
-#, php-format
-msgid "%s commented on an item at %s"
-msgstr ""
-
-#: ../../include/enotify.php:41
-#, php-format
-msgid "%s commented on an item/conversation you have been following."
-msgstr ""
-
-#: ../../include/enotify.php:42 ../../include/enotify.php:51
-#, php-format
-msgid "Please visit %s to view and/or reply to the conversation."
+#: ../../include/oembed.php:128
+msgid "Embedded content"
msgstr ""
-#: ../../include/enotify.php:49
-#, php-format
-msgid "%s posted to your profile wall at %s"
+#: ../../include/oembed.php:137
+msgid "Embedding disabled"
msgstr ""
-#: ../../include/enotify.php:58
-#, php-format
-msgid "Introduction received at %s"
+#: ../../include/group.php:25
+msgid ""
+"A deleted group with this name was revived. Existing item permissions "
+"<strong>may</strong> apply to this group and any future members. If this is "
+"not what you intended, please create another group with a different name."
msgstr ""
-#: ../../include/enotify.php:59
-#, php-format
-msgid "You've received an introduction from '%s' at %s"
+#: ../../include/group.php:168
+msgid "Everybody"
msgstr ""
-#: ../../include/enotify.php:60 ../../include/enotify.php:73
-#, php-format
-msgid "You may visit their profile at %s"
+#: ../../include/group.php:191
+msgid "edit"
msgstr ""
-#: ../../include/enotify.php:62
-#, php-format
-msgid "Please visit %s to approve or reject the introduction."
+#: ../../include/group.php:212
+msgid "Groups"
msgstr ""
-#: ../../include/enotify.php:69
-#, php-format
-msgid "Friend suggestion received at %s"
+#: ../../include/group.php:213
+msgid "Edit group"
msgstr ""
-#: ../../include/enotify.php:70
-#, php-format
-msgid "You've received a friend suggestion from '%s' at %s"
+#: ../../include/group.php:214
+msgid "Create a new group"
msgstr ""
-#: ../../include/enotify.php:71
-msgid "Name:"
+#: ../../include/nav.php:44 ../../boot.php:705
+msgid "Logout"
msgstr ""
-#: ../../include/enotify.php:72
-msgid "Photo:"
+#: ../../include/nav.php:44
+msgid "End this session"
msgstr ""
-#: ../../include/enotify.php:75
-#, php-format
-msgid "Please visit %s to approve or reject the suggestion."
+#: ../../include/nav.php:47 ../../boot.php:1327
+msgid "Status"
msgstr ""
-#: ../../include/bbcode.php:166 ../../include/bbcode.php:225
-msgid "Image/photo"
+#: ../../include/nav.php:47 ../../include/nav.php:111
+msgid "Your posts and conversations"
msgstr ""
-#: ../../include/contact_selectors.php:32
-msgid "Unknown | Not categorised"
+#: ../../include/nav.php:48
+msgid "Your profile page"
msgstr ""
-#: ../../include/contact_selectors.php:33
-msgid "Block immediately"
+#: ../../include/nav.php:49 ../../boot.php:1337
+msgid "Photos"
msgstr ""
-#: ../../include/contact_selectors.php:34
-msgid "Shady, spammer, self-marketer"
+#: ../../include/nav.php:49
+msgid "Your photos"
msgstr ""
-#: ../../include/contact_selectors.php:35
-msgid "Known to me, but no opinion"
+#: ../../include/nav.php:50
+msgid "Your events"
msgstr ""
-#: ../../include/contact_selectors.php:36
-msgid "OK, probably harmless"
+#: ../../include/nav.php:51
+msgid "Personal notes"
msgstr ""
-#: ../../include/contact_selectors.php:37
-msgid "Reputable, has my trust"
+#: ../../include/nav.php:51
+msgid "Your personal photos"
msgstr ""
-#: ../../include/contact_selectors.php:56
-msgid "Frequently"
+#: ../../include/nav.php:62
+msgid "Sign in"
msgstr ""
-#: ../../include/contact_selectors.php:57
-msgid "Hourly"
+#: ../../include/nav.php:73
+msgid "Home Page"
msgstr ""
-#: ../../include/contact_selectors.php:58
-msgid "Twice daily"
+#: ../../include/nav.php:77
+msgid "Create an account"
msgstr ""
-#: ../../include/contact_selectors.php:59
-msgid "Daily"
+#: ../../include/nav.php:82
+msgid "Help and documentation"
msgstr ""
-#: ../../include/contact_selectors.php:60
-msgid "Weekly"
+#: ../../include/nav.php:85
+msgid "Apps"
msgstr ""
-#: ../../include/contact_selectors.php:61
-msgid "Monthly"
+#: ../../include/nav.php:85
+msgid "Addon applications, utilities, games"
msgstr ""
-#: ../../include/contact_selectors.php:77
-msgid "OStatus"
+#: ../../include/nav.php:87
+msgid "Search site content"
msgstr ""
-#: ../../include/contact_selectors.php:78
-msgid "RSS/Atom"
+#: ../../include/nav.php:97
+msgid "Conversations on this site"
msgstr ""
-#: ../../include/contact_selectors.php:81
-#: ../../addon/facebook/facebook.php:475
-msgid "Facebook"
+#: ../../include/nav.php:99
+msgid "Directory"
msgstr ""
-#: ../../include/contact_selectors.php:82
-msgid "Zot!"
+#: ../../include/nav.php:99
+msgid "People directory"
msgstr ""
-#: ../../include/contact_selectors.php:83
-msgid "LinkedIn"
+#: ../../include/nav.php:109
+msgid "Conversations from your friends"
msgstr ""
-#: ../../include/contact_selectors.php:84
-msgid "XMPP/IM"
+#: ../../include/nav.php:117
+msgid "Friend Requests"
msgstr ""
-#: ../../include/contact_selectors.php:85
-msgid "MySpace"
+#: ../../include/nav.php:119
+msgid "See all notifications"
msgstr ""
-#: ../../include/auth.php:27
-msgid "Logged out."
+#: ../../include/nav.php:123
+msgid "Private mail"
msgstr ""
-#: ../../include/oembed.php:128
-msgid "Embedded content"
+#: ../../include/nav.php:126
+msgid "Manage"
msgstr ""
-#: ../../include/oembed.php:137
-msgid "Embedding disabled"
+#: ../../include/nav.php:126
+msgid "Manage other pages"
msgstr ""
-#: ../../include/group.php:25
-msgid ""
-"A deleted group with this name was revived. Existing item permissions "
-"<strong>may</strong> apply to this group and any future members. If this is "
-"not what you intended, please create another group with a different name."
+#: ../../include/nav.php:130 ../../boot.php:936
+msgid "Profiles"
msgstr ""
-#: ../../include/group.php:168
-msgid "Everybody"
+#: ../../include/nav.php:130 ../../boot.php:936
+msgid "Manage/edit profiles"
msgstr ""
-#: ../../include/group.php:191
-msgid "edit"
+#: ../../include/nav.php:131
+msgid "Manage/edit friends and contacts"
msgstr ""
-#: ../../include/group.php:212
-msgid "Groups"
+#: ../../include/nav.php:138
+msgid "Admin"
msgstr ""
-#: ../../include/group.php:213
-msgid "Edit group"
+#: ../../include/nav.php:138
+msgid "Site setup and configuration"
msgstr ""
-#: ../../include/group.php:214
-msgid "Create a new group"
+#: ../../include/nav.php:161
+msgid "Nothing new here"
msgstr ""
#: ../../include/contact_widgets.php:6
@@ -4724,695 +5108,519 @@ msgstr ""
msgid "All Networks"
msgstr ""
-#: ../../addon/facebook/facebook.php:337
-msgid "Facebook disabled"
-msgstr ""
-
-#: ../../addon/facebook/facebook.php:342
-msgid "Updating contacts"
-msgstr ""
-
-#: ../../addon/facebook/facebook.php:351
-msgid "Facebook API key is missing."
-msgstr ""
-
-#: ../../addon/facebook/facebook.php:358
-msgid "Facebook Connect"
-msgstr ""
-
-#: ../../addon/facebook/facebook.php:364
-msgid "Install Facebook connector for this account."
-msgstr ""
-
-#: ../../addon/facebook/facebook.php:371
-msgid "Remove Facebook connector"
-msgstr ""
-
-#: ../../addon/facebook/facebook.php:376
-msgid ""
-"Re-authenticate [This is necessary whenever your Facebook password is "
-"changed.]"
-msgstr ""
-
-#: ../../addon/facebook/facebook.php:383
-msgid "Post to Facebook by default"
-msgstr ""
-
-#: ../../addon/facebook/facebook.php:387
-msgid "Link all your Facebook friends and conversations on this website"
-msgstr ""
-
-#: ../../addon/facebook/facebook.php:389
-msgid ""
-"Facebook conversations consist of your <em>profile wall</em> and your friend "
-"<em>stream</em>."
-msgstr ""
-
-#: ../../addon/facebook/facebook.php:390
-msgid "On this website, your Facebook friend stream is only visible to you."
-msgstr ""
-
-#: ../../addon/facebook/facebook.php:391
-msgid ""
-"The following settings determine the privacy of your Facebook profile wall "
-"on this website."
-msgstr ""
-
-#: ../../addon/facebook/facebook.php:395
-msgid ""
-"On this website your Facebook profile wall conversations will only be "
-"visible to you"
+#: ../../include/auth.php:29
+msgid "Logged out."
msgstr ""
-#: ../../addon/facebook/facebook.php:400
-msgid "Do not import your Facebook profile wall conversations"
+#: ../../include/datetime.php:43 ../../include/datetime.php:45
+msgid "Miscellaneous"
msgstr ""
-#: ../../addon/facebook/facebook.php:402
-msgid ""
-"If you choose to link conversations and leave both of these boxes unchecked, "
-"your Facebook profile wall will be merged with your profile wall on this "
-"website and your privacy settings on this website will be used to determine "
-"who may see the conversations."
+#: ../../include/datetime.php:121 ../../include/datetime.php:253
+msgid "year"
msgstr ""
-#: ../../addon/facebook/facebook.php:407
-msgid "Comma separated applications to ignore"
+#: ../../include/datetime.php:126 ../../include/datetime.php:254
+msgid "month"
msgstr ""
-#: ../../addon/facebook/facebook.php:476
-msgid "Facebook Connector Settings"
+#: ../../include/datetime.php:131 ../../include/datetime.php:256
+msgid "day"
msgstr ""
-#: ../../addon/facebook/facebook.php:490
-msgid "Post to Facebook"
+#: ../../include/datetime.php:244
+msgid "never"
msgstr ""
-#: ../../addon/facebook/facebook.php:581
-msgid ""
-"Post to Facebook cancelled because of multi-network access permission "
-"conflict."
+#: ../../include/datetime.php:250
+msgid "less than a second ago"
msgstr ""
-#: ../../addon/facebook/facebook.php:644
-msgid "Image: "
+#: ../../include/datetime.php:253
+msgid "years"
msgstr ""
-#: ../../addon/facebook/facebook.php:720
-msgid "View on Friendica"
+#: ../../include/datetime.php:254
+msgid "months"
msgstr ""
-#: ../../addon/facebook/facebook.php:744
-msgid "Facebook post failed. Queued for retry."
+#: ../../include/datetime.php:255
+msgid "week"
msgstr ""
-#: ../../addon/wppost/wppost.php:41
-msgid "Post to Wordpress"
+#: ../../include/datetime.php:255
+msgid "weeks"
msgstr ""
-#: ../../addon/wppost/wppost.php:73
-msgid "WordPress Post Settings"
+#: ../../include/datetime.php:256
+msgid "days"
msgstr ""
-#: ../../addon/wppost/wppost.php:75
-msgid "Enable WordPress Post Plugin"
+#: ../../include/datetime.php:257
+msgid "hour"
msgstr ""
-#: ../../addon/wppost/wppost.php:80
-msgid "WordPress username"
+#: ../../include/datetime.php:257
+msgid "hours"
msgstr ""
-#: ../../addon/wppost/wppost.php:85
-msgid "WordPress password"
+#: ../../include/datetime.php:258
+msgid "minute"
msgstr ""
-#: ../../addon/wppost/wppost.php:90
-msgid "WordPress API URL"
+#: ../../include/datetime.php:258
+msgid "minutes"
msgstr ""
-#: ../../addon/wppost/wppost.php:95
-msgid "Post to WordPress by default"
+#: ../../include/datetime.php:259
+msgid "second"
msgstr ""
-#: ../../addon/wppost/wppost.php:171 ../../addon/tumblr/tumblr.php:174
-#: ../../addon/posterous/posterous.php:172
-msgid "Post from Friendica"
+#: ../../include/datetime.php:259
+msgid "seconds"
msgstr ""
-#: ../../addon/uhremotestorage/uhremotestorage.php:56
+#: ../../include/datetime.php:267
#, php-format
-msgid ""
-"Allow to use your friendika id (%s) to connecto to external unhosted-enabled "
-"storage (like ownCloud)"
+msgid "%1$d %2$s ago"
msgstr ""
-#: ../../addon/uhremotestorage/uhremotestorage.php:57
-msgid "Unhosted DAV storage url"
-msgstr ""
-
-#: ../../addon/tumblr/tumblr.php:35
-msgid "Post to Tumblr"
-msgstr ""
-
-#: ../../addon/tumblr/tumblr.php:66
-msgid "Tumblr Post Settings"
-msgstr ""
-
-#: ../../addon/tumblr/tumblr.php:68
-msgid "Enable Tumblr Post Plugin"
-msgstr ""
-
-#: ../../addon/tumblr/tumblr.php:73
-msgid "Tumblr login"
-msgstr ""
-
-#: ../../addon/tumblr/tumblr.php:78
-msgid "Tumblr password"
-msgstr ""
-
-#: ../../addon/tumblr/tumblr.php:83
-msgid "Post to Tumblr by default"
+#: ../../include/poller.php:459
+msgid "From: "
msgstr ""
-#: ../../addon/oembed/oembed.php:30
-msgid "OEmbed settings updated"
+#: ../../include/bbcode.php:166 ../../include/bbcode.php:225
+msgid "Image/photo"
msgstr ""
-#: ../../addon/oembed/oembed.php:43
-msgid "Use OEmbed for YouTube videos"
+#: ../../include/dba.php:39
+#, php-format
+msgid "Cannot locate DNS info for database server '%s'"
msgstr ""
-#: ../../addon/oembed/oembed.php:71
-msgid "URL to embed:"
+#: ../../include/message.php:14
+msgid "[no subject]"
msgstr ""
-#: ../../addon/posterous/posterous.php:35
-msgid "Post to Posterous"
+#: ../../include/acl_selectors.php:279
+msgid "Visible to everybody"
msgstr ""
-#: ../../addon/posterous/posterous.php:66
-msgid "Posterous Post Settings"
+#: ../../include/acl_selectors.php:280
+msgid "show"
msgstr ""
-#: ../../addon/posterous/posterous.php:68
-msgid "Enable Posterous Post Plugin"
+#: ../../include/acl_selectors.php:281
+msgid "don't show"
msgstr ""
-#: ../../addon/posterous/posterous.php:73
-msgid "Posterous login"
+#: ../../include/enotify.php:8
+msgid "Friendica Notification"
msgstr ""
-#: ../../addon/posterous/posterous.php:78
-msgid "Posterous password"
+#: ../../include/enotify.php:11
+msgid "Thank You,"
msgstr ""
-#: ../../addon/posterous/posterous.php:83
-msgid "Post to Posterous by default"
+#: ../../include/enotify.php:13
+#, php-format
+msgid "%s Administrator"
msgstr ""
-#: ../../addon/js_upload/js_upload.php:43
-msgid "Upload a file"
+#: ../../include/enotify.php:28
+#, php-format
+msgid "New mail received at %s"
msgstr ""
-#: ../../addon/js_upload/js_upload.php:44
-msgid "Drop files here to upload"
+#: ../../include/enotify.php:30
+#, php-format
+msgid "%s sent you a new private message at %s."
msgstr ""
-#: ../../addon/js_upload/js_upload.php:46
-msgid "Failed"
+#: ../../include/enotify.php:32
+#, php-format
+msgid "Please visit %s to view and/or reply to your private messages."
msgstr ""
-#: ../../addon/js_upload/js_upload.php:294
-msgid "No files were uploaded."
+#: ../../include/enotify.php:40
+#, php-format
+msgid "%s commented on an item at %s"
msgstr ""
-#: ../../addon/js_upload/js_upload.php:300
-msgid "Uploaded file is empty"
+#: ../../include/enotify.php:41
+#, php-format
+msgid "%s commented on an item/conversation you have been following."
msgstr ""
-#: ../../addon/js_upload/js_upload.php:323
-msgid "File has an invalid extension, it should be one of "
+#: ../../include/enotify.php:42 ../../include/enotify.php:51
+#: ../../include/enotify.php:60 ../../include/enotify.php:69
+#, php-format
+msgid "Please visit %s to view and/or reply to the conversation."
msgstr ""
-#: ../../addon/js_upload/js_upload.php:334
-msgid "Upload was cancelled, or server error encountered"
+#: ../../include/enotify.php:49
+#, php-format
+msgid "%s posted to your profile wall at %s"
msgstr ""
-#: ../../addon/buglink/buglink.php:15
-msgid "Report Bug"
+#: ../../include/enotify.php:58
+#, php-format
+msgid "%s tagged you at %s"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:141
-msgid "Post to StatusNet"
+#: ../../include/enotify.php:67
+#, php-format
+msgid "%s tagged your post at %s"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:183
-msgid ""
-"Please contact your site administrator.<br />The provided API URL is not "
-"valid."
+#: ../../include/enotify.php:76
+#, php-format
+msgid "Introduction received at %s"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:211
-msgid "We could not contact the StatusNet API with the Path you entered."
+#: ../../include/enotify.php:77
+#, php-format
+msgid "You've received an introduction from '%s' at %s"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:238
-msgid "StatusNet settings updated."
+#: ../../include/enotify.php:78 ../../include/enotify.php:91
+#, php-format
+msgid "You may visit their profile at %s"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:261
-msgid "StatusNet Posting Settings"
+#: ../../include/enotify.php:80
+#, php-format
+msgid "Please visit %s to approve or reject the introduction."
msgstr ""
-#: ../../addon/statusnet/statusnet.php:275
-msgid "Globally Available StatusNet OAuthKeys"
+#: ../../include/enotify.php:87
+#, php-format
+msgid "Friend suggestion received at %s"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:276
-msgid ""
-"There are preconfigured OAuth key pairs for some StatusNet servers "
-"available. If you are useing one of them, please use these credentials. If "
-"not feel free to connect to any other StatusNet instance (see below)."
+#: ../../include/enotify.php:88
+#, php-format
+msgid "You've received a friend suggestion from '%s' at %s"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:284
-msgid "Provide your own OAuth Credentials"
+#: ../../include/enotify.php:89
+msgid "Name:"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:285
-msgid ""
-"No consumer key pair for StatusNet found. Register your Friendica Account as "
-"an desktop client on your StatusNet account, copy the consumer key pair here "
-"and enter the API base root.<br />Before you register your own OAuth key "
-"pair ask the administrator if there is already a key pair for this Friendica "
-"installation at your favorited StatusNet installation."
+#: ../../include/enotify.php:90
+msgid "Photo:"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:287
-msgid "OAuth Consumer Key"
+#: ../../include/enotify.php:93
+#, php-format
+msgid "Please visit %s to approve or reject the suggestion."
msgstr ""
-#: ../../addon/statusnet/statusnet.php:290
-msgid "OAuth Consumer Secret"
+#: ../../include/items.php:2450
+msgid "A new person is sharing with you at "
msgstr ""
-#: ../../addon/statusnet/statusnet.php:293
-msgid "Base API Path (remember the trailing /)"
+#: ../../include/items.php:2450
+msgid "You have a new follower at "
msgstr ""
-#: ../../addon/statusnet/statusnet.php:314
-msgid ""
-"To connect to your StatusNet account click the button below to get a "
-"security code from StatusNet which you have to copy into the input box below "
-"and submit the form. Only your <strong>public</strong> posts will be posted "
-"to StatusNet."
+#: ../../include/bb2diaspora.php:64
+msgid "view full size"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:315
-msgid "Log in with StatusNet"
+#: ../../include/bb2diaspora.php:113 ../../include/bb2diaspora.php:123
+#: ../../include/bb2diaspora.php:124
+msgid "image/photo"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:317
-msgid "Copy the security code from StatusNet here"
+#: ../../include/security.php:20
+msgid "Welcome "
msgstr ""
-#: ../../addon/statusnet/statusnet.php:323
-msgid "Cancel Connection Process"
+#: ../../include/security.php:21
+msgid "Please upload a profile photo."
msgstr ""
-#: ../../addon/statusnet/statusnet.php:325
-msgid "Current StatusNet API is"
+#: ../../include/security.php:24
+msgid "Welcome back "
msgstr ""
-#: ../../addon/statusnet/statusnet.php:326
-msgid "Cancel StatusNet Connection"
+#: ../../include/Contact.php:131 ../../include/conversation.php:744
+msgid "View status"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:337 ../../addon/twitter/twitter.php:188
-msgid "Currently connected to: "
+#: ../../include/Contact.php:132 ../../include/conversation.php:745
+msgid "View profile"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:338
-msgid ""
-"If enabled all your <strong>public</strong> postings can be posted to the "
-"associated StatusNet account. You can choose to do so by default (here) or "
-"for every posting separately in the posting options when writing the entry."
+#: ../../include/Contact.php:133 ../../include/conversation.php:746
+msgid "View photos"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:340
-msgid "Allow posting to StatusNet"
+#: ../../include/Contact.php:134 ../../include/Contact.php:147
+#: ../../include/conversation.php:747
+msgid "View recent"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:343
-msgid "Send public postings to StatusNet by default"
+#: ../../include/Contact.php:136 ../../include/Contact.php:147
+#: ../../include/conversation.php:749
+msgid "Send PM"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:348 ../../addon/twitter/twitter.php:199
-msgid "Clear OAuth configuration"
+#: ../../include/conversation.php:141
+msgid "post/item"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:478
-msgid "API URL"
+#: ../../include/conversation.php:142
+#, php-format
+msgid "%1$s marked %2$s's %3$s as favorite"
msgstr ""
-#: ../../addon/widgets/widgets.php:55
-msgid "Generate new key"
+#: ../../include/conversation.php:279 ../../include/conversation.php:535
+msgid "Select"
msgstr ""
-#: ../../addon/widgets/widgets.php:58
-msgid "Widgets key"
+#: ../../include/conversation.php:294 ../../include/conversation.php:623
+#: ../../include/conversation.php:624
+#, php-format
+msgid "View %s's profile @ %s"
msgstr ""
-#: ../../addon/widgets/widgets.php:60
-msgid "Widgets available"
+#: ../../include/conversation.php:303 ../../include/conversation.php:635
+#, php-format
+msgid "%s from %s"
msgstr ""
-#: ../../addon/widgets/widget_friends.php:40
-msgid "Connect on Friendica!"
+#: ../../include/conversation.php:319
+msgid "View in context"
msgstr ""
-#: ../../addon/widgets/widget_like.php:58
-#, php-format
-msgid "%d person likes this"
-msgid_plural "%d people like this"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../addon/widgets/widget_like.php:61
+#: ../../include/conversation.php:434
#, php-format
-msgid "%d person doesn't like this"
-msgid_plural "%d people don't like this"
+msgid "%d comment"
+msgid_plural "%d comments"
msgstr[0] ""
msgstr[1] ""
-#: ../../addon/twitter/twitter.php:78
-msgid "Post to Twitter"
-msgstr ""
-
-#: ../../addon/twitter/twitter.php:123
-msgid "Twitter settings updated."
-msgstr ""
-
-#: ../../addon/twitter/twitter.php:145
-msgid "Twitter Posting Settings"
-msgstr ""
-
-#: ../../addon/twitter/twitter.php:152
-msgid ""
-"No consumer key pair for Twitter found. Please contact your site "
-"administrator."
-msgstr ""
-
-#: ../../addon/twitter/twitter.php:171
-msgid ""
-"At this Friendica instance the Twitter plugin was enabled but you have not "
-"yet connected your account to your Twitter account. To do so click the "
-"button below to get a PIN from Twitter which you have to copy into the input "
-"box below and submit the form. Only your <strong>public</strong> posts will "
-"be posted to Twitter."
-msgstr ""
-
-#: ../../addon/twitter/twitter.php:172
-msgid "Log in with Twitter"
-msgstr ""
-
-#: ../../addon/twitter/twitter.php:174
-msgid "Copy the PIN from Twitter here"
-msgstr ""
-
-#: ../../addon/twitter/twitter.php:189
-msgid ""
-"If enabled all your <strong>public</strong> postings can be posted to the "
-"associated Twitter account. You can choose to do so by default (here) or for "
-"every posting separately in the posting options when writing the entry."
-msgstr ""
-
-#: ../../addon/twitter/twitter.php:191
-msgid "Allow posting to Twitter"
-msgstr ""
-
-#: ../../addon/twitter/twitter.php:194
-msgid "Send public postings to Twitter by default"
-msgstr ""
-
-#: ../../addon/twitter/twitter.php:301
-msgid "Consumer key"
-msgstr ""
-
-#: ../../addon/twitter/twitter.php:302
-msgid "Consumer secret"
-msgstr ""
-
-#: ../../addon/impressum/impressum.php:25
-msgid "Impressum"
-msgstr ""
-
-#: ../../addon/impressum/impressum.php:38
-#: ../../addon/impressum/impressum.php:40
-#: ../../addon/impressum/impressum.php:70
-msgid "Site Owner"
-msgstr ""
-
-#: ../../addon/impressum/impressum.php:38
-#: ../../addon/impressum/impressum.php:74
-msgid "Email Address"
-msgstr ""
-
-#: ../../addon/impressum/impressum.php:43
-#: ../../addon/impressum/impressum.php:72
-msgid "Postal Address"
-msgstr ""
-
-#: ../../addon/impressum/impressum.php:49
-msgid ""
-"The impressum addon needs to be configured!<br />Please add at least the "
-"<tt>owner</tt> variable to your config file. For other variables please "
-"refer to the README file of the addon."
+#: ../../include/conversation.php:437 ../../boot.php:444
+msgid "show more"
msgstr ""
-#: ../../addon/impressum/impressum.php:71
-msgid "Site Owners Profile"
+#: ../../include/conversation.php:497
+msgid "like"
msgstr ""
-#: ../../addon/impressum/impressum.php:73
-msgid "Notes"
+#: ../../include/conversation.php:498
+msgid "dislike"
msgstr ""
-#: ../../addon/tictac/tictac.php:20
-msgid "Three Dimensional Tic-Tac-Toe"
+#: ../../include/conversation.php:500
+msgid "Share this"
msgstr ""
-#: ../../addon/tictac/tictac.php:53
-msgid "3D Tic-Tac-Toe"
+#: ../../include/conversation.php:500
+msgid "share"
msgstr ""
-#: ../../addon/tictac/tictac.php:58
-msgid "New game"
+#: ../../include/conversation.php:545
+msgid "add star"
msgstr ""
-#: ../../addon/tictac/tictac.php:59
-msgid "New game with handicap"
+#: ../../include/conversation.php:546
+msgid "remove star"
msgstr ""
-#: ../../addon/tictac/tictac.php:60
-msgid ""
-"Three dimensional tic-tac-toe is just like the traditional game except that "
-"it is played on multiple levels simultaneously. "
+#: ../../include/conversation.php:547
+msgid "toggle star status"
msgstr ""
-#: ../../addon/tictac/tictac.php:61
-msgid ""
-"In this case there are three levels. You win by getting three in a row on "
-"any level, as well as up, down, and diagonally across the different levels."
+#: ../../include/conversation.php:550
+msgid "starred"
msgstr ""
-#: ../../addon/tictac/tictac.php:63
-msgid ""
-"The handicap game disables the center position on the middle level because "
-"the player claiming this square often has an unfair advantage."
+#: ../../include/conversation.php:551
+msgid "add tag"
msgstr ""
-#: ../../addon/tictac/tictac.php:182
-msgid "You go first..."
+#: ../../include/conversation.php:625
+msgid "to"
msgstr ""
-#: ../../addon/tictac/tictac.php:187
-msgid "I'm going first this time..."
+#: ../../include/conversation.php:626
+msgid "Wall-to-Wall"
msgstr ""
-#: ../../addon/tictac/tictac.php:193
-msgid "You won!"
+#: ../../include/conversation.php:627
+msgid "via Wall-To-Wall:"
msgstr ""
-#: ../../addon/tictac/tictac.php:199 ../../addon/tictac/tictac.php:224
-msgid "\"Cat\" game!"
+#: ../../include/conversation.php:669
+msgid "Delete Selected Items"
msgstr ""
-#: ../../addon/tictac/tictac.php:222
-msgid "I won!"
+#: ../../include/conversation.php:801
+#, php-format
+msgid "%s likes this."
msgstr ""
-#: ../../addon/piwik/piwik.php:70
-msgid ""
-"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
-"analytics tool."
+#: ../../include/conversation.php:801
+#, php-format
+msgid "%s doesn't like this."
msgstr ""
-#: ../../addon/piwik/piwik.php:73
+#: ../../include/conversation.php:805
#, php-format
-msgid ""
-"If you do not want that your visits are logged this way you <a href='%s'>can "
-"set a cookie to prevent Piwik from tracking further visits of the site</a> "
-"(opt-out)."
+msgid "<span %1$s>%2$d people</span> like this."
msgstr ""
-#: ../../addon/piwik/piwik.php:82
-msgid "Piwik Base URL"
+#: ../../include/conversation.php:807
+#, php-format
+msgid "<span %1$s>%2$d people</span> don't like this."
msgstr ""
-#: ../../addon/piwik/piwik.php:83
-msgid "Site ID"
+#: ../../include/conversation.php:813
+msgid "and"
msgstr ""
-#: ../../addon/piwik/piwik.php:84
-msgid "Show opt-out cookie link?"
+#: ../../include/conversation.php:816
+#, php-format
+msgid ", and %d other people"
msgstr ""
-#: ../../addon/membersince/membersince.php:17
+#: ../../include/conversation.php:817
#, php-format
-msgid " - Member since: %s"
+msgid "%s like this."
msgstr ""
-#: ../../addon/communityhome/communityhome.php:29
-msgid "OpenID"
+#: ../../include/conversation.php:817
+#, php-format
+msgid "%s don't like this."
msgstr ""
-#: ../../addon/communityhome/communityhome.php:38
-msgid "Last users"
+#: ../../include/conversation.php:842
+msgid "Visible to <strong>everybody</strong>"
msgstr ""
-#: ../../addon/communityhome/communityhome.php:81
-msgid "Most active users"
+#: ../../include/conversation.php:844
+msgid "Please enter a video link/URL:"
msgstr ""
-#: ../../addon/communityhome/communityhome.php:98
-msgid "Last photos"
+#: ../../include/conversation.php:845
+msgid "Please enter an audio link/URL:"
msgstr ""
-#: ../../addon/communityhome/communityhome.php:133
-msgid "Last likes"
+#: ../../include/conversation.php:846
+msgid "Tag term:"
msgstr ""
-#: ../../addon/pageheader/pageheader.php:47
-msgid "\"pageheader\" Settings"
+#: ../../include/conversation.php:847
+msgid "Where are you right now?"
msgstr ""
-#: ../../addon/pageheader/pageheader.php:65
-msgid "pageheader Settings saved."
+#: ../../include/conversation.php:848
+msgid "Enter a title for this item"
msgstr ""
-#: ../../addon/randplace/randplace.php:170
-msgid "Randplace Settings"
+#: ../../include/conversation.php:891
+msgid "upload photo"
msgstr ""
-#: ../../addon/randplace/randplace.php:172
-msgid "Enable Randplace Plugin"
+#: ../../include/conversation.php:893
+msgid "attach file"
msgstr ""
-#: ../../addon/blockem/blockem.php:47
-msgid "\"Blockem\" Settings"
+#: ../../include/conversation.php:895
+msgid "web link"
msgstr ""
-#: ../../addon/blockem/blockem.php:49
-msgid "Comma separated profile URLS to block"
+#: ../../include/conversation.php:896
+msgid "Insert video link"
msgstr ""
-#: ../../addon/blockem/blockem.php:66
-msgid "BLOCKEM Settings saved."
+#: ../../include/conversation.php:897
+msgid "video link"
msgstr ""
-#: ../../addon/blockem/blockem.php:104
-#, php-format
-msgid "Blocked %s - Click to open/close"
+#: ../../include/conversation.php:898
+msgid "Insert audio link"
msgstr ""
-#: ../../addon/nsfw/nsfw.php:47
-msgid "\"Not Safe For Work\" Settings"
+#: ../../include/conversation.php:899
+msgid "audio link"
msgstr ""
-#: ../../addon/nsfw/nsfw.php:49
-msgid "Comma separated words to treat as NSFW"
+#: ../../include/conversation.php:901
+msgid "set location"
msgstr ""
-#: ../../addon/nsfw/nsfw.php:66
-msgid "NSFW Settings saved."
+#: ../../include/conversation.php:903
+msgid "clear location"
msgstr ""
-#: ../../addon/nsfw/nsfw.php:102
-#, php-format
-msgid "%s - Click to open/close"
+#: ../../include/conversation.php:908
+msgid "permissions"
msgstr ""
-#: ../../boot.php:437
+#: ../../boot.php:442
msgid "Delete this item?"
msgstr ""
-#: ../../boot.php:440
+#: ../../boot.php:445
msgid "show fewer"
msgstr ""
-#: ../../boot.php:683
+#: ../../boot.php:688
msgid "Create a New Account"
msgstr ""
-#: ../../boot.php:703
+#: ../../boot.php:708
msgid "Nickname or Email address: "
msgstr ""
-#: ../../boot.php:704
+#: ../../boot.php:709
msgid "Password: "
msgstr ""
-#: ../../boot.php:707
+#: ../../boot.php:712
msgid "Or login using OpenID: "
msgstr ""
-#: ../../boot.php:713
+#: ../../boot.php:718
msgid "Forgot your password?"
msgstr ""
-#: ../../boot.php:860
+#: ../../boot.php:875
msgid "Edit profile"
msgstr ""
-#: ../../boot.php:1027 ../../boot.php:1098
+#: ../../boot.php:1042 ../../boot.php:1113
msgid "g A l F d"
msgstr ""
-#: ../../boot.php:1028 ../../boot.php:1099
+#: ../../boot.php:1043 ../../boot.php:1114
msgid "F d"
msgstr ""
-#: ../../boot.php:1053
+#: ../../boot.php:1068
msgid "Birthday Reminders"
msgstr ""
-#: ../../boot.php:1054
+#: ../../boot.php:1069
msgid "Birthdays this week:"
msgstr ""
-#: ../../boot.php:1077 ../../boot.php:1141
+#: ../../boot.php:1092 ../../boot.php:1156
msgid "[today]"
msgstr ""
-#: ../../boot.php:1122
+#: ../../boot.php:1137
msgid "Event Reminders"
msgstr ""
-#: ../../boot.php:1123
+#: ../../boot.php:1138
msgid "Events this week:"
msgstr ""
-#: ../../boot.php:1135
+#: ../../boot.php:1150
msgid "[No description]"
msgstr ""
diff --git a/view/comment_item.tpl b/view/comment_item.tpl
index a28fc411a..c992593f8 100755
--- a/view/comment_item.tpl
+++ b/view/comment_item.tpl
@@ -11,6 +11,12 @@
<a class="comment-edit-photo-link" href="$mylink" title="$mytitle"><img class="my-comment-photo" src="$myphoto" alt="$mytitle" title="$mytitle" /></a>
</div>
<div class="comment-edit-photo-end"></div>
+ {{ if $qcomment }}
+ {{ for $qcomment as $qc }}
+ <span class="fakelink qcomment" onclick="commentInsert(this,$id); return false;" >$qc</span>
+ &nbsp;
+ {{ endfor }}
+ {{ endif }}
<textarea id="comment-edit-text-$id" class="comment-edit-text-empty" name="body" onFocus="commentOpen(this,$id);" onBlur="commentClose(this,$id);" >$comment</textarea>
<div class="comment-edit-text-end"></div>
diff --git a/view/contacts-top.tpl b/view/contacts-top.tpl
index 4dffda1ce..fca3efd54 100755
--- a/view/contacts-top.tpl
+++ b/view/contacts-top.tpl
@@ -1,4 +1,4 @@
-<h1>$header</h1>
+<h1>$header{{ if $total }} ($total){{ endif }}</h1>
$finding
@@ -11,8 +11,8 @@ $finding
</div>
<div id="contacts-search-end"></div>
+$tabs
+
+
-<div id="contacts-main" >
-<a href="$hide_url" id="contacts-show-hide-link">$hide_text</a>
-</div>
diff --git a/view/de/messages.po b/view/de/messages.po
index f1c7c1460..861f61b74 100755..100644
--- a/view/de/messages.po
+++ b/view/de/messages.po
@@ -13,2003 +13,2301 @@ msgid ""
msgstr ""
"Project-Id-Version: friendica\n"
"Report-Msgid-Bugs-To: http://bugs.friendica.com/\n"
-"POT-Creation-Date: 2012-01-10 08:21-0800\n"
-"PO-Revision-Date: 2012-01-12 11:08+0000\n"
-"Last-Translator: zottel <transifex@zottel.net>\n"
-"Language-Team: German (http://www.transifex.net/projects/p/friendica/team/de/)\n"
+"POT-Creation-Date: 2012-02-12 17:14-0800\n"
+"PO-Revision-Date: 2012-02-16 10:24+0000\n"
+"Last-Translator: bavatar <tobias.diekershoff@gmx.net>\n"
+"Language-Team: German (http://www.transifex.net/projects/p/friendica/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
-#: ../../mod/allfriends.php:9 ../../mod/follow.php:8
-#: ../../mod/contacts.php:117 ../../mod/settings.php:43
-#: ../../mod/settings.php:48 ../../mod/settings.php:403
-#: ../../mod/crepair.php:113 ../../mod/notifications.php:62
-#: ../../mod/message.php:9 ../../mod/message.php:46
-#: ../../mod/wall_upload.php:42 ../../mod/wall_attach.php:43
+#: ../../mod/oexchange.php:27
+msgid "Post successful."
+msgstr "Beitrag erfolgreich veröffentlicht."
+
+#: ../../mod/update_notes.php:41 ../../mod/update_community.php:18
+#: ../../mod/update_network.php:22 ../../mod/update_profile.php:41
+msgid "[Embedded content - reload page to view]"
+msgstr "[Eingebetteter Inhalt - Seite neu laden zum Betrachten]"
+
+#: ../../mod/crepair.php:102
+msgid "Contact settings applied."
+msgstr "Einstellungen zum Kontakt angewandt."
+
+#: ../../mod/crepair.php:104
+msgid "Contact update failed."
+msgstr "Konnte den Kontakt nicht aktualisieren."
+
+#: ../../mod/crepair.php:115 ../../mod/wall_attach.php:43
+#: ../../mod/fsuggest.php:78 ../../mod/events.php:109 ../../mod/api.php:26
+#: ../../mod/api.php:31 ../../mod/photos.php:129 ../../mod/photos.php:865
+#: ../../mod/editpost.php:10 ../../mod/install.php:171
+#: ../../mod/notifications.php:62 ../../mod/contacts.php:125
+#: ../../mod/settings.php:49 ../../mod/settings.php:404
+#: ../../mod/settings.php:409 ../../mod/manage.php:86 ../../mod/network.php:6
+#: ../../mod/notes.php:20 ../../mod/attach.php:33 ../../mod/group.php:19
+#: ../../mod/viewcontacts.php:21 ../../mod/register.php:36
+#: ../../mod/regmod.php:111 ../../mod/item.php:123 ../../mod/item.php:139
#: ../../mod/profile_photo.php:19 ../../mod/profile_photo.php:137
#: ../../mod/profile_photo.php:148 ../../mod/profile_photo.php:159
-#: ../../mod/manage.php:75 ../../mod/common.php:9 ../../mod/profiles.php:7
-#: ../../mod/profiles.php:229 ../../mod/invite.php:13 ../../mod/invite.php:81
-#: ../../mod/register.php:36 ../../mod/fsuggest.php:78
-#: ../../mod/editpost.php:10 ../../mod/regmod.php:111
-#: ../../mod/install.php:171 ../../mod/suggest.php:28
-#: ../../mod/display.php:111 ../../mod/notes.php:20
-#: ../../mod/dfrn_confirm.php:53 ../../mod/item.php:118
-#: ../../mod/photos.php:125 ../../mod/photos.php:860 ../../mod/network.php:6
-#: ../../mod/api.php:26 ../../mod/api.php:31 ../../mod/attach.php:33
-#: ../../mod/viewcontacts.php:21 ../../mod/group.php:19
-#: ../../mod/events.php:109 ../../index.php:288 ../../include/items.php:2867
-#: ../../addon/facebook/facebook.php:331
+#: ../../mod/message.php:9 ../../mod/message.php:46 ../../mod/allfriends.php:9
+#: ../../mod/wall_upload.php:42 ../../mod/follow.php:8 ../../mod/common.php:9
+#: ../../mod/display.php:112 ../../mod/profiles.php:7
+#: ../../mod/profiles.php:229 ../../mod/delegate.php:6
+#: ../../mod/suggest.php:28 ../../mod/invite.php:13 ../../mod/invite.php:81
+#: ../../mod/dfrn_confirm.php:53 ../../addon/facebook/facebook.php:331
+#: ../../include/items.php:2907 ../../index.php:288
msgid "Permission denied."
msgstr "Zugriff verweigert."
-#: ../../mod/allfriends.php:34
+#: ../../mod/crepair.php:129 ../../mod/fsuggest.php:20
+#: ../../mod/fsuggest.php:92 ../../mod/dfrn_confirm.php:118
+msgid "Contact not found."
+msgstr "Kontakt nicht gefunden."
+
+#: ../../mod/crepair.php:135
+msgid "Repair Contact Settings"
+msgstr "Kontakt-Einstellungen reparieren"
+
+#: ../../mod/crepair.php:137
+msgid ""
+"<strong>WARNING: This is highly advanced</strong> and if you enter incorrect"
+" information your communications with this contact may stop working."
+msgstr "<strong>ACHTUNG: Das sind Experten-Einstellungen!</strong> Wenn Du etwas falsches eingibst, funktioniert die Kommunikation mit diesem Kontakt evtl. nicht mehr."
+
+#: ../../mod/crepair.php:138
+msgid ""
+"Please use your browser 'Back' button <strong>now</strong> if you are "
+"uncertain what to do on this page."
+msgstr "Bitte nutze den Zurück-Button deines Browsers <strong>jetzt</strong>, wenn du dir unsicher bist, was auf dieser Seite gemacht wird."
+
+#: ../../mod/crepair.php:144
+msgid "Return to contact editor"
+msgstr "Zurück zum Kontakteditor"
+
+#: ../../mod/crepair.php:148 ../../mod/settings.php:455
+#: ../../mod/settings.php:481 ../../mod/admin.php:464 ../../mod/admin.php:473
+msgid "Name"
+msgstr "Name"
+
+#: ../../mod/crepair.php:149
+msgid "Account Nickname"
+msgstr "Account-Spitzname"
+
+#: ../../mod/crepair.php:150
+msgid "@Tagname - overrides Name/Nickname"
+msgstr "@Tagname - überschreibt Name/Spitzname"
+
+#: ../../mod/crepair.php:151
+msgid "Account URL"
+msgstr "Account-URL"
+
+#: ../../mod/crepair.php:152
+msgid "Friend Request URL"
+msgstr "URL für Freundschaftsanfragen"
+
+#: ../../mod/crepair.php:153
+msgid "Friend Confirm URL"
+msgstr "URL für Bestätigungen von Freundschaftsanfragen"
+
+#: ../../mod/crepair.php:154
+msgid "Notification Endpoint URL"
+msgstr "URL-Endpunkt für Benachrichtigungen"
+
+#: ../../mod/crepair.php:155
+msgid "Poll/Feed URL"
+msgstr "Pull/Feed-URL"
+
+#: ../../mod/crepair.php:156
+msgid "New photo from this URL"
+msgstr "Neues Foto von dieser URL"
+
+#: ../../mod/crepair.php:166 ../../mod/fsuggest.php:107
+#: ../../mod/events.php:333 ../../mod/photos.php:900 ../../mod/photos.php:958
+#: ../../mod/photos.php:1182 ../../mod/photos.php:1222
+#: ../../mod/photos.php:1262 ../../mod/photos.php:1293
+#: ../../mod/install.php:251 ../../mod/install.php:289
+#: ../../mod/localtime.php:45 ../../mod/contacts.php:319
+#: ../../mod/settings.php:453 ../../mod/settings.php:592
+#: ../../mod/settings.php:773 ../../mod/manage.php:109 ../../mod/group.php:84
+#: ../../mod/group.php:167 ../../mod/admin.php:296 ../../mod/admin.php:461
+#: ../../mod/admin.php:587 ../../mod/admin.php:652 ../../mod/profiles.php:375
+#: ../../mod/invite.php:106 ../../addon/facebook/facebook.php:410
+#: ../../addon/yourls/yourls.php:76 ../../addon/nsfw/nsfw.php:57
+#: ../../addon/uhremotestorage/uhremotestorage.php:89
+#: ../../addon/randplace/randplace.php:179 ../../addon/drpost/drpost.php:110
+#: ../../addon/geonames/geonames.php:187 ../../addon/oembed.old/oembed.php:41
+#: ../../addon/impressum/impressum.php:69 ../../addon/blockem/blockem.php:57
+#: ../../addon/editplain/editplain.php:84 ../../addon/blackout/blackout.php:94
+#: ../../addon/pageheader/pageheader.php:52
+#: ../../addon/statusnet/statusnet.php:280
+#: ../../addon/statusnet/statusnet.php:294
+#: ../../addon/statusnet/statusnet.php:320
+#: ../../addon/statusnet/statusnet.php:327
+#: ../../addon/statusnet/statusnet.php:349
+#: ../../addon/statusnet/statusnet.php:495 ../../addon/tumblr/tumblr.php:90
+#: ../../addon/numfriends/numfriends.php:85 ../../addon/wppost/wppost.php:102
+#: ../../addon/piwik/piwik.php:81 ../../addon/twitter/twitter.php:180
+#: ../../addon/twitter/twitter.php:203 ../../addon/twitter/twitter.php:315
+#: ../../addon/posterous/posterous.php:90 ../../include/conversation.php:515
+msgid "Submit"
+msgstr "Senden"
+
+#: ../../mod/help.php:30
+msgid "Help:"
+msgstr "Hilfe:"
+
+#: ../../mod/help.php:34 ../../include/nav.php:82
+msgid "Help"
+msgstr "Hilfe"
+
+#: ../../mod/help.php:38 ../../index.php:221
+msgid "Not Found"
+msgstr "Nicht gefunden"
+
+#: ../../mod/help.php:41 ../../index.php:224
+msgid "Page not found."
+msgstr "Seite nicht gefunden."
+
+#: ../../mod/wall_attach.php:57
#, php-format
-msgid "Friends of %s"
-msgstr "Freunde von %s"
+msgid "File exceeds size limit of %d"
+msgstr "Die Datei ist größer als das erlaubte Limit von %d"
-#: ../../mod/allfriends.php:40
-msgid "No friends to display."
-msgstr "Keine Freunde zum Anzeigen."
+#: ../../mod/wall_attach.php:85 ../../mod/wall_attach.php:96
+msgid "File upload failed."
+msgstr "Hochladen der Datei fehlgeschlagen."
-#: ../../mod/update_profile.php:41 ../../mod/update_network.php:22
-#: ../../mod/update_notes.php:41 ../../mod/update_community.php:18
-msgid "[Embedded content - reload page to view]"
-msgstr "[Eingebetteter Inhalt - Seite neu laden zum Betrachten]"
+#: ../../mod/fsuggest.php:63
+msgid "Friend suggestion sent."
+msgstr "Kontaktvorschlag gesendet."
+
+#: ../../mod/fsuggest.php:97
+msgid "Suggest Friends"
+msgstr "Kontakte vorschlagen"
+
+#: ../../mod/fsuggest.php:99
+#, php-format
+msgid "Suggest a friend for %s"
+msgstr "Schlage %s einen Kontakt vor"
+
+#: ../../mod/events.php:61
+msgid "Event description and start time are required."
+msgstr "Ereignis Beschreibung und Startzeit sind erforderlich."
+
+#: ../../mod/events.php:117 ../../include/nav.php:50 ../../boot.php:1345
+msgid "Events"
+msgstr "Veranstaltungen"
+
+#: ../../mod/events.php:207
+msgid "Create New Event"
+msgstr "Neue Veranstaltung erstellen"
+
+#: ../../mod/events.php:210
+msgid "Previous"
+msgstr "Vorherige"
+
+#: ../../mod/events.php:213 ../../mod/install.php:210
+msgid "Next"
+msgstr "Nächste"
+
+#: ../../mod/events.php:220
+msgid "l, F j"
+msgstr "l, F j"
+
+#: ../../mod/events.php:235
+msgid "Edit event"
+msgstr "Veranstaltung bearbeiten"
+
+#: ../../mod/events.php:237 ../../include/text.php:883
+msgid "link to source"
+msgstr "Link zum Originalbeitrag"
+
+#: ../../mod/events.php:305
+msgid "hour:minute"
+msgstr "Stunde:Minute"
+
+#: ../../mod/events.php:314
+msgid "Event details"
+msgstr "Veranstaltungsdetails"
-#: ../../mod/directory.php:31 ../../mod/dfrn_request.php:624
-#: ../../mod/community.php:16 ../../mod/display.php:7 ../../mod/search.php:71
-#: ../../mod/photos.php:754 ../../mod/viewcontacts.php:16
+#: ../../mod/events.php:315
+#, php-format
+msgid "Format is %s %s. Starting date and Description are required."
+msgstr "Format ist %s %s. Anfangsdatum und Beschreibung sind notwendig."
+
+#: ../../mod/events.php:316
+msgid "Event Starts:"
+msgstr "Veranstaltungsbeginn:"
+
+#: ../../mod/events.php:319
+msgid "Finish date/time is not known or not relevant"
+msgstr "Enddatum/-zeit ist nicht bekannt oder nicht relevant"
+
+#: ../../mod/events.php:321
+msgid "Event Finishes:"
+msgstr "Veranstaltungsende:"
+
+#: ../../mod/events.php:324
+msgid "Adjust for viewer timezone"
+msgstr "An Zeitzone des Betrachters anpassen"
+
+#: ../../mod/events.php:326
+msgid "Description:"
+msgstr "Beschreibung"
+
+#: ../../mod/events.php:328 ../../include/event.php:37
+#: ../../include/bb2diaspora.php:271 ../../boot.php:976
+msgid "Location:"
+msgstr "Ort:"
+
+#: ../../mod/events.php:330
+msgid "Share this event"
+msgstr "Veranstaltung teilen"
+
+#: ../../mod/tagrm.php:11 ../../mod/tagrm.php:94
+#: ../../mod/dfrn_request.php:685 ../../mod/settings.php:454
+#: ../../mod/settings.php:480 ../../addon/js_upload/js_upload.php:45
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#: ../../mod/tagrm.php:41
+msgid "Tag removed"
+msgstr "Tag entfernt"
+
+#: ../../mod/tagrm.php:79
+msgid "Remove Item Tag"
+msgstr "Gegenstands-Tag entfernen"
+
+#: ../../mod/tagrm.php:81
+msgid "Select a tag to remove: "
+msgstr "Wähle ein Tag zum Entfernen aus: "
+
+#: ../../mod/tagrm.php:93 ../../mod/delegate.php:130
+msgid "Remove"
+msgstr "Entfernen"
+
+#: ../../mod/dfrn_poll.php:91 ../../mod/dfrn_poll.php:517
+#, php-format
+msgid "%s welcomes %s"
+msgstr "%s heißt %s herzlich willkommen"
+
+#: ../../mod/api.php:76 ../../mod/api.php:102
+msgid "Authorize application connection"
+msgstr "Verbindung der Applikation authorisieren"
+
+#: ../../mod/api.php:77
+msgid "Return to your app and insert this Securty Code:"
+msgstr "Gehe zu deiner Anwendung zurück und trage dort folgenden Sicherheitscode ein:"
+
+#: ../../mod/api.php:89
+msgid "Please login to continue."
+msgstr "Bitte melde dich an um fortzufahren."
+
+#: ../../mod/api.php:104
+msgid ""
+"Do you want to authorize this application to access your posts and contacts,"
+" and/or create new posts for you?"
+msgstr "Möchtest du dieser Anwendung den Zugriff auf deine Beiträge und Kontakte sowie die Erstellung neuer Beiträge in deinem Namen gestatten?"
+
+#: ../../mod/api.php:105 ../../mod/dfrn_request.php:675
+#: ../../mod/settings.php:681 ../../mod/settings.php:687
+#: ../../mod/settings.php:695 ../../mod/settings.php:699
+#: ../../mod/settings.php:704 ../../mod/settings.php:710
+#: ../../mod/settings.php:716 ../../mod/settings.php:763
+#: ../../mod/settings.php:764 ../../mod/settings.php:765
+#: ../../mod/settings.php:766 ../../mod/register.php:524
+#: ../../mod/profiles.php:357
+msgid "Yes"
+msgstr "Ja"
+
+#: ../../mod/api.php:106 ../../mod/dfrn_request.php:676
+#: ../../mod/settings.php:681 ../../mod/settings.php:687
+#: ../../mod/settings.php:695 ../../mod/settings.php:699
+#: ../../mod/settings.php:704 ../../mod/settings.php:710
+#: ../../mod/settings.php:716 ../../mod/settings.php:763
+#: ../../mod/settings.php:764 ../../mod/settings.php:765
+#: ../../mod/settings.php:766 ../../mod/register.php:525
+#: ../../mod/profiles.php:358
+msgid "No"
+msgstr "Nein"
+
+#: ../../mod/photos.php:42
+msgid "Photo Albums"
+msgstr "Fotoalben"
+
+#: ../../mod/photos.php:50 ../../mod/photos.php:150 ../../mod/photos.php:879
+#: ../../mod/photos.php:950 ../../mod/photos.php:965 ../../mod/photos.php:1371
+#: ../../mod/photos.php:1383 ../../addon/communityhome/communityhome.php:110
+msgid "Contact Photos"
+msgstr "Kontaktbilder"
+
+#: ../../mod/photos.php:57 ../../mod/photos.php:975 ../../mod/photos.php:1413
+msgid "Upload New Photos"
+msgstr "Weitere Fotos hochladen"
+
+#: ../../mod/photos.php:68 ../../mod/settings.php:11
+msgid "everybody"
+msgstr "jeder"
+
+#: ../../mod/photos.php:139
+msgid "Contact information unavailable"
+msgstr "Kontaktinformationen nicht verfügbar"
+
+#: ../../mod/photos.php:150 ../../mod/photos.php:597 ../../mod/photos.php:950
+#: ../../mod/photos.php:965 ../../mod/register.php:327
+#: ../../mod/register.php:334 ../../mod/register.php:341
+#: ../../mod/profile_photo.php:58 ../../mod/profile_photo.php:65
+#: ../../mod/profile_photo.php:72 ../../mod/profile_photo.php:170
+#: ../../mod/profile_photo.php:246 ../../mod/profile_photo.php:255
+#: ../../addon/communityhome/communityhome.php:111
+msgid "Profile Photos"
+msgstr "Profilbilder"
+
+#: ../../mod/photos.php:160
+msgid "Album not found."
+msgstr "Album nicht gefunden."
+
+#: ../../mod/photos.php:178 ../../mod/photos.php:959
+msgid "Delete Album"
+msgstr "Album löschen"
+
+#: ../../mod/photos.php:241 ../../mod/photos.php:1183
+msgid "Delete Photo"
+msgstr "Foto löschen"
+
+#: ../../mod/photos.php:528
+msgid "was tagged in a"
+msgstr "wurde getaggt in einem"
+
+#: ../../mod/photos.php:528 ../../mod/like.php:127 ../../mod/tagger.php:70
+#: ../../addon/communityhome/communityhome.php:163
+#: ../../include/diaspora.php:1587 ../../include/conversation.php:31
+#: ../../include/conversation.php:104
+msgid "photo"
+msgstr "Foto"
+
+#: ../../mod/photos.php:528
+msgid "by"
+msgstr "von"
+
+#: ../../mod/photos.php:631 ../../addon/js_upload/js_upload.php:312
+msgid "Image exceeds size limit of "
+msgstr "Die Bildgröße übersteigt das Limit von "
+
+#: ../../mod/photos.php:639
+msgid "Image file is empty."
+msgstr "Bilddatei ist leer."
+
+#: ../../mod/photos.php:653 ../../mod/profile_photo.php:122
+#: ../../mod/wall_upload.php:65
+msgid "Unable to process image."
+msgstr "Konnte das Bild nicht bearbeiten."
+
+#: ../../mod/photos.php:673 ../../mod/profile_photo.php:251
+#: ../../mod/wall_upload.php:84
+msgid "Image upload failed."
+msgstr "Hochladen des Bildes gescheitert."
+
+#: ../../mod/photos.php:759 ../../mod/community.php:16
+#: ../../mod/dfrn_request.php:624 ../../mod/viewcontacts.php:16
+#: ../../mod/display.php:7 ../../mod/search.php:71 ../../mod/directory.php:31
msgid "Public access denied."
msgstr "Öffentlicher Zugriff verweigert."
-#: ../../mod/directory.php:49
-msgid "Global Directory"
-msgstr "Weltweites Verzeichnis"
+#: ../../mod/photos.php:769
+msgid "No photos selected"
+msgstr "Keine Bilder ausgewählt"
-#: ../../mod/directory.php:55
-msgid "Normal site view"
-msgstr "Normale Seitenansicht"
+#: ../../mod/photos.php:846
+msgid "Access to this item is restricted."
+msgstr "Zugriff zu diesem Eintrag wurde eingeschränkt."
-#: ../../mod/directory.php:57
-msgid "Admin - View all site entries"
-msgstr "Admin: Alle Einträge dieses Servers anzeigen"
+#: ../../mod/photos.php:907
+msgid "Upload Photos"
+msgstr "Bilder hochladen"
-#: ../../mod/directory.php:63
-msgid "Find on this site"
-msgstr "Auf diesem Server suchen"
+#: ../../mod/photos.php:910 ../../mod/photos.php:954
+msgid "New album name: "
+msgstr "Name des neuen Albums: "
-#: ../../mod/directory.php:65 ../../mod/contacts.php:372
-msgid "Finding: "
-msgstr "Funde: "
+#: ../../mod/photos.php:911
+msgid "or existing album name: "
+msgstr "oder existierender Albumname: "
-#: ../../mod/directory.php:66
-msgid "Site Directory"
-msgstr "Verzeichnis"
+#: ../../mod/photos.php:912
+msgid "Do not show a status post for this upload"
+msgstr "Keine Status-Mitteilung für diesen Beitrag anzeigen"
-#: ../../mod/directory.php:67 ../../mod/contacts.php:373
-#: ../../include/contact_widgets.php:34
-msgid "Find"
-msgstr "Finde"
+#: ../../mod/photos.php:914 ../../mod/photos.php:1178
+msgid "Permissions"
+msgstr "Berechtigungen"
-#: ../../mod/directory.php:122 ../../mod/profiles.php:426
-msgid "Age: "
-msgstr "Alter: "
+#: ../../mod/photos.php:969
+msgid "Edit Album"
+msgstr "Album bearbeiten"
-#: ../../mod/directory.php:125
-msgid "Gender: "
-msgstr "Geschlecht:"
+#: ../../mod/photos.php:984 ../../mod/photos.php:1396
+msgid "View Photo"
+msgstr "Fotos betrachten"
-#: ../../mod/directory.php:151
-msgid "No entries (some entries may be hidden)."
-msgstr "Keine Einträge (einige Einträge könnten versteckt sein)."
+#: ../../mod/photos.php:1019
+msgid "Permission denied. Access to this item may be restricted."
+msgstr "Zugriff verweigert. Zugriff zu diesem Eintrag könnte eingeschränkt sein."
-#: ../../mod/notice.php:15 ../../mod/viewsrc.php:15 ../../mod/admin.php:111
-#: ../../mod/admin.php:502 ../../mod/display.php:28 ../../mod/display.php:115
-#: ../../include/items.php:2779
-msgid "Item not found."
-msgstr "Beitrag nicht gefunden."
+#: ../../mod/photos.php:1021
+msgid "Photo not available"
+msgstr "Foto nicht verfügbar"
-#: ../../mod/viewsrc.php:7
-msgid "Access denied."
-msgstr "Zugriff verweigert."
+#: ../../mod/photos.php:1071
+msgid "View photo"
+msgstr "Fotos ansehen"
-#: ../../mod/newmember.php:6
-msgid "Welcome to Friendica"
-msgstr "Willkommen bei Friendica"
+#: ../../mod/photos.php:1071
+msgid "Edit photo"
+msgstr "Foto bearbeiten"
-#: ../../mod/newmember.php:8
-msgid "New Member Checklist"
-msgstr "Checkliste für neue Mitglieder"
+#: ../../mod/photos.php:1072
+msgid "Use as profile photo"
+msgstr "Als Profilbild verwenden"
-#: ../../mod/newmember.php:12
+#: ../../mod/photos.php:1078 ../../include/conversation.php:450
+msgid "Private Message"
+msgstr "Private Nachricht"
+
+#: ../../mod/photos.php:1089
+msgid "View Full Size"
+msgstr "Betrachte Originalgröße"
+
+#: ../../mod/photos.php:1157
+msgid "Tags: "
+msgstr "Tags: "
+
+#: ../../mod/photos.php:1160
+msgid "[Remove any tag]"
+msgstr "[Tag entfernen]"
+
+#: ../../mod/photos.php:1171
+msgid "New album name"
+msgstr "Name des neuen Albums"
+
+#: ../../mod/photos.php:1174
+msgid "Caption"
+msgstr "Bildunterschrift"
+
+#: ../../mod/photos.php:1176
+msgid "Add a Tag"
+msgstr "Tag hinzufügen"
+
+#: ../../mod/photos.php:1180
msgid ""
-"We would like to offer some tips and links to help make your experience "
-"enjoyable. Click any item to visit the relevant page."
-msgstr ""
-"Wir möchten dir einige Tipps und Links anbieten, um deine Erfahrung mit "
-"Friendica so angenehm wie möglich zu machen. Klicke einfach einen Aspekt an,"
-" um weitere Informationen zu erhalten."
+"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+msgstr "Beispiel: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
-#: ../../mod/newmember.php:16
+#: ../../mod/photos.php:1200 ../../include/conversation.php:497
+msgid "I like this (toggle)"
+msgstr "Ich mag das (toggle)"
+
+#: ../../mod/photos.php:1201 ../../include/conversation.php:498
+msgid "I don't like this (toggle)"
+msgstr "Ich mag das nicht (toggle)"
+
+#: ../../mod/photos.php:1202 ../../include/conversation.php:889
+msgid "Share"
+msgstr "Teilen"
+
+#: ../../mod/photos.php:1203 ../../mod/editpost.php:100
+#: ../../mod/message.php:155 ../../mod/message.php:296
+#: ../../include/conversation.php:321 ../../include/conversation.php:652
+#: ../../include/conversation.php:906
+msgid "Please wait"
+msgstr "Bitte warten"
+
+#: ../../mod/photos.php:1219 ../../mod/photos.php:1259
+#: ../../mod/photos.php:1290 ../../include/conversation.php:512
+msgid "This is you"
+msgstr "Das bist du"
+
+#: ../../mod/photos.php:1221 ../../mod/photos.php:1261
+#: ../../mod/photos.php:1292 ../../include/conversation.php:514
+#: ../../boot.php:443
+msgid "Comment"
+msgstr "Kommentar"
+
+#: ../../mod/photos.php:1223 ../../mod/editpost.php:119
+#: ../../include/conversation.php:516 ../../include/conversation.php:924
+msgid "Preview"
+msgstr "Vorschau"
+
+#: ../../mod/photos.php:1320 ../../mod/settings.php:513
+#: ../../mod/group.php:154 ../../mod/admin.php:468
+#: ../../include/conversation.php:280 ../../include/conversation.php:536
+msgid "Delete"
+msgstr "Löschen"
+
+#: ../../mod/photos.php:1402
+msgid "View Album"
+msgstr "Album betrachten"
+
+#: ../../mod/photos.php:1411
+msgid "Recent Photos"
+msgstr "Neueste Fotos"
+
+#: ../../mod/community.php:21
+msgid "Not available."
+msgstr "Nicht verfügbar."
+
+#: ../../mod/community.php:30 ../../include/nav.php:97
+msgid "Community"
+msgstr "Gemeinschaft"
+
+#: ../../mod/community.php:60 ../../mod/search.php:118
+msgid "No results."
+msgstr "Keine Ergebnisse."
+
+#: ../../mod/friendica.php:43
+msgid "This is Friendica, version"
+msgstr "Dies ist Friendica version"
+
+#: ../../mod/friendica.php:44
+msgid "running at web location"
+msgstr "die unter folgender Webadresse zu finden ist"
+
+#: ../../mod/friendica.php:46
msgid ""
-"On your <em>Settings</em> page - change your initial password. Also make a "
-"note of your Identity Address. This will be useful in making friends."
-msgstr ""
-"Ändere dein anfängliches Passwort auf der <em>Einstellungen</em> Seite. Bei "
-"dieser Gelegenheit solltest du dir die Adresse deines Profils merken, diese "
-"wird benötigt um mit Anderen in Kontakt zu treten."
+"Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn "
+"more about the Friendica project."
+msgstr "Bitte besuche <a href=\"http://friendica.com\">Friendica.com</a> um mehr über das Friendica Projekt zu erfahren."
-#: ../../mod/newmember.php:18
+#: ../../mod/friendica.php:48
+msgid "Bug reports and issues: please visit"
+msgstr "Probleme oder Fehler gefunden? Bitte besuche"
+
+#: ../../mod/friendica.php:49
msgid ""
-"Review the other settings, particularly the privacy settings. An unpublished"
-" directory listing is like having an unlisted phone number. In general, you "
-"should probably publish your listing - unless all of your friends and "
-"potential friends know exactly how to find you."
-msgstr ""
-"Überprüfe die restlichen Einstellungen, insbesondere die Einstellungen zur "
-"Privatsphäre. Wenn du dein Profil nicht veröffentlichst ist das wie wenn "
-"niemand deine Telefonnummer kennt. Im Allgemeinen solltest du es "
-"veröffentlichen - außer all deine Freunde und potentiellen Freunde wissen "
-"wie man dich findet."
+"Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - "
+"dot com"
+msgstr "Vorschläge, Lob, Spenden usw.: E-Mail an \"Info\" at Friendica - dot com"
-#: ../../mod/newmember.php:20
+#: ../../mod/friendica.php:54
+msgid "Installed plugins/addons/apps"
+msgstr "Installierte Plugins/Erweiterungen/Apps"
+
+#: ../../mod/friendica.php:62
+msgid "No installed plugins/addons/apps"
+msgstr "Keine Plugins/Erweiterungen/Apps installiert"
+
+#: ../../mod/editpost.php:17 ../../mod/editpost.php:27
+msgid "Item not found"
+msgstr "Beitrag nicht gefunden"
+
+#: ../../mod/editpost.php:32
+msgid "Edit post"
+msgstr "Beitrag bearbeiten"
+
+#: ../../mod/editpost.php:76 ../../include/conversation.php:875
+msgid "Post to Email"
+msgstr "An E-Mail senden"
+
+#: ../../mod/editpost.php:91 ../../mod/settings.php:512
+#: ../../include/conversation.php:523
+msgid "Edit"
+msgstr "Bearbeiten"
+
+#: ../../mod/editpost.php:92 ../../mod/message.php:153
+#: ../../mod/message.php:294 ../../include/conversation.php:890
+msgid "Upload photo"
+msgstr "Foto hochladen"
+
+#: ../../mod/editpost.php:93 ../../include/conversation.php:892
+msgid "Attach file"
+msgstr "Datei anhängen"
+
+#: ../../mod/editpost.php:94 ../../mod/message.php:154
+#: ../../mod/message.php:295 ../../include/conversation.php:894
+msgid "Insert web link"
+msgstr "Weblink einfügen"
+
+#: ../../mod/editpost.php:95
+msgid "Insert YouTube video"
+msgstr "YouTube-Video einfügen"
+
+#: ../../mod/editpost.php:96
+msgid "Insert Vorbis [.ogg] video"
+msgstr "Vorbis [.ogg] Video einfügen"
+
+#: ../../mod/editpost.php:97
+msgid "Insert Vorbis [.ogg] audio"
+msgstr "Vorbis [.ogg] Audio einfügen"
+
+#: ../../mod/editpost.php:98 ../../include/conversation.php:900
+msgid "Set your location"
+msgstr "Deinen Standort festlegen"
+
+#: ../../mod/editpost.php:99 ../../include/conversation.php:902
+msgid "Clear browser location"
+msgstr "Browser-Standort leeren"
+
+#: ../../mod/editpost.php:101 ../../include/conversation.php:907
+msgid "Permission settings"
+msgstr "Berechtigungseinstellungen"
+
+#: ../../mod/editpost.php:109 ../../include/conversation.php:916
+msgid "CC: email addresses"
+msgstr "Cc:-E-Mail-Addressen"
+
+#: ../../mod/editpost.php:110 ../../include/conversation.php:917
+msgid "Public post"
+msgstr "Öffentlicher Beitrag"
+
+#: ../../mod/editpost.php:113 ../../include/conversation.php:905
+msgid "Set title"
+msgstr "Titel setzen"
+
+#: ../../mod/editpost.php:114 ../../include/conversation.php:919
+msgid "Example: bob@example.com, mary@example.com"
+msgstr "Z.B.: bob@example.com, mary@example.com"
+
+#: ../../mod/dfrn_request.php:92
+msgid "This introduction has already been accepted."
+msgstr "Diese Kontaktanfrage wurde bereits akzeptiert."
+
+#: ../../mod/dfrn_request.php:116 ../../mod/dfrn_request.php:381
+msgid "Profile location is not valid or does not contain profile information."
+msgstr "Profiladresse ist ungültig oder stellt einige Profildaten nicht zur Verfügung."
+
+#: ../../mod/dfrn_request.php:121 ../../mod/dfrn_request.php:386
+msgid "Warning: profile location has no identifiable owner name."
+msgstr "Warnung: Es konnte kein Name des Besitzers von der angegebenen Profiladresse gefunden werden."
+
+#: ../../mod/dfrn_request.php:123 ../../mod/dfrn_request.php:388
+msgid "Warning: profile location has no profile photo."
+msgstr "Warnung: Es konnte kein Profilbild bei der angegebenen Profiladresse gefunden werden."
+
+#: ../../mod/dfrn_request.php:126 ../../mod/dfrn_request.php:391
+#, php-format
+msgid "%d required parameter was not found at the given location"
+msgid_plural "%d required parameters were not found at the given location"
+msgstr[0] "%d benötigter Parameter wurde an der angegebenen Stelle nicht gefunden"
+msgstr[1] "%d benötigte Parameter wurden an der angegebenen Stelle nicht gefunden"
+
+#: ../../mod/dfrn_request.php:167
+msgid "Introduction complete."
+msgstr "Kontaktanfrage abgeschlossen."
+
+#: ../../mod/dfrn_request.php:191
+msgid "Unrecoverable protocol error."
+msgstr "Nicht behebbarer Protokollfehler."
+
+#: ../../mod/dfrn_request.php:219
+msgid "Profile unavailable."
+msgstr "Profil nicht verfügbar."
+
+#: ../../mod/dfrn_request.php:244
+#, php-format
+msgid "%s has received too many connection requests today."
+msgstr "%s hat heute zu viele Freundschaftsanfragen erhalten."
+
+#: ../../mod/dfrn_request.php:245
+msgid "Spam protection measures have been invoked."
+msgstr "Maßnahmen zum Spamschutz wurden ergriffen."
+
+#: ../../mod/dfrn_request.php:246
+msgid "Friends are advised to please try again in 24 hours."
+msgstr "Freunde sind angehalten, es in 24 Stunden erneut zu versuchen."
+
+#: ../../mod/dfrn_request.php:306
+msgid "Invalid locator"
+msgstr "Ungültiger Locator"
+
+#: ../../mod/dfrn_request.php:326
+msgid "Unable to resolve your name at the provided location."
+msgstr "Konnte deinen Namen an der angegebenen Stelle nicht finden."
+
+#: ../../mod/dfrn_request.php:339
+msgid "You have already introduced yourself here."
+msgstr "Du hast dich hier bereits vorgestellt."
+
+#: ../../mod/dfrn_request.php:343
+#, php-format
+msgid "Apparently you are already friends with %s."
+msgstr "Es scheint so, als ob du bereits ein Freund von %s bist."
+
+#: ../../mod/dfrn_request.php:364
+msgid "Invalid profile URL."
+msgstr "Ungültige Profil-URL."
+
+#: ../../mod/dfrn_request.php:370 ../../mod/follow.php:20
+msgid "Disallowed profile URL."
+msgstr "Nicht erlaubte Profil-URL."
+
+#: ../../mod/dfrn_request.php:439 ../../mod/contacts.php:102
+msgid "Failed to update contact record."
+msgstr "Aktualisierung der Kontaktdaten fehlgeschlagen."
+
+#: ../../mod/dfrn_request.php:460
+msgid "Your introduction has been sent."
+msgstr "Deine Kontaktanfrage wurde gesendet."
+
+#: ../../mod/dfrn_request.php:513
+msgid "Please login to confirm introduction."
+msgstr "Bitte melde dich an, um die Kontaktanfrage zu bestätigen."
+
+#: ../../mod/dfrn_request.php:527
msgid ""
-"Upload a profile photo if you have not done so already. Studies have shown "
-"that people with real photos of themselves are ten times more likely to make"
-" friends than people who do not."
-msgstr ""
-"Lade ein Profilbild hoch falls du es noch nicht getan hast. Studien haben "
-"gezeigt, dass es zehnmal wahrscheinlicher ist neue Freunde zu finden, wenn "
-"du ein Bild von dir selbst verwendest als wenn du dies nicht tust."
+"Incorrect identity currently logged in. Please login to "
+"<strong>this</strong> profile."
+msgstr "Incorrect identity currently logged in. Please login to <strong>this</strong> profile."
-#: ../../mod/newmember.php:23
+#: ../../mod/dfrn_request.php:539
+#, php-format
+msgid "Welcome home %s."
+msgstr "Willkommen zurück %s."
+
+#: ../../mod/dfrn_request.php:540
+#, php-format
+msgid "Please confirm your introduction/connection request to %s."
+msgstr "Bitte bestätige deine Kontaktanfrage bei %s."
+
+#: ../../mod/dfrn_request.php:541
+msgid "Confirm"
+msgstr "Bestätigen"
+
+#: ../../mod/dfrn_request.php:581 ../../include/items.php:2443
+msgid "[Name Withheld]"
+msgstr "[Name Zurückgehalten]"
+
+#: ../../mod/dfrn_request.php:665
+#, php-format
msgid ""
-"Authorise the Facebook Connector if you currently have a Facebook account "
-"and we will (optionally) import all your Facebook friends and conversations."
-msgstr ""
-"Richte die Verbindung zu Facebook ein, wenn du im Augenblick ein Facebook "
-"Konto hast und (optional) deine Facebook Freunde und Unterhaltungen "
-"importieren willst."
+"Diaspora members: Please do not use this form. Instead, enter \"%s\" into "
+"your Diaspora search bar."
+msgstr "Diaspora-User: Bitte nicht dieses Formular benutzen! Gebt statt dessen \"%s\" in der Diaspora-Suchleiste ein."
-#: ../../mod/newmember.php:28
+#: ../../mod/dfrn_request.php:668
msgid ""
-"Enter your email access information on your Connector Settings page if you "
-"wish to import and interact with friends or mailing lists from your email "
-"INBOX"
-msgstr ""
-"Gib deine E-Mail-Zugangsinformationen auf der Connector-Einstellungsseite "
-"ein, falls du E-Mails aus deinem Posteingang importieren und mit Freunden "
-"und Mailinglisten interagieren willlst."
+"Please enter your 'Identity Address' from one of the following supported "
+"social networks:"
+msgstr "Bitte gib die Adresse deines Profils in einem der unterstützten sozialen Netzwerke an:"
-#: ../../mod/newmember.php:30
+#: ../../mod/dfrn_request.php:671
+msgid "Friend/Connection Request"
+msgstr "Freundschafts-/Kontaktanfrage"
+
+#: ../../mod/dfrn_request.php:672
msgid ""
-"Edit your <strong>default</strong> profile to your liking. Review the "
-"settings for hiding your list of friends and hiding the profile from unknown"
-" visitors."
-msgstr ""
-"Editiere dein <strong>Standard</strong> Profil nach deinen Vorlieben. "
-"Überprüfe die Einstellungen zum Verbergen deiner Freundesliste vor "
-"unbekannten Betrachtern des Profils."
+"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
+"testuser@identi.ca"
+msgstr "Beispiele: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"
-#: ../../mod/newmember.php:32
+#: ../../mod/dfrn_request.php:673
+msgid "Please answer the following:"
+msgstr "Bitte beantworte folgende Fragen:"
+
+#: ../../mod/dfrn_request.php:674
+#, php-format
+msgid "Does %s know you?"
+msgstr "Kennt %s dich?"
+
+#: ../../mod/dfrn_request.php:677
+msgid "Add a personal note:"
+msgstr "Eine persönliche Notiz anfügen:"
+
+#: ../../mod/dfrn_request.php:679 ../../include/contact_selectors.php:76
+msgid "Friendica"
+msgstr "Friendica"
+
+#: ../../mod/dfrn_request.php:680
+msgid "StatusNet/Federated Social Web"
+msgstr "StatusNet/Federated Social Web"
+
+#: ../../mod/dfrn_request.php:681 ../../mod/settings.php:548
+#: ../../include/contact_selectors.php:80
+msgid "Diaspora"
+msgstr "Diaspora"
+
+#: ../../mod/dfrn_request.php:682
+msgid "- please share from your own site as noted above"
+msgstr "- bitte fange von Deiner eigenen Seite aus zu teilen an"
+
+#: ../../mod/dfrn_request.php:683
+msgid "Your Identity Address:"
+msgstr "Adresse deines Profils:"
+
+#: ../../mod/dfrn_request.php:684
+msgid "Submit Request"
+msgstr "Anfrage abschicken"
+
+#: ../../mod/install.php:111
+msgid "Friendica Social Communications Server - Setup"
+msgstr "Friendica-Server für soziale Netzwerke – Setup"
+
+#: ../../mod/install.php:117 ../../mod/install.php:157
+#: ../../mod/install.php:230
+msgid "Database connection"
+msgstr "Datenbank-Verbindung"
+
+#: ../../mod/install.php:124
+msgid "Could not connect to database."
+msgstr "Verbindung zur Datenbank gescheitert"
+
+#: ../../mod/install.php:128
+msgid "Could not create table."
+msgstr "Konnte Tabelle nicht erstellen."
+
+#: ../../mod/install.php:133
+msgid "Your Friendica site database has been installed."
+msgstr "Die Datenbank deiner Friendica Seite wurde installiert."
+
+#: ../../mod/install.php:134
msgid ""
-"Set some public keywords for your default profile which describe your "
-"interests. We may be able to find other people with similar interests and "
-"suggest friendships."
-msgstr ""
-"Trage ein paar öffentliche Stichwörter in dein Standardprofil ein, die deine"
-" Interessen beschreiben. Eventuell sind wir in der Lage Leute zu finden, die"
-" deine Interessen teilen und können dir dann Kontakte vorschlagen."
+"IMPORTANT: You will need to [manually] setup a scheduled task for the "
+"poller."
+msgstr "WICHTIG: Du musst [manuell] einen Cronjob (o.ä.) für den Poller einrichten."
-#: ../../mod/newmember.php:34
+#: ../../mod/install.php:135 ../../mod/install.php:151
+#: ../../mod/install.php:209
+msgid "Please see the file \"INSTALL.txt\"."
+msgstr "Lies bitte die \"INSTALL.txt\"."
+
+#: ../../mod/install.php:137
+msgid "Proceed to registration"
+msgstr "Mit der Registrierung fortfahren"
+
+#: ../../mod/install.php:143
+msgid "Proceed with Installation"
+msgstr "Mit der Installation fortfahren"
+
+#: ../../mod/install.php:150
msgid ""
-"Your Contacts page is your gateway to managing friendships and connecting "
-"with friends on other networks. Typically you enter their address or site "
-"URL in the <em>Add New Contact</em> dialog."
-msgstr ""
-"Die Kontakte-Seite ist die Einstiegsseite, von der aus du Kontakte verwalten"
-" und dich mit Freunden in anderen Netzwerken verbinden kannst. Normalerweise"
-" gibst du dazu einfach ihre Adresse oder die URL der Seite im Kasten "
-"<em>Neuen Kontakt hinzufügen</em> ein."
+"You may need to import the file \"database.sql\" manually using phpmyadmin "
+"or mysql."
+msgstr "Möglicherweise musst du die Datei \"database.sql\" manuell mit phpmyadmin oder mysql importieren."
-#: ../../mod/newmember.php:36
+#: ../../mod/install.php:158
+msgid "Database import failed."
+msgstr "Import der Datenbank schlug fehl."
+
+#: ../../mod/install.php:206
+msgid "System check"
+msgstr "Systemtest"
+
+#: ../../mod/install.php:211
+msgid "Check again"
+msgstr "Noch einmal testen"
+
+#: ../../mod/install.php:231
msgid ""
-"The Directory page lets you find other people in this network or other "
-"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
-"their profile page. Provide your own Identity Address if requested."
-msgstr ""
-"Ãœber die Verzeichnisseite kannst du andere Personen auf diesem Server oder "
-"anderen verteilten Seiten finden. Halte nach einem <em>Verbinden</em> oder "
-"<em>Folgen</em> Link auf deren Profilseiten Ausschau und gib deine eigene "
-"Profiladresse an falls du danach gefragt wirst."
+"In order to install Friendica we need to know how to connect to your "
+"database."
+msgstr "Um Friendica installieren zu können müssen wir wissen wie wir zu deiner Datenbank Kontakt aufnehmen können."
-#: ../../mod/newmember.php:38
+#: ../../mod/install.php:232
msgid ""
-"Once you have made some friends, organize them into private conversation "
-"groups from the sidebar of your Contacts page and then you can interact with"
-" each group privately on your Network page."
-msgstr ""
-"Sobald du einige Freunde gefunden hast, organisiere sie in Gruppen zur "
-"privaten Kommunikation im Seitenmenü der Kontakte-Seite. Du kannst dann mit "
-"jeder dieser Gruppen von der Netzwerkseite aus privat interagieren."
+"Please contact your hosting provider or site administrator if you have "
+"questions about these settings."
+msgstr "Bitte kontaktiere den Hosting Provider oder den Administrator der Seite, falls du Fragen zu diesen Einstellungen haben solltest."
-#: ../../mod/newmember.php:40
+#: ../../mod/install.php:233
msgid ""
-"Our <strong>help</strong> pages may be consulted for detail on other program"
-" features and resources."
-msgstr ""
-"Unsere <strong>Hilfe</strong> Seiten können herangezogen werden, um weitere "
-"Einzelheiten zu andern Programm Features zu erhalten."
+"The database you specify below should already exist. If it does not, please "
+"create it before continuing."
+msgstr "Die Datenbank, die du unten angibst, sollte bereits existieren. Ist dies noch nicht der Fall, erzeuge sie bitte bevor du mit der Installation fortfährst."
-#: ../../mod/follow.php:20 ../../mod/dfrn_request.php:370
-msgid "Disallowed profile URL."
-msgstr "Nicht erlaubte Profil-URL."
+#: ../../mod/install.php:237
+msgid "Database Server Name"
+msgstr "Datenbank-Server"
-#: ../../mod/follow.php:27
-msgid "Connect URL missing."
-msgstr "Connect-URL fehlt"
+#: ../../mod/install.php:238
+msgid "Database Login Name"
+msgstr "Datenbank-Nutzer"
-#: ../../mod/follow.php:47
+#: ../../mod/install.php:239
+msgid "Database Login Password"
+msgstr "Datenbank-Passwort"
+
+#: ../../mod/install.php:240
+msgid "Database Name"
+msgstr "Datenbank-Name"
+
+#: ../../mod/install.php:241 ../../mod/install.php:280
+msgid "Site administrator email address"
+msgstr "E-Mail-Adresse des Administrators"
+
+#: ../../mod/install.php:241 ../../mod/install.php:280
msgid ""
-"This site is not configured to allow communications with other networks."
-msgstr ""
-"Diese Seite ist so konfiguriert, dass keine Kommunikation mit anderen "
-"Netzwerken erfolgen kann."
+"Your account email address must match this in order to use the web admin "
+"panel."
+msgstr "Die E-Mail-Adresse, die in deinem Friendica-Account eingetragen, muss mit dieser Adresse übereinstimmen, damit du das Admin-Panel benutzen kannst."
-#: ../../mod/follow.php:48 ../../mod/follow.php:58
-msgid "No compatible communication protocols or feeds were discovered."
-msgstr ""
-"Es wurden keine kompatiblen Kommunikationsprotokolle oder Feeds gefunden."
+#: ../../mod/install.php:245 ../../mod/install.php:283
+msgid "Please select a default timezone for your website"
+msgstr "Bitte wähle die Standardzeitzone deiner Webseite"
-#: ../../mod/follow.php:56
-msgid "The profile address specified does not provide adequate information."
-msgstr "Die angegebene Profiladresse liefert unzureichende Informationen."
+#: ../../mod/install.php:270
+msgid "Site settings"
+msgstr "Server-Einstellungen"
-#: ../../mod/follow.php:60
-msgid "An author or name was not found."
-msgstr "Es wurde kein Autor oder Name gefunden."
+#: ../../mod/install.php:323
+msgid "Could not find a command line version of PHP in the web server PATH."
+msgstr "Konnte keine Kommandozeilenversion von PHP im PATH des Servers finden."
-#: ../../mod/follow.php:62
-msgid "No browser URL could be matched to this address."
-msgstr "Zu dieser Adresse konnte keine passende Browser URL gefunden werden."
+#: ../../mod/install.php:326
+msgid "PHP executable path"
+msgstr "Pfad zu PHP"
-#: ../../mod/follow.php:69
+#: ../../mod/install.php:326
+msgid "Enter full path to php executable"
+msgstr "Kompletter Pfad zum PHP-Executable"
+
+#: ../../mod/install.php:331
+msgid "Command line PHP"
+msgstr "Kommadozeilen-PHP"
+
+#: ../../mod/install.php:340
msgid ""
-"The profile address specified belongs to a network which has been disabled "
-"on this site."
-msgstr ""
-"Die Adresse dieses Profils gehört zu einem Netzwerk mit dem die "
-"Kommunikation auf dieser Seite ausgeschaltet wurde."
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
+msgstr "Die Kommandozeilenversion von PHP auf deinem System hat \"register_argc_argv\" nicht aktiviert."
-#: ../../mod/follow.php:74
+#: ../../mod/install.php:341
+msgid "This is required for message delivery to work."
+msgstr "Dies wird für die Auslieferung von Nachrichten benötigt."
+
+#: ../../mod/install.php:343
+msgid "PHP \"register_argc_argv\""
+msgstr "PHP \"register_argc_argv\""
+
+#: ../../mod/install.php:364
msgid ""
-"Limited profile. This person will be unable to receive direct/personal "
-"notifications from you."
-msgstr ""
-"Eingeschränktes Profil. Diese Person wird keine direkten/privaten "
-"Nachrichten von dir erhalten können."
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
+msgstr "Fehler: Die Funktion \"openssl_pkey_new\" auf diesem System ist nicht in der Lage, Verschlüsselungsschlüssel zu erzeugen"
-#: ../../mod/follow.php:144
-msgid "Unable to retrieve contact information."
-msgstr "Konnte die Kontaktinformationen nicht empfangen."
+#: ../../mod/install.php:365
+msgid ""
+"If running under Windows, please see "
+"\"http://www.php.net/manual/en/openssl.installation.php\"."
+msgstr "Wenn der Server unter Windows läuft, schau dir bitte \"http://www.php.net/manual/en/openssl.installation.php\" an."
-#: ../../mod/follow.php:190
-msgid "following"
-msgstr "folgen"
+#: ../../mod/install.php:367
+msgid "Generate encryption keys"
+msgstr "Schlüssel erzeugen"
-#: ../../mod/dirfind.php:23
-msgid "People Search"
-msgstr "Personen Suche"
+#: ../../mod/install.php:374
+msgid "libCurl PHP module"
+msgstr "PHP: libCurl-Modul"
-#: ../../mod/dirfind.php:57 ../../mod/match.php:65
+#: ../../mod/install.php:375
+msgid "GD graphics PHP module"
+msgstr "PHP: GD-Grafikmodul"
+
+#: ../../mod/install.php:376
+msgid "OpenSSL PHP module"
+msgstr "PHP: OpenSSL-Modul"
+
+#: ../../mod/install.php:377
+msgid "mysqli PHP module"
+msgstr "PHP: mysqli-Modul"
+
+#: ../../mod/install.php:378
+msgid "mb_string PHP module"
+msgstr "PHP: mb_string-Modul"
+
+#: ../../mod/install.php:383 ../../mod/install.php:385
+msgid "Apace mod_rewrite module"
+msgstr "Apache: mod_rewrite-Modul"
+
+#: ../../mod/install.php:383
+msgid ""
+"Error: Apache webserver mod-rewrite module is required but not installed."
+msgstr "Fehler: Das Apache-Modul mod-rewrite wird benötigt, es ist allerdings nicht installiert."
+
+#: ../../mod/install.php:390
+msgid "Error: libCURL PHP module required but not installed."
+msgstr "Fehler: Das libCURL PHP Modul wird benötigt ist aber nicht installiert."
+
+#: ../../mod/install.php:394
+msgid ""
+"Error: GD graphics PHP module with JPEG support required but not installed."
+msgstr "Fehler: Das GD-Graphikmodul für PHP mit JPEG-Unterstützung ist nicht installiert."
+
+#: ../../mod/install.php:398
+msgid "Error: openssl PHP module required but not installed."
+msgstr "Fehler: Das openssl-Modul von PHP ist nicht installiert."
+
+#: ../../mod/install.php:402
+msgid "Error: mysqli PHP module required but not installed."
+msgstr "Fehler: Das mysqli-Modul von PHP ist nicht installiert."
+
+#: ../../mod/install.php:406
+msgid "Error: mb_string PHP module required but not installed."
+msgstr "Fehler: mb_string PHP Module wird benötigt ist aber nicht installiert."
+
+#: ../../mod/install.php:423
+msgid ""
+"The web installer needs to be able to create a file called \".htconfig.php\""
+" in the top folder of your web server and it is unable to do so."
+msgstr "Der Installationswizard muss in der Lage sein, eine Datei im Stammverzeichnis deines Webservers anzulegen, ist allerdings derzeit nicht in der Lage, dies zu tun."
+
+#: ../../mod/install.php:424
+msgid ""
+"This is most often a permission setting, as the web server may not be able "
+"to write files in your folder - even if you can."
+msgstr "In den meisten Fällen ist dies ein Problem mit den Schreibrechten, der Webserver könnte keine Schreiberlaubnis haben, selbst wenn du sie hast."
+
+#: ../../mod/install.php:425
+msgid ""
+"Please check with your site documentation or support people to see if this "
+"situation can be corrected."
+msgstr "Bitte überprüfe die Einstellungen und frage im Zweifelsfall dein Support Team, um diese Situation zu beheben."
+
+#: ../../mod/install.php:426
+msgid ""
+"If not, you may be required to perform a manual installation. Please see the"
+" file \"INSTALL.txt\" for instructions."
+msgstr "Sollte dies nicht möglich sein, musst du die Installation manuell durchführen. Lies dazu bitte in der Datei \"INSTALL.txt\"."
+
+#: ../../mod/install.php:429
+msgid ".htconfig.php is writable"
+msgstr "Schreibrechte auf .htconfig.php"
+
+#: ../../mod/install.php:436
+msgid ""
+"The database configuration file \".htconfig.php\" could not be written. "
+"Please use the enclosed text to create a configuration file in your web "
+"server root."
+msgstr "Die Konfigurationsdatei \".htconfig.php\" konnte nicht angelegt werden. Bitte verwende den angefügten Text um die Datei im Stammverzeichnis deiner Friendica-Installation zu erzeugen."
+
+#: ../../mod/install.php:461
+msgid "Errors encountered creating database tables."
+msgstr "Fehler aufgetreten während der Erzeugung der Datenbanktabellen."
+
+#: ../../mod/localtime.php:12 ../../include/event.php:11
+#: ../../include/bb2diaspora.php:249
+msgid "l F d, Y \\@ g:i A"
+msgstr "l F d, Y \\@ g:i A"
+
+#: ../../mod/localtime.php:24
+msgid "Time Conversion"
+msgstr "Zeitumrechnung"
+
+#: ../../mod/localtime.php:26
+msgid ""
+"Friendika provides this service for sharing events with other networks and "
+"friends in unknown timezones."
+msgstr "Friendica bietet diese Funktion an, um das teilen von Events mit Kontakten zu vereinfachen, deren Zeitzone nicht ermittelt werden kann."
+
+#: ../../mod/localtime.php:30
+#, php-format
+msgid "UTC time: %s"
+msgstr "UTC Zeit: %s"
+
+#: ../../mod/localtime.php:33
+#, php-format
+msgid "Current timezone: %s"
+msgstr "Aktuelle Zeitzone: %s"
+
+#: ../../mod/localtime.php:36
+#, php-format
+msgid "Converted localtime: %s"
+msgstr "Umgerechnete lokale Zeit: %s"
+
+#: ../../mod/localtime.php:41
+msgid "Please select your timezone:"
+msgstr "Bitte wähle deine Zeitzone."
+
+#: ../../mod/match.php:12
+msgid "Profile Match"
+msgstr "Profilübereinstimmungen"
+
+#: ../../mod/match.php:20
+msgid "No keywords to match. Please add keywords to your default profile."
+msgstr "Keine Schlüsselwörter zum Abgleichen gefunden. Bitte füge einige Schlüsselwörter zu deinem Standardprofil hinzu."
+
+#: ../../mod/match.php:57
+msgid "is interested in:"
+msgstr "ist interessiert an:"
+
+#: ../../mod/match.php:58 ../../mod/suggest.php:59
+#: ../../include/contact_widgets.php:9 ../../boot.php:926
+msgid "Connect"
+msgstr "Verbinden"
+
+#: ../../mod/match.php:65 ../../mod/dirfind.php:57
msgid "No matches"
msgstr "Keine Ãœbereinstimmungen"
-#: ../../mod/contacts.php:62 ../../mod/contacts.php:135
+#: ../../mod/lockview.php:39
+msgid "Remote privacy information not available."
+msgstr "Entfernte Privatsphäreneinstellungen nicht verfügbar."
+
+#: ../../mod/lockview.php:43
+msgid "Visible to:"
+msgstr "Sichtbar für:"
+
+#: ../../mod/home.php:26 ../../addon/communityhome/communityhome.php:179
+#, php-format
+msgid "Welcome to %s"
+msgstr "Willkommen zu %s"
+
+#: ../../mod/notifications.php:26
+msgid "Invalid request identifier."
+msgstr "Invalid request identifier."
+
+#: ../../mod/notifications.php:35 ../../mod/notifications.php:152
+#: ../../mod/notifications.php:198
+msgid "Discard"
+msgstr "Verwerfen"
+
+#: ../../mod/notifications.php:47 ../../mod/notifications.php:151
+#: ../../mod/notifications.php:197 ../../mod/contacts.php:302
+#: ../../mod/contacts.php:345
+msgid "Ignore"
+msgstr "Ignorieren"
+
+#: ../../mod/notifications.php:71 ../../include/nav.php:109
+msgid "Network"
+msgstr "Netzwerk"
+
+#: ../../mod/notifications.php:76 ../../mod/network.php:177
+msgid "Personal"
+msgstr "Persönlich"
+
+#: ../../mod/notifications.php:81 ../../include/nav.php:73
+#: ../../include/nav.php:111
+msgid "Home"
+msgstr "Pinnwand"
+
+#: ../../mod/notifications.php:86 ../../include/nav.php:117
+msgid "Introductions"
+msgstr "Kontaktanfragen"
+
+#: ../../mod/notifications.php:91 ../../mod/message.php:76
+#: ../../include/nav.php:123
+msgid "Messages"
+msgstr "Nachrichten"
+
+#: ../../mod/notifications.php:110
+msgid "Show Ignored Requests"
+msgstr "Zeige ignorierte Anfragen"
+
+#: ../../mod/notifications.php:110
+msgid "Hide Ignored Requests"
+msgstr "Verberge ignorierte Anfragen"
+
+#: ../../mod/notifications.php:136 ../../mod/notifications.php:182
+msgid "Notification type: "
+msgstr "Benachrichtigungstyp: "
+
+#: ../../mod/notifications.php:137
+msgid "Friend Suggestion"
+msgstr "Kontaktvorschlag"
+
+#: ../../mod/notifications.php:139
+#, php-format
+msgid "suggested by %s"
+msgstr "vorgeschlagen von %s"
+
+#: ../../mod/notifications.php:144 ../../mod/notifications.php:191
+#: ../../mod/contacts.php:350
+msgid "Hide this contact from others"
+msgstr "Verberge diesen Kontakt vor anderen"
+
+#: ../../mod/notifications.php:145 ../../mod/notifications.php:192
+msgid "Post a new friend activity"
+msgstr "Neue-Kontakt Nachricht senden"
+
+#: ../../mod/notifications.php:145 ../../mod/notifications.php:192
+msgid "if applicable"
+msgstr "falls anwendbar"
+
+#: ../../mod/notifications.php:148 ../../mod/notifications.php:195
+#: ../../mod/admin.php:466
+msgid "Approve"
+msgstr "Genehmigen"
+
+#: ../../mod/notifications.php:168
+msgid "Claims to be known to you: "
+msgstr "Behauptet dich zu kennen: "
+
+#: ../../mod/notifications.php:168
+msgid "yes"
+msgstr "ja"
+
+#: ../../mod/notifications.php:168
+msgid "no"
+msgstr "nein"
+
+#: ../../mod/notifications.php:175
+msgid "Approve as: "
+msgstr "Genehmigen als: "
+
+#: ../../mod/notifications.php:176
+msgid "Friend"
+msgstr "Freund"
+
+#: ../../mod/notifications.php:177
+msgid "Sharer"
+msgstr "Teilenden"
+
+#: ../../mod/notifications.php:177
+msgid "Fan/Admirer"
+msgstr "Fan/Verehrer"
+
+#: ../../mod/notifications.php:183
+msgid "Friend/Connect Request"
+msgstr "Kontakt-/Freundschaftsanfrage"
+
+#: ../../mod/notifications.php:183
+msgid "New Follower"
+msgstr "Neuer Bewunderer"
+
+#: ../../mod/notifications.php:204
+msgid "No introductions."
+msgstr "Keine Kontaktanfragen."
+
+#: ../../mod/notifications.php:207 ../../mod/notifications.php:293
+#: ../../mod/notifications.php:388 ../../mod/notifications.php:469
+#: ../../include/nav.php:118
+msgid "Notifications"
+msgstr "Benachrichtigungen"
+
+#: ../../mod/notifications.php:244 ../../mod/notifications.php:339
+#: ../../mod/notifications.php:426
+#, php-format
+msgid "%s liked %s's post"
+msgstr "%s mag %ss Beitrag"
+
+#: ../../mod/notifications.php:253 ../../mod/notifications.php:348
+#: ../../mod/notifications.php:435
+#, php-format
+msgid "%s disliked %s's post"
+msgstr "%s mag %ss Beitrag nicht"
+
+#: ../../mod/notifications.php:267 ../../mod/notifications.php:362
+#: ../../mod/notifications.php:449
+#, php-format
+msgid "%s is now friends with %s"
+msgstr "%s ist jetzt mit %s befreundet"
+
+#: ../../mod/notifications.php:274 ../../mod/notifications.php:369
+#, php-format
+msgid "%s created a new post"
+msgstr "%s hat einen neuen Beitrag erstellt"
+
+#: ../../mod/notifications.php:275 ../../mod/notifications.php:370
+#: ../../mod/notifications.php:458
+#, php-format
+msgid "%s commented on %s's post"
+msgstr "%s hat %ss Beitrag kommentiert"
+
+#: ../../mod/notifications.php:289
+msgid "No more network notifications."
+msgstr "Keine weiteren Netzwerk-Benachrichtigungen."
+
+#: ../../mod/notifications.php:384
+msgid "No more personal notifications."
+msgstr "Keine weiteren persönlichen Benachrichtigungen"
+
+#: ../../mod/notifications.php:465
+msgid "No more home notifications."
+msgstr "Keine weiteren Pinnwand-Benachrichtigungen"
+
+#: ../../mod/contacts.php:63 ../../mod/contacts.php:143
msgid "Could not access contact record."
msgstr "Konnte nicht auf die Kontaktdaten zugreifen."
-#: ../../mod/contacts.php:76
+#: ../../mod/contacts.php:77
msgid "Could not locate selected profile."
msgstr "Konnte das ausgewählte Profil nicht finden."
-#: ../../mod/contacts.php:99
+#: ../../mod/contacts.php:100
msgid "Contact updated."
msgstr "Kontakt aktualisiert."
-#: ../../mod/contacts.php:101 ../../mod/dfrn_request.php:439
-msgid "Failed to update contact record."
-msgstr "Aktualisierung der Kontaktdaten fehlgeschlagen."
-
-#: ../../mod/contacts.php:157
+#: ../../mod/contacts.php:165
msgid "Contact has been blocked"
msgstr "Kontakt wurde blockiert"
-#: ../../mod/contacts.php:157
+#: ../../mod/contacts.php:165
msgid "Contact has been unblocked"
msgstr "Kontakt wurde wieder freigegeben"
-#: ../../mod/contacts.php:171
+#: ../../mod/contacts.php:179
msgid "Contact has been ignored"
msgstr "Der Kontakt wurde ignoriert"
-#: ../../mod/contacts.php:171
+#: ../../mod/contacts.php:179
msgid "Contact has been unignored"
msgstr "Kontakt wurde ignoriert"
-#: ../../mod/contacts.php:192
+#: ../../mod/contacts.php:200
msgid "stopped following"
msgstr "wird nicht mehr gefolgt"
-#: ../../mod/contacts.php:213
+#: ../../mod/contacts.php:221
msgid "Contact has been removed."
msgstr "Kontakt wurde entfernt."
-#: ../../mod/contacts.php:234
+#: ../../mod/contacts.php:245
#, php-format
msgid "You are mutual friends with %s"
msgstr "Du hast mit %s eine beidseitige Freundschaft"
-#: ../../mod/contacts.php:238
+#: ../../mod/contacts.php:249
#, php-format
msgid "You are sharing with %s"
msgstr "Du teilst mit %s"
-#: ../../mod/contacts.php:243
+#: ../../mod/contacts.php:254
#, php-format
msgid "%s is sharing with you"
msgstr "%s teilt mit Dir"
-#: ../../mod/contacts.php:260
+#: ../../mod/contacts.php:271
msgid "Private communications are not available for this contact."
msgstr "Private Kommunikation ist für diesen Kontakt nicht verfügbar."
-#: ../../mod/contacts.php:263
+#: ../../mod/contacts.php:274
msgid "Never"
msgstr "Niemals"
-#: ../../mod/contacts.php:267
+#: ../../mod/contacts.php:278
msgid "(Update was successful)"
msgstr "(Aktualisierung war erfolgreich)"
-#: ../../mod/contacts.php:267
+#: ../../mod/contacts.php:278
msgid "(Update was not successful)"
msgstr "(Aktualisierung war nicht erfolgreich)"
-#: ../../mod/contacts.php:269
+#: ../../mod/contacts.php:280
msgid "Suggest friends"
msgstr "Kontakte vorschlagen"
-#: ../../mod/contacts.php:273
+#: ../../mod/contacts.php:284
#, php-format
msgid "Network type: %s"
msgstr "Netzwerk Typ: %s"
-#: ../../mod/contacts.php:276
+#: ../../mod/contacts.php:287
#, php-format
msgid "%d contact in common"
msgid_plural "%d contacts in common"
msgstr[0] "%d gemeinsamer Kontakt"
msgstr[1] "%d gemeinsame Kontakte"
-#: ../../mod/contacts.php:281
+#: ../../mod/contacts.php:292
msgid "View all contacts"
msgstr "Alle Kontakte anzeigen"
-#: ../../mod/contacts.php:286 ../../mod/contacts.php:333
+#: ../../mod/contacts.php:297 ../../mod/contacts.php:344
#: ../../mod/admin.php:470
msgid "Unblock"
msgstr "Entsperren"
-#: ../../mod/contacts.php:286 ../../mod/contacts.php:333
+#: ../../mod/contacts.php:297 ../../mod/contacts.php:344
#: ../../mod/admin.php:469
msgid "Block"
msgstr "Sperren"
-#: ../../mod/contacts.php:291 ../../mod/contacts.php:334
+#: ../../mod/contacts.php:302 ../../mod/contacts.php:345
msgid "Unignore"
msgstr "Ignorieren aufheben"
-#: ../../mod/contacts.php:291 ../../mod/contacts.php:334
-#: ../../mod/notifications.php:47 ../../mod/notifications.php:149
-#: ../../mod/notifications.php:194
-msgid "Ignore"
-msgstr "Ignorieren"
-
-#: ../../mod/contacts.php:296
+#: ../../mod/contacts.php:307
msgid "Repair"
msgstr "Reparieren"
-#: ../../mod/contacts.php:306
+#: ../../mod/contacts.php:317
msgid "Contact Editor"
msgstr "Kontakt Editor"
-#: ../../mod/contacts.php:308 ../../mod/settings.php:447
-#: ../../mod/settings.php:586 ../../mod/settings.php:767
-#: ../../mod/crepair.php:162 ../../mod/manage.php:106
-#: ../../mod/profiles.php:375 ../../mod/localtime.php:45
-#: ../../mod/invite.php:106 ../../mod/fsuggest.php:107
-#: ../../mod/install.php:250 ../../mod/install.php:288 ../../mod/admin.php:296
-#: ../../mod/admin.php:461 ../../mod/admin.php:587 ../../mod/admin.php:652
-#: ../../mod/photos.php:888 ../../mod/photos.php:946 ../../mod/photos.php:1165
-#: ../../mod/photos.php:1205 ../../mod/photos.php:1245
-#: ../../mod/photos.php:1276 ../../mod/group.php:84 ../../mod/group.php:167
-#: ../../mod/events.php:333 ../../include/conversation.php:488
-#: ../../addon/facebook/facebook.php:410 ../../addon/wppost/wppost.php:101
-#: ../../addon/uhremotestorage/uhremotestorage.php:58
-#: ../../addon/tumblr/tumblr.php:89 ../../addon/oembed/oembed.php:41
-#: ../../addon/posterous/posterous.php:89
-#: ../../addon/statusnet/statusnet.php:282
-#: ../../addon/statusnet/statusnet.php:296
-#: ../../addon/statusnet/statusnet.php:322
-#: ../../addon/statusnet/statusnet.php:329
-#: ../../addon/statusnet/statusnet.php:351
-#: ../../addon/statusnet/statusnet.php:486 ../../addon/twitter/twitter.php:179
-#: ../../addon/twitter/twitter.php:202 ../../addon/twitter/twitter.php:299
-#: ../../addon/impressum/impressum.php:69 ../../addon/piwik/piwik.php:81
-#: ../../addon/pageheader/pageheader.php:52
-#: ../../addon/randplace/randplace.php:178 ../../addon/blockem/blockem.php:53
-#: ../../addon/nsfw/nsfw.php:53
-msgid "Submit"
-msgstr "Senden"
-
-#: ../../mod/contacts.php:309
+#: ../../mod/contacts.php:320
msgid "Profile Visibility"
msgstr "Profil Anzeige"
-#: ../../mod/contacts.php:310
+#: ../../mod/contacts.php:321
#, php-format
msgid ""
"Please choose the profile you would like to display to %s when viewing your "
"profile securely."
-msgstr ""
-"Bitte wähle eines deiner Profile das angezeigt werden soll, wenn %s dein "
-"Profil aufruft."
+msgstr "Bitte wähle eines deiner Profile das angezeigt werden soll, wenn %s dein Profil aufruft."
-#: ../../mod/contacts.php:311
+#: ../../mod/contacts.php:322
msgid "Contact Information / Notes"
msgstr "Kontakt Informationen / Notizen"
-#: ../../mod/contacts.php:312
+#: ../../mod/contacts.php:323
msgid "Edit contact notes"
msgstr "Notizen zum Kontakt bearbiten"
-#: ../../mod/contacts.php:317 ../../mod/contacts.php:433
+#: ../../mod/contacts.php:328 ../../mod/contacts.php:458
#: ../../mod/viewcontacts.php:61
#, php-format
msgid "Visit %s's profile [%s]"
msgstr "Besuche %ss Profil [%s]"
-#: ../../mod/contacts.php:318
+#: ../../mod/contacts.php:329
msgid "Block/Unblock contact"
msgstr "Kontakt blockieren/freischalten"
-#: ../../mod/contacts.php:319
+#: ../../mod/contacts.php:330
msgid "Ignore contact"
msgstr "Ignoriere den Kontakt"
-#: ../../mod/contacts.php:320
+#: ../../mod/contacts.php:331
msgid "Repair URL settings"
msgstr "URL Einstellungen reparieren"
-#: ../../mod/contacts.php:321
+#: ../../mod/contacts.php:332
msgid "View conversations"
msgstr "Unterhaltungen anzeigen"
-#: ../../mod/contacts.php:323
+#: ../../mod/contacts.php:334
msgid "Delete contact"
msgstr "Lösche den Kontakt"
-#: ../../mod/contacts.php:327
+#: ../../mod/contacts.php:338
msgid "Last update:"
msgstr "letzte Aktualisierung:"
-#: ../../mod/contacts.php:328
+#: ../../mod/contacts.php:339
msgid "Update public posts"
msgstr "Öffentliche Beiträge aktualisieren"
-#: ../../mod/contacts.php:330 ../../mod/admin.php:701
+#: ../../mod/contacts.php:341 ../../mod/admin.php:701
msgid "Update now"
msgstr "Jetzt aktualisieren"
-#: ../../mod/contacts.php:337
+#: ../../mod/contacts.php:348
msgid "Currently blocked"
msgstr "Derzeit geblockt"
-#: ../../mod/contacts.php:338
+#: ../../mod/contacts.php:349
msgid "Currently ignored"
msgstr "Derzeit ignoriert"
-#: ../../mod/contacts.php:339 ../../mod/notifications.php:144
-#: ../../mod/notifications.php:189
-msgid "Hide this contact from others"
-msgstr "Verberge diesen Kontakt vor anderen"
-
-#: ../../mod/contacts.php:339
+#: ../../mod/contacts.php:350
msgid ""
"Replies/likes to your public posts <strong>may</strong> still be visible"
-msgstr ""
-"Antworten/Likes auf deine öffentlichen Beiträge <strong>könnten</strong> "
-"weiterhin sichtbar sein"
+msgstr "Antworten/Likes auf deine öffentlichen Beiträge <strong>könnten</strong> weiterhin sichtbar sein"
-#: ../../mod/contacts.php:367 ../../include/nav.php:130
+#: ../../mod/contacts.php:387 ../../include/nav.php:131
msgid "Contacts"
msgstr "Kontakte"
-#: ../../mod/contacts.php:369
-msgid "Show Blocked Connections"
-msgstr "Zeige geblockte Verbindungen"
+#: ../../mod/contacts.php:389
+msgid "Show Unblocked Contacts"
+msgstr "Nicht geblockte Kontakte anzeigen"
-#: ../../mod/contacts.php:369
-msgid "Hide Blocked Connections"
-msgstr "Verstecke geblockte Verbindungen"
+#: ../../mod/contacts.php:389
+msgid "Show Blocked Contacts"
+msgstr "Blockierte Kontakte anzeigen"
-#: ../../mod/contacts.php:371
+#: ../../mod/contacts.php:391
+msgid "Show All Contacts"
+msgstr "Alle Kontakte anzeigen"
+
+#: ../../mod/contacts.php:393
msgid "Search your contacts"
msgstr "Suche in deinen Kontakten"
-#: ../../mod/contacts.php:409
+#: ../../mod/contacts.php:394 ../../mod/directory.php:65
+msgid "Finding: "
+msgstr "Funde: "
+
+#: ../../mod/contacts.php:395 ../../mod/directory.php:67
+#: ../../include/contact_widgets.php:34
+msgid "Find"
+msgstr "Finde"
+
+#: ../../mod/contacts.php:434
msgid "Mutual Friendship"
msgstr "Beidseitige Freundschaft"
-#: ../../mod/contacts.php:413
+#: ../../mod/contacts.php:438
msgid "is a fan of yours"
msgstr "ist ein Fan von dir"
-#: ../../mod/contacts.php:417
+#: ../../mod/contacts.php:442
msgid "you are a fan of"
msgstr "du bist Fan von"
-#: ../../mod/contacts.php:434 ../../include/Contact.php:129
-#: ../../include/conversation.php:727
+#: ../../mod/contacts.php:459 ../../include/Contact.php:135
+#: ../../include/conversation.php:748
msgid "Edit contact"
msgstr "Kontakt bearbeiten"
-#: ../../mod/settings.php:11 ../../mod/photos.php:64
-msgid "everybody"
-msgstr "jeder"
+#: ../../mod/lostpass.php:16
+msgid "No valid account found."
+msgstr "Kein gültiger Account gefunden."
+
+#: ../../mod/lostpass.php:31
+msgid "Password reset request issued. Check your email."
+msgstr "Zurücksetzen des Passworts eingeleitet. Bitte überprüfe deine E-Mail."
+
+#: ../../mod/lostpass.php:42
+#, php-format
+msgid "Password reset requested at %s"
+msgstr "Anfrage zum Zurücksetzen des Passworts auf %s erhalten"
+
+#: ../../mod/lostpass.php:44 ../../mod/lostpass.php:106
+#: ../../mod/register.php:380 ../../mod/register.php:434
+#: ../../mod/regmod.php:54 ../../mod/dfrn_confirm.php:716
+#: ../../include/items.php:2452
+msgid "Administrator"
+msgstr "Administrator"
+
+#: ../../mod/lostpass.php:64
+msgid ""
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
+msgstr "Anfrage konnte nicht verifiziert werden. (Eventuell hast du bereits ähnliche Anfrage gestellt.) Zurücksetzen des Passworts gescheitert."
+
+#: ../../mod/lostpass.php:82 ../../boot.php:719
+msgid "Password Reset"
+msgstr "Passwort zurücksetzen"
+
+#: ../../mod/lostpass.php:83
+msgid "Your password has been reset as requested."
+msgstr "Dein Passwort wurde wie gewünscht zurückgesetzt."
-#: ../../mod/settings.php:69
+#: ../../mod/lostpass.php:84
+msgid "Your new password is"
+msgstr "Dein neues Passwort lautet"
+
+#: ../../mod/lostpass.php:85
+msgid "Save or copy your new password - and then"
+msgstr "Speichere oder kopiere dein neues Passwort - und dann"
+
+#: ../../mod/lostpass.php:86
+msgid "click here to login"
+msgstr "hier klicken, um dich anzumelden"
+
+#: ../../mod/lostpass.php:87
+msgid ""
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
+msgstr "Du kannst das Passwort in den <em>Einstellungen</em> ändern sobald du dich erfolgreich angemeldet hast."
+
+#: ../../mod/lostpass.php:118
+msgid "Forgot your Password?"
+msgstr "Hast du dein Passwort vergessen?"
+
+#: ../../mod/lostpass.php:119
+msgid ""
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
+msgstr "Gib deine Email-Adresse an und fordere ein neues Passwort an. Es werden dir dann weitere Informationen per Mail zugesendet."
+
+#: ../../mod/lostpass.php:120
+msgid "Nickname or Email: "
+msgstr "Spitzname oder Email:"
+
+#: ../../mod/lostpass.php:121
+msgid "Reset"
+msgstr "Zurücksetzen"
+
+#: ../../mod/settings.php:70
msgid "Missing some important data!"
msgstr "Wichtige Daten fehlen!"
-#: ../../mod/settings.php:72 ../../mod/settings.php:473 ../../mod/admin.php:62
+#: ../../mod/settings.php:73 ../../mod/settings.php:479 ../../mod/admin.php:62
msgid "Update"
msgstr "Aktualisierungen"
-#: ../../mod/settings.php:167
+#: ../../mod/settings.php:168
msgid "Failed to connect with email account using the settings provided."
-msgstr ""
-"Konnte das Email Konto mit den angegebenen Einstellungen nicht erreichen."
+msgstr "Konnte das Email Konto mit den angegebenen Einstellungen nicht erreichen."
-#: ../../mod/settings.php:172
+#: ../../mod/settings.php:173
msgid "Email settings updated."
msgstr "EMail Einstellungen bearbeitet."
-#: ../../mod/settings.php:190
+#: ../../mod/settings.php:191
msgid "Passwords do not match. Password unchanged."
-msgstr ""
-"Die Passwörter stimmen nicht überein. Das Passwort bleibt unverändert."
+msgstr "Die Passwörter stimmen nicht überein. Das Passwort bleibt unverändert."
-#: ../../mod/settings.php:195
+#: ../../mod/settings.php:196
msgid "Empty passwords are not allowed. Password unchanged."
msgstr "Leere Passwörter sind nicht erlaubt. Passwort bleibt unverändert."
-#: ../../mod/settings.php:206
+#: ../../mod/settings.php:207
msgid "Password changed."
msgstr "Passwort ändern."
-#: ../../mod/settings.php:208
+#: ../../mod/settings.php:209
msgid "Password update failed. Please try again."
-msgstr ""
-"Aktualisierung des Passworts gescheitert, bitte versuche es noch einmal."
+msgstr "Aktualisierung des Passworts gescheitert, bitte versuche es noch einmal."
-#: ../../mod/settings.php:272
+#: ../../mod/settings.php:273
msgid " Please use a shorter name."
msgstr " Bitte verwende einen kürzeren Namen."
-#: ../../mod/settings.php:274
+#: ../../mod/settings.php:275
msgid " Name too short."
msgstr " Name ist zu kurz."
-#: ../../mod/settings.php:280
+#: ../../mod/settings.php:281
msgid " Not valid email."
msgstr " Keine gültige E-Mail."
-#: ../../mod/settings.php:282
+#: ../../mod/settings.php:283
msgid " Cannot change to that email."
msgstr " Cannot change to that email."
-#: ../../mod/settings.php:350 ../../addon/facebook/facebook.php:320
-#: ../../addon/twitter/twitter.php:294 ../../addon/impressum/impressum.php:64
-#: ../../addon/piwik/piwik.php:94
+#: ../../mod/settings.php:351 ../../addon/facebook/facebook.php:320
+#: ../../addon/impressum/impressum.php:64 ../../addon/piwik/piwik.php:94
+#: ../../addon/twitter/twitter.php:310
msgid "Settings updated."
msgstr "Einstellungen aktualisiert."
-#: ../../mod/settings.php:409 ../../include/nav.php:128
+#: ../../mod/settings.php:415 ../../include/nav.php:129
msgid "Account settings"
msgstr "Account Einstellungen"
-#: ../../mod/settings.php:414
+#: ../../mod/settings.php:420
msgid "Connector settings"
msgstr "Connector-Einstellungen"
-#: ../../mod/settings.php:419
+#: ../../mod/settings.php:425
msgid "Plugin settings"
msgstr "Plugin-Einstellungen"
-#: ../../mod/settings.php:424
+#: ../../mod/settings.php:430
msgid "Connections"
msgstr "Verbindungen"
-#: ../../mod/settings.php:429
+#: ../../mod/settings.php:435
msgid "Export personal data"
msgstr "Persönliche Daten exportieren"
-#: ../../mod/settings.php:446 ../../mod/settings.php:472
-#: ../../mod/settings.php:505
+#: ../../mod/settings.php:452 ../../mod/settings.php:478
+#: ../../mod/settings.php:511
msgid "Add application"
msgstr "Programm hinzufügen"
-#: ../../mod/settings.php:448 ../../mod/settings.php:474
-#: ../../mod/dfrn_request.php:685 ../../mod/tagrm.php:11
-#: ../../mod/tagrm.php:94 ../../addon/js_upload/js_upload.php:45
-msgid "Cancel"
-msgstr "Abbrechen"
-
-#: ../../mod/settings.php:449 ../../mod/settings.php:475
-#: ../../mod/crepair.php:144 ../../mod/admin.php:464 ../../mod/admin.php:473
-msgid "Name"
-msgstr "Name"
-
-#: ../../mod/settings.php:450 ../../mod/settings.php:476
-#: ../../addon/statusnet/statusnet.php:480
+#: ../../mod/settings.php:456 ../../mod/settings.php:482
+#: ../../addon/statusnet/statusnet.php:489
msgid "Consumer Key"
msgstr "Consumer Key"
-#: ../../mod/settings.php:451 ../../mod/settings.php:477
-#: ../../addon/statusnet/statusnet.php:479
+#: ../../mod/settings.php:457 ../../mod/settings.php:483
+#: ../../addon/statusnet/statusnet.php:488
msgid "Consumer Secret"
msgstr "Consumer Secret"
-#: ../../mod/settings.php:452 ../../mod/settings.php:478
+#: ../../mod/settings.php:458 ../../mod/settings.php:484
msgid "Redirect"
msgstr "Umleiten"
-#: ../../mod/settings.php:453 ../../mod/settings.php:479
+#: ../../mod/settings.php:459 ../../mod/settings.php:485
msgid "Icon url"
msgstr "Icon URL"
-#: ../../mod/settings.php:464
+#: ../../mod/settings.php:470
msgid "You can't edit this application."
msgstr "Du kannst dieses Programm nicht bearbeiten."
-#: ../../mod/settings.php:504
+#: ../../mod/settings.php:510
msgid "Connected Apps"
msgstr "Verbundene Programme"
-#: ../../mod/settings.php:506 ../../mod/editpost.php:90
-#: ../../include/conversation.php:496
-msgid "Edit"
-msgstr "Bearbeiten"
-
-#: ../../mod/settings.php:507 ../../mod/admin.php:468
-#: ../../mod/photos.php:1303 ../../mod/group.php:154
-#: ../../include/conversation.php:253 ../../include/conversation.php:509
-msgid "Delete"
-msgstr "Löschen"
-
-#: ../../mod/settings.php:508
+#: ../../mod/settings.php:514
msgid "Client key starts with"
msgstr "Anwender Schlüssel beginnt mit"
-#: ../../mod/settings.php:509
+#: ../../mod/settings.php:515
msgid "No name"
msgstr "Kein Name"
-#: ../../mod/settings.php:510
+#: ../../mod/settings.php:516
msgid "Remove authorization"
msgstr "Authorisierung entziehen"
-#: ../../mod/settings.php:522
+#: ../../mod/settings.php:528
msgid "No Plugin settings configured"
msgstr "Keine Plugin-Einstellungen konfiguriert"
-#: ../../mod/settings.php:529 ../../addon/widgets/widgets.php:122
+#: ../../mod/settings.php:535 ../../addon/widgets/widgets.php:122
msgid "Plugin Settings"
msgstr "Plugin-Einstellungen"
-#: ../../mod/settings.php:542 ../../mod/settings.php:543
+#: ../../mod/settings.php:548 ../../mod/settings.php:549
#, php-format
msgid "Built-in support for %s connectivity is %s"
msgstr "Eingebaute Unterstützung für Verbindungen zu %s ist %s"
-#: ../../mod/settings.php:542 ../../mod/dfrn_request.php:681
-#: ../../include/contact_selectors.php:80
-msgid "Diaspora"
-msgstr "Diaspora"
-
-#: ../../mod/settings.php:542 ../../mod/settings.php:543
+#: ../../mod/settings.php:548 ../../mod/settings.php:549
msgid "enabled"
msgstr "eingeschaltet"
-#: ../../mod/settings.php:542 ../../mod/settings.php:543
+#: ../../mod/settings.php:548 ../../mod/settings.php:549
msgid "disabled"
msgstr "ausgeschaltet"
-#: ../../mod/settings.php:543
+#: ../../mod/settings.php:549
msgid "StatusNet"
msgstr "StatusNet"
-#: ../../mod/settings.php:569
+#: ../../mod/settings.php:575
msgid "Connector Settings"
msgstr "Verbindungs-Einstellungen"
-#: ../../mod/settings.php:575
+#: ../../mod/settings.php:581
msgid "Email/Mailbox Setup"
msgstr "E-Mail/Postfach-Einstellungen"
-#: ../../mod/settings.php:576
+#: ../../mod/settings.php:582
msgid ""
"If you wish to communicate with email contacts using this service "
"(optional), please specify how to connect to your mailbox."
-msgstr ""
-"Wenn du mit E-Mail-Kontakten über diesen Service kommunizieren möchtest "
-"(optional), gib bitte die Einstellungen für dein Postfach an."
+msgstr "Wenn du mit E-Mail-Kontakten über diesen Service kommunizieren möchtest (optional), gib bitte die Einstellungen für dein Postfach an."
-#: ../../mod/settings.php:577
+#: ../../mod/settings.php:583
msgid "Last successful email check:"
msgstr "Letzter erfolgreicher Email Check"
-#: ../../mod/settings.php:578
+#: ../../mod/settings.php:584
msgid "Email access is disabled on this site."
msgstr "Zugriff auf E-Mails für diese Seite deaktiviert."
-#: ../../mod/settings.php:579
+#: ../../mod/settings.php:585
msgid "IMAP server name:"
msgstr "IMAP-Server-Name:"
-#: ../../mod/settings.php:580
+#: ../../mod/settings.php:586
msgid "IMAP port:"
msgstr "IMAP-Port:"
-#: ../../mod/settings.php:581
+#: ../../mod/settings.php:587
msgid "Security:"
msgstr "Sicherheit:"
-#: ../../mod/settings.php:581
+#: ../../mod/settings.php:587
msgid "None"
msgstr "Keine"
-#: ../../mod/settings.php:582
+#: ../../mod/settings.php:588
msgid "Email login name:"
msgstr "E-Mail-Login-Name:"
-#: ../../mod/settings.php:583
+#: ../../mod/settings.php:589
msgid "Email password:"
msgstr "E-Mail-Passwort:"
-#: ../../mod/settings.php:584
+#: ../../mod/settings.php:590
msgid "Reply-to address:"
msgstr "Reply-to Adresse:"
-#: ../../mod/settings.php:585
+#: ../../mod/settings.php:591
msgid "Send public posts to all email contacts:"
msgstr "Sende öffentliche Beiträge an alle E-Mail-Kontakte:"
-#: ../../mod/settings.php:642 ../../mod/admin.php:126 ../../mod/admin.php:443
+#: ../../mod/settings.php:648 ../../mod/admin.php:126 ../../mod/admin.php:443
msgid "Normal Account"
msgstr "Normaler Account"
-#: ../../mod/settings.php:643
+#: ../../mod/settings.php:649
msgid "This account is a normal personal profile"
msgstr "Dieser Account ist ein normales persönliches Profil"
-#: ../../mod/settings.php:646 ../../mod/admin.php:127 ../../mod/admin.php:444
+#: ../../mod/settings.php:652 ../../mod/admin.php:127 ../../mod/admin.php:444
msgid "Soapbox Account"
msgstr "Sandkasten-Account"
-#: ../../mod/settings.php:647
+#: ../../mod/settings.php:653
msgid "Automatically approve all connection/friend requests as read-only fans"
msgstr "Freundschaftsanfragen werden automatisch als Nurlese-Fans akzeptiert"
-#: ../../mod/settings.php:650 ../../mod/admin.php:128 ../../mod/admin.php:445
+#: ../../mod/settings.php:656 ../../mod/admin.php:128 ../../mod/admin.php:445
msgid "Community/Celebrity Account"
msgstr "Gemeinschafts/Promi-Account"
-#: ../../mod/settings.php:651
+#: ../../mod/settings.php:657
msgid ""
"Automatically approve all connection/friend requests as read-write fans"
-msgstr ""
-"Freundschaftsanfragen werden automatisch als Lese-und-Schreib-Fans "
-"akzeptiert"
+msgstr "Freundschaftsanfragen werden automatisch als Lese-und-Schreib-Fans akzeptiert"
-#: ../../mod/settings.php:654 ../../mod/admin.php:129 ../../mod/admin.php:446
+#: ../../mod/settings.php:660 ../../mod/admin.php:129 ../../mod/admin.php:446
msgid "Automatic Friend Account"
msgstr "Automatischer Freundesaccount"
-#: ../../mod/settings.php:655
+#: ../../mod/settings.php:661
msgid "Automatically approve all connection/friend requests as friends"
msgstr "Freundschaftsanfragen werden automatisch als Freund akzeptiert"
-#: ../../mod/settings.php:665
+#: ../../mod/settings.php:671
msgid "OpenID:"
msgstr "OpenID:"
-#: ../../mod/settings.php:665
+#: ../../mod/settings.php:671
msgid "(Optional) Allow this OpenID to login to this account."
-msgstr ""
-"(Optional) Erlaube die Anmeldung für diesen Account mit dieser OpenID."
+msgstr "(Optional) Erlaube die Anmeldung für diesen Account mit dieser OpenID."
-#: ../../mod/settings.php:675
+#: ../../mod/settings.php:681
msgid "Publish your default profile in your local site directory?"
msgstr "Veröffentliche dein Standardprofil im Verzeichnis der lokalen Seite?"
-#: ../../mod/settings.php:675 ../../mod/settings.php:681
-#: ../../mod/settings.php:689 ../../mod/settings.php:693
-#: ../../mod/settings.php:698 ../../mod/settings.php:704
-#: ../../mod/settings.php:710 ../../mod/settings.php:757
-#: ../../mod/settings.php:758 ../../mod/settings.php:759
-#: ../../mod/settings.php:760 ../../mod/dfrn_request.php:676
-#: ../../mod/profiles.php:358 ../../mod/register.php:525 ../../mod/api.php:106
-msgid "No"
-msgstr "Nein"
-
-#: ../../mod/settings.php:675 ../../mod/settings.php:681
-#: ../../mod/settings.php:689 ../../mod/settings.php:693
-#: ../../mod/settings.php:698 ../../mod/settings.php:704
-#: ../../mod/settings.php:710 ../../mod/settings.php:757
-#: ../../mod/settings.php:758 ../../mod/settings.php:759
-#: ../../mod/settings.php:760 ../../mod/dfrn_request.php:675
-#: ../../mod/profiles.php:357 ../../mod/register.php:524 ../../mod/api.php:105
-msgid "Yes"
-msgstr "Ja"
-
-#: ../../mod/settings.php:681
+#: ../../mod/settings.php:687
msgid "Publish your default profile in the global social directory?"
msgstr "Veröffentliche dein Standardprofil im weltweiten Verzeichnis?"
-#: ../../mod/settings.php:689
+#: ../../mod/settings.php:695
msgid "Hide your contact/friend list from viewers of your default profile?"
msgstr "Liste der Kontakte vor Betrachtern des Standardprofils verbergen?"
-#: ../../mod/settings.php:693
+#: ../../mod/settings.php:699
msgid "Hide your profile details from unknown viewers?"
msgstr "Profil-Details vor unbekannten Betrachtern verbergen?"
-#: ../../mod/settings.php:698
+#: ../../mod/settings.php:704
msgid "Allow friends to post to your profile page?"
msgstr "Deinen Kontakten erlauben, auf deine Pinnwand zu schreiben?"
-#: ../../mod/settings.php:704
+#: ../../mod/settings.php:710
msgid "Allow friends to tag your posts?"
-msgstr ""
-"Deinen Kontakten erlauben, deine Beiträge mit Schlagwörtern zu versehen?"
+msgstr "Deinen Kontakten erlauben, deine Beiträge mit Schlagwörtern zu versehen?"
-#: ../../mod/settings.php:710
+#: ../../mod/settings.php:716
msgid "Allow us to suggest you as a potential friend to new members?"
-msgstr ""
-"Erlaube uns dich als potentiellen Kontakt für neue Mitglieder vorzuschlagen?"
+msgstr "Erlaube uns dich als potentiellen Kontakt für neue Mitglieder vorzuschlagen?"
-#: ../../mod/settings.php:719
+#: ../../mod/settings.php:725
msgid "Profile is <strong>not published</strong>."
msgstr "Profil ist <strong>nicht veröffentlicht</strong>."
-#: ../../mod/settings.php:738 ../../mod/profile_photo.php:206
+#: ../../mod/settings.php:744 ../../mod/profile_photo.php:206
msgid "or"
msgstr "oder"
-#: ../../mod/settings.php:743
+#: ../../mod/settings.php:749
msgid "Your Identity Address is"
msgstr "Die Adresse deines Profils lautet:"
-#: ../../mod/settings.php:754
-msgid "Automatically expire posts after days:"
-msgstr "Beiträge verfallen automatisch nach Tagen:"
+#: ../../mod/settings.php:760
+msgid "Automatically expire posts after this many days:"
+msgstr "Beiträge verfallen automatisch nach dieser Anzahl von Tagen"
-#: ../../mod/settings.php:754
+#: ../../mod/settings.php:760
msgid "If empty, posts will not expire. Expired posts will be deleted"
-msgstr ""
-"Wenn leer verfallen Beiträge nie automatisch. Verfallene Beiträge werden "
-"gelöscht."
+msgstr "Wenn leer verfallen Beiträge nie automatisch. Verfallene Beiträge werden gelöscht."
-#: ../../mod/settings.php:755
+#: ../../mod/settings.php:761
msgid "Advanced expiration settings"
msgstr "Erweiterte Verfallseinstellungen"
-#: ../../mod/settings.php:756
+#: ../../mod/settings.php:762
msgid "Advanced Expiration"
msgstr "Erweitertes Verfallen"
-#: ../../mod/settings.php:757
+#: ../../mod/settings.php:763
msgid "Expire posts:"
msgstr "Beiträge verfallen lassen:"
-#: ../../mod/settings.php:758
+#: ../../mod/settings.php:764
msgid "Expire personal notes:"
msgstr "Persönliche Notizen verfallen lassen:"
-#: ../../mod/settings.php:759
+#: ../../mod/settings.php:765
msgid "Expire starred posts:"
msgstr "Markierte Beiträge verfallen lassen:"
-#: ../../mod/settings.php:760
+#: ../../mod/settings.php:766
msgid "Expire photos:"
msgstr "Fotos verfallen lassen:"
-#: ../../mod/settings.php:765
+#: ../../mod/settings.php:771
msgid "Account Settings"
msgstr "Account-Einstellungen"
-#: ../../mod/settings.php:773
+#: ../../mod/settings.php:779
msgid "Password Settings"
msgstr "Passwort-Einstellungen"
-#: ../../mod/settings.php:774
+#: ../../mod/settings.php:780
msgid "New Password:"
msgstr "Neues Passwort:"
-#: ../../mod/settings.php:775
+#: ../../mod/settings.php:781
msgid "Confirm:"
msgstr "Bestätigen:"
-#: ../../mod/settings.php:775
+#: ../../mod/settings.php:781
msgid "Leave password fields blank unless changing"
msgstr "Lass die Passwort-Felder leer, außer du willst das Passwort ändern"
-#: ../../mod/settings.php:779
+#: ../../mod/settings.php:785
msgid "Basic Settings"
msgstr "Grundeinstellungen"
-#: ../../mod/settings.php:780 ../../include/profile_advanced.php:15
+#: ../../mod/settings.php:786 ../../include/profile_advanced.php:15
msgid "Full Name:"
msgstr "Kompletter Name:"
-#: ../../mod/settings.php:781
+#: ../../mod/settings.php:787
msgid "Email Address:"
msgstr "Emailadresse:"
-#: ../../mod/settings.php:782
+#: ../../mod/settings.php:788
msgid "Your Timezone:"
msgstr "Deine Zeitzone:"
-#: ../../mod/settings.php:783
+#: ../../mod/settings.php:789
msgid "Default Post Location:"
msgstr "Standardstandort:"
-#: ../../mod/settings.php:784
+#: ../../mod/settings.php:790
msgid "Use Browser Location:"
msgstr "Verwende den Standort des Browsers:"
-#: ../../mod/settings.php:785
+#: ../../mod/settings.php:791
msgid "Display Theme:"
msgstr "Theme:"
-#: ../../mod/settings.php:786
+#: ../../mod/settings.php:792
msgid "Update browser every xx seconds"
msgstr "Browser alle xx Sekunden aktualisieren"
-#: ../../mod/settings.php:786
+#: ../../mod/settings.php:792
msgid "Minimum of 10 seconds, no maximum"
msgstr "Minimal 10 Sekunden, kein Maximum"
-#: ../../mod/settings.php:788
+#: ../../mod/settings.php:794
msgid "Security and Privacy Settings"
msgstr "Sicherheits- und Privatsphäre-Einstellungen"
-#: ../../mod/settings.php:790
+#: ../../mod/settings.php:796
msgid "Maximum Friend Requests/Day:"
msgstr "Maximale Anzahl von Freundschaftsanfragen/Tag:"
-#: ../../mod/settings.php:790
+#: ../../mod/settings.php:796
msgid "(to prevent spam abuse)"
msgstr "(um SPAM zu vermeiden)"
-#: ../../mod/settings.php:791
+#: ../../mod/settings.php:797
msgid "Default Post Permissions"
msgstr "Standard-Zugriffsrechte für Beiträge"
-#: ../../mod/settings.php:792
+#: ../../mod/settings.php:798
msgid "(click to open/close)"
msgstr "(klicke zum öffnen/schließen)"
-#: ../../mod/settings.php:807
+#: ../../mod/settings.php:813
msgid "Notification Settings"
msgstr "Benachrichtigungseinstellungen"
-#: ../../mod/settings.php:808
+#: ../../mod/settings.php:814
msgid "Send a notification email when:"
msgstr "Benachrichtigungs-E-Mail senden wenn:"
-#: ../../mod/settings.php:809
+#: ../../mod/settings.php:815
msgid "You receive an introduction"
msgstr "Du eine Kontaktanfrage erhältst"
-#: ../../mod/settings.php:810
+#: ../../mod/settings.php:816
msgid "Your introductions are confirmed"
msgstr "Eine deiner Kontaktanfragen akzeptiert wurde"
-#: ../../mod/settings.php:811
+#: ../../mod/settings.php:817
msgid "Someone writes on your profile wall"
msgstr "Jemand etwas auf deine Pinnwand schreibt"
-#: ../../mod/settings.php:812
+#: ../../mod/settings.php:818
msgid "Someone writes a followup comment"
msgstr "Jemand auch einen Kommentar verfasst"
-#: ../../mod/settings.php:813
+#: ../../mod/settings.php:819
msgid "You receive a private message"
msgstr "Du eine private Nachricht erhältst"
-#: ../../mod/settings.php:814
+#: ../../mod/settings.php:820
msgid "You receive a friend suggestion"
msgstr "Du eine Empfehlung erhältst"
-#: ../../mod/settings.php:817
+#: ../../mod/settings.php:821
+msgid "You are tagged in a post"
+msgstr "Du wurdest in einem Beitrag erwähnt"
+
+#: ../../mod/settings.php:824
msgid "Advanced Page Settings"
msgstr "Erweiterte Seiten-Einstellungen"
-#: ../../mod/crepair.php:100
-msgid "Contact settings applied."
-msgstr "Einstellungen zum Kontakt angewandt."
-
-#: ../../mod/crepair.php:102
-msgid "Contact update failed."
-msgstr "Konnte den Kontakt nicht aktualisieren."
-
-#: ../../mod/crepair.php:127 ../../mod/fsuggest.php:20
-#: ../../mod/fsuggest.php:92 ../../mod/dfrn_confirm.php:116
-msgid "Contact not found."
-msgstr "Kontakt nicht gefunden."
-
-#: ../../mod/crepair.php:133
-msgid "Repair Contact Settings"
-msgstr "Kontakt-Einstellungen reparieren"
-
-#: ../../mod/crepair.php:135
-msgid ""
-"<strong>WARNING: This is highly advanced</strong> and if you enter incorrect"
-" information your communications with this contact may stop working."
-msgstr ""
-"<strong>ACHTUNG: Das sind Experten-Einstellungen!</strong> Wenn Du etwas "
-"falsches eingibst, funktioniert die Kommunikation mit diesem Kontakt evtl. "
-"nicht mehr."
+#: ../../mod/manage.php:90
+msgid "Manage Identities and/or Pages"
+msgstr "Verwalte Identitäten und/oder Seiten"
-#: ../../mod/crepair.php:136
+#: ../../mod/manage.php:93
msgid ""
-"Please use your browser 'Back' button <strong>now</strong> if you are "
-"uncertain what to do on this page."
-msgstr ""
-"Bitte nutze den Zurück-Button deines Browsers <strong>jetzt</strong>, wenn "
-"du dir unsicher bist, was auf dieser Seite gemacht wird."
-
-#: ../../mod/crepair.php:145
-msgid "Account Nickname"
-msgstr "Account-Spitzname"
+"Toggle between different identities or community/group pages which share "
+"your account details or which you have been granted \"manage\" permissions"
+msgstr "Wechsle zwischen verschiedenen Identitäten oder Gemeinschafts-/Gruppen Seiten die deine Zugangsdetails teilen oder zu denen du \"Manage\" Befugnisse bekommen hast."
-#: ../../mod/crepair.php:146
-msgid "@Tagname - overrides Name/Nickname"
-msgstr "@Tagname - überschreibt Name/Spitzname"
-
-#: ../../mod/crepair.php:147
-msgid "Account URL"
-msgstr "Account-URL"
+#: ../../mod/manage.php:95
+msgid "Select an identity to manage: "
+msgstr "Wähle eine Identität zum Verwalten: "
-#: ../../mod/crepair.php:148
-msgid "Friend Request URL"
-msgstr "URL für Freundschaftsanfragen"
+#: ../../mod/network.php:43
+msgid "Search Results For:"
+msgstr "Suchergebnisse für:"
-#: ../../mod/crepair.php:149
-msgid "Friend Confirm URL"
-msgstr "URL für Bestätigungen von Freundschaftsanfragen"
+#: ../../mod/network.php:77 ../../mod/search.php:16
+msgid "Remove term"
+msgstr "Begriff entfernen"
-#: ../../mod/crepair.php:150
-msgid "Notification Endpoint URL"
-msgstr "URL-Endpunkt für Benachrichtigungen"
+#: ../../mod/network.php:86 ../../mod/search.php:13
+msgid "Saved Searches"
+msgstr "Gespeicherte Suchen"
-#: ../../mod/crepair.php:151
-msgid "Poll/Feed URL"
-msgstr "Pull/Feed-URL"
+#: ../../mod/network.php:87 ../../include/group.php:216
+msgid "add"
+msgstr "hinzufügen"
-#: ../../mod/crepair.php:152
-msgid "New photo from this URL"
-msgstr "Neues Foto von dieser URL"
+#: ../../mod/network.php:166
+msgid "Commented Order"
+msgstr "Neueste Kommentare"
-#: ../../mod/dfrn_request.php:92
-msgid "This introduction has already been accepted."
-msgstr "Diese Kontaktanfrage wurde bereits akzeptiert."
+#: ../../mod/network.php:171
+msgid "Posted Order"
+msgstr "Neueste Beiträge"
-#: ../../mod/dfrn_request.php:116 ../../mod/dfrn_request.php:381
-msgid "Profile location is not valid or does not contain profile information."
-msgstr ""
-"Profiladresse ist ungültig oder stellt einige Profildaten nicht zur "
-"Verfügung."
+#: ../../mod/network.php:182
+msgid "New"
+msgstr "Neue"
-#: ../../mod/dfrn_request.php:121 ../../mod/dfrn_request.php:386
-msgid "Warning: profile location has no identifiable owner name."
-msgstr ""
-"Warnung: Es konnte kein Name des Besitzers von der angegebenen Profiladresse"
-" gefunden werden."
+#: ../../mod/network.php:187
+msgid "Starred"
+msgstr "Markierte"
-#: ../../mod/dfrn_request.php:123 ../../mod/dfrn_request.php:388
-msgid "Warning: profile location has no profile photo."
-msgstr ""
-"Warnung: Es konnte kein Profilbild bei der angegebenen Profiladresse "
-"gefunden werden."
+#: ../../mod/network.php:192
+msgid "Bookmarks"
+msgstr "Lesezeichen"
-#: ../../mod/dfrn_request.php:126 ../../mod/dfrn_request.php:391
+#: ../../mod/network.php:250
#, php-format
-msgid "%d required parameter was not found at the given location"
-msgid_plural "%d required parameters were not found at the given location"
-msgstr[0] ""
-"%d benötigter Parameter wurde an der angegebenen Stelle nicht gefunden"
-msgstr[1] ""
-"%d benötigte Parameter wurden an der angegebenen Stelle nicht gefunden"
-
-#: ../../mod/dfrn_request.php:167
-msgid "Introduction complete."
-msgstr "Kontaktanfrage abgeschlossen."
-
-#: ../../mod/dfrn_request.php:191
-msgid "Unrecoverable protocol error."
-msgstr "Nicht behebbarer Protokollfehler."
+msgid "Warning: This group contains %s member from an insecure network."
+msgid_plural ""
+"Warning: This group contains %s members from an insecure network."
+msgstr[0] "Warnung: Diese Gruppe beinhaltet %s Person aus einem unsicheren Netzwerk."
+msgstr[1] "Warnung: Diese Gruppe beinhaltet %s Personen aus unsicheren Netzwerken."
-#: ../../mod/dfrn_request.php:219
-msgid "Profile unavailable."
-msgstr "Profil nicht verfügbar."
+#: ../../mod/network.php:253
+msgid "Private messages to this group are at risk of public disclosure."
+msgstr "Private Nachrichten an diese Gruppe könnten an die Öffentlichkeit geraten."
-#: ../../mod/dfrn_request.php:244
-#, php-format
-msgid "%s has received too many connection requests today."
-msgstr "%s hat heute zu viele Freundschaftsanfragen erhalten."
+#: ../../mod/network.php:304
+msgid "No such group"
+msgstr "Es gibt keine solche Gruppe"
-#: ../../mod/dfrn_request.php:245
-msgid "Spam protection measures have been invoked."
-msgstr "Maßnahmen zum Spamschutz wurden ergriffen."
+#: ../../mod/network.php:315
+msgid "Group is empty"
+msgstr "Gruppe ist leer"
-#: ../../mod/dfrn_request.php:246
-msgid "Friends are advised to please try again in 24 hours."
-msgstr "Freunde sind angehalten, es in 24 Stunden erneut zu versuchen."
+#: ../../mod/network.php:319
+msgid "Group: "
+msgstr "Gruppe: "
-#: ../../mod/dfrn_request.php:306
-msgid "Invalid locator"
-msgstr "Ungültiger Locator"
+#: ../../mod/network.php:329
+msgid "Contact: "
+msgstr "Kontakt: "
-#: ../../mod/dfrn_request.php:326
-msgid "Unable to resolve your name at the provided location."
-msgstr "Konnte deinen Namen an der angegebenen Stelle nicht finden."
+#: ../../mod/network.php:331
+msgid "Private messages to this person are at risk of public disclosure."
+msgstr "Private Nachrichten an diese Person könnten an die Öffentlichkeit gelangen."
-#: ../../mod/dfrn_request.php:339
-msgid "You have already introduced yourself here."
-msgstr "Du hast dich hier bereits vorgestellt."
+#: ../../mod/network.php:336
+msgid "Invalid contact."
+msgstr "Ungültiger Kontakt."
-#: ../../mod/dfrn_request.php:343
-#, php-format
-msgid "Apparently you are already friends with %s."
-msgstr "Es scheint so, als ob du bereits ein Freund von %s bist."
+#: ../../mod/notes.php:44 ../../boot.php:1350
+msgid "Personal Notes"
+msgstr "Persönliche Notizen"
-#: ../../mod/dfrn_request.php:364
-msgid "Invalid profile URL."
-msgstr "Ungültige Profil-URL."
+#: ../../mod/notes.php:63 ../../include/text.php:639
+msgid "Save"
+msgstr "Speichern"
-#: ../../mod/dfrn_request.php:460
-msgid "Your introduction has been sent."
-msgstr "Deine Kontaktanfrage wurde gesendet."
+#: ../../mod/newmember.php:6
+msgid "Welcome to Friendica"
+msgstr "Willkommen bei Friendica"
-#: ../../mod/dfrn_request.php:513
-msgid "Please login to confirm introduction."
-msgstr "Bitte melde dich an, um die Kontaktanfrage zu bestätigen."
+#: ../../mod/newmember.php:8
+msgid "New Member Checklist"
+msgstr "Checkliste für neue Mitglieder"
-#: ../../mod/dfrn_request.php:527
+#: ../../mod/newmember.php:12
msgid ""
-"Incorrect identity currently logged in. Please login to "
-"<strong>this</strong> profile."
-msgstr ""
-"Incorrect identity currently logged in. Please login to "
-"<strong>this</strong> profile."
-
-#: ../../mod/dfrn_request.php:539
-#, php-format
-msgid "Welcome home %s."
-msgstr "Willkommen zurück %s."
-
-#: ../../mod/dfrn_request.php:540
-#, php-format
-msgid "Please confirm your introduction/connection request to %s."
-msgstr "Bitte bestätige deine Kontaktanfrage bei %s."
-
-#: ../../mod/dfrn_request.php:541
-msgid "Confirm"
-msgstr "Bestätigen"
-
-#: ../../mod/dfrn_request.php:581 ../../include/items.php:2406
-msgid "[Name Withheld]"
-msgstr "[Name Zurückgehalten]"
+"We would like to offer some tips and links to help make your experience "
+"enjoyable. Click any item to visit the relevant page."
+msgstr "Wir möchten dir einige Tipps und Links anbieten, um deine Erfahrung mit Friendica so angenehm wie möglich zu machen. Klicke einfach einen Aspekt an, um weitere Informationen zu erhalten."
-#: ../../mod/dfrn_request.php:665
-#, php-format
+#: ../../mod/newmember.php:16
msgid ""
-"Diaspora members: Please do not use this form. Instead, enter \"%s\" into "
-"your Diaspora search bar."
-msgstr ""
-"Diaspora-User: Bitte nicht dieses Formular benutzen! Gebt statt dessen "
-"\"%s\" in der Diaspora-Suchleiste ein."
+"On your <em>Settings</em> page - change your initial password. Also make a "
+"note of your Identity Address. This will be useful in making friends."
+msgstr "Ändere dein anfängliches Passwort auf der <em>Einstellungen</em> Seite. Bei dieser Gelegenheit solltest du dir die Adresse deines Profils merken, diese wird benötigt um mit Anderen in Kontakt zu treten."
-#: ../../mod/dfrn_request.php:668
+#: ../../mod/newmember.php:18
msgid ""
-"Please enter your 'Identity Address' from one of the following supported "
-"social networks:"
-msgstr ""
-"Bitte gib die Adresse deines Profils in einem der unterstützten sozialen "
-"Netzwerke an:"
-
-#: ../../mod/dfrn_request.php:671
-msgid "Friend/Connection Request"
-msgstr "Freundschafts-/Kontaktanfrage"
+"Review the other settings, particularly the privacy settings. An unpublished"
+" directory listing is like having an unlisted phone number. In general, you "
+"should probably publish your listing - unless all of your friends and "
+"potential friends know exactly how to find you."
+msgstr "Überprüfe die restlichen Einstellungen, insbesondere die Einstellungen zur Privatsphäre. Wenn du dein Profil nicht veröffentlichst ist das wie wenn niemand deine Telefonnummer kennt. Im Allgemeinen solltest du es veröffentlichen - außer all deine Freunde und potentiellen Freunde wissen wie man dich findet."
-#: ../../mod/dfrn_request.php:672
+#: ../../mod/newmember.php:20
msgid ""
-"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
-"testuser@identi.ca"
-msgstr ""
-"Beispiele: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
-"testuser@identi.ca"
-
-#: ../../mod/dfrn_request.php:673
-msgid "Please answer the following:"
-msgstr "Bitte beantworte folgende Fragen:"
-
-#: ../../mod/dfrn_request.php:674
-#, php-format
-msgid "Does %s know you?"
-msgstr "Kennt %s dich?"
-
-#: ../../mod/dfrn_request.php:677
-msgid "Add a personal note:"
-msgstr "Eine persönliche Notiz anfügen:"
-
-#: ../../mod/dfrn_request.php:679 ../../include/contact_selectors.php:76
-msgid "Friendica"
-msgstr "Friendica"
-
-#: ../../mod/dfrn_request.php:680
-msgid "StatusNet/Federated Social Web"
-msgstr "StatusNet/Federated Social Web"
-
-#: ../../mod/dfrn_request.php:682
-msgid "- please share from your own site as noted above"
-msgstr "- bitte fange von Deiner eigenen Seite aus zu teilen an"
-
-#: ../../mod/dfrn_request.php:683
-msgid "Your Identity Address:"
-msgstr "Adresse deines Profils:"
-
-#: ../../mod/dfrn_request.php:684
-msgid "Submit Request"
-msgstr "Anfrage abschicken"
-
-#: ../../mod/notifications.php:26
-msgid "Invalid request identifier."
-msgstr "Invalid request identifier."
-
-#: ../../mod/notifications.php:35 ../../mod/notifications.php:150
-#: ../../mod/notifications.php:195
-msgid "Discard"
-msgstr "Verwerfen"
-
-#: ../../mod/notifications.php:71 ../../include/nav.php:109
-msgid "Network"
-msgstr "Netzwerk"
-
-#: ../../mod/notifications.php:76 ../../mod/network.php:169
-msgid "Personal"
-msgstr "Persönlich"
-
-#: ../../mod/notifications.php:81 ../../include/nav.php:73
-#: ../../include/nav.php:111
-msgid "Home"
-msgstr "Pinnwand"
-
-#: ../../mod/notifications.php:86 ../../include/nav.php:117
-msgid "Introductions"
-msgstr "Kontaktanfragen"
-
-#: ../../mod/notifications.php:91 ../../mod/message.php:76
-#: ../../include/nav.php:122
-msgid "Messages"
-msgstr "Nachrichten"
-
-#: ../../mod/notifications.php:110
-msgid "Show Ignored Requests"
-msgstr "Zeige ignorierte Anfragen"
-
-#: ../../mod/notifications.php:110
-msgid "Hide Ignored Requests"
-msgstr "Verberge ignorierte Anfragen"
-
-#: ../../mod/notifications.php:136 ../../mod/notifications.php:180
-msgid "Notification type: "
-msgstr "Benachrichtigungstyp: "
-
-#: ../../mod/notifications.php:137
-msgid "Friend Suggestion"
-msgstr "Kontaktvorschlag"
-
-#: ../../mod/notifications.php:139
-#, php-format
-msgid "suggested by %s"
-msgstr "vorgeschlagen von %s"
-
-#: ../../mod/notifications.php:146 ../../mod/notifications.php:192
-#: ../../mod/admin.php:466
-msgid "Approve"
-msgstr "Genehmigen"
-
-#: ../../mod/notifications.php:166
-msgid "Claims to be known to you: "
-msgstr "Behauptet dich zu kennen: "
-
-#: ../../mod/notifications.php:166
-msgid "yes"
-msgstr "ja"
-
-#: ../../mod/notifications.php:166
-msgid "no"
-msgstr "nein"
-
-#: ../../mod/notifications.php:173
-msgid "Approve as: "
-msgstr "Genehmigen als: "
-
-#: ../../mod/notifications.php:174
-msgid "Friend"
-msgstr "Freund"
-
-#: ../../mod/notifications.php:175
-msgid "Sharer"
-msgstr "Teilenden"
-
-#: ../../mod/notifications.php:175
-msgid "Fan/Admirer"
-msgstr "Fan/Verehrer"
-
-#: ../../mod/notifications.php:181
-msgid "Friend/Connect Request"
-msgstr "Kontakt-/Freundschaftsanfrage"
-
-#: ../../mod/notifications.php:181
-msgid "New Follower"
-msgstr "Neuer Bewunderer"
-
-#: ../../mod/notifications.php:201
-msgid "No introductions."
-msgstr "Keine Kontaktanfragen."
-
-#: ../../mod/notifications.php:204 ../../mod/notifications.php:290
-#: ../../mod/notifications.php:385 ../../mod/notifications.php:466
-#: ../../include/nav.php:118
-msgid "Notifications"
-msgstr "Benachrichtigungen"
-
-#: ../../mod/notifications.php:241 ../../mod/notifications.php:336
-#: ../../mod/notifications.php:423
-#, php-format
-msgid "%s liked %s's post"
-msgstr "%s mag %ss Beitrag"
-
-#: ../../mod/notifications.php:250 ../../mod/notifications.php:345
-#: ../../mod/notifications.php:432
-#, php-format
-msgid "%s disliked %s's post"
-msgstr "%s mag %ss Beitrag nicht"
-
-#: ../../mod/notifications.php:264 ../../mod/notifications.php:359
-#: ../../mod/notifications.php:446
-#, php-format
-msgid "%s is now friends with %s"
-msgstr "%s ist jetzt mit %s befreundet"
-
-#: ../../mod/notifications.php:271 ../../mod/notifications.php:366
-#, php-format
-msgid "%s created a new post"
-msgstr "%s hat einen neuen Beitrag erstellt"
-
-#: ../../mod/notifications.php:272 ../../mod/notifications.php:367
-#: ../../mod/notifications.php:455
-#, php-format
-msgid "%s commented on %s's post"
-msgstr "%s hat %ss Beitrag kommentiert"
-
-#: ../../mod/notifications.php:286
-msgid "No more network notifications."
-msgstr "Keine weiteren Netzwerk-Benachrichtigungen."
-
-#: ../../mod/notifications.php:381
-msgid "No more personal notifications."
-msgstr "Keine weiteren persönlichen Benachrichtigungen"
-
-#: ../../mod/notifications.php:462
-msgid "No more home notifications."
-msgstr "Keine weiteren Pinnwand-Benachrichtigungen"
-
-#: ../../mod/message.php:23
-msgid "No recipient selected."
-msgstr "Kein Empfänger gewählt."
-
-#: ../../mod/message.php:26
-msgid "Unable to locate contact information."
-msgstr "Konnte die Kontaktinformationen nicht finden."
-
-#: ../../mod/message.php:29
-msgid "Message could not be sent."
-msgstr "Nachricht konnte nicht gesendet werden."
-
-#: ../../mod/message.php:32
-msgid "Message collection failure."
-msgstr "Konnte Nachrichten nicht abrufen."
-
-#: ../../mod/message.php:35
-msgid "Message sent."
-msgstr "Nachricht gesendet."
-
-#: ../../mod/message.php:55
-msgid "Inbox"
-msgstr "Eingang"
-
-#: ../../mod/message.php:60
-msgid "Outbox"
-msgstr "Ausgang"
-
-#: ../../mod/message.php:65
-msgid "New Message"
-msgstr "Neue Nachricht"
-
-#: ../../mod/message.php:91
-msgid "Message deleted."
-msgstr "Nachricht gelöscht."
-
-#: ../../mod/message.php:121
-msgid "Conversation removed."
-msgstr "Unterhaltung gelöscht."
-
-#: ../../mod/message.php:137 ../../include/conversation.php:815
-msgid "Please enter a link URL:"
-msgstr "Bitte gib die URL des Links ein:"
-
-#: ../../mod/message.php:145
-msgid "Send Private Message"
-msgstr "Private Nachricht senden"
-
-#: ../../mod/message.php:146 ../../mod/message.php:287
-msgid "To:"
-msgstr "An:"
-
-#: ../../mod/message.php:147 ../../mod/message.php:288
-msgid "Subject:"
-msgstr "Betreff:"
-
-#: ../../mod/message.php:150 ../../mod/message.php:291
-#: ../../mod/invite.php:101
-msgid "Your message:"
-msgstr "Deine Nachricht:"
-
-#: ../../mod/message.php:153 ../../mod/message.php:294
-#: ../../mod/editpost.php:91 ../../include/conversation.php:863
-msgid "Upload photo"
-msgstr "Foto hochladen"
-
-#: ../../mod/message.php:154 ../../mod/message.php:295
-#: ../../mod/editpost.php:93 ../../include/conversation.php:867
-msgid "Insert web link"
-msgstr "Weblink einfügen"
-
-#: ../../mod/message.php:155 ../../mod/message.php:296
-#: ../../mod/editpost.php:99 ../../mod/photos.php:1186
-#: ../../include/conversation.php:294 ../../include/conversation.php:631
-#: ../../include/conversation.php:879
-msgid "Please wait"
-msgstr "Bitte warten"
-
-#: ../../mod/message.php:188
-msgid "No messages."
-msgstr "Keine Nachrichten."
-
-#: ../../mod/message.php:201
-msgid "Delete conversation"
-msgstr "Unterhaltung löschen"
-
-#: ../../mod/message.php:204
-msgid "D, d M Y - g:i A"
-msgstr "D, d. M Y - g:i A"
-
-#: ../../mod/message.php:239
-msgid "Message not available."
-msgstr "Nachricht nicht verfügbar."
-
-#: ../../mod/message.php:276
-msgid "Delete message"
-msgstr "Nachricht löschen"
-
-#: ../../mod/message.php:286
-msgid "Send Reply"
-msgstr "Antwort senden"
-
-#: ../../mod/wall_upload.php:56 ../../mod/profile_photo.php:113
-#, php-format
-msgid "Image exceeds size limit of %d"
-msgstr "Bildgröße überschreitet das Limit von %d"
-
-#: ../../mod/wall_upload.php:65 ../../mod/profile_photo.php:122
-#: ../../mod/photos.php:649
-msgid "Unable to process image."
-msgstr "Konnte das Bild nicht bearbeiten."
-
-#: ../../mod/wall_upload.php:81 ../../mod/wall_upload.php:90
-#: ../../mod/wall_upload.php:97 ../../mod/item.php:318
-#: ../../include/message.php:143
-msgid "Wall Photos"
-msgstr "Pinnwand-Bilder"
-
-#: ../../mod/wall_upload.php:84 ../../mod/profile_photo.php:251
-#: ../../mod/photos.php:669
-msgid "Image upload failed."
-msgstr "Hochladen des Bildes gescheitert."
-
-#: ../../mod/wall_attach.php:57
-#, php-format
-msgid "File exceeds size limit of %d"
-msgstr "Die Datei ist größer als das erlaubte Limit von %d"
-
-#: ../../mod/wall_attach.php:87 ../../mod/wall_attach.php:98
-msgid "File upload failed."
-msgstr "Hochladen der Datei fehlgeschlagen."
-
-#: ../../mod/profile_photo.php:28
-msgid "Image uploaded but image cropping failed."
-msgstr "Bilder hochgeladen, aber das Zuschneiden ist fehlgeschlagen."
-
-#: ../../mod/profile_photo.php:58 ../../mod/profile_photo.php:65
-#: ../../mod/profile_photo.php:72 ../../mod/profile_photo.php:170
-#: ../../mod/profile_photo.php:246 ../../mod/profile_photo.php:255
-#: ../../mod/register.php:327 ../../mod/register.php:334
-#: ../../mod/register.php:341 ../../mod/photos.php:146
-#: ../../mod/photos.php:593 ../../mod/photos.php:938 ../../mod/photos.php:953
-#: ../../addon/communityhome/communityhome.php:111
-msgid "Profile Photos"
-msgstr "Profilbilder"
-
-#: ../../mod/profile_photo.php:61 ../../mod/profile_photo.php:68
-#: ../../mod/profile_photo.php:75 ../../mod/profile_photo.php:258
-#, php-format
-msgid "Image size reduction [%s] failed."
-msgstr "Verkleinern der Bildgröße von [%s] ist gescheitert."
+"Upload a profile photo if you have not done so already. Studies have shown "
+"that people with real photos of themselves are ten times more likely to make"
+" friends than people who do not."
+msgstr "Lade ein Profilbild hoch falls du es noch nicht getan hast. Studien haben gezeigt, dass es zehnmal wahrscheinlicher ist neue Freunde zu finden, wenn du ein Bild von dir selbst verwendest als wenn du dies nicht tust."
-#: ../../mod/profile_photo.php:89
+#: ../../mod/newmember.php:23
msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
-msgstr ""
-"Drücke Umschalt+Neu Laden oder leere den Browser-Cache, falls das neue Foto "
-"nicht gleich angezeigt wird."
-
-#: ../../mod/profile_photo.php:99
-msgid "Unable to process image"
-msgstr "Bild konnte nicht verarbeitet werden"
-
-#: ../../mod/profile_photo.php:203
-msgid "Upload File:"
-msgstr "Datei hochladen:"
-
-#: ../../mod/profile_photo.php:204
-msgid "Upload Profile Photo"
-msgstr "Profilbild hochladen"
-
-#: ../../mod/profile_photo.php:205
-msgid "Upload"
-msgstr "Hochladen"
-
-#: ../../mod/profile_photo.php:206
-msgid "skip this step"
-msgstr "diesen Schritt überspringen"
-
-#: ../../mod/profile_photo.php:206
-msgid "select a photo from your photo albums"
-msgstr "wähle ein Foto von deinen Fotoalben"
-
-#: ../../mod/profile_photo.php:219
-msgid "Crop Image"
-msgstr "Bild zurechtschneiden"
-
-#: ../../mod/profile_photo.php:220
-msgid "Please adjust the image cropping for optimum viewing."
-msgstr ""
-"Passe bitte den Bildausschnitt an, damit das Bild optimal dargestellt werden"
-" kann."
-
-#: ../../mod/profile_photo.php:221
-msgid "Done Editing"
-msgstr "Bearbeitung abgeschlossen"
-
-#: ../../mod/profile_photo.php:249
-msgid "Image uploaded successfully."
-msgstr "Bild erfolgreich auf den Server geladen."
-
-#: ../../mod/manage.php:37
-#, php-format
-msgid "Welcome back %s"
-msgstr "Willkommen zurück %s"
-
-#: ../../mod/manage.php:87
-msgid "Manage Identities and/or Pages"
-msgstr "Verwalte Identitäten und/oder Seiten"
+"Authorise the Facebook Connector if you currently have a Facebook account "
+"and we will (optionally) import all your Facebook friends and conversations."
+msgstr "Richte die Verbindung zu Facebook ein, wenn du im Augenblick ein Facebook Konto hast und (optional) deine Facebook Freunde und Unterhaltungen importieren willst."
-#: ../../mod/manage.php:90
+#: ../../mod/newmember.php:28
msgid ""
-"(Toggle between different identities or community/group pages which share "
-"your account details.)"
-msgstr ""
-"(Wähle zwischen verschiedenen Identitäten oder Gemeinschafts/Gruppen-Seiten,"
-" die deine Accountdetails teilen.)"
-
-#: ../../mod/manage.php:92
-msgid "Select an identity to manage: "
-msgstr "Wähle eine Identität zum Verwalten: "
-
-#: ../../mod/tagger.php:70 ../../mod/like.php:127 ../../mod/photos.php:524
-#: ../../include/conversation.php:31 ../../include/conversation.php:104
-#: ../../include/diaspora.php:1554
-#: ../../addon/communityhome/communityhome.php:163
-msgid "photo"
-msgstr "Foto"
-
-#: ../../mod/tagger.php:70 ../../mod/like.php:127
-#: ../../include/conversation.php:26 ../../include/conversation.php:35
-#: ../../include/conversation.php:99 ../../include/conversation.php:108
-#: ../../include/diaspora.php:1554 ../../addon/facebook/facebook.php:1084
-#: ../../addon/communityhome/communityhome.php:158
-#: ../../addon/communityhome/communityhome.php:167
-msgid "status"
-msgstr "Status"
-
-#: ../../mod/tagger.php:103 ../../include/conversation.php:116
-#, php-format
-msgid "%1$s tagged %2$s's %3$s with %4$s"
-msgstr "%1$s hat %2$ss %3$s mit %4$s getaggt"
-
-#: ../../mod/common.php:34
-msgid "Common Friends"
-msgstr "Gemeinsame Freunde"
-
-#: ../../mod/common.php:42
-msgid "No friends in common."
-msgstr "Keine gemeinsamen Freunde."
-
-#: ../../mod/profiles.php:21 ../../mod/profiles.php:239
-#: ../../mod/profiles.php:344 ../../mod/dfrn_confirm.php:62
-msgid "Profile not found."
-msgstr "Profil nicht gefunden."
-
-#: ../../mod/profiles.php:28
-msgid "Profile Name is required."
-msgstr "Profilname ist erforderlich."
-
-#: ../../mod/profiles.php:198
-msgid "Profile updated."
-msgstr "Profil aktualisiert."
-
-#: ../../mod/profiles.php:256
-msgid "Profile deleted."
-msgstr "Profil gelöscht."
-
-#: ../../mod/profiles.php:272 ../../mod/profiles.php:303
-msgid "Profile-"
-msgstr "Profil-"
-
-#: ../../mod/profiles.php:291 ../../mod/profiles.php:330
-msgid "New profile created."
-msgstr "Neues Profil angelegt."
-
-#: ../../mod/profiles.php:309
-msgid "Profile unavailable to clone."
-msgstr "Profil nicht zum Duplizieren verfügbar."
-
-#: ../../mod/profiles.php:356
-msgid "Hide your contact/friend list from viewers of this profile?"
-msgstr "Liste der Kontakte vor Betrachtern dieses Profils verbergen?"
-
-#: ../../mod/profiles.php:374
-msgid "Edit Profile Details"
-msgstr "Profil bearbeiten"
-
-#: ../../mod/profiles.php:376
-msgid "View this profile"
-msgstr "Dieses Profil anzeigen"
-
-#: ../../mod/profiles.php:377
-msgid "Create a new profile using these settings"
-msgstr "Neues Profil anlegen und diese Einstellungen verwenden"
-
-#: ../../mod/profiles.php:378
-msgid "Clone this profile"
-msgstr "Dieses Profil duplizieren"
-
-#: ../../mod/profiles.php:379
-msgid "Delete this profile"
-msgstr "Dieses Profil löschen"
-
-#: ../../mod/profiles.php:380
-msgid "Profile Name:"
-msgstr "Profilname:"
-
-#: ../../mod/profiles.php:381
-msgid "Your Full Name:"
-msgstr "Dein kompletter Name:"
-
-#: ../../mod/profiles.php:382
-msgid "Title/Description:"
-msgstr "Titel/Beschreibung:"
-
-#: ../../mod/profiles.php:383
-msgid "Your Gender:"
-msgstr "Dein Geschlecht:"
-
-#: ../../mod/profiles.php:384
-#, php-format
-msgid "Birthday (%s):"
-msgstr "Geburtstag (%s):"
-
-#: ../../mod/profiles.php:385
-msgid "Street Address:"
-msgstr "Adresse:"
-
-#: ../../mod/profiles.php:386
-msgid "Locality/City:"
-msgstr "Wohnort/Stadt:"
-
-#: ../../mod/profiles.php:387
-msgid "Postal/Zip Code:"
-msgstr "Postleitzahl:"
-
-#: ../../mod/profiles.php:388
-msgid "Country:"
-msgstr "Land:"
-
-#: ../../mod/profiles.php:389
-msgid "Region/State:"
-msgstr "Region/Bundesstaat:"
-
-#: ../../mod/profiles.php:390
-msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
-msgstr "<span class=\"heart\">&hearts;</span> Beziehungsstatus:"
-
-#: ../../mod/profiles.php:391
-msgid "Who: (if applicable)"
-msgstr "Wer: (falls anwendbar)"
-
-#: ../../mod/profiles.php:392
-msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
-msgstr "Beispiele: cathy123, Cathy Williams, cathy@example.com"
-
-#: ../../mod/profiles.php:393 ../../include/profile_advanced.php:43
-msgid "Sexual Preference:"
-msgstr "Sexuelle Vorlieben:"
-
-#: ../../mod/profiles.php:394
-msgid "Homepage URL:"
-msgstr "Adresse der Homepage:"
-
-#: ../../mod/profiles.php:395 ../../include/profile_advanced.php:47
-msgid "Political Views:"
-msgstr "Politische Ansichten:"
-
-#: ../../mod/profiles.php:396
-msgid "Religious Views:"
-msgstr "Religiöse Ansichten:"
-
-#: ../../mod/profiles.php:397
-msgid "Public Keywords:"
-msgstr "Öffentliche Schlüsselwörter:"
-
-#: ../../mod/profiles.php:398
-msgid "Private Keywords:"
-msgstr "Private Schlüsselwörter:"
-
-#: ../../mod/profiles.php:399
-msgid "Example: fishing photography software"
-msgstr "Beispiel: Fischen Fotografie Software"
-
-#: ../../mod/profiles.php:400
-msgid "(Used for suggesting potential friends, can be seen by others)"
-msgstr ""
-"(Wird verwendet um potentielle Freunde zu finden, könnte von Fremden "
-"eingesehen werden)"
-
-#: ../../mod/profiles.php:401
-msgid "(Used for searching profiles, never shown to others)"
-msgstr ""
-"(Wird für die Suche nach Profilen verwendet und niemals veröffentlicht)"
-
-#: ../../mod/profiles.php:402
-msgid "Tell us about yourself..."
-msgstr "Erzähle uns ein bisschen von dir …"
-
-#: ../../mod/profiles.php:403
-msgid "Hobbies/Interests"
-msgstr "Hobbies/Interessen"
-
-#: ../../mod/profiles.php:404
-msgid "Contact information and Social Networks"
-msgstr "Kontaktinformationen und Soziale Netzwerke"
-
-#: ../../mod/profiles.php:405
-msgid "Musical interests"
-msgstr "Musikalische Interessen"
-
-#: ../../mod/profiles.php:406
-msgid "Books, literature"
-msgstr "Literatur/Bücher"
-
-#: ../../mod/profiles.php:407
-msgid "Television"
-msgstr "Fernsehen"
-
-#: ../../mod/profiles.php:408
-msgid "Film/dance/culture/entertainment"
-msgstr "Filme/Tänze/Kultur/Unterhaltung"
-
-#: ../../mod/profiles.php:409
-msgid "Love/romance"
-msgstr "Liebesleben"
-
-#: ../../mod/profiles.php:410
-msgid "Work/employment"
-msgstr "Arbeit/Beschäftigung"
-
-#: ../../mod/profiles.php:411
-msgid "School/education"
-msgstr "Schule/Ausbildung"
+"Enter your email access information on your Connector Settings page if you "
+"wish to import and interact with friends or mailing lists from your email "
+"INBOX"
+msgstr "Gib deine E-Mail-Zugangsinformationen auf der Connector-Einstellungsseite ein, falls du E-Mails aus deinem Posteingang importieren und mit Freunden und Mailinglisten interagieren willlst."
-#: ../../mod/profiles.php:416
+#: ../../mod/newmember.php:30
msgid ""
-"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
-"be visible to anybody using the internet."
-msgstr ""
-"Dies ist dein <strong>öffentliches</strong> Profil.<br />Es "
-"<strong>könnte</strong> für jeden Nutzer des Internets sichtbar sein."
-
-#: ../../mod/profiles.php:461
-msgid "Edit/Manage Profiles"
-msgstr "Verwalte/Editiere Profile"
+"Edit your <strong>default</strong> profile to your liking. Review the "
+"settings for hiding your list of friends and hiding the profile from unknown"
+" visitors."
+msgstr "Editiere dein <strong>Standard</strong> Profil nach deinen Vorlieben. Überprüfe die Einstellungen zum Verbergen deiner Freundesliste vor unbekannten Betrachtern des Profils."
-#: ../../mod/profiles.php:462 ../../boot.php:927
-msgid "Change profile photo"
-msgstr "Profilbild ändern"
+#: ../../mod/newmember.php:32
+msgid ""
+"Set some public keywords for your default profile which describe your "
+"interests. We may be able to find other people with similar interests and "
+"suggest friendships."
+msgstr "Trage ein paar öffentliche Stichwörter in dein Standardprofil ein, die deine Interessen beschreiben. Eventuell sind wir in der Lage Leute zu finden, die deine Interessen teilen und können dir dann Kontakte vorschlagen."
-#: ../../mod/profiles.php:463 ../../boot.php:928
-msgid "Create New Profile"
-msgstr "Neues Profil anlegen"
+#: ../../mod/newmember.php:34
+msgid ""
+"Your Contacts page is your gateway to managing friendships and connecting "
+"with friends on other networks. Typically you enter their address or site "
+"URL in the <em>Add New Contact</em> dialog."
+msgstr "Die Kontakte-Seite ist die Einstiegsseite, von der aus du Kontakte verwalten und dich mit Freunden in anderen Netzwerken verbinden kannst. Normalerweise gibst du dazu einfach ihre Adresse oder die URL der Seite im Kasten <em>Neuen Kontakt hinzufügen</em> ein."
-#: ../../mod/profiles.php:473 ../../boot.php:938
-msgid "Profile Image"
-msgstr "Profilbild"
+#: ../../mod/newmember.php:36
+msgid ""
+"The Directory page lets you find other people in this network or other "
+"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
+"their profile page. Provide your own Identity Address if requested."
+msgstr "Ãœber die Verzeichnisseite kannst du andere Personen auf diesem Server oder anderen verteilten Seiten finden. Halte nach einem <em>Verbinden</em> oder <em>Folgen</em> Link auf deren Profilseiten Ausschau und gib deine eigene Profiladresse an falls du danach gefragt wirst."
-#: ../../mod/profiles.php:475 ../../boot.php:941
-msgid "visible to everybody"
-msgstr "sichtbar für jeden"
+#: ../../mod/newmember.php:38
+msgid ""
+"Once you have made some friends, organize them into private conversation "
+"groups from the sidebar of your Contacts page and then you can interact with"
+" each group privately on your Network page."
+msgstr "Sobald du einige Freunde gefunden hast, organisiere sie in Gruppen zur privaten Kommunikation im Seitenmenü der Kontakte-Seite. Du kannst dann mit jeder dieser Gruppen von der Netzwerkseite aus privat interagieren."
-#: ../../mod/profiles.php:476 ../../boot.php:942
-msgid "Edit visibility"
-msgstr "Sichtbarkeit bearbeiten"
+#: ../../mod/newmember.php:40
+msgid ""
+"Our <strong>help</strong> pages may be consulted for detail on other program"
+" features and resources."
+msgstr "Unsere <strong>Hilfe</strong> Seiten können herangezogen werden, um weitere Einzelheiten zu andern Programm Features zu erhalten."
-#: ../../mod/openid.php:63 ../../mod/openid.php:123 ../../include/auth.php:122
-#: ../../include/auth.php:147 ../../include/auth.php:201
-msgid "Login failed."
-msgstr "Annmeldung fehlgeschlagen."
+#: ../../mod/attach.php:8
+msgid "Item not available."
+msgstr "Beitrag nicht verfügbar."
-#: ../../mod/openid.php:79 ../../include/auth.php:217
-msgid "Welcome "
-msgstr "Willkommen "
+#: ../../mod/attach.php:20
+msgid "Item was not found."
+msgstr "Beitrag konnte nicht gefunden werden."
-#: ../../mod/openid.php:80 ../../include/auth.php:218
-msgid "Please upload a profile photo."
-msgstr "Bitte lade ein Profilbild hoch."
+#: ../../mod/group.php:27
+msgid "Group created."
+msgstr "Gruppe erstellt."
-#: ../../mod/openid.php:83 ../../include/auth.php:221
-msgid "Welcome back "
-msgstr "Willkommen zurück "
+#: ../../mod/group.php:33
+msgid "Could not create group."
+msgstr "Konnte die Gruppe nicht erstellen."
-#: ../../mod/localtime.php:12 ../../include/event.php:11
-#: ../../include/bb2diaspora.php:237
-msgid "l F d, Y \\@ g:i A"
-msgstr "l F d, Y \\@ g:i A"
+#: ../../mod/group.php:43 ../../mod/group.php:123
+msgid "Group not found."
+msgstr "Gruppe nicht gefunden."
-#: ../../mod/localtime.php:24
-msgid "Time Conversion"
-msgstr "Zeitumrechnung"
+#: ../../mod/group.php:56
+msgid "Group name changed."
+msgstr "Gruppenname geändert."
-#: ../../mod/localtime.php:26
-msgid ""
-"Friendika provides this service for sharing events with other networks and "
-"friends in unknown timezones."
-msgstr ""
-"Friendica bietet diese Funktion an, um das teilen von Events mit Kontakten "
-"zu vereinfachen, deren Zeitzone nicht ermittelt werden kann."
+#: ../../mod/group.php:67 ../../mod/profperm.php:19 ../../index.php:287
+msgid "Permission denied"
+msgstr "Zugriff verweigert"
-#: ../../mod/localtime.php:30
-#, php-format
-msgid "UTC time: %s"
-msgstr "UTC Zeit: %s"
+#: ../../mod/group.php:82
+msgid "Create a group of contacts/friends."
+msgstr "Eine Gruppe von Kontakten/Freunden anlegen."
-#: ../../mod/localtime.php:33
-#, php-format
-msgid "Current timezone: %s"
-msgstr "Aktuelle Zeitzone: %s"
+#: ../../mod/group.php:83 ../../mod/group.php:166
+msgid "Group Name: "
+msgstr "Gruppenname:"
-#: ../../mod/localtime.php:36
-#, php-format
-msgid "Converted localtime: %s"
-msgstr "Umgerechnete lokale Zeit: %s"
+#: ../../mod/group.php:98
+msgid "Group removed."
+msgstr "Gruppe entfernt."
-#: ../../mod/localtime.php:41
-msgid "Please select your timezone:"
-msgstr "Bitte wähle deine Zeitzone."
+#: ../../mod/group.php:100
+msgid "Unable to remove group."
+msgstr "Konnte die Gruppe nicht entfernen."
-#: ../../mod/invite.php:35
-#, php-format
-msgid "%s : Not a valid email address."
-msgstr "%s: Keine gültige Email Adresse."
+#: ../../mod/group.php:164 ../../mod/profperm.php:105
+msgid "Click on a contact to add or remove."
+msgstr "Klicke einen Kontakt an, um ihn hinzuzufügen oder zu entfernen"
-#: ../../mod/invite.php:59
-#, php-format
-msgid "Please join my network on %s"
-msgstr "Bitte trete meinem Netzwerk auf %s bei"
+#: ../../mod/group.php:165
+msgid "Group Editor"
+msgstr "Gruppeneditor"
-#: ../../mod/invite.php:69
-#, php-format
-msgid "%s : Message delivery failed."
-msgstr "%s: Zustellung der Nachricht fehlgeschlagen."
+#: ../../mod/group.php:179
+msgid "Members"
+msgstr "Mitglieder"
-#: ../../mod/invite.php:73
-#, php-format
-msgid "%d message sent."
-msgid_plural "%d messages sent."
-msgstr[0] "%d Nachricht gesendet."
-msgstr[1] "%d Nachrichten gesendet."
+#: ../../mod/group.php:194
+msgid "All Contacts"
+msgstr "Alle Kontakte"
-#: ../../mod/invite.php:92
-msgid "You have no more invitations available"
-msgstr "Du hast keine weiteren Einladungen"
+#: ../../mod/profperm.php:25 ../../mod/profperm.php:55
+msgid "Invalid profile identifier."
+msgstr "Ungültiger Profil-Bezeichner"
-#: ../../mod/invite.php:99
-msgid "Send invitations"
-msgstr "Einladungen senden"
+#: ../../mod/profperm.php:101
+msgid "Profile Visibility Editor"
+msgstr "Editor für die Profil-Sichtbarkeit"
-#: ../../mod/invite.php:100
-msgid "Enter email addresses, one per line:"
-msgstr "E-Mail-Adressen eingeben, eine pro Zeile:"
+#: ../../mod/profperm.php:103 ../../include/profile_advanced.php:7
+#: ../../include/profile_advanced.php:76 ../../include/nav.php:48
+#: ../../boot.php:1332
+msgid "Profile"
+msgstr "Profil"
-#: ../../mod/invite.php:102
-#, php-format
-msgid "Please join my social network on %s"
-msgstr "Bitte trete meinem Sozialen Netzwerk auf %s bei"
+#: ../../mod/profperm.php:114
+msgid "Visible To"
+msgstr "Sichtbar für"
-#: ../../mod/invite.php:103
-msgid "To accept this invitation, please visit:"
-msgstr "Um diese Einladung anzunehmen besuche bitte:"
+#: ../../mod/profperm.php:130
+msgid "All Contacts (with secure profile access)"
+msgstr "Alle Kontakte (mit gesichertem Profilzugriff)"
-#: ../../mod/invite.php:104
-msgid "You will need to supply this invitation code: $invite_code"
-msgstr "Du benötigst den folgenden Einladungs Code: $invite_code"
+#: ../../mod/viewcontacts.php:25 ../../include/text.php:578
+msgid "View Contacts"
+msgstr "Kontakte anzeigen"
-#: ../../mod/invite.php:104
-msgid ""
-"Once you have registered, please connect with me via my profile page at:"
-msgstr ""
-"Sobald du registriert bist, kontaktiere mich bitte auf meiner Profilseite:"
+#: ../../mod/viewcontacts.php:40
+msgid "No contacts."
+msgstr "Keine Kontakte."
#: ../../mod/register.php:62
msgid "An invitation is required."
@@ -2055,9 +2353,7 @@ msgstr "Konnte diese E-Mail-Adresse nicht verwenden."
msgid ""
"Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and "
"must also begin with a letter."
-msgstr ""
-"Dein Spitzname darf nur aus Buchstaben und Zahlen (\"a-z\",\"0-9\", \"_\" "
-"und \"-\") bestehen, außerdem muss er mit einem Buchstaben beginnen."
+msgstr "Dein Spitzname darf nur aus Buchstaben und Zahlen (\"a-z\",\"0-9\", \"_\" und \"-\") bestehen, außerdem muss er mit einem Buchstaben beginnen."
#: ../../mod/register.php:151 ../../mod/register.php:252
msgid "Nickname is already registered. Please choose another."
@@ -2069,40 +2365,25 @@ msgstr "SERIOUS ERROR: Generation of security keys failed."
#: ../../mod/register.php:238
msgid "An error occurred during registration. Please try again."
-msgstr ""
-"Wärend der Anmeldung ist ein Fehler aufgetreten. Bitte versuche es noch "
-"einmal."
+msgstr "Wärend der Anmeldung ist ein Fehler aufgetreten. Bitte versuche es noch einmal."
#: ../../mod/register.php:274
msgid "An error occurred creating your default profile. Please try again."
-msgstr ""
-"Bei der Erstellung des Standard-Profils ist ein Fehler aufgetreten. Bitte "
-"versuche es noch einmal."
+msgstr "Bei der Erstellung des Standard-Profils ist ein Fehler aufgetreten. Bitte versuche es noch einmal."
#: ../../mod/register.php:378 ../../mod/regmod.php:52
#, php-format
msgid "Registration details for %s"
msgstr "Details der Registration von %s"
-#: ../../mod/register.php:380 ../../mod/register.php:434
-#: ../../mod/lostpass.php:44 ../../mod/lostpass.php:106
-#: ../../mod/regmod.php:54 ../../mod/dfrn_confirm.php:710
-#: ../../include/items.php:2415
-msgid "Administrator"
-msgstr "Administrator"
-
#: ../../mod/register.php:386
msgid ""
"Registration successful. Please check your email for further instructions."
-msgstr ""
-"Registrierung erfolgreich. Eine E-Mail mit weiteren Anweisungen wurde an "
-"dich gesendet."
+msgstr "Registrierung erfolgreich. Eine E-Mail mit weiteren Anweisungen wurde an dich gesendet."
#: ../../mod/register.php:390
msgid "Failed to send email message. Here is the message that failed."
-msgstr ""
-"Konnte die E-Mail nicht versenden. Hier ist die Nachricht, die nicht "
-"gesendet werden konnte."
+msgstr "Konnte die E-Mail nicht versenden. Hier ist die Nachricht, die nicht gesendet werden konnte."
#: ../../mod/register.php:395
msgid "Your registration can not be processed."
@@ -2115,32 +2396,25 @@ msgstr "Registrierungsanfrage auf %s"
#: ../../mod/register.php:441
msgid "Your registration is pending approval by the site owner."
-msgstr ""
-"Deine Registrierung muss noch vom Betreiber der Seite freigegeben werden."
+msgstr "Deine Registrierung muss noch vom Betreiber der Seite freigegeben werden."
#: ../../mod/register.php:479
msgid ""
"This site has exceeded the number of allowed daily account registrations. "
"Please try again tomorrow."
-msgstr ""
-"Die maximale Anzahl täglicher Registrierungen auf dieser Seite wurde "
-"überschritten. Bitte versuche es morgen noch einmal."
+msgstr "Die maximale Anzahl täglicher Registrierungen auf dieser Seite wurde überschritten. Bitte versuche es morgen noch einmal."
#: ../../mod/register.php:505
msgid ""
"You may (optionally) fill in this form via OpenID by supplying your OpenID "
"and clicking 'Register'."
-msgstr ""
-"Du kannst dieses Formular auch (optional) mit deiner OpenID ausfüllen, indem"
-" du deine OpenID angibst und 'Registrieren' klickst."
+msgstr "Du kannst dieses Formular auch (optional) mit deiner OpenID ausfüllen, indem du deine OpenID angibst und 'Registrieren' klickst."
#: ../../mod/register.php:506
msgid ""
"If you are not familiar with OpenID, please leave that field blank and fill "
"in the rest of the items."
-msgstr ""
-"Wenn du nicht mit OpenID vertraut bist, lass dieses Feld bitte leer und "
-"fülle die restlichen Felder aus."
+msgstr "Wenn du nicht mit OpenID vertraut bist, lass dieses Feld bitte leer und fülle die restlichen Felder aus."
#: ../../mod/register.php:507
msgid "Your OpenID (optional): "
@@ -2152,8 +2426,7 @@ msgstr "Soll dein Profil im Nutzerverzeichnis angezeigt werden?"
#: ../../mod/register.php:536
msgid "Membership on this site is by invitation only."
-msgstr ""
-"Mitgliedschaft auf dieser Seite ist nur nach vorheriger Einladung möglich."
+msgstr "Mitgliedschaft auf dieser Seite ist nur nach vorheriger Einladung möglich."
#: ../../mod/register.php:537
msgid "Your invitation ID: "
@@ -2176,225 +2449,51 @@ msgid ""
"Choose a profile nickname. This must begin with a text character. Your "
"profile address on this site will then be "
"'<strong>nickname@$sitename</strong>'."
-msgstr ""
-"Wähle einen Spitznamen für dein Profil. Dieser muss mit einem Buchstaben "
-"beginnen. Die Adresse deines Profils auf dieser Seite wird "
-"'<strong>spitzname@$sitename</strong>' sein."
+msgstr "Wähle einen Spitznamen für dein Profil. Dieser muss mit einem Buchstaben beginnen. Die Adresse deines Profils auf dieser Seite wird '<strong>spitzname@$sitename</strong>' sein."
#: ../../mod/register.php:551
msgid "Choose a nickname: "
msgstr "Spitznamen wählen: "
-#: ../../mod/register.php:554 ../../include/nav.php:77 ../../boot.php:684
+#: ../../mod/register.php:554 ../../include/nav.php:77 ../../boot.php:689
msgid "Register"
msgstr "Registrieren"
-#: ../../mod/apps.php:4
-msgid "Applications"
-msgstr "Anwendungen"
-
-#: ../../mod/apps.php:7
-msgid "No installed applications."
-msgstr "Keine Applikationen installiert."
-
-#: ../../mod/hcard.php:10
-msgid "No profile"
-msgstr "Kein Profil"
-
-#: ../../mod/fsuggest.php:63
-msgid "Friend suggestion sent."
-msgstr "Kontaktvorschlag gesendet."
-
-#: ../../mod/fsuggest.php:97
-msgid "Suggest Friends"
-msgstr "Kontakte vorschlagen"
-
-#: ../../mod/fsuggest.php:99
-#, php-format
-msgid "Suggest a friend for %s"
-msgstr "Schlage %s einen Kontakt vor"
-
-#: ../../mod/ping.php:148
-msgid "{0} wants to be your friend"
-msgstr "{0} möchte mit dir in Kontakt treten"
-
-#: ../../mod/ping.php:153
-msgid "{0} sent you a message"
-msgstr "{0} hat dir eine Nachricht geschickt"
-
-#: ../../mod/ping.php:158
-msgid "{0} requested registration"
-msgstr "{0} möchte sich registrieren"
-
-#: ../../mod/ping.php:164
-#, php-format
-msgid "{0} commented %s's post"
-msgstr "{0} kommentierte einen Beitrag von %s"
-
-#: ../../mod/ping.php:169
-#, php-format
-msgid "{0} liked %s's post"
-msgstr "{0} mag %ss Beitrag"
-
-#: ../../mod/ping.php:174
-#, php-format
-msgid "{0} disliked %s's post"
-msgstr "{0} mag %ss Beitrag nicht"
-
-#: ../../mod/ping.php:179
-#, php-format
-msgid "{0} is now friends with %s"
-msgstr "{0} ist jetzt mit %s befreundet"
+#: ../../mod/dirfind.php:23
+msgid "People Search"
+msgstr "Personen Suche"
-#: ../../mod/ping.php:184
-msgid "{0} posted"
-msgstr "{0} hat etwas veröffentlicht"
+#: ../../mod/like.php:127 ../../mod/tagger.php:70
+#: ../../addon/facebook/facebook.php:1091
+#: ../../addon/communityhome/communityhome.php:158
+#: ../../addon/communityhome/communityhome.php:167
+#: ../../include/diaspora.php:1587 ../../include/conversation.php:26
+#: ../../include/conversation.php:35 ../../include/conversation.php:99
+#: ../../include/conversation.php:108
+msgid "status"
+msgstr "Status"
-#: ../../mod/ping.php:189
+#: ../../mod/like.php:144 ../../addon/facebook/facebook.php:1095
+#: ../../addon/communityhome/communityhome.php:172
+#: ../../include/diaspora.php:1603 ../../include/conversation.php:43
#, php-format
-msgid "{0} tagged %s's post with #%s"
-msgstr "{0} hat %ss Beitrag mit dem Schlagwort #%s versehen"
-
-#: ../../mod/ping.php:195
-msgid "{0} mentioned you in a post"
-msgstr "{0} hat dich in einem Beitrag erwähnt"
-
-#: ../../mod/lostpass.php:16
-msgid "No valid account found."
-msgstr "Kein gültiger Account gefunden."
-
-#: ../../mod/lostpass.php:31
-msgid "Password reset request issued. Check your email."
-msgstr "Zurücksetzen des Passworts eingeleitet. Bitte überprüfe deine E-Mail."
+msgid "%1$s likes %2$s's %3$s"
+msgstr "%1$s mag %2$ss %3$s"
-#: ../../mod/lostpass.php:42
+#: ../../mod/like.php:146 ../../include/conversation.php:46
#, php-format
-msgid "Password reset requested at %s"
-msgstr "Anfrage zum Zurücksetzen des Passworts auf %s erhalten"
-
-#: ../../mod/lostpass.php:64
-msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
-msgstr ""
-"Anfrage konnte nicht verifiziert werden. (Eventuell hast du bereits ähnliche"
-" Anfrage gestellt.) Zurücksetzen des Passworts gescheitert."
-
-#: ../../mod/lostpass.php:82 ../../boot.php:714
-msgid "Password Reset"
-msgstr "Passwort zurücksetzen"
-
-#: ../../mod/lostpass.php:83
-msgid "Your password has been reset as requested."
-msgstr "Dein Passwort wurde wie gewünscht zurückgesetzt."
-
-#: ../../mod/lostpass.php:84
-msgid "Your new password is"
-msgstr "Dein neues Passwort lautet"
-
-#: ../../mod/lostpass.php:85
-msgid "Save or copy your new password - and then"
-msgstr "Speichere oder kopiere dein neues Passwort - und dann"
-
-#: ../../mod/lostpass.php:86
-msgid "click here to login"
-msgstr "hier klicken, um dich anzumelden"
-
-#: ../../mod/lostpass.php:87
-msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
-msgstr ""
-"Du kannst das Passwort in den <em>Einstellungen</em> ändern sobald du dich "
-"erfolgreich angemeldet hast."
-
-#: ../../mod/lostpass.php:118
-msgid "Forgot your Password?"
-msgstr "Hast du dein Passwort vergessen?"
-
-#: ../../mod/lostpass.php:119
-msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
-msgstr ""
-"Gib deine Email-Adresse an und fordere ein neues Passwort an. Es werden dir "
-"dann weitere Informationen per Mail zugesendet."
-
-#: ../../mod/lostpass.php:120
-msgid "Nickname or Email: "
-msgstr "Spitzname oder Email:"
-
-#: ../../mod/lostpass.php:121
-msgid "Reset"
-msgstr "Zurücksetzen"
-
-#: ../../mod/editpost.php:17 ../../mod/editpost.php:27
-msgid "Item not found"
-msgstr "Beitrag nicht gefunden"
-
-#: ../../mod/editpost.php:32
-msgid "Edit post"
-msgstr "Beitrag bearbeiten"
-
-#: ../../mod/editpost.php:75 ../../include/conversation.php:848
-msgid "Post to Email"
-msgstr "An E-Mail senden"
-
-#: ../../mod/editpost.php:92 ../../include/conversation.php:865
-msgid "Attach file"
-msgstr "Datei anhängen"
-
-#: ../../mod/editpost.php:94
-msgid "Insert YouTube video"
-msgstr "YouTube-Video einfügen"
-
-#: ../../mod/editpost.php:95
-msgid "Insert Vorbis [.ogg] video"
-msgstr "Vorbis [.ogg] Video einfügen"
-
-#: ../../mod/editpost.php:96
-msgid "Insert Vorbis [.ogg] audio"
-msgstr "Vorbis [.ogg] Audio einfügen"
-
-#: ../../mod/editpost.php:97 ../../include/conversation.php:873
-msgid "Set your location"
-msgstr "Deinen Standort festlegen"
-
-#: ../../mod/editpost.php:98 ../../include/conversation.php:875
-msgid "Clear browser location"
-msgstr "Browser-Standort leeren"
-
-#: ../../mod/editpost.php:100 ../../include/conversation.php:880
-msgid "Permission settings"
-msgstr "Berechtigungseinstellungen"
-
-#: ../../mod/editpost.php:108 ../../include/conversation.php:889
-msgid "CC: email addresses"
-msgstr "Cc:-E-Mail-Addressen"
-
-#: ../../mod/editpost.php:109 ../../include/conversation.php:890
-msgid "Public post"
-msgstr "Öffentlicher Beitrag"
-
-#: ../../mod/editpost.php:111 ../../include/conversation.php:892
-msgid "Example: bob@example.com, mary@example.com"
-msgstr "Z.B.: bob@example.com, mary@example.com"
-
-#: ../../mod/removeme.php:42 ../../mod/removeme.php:45
-msgid "Remove My Account"
-msgstr "Account löschen"
+msgid "%1$s doesn't like %2$s's %3$s"
+msgstr "%1$s mag %2$ss %3$s nicht"
-#: ../../mod/removeme.php:43
-msgid ""
-"This will completely remove your account. Once this has been done it is not "
-"recoverable."
-msgstr ""
-"Dies wird deinen Account endgültig löschen. Es gibt keine Möglichkeit, ihn "
-"wiederherzustellen."
+#: ../../mod/notice.php:15 ../../mod/viewsrc.php:15 ../../mod/admin.php:111
+#: ../../mod/admin.php:502 ../../mod/display.php:28 ../../mod/display.php:116
+#: ../../mod/viewd.php:14 ../../include/items.php:2819
+msgid "Item not found."
+msgstr "Beitrag nicht gefunden."
-#: ../../mod/removeme.php:44
-msgid "Please enter your password for verification:"
-msgstr "Bitte gib dein Passwort zur Verifikation ein:"
+#: ../../mod/viewsrc.php:7 ../../mod/viewd.php:6
+msgid "Access denied."
+msgstr "Zugriff verweigert."
#: ../../mod/regmod.php:61
msgid "Account approved."
@@ -2409,317 +2508,219 @@ msgstr "Registrierung für %s wurde zurückgezogen"
msgid "Please login."
msgstr "Bitte melde dich an."
-#: ../../mod/install.php:111
-msgid "Friendica Social Communications Server - Setup"
-msgstr "Friendica-Server für soziale Netzwerke – Setup"
-
-#: ../../mod/install.php:117 ../../mod/install.php:157
-#: ../../mod/install.php:229
-msgid "Database connection"
-msgstr "Datenbank-Verbindung"
+#: ../../mod/item.php:88
+msgid "Unable to locate original post."
+msgstr "Konnte den Originalbeitrag nicht finden."
-#: ../../mod/install.php:124
-msgid "Could not connect to database."
-msgstr "Verbindung zur Datenbank gescheitert"
+#: ../../mod/item.php:248
+msgid "Empty post discarded."
+msgstr "Leerer Beitrag wurde verworfen."
-#: ../../mod/install.php:128
-msgid "Could not create table."
-msgstr "Konnte Tabelle nicht erstellen."
+#: ../../mod/item.php:350 ../../mod/wall_upload.php:81
+#: ../../mod/wall_upload.php:90 ../../mod/wall_upload.php:97
+#: ../../include/message.php:143
+msgid "Wall Photos"
+msgstr "Pinnwand-Bilder"
-#: ../../mod/install.php:133
-msgid "Your Friendica site database has been installed."
-msgstr "Die Datenbank deiner Friendica Seite wurde installiert."
+#: ../../mod/item.php:827
+msgid "System error. Post not saved."
+msgstr "Systemfehler. Beitrag konnte nicht gespeichert werden."
-#: ../../mod/install.php:134
+#: ../../mod/item.php:852
+#, php-format
msgid ""
-"IMPORTANT: You will need to [manually] setup a scheduled task for the "
-"poller."
-msgstr ""
-"WICHTIG: Du musst [manuell] einen Cronjob (o.ä.) für den Poller einrichten."
-
-#: ../../mod/install.php:135 ../../mod/install.php:151
-#: ../../mod/install.php:209
-msgid "Please see the file \"INSTALL.txt\"."
-msgstr "Lies bitte die \"INSTALL.txt\"."
-
-#: ../../mod/install.php:137
-msgid "Proceed to registration"
-msgstr "Mit der Registrierung fortfahren"
+"This message was sent to you by %s, a member of the Friendica social "
+"network."
+msgstr "Diese Nachricht wurde dir von %s geschickt, einem Mitglied des Sozialen Netzwerks Friendica."
-#: ../../mod/install.php:143
-msgid "Proceed with Installation"
-msgstr "Mit der Installation fortfahren"
+#: ../../mod/item.php:854
+#, php-format
+msgid "You may visit them online at %s"
+msgstr "Du kannst sie online unter %s besuchen"
-#: ../../mod/install.php:150
+#: ../../mod/item.php:855
msgid ""
-"You may need to import the file \"database.sql\" manually using phpmyadmin "
-"or mysql."
-msgstr ""
-"Möglicherweise musst du die Datei \"database.sql\" manuell mit phpmyadmin "
-"oder mysql importieren."
-
-#: ../../mod/install.php:158
-msgid "Database import failed."
-msgstr "Import der Datenbank schlug fehl."
-
-#: ../../mod/install.php:206
-msgid "System check"
-msgstr "Systemtest"
-
-#: ../../mod/install.php:210 ../../mod/events.php:213
-msgid "Next"
-msgstr "Nächste"
+"Please contact the sender by replying to this post if you do not wish to "
+"receive these messages."
+msgstr "Falls du diese Beiträge nicht erhalten möchtest, kontaktiere bitte den Autor, indem du auf diese Nachricht antwortest."
-#: ../../mod/install.php:211
-msgid "Check again"
-msgstr "Noch einmal testen"
+#: ../../mod/item.php:857
+#, php-format
+msgid "%s posted an update."
+msgstr "%s hat ein Update veröffentlicht."
-#: ../../mod/install.php:230
-msgid ""
-"In order to install Friendica we need to know how to connect to your "
-"database."
-msgstr ""
-"Um Friendica installieren zu können müssen wir wissen wie wir zu deiner "
-"Datenbank Kontakt aufnehmen können."
+#: ../../mod/profile_photo.php:28
+msgid "Image uploaded but image cropping failed."
+msgstr "Bilder hochgeladen, aber das Zuschneiden ist fehlgeschlagen."
-#: ../../mod/install.php:231
-msgid ""
-"Please contact your hosting provider or site administrator if you have "
-"questions about these settings."
-msgstr ""
-"Bitte kontaktiere den Hosting Provider oder den Administrator der Seite, "
-"falls du Fragen zu diesen Einstellungen haben solltest."
+#: ../../mod/profile_photo.php:61 ../../mod/profile_photo.php:68
+#: ../../mod/profile_photo.php:75 ../../mod/profile_photo.php:258
+#, php-format
+msgid "Image size reduction [%s] failed."
+msgstr "Verkleinern der Bildgröße von [%s] ist gescheitert."
-#: ../../mod/install.php:232
+#: ../../mod/profile_photo.php:89
msgid ""
-"The database you specify below should already exist. If it does not, please "
-"create it before continuing."
-msgstr ""
-"Die Datenbank, die du unten angibst, sollte bereits existieren. Ist dies "
-"noch nicht der Fall, erzeuge sie bitte bevor du mit der Installation "
-"fortfährst."
-
-#: ../../mod/install.php:236
-msgid "Database Server Name"
-msgstr "Datenbank-Server"
-
-#: ../../mod/install.php:237
-msgid "Database Login Name"
-msgstr "Datenbank-Nutzer"
-
-#: ../../mod/install.php:238
-msgid "Database Login Password"
-msgstr "Datenbank-Passwort"
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
+msgstr "Drücke Umschalt+Neu Laden oder leere den Browser-Cache, falls das neue Foto nicht gleich angezeigt wird."
-#: ../../mod/install.php:239
-msgid "Database Name"
-msgstr "Datenbank-Name"
+#: ../../mod/profile_photo.php:99
+msgid "Unable to process image"
+msgstr "Bild konnte nicht verarbeitet werden"
-#: ../../mod/install.php:240 ../../mod/install.php:279
-msgid "Site administrator email address"
-msgstr "E-Mail-Adresse des Administrators"
+#: ../../mod/profile_photo.php:113 ../../mod/wall_upload.php:56
+#, php-format
+msgid "Image exceeds size limit of %d"
+msgstr "Bildgröße überschreitet das Limit von %d"
-#: ../../mod/install.php:240 ../../mod/install.php:279
-msgid ""
-"Your account email address must match this in order to use the web admin "
-"panel."
-msgstr ""
-"Die E-Mail-Adresse, die in deinem Friendica-Account eingetragen, muss mit "
-"dieser Adresse übereinstimmen, damit du das Admin-Panel benutzen kannst."
+#: ../../mod/profile_photo.php:203
+msgid "Upload File:"
+msgstr "Datei hochladen:"
-#: ../../mod/install.php:244 ../../mod/install.php:282
-msgid "Please select a default timezone for your website"
-msgstr "Bitte wähle die Standardzeitzone deiner Webseite"
+#: ../../mod/profile_photo.php:204
+msgid "Upload Profile Photo"
+msgstr "Profilbild hochladen"
-#: ../../mod/install.php:269
-msgid "Site settings"
-msgstr "Server-Einstellungen"
+#: ../../mod/profile_photo.php:205
+msgid "Upload"
+msgstr "Hochladen"
-#: ../../mod/install.php:322
-msgid "Could not find a command line version of PHP in the web server PATH."
-msgstr ""
-"Konnte keine Kommandozeilenversion von PHP im PATH des Servers finden."
+#: ../../mod/profile_photo.php:206
+msgid "skip this step"
+msgstr "diesen Schritt überspringen"
-#: ../../mod/install.php:325
-msgid "PHP executable path"
-msgstr "Pfad zu PHP"
+#: ../../mod/profile_photo.php:206
+msgid "select a photo from your photo albums"
+msgstr "wähle ein Foto von deinen Fotoalben"
-#: ../../mod/install.php:325
-msgid "Enter full path to php executable"
-msgstr "Kompletter Pfad zum PHP-Executable"
+#: ../../mod/profile_photo.php:219
+msgid "Crop Image"
+msgstr "Bild zurechtschneiden"
-#: ../../mod/install.php:330
-msgid "Command line PHP"
-msgstr "Kommadozeilen-PHP"
+#: ../../mod/profile_photo.php:220
+msgid "Please adjust the image cropping for optimum viewing."
+msgstr "Passe bitte den Bildausschnitt an, damit das Bild optimal dargestellt werden kann."
-#: ../../mod/install.php:339
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
-msgstr ""
-"Die Kommandozeilenversion von PHP auf deinem System hat "
-"\"register_argc_argv\" nicht aktiviert."
+#: ../../mod/profile_photo.php:221
+msgid "Done Editing"
+msgstr "Bearbeitung abgeschlossen"
-#: ../../mod/install.php:340
-msgid "This is required for message delivery to work."
-msgstr "Dies wird für die Auslieferung von Nachrichten benötigt."
+#: ../../mod/profile_photo.php:249
+msgid "Image uploaded successfully."
+msgstr "Bild erfolgreich auf den Server geladen."
-#: ../../mod/install.php:342
-msgid "PHP \"register_argc_argv\""
-msgstr "PHP \"register_argc_argv\""
+#: ../../mod/hcard.php:10
+msgid "No profile"
+msgstr "Kein Profil"
-#: ../../mod/install.php:363
-msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
-msgstr ""
-"Fehler: Die Funktion \"openssl_pkey_new\" auf diesem System ist nicht in der"
-" Lage, Verschlüsselungsschlüssel zu erzeugen"
+#: ../../mod/removeme.php:45 ../../mod/removeme.php:48
+msgid "Remove My Account"
+msgstr "Account löschen"
-#: ../../mod/install.php:364
+#: ../../mod/removeme.php:46
msgid ""
-"If running under Windows, please see "
-"\"http://www.php.net/manual/en/openssl.installation.php\"."
-msgstr ""
-"Wenn der Server unter Windows läuft, schau dir bitte "
-"\"http://www.php.net/manual/en/openssl.installation.php\" an."
-
-#: ../../mod/install.php:366
-msgid "Generate encryption keys"
-msgstr "Schlüssel erzeugen"
+"This will completely remove your account. Once this has been done it is not "
+"recoverable."
+msgstr "Dies wird deinen Account endgültig löschen. Es gibt keine Möglichkeit, ihn wiederherzustellen."
-#: ../../mod/install.php:373
-msgid "libCurl PHP module"
-msgstr "PHP: libCurl-Modul"
+#: ../../mod/removeme.php:47
+msgid "Please enter your password for verification:"
+msgstr "Bitte gib dein Passwort zur Verifikation ein:"
-#: ../../mod/install.php:374
-msgid "GD graphics PHP module"
-msgstr "PHP: GD-Grafikmodul"
+#: ../../mod/message.php:23
+msgid "No recipient selected."
+msgstr "Kein Empfänger gewählt."
-#: ../../mod/install.php:375
-msgid "OpenSSL PHP module"
-msgstr "PHP: OpenSSL-Modul"
+#: ../../mod/message.php:26
+msgid "Unable to locate contact information."
+msgstr "Konnte die Kontaktinformationen nicht finden."
-#: ../../mod/install.php:376
-msgid "mysqli PHP module"
-msgstr "PHP: mysqli-Modul"
+#: ../../mod/message.php:29
+msgid "Message could not be sent."
+msgstr "Nachricht konnte nicht gesendet werden."
-#: ../../mod/install.php:377
-msgid "mb_string PHP module"
-msgstr "PHP: mb_string-Modul"
+#: ../../mod/message.php:32
+msgid "Message collection failure."
+msgstr "Konnte Nachrichten nicht abrufen."
-#: ../../mod/install.php:382 ../../mod/install.php:384
-msgid "Apace mod_rewrite module"
-msgstr "Apache: mod_rewrite-Modul"
+#: ../../mod/message.php:35
+msgid "Message sent."
+msgstr "Nachricht gesendet."
-#: ../../mod/install.php:382
-msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
-msgstr ""
-"Fehler: Das Apache-Modul mod-rewrite wird benötigt, es ist allerdings nicht "
-"installiert."
+#: ../../mod/message.php:55
+msgid "Inbox"
+msgstr "Eingang"
-#: ../../mod/install.php:389
-msgid "Error: libCURL PHP module required but not installed."
-msgstr ""
-"Fehler: Das libCURL PHP Modul wird benötigt ist aber nicht installiert."
+#: ../../mod/message.php:60
+msgid "Outbox"
+msgstr "Ausgang"
-#: ../../mod/install.php:393
-msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
-msgstr ""
-"Fehler: Das GD-Graphikmodul für PHP mit JPEG-Unterstützung ist nicht "
-"installiert."
+#: ../../mod/message.php:65
+msgid "New Message"
+msgstr "Neue Nachricht"
-#: ../../mod/install.php:397
-msgid "Error: openssl PHP module required but not installed."
-msgstr "Fehler: Das openssl-Modul von PHP ist nicht installiert."
+#: ../../mod/message.php:91
+msgid "Message deleted."
+msgstr "Nachricht gelöscht."
-#: ../../mod/install.php:401
-msgid "Error: mysqli PHP module required but not installed."
-msgstr "Fehler: Das mysqli-Modul von PHP ist nicht installiert."
+#: ../../mod/message.php:121
+msgid "Conversation removed."
+msgstr "Unterhaltung gelöscht."
-#: ../../mod/install.php:405
-msgid "Error: mb_string PHP module required but not installed."
-msgstr ""
-"Fehler: mb_string PHP Module wird benötigt ist aber nicht installiert."
+#: ../../mod/message.php:137 ../../include/conversation.php:843
+msgid "Please enter a link URL:"
+msgstr "Bitte gib die URL des Links ein:"
-#: ../../mod/install.php:422
-msgid ""
-"The web installer needs to be able to create a file called \".htconfig.php\""
-" in the top folder of your web server and it is unable to do so."
-msgstr ""
-"Der Installationswizard muss in der Lage sein, eine Datei im "
-"Stammverzeichnis deines Webservers anzulegen, ist allerdings derzeit nicht "
-"in der Lage, dies zu tun."
+#: ../../mod/message.php:145
+msgid "Send Private Message"
+msgstr "Private Nachricht senden"
-#: ../../mod/install.php:423
-msgid ""
-"This is most often a permission setting, as the web server may not be able "
-"to write files in your folder - even if you can."
-msgstr ""
-"In den meisten Fällen ist dies ein Problem mit den Schreibrechten, der "
-"Webserver könnte keine Schreiberlaubnis haben, selbst wenn du sie hast."
+#: ../../mod/message.php:146 ../../mod/message.php:287
+msgid "To:"
+msgstr "An:"
-#: ../../mod/install.php:424
-msgid ""
-"Please check with your site documentation or support people to see if this "
-"situation can be corrected."
-msgstr ""
-"Bitte überprüfe die Einstellungen und frage im Zweifelsfall dein Support "
-"Team, um diese Situation zu beheben."
+#: ../../mod/message.php:147 ../../mod/message.php:288
+msgid "Subject:"
+msgstr "Betreff:"
-#: ../../mod/install.php:425
-msgid ""
-"If not, you may be required to perform a manual installation. Please see the"
-" file \"INSTALL.txt\" for instructions."
-msgstr ""
-"Sollte dies nicht möglich sein, musst du die Installation manuell "
-"durchführen. Lies dazu bitte in der Datei \"INSTALL.txt\"."
+#: ../../mod/message.php:150 ../../mod/message.php:291
+#: ../../mod/invite.php:101
+msgid "Your message:"
+msgstr "Deine Nachricht:"
-#: ../../mod/install.php:428
-msgid ".htconfig.php is writable"
-msgstr "Schreibrechte auf .htconfig.php"
+#: ../../mod/message.php:188
+msgid "No messages."
+msgstr "Keine Nachrichten."
-#: ../../mod/install.php:435
-msgid ""
-"The database configuration file \".htconfig.php\" could not be written. "
-"Please use the enclosed text to create a configuration file in your web "
-"server root."
-msgstr ""
-"Die Konfigurationsdatei \".htconfig.php\" konnte nicht angelegt werden. "
-"Bitte verwende den angefügten Text um die Datei im Stammverzeichnis deiner "
-"Friendica-Installation zu erzeugen."
+#: ../../mod/message.php:201
+msgid "Delete conversation"
+msgstr "Unterhaltung löschen"
-#: ../../mod/install.php:460
-msgid "Errors encountered creating database tables."
-msgstr "Fehler aufgetreten während der Erzeugung der Datenbanktabellen."
+#: ../../mod/message.php:204
+msgid "D, d M Y - g:i A"
+msgstr "D, d. M Y - g:i A"
-#: ../../mod/community.php:21
-msgid "Not available."
-msgstr "Nicht verfügbar."
+#: ../../mod/message.php:239
+msgid "Message not available."
+msgstr "Nachricht nicht verfügbar."
-#: ../../mod/community.php:30 ../../include/nav.php:97
-msgid "Community"
-msgstr "Gemeinschaft"
+#: ../../mod/message.php:276
+msgid "Delete message"
+msgstr "Nachricht löschen"
-#: ../../mod/community.php:60 ../../mod/search.php:118
-msgid "No results."
-msgstr "Keine Ergebnisse."
+#: ../../mod/message.php:286
+msgid "Send Reply"
+msgstr "Antwort senden"
-#: ../../mod/community.php:87
-msgid ""
-"Shared content is covered by the <a "
-"href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons "
-"Attribution 3.0</a> license."
-msgstr ""
-"Geteilte Inhalte innerhalb des Friendica-Netzwerks sind unter der <a "
-"href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons "
-"Attribution 3.0</a> verfügbar."
+#: ../../mod/allfriends.php:34
+#, php-format
+msgid "Friends of %s"
+msgstr "Freunde von %s"
-#: ../../mod/oexchange.php:27
-msgid "Post successful."
-msgstr "Beitrag erfolgreich veröffentlicht."
+#: ../../mod/allfriends.php:40
+msgid "No friends to display."
+msgstr "Keine Freunde zum Anzeigen."
#: ../../mod/admin.php:59 ../../mod/admin.php:295
msgid "Site"
@@ -2794,7 +2795,7 @@ msgstr "Regeln"
msgid "Advanced"
msgstr "Erweitert"
-#: ../../mod/admin.php:304 ../../addon/statusnet/statusnet.php:477
+#: ../../mod/admin.php:304 ../../addon/statusnet/statusnet.php:486
msgid "Site name"
msgstr "Seitenname"
@@ -2830,9 +2831,7 @@ msgstr "Accounts gelten nach x Tagen als unbenutzt"
msgid ""
"Will not waste system resources polling external sites for abandonded "
"accounts. Enter 0 for no time limit."
-msgstr ""
-"Verschwende keine System-Ressourcen fürs Pollen externer Seiten, wenn "
-"Accounts nicht mehr benutzt werden. 0 eingeben für kein Limit."
+msgstr "Verschwende keine System-Ressourcen fürs Pollen externer Seiten, wenn Accounts nicht mehr benutzt werden. 0 eingeben für kein Limit."
#: ../../mod/admin.php:314
msgid "Allowed friend domains"
@@ -2980,18 +2979,13 @@ msgstr "Nutzerkonto"
msgid ""
"Selected users will be deleted!\\n\\nEverything these users had posted on "
"this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr ""
-"Die markierten Nutzer werden gelöscht!\\n\\nAlle Beiträge, die diese Nutzer "
-"auf dieser Seite veröffentlicht haben, werden permanent gelöscht!\\n\\nBist "
-"du sicher?"
+msgstr "Die markierten Nutzer werden gelöscht!\\n\\nAlle Beiträge, die diese Nutzer auf dieser Seite veröffentlicht haben, werden permanent gelöscht!\\n\\nBist du sicher?"
#: ../../mod/admin.php:476
msgid ""
"The user {0} will be deleted!\\n\\nEverything this user has posted on this "
"site will be permanently deleted!\\n\\nAre you sure?"
-msgstr ""
-"Der Nutzer {0} wird gelöscht!\\n\\nAlles was dieser Nutzer auf dieser Seite "
-"veröffentlicht hat, wird permanent gelöscht!\\n\\nBist du sicher?"
+msgstr "Der Nutzer {0} wird gelöscht!\\n\\nAlles was dieser Nutzer auf dieser Seite veröffentlicht hat, wird permanent gelöscht!\\n\\nBist du sicher?"
#: ../../mod/admin.php:512
#, php-format
@@ -3015,7 +3009,7 @@ msgstr "Einschalten"
msgid "Toggle"
msgstr "Umschalten"
-#: ../../mod/admin.php:551 ../../include/nav.php:128
+#: ../../mod/admin.php:551 ../../include/nav.php:129
msgid "Settings"
msgstr "Einstellungen"
@@ -3039,9 +3033,7 @@ msgstr "Protokolldatei"
msgid ""
"Must be writable by web server. Relative to your Friendica top-level "
"directory."
-msgstr ""
-"Webserver muss Schreibrechte besitzen. Relativ zum Friendica-"
-"Installationsverzeichnis."
+msgstr "Webserver muss Schreibrechte besitzen. Relativ zum Friendica-Installationsverzeichnis."
#: ../../mod/admin.php:661
msgid "Log level"
@@ -3067,6 +3059,393 @@ msgstr "FTP Nutzername"
msgid "FTP Password"
msgstr "FTP Passwort"
+#: ../../mod/profile.php:15 ../../boot.php:841
+msgid "Requested profile is not available."
+msgstr "Profil nicht vorhanden."
+
+#: ../../mod/profile.php:111 ../../mod/display.php:66
+msgid "Access to this profile has been restricted."
+msgstr "Der Zugriff zu diesem Profil wurde eingeschränkt."
+
+#: ../../mod/profile.php:131
+msgid "Tips for New Members"
+msgstr "Tipps für neue Nutzer"
+
+#: ../../mod/ping.php:148
+msgid "{0} wants to be your friend"
+msgstr "{0} möchte mit dir in Kontakt treten"
+
+#: ../../mod/ping.php:153
+msgid "{0} sent you a message"
+msgstr "{0} hat dir eine Nachricht geschickt"
+
+#: ../../mod/ping.php:158
+msgid "{0} requested registration"
+msgstr "{0} möchte sich registrieren"
+
+#: ../../mod/ping.php:164
+#, php-format
+msgid "{0} commented %s's post"
+msgstr "{0} kommentierte einen Beitrag von %s"
+
+#: ../../mod/ping.php:169
+#, php-format
+msgid "{0} liked %s's post"
+msgstr "{0} mag %ss Beitrag"
+
+#: ../../mod/ping.php:174
+#, php-format
+msgid "{0} disliked %s's post"
+msgstr "{0} mag %ss Beitrag nicht"
+
+#: ../../mod/ping.php:179
+#, php-format
+msgid "{0} is now friends with %s"
+msgstr "{0} ist jetzt mit %s befreundet"
+
+#: ../../mod/ping.php:184
+msgid "{0} posted"
+msgstr "{0} hat etwas veröffentlicht"
+
+#: ../../mod/ping.php:189
+#, php-format
+msgid "{0} tagged %s's post with #%s"
+msgstr "{0} hat %ss Beitrag mit dem Schlagwort #%s versehen"
+
+#: ../../mod/ping.php:195
+msgid "{0} mentioned you in a post"
+msgstr "{0} hat dich in einem Beitrag erwähnt"
+
+#: ../../mod/openid.php:63 ../../mod/openid.php:77 ../../include/auth.php:90
+#: ../../include/auth.php:115 ../../include/auth.php:169
+msgid "Login failed."
+msgstr "Annmeldung fehlgeschlagen."
+
+#: ../../mod/follow.php:27
+msgid "Connect URL missing."
+msgstr "Connect-URL fehlt"
+
+#: ../../mod/follow.php:47
+msgid ""
+"This site is not configured to allow communications with other networks."
+msgstr "Diese Seite ist so konfiguriert, dass keine Kommunikation mit anderen Netzwerken erfolgen kann."
+
+#: ../../mod/follow.php:48 ../../mod/follow.php:58
+msgid "No compatible communication protocols or feeds were discovered."
+msgstr "Es wurden keine kompatiblen Kommunikationsprotokolle oder Feeds gefunden."
+
+#: ../../mod/follow.php:56
+msgid "The profile address specified does not provide adequate information."
+msgstr "Die angegebene Profiladresse liefert unzureichende Informationen."
+
+#: ../../mod/follow.php:60
+msgid "An author or name was not found."
+msgstr "Es wurde kein Autor oder Name gefunden."
+
+#: ../../mod/follow.php:62
+msgid "No browser URL could be matched to this address."
+msgstr "Zu dieser Adresse konnte keine passende Browser URL gefunden werden."
+
+#: ../../mod/follow.php:69
+msgid ""
+"The profile address specified belongs to a network which has been disabled "
+"on this site."
+msgstr "Die Adresse dieses Profils gehört zu einem Netzwerk mit dem die Kommunikation auf dieser Seite ausgeschaltet wurde."
+
+#: ../../mod/follow.php:74
+msgid ""
+"Limited profile. This person will be unable to receive direct/personal "
+"notifications from you."
+msgstr "Eingeschränktes Profil. Diese Person wird keine direkten/privaten Nachrichten von dir erhalten können."
+
+#: ../../mod/follow.php:144
+msgid "Unable to retrieve contact information."
+msgstr "Konnte die Kontaktinformationen nicht empfangen."
+
+#: ../../mod/follow.php:190
+msgid "following"
+msgstr "folgen"
+
+#: ../../mod/common.php:34
+msgid "Common Friends"
+msgstr "Gemeinsame Freunde"
+
+#: ../../mod/common.php:42
+msgid "No friends in common."
+msgstr "Keine gemeinsamen Freunde."
+
+#: ../../mod/display.php:109
+msgid "Item has been removed."
+msgstr "Eintrag wurde entfernt."
+
+#: ../../mod/apps.php:4
+msgid "Applications"
+msgstr "Anwendungen"
+
+#: ../../mod/apps.php:7
+msgid "No installed applications."
+msgstr "Keine Applikationen installiert."
+
+#: ../../mod/search.php:83
+msgid "Search This Site"
+msgstr "Diese Seite durchsuchen"
+
+#: ../../mod/profiles.php:21 ../../mod/profiles.php:239
+#: ../../mod/profiles.php:344 ../../mod/dfrn_confirm.php:62
+msgid "Profile not found."
+msgstr "Profil nicht gefunden."
+
+#: ../../mod/profiles.php:28
+msgid "Profile Name is required."
+msgstr "Profilname ist erforderlich."
+
+#: ../../mod/profiles.php:198
+msgid "Profile updated."
+msgstr "Profil aktualisiert."
+
+#: ../../mod/profiles.php:256
+msgid "Profile deleted."
+msgstr "Profil gelöscht."
+
+#: ../../mod/profiles.php:272 ../../mod/profiles.php:303
+msgid "Profile-"
+msgstr "Profil-"
+
+#: ../../mod/profiles.php:291 ../../mod/profiles.php:330
+msgid "New profile created."
+msgstr "Neues Profil angelegt."
+
+#: ../../mod/profiles.php:309
+msgid "Profile unavailable to clone."
+msgstr "Profil nicht zum Duplizieren verfügbar."
+
+#: ../../mod/profiles.php:356
+msgid "Hide your contact/friend list from viewers of this profile?"
+msgstr "Liste der Kontakte vor Betrachtern dieses Profils verbergen?"
+
+#: ../../mod/profiles.php:374
+msgid "Edit Profile Details"
+msgstr "Profil bearbeiten"
+
+#: ../../mod/profiles.php:376
+msgid "View this profile"
+msgstr "Dieses Profil anzeigen"
+
+#: ../../mod/profiles.php:377
+msgid "Create a new profile using these settings"
+msgstr "Neues Profil anlegen und diese Einstellungen verwenden"
+
+#: ../../mod/profiles.php:378
+msgid "Clone this profile"
+msgstr "Dieses Profil duplizieren"
+
+#: ../../mod/profiles.php:379
+msgid "Delete this profile"
+msgstr "Dieses Profil löschen"
+
+#: ../../mod/profiles.php:380
+msgid "Profile Name:"
+msgstr "Profilname:"
+
+#: ../../mod/profiles.php:381
+msgid "Your Full Name:"
+msgstr "Dein kompletter Name:"
+
+#: ../../mod/profiles.php:382
+msgid "Title/Description:"
+msgstr "Titel/Beschreibung:"
+
+#: ../../mod/profiles.php:383
+msgid "Your Gender:"
+msgstr "Dein Geschlecht:"
+
+#: ../../mod/profiles.php:384
+#, php-format
+msgid "Birthday (%s):"
+msgstr "Geburtstag (%s):"
+
+#: ../../mod/profiles.php:385
+msgid "Street Address:"
+msgstr "Adresse:"
+
+#: ../../mod/profiles.php:386
+msgid "Locality/City:"
+msgstr "Wohnort/Stadt:"
+
+#: ../../mod/profiles.php:387
+msgid "Postal/Zip Code:"
+msgstr "Postleitzahl:"
+
+#: ../../mod/profiles.php:388
+msgid "Country:"
+msgstr "Land:"
+
+#: ../../mod/profiles.php:389
+msgid "Region/State:"
+msgstr "Region/Bundesstaat:"
+
+#: ../../mod/profiles.php:390
+msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
+msgstr "<span class=\"heart\">&hearts;</span> Beziehungsstatus:"
+
+#: ../../mod/profiles.php:391
+msgid "Who: (if applicable)"
+msgstr "Wer: (falls anwendbar)"
+
+#: ../../mod/profiles.php:392
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+msgstr "Beispiele: cathy123, Cathy Williams, cathy@example.com"
+
+#: ../../mod/profiles.php:393 ../../include/profile_advanced.php:43
+msgid "Sexual Preference:"
+msgstr "Sexuelle Vorlieben:"
+
+#: ../../mod/profiles.php:394
+msgid "Homepage URL:"
+msgstr "Adresse der Homepage:"
+
+#: ../../mod/profiles.php:395 ../../include/profile_advanced.php:49
+msgid "Political Views:"
+msgstr "Politische Ansichten:"
+
+#: ../../mod/profiles.php:396
+msgid "Religious Views:"
+msgstr "Religiöse Ansichten:"
+
+#: ../../mod/profiles.php:397
+msgid "Public Keywords:"
+msgstr "Öffentliche Schlüsselwörter:"
+
+#: ../../mod/profiles.php:398
+msgid "Private Keywords:"
+msgstr "Private Schlüsselwörter:"
+
+#: ../../mod/profiles.php:399
+msgid "Example: fishing photography software"
+msgstr "Beispiel: Fischen Fotografie Software"
+
+#: ../../mod/profiles.php:400
+msgid "(Used for suggesting potential friends, can be seen by others)"
+msgstr "(Wird verwendet um potentielle Freunde zu finden, könnte von Fremden eingesehen werden)"
+
+#: ../../mod/profiles.php:401
+msgid "(Used for searching profiles, never shown to others)"
+msgstr "(Wird für die Suche nach Profilen verwendet und niemals veröffentlicht)"
+
+#: ../../mod/profiles.php:402
+msgid "Tell us about yourself..."
+msgstr "Erzähle uns ein bisschen von dir …"
+
+#: ../../mod/profiles.php:403
+msgid "Hobbies/Interests"
+msgstr "Hobbies/Interessen"
+
+#: ../../mod/profiles.php:404
+msgid "Contact information and Social Networks"
+msgstr "Kontaktinformationen und Soziale Netzwerke"
+
+#: ../../mod/profiles.php:405
+msgid "Musical interests"
+msgstr "Musikalische Interessen"
+
+#: ../../mod/profiles.php:406
+msgid "Books, literature"
+msgstr "Literatur/Bücher"
+
+#: ../../mod/profiles.php:407
+msgid "Television"
+msgstr "Fernsehen"
+
+#: ../../mod/profiles.php:408
+msgid "Film/dance/culture/entertainment"
+msgstr "Filme/Tänze/Kultur/Unterhaltung"
+
+#: ../../mod/profiles.php:409
+msgid "Love/romance"
+msgstr "Liebesleben"
+
+#: ../../mod/profiles.php:410
+msgid "Work/employment"
+msgstr "Arbeit/Beschäftigung"
+
+#: ../../mod/profiles.php:411
+msgid "School/education"
+msgstr "Schule/Ausbildung"
+
+#: ../../mod/profiles.php:416
+msgid ""
+"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
+"be visible to anybody using the internet."
+msgstr "Dies ist dein <strong>öffentliches</strong> Profil.<br />Es <strong>könnte</strong> für jeden Nutzer des Internets sichtbar sein."
+
+#: ../../mod/profiles.php:426 ../../mod/directory.php:122
+msgid "Age: "
+msgstr "Alter: "
+
+#: ../../mod/profiles.php:461
+msgid "Edit/Manage Profiles"
+msgstr "Verwalte/Editiere Profile"
+
+#: ../../mod/profiles.php:462 ../../boot.php:942
+msgid "Change profile photo"
+msgstr "Profilbild ändern"
+
+#: ../../mod/profiles.php:463 ../../boot.php:943
+msgid "Create New Profile"
+msgstr "Neues Profil anlegen"
+
+#: ../../mod/profiles.php:473 ../../boot.php:953
+msgid "Profile Image"
+msgstr "Profilbild"
+
+#: ../../mod/profiles.php:475 ../../boot.php:956
+msgid "visible to everybody"
+msgstr "sichtbar für jeden"
+
+#: ../../mod/profiles.php:476 ../../boot.php:957
+msgid "Edit visibility"
+msgstr "Sichtbarkeit bearbeiten"
+
+#: ../../mod/tagger.php:103 ../../include/conversation.php:116
+#, php-format
+msgid "%1$s tagged %2$s's %3$s with %4$s"
+msgstr "%1$s hat %2$ss %3$s mit %4$s getaggt"
+
+#: ../../mod/delegate.php:95
+msgid "No potential page delegates located."
+msgstr "Keine potentiellen Bevollmächtigte für die Seite gefunden."
+
+#: ../../mod/delegate.php:121
+msgid "Delegate Page Management"
+msgstr "Delegiere das Management für die Seite"
+
+#: ../../mod/delegate.php:123
+msgid ""
+"Delegates are able to manage all aspects of this account/page except for "
+"basic account settings. Please do not delegate your personal account to "
+"anybody that you do not trust completely."
+msgstr "Bevollmächtigte sind in der Lage alle Aspekte dieses Accounts/dieser Seite zu verwalten, abgesehen von den Grundeinstellungen des Accounts. Bitte gib Niemandem eine Bevollmächtigung für deinen privaten Account dem du nicht absolut vertraust."
+
+#: ../../mod/delegate.php:124
+msgid "Existing Page Managers"
+msgstr "Vorhandene Seiten Manager"
+
+#: ../../mod/delegate.php:126
+msgid "Existing Page Delegates"
+msgstr "Vorhandene Bevollmächtigte für die Seite"
+
+#: ../../mod/delegate.php:128
+msgid "Potential Delegates"
+msgstr "Potentielle Bevollmächtigte"
+
+#: ../../mod/delegate.php:131
+msgid "Add"
+msgstr "Hinzufügen"
+
+#: ../../mod/delegate.php:132
+msgid "No entries."
+msgstr "Keine Einträge"
+
#: ../../mod/suggest.php:38 ../../include/contact_widgets.php:35
msgid "Friend Suggestions"
msgstr "Kontaktvorschläge"
@@ -3075,1051 +3454,948 @@ msgstr "Kontaktvorschläge"
msgid ""
"No suggestions available. If this is a new site, please try again in 24 "
"hours."
-msgstr ""
-"Keine Vorschläge. Falls der Server frisch aufgesetzt wurde, versuche es "
-"bitte in 24 Stunden noch einmal."
-
-#: ../../mod/suggest.php:59 ../../mod/match.php:58
-#: ../../include/contact_widgets.php:9 ../../boot.php:911
-msgid "Connect"
-msgstr "Verbinden"
+msgstr "Keine Vorschläge. Falls der Server frisch aufgesetzt wurde, versuche es bitte in 24 Stunden noch einmal."
#: ../../mod/suggest.php:61
msgid "Ignore/Hide"
msgstr "Ignorieren/Verbergen"
-#: ../../mod/display.php:66 ../../mod/profile.php:111
-msgid "Access to this profile has been restricted."
-msgstr "Der Zugriff zu diesem Profil wurde eingeschränkt."
+#: ../../mod/directory.php:49
+msgid "Global Directory"
+msgstr "Weltweites Verzeichnis"
-#: ../../mod/display.php:108
-msgid "Item has been removed."
-msgstr "Eintrag wurde entfernt."
+#: ../../mod/directory.php:55
+msgid "Normal site view"
+msgstr "Normale Seitenansicht"
-#: ../../mod/like.php:144 ../../include/conversation.php:43
-#: ../../include/diaspora.php:1570 ../../addon/facebook/facebook.php:1088
-#: ../../addon/communityhome/communityhome.php:172
+#: ../../mod/directory.php:57
+msgid "Admin - View all site entries"
+msgstr "Admin: Alle Einträge dieses Servers anzeigen"
+
+#: ../../mod/directory.php:63
+msgid "Find on this site"
+msgstr "Auf diesem Server suchen"
+
+#: ../../mod/directory.php:66
+msgid "Site Directory"
+msgstr "Verzeichnis"
+
+#: ../../mod/directory.php:125
+msgid "Gender: "
+msgstr "Geschlecht:"
+
+#: ../../mod/directory.php:151
+msgid "No entries (some entries may be hidden)."
+msgstr "Keine Einträge (einige Einträge könnten versteckt sein)."
+
+#: ../../mod/invite.php:35
#, php-format
-msgid "%1$s likes %2$s's %3$s"
-msgstr "%1$s mag %2$ss %3$s"
+msgid "%s : Not a valid email address."
+msgstr "%s: Keine gültige Email Adresse."
-#: ../../mod/like.php:146 ../../include/conversation.php:46
+#: ../../mod/invite.php:59
#, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
-msgstr "%1$s mag %2$ss %3$s nicht"
+msgid "Please join my network on %s"
+msgstr "Bitte trete meinem Netzwerk auf %s bei"
-#: ../../mod/match.php:12
-msgid "Profile Match"
-msgstr "Profilübereinstimmungen"
+#: ../../mod/invite.php:69
+#, php-format
+msgid "%s : Message delivery failed."
+msgstr "%s: Zustellung der Nachricht fehlgeschlagen."
-#: ../../mod/match.php:20
-msgid "No keywords to match. Please add keywords to your default profile."
-msgstr ""
-"Keine Schlüsselwörter zum Abgleichen gefunden. Bitte füge einige "
-"Schlüsselwörter zu deinem Standardprofil hinzu."
+#: ../../mod/invite.php:73
+#, php-format
+msgid "%d message sent."
+msgid_plural "%d messages sent."
+msgstr[0] "%d Nachricht gesendet."
+msgstr[1] "%d Nachrichten gesendet."
-#: ../../mod/match.php:57
-msgid "is interested in:"
-msgstr "ist interessiert an:"
+#: ../../mod/invite.php:92
+msgid "You have no more invitations available"
+msgstr "Du hast keine weiteren Einladungen"
-#: ../../mod/notes.php:44 ../../boot.php:1335
-msgid "Personal Notes"
-msgstr "Persönliche Notizen"
+#: ../../mod/invite.php:99
+msgid "Send invitations"
+msgstr "Einladungen senden"
-#: ../../mod/notes.php:63 ../../include/text.php:635
-msgid "Save"
-msgstr "Speichern"
+#: ../../mod/invite.php:100
+msgid "Enter email addresses, one per line:"
+msgstr "E-Mail-Adressen eingeben, eine pro Zeile:"
-#: ../../mod/help.php:30
-msgid "Help:"
-msgstr "Hilfe:"
+#: ../../mod/invite.php:102
+#, php-format
+msgid "Please join my social network on %s"
+msgstr "Bitte trete meinem Sozialen Netzwerk auf %s bei"
-#: ../../mod/help.php:34 ../../include/nav.php:82
-msgid "Help"
-msgstr "Hilfe"
+#: ../../mod/invite.php:103
+msgid "To accept this invitation, please visit:"
+msgstr "Um diese Einladung anzunehmen besuche bitte:"
-#: ../../mod/help.php:38 ../../index.php:221
-msgid "Not Found"
-msgstr "Nicht gefunden"
+#: ../../mod/invite.php:104
+msgid "You will need to supply this invitation code: $invite_code"
+msgstr "Du benötigst den folgenden Einladungs Code: $invite_code"
-#: ../../mod/help.php:41 ../../index.php:224
-msgid "Page not found."
-msgstr "Seite nicht gefunden."
+#: ../../mod/invite.php:104
+msgid ""
+"Once you have registered, please connect with me via my profile page at:"
+msgstr "Sobald du registriert bist, kontaktiere mich bitte auf meiner Profilseite:"
-#: ../../mod/dfrn_confirm.php:236
+#: ../../mod/dfrn_confirm.php:238
msgid "Response from remote site was not understood."
msgstr "Antwort der entfernten Gegenstelle unverständlich."
-#: ../../mod/dfrn_confirm.php:245
+#: ../../mod/dfrn_confirm.php:247
msgid "Unexpected response from remote site: "
msgstr "Unerwartete Antwort der Gegenstelle: "
-#: ../../mod/dfrn_confirm.php:253
+#: ../../mod/dfrn_confirm.php:255
msgid "Confirmation completed successfully."
msgstr "Bestätigung erfolgreich abgeschlossen."
-#: ../../mod/dfrn_confirm.php:255 ../../mod/dfrn_confirm.php:269
-#: ../../mod/dfrn_confirm.php:276
+#: ../../mod/dfrn_confirm.php:257 ../../mod/dfrn_confirm.php:271
+#: ../../mod/dfrn_confirm.php:278
msgid "Remote site reported: "
msgstr "Entfernte Seite meldet: "
-#: ../../mod/dfrn_confirm.php:267
+#: ../../mod/dfrn_confirm.php:269
msgid "Temporary failure. Please wait and try again."
-msgstr ""
-"Zeitweiser Fehler. Bitte warte einige Momente und versuche es dann noch "
-"einmal."
+msgstr "Zeitweiser Fehler. Bitte warte einige Momente und versuche es dann noch einmal."
-#: ../../mod/dfrn_confirm.php:274
+#: ../../mod/dfrn_confirm.php:276
msgid "Introduction failed or was revoked."
msgstr "Kontaktanfrage schlug fehl oder wurde zurück gezogen."
-#: ../../mod/dfrn_confirm.php:416
+#: ../../mod/dfrn_confirm.php:421
msgid "Unable to set contact photo."
msgstr "Konnte das Bild des Kontakts nicht speichern."
-#: ../../mod/dfrn_confirm.php:466 ../../include/conversation.php:79
-#: ../../include/diaspora.php:495
+#: ../../mod/dfrn_confirm.php:473 ../../include/diaspora.php:495
+#: ../../include/conversation.php:79
#, php-format
msgid "%1$s is now friends with %2$s"
msgstr "%1$s ist nun mit %2$s befreundet"
-#: ../../mod/dfrn_confirm.php:537
+#: ../../mod/dfrn_confirm.php:543
#, php-format
msgid "No user record found for '%s' "
msgstr "Für '%s' wurde kein Nutzer gefunden"
-#: ../../mod/dfrn_confirm.php:547
+#: ../../mod/dfrn_confirm.php:553
msgid "Our site encryption key is apparently messed up."
msgstr "Der Verschlüsselungsschlüssel unserer Seite ist anscheinend im Arsch."
-#: ../../mod/dfrn_confirm.php:558
+#: ../../mod/dfrn_confirm.php:564
msgid "Empty site URL was provided or URL could not be decrypted by us."
-msgstr ""
-"Leere URL für die Seite erhalten oder die URL konnte nicht entschlüsselt "
-"werden."
+msgstr "Leere URL für die Seite erhalten oder die URL konnte nicht entschlüsselt werden."
-#: ../../mod/dfrn_confirm.php:579
+#: ../../mod/dfrn_confirm.php:585
msgid "Contact record was not found for you on our site."
msgstr "Für diesen Kontakt wurde auf unserer Seite kein Eintrag gefunden."
-#: ../../mod/dfrn_confirm.php:593
+#: ../../mod/dfrn_confirm.php:599
#, php-format
msgid "Site public key not available in contact record for URL %s."
-msgstr ""
-"Die Kontaktdaten für URL %s enthalten keinen Public Key für den Server."
+msgstr "Die Kontaktdaten für URL %s enthalten keinen Public Key für den Server."
-#: ../../mod/dfrn_confirm.php:613
+#: ../../mod/dfrn_confirm.php:619
msgid ""
"The ID provided by your system is a duplicate on our system. It should work "
"if you try again."
-msgstr ""
-"Die ID die uns dein System angeboten hat ist hier bereits vergeben. Bitte "
-"versuche es noch einmal."
+msgstr "Die ID die uns dein System angeboten hat ist hier bereits vergeben. Bitte versuche es noch einmal."
-#: ../../mod/dfrn_confirm.php:624
+#: ../../mod/dfrn_confirm.php:630
msgid "Unable to set your contact credentials on our system."
-msgstr ""
-"Deine Kontaktreferenzen konnten nicht in unserem System gespeichert werden."
+msgstr "Deine Kontaktreferenzen konnten nicht in unserem System gespeichert werden."
-#: ../../mod/dfrn_confirm.php:678
+#: ../../mod/dfrn_confirm.php:684
msgid "Unable to update your contact profile details on our system"
msgstr "Die Updates für dein Profil konnten nicht gespeichert werden"
-#: ../../mod/dfrn_confirm.php:708
+#: ../../mod/dfrn_confirm.php:714
#, php-format
msgid "Connection accepted at %s"
msgstr "Auf %s wurde die Verbindung akzeptiert"
-#: ../../mod/profile.php:15 ../../boot.php:836
-msgid "Requested profile is not available."
-msgstr "Profil nicht vorhanden."
-
-#: ../../mod/profile.php:131
-msgid "Tips for New Members"
-msgstr "Tipps für neue Nutzer"
+#: ../../addon/facebook/facebook.php:337
+msgid "Facebook disabled"
+msgstr "Facebook deaktiviert"
-#: ../../mod/item.php:89
-msgid "Unable to locate original post."
-msgstr "Konnte den Originalbeitrag nicht finden."
+#: ../../addon/facebook/facebook.php:342
+msgid "Updating contacts"
+msgstr "Aktualisiere Kontakte"
-#: ../../mod/item.php:206
-msgid "Empty post discarded."
-msgstr "Leerer Beitrag wurde verworfen."
+#: ../../addon/facebook/facebook.php:351
+msgid "Facebook API key is missing."
+msgstr "Facebook-API-Schlüssel nicht gefunden"
-#: ../../mod/item.php:778
-msgid "System error. Post not saved."
-msgstr "Systemfehler. Beitrag konnte nicht gespeichert werden."
+#: ../../addon/facebook/facebook.php:358
+msgid "Facebook Connect"
+msgstr "Mit Facebook verbinden"
-#: ../../mod/item.php:803
-#, php-format
-msgid ""
-"This message was sent to you by %s, a member of the Friendica social "
-"network."
-msgstr ""
-"Diese Nachricht wurde dir von %s geschickt, einem Mitglied des Sozialen "
-"Netzwerks Friendica."
+#: ../../addon/facebook/facebook.php:364
+msgid "Install Facebook connector for this account."
+msgstr "Facebook-Connector für diesen Account installieren."
-#: ../../mod/item.php:805
-#, php-format
-msgid "You may visit them online at %s"
-msgstr "Du kannst sie online unter %s besuchen"
+#: ../../addon/facebook/facebook.php:371
+msgid "Remove Facebook connector"
+msgstr "Facebook-Connector entfernen"
-#: ../../mod/item.php:806
+#: ../../addon/facebook/facebook.php:376
msgid ""
-"Please contact the sender by replying to this post if you do not wish to "
-"receive these messages."
-msgstr ""
-"Falls du diese Beiträge nicht erhalten möchtest, kontaktiere bitte den "
-"Autor, indem du auf diese Nachricht antwortest."
-
-#: ../../mod/item.php:808
-#, php-format
-msgid "%s posted an update."
-msgstr "%s hat ein Update veröffentlicht."
-
-#: ../../mod/search.php:13 ../../mod/network.php:84
-msgid "Saved Searches"
-msgstr "Gespeicherte Suchen"
-
-#: ../../mod/search.php:16 ../../mod/network.php:75
-msgid "Remove term"
-msgstr "Begriff entfernen"
-
-#: ../../mod/search.php:83
-msgid "Search This Site"
-msgstr "Diese Seite durchsuchen"
-
-#: ../../mod/photos.php:42
-msgid "Photo Albums"
-msgstr "Fotoalben"
-
-#: ../../mod/photos.php:50 ../../mod/photos.php:146 ../../mod/photos.php:868
-#: ../../mod/photos.php:938 ../../mod/photos.php:953 ../../mod/photos.php:1354
-#: ../../mod/photos.php:1366 ../../addon/communityhome/communityhome.php:110
-msgid "Contact Photos"
-msgstr "Kontaktbilder"
-
-#: ../../mod/photos.php:135
-msgid "Contact information unavailable"
-msgstr "Kontaktinformationen nicht verfügbar"
-
-#: ../../mod/photos.php:156
-msgid "Album not found."
-msgstr "Album nicht gefunden."
-
-#: ../../mod/photos.php:174 ../../mod/photos.php:947
-msgid "Delete Album"
-msgstr "Album löschen"
-
-#: ../../mod/photos.php:237 ../../mod/photos.php:1166
-msgid "Delete Photo"
-msgstr "Foto löschen"
+"Re-authenticate [This is necessary whenever your Facebook password is "
+"changed.]"
+msgstr "Neu authentifizieren [Das ist immer dann nötig, wenn Du Dein Facebook-Passwort geändert hast.]"
-#: ../../mod/photos.php:524
-msgid "was tagged in a"
-msgstr "wurde getaggt in einem"
+#: ../../addon/facebook/facebook.php:383
+msgid "Post to Facebook by default"
+msgstr "Veröffentliche standardmäßig bei Facebook"
-#: ../../mod/photos.php:524
-msgid "by"
-msgstr "von"
+#: ../../addon/facebook/facebook.php:387
+msgid "Link all your Facebook friends and conversations on this website"
+msgstr "All meine Facebook-Kontakte und -Konversationen hier auf diese Website importieren"
-#: ../../mod/photos.php:627 ../../addon/js_upload/js_upload.php:312
-msgid "Image exceeds size limit of "
-msgstr "Die Bildgröße übersteigt das Limit von "
+#: ../../addon/facebook/facebook.php:389
+msgid ""
+"Facebook conversations consist of your <em>profile wall</em> and your friend"
+" <em>stream</em>."
+msgstr "Facebook-Konversationen sind alles, was auf deiner <em>Pinnwand</em> erscheint, und die Beiträge deiner Freunde <em>(Stream).</em>"
-#: ../../mod/photos.php:635
-msgid "Image file is empty."
-msgstr "Bilddatei ist leer."
+#: ../../addon/facebook/facebook.php:390
+msgid "On this website, your Facebook friend stream is only visible to you."
+msgstr "Hier auf dieser Webseite kannst nur du die Beiträge Deiner Facebook-Freunde (Stream) sehen."
-#: ../../mod/photos.php:764
-msgid "No photos selected"
-msgstr "Keine Bilder ausgewählt"
+#: ../../addon/facebook/facebook.php:391
+msgid ""
+"The following settings determine the privacy of your Facebook profile wall "
+"on this website."
+msgstr "Mit den folgenden Einstellungen kannst Du die Privatsphäre der Kopie Deiner Facebook-Pinnwand hier auf dieser Seite einstellen."
-#: ../../mod/photos.php:841
-msgid "Access to this item is restricted."
-msgstr "Zugriff zu diesem Eintrag wurde eingeschränkt."
+#: ../../addon/facebook/facebook.php:395
+msgid ""
+"On this website your Facebook profile wall conversations will only be "
+"visible to you"
+msgstr "Meine Facebook-Pinnwand hier auf dieser Webseite nur für mich sichtbar machen"
-#: ../../mod/photos.php:895
-msgid "Upload Photos"
-msgstr "Bilder hochladen"
+#: ../../addon/facebook/facebook.php:400
+msgid "Do not import your Facebook profile wall conversations"
+msgstr "Facebook-Pinnwand nicht importieren"
-#: ../../mod/photos.php:898 ../../mod/photos.php:942
-msgid "New album name: "
-msgstr "Name des neuen Albums: "
+#: ../../addon/facebook/facebook.php:402
+msgid ""
+"If you choose to link conversations and leave both of these boxes unchecked,"
+" your Facebook profile wall will be merged with your profile wall on this "
+"website and your privacy settings on this website will be used to determine "
+"who may see the conversations."
+msgstr "Wenn Du Facebook-Konversationen importierst und diese beiden Häkchen nicht setzt, wird Deine Facebook-Pinnwand mit der Pinnwand hier auf dieser Webseite vereinigt. Die Privatsphäre-Einstellungen für Deine Pinnwand auf dieser Webseite geben dann an, wer die Konversationen sehen kann."
-#: ../../mod/photos.php:899
-msgid "or existing album name: "
-msgstr "oder existierender Albumname: "
+#: ../../addon/facebook/facebook.php:407
+msgid "Comma separated applications to ignore"
+msgstr "Komma separierte Liste von Anwendungen die ignoriert werden sollen"
-#: ../../mod/photos.php:900
-msgid "Do not show a status post for this upload"
-msgstr "Keine Status-Mitteilung für diesen Beitrag anzeigen"
+#: ../../addon/facebook/facebook.php:475
+#: ../../include/contact_selectors.php:81
+msgid "Facebook"
+msgstr "Facebook"
-#: ../../mod/photos.php:902 ../../mod/photos.php:1161
-msgid "Permissions"
-msgstr "Berechtigungen"
+#: ../../addon/facebook/facebook.php:476
+msgid "Facebook Connector Settings"
+msgstr "Facebook-Verbindungseinstellungen"
-#: ../../mod/photos.php:957
-msgid "Edit Album"
-msgstr "Album bearbeiten"
+#: ../../addon/facebook/facebook.php:490
+msgid "Post to Facebook"
+msgstr "Bei Facebook veröffentlichen"
-#: ../../mod/photos.php:967 ../../mod/photos.php:1379
-msgid "View Photo"
-msgstr "Fotos betrachten"
+#: ../../addon/facebook/facebook.php:581
+msgid ""
+"Post to Facebook cancelled because of multi-network access permission "
+"conflict."
+msgstr "Beitrag wurde nicht bei Facebook veröffentlicht, da Konflikte bei den Multi-Netzwerk-Zugriffsrechten vorliegen."
-#: ../../mod/photos.php:1002
-msgid "Permission denied. Access to this item may be restricted."
-msgstr ""
-"Zugriff verweigert. Zugriff zu diesem Eintrag könnte eingeschränkt sein."
+#: ../../addon/facebook/facebook.php:650
+msgid "Image: "
+msgstr "Bild: "
-#: ../../mod/photos.php:1004
-msgid "Photo not available"
-msgstr "Foto nicht verfügbar"
+#: ../../addon/facebook/facebook.php:727
+msgid "View on Friendica"
+msgstr "In Friendica betrachten"
-#: ../../mod/photos.php:1054
-msgid "View photo"
-msgstr "Fotos ansehen"
+#: ../../addon/facebook/facebook.php:751
+msgid "Facebook post failed. Queued for retry."
+msgstr "Veröffentlichung bei Facebook gescheitert. Wir versuchen es später erneut."
-#: ../../mod/photos.php:1054
-msgid "Edit photo"
-msgstr "Foto bearbeiten"
+#: ../../addon/facebook/facebook.php:876 ../../addon/facebook/facebook.php:885
+#: ../../include/bb2diaspora.php:113
+msgid "link"
+msgstr "Verweis"
-#: ../../mod/photos.php:1055
-msgid "Use as profile photo"
-msgstr "Als Profilbild verwenden"
+#: ../../addon/widgets/widget_like.php:58
+#, php-format
+msgid "%d person likes this"
+msgid_plural "%d people like this"
+msgstr[0] "%d Person mag das"
+msgstr[1] "%d Leuten mögen das"
-#: ../../mod/photos.php:1061 ../../include/conversation.php:423
-msgid "Private Message"
-msgstr "Private Nachricht"
+#: ../../addon/widgets/widget_like.php:61
+#, php-format
+msgid "%d person doesn't like this"
+msgid_plural "%d people don't like this"
+msgstr[0] " %d Person mag das nicht"
+msgstr[1] "%d Leute mögen das nicht"
-#: ../../mod/photos.php:1072
-msgid "View Full Size"
-msgstr "Betrachte Originalgröße"
+#: ../../addon/widgets/widgets.php:55
+msgid "Generate new key"
+msgstr "Neuen Schlüssel erstellen"
-#: ../../mod/photos.php:1140
-msgid "Tags: "
-msgstr "Tags: "
+#: ../../addon/widgets/widgets.php:58
+msgid "Widgets key"
+msgstr "Widgets Schlüssel"
-#: ../../mod/photos.php:1143
-msgid "[Remove any tag]"
-msgstr "[Tag entfernen]"
+#: ../../addon/widgets/widgets.php:60
+msgid "Widgets available"
+msgstr "Verfügbare Widgets"
-#: ../../mod/photos.php:1154
-msgid "New album name"
-msgstr "Name des neuen Albums"
+#: ../../addon/widgets/widget_friends.php:40
+msgid "Connect on Friendica!"
+msgstr "In Friendica verbinden!"
-#: ../../mod/photos.php:1157
-msgid "Caption"
-msgstr "Bildunterschrift"
+#: ../../addon/yourls/yourls.php:55
+msgid "YourLS Settings"
+msgstr "YourLS Einstellungen"
-#: ../../mod/photos.php:1159
-msgid "Add a Tag"
-msgstr "Tag hinzufügen"
+#: ../../addon/yourls/yourls.php:57
+msgid "URL: http://"
+msgstr "URL: http://"
-#: ../../mod/photos.php:1163
-msgid ""
-"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
-msgstr ""
-"Beispiel: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+#: ../../addon/yourls/yourls.php:62
+msgid "Username:"
+msgstr "Nutzername:"
-#: ../../mod/photos.php:1183 ../../include/conversation.php:470
-msgid "I like this (toggle)"
-msgstr "Ich mag das (toggle)"
+#: ../../addon/yourls/yourls.php:67
+msgid "Password:"
+msgstr "Passwort:"
-#: ../../mod/photos.php:1184 ../../include/conversation.php:471
-msgid "I don't like this (toggle)"
-msgstr "Ich mag das nicht (toggle)"
+#: ../../addon/yourls/yourls.php:72
+msgid "Use SSL "
+msgstr "SSL Verwenden "
-#: ../../mod/photos.php:1185 ../../include/conversation.php:862
-msgid "Share"
-msgstr "Teilen"
+#: ../../addon/yourls/yourls.php:92
+msgid "yourls Settings saved."
+msgstr "yourls Einstellungen gespeichert"
-#: ../../mod/photos.php:1202 ../../mod/photos.php:1242
-#: ../../mod/photos.php:1273 ../../include/conversation.php:485
-msgid "This is you"
-msgstr "Das bist du"
+#: ../../addon/nsfw/nsfw.php:47
+msgid "\"Not Safe For Work\" Settings"
+msgstr "\"Not Safe For Work\"-Einstellungen"
-#: ../../mod/photos.php:1204 ../../mod/photos.php:1244
-#: ../../mod/photos.php:1275 ../../include/conversation.php:487
-#: ../../boot.php:438
-msgid "Comment"
-msgstr "Kommentar"
+#: ../../addon/nsfw/nsfw.php:50
+msgid "Enable NSFW filter"
+msgstr "NSFW Filter aktivieren"
-#: ../../mod/photos.php:1206 ../../include/conversation.php:489
-#: ../../include/conversation.php:897
-msgid "Preview"
-msgstr "Vorschau"
+#: ../../addon/nsfw/nsfw.php:53
+msgid "Comma separated words to treat as NSFW"
+msgstr "Wörter, die gefiltert werden sollen (durch Kommas getrennt)"
-#: ../../mod/photos.php:1385
-msgid "View Album"
-msgstr "Album betrachten"
+#: ../../addon/nsfw/nsfw.php:58
+msgid "Use /expression/ to provide regular expressions"
+msgstr "Verwende /expression/ um Reguläre Ausdrücke zu verwenden"
-#: ../../mod/photos.php:1394
-msgid "Recent Photos"
-msgstr "Neueste Fotos"
+#: ../../addon/nsfw/nsfw.php:74
+msgid "NSFW Settings saved."
+msgstr "NSFW-Einstellungen gespeichert"
-#: ../../mod/photos.php:1396
-msgid "Upload New Photos"
-msgstr "Weitere Fotos hochladen"
+#: ../../addon/nsfw/nsfw.php:120
+#, php-format
+msgid "%s - Click to open/close"
+msgstr "%s – Zum Öffnen/Schließen klicken"
-#: ../../mod/network.php:43
-msgid "Search Results For:"
-msgstr "Suchergebnisse für:"
+#: ../../addon/communityhome/communityhome.php:28
+#: ../../addon/communityhome/communityhome.php:34 ../../include/nav.php:62
+#: ../../boot.php:706
+msgid "Login"
+msgstr "Anmeldung"
-#: ../../mod/network.php:85 ../../include/group.php:216
-msgid "add"
-msgstr "hinzufügen"
+#: ../../addon/communityhome/communityhome.php:29
+msgid "OpenID"
+msgstr "OpenID"
-#: ../../mod/network.php:158
-msgid "Commented Order"
-msgstr "Neueste Kommentare"
+#: ../../addon/communityhome/communityhome.php:38
+msgid "Last users"
+msgstr "Letzte Nutzer"
-#: ../../mod/network.php:163
-msgid "Posted Order"
-msgstr "Neueste Beiträge"
+#: ../../addon/communityhome/communityhome.php:81
+msgid "Most active users"
+msgstr "Aktivste Nutzer"
-#: ../../mod/network.php:174
-msgid "New"
-msgstr "Neue"
+#: ../../addon/communityhome/communityhome.php:98
+msgid "Last photos"
+msgstr "Letzte Fotos"
-#: ../../mod/network.php:179
-msgid "Starred"
-msgstr "Markierte"
+#: ../../addon/communityhome/communityhome.php:133
+msgid "Last likes"
+msgstr "Zuletzt gemocht"
-#: ../../mod/network.php:184
-msgid "Bookmarks"
-msgstr "Lesezeichen"
+#: ../../addon/communityhome/communityhome.php:155
+#: ../../include/conversation.php:23 ../../include/conversation.php:96
+msgid "event"
+msgstr "Veranstaltung"
-#: ../../mod/network.php:232
+#: ../../addon/uhremotestorage/uhremotestorage.php:84
#, php-format
-msgid "Warning: This group contains %s member from an insecure network."
-msgid_plural ""
-"Warning: This group contains %s members from an insecure network."
-msgstr[0] ""
-"Warnung: Diese Gruppe beinhaltet %s Person aus einem unsicheren Netzwerk."
-msgstr[1] ""
-"Warnung: Diese Gruppe beinhaltet %s Personen aus unsicheren Netzwerken."
-
-#: ../../mod/network.php:235
-msgid "Private messages to this group are at risk of public disclosure."
-msgstr ""
-"Private Nachrichten an diese Gruppe könnten an die Öffentlichkeit geraten."
-
-#: ../../mod/network.php:286
-msgid "No such group"
-msgstr "Es gibt keine solche Gruppe"
+msgid ""
+"Allow to use your friendica id (%s) to connecto to external unhosted-enabled"
+" storage (like ownCloud). See <a "
+"href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage"
+" WebFinger</a>"
+msgstr "Ermöglicht es deine friendica id (%s) mit externen unhosted-fähigen Speichern (z.B. ownCloud) zu verbinden. Siehe <a href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>"
-#: ../../mod/network.php:297
-msgid "Group is empty"
-msgstr "Gruppe ist leer"
+#: ../../addon/uhremotestorage/uhremotestorage.php:85
+msgid "Template URL (with {category})"
+msgstr "Vorlagen URL (mit {Kategorie})"
-#: ../../mod/network.php:301
-msgid "Group: "
-msgstr "Gruppe: "
+#: ../../addon/uhremotestorage/uhremotestorage.php:86
+msgid "OAuth end-point"
+msgstr "OAuth end-point"
-#: ../../mod/network.php:311
-msgid "Contact: "
-msgstr "Kontakt: "
+#: ../../addon/uhremotestorage/uhremotestorage.php:87
+msgid "Api"
+msgstr "Api"
-#: ../../mod/network.php:313
-msgid "Private messages to this person are at risk of public disclosure."
-msgstr ""
-"Private Nachrichten an diese Person könnten an die Öffentlichkeit gelangen."
+#: ../../addon/membersince/membersince.php:18
+msgid "Member since:"
+msgstr "Mitglied seit:"
-#: ../../mod/network.php:318
-msgid "Invalid contact."
-msgstr "Ungültiger Kontakt."
+#: ../../addon/tictac/tictac.php:20
+msgid "Three Dimensional Tic-Tac-Toe"
+msgstr "Dreidimensionales Tic-Tac-Toe"
-#: ../../mod/api.php:76 ../../mod/api.php:102
-msgid "Authorize application connection"
-msgstr "Verbindung der Applikation authorisieren"
+#: ../../addon/tictac/tictac.php:53
+msgid "3D Tic-Tac-Toe"
+msgstr "3D Tic-Tac-Toe"
-#: ../../mod/api.php:77
-msgid "Return to your app and insert this Securty Code:"
-msgstr ""
-"Gehe zu deiner Anwendung zurück und trage dort folgenden Sicherheitscode "
-"ein:"
+#: ../../addon/tictac/tictac.php:58
+msgid "New game"
+msgstr "Neues Spiel"
-#: ../../mod/api.php:89
-msgid "Please login to continue."
-msgstr "Bitte melde dich an um fortzufahren."
+#: ../../addon/tictac/tictac.php:59
+msgid "New game with handicap"
+msgstr "Neues Handicap Spiel"
-#: ../../mod/api.php:104
+#: ../../addon/tictac/tictac.php:60
msgid ""
-"Do you want to authorize this application to access your posts and contacts,"
-" and/or create new posts for you?"
-msgstr ""
-"Möchtest du dieser Anwendung den Zugriff auf deine Beiträge und Kontakte "
-"sowie die Erstellung neuer Beiträge in deinem Namen gestatten?"
-
-#: ../../mod/friendica.php:43
-msgid "This is Friendica, version"
-msgstr "Dies ist Friendica version"
-
-#: ../../mod/friendica.php:44
-msgid "running at web location"
-msgstr "die unter folgender Webadresse zu finden ist"
+"Three dimensional tic-tac-toe is just like the traditional game except that "
+"it is played on multiple levels simultaneously. "
+msgstr "3D-Tic-Tac-Toe ist genauso wie das herkömmliche Spiel, nur dass man es auf mehreren Ebenen gleichzeitig spielt."
-#: ../../mod/friendica.php:46
+#: ../../addon/tictac/tictac.php:61
msgid ""
-"Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn "
-"more about the Friendica project."
-msgstr ""
-"Bitte besuche <a href=\"http://friendica.com\">Friendica.com</a> um mehr "
-"über das Friendica Projekt zu erfahren."
-
-#: ../../mod/friendica.php:48
-msgid "Bug reports and issues: please visit"
-msgstr "Probleme oder Fehler gefunden? Bitte besuche"
+"In this case there are three levels. You win by getting three in a row on "
+"any level, as well as up, down, and diagonally across the different levels."
+msgstr "In diesem Fall sind es drei Ebenen. Man gewinnt indem man drei in einer Reihe auf einer beliebigen Reihe schafft, oder drei übereinander oder diagonal auf verschiedenen Ebenen."
-#: ../../mod/friendica.php:49
+#: ../../addon/tictac/tictac.php:63
msgid ""
-"Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - "
-"dot com"
-msgstr "Vorschläge, Lob, Spenden usw.: E-Mail an \"Info\" at Friendica - dot com"
-
-#: ../../mod/friendica.php:54
-msgid "Installed plugins/addons/apps"
-msgstr "Installierte Plugins/Erweiterungen/Apps"
-
-#: ../../mod/friendica.php:62
-msgid "No installed plugins/addons/apps"
-msgstr "Keine Plugins/Erweiterungen/Apps installiert"
-
-#: ../../mod/attach.php:8
-msgid "Item not available."
-msgstr "Beitrag nicht verfügbar."
-
-#: ../../mod/attach.php:20
-msgid "Item was not found."
-msgstr "Beitrag konnte nicht gefunden werden."
-
-#: ../../mod/viewcontacts.php:25 ../../include/text.php:574
-msgid "View Contacts"
-msgstr "Kontakte anzeigen"
-
-#: ../../mod/viewcontacts.php:40
-msgid "No contacts."
-msgstr "Keine Kontakte."
-
-#: ../../mod/tagrm.php:41
-msgid "Tag removed"
-msgstr "Tag entfernt"
+"The handicap game disables the center position on the middle level because "
+"the player claiming this square often has an unfair advantage."
+msgstr "Beim Handicap-Spiel wird die zentrale Position der mittleren Ebene gesperrt da der Spieler der diese Ebene besitzt oft einen unfairen Vorteil genießt."
-#: ../../mod/tagrm.php:79
-msgid "Remove Item Tag"
-msgstr "Gegenstands-Tag entfernen"
+#: ../../addon/tictac/tictac.php:182
+msgid "You go first..."
+msgstr "Du fängst an..."
-#: ../../mod/tagrm.php:81
-msgid "Select a tag to remove: "
-msgstr "Wähle ein Tag zum Entfernen aus: "
+#: ../../addon/tictac/tictac.php:187
+msgid "I'm going first this time..."
+msgstr "Diesmal fange ich an..."
-#: ../../mod/tagrm.php:93
-msgid "Remove"
-msgstr "Entfernen"
+#: ../../addon/tictac/tictac.php:193
+msgid "You won!"
+msgstr "Du gewinnst!"
-#: ../../mod/group.php:27
-msgid "Group created."
-msgstr "Gruppe erstellt."
+#: ../../addon/tictac/tictac.php:199 ../../addon/tictac/tictac.php:224
+msgid "\"Cat\" game!"
+msgstr "Unentschieden!"
-#: ../../mod/group.php:33
-msgid "Could not create group."
-msgstr "Konnte die Gruppe nicht erstellen."
+#: ../../addon/tictac/tictac.php:222
+msgid "I won!"
+msgstr "Ich gewinne!"
-#: ../../mod/group.php:43 ../../mod/group.php:123
-msgid "Group not found."
-msgstr "Gruppe nicht gefunden."
+#: ../../addon/randplace/randplace.php:171
+msgid "Randplace Settings"
+msgstr "Randplace-Einstellungen"
-#: ../../mod/group.php:56
-msgid "Group name changed."
-msgstr "Gruppenname geändert."
+#: ../../addon/randplace/randplace.php:173
+msgid "Enable Randplace Plugin"
+msgstr "Randplace-Plugin aktivieren"
-#: ../../mod/group.php:67 ../../mod/profperm.php:19 ../../index.php:287
-msgid "Permission denied"
-msgstr "Zugriff verweigert"
+#: ../../addon/drpost/drpost.php:35
+msgid "Post to Drupal"
+msgstr "Bei Drupal veröffentlichen"
-#: ../../mod/group.php:82
-msgid "Create a group of contacts/friends."
-msgstr "Eine Gruppe von Kontakten/Freunden anlegen."
+#: ../../addon/drpost/drpost.php:72
+msgid "Drupal Post Settings"
+msgstr "Drupal-Beitragseinstellungen"
-#: ../../mod/group.php:83 ../../mod/group.php:166
-msgid "Group Name: "
-msgstr "Gruppenname:"
+#: ../../addon/drpost/drpost.php:74
+msgid "Enable Drupal Post Plugin"
+msgstr "Veröffentlichung bei Drupal erlauben"
-#: ../../mod/group.php:98
-msgid "Group removed."
-msgstr "Gruppe entfernt."
+#: ../../addon/drpost/drpost.php:79
+msgid "Drupal username"
+msgstr "Drupal Nutzername"
-#: ../../mod/group.php:100
-msgid "Unable to remove group."
-msgstr "Konnte die Gruppe nicht entfernen."
+#: ../../addon/drpost/drpost.php:84
+msgid "Drupal password"
+msgstr "Drupal Passwort"
-#: ../../mod/group.php:164 ../../mod/profperm.php:105
-msgid "Click on a contact to add or remove."
-msgstr "Klicke einen Kontakt an, um ihn hinzuzufügen oder zu entfernen"
+#: ../../addon/drpost/drpost.php:89
+msgid "Post Type - article,page,or blog"
+msgstr "Beitragstyp - Artikel, Seite oder Blog"
-#: ../../mod/group.php:165
-msgid "Group Editor"
-msgstr "Gruppeneditor"
+#: ../../addon/drpost/drpost.php:94
+msgid "Drupal site URL"
+msgstr "URL der Drupal Seite"
-#: ../../mod/group.php:179
-msgid "Members"
-msgstr "Mitglieder"
+#: ../../addon/drpost/drpost.php:99
+msgid "Drupal site uses clean URLS"
+msgstr "Drupal Seite verwendet bereinigte URLs"
-#: ../../mod/group.php:194
-msgid "All Contacts"
-msgstr "Alle Kontakte"
+#: ../../addon/drpost/drpost.php:104
+msgid "Post to Drupal by default"
+msgstr "Veröffentliche öffentliche Beiträge standardmäßig bei Drupal"
-#: ../../mod/events.php:61
-msgid "Event description and start time are required."
-msgstr "Ereignis Beschreibung und Startzeit sind erforderlich."
+#: ../../addon/drpost/drpost.php:184 ../../addon/wppost/wppost.php:172
+#: ../../addon/posterous/posterous.php:173
+msgid "Post from Friendica"
+msgstr "Beitrag via Friendica"
-#: ../../mod/events.php:117 ../../include/nav.php:50 ../../boot.php:1330
-msgid "Events"
-msgstr "Veranstaltungen"
+#: ../../addon/geonames/geonames.php:143
+msgid "Geonames settings updated."
+msgstr "Geonames Einstellungen aktualisiert"
-#: ../../mod/events.php:207
-msgid "Create New Event"
-msgstr "Neue Veranstaltung erstellen"
+#: ../../addon/geonames/geonames.php:179
+msgid "Geonames Settings"
+msgstr "Geonames Einstellungen"
-#: ../../mod/events.php:210
-msgid "Previous"
-msgstr "Vorherige"
+#: ../../addon/geonames/geonames.php:181
+msgid "Enable Geonames Plugin"
+msgstr "Geonames Plugin aktivieren"
-#: ../../mod/events.php:220
-msgid "l, F j"
-msgstr "l, F j"
+#: ../../addon/js_upload/js_upload.php:43
+msgid "Upload a file"
+msgstr "Datei hochladen"
-#: ../../mod/events.php:235
-msgid "Edit event"
-msgstr "Veranstaltung bearbeiten"
+#: ../../addon/js_upload/js_upload.php:44
+msgid "Drop files here to upload"
+msgstr "Ziehe die Dateien hierher die du hochladen willst"
-#: ../../mod/events.php:237 ../../include/text.php:867
-msgid "link to source"
-msgstr "Link zum Originalbeitrag"
+#: ../../addon/js_upload/js_upload.php:46
+msgid "Failed"
+msgstr "Fehlgeschlagen"
-#: ../../mod/events.php:305
-msgid "hour:minute"
-msgstr "Stunde:Minute"
+#: ../../addon/js_upload/js_upload.php:294
+msgid "No files were uploaded."
+msgstr "Keine Dateien hochgeladen."
-#: ../../mod/events.php:314
-msgid "Event details"
-msgstr "Veranstaltungsdetails"
+#: ../../addon/js_upload/js_upload.php:300
+msgid "Uploaded file is empty"
+msgstr "Hochgeladene Datei ist leer"
-#: ../../mod/events.php:315
-#, php-format
-msgid "Format is %s %s. Starting date and Description are required."
-msgstr "Format ist %s %s. Anfangsdatum und Beschreibung sind notwendig."
+#: ../../addon/js_upload/js_upload.php:323
+msgid "File has an invalid extension, it should be one of "
+msgstr "Die Dateierweiterung ist nicht erlaubt, sie muss eine der folgenden sein "
-#: ../../mod/events.php:316
-msgid "Event Starts:"
-msgstr "Veranstaltungsbeginn:"
+#: ../../addon/js_upload/js_upload.php:334
+msgid "Upload was cancelled, or server error encountered"
+msgstr "Upload abgebrochen oder Serverfehler aufgetreten"
-#: ../../mod/events.php:319
-msgid "Finish date/time is not known or not relevant"
-msgstr "Enddatum/-zeit ist nicht bekannt oder nicht relevant"
+#: ../../addon/oembed.old/oembed.php:30
+msgid "OEmbed settings updated"
+msgstr "OEmbed Einstellungen aktualisiert."
-#: ../../mod/events.php:321
-msgid "Event Finishes:"
-msgstr "Veranstaltungsende:"
+#: ../../addon/oembed.old/oembed.php:43
+msgid "Use OEmbed for YouTube videos"
+msgstr "OEmbed für Youtube Videos verwenden"
-#: ../../mod/events.php:324
-msgid "Adjust for viewer timezone"
-msgstr "An Zeitzone des Betrachters anpassen"
+#: ../../addon/oembed.old/oembed.php:71
+msgid "URL to embed:"
+msgstr "URL zum Einbetten:"
-#: ../../mod/events.php:326
-msgid "Description:"
-msgstr "Beschreibung"
+#: ../../addon/impressum/impressum.php:25
+msgid "Impressum"
+msgstr "Impressum"
-#: ../../mod/events.php:328 ../../include/event.php:37
-#: ../../include/bb2diaspora.php:259 ../../boot.php:961
-msgid "Location:"
-msgstr "Ort:"
+#: ../../addon/impressum/impressum.php:38
+#: ../../addon/impressum/impressum.php:40
+#: ../../addon/impressum/impressum.php:70
+msgid "Site Owner"
+msgstr "Betreiber der Seite"
-#: ../../mod/events.php:330
-msgid "Share this event"
-msgstr "Veranstaltung teilen"
+#: ../../addon/impressum/impressum.php:38
+#: ../../addon/impressum/impressum.php:74
+msgid "Email Address"
+msgstr "Email Adresse"
-#: ../../mod/profperm.php:25 ../../mod/profperm.php:55
-msgid "Invalid profile identifier."
-msgstr "Ungültiger Profil-Bezeichner"
+#: ../../addon/impressum/impressum.php:43
+#: ../../addon/impressum/impressum.php:72
+msgid "Postal Address"
+msgstr "Postalische Anschrift"
-#: ../../mod/profperm.php:101
-msgid "Profile Visibility Editor"
-msgstr "Editor für die Profil-Sichtbarkeit"
+#: ../../addon/impressum/impressum.php:49
+msgid ""
+"The impressum addon needs to be configured!<br />Please add at least the "
+"<tt>owner</tt> variable to your config file. For other variables please "
+"refer to the README file of the addon."
+msgstr "Das Impressums-Plugin muss noch konfiguriert werden.<br />Bitte gebe mindestens den <tt>Betreiber</tt> in der Konfiguration an. Alle weiteren Parameter werden in der README-Datei des Addons erläutert."
-#: ../../mod/profperm.php:103 ../../include/nav.php:48
-#: ../../include/profile_advanced.php:7 ../../include/profile_advanced.php:74
-#: ../../boot.php:1317
-msgid "Profile"
-msgstr "Profil"
+#: ../../addon/impressum/impressum.php:71
+msgid "Site Owners Profile"
+msgstr "Profil des Seitenbetreibers"
-#: ../../mod/profperm.php:114
-msgid "Visible To"
-msgstr "Sichtbar für"
+#: ../../addon/impressum/impressum.php:73
+msgid "Notes"
+msgstr "Hinweise"
-#: ../../mod/profperm.php:130
-msgid "All Contacts (with secure profile access)"
-msgstr "Alle Kontakte (mit gesichertem Profilzugriff)"
+#: ../../addon/buglink/buglink.php:15
+msgid "Report Bug"
+msgstr "Fehlerreport erstellen"
-#: ../../mod/dfrn_poll.php:90 ../../mod/dfrn_poll.php:516
-#, php-format
-msgid "%s welcomes %s"
-msgstr "%s heißt %s herzlich willkommen"
+#: ../../addon/blockem/blockem.php:51
+msgid "\"Blockem\" Settings"
+msgstr "\"Blockem\"-Einstellungen"
-#: ../../mod/lockview.php:39
-msgid "Remote privacy information not available."
-msgstr "Entfernte Privatsphäreneinstellungen nicht verfügbar."
+#: ../../addon/blockem/blockem.php:53
+msgid "Comma separated profile URLS to block"
+msgstr "Profil-URLs, die blockiert werden sollen (durch Kommas getrennt)"
-#: ../../mod/lockview.php:43
-msgid "Visible to:"
-msgstr "Sichtbar für:"
+#: ../../addon/blockem/blockem.php:70
+msgid "BLOCKEM Settings saved."
+msgstr "BLOCKEM-Einstellungen gesichert."
-#: ../../mod/home.php:26 ../../addon/communityhome/communityhome.php:179
+#: ../../addon/blockem/blockem.php:105
#, php-format
-msgid "Welcome to %s"
-msgstr "Willkommen zu %s"
-
-#: ../../include/datetime.php:43 ../../include/datetime.php:45
-msgid "Miscellaneous"
-msgstr "Verschiedenes"
-
-#: ../../include/datetime.php:121 ../../include/datetime.php:253
-msgid "year"
-msgstr "Jahr"
-
-#: ../../include/datetime.php:126 ../../include/datetime.php:254
-msgid "month"
-msgstr "Monat"
-
-#: ../../include/datetime.php:131 ../../include/datetime.php:256
-msgid "day"
-msgstr "Tag"
-
-#: ../../include/datetime.php:244
-msgid "never"
-msgstr "nie"
-
-#: ../../include/datetime.php:250
-msgid "less than a second ago"
-msgstr "vor weniger als einer Sekunde"
-
-#: ../../include/datetime.php:253
-msgid "years"
-msgstr "Jahre"
-
-#: ../../include/datetime.php:254
-msgid "months"
-msgstr "Monate"
-
-#: ../../include/datetime.php:255
-msgid "week"
-msgstr "Woche"
-
-#: ../../include/datetime.php:255
-msgid "weeks"
-msgstr "Wochen"
-
-#: ../../include/datetime.php:256
-msgid "days"
-msgstr "Tage"
+msgid "Blocked %s - Click to open/close"
+msgstr "%s blockiert - Zum Öffnen/Schließen klicken"
-#: ../../include/datetime.php:257
-msgid "hour"
-msgstr "Stunde"
+#: ../../addon/blockem/blockem.php:160
+msgid "Unblock Author"
+msgstr "Autor freischalten"
-#: ../../include/datetime.php:257
-msgid "hours"
-msgstr "Stunden"
+#: ../../addon/blockem/blockem.php:162
+msgid "Block Author"
+msgstr "Autor blockieren"
-#: ../../include/datetime.php:258
-msgid "minute"
-msgstr "Minute"
+#: ../../addon/blockem/blockem.php:194
+msgid "blockem settings updated"
+msgstr "blockem Einstellungen aktualisiert"
-#: ../../include/datetime.php:258
-msgid "minutes"
-msgstr "Minuten"
+#: ../../addon/editplain/editplain.php:46
+msgid "Editplain settings updated."
+msgstr "Editplain Einstellungen aktualisiert"
-#: ../../include/datetime.php:259
-msgid "second"
-msgstr "Sekunde"
+#: ../../addon/editplain/editplain.php:76
+msgid "Editplain Settings"
+msgstr "Editplain Einstellungen"
-#: ../../include/datetime.php:259
-msgid "seconds"
-msgstr "Sekunden"
+#: ../../addon/editplain/editplain.php:78
+msgid "Disable richtext status editor"
+msgstr "RichText Editor deaktivieren"
-#: ../../include/datetime.php:266
-msgid " ago"
-msgstr " her"
+#: ../../addon/pageheader/pageheader.php:47
+msgid "\"pageheader\" Settings"
+msgstr "\"pageheader\"-Einstellungen"
-#: ../../include/datetime.php:437 ../../include/profile_advanced.php:30
-#: ../../include/items.php:1285
-msgid "Birthday:"
-msgstr "Geburtstag:"
+#: ../../addon/pageheader/pageheader.php:65
+msgid "pageheader Settings saved."
+msgstr "pageheader-Einstellungen gespeichert."
-#: ../../include/dba.php:39
-#, php-format
-msgid "Cannot locate DNS info for database server '%s'"
-msgstr ""
-"Kann die DNS Informationen für den Datenbanken Server '%s' nicht ermitteln."
+#: ../../addon/viewsrc/viewsrc.php:25
+msgid "View Source"
+msgstr "Quelle ansehen"
-#: ../../include/text.php:232
-msgid "prev"
-msgstr "vorige"
+#: ../../addon/statusnet/statusnet.php:140
+msgid "Post to StatusNet"
+msgstr "Bei StatusNet veröffentlichen"
-#: ../../include/text.php:234
-msgid "first"
-msgstr "erste"
+#: ../../addon/statusnet/statusnet.php:182
+msgid ""
+"Please contact your site administrator.<br />The provided API URL is not "
+"valid."
+msgstr "Bitte kontaktiere den Administrator des Servers.<br />Die angegebene API-URL ist nicht gültig."
-#: ../../include/text.php:263
-msgid "last"
-msgstr "letzte"
+#: ../../addon/statusnet/statusnet.php:210
+msgid "We could not contact the StatusNet API with the Path you entered."
+msgstr "Die StatusNet-API konnte mit dem angegebenen Pfad nicht erreicht werden."
-#: ../../include/text.php:266
-msgid "next"
-msgstr "nächste"
+#: ../../addon/statusnet/statusnet.php:236
+msgid "StatusNet settings updated."
+msgstr "StatusNet Einstellungen aktualisiert."
-#: ../../include/text.php:553
-msgid "No contacts"
-msgstr "Keine Kontakte"
+#: ../../addon/statusnet/statusnet.php:259
+msgid "StatusNet Posting Settings"
+msgstr "StatusNet-Beitragseinstellungen"
-#: ../../include/text.php:562
-#, php-format
-msgid "%d Contact"
-msgid_plural "%d Contacts"
-msgstr[0] "%d Kontakt"
-msgstr[1] "%d Kontakte"
+#: ../../addon/statusnet/statusnet.php:273
+msgid "Globally Available StatusNet OAuthKeys"
+msgstr "Verfügbare OAuth Schlüssel für StatusNet"
-#: ../../include/text.php:633 ../../include/nav.php:87
-msgid "Search"
-msgstr "Suche"
+#: ../../addon/statusnet/statusnet.php:274
+msgid ""
+"There are preconfigured OAuth key pairs for some StatusNet servers "
+"available. If you are useing one of them, please use these credentials. If "
+"not feel free to connect to any other StatusNet instance (see below)."
+msgstr "Für einige StatusNet Server sind OAuth Schlüsselpaare verfügbar. Solltest du einen dieser Server benutzen, dann verwende doch bitte diese Schlüssel. Falls nicht kannst du weiter unten deine eigenen OAuth Schlüssel eintragen."
-#: ../../include/text.php:719
-msgid "Monday"
-msgstr "Montag"
+#: ../../addon/statusnet/statusnet.php:282
+msgid "Provide your own OAuth Credentials"
+msgstr "Eigene OAuth Schlüssel eintragen"
-#: ../../include/text.php:719
-msgid "Tuesday"
-msgstr "Dienstag"
+#: ../../addon/statusnet/statusnet.php:283
+msgid ""
+"No consumer key pair for StatusNet found. Register your Friendica Account as"
+" an desktop client on your StatusNet account, copy the consumer key pair "
+"here and enter the API base root.<br />Before you register your own OAuth "
+"key pair ask the administrator if there is already a key pair for this "
+"Friendica installation at your favorited StatusNet installation."
+msgstr "Kein Consumer-Schlüsselpaar für StatusNet gefunden. Registriere deinen Friendica-Account als Desktop-Client, kopiere das Consumer-Schlüsselpaar hierher und gib die API-URL ein.<br />Bevor du dein eigenes Consumer-Schlüsselpaar registrierst, frage den Administrator dieses Friendica-Servers, ob schon ein Schlüsselpaar für diesen Friendica-Server auf diesem StatusNet-Server existiert."
-#: ../../include/text.php:719
-msgid "Wednesday"
-msgstr "Mittwoch"
+#: ../../addon/statusnet/statusnet.php:285
+msgid "OAuth Consumer Key"
+msgstr "OAuth Consumer Key"
-#: ../../include/text.php:719
-msgid "Thursday"
-msgstr "Donnerstag"
+#: ../../addon/statusnet/statusnet.php:288
+msgid "OAuth Consumer Secret"
+msgstr "OAuth Consumer Secret"
-#: ../../include/text.php:719
-msgid "Friday"
-msgstr "Freitag"
+#: ../../addon/statusnet/statusnet.php:291
+msgid "Base API Path (remember the trailing /)"
+msgstr "Basis-URL der StatusNet-API (vergiss den abschließenden / nicht)"
-#: ../../include/text.php:719
-msgid "Saturday"
-msgstr "Samstag"
+#: ../../addon/statusnet/statusnet.php:312
+msgid ""
+"To connect to your StatusNet account click the button below to get a "
+"security code from StatusNet which you have to copy into the input box below"
+" and submit the form. Only your <strong>public</strong> posts will be posted"
+" to StatusNet."
+msgstr "Um deinen Account mit einem StatusNet-Account zu verknüpfen, klicke den Button an, um einen Sicherheitscode von StatusNet zu erhalten, und kopiere diesen in das Eingabefeld weiter unten. Es werden ausschließlich deine <strong>öffentlichen</strong> Nachrichten an StatusNet gesendet."
-#: ../../include/text.php:719
-msgid "Sunday"
-msgstr "Sonntag"
+#: ../../addon/statusnet/statusnet.php:313
+msgid "Log in with StatusNet"
+msgstr "Bei StatusNet anmelden"
-#: ../../include/text.php:723
-msgid "January"
-msgstr "Januar"
+#: ../../addon/statusnet/statusnet.php:315
+msgid "Copy the security code from StatusNet here"
+msgstr "Kopiere den Sicherheitscode von StatusNet hier hin"
-#: ../../include/text.php:723
-msgid "February"
-msgstr "Februar"
+#: ../../addon/statusnet/statusnet.php:321
+msgid "Cancel Connection Process"
+msgstr "Verbindungsprozess abbrechen"
-#: ../../include/text.php:723
-msgid "March"
-msgstr "März"
+#: ../../addon/statusnet/statusnet.php:323
+msgid "Current StatusNet API is"
+msgstr "Derzeitige StatusNet-API-URL lautet"
-#: ../../include/text.php:723
-msgid "April"
-msgstr "April"
+#: ../../addon/statusnet/statusnet.php:324
+msgid "Cancel StatusNet Connection"
+msgstr "Verbindung zum StatusNet Server abbrechen"
-#: ../../include/text.php:723
-msgid "May"
-msgstr "Mai"
+#: ../../addon/statusnet/statusnet.php:335 ../../addon/twitter/twitter.php:189
+msgid "Currently connected to: "
+msgstr "Momentan verbunden mit: "
-#: ../../include/text.php:723
-msgid "June"
-msgstr "Juni"
+#: ../../addon/statusnet/statusnet.php:336
+msgid ""
+"If enabled all your <strong>public</strong> postings can be posted to the "
+"associated StatusNet account. You can choose to do so by default (here) or "
+"for every posting separately in the posting options when writing the entry."
+msgstr "Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf dem verbundenen StatusNet Konto veröffentlicht werden. Du kannst das (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen."
-#: ../../include/text.php:723
-msgid "July"
-msgstr "Juli"
+#: ../../addon/statusnet/statusnet.php:338
+msgid "Allow posting to StatusNet"
+msgstr "Veröffentlichung bei StatusNet erlauben"
-#: ../../include/text.php:723
-msgid "August"
-msgstr "August"
+#: ../../addon/statusnet/statusnet.php:341
+msgid "Send public postings to StatusNet by default"
+msgstr "Veröffentliche öffentliche Beiträge standardmäßig bei StatusNet"
-#: ../../include/text.php:723
-msgid "September"
-msgstr "September"
+#: ../../addon/statusnet/statusnet.php:346 ../../addon/twitter/twitter.php:200
+msgid "Clear OAuth configuration"
+msgstr "OAuth-Konfiguration löschen"
-#: ../../include/text.php:723
-msgid "October"
-msgstr "Oktober"
+#: ../../addon/statusnet/statusnet.php:487
+msgid "API URL"
+msgstr "API-URL"
-#: ../../include/text.php:723
-msgid "November"
-msgstr "November"
+#: ../../addon/tumblr/tumblr.php:36
+msgid "Post to Tumblr"
+msgstr "Bei Tumblr veröffentlichen"
-#: ../../include/text.php:723
-msgid "December"
-msgstr "Dezember"
+#: ../../addon/tumblr/tumblr.php:67
+msgid "Tumblr Post Settings"
+msgstr "Tumblr-Beitragseinstellungen"
-#: ../../include/text.php:793
-msgid "bytes"
-msgstr "Byte"
+#: ../../addon/tumblr/tumblr.php:69
+msgid "Enable Tumblr Post Plugin"
+msgstr "Tumblr-Plugin aktivieren"
-#: ../../include/text.php:885
-msgid "Select an alternate language"
-msgstr "Alternative Sprache auswählen"
+#: ../../addon/tumblr/tumblr.php:74
+msgid "Tumblr login"
+msgstr "Tumblr Login"
-#: ../../include/text.php:897
-msgid "default"
-msgstr "standard"
+#: ../../addon/tumblr/tumblr.php:79
+msgid "Tumblr password"
+msgstr "Tumblr Passwort"
-#: ../../include/poller.php:459
-msgid "From: "
-msgstr "Von: "
+#: ../../addon/tumblr/tumblr.php:84
+msgid "Post to Tumblr by default"
+msgstr "Standardmäßig bei Tumblr veröffentlichen"
-#: ../../include/nav.php:44 ../../boot.php:700
-msgid "Logout"
-msgstr "Abmelden"
+#: ../../addon/numfriends/numfriends.php:46
+msgid "Numfriends settings updated."
+msgstr "Numfriends Einstellungen aktualisiert"
-#: ../../include/nav.php:44
-msgid "End this session"
-msgstr "Diese Sitzung beenden"
+#: ../../addon/numfriends/numfriends.php:77
+msgid "Numfriends Settings"
+msgstr "Numfriends Einstellungen"
-#: ../../include/nav.php:47 ../../boot.php:1312
-msgid "Status"
-msgstr "Status"
+#: ../../addon/numfriends/numfriends.php:79
+msgid "How many contacts to display on profile sidebar"
+msgstr "Wie viele Kontakte sollen in der Seitenleiste angezeigt werden"
-#: ../../include/nav.php:47 ../../include/nav.php:111
-msgid "Your posts and conversations"
-msgstr "Deine Beiträge und Unterhaltungen"
+#: ../../addon/wppost/wppost.php:42
+msgid "Post to Wordpress"
+msgstr "Bei WordPress veröffentlichen"
-#: ../../include/nav.php:48
-msgid "Your profile page"
-msgstr "Deine Profilseite"
+#: ../../addon/wppost/wppost.php:74
+msgid "WordPress Post Settings"
+msgstr "WordPress-Beitragseinstellungen"
-#: ../../include/nav.php:49 ../../boot.php:1322
-msgid "Photos"
-msgstr "Bilder"
+#: ../../addon/wppost/wppost.php:76
+msgid "Enable WordPress Post Plugin"
+msgstr "WordPress-Plugin aktivieren."
-#: ../../include/nav.php:49
-msgid "Your photos"
-msgstr "Deine Fotos"
+#: ../../addon/wppost/wppost.php:81
+msgid "WordPress username"
+msgstr "WordPress-Benutzername"
-#: ../../include/nav.php:50
-msgid "Your events"
-msgstr "Deine Ereignisse"
+#: ../../addon/wppost/wppost.php:86
+msgid "WordPress password"
+msgstr "WordPress-Passwort"
-#: ../../include/nav.php:51
-msgid "Personal notes"
-msgstr "Persönliche Notizen"
+#: ../../addon/wppost/wppost.php:91
+msgid "WordPress API URL"
+msgstr "WordPress-API-URL"
-#: ../../include/nav.php:51
-msgid "Your personal photos"
-msgstr "Deine privaten Fotos"
+#: ../../addon/wppost/wppost.php:96
+msgid "Post to WordPress by default"
+msgstr "Standardmäßig auf WordPress veröffentlichen"
-#: ../../include/nav.php:62 ../../addon/communityhome/communityhome.php:28
-#: ../../addon/communityhome/communityhome.php:34 ../../boot.php:701
-msgid "Login"
-msgstr "Anmeldung"
+#: ../../addon/piwik/piwik.php:70
+msgid ""
+"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
+"analytics tool."
+msgstr "Diese Website benutzt <a href='http://www.piwik.org'>Piwik</a>, eine Open Source-Software zur statistischen Auswertung der Besucherzugriffe."
-#: ../../include/nav.php:62
-msgid "Sign in"
-msgstr "Anmelden"
+#: ../../addon/piwik/piwik.php:73
+#, php-format
+msgid ""
+"If you do not want that your visits are logged this way you <a href='%s'>can"
+" set a cookie to prevent Piwik from tracking further visits of the site</a> "
+"(opt-out)."
+msgstr "Wenn Du nicht willst, dass Deine Besuche auf diese Weise gespeichert werden, kannst Du <a href='%s'>ein Cookie setzen</a>. Dann wird Piwik Dich auf dieser Website nicht mehr verfolgen (opt-out)."
-#: ../../include/nav.php:73
-msgid "Home Page"
-msgstr "Homepage"
+#: ../../addon/piwik/piwik.php:82
+msgid "Piwik Base URL"
+msgstr "Piwik Basis URL"
-#: ../../include/nav.php:77
-msgid "Create an account"
-msgstr "Account erstellen"
+#: ../../addon/piwik/piwik.php:83
+msgid "Site ID"
+msgstr "Seiten ID"
-#: ../../include/nav.php:82
-msgid "Help and documentation"
-msgstr "Hilfe und Dokumentation"
+#: ../../addon/piwik/piwik.php:84
+msgid "Show opt-out cookie link?"
+msgstr "Link zum Setzen des Opt-Out Cookies anzeigen?"
-#: ../../include/nav.php:85
-msgid "Apps"
-msgstr "Apps"
+#: ../../addon/twitter/twitter.php:78
+msgid "Post to Twitter"
+msgstr "Bei Twitter veröffentlichen"
-#: ../../include/nav.php:85
-msgid "Addon applications, utilities, games"
-msgstr "Addon Anwendungen, Dienstprogramme, Spiele"
+#: ../../addon/twitter/twitter.php:124
+msgid "Twitter settings updated."
+msgstr "Twitter Einstellungen aktualisiert."
-#: ../../include/nav.php:87
-msgid "Search site content"
-msgstr "Inhalt der Seite durchsuchen"
+#: ../../addon/twitter/twitter.php:146
+msgid "Twitter Posting Settings"
+msgstr "Twitter-Beitragseinstellungen"
-#: ../../include/nav.php:97
-msgid "Conversations on this site"
-msgstr "Unterhaltungen auf dieser Seite"
+#: ../../addon/twitter/twitter.php:153
+msgid ""
+"No consumer key pair for Twitter found. Please contact your site "
+"administrator."
+msgstr "Kein Consumer-Schlüsselpaar für Twitter gefunden. Bitte wende dich an den Administrator der Seite."
-#: ../../include/nav.php:99
-msgid "Directory"
-msgstr "Verzeichnis"
+#: ../../addon/twitter/twitter.php:172
+msgid ""
+"At this Friendica instance the Twitter plugin was enabled but you have not "
+"yet connected your account to your Twitter account. To do so click the "
+"button below to get a PIN from Twitter which you have to copy into the input"
+" box below and submit the form. Only your <strong>public</strong> posts will"
+" be posted to Twitter."
+msgstr "Auf diesem Friendica-Server wurde das Twitter-Plugin aktiviert, aber du hast deinen Account noch nicht mit deinem Twitter-Account verbunden. Klicke dazu die Schaltfläche unten. Du erhältst dann eine PIN von Twitter, die du in das Eingabefeld unten kopieren musst. Nicht vergessen, den Senden-Knopf zu drücken! Nur <strong>öffentliche</strong> Beiträge werden bei Twitter veröffentlicht."
-#: ../../include/nav.php:99
-msgid "People directory"
-msgstr "Nutzerverzeichnis"
+#: ../../addon/twitter/twitter.php:173
+msgid "Log in with Twitter"
+msgstr "bei Twitter anmelden"
-#: ../../include/nav.php:109
-msgid "Conversations from your friends"
-msgstr "Unterhaltungen deiner Kontakte"
+#: ../../addon/twitter/twitter.php:175
+msgid "Copy the PIN from Twitter here"
+msgstr "Kopiere die Twitter-PIN hier her"
-#: ../../include/nav.php:117
-msgid "Friend Requests"
-msgstr "Kontaktanfragen"
+#: ../../addon/twitter/twitter.php:190
+msgid ""
+"If enabled all your <strong>public</strong> postings can be posted to the "
+"associated Twitter account. You can choose to do so by default (here) or for"
+" every posting separately in the posting options when writing the entry."
+msgstr "Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf dem verbundenen Twitter Konto veröffentlicht werden. Du kannst dies (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen."
-#: ../../include/nav.php:122
-msgid "Private mail"
-msgstr "Private Email"
+#: ../../addon/twitter/twitter.php:192
+msgid "Allow posting to Twitter"
+msgstr "Veröffentlichung bei Twitter erlauben"
-#: ../../include/nav.php:125
-msgid "Manage"
-msgstr "Verwalten"
+#: ../../addon/twitter/twitter.php:195
+msgid "Send public postings to Twitter by default"
+msgstr "Veröffentliche öffentliche Beiträge standardmäßig bei Twitter"
-#: ../../include/nav.php:125
-msgid "Manage other pages"
-msgstr "Andere Seiten verwalten"
+#: ../../addon/twitter/twitter.php:317
+msgid "Consumer key"
+msgstr "Consumer Key"
-#: ../../include/nav.php:129 ../../boot.php:921
-msgid "Profiles"
-msgstr "Profile"
+#: ../../addon/twitter/twitter.php:318
+msgid "Consumer secret"
+msgstr "Consumer Secret"
-#: ../../include/nav.php:129 ../../boot.php:921
-msgid "Manage/edit profiles"
-msgstr "Profile verwalten/editieren"
+#: ../../addon/posterous/posterous.php:36
+msgid "Post to Posterous"
+msgstr "Nach Posterous senden"
-#: ../../include/nav.php:130
-msgid "Manage/edit friends and contacts"
-msgstr "Freunde und Kontakte verwalten/editieren"
+#: ../../addon/posterous/posterous.php:67
+msgid "Posterous Post Settings"
+msgstr "Posterous Beitrags-Einstellungen"
-#: ../../include/nav.php:137
-msgid "Admin"
-msgstr "Administration"
+#: ../../addon/posterous/posterous.php:69
+msgid "Enable Posterous Post Plugin"
+msgstr "Posterous-Plugin aktivieren"
-#: ../../include/nav.php:137
-msgid "Site setup and configuration"
-msgstr "Einstellungen der Seite und Konfiguration"
+#: ../../addon/posterous/posterous.php:74
+msgid "Posterous login"
+msgstr "Posterous-Anmeldename"
-#: ../../include/nav.php:160
-msgid "Nothing new here"
-msgstr "Keine Neuigkeiten."
+#: ../../addon/posterous/posterous.php:79
+msgid "Posterous password"
+msgstr "Posterous-Passwort"
-#: ../../include/message.php:14
-msgid "[no subject]"
-msgstr "[kein Betreff]"
+#: ../../addon/posterous/posterous.php:84
+msgid "Post to Posterous by default"
+msgstr "Veröffentliche öffentliche Beiträge standardmäßig bei Posterous"
-#: ../../include/profile_advanced.php:17 ../../boot.php:963
+#: ../../include/profile_advanced.php:17 ../../boot.php:978
msgid "Gender:"
msgstr "Geschlecht:"
@@ -4131,77 +4407,142 @@ msgstr "j F, Y"
msgid "j F"
msgstr "j F"
+#: ../../include/profile_advanced.php:30 ../../include/datetime.php:438
+#: ../../include/items.php:1318
+msgid "Birthday:"
+msgstr "Geburtstag:"
+
#: ../../include/profile_advanced.php:34
msgid "Age:"
msgstr "Alter:"
-#: ../../include/profile_advanced.php:37 ../../boot.php:966
+#: ../../include/profile_advanced.php:37 ../../boot.php:981
msgid "Status:"
msgstr "Status:"
-#: ../../include/profile_advanced.php:45 ../../boot.php:968
+#: ../../include/profile_advanced.php:45 ../../boot.php:983
msgid "Homepage:"
msgstr "Homepage:"
-#: ../../include/profile_advanced.php:49
+#: ../../include/profile_advanced.php:47
+msgid "Tags:"
+msgstr "Tags"
+
+#: ../../include/profile_advanced.php:51
msgid "Religion:"
msgstr "Religion:"
-#: ../../include/profile_advanced.php:51
+#: ../../include/profile_advanced.php:53
msgid "About:"
msgstr "Ãœber:"
-#: ../../include/profile_advanced.php:53
+#: ../../include/profile_advanced.php:55
msgid "Hobbies/Interests:"
msgstr "Hobbies/Interessen:"
-#: ../../include/profile_advanced.php:55
+#: ../../include/profile_advanced.php:57
msgid "Contact information and Social Networks:"
msgstr "Kontaktinformationen und Soziale Netzwerke:"
-#: ../../include/profile_advanced.php:57
+#: ../../include/profile_advanced.php:59
msgid "Musical interests:"
msgstr "Musikalische Interessen:"
-#: ../../include/profile_advanced.php:59
+#: ../../include/profile_advanced.php:61
msgid "Books, literature:"
msgstr "Literatur/Bücher:"
-#: ../../include/profile_advanced.php:61
+#: ../../include/profile_advanced.php:63
msgid "Television:"
msgstr "Fernsehen:"
-#: ../../include/profile_advanced.php:63
+#: ../../include/profile_advanced.php:65
msgid "Film/dance/culture/entertainment:"
msgstr "Filme/Tänze/Kultur/Unterhaltung:"
-#: ../../include/profile_advanced.php:65
+#: ../../include/profile_advanced.php:67
msgid "Love/Romance:"
msgstr "Liebesleben:"
-#: ../../include/profile_advanced.php:67
+#: ../../include/profile_advanced.php:69
msgid "Work/employment:"
msgstr "Arbeit/Beschäftigung:"
-#: ../../include/profile_advanced.php:69
+#: ../../include/profile_advanced.php:71
msgid "School/education:"
msgstr "Schule/Ausbildung:"
-#: ../../include/event.php:17 ../../include/bb2diaspora.php:243
-msgid "Starts:"
-msgstr "Beginnt:"
+#: ../../include/contact_selectors.php:32
+msgid "Unknown | Not categorised"
+msgstr "Unbekannt | Nicht kategorisiert"
-#: ../../include/event.php:27 ../../include/bb2diaspora.php:251
-msgid "Finishes:"
-msgstr "Endet:"
+#: ../../include/contact_selectors.php:33
+msgid "Block immediately"
+msgstr "Sofort blockieren"
-#: ../../include/items.php:2413
-msgid "A new person is sharing with you at "
-msgstr "Eine neue Person teilt mit dir auf "
+#: ../../include/contact_selectors.php:34
+msgid "Shady, spammer, self-marketer"
+msgstr "Zwielichtig, Spammer, Selbstdarsteller"
-#: ../../include/items.php:2413
-msgid "You have a new follower at "
-msgstr "Du hast einen neuen Kontakt auf "
+#: ../../include/contact_selectors.php:35
+msgid "Known to me, but no opinion"
+msgstr "Ist mir bekannt, hab aber keine Meinung"
+
+#: ../../include/contact_selectors.php:36
+msgid "OK, probably harmless"
+msgstr "OK, wahrscheinlich harmlos"
+
+#: ../../include/contact_selectors.php:37
+msgid "Reputable, has my trust"
+msgstr "Seriös, hat mein Vertrauen"
+
+#: ../../include/contact_selectors.php:56
+msgid "Frequently"
+msgstr "Häufig"
+
+#: ../../include/contact_selectors.php:57
+msgid "Hourly"
+msgstr "Stündlich"
+
+#: ../../include/contact_selectors.php:58
+msgid "Twice daily"
+msgstr "Zweimal Täglich"
+
+#: ../../include/contact_selectors.php:59
+msgid "Daily"
+msgstr "Täglich"
+
+#: ../../include/contact_selectors.php:60
+msgid "Weekly"
+msgstr "Wöchentlich"
+
+#: ../../include/contact_selectors.php:61
+msgid "Monthly"
+msgstr "Monatlich"
+
+#: ../../include/contact_selectors.php:77
+msgid "OStatus"
+msgstr "OStatus"
+
+#: ../../include/contact_selectors.php:78
+msgid "RSS/Atom"
+msgstr "RSS/Atom"
+
+#: ../../include/contact_selectors.php:82
+msgid "Zot!"
+msgstr "Zott"
+
+#: ../../include/contact_selectors.php:83
+msgid "LinkedIn"
+msgstr "LinkedIn"
+
+#: ../../include/contact_selectors.php:84
+msgid "XMPP/IM"
+msgstr "XMPP/Chat"
+
+#: ../../include/contact_selectors.php:85
+msgid "MySpace"
+msgstr "MySpace"
#: ../../include/profile_selectors.php:6
msgid "Male"
@@ -4415,485 +4756,317 @@ msgstr "Ist mir nicht wichtig"
msgid "Ask me"
msgstr "Frag mich"
-#: ../../include/Contact.php:125 ../../include/conversation.php:723
-msgid "View status"
-msgstr "Status anzeigen"
-
-#: ../../include/Contact.php:126 ../../include/conversation.php:724
-msgid "View profile"
-msgstr "Profil anzeigen"
-
-#: ../../include/Contact.php:127 ../../include/conversation.php:725
-msgid "View photos"
-msgstr "Fotos ansehen"
-
-#: ../../include/Contact.php:128 ../../include/Contact.php:141
-#: ../../include/conversation.php:726
-msgid "View recent"
-msgstr "Neueste anzeigen"
-
-#: ../../include/Contact.php:130 ../../include/Contact.php:141
-#: ../../include/conversation.php:728
-msgid "Send PM"
-msgstr "Private Nachricht senden"
-
-#: ../../include/conversation.php:23 ../../include/conversation.php:96
-#: ../../addon/communityhome/communityhome.php:155
-msgid "event"
-msgstr "Veranstaltung"
-
-#: ../../include/conversation.php:252 ../../include/conversation.php:508
-msgid "Select"
-msgstr "Auswählen"
-
-#: ../../include/conversation.php:267 ../../include/conversation.php:602
-#: ../../include/conversation.php:603
-#, php-format
-msgid "View %s's profile @ %s"
-msgstr "Das Profil von %s auf %s betrachten."
-
-#: ../../include/conversation.php:276 ../../include/conversation.php:614
-#, php-format
-msgid "%s from %s"
-msgstr "%s von %s"
-
-#: ../../include/conversation.php:292
-msgid "View in context"
-msgstr "Im Zusammenhang betrachten"
-
-#: ../../include/conversation.php:407
-#, php-format
-msgid "%d comment"
-msgid_plural "%d comments"
-msgstr[0] "%d Kommentar"
-msgstr[1] "%d Kommentare"
-
-#: ../../include/conversation.php:410 ../../boot.php:439
-msgid "show more"
-msgstr "mehr anzeigen"
-
-#: ../../include/conversation.php:470
-msgid "like"
-msgstr "mag ich"
-
-#: ../../include/conversation.php:471
-msgid "dislike"
-msgstr "mag ich nicht"
-
-#: ../../include/conversation.php:473
-msgid "Share this"
-msgstr "Teilen"
-
-#: ../../include/conversation.php:473
-msgid "share"
-msgstr "Teilen"
-
-#: ../../include/conversation.php:518
-msgid "add star"
-msgstr "markieren"
-
-#: ../../include/conversation.php:519
-msgid "remove star"
-msgstr "Markierung entfernen"
-
-#: ../../include/conversation.php:520
-msgid "toggle star status"
-msgstr "Markierung umschalten"
-
-#: ../../include/conversation.php:523
-msgid "starred"
-msgstr "markiert"
+#: ../../include/event.php:17 ../../include/bb2diaspora.php:255
+msgid "Starts:"
+msgstr "Beginnt:"
-#: ../../include/conversation.php:524
-msgid "add tag"
-msgstr "Tag hinzufügen"
+#: ../../include/event.php:27 ../../include/bb2diaspora.php:263
+msgid "Finishes:"
+msgstr "Endet:"
-#: ../../include/conversation.php:604
-msgid "to"
-msgstr "to"
+#: ../../include/delivery.php:416 ../../include/notifier.php:629
+msgid "(no subject)"
+msgstr "(kein Betreff)"
-#: ../../include/conversation.php:605
-msgid "Wall-to-Wall"
-msgstr "Wall-to-Wall"
+#: ../../include/delivery.php:423 ../../include/enotify.php:16
+#: ../../include/notifier.php:636
+msgid "noreply"
+msgstr "noreply"
-#: ../../include/conversation.php:606
-msgid "via Wall-To-Wall:"
-msgstr "via Wall-To-Wall:"
+#: ../../include/text.php:232
+msgid "prev"
+msgstr "vorige"
-#: ../../include/conversation.php:648
-msgid "Delete Selected Items"
-msgstr "Lösche die markierten Beiträge"
+#: ../../include/text.php:234
+msgid "first"
+msgstr "erste"
-#: ../../include/conversation.php:778
-#, php-format
-msgid "%s likes this."
-msgstr "%s mag das."
+#: ../../include/text.php:263
+msgid "last"
+msgstr "letzte"
-#: ../../include/conversation.php:778
-#, php-format
-msgid "%s doesn't like this."
-msgstr "%s mag das nicht."
+#: ../../include/text.php:266
+msgid "next"
+msgstr "nächste"
-#: ../../include/conversation.php:782
-#, php-format
-msgid "<span %1$s>%2$d people</span> like this."
-msgstr "<span %1$s>%2$d Leute</span> mögen das."
+#: ../../include/text.php:557
+msgid "No contacts"
+msgstr "Keine Kontakte"
-#: ../../include/conversation.php:784
+#: ../../include/text.php:566
#, php-format
-msgid "<span %1$s>%2$d people</span> don't like this."
-msgstr "<span %1$s>%2$d Leute</span> mögen das nicht."
+msgid "%d Contact"
+msgid_plural "%d Contacts"
+msgstr[0] "%d Kontakt"
+msgstr[1] "%d Kontakte"
-#: ../../include/conversation.php:790
-msgid "and"
-msgstr "und"
+#: ../../include/text.php:637 ../../include/nav.php:87
+msgid "Search"
+msgstr "Suche"
-#: ../../include/conversation.php:793
-#, php-format
-msgid ", and %d other people"
-msgstr " und %d andere"
+#: ../../include/text.php:735
+msgid "Monday"
+msgstr "Montag"
-#: ../../include/conversation.php:794
-#, php-format
-msgid "%s like this."
-msgstr "%s mögen das."
+#: ../../include/text.php:735
+msgid "Tuesday"
+msgstr "Dienstag"
-#: ../../include/conversation.php:794
-#, php-format
-msgid "%s don't like this."
-msgstr "%s mögen das nicht."
+#: ../../include/text.php:735
+msgid "Wednesday"
+msgstr "Mittwoch"
-#: ../../include/conversation.php:814
-msgid "Visible to <strong>everybody</strong>"
-msgstr "Für <strong>Jedermann</strong> sichtbar"
+#: ../../include/text.php:735
+msgid "Thursday"
+msgstr "Donnerstag"
-#: ../../include/conversation.php:816
-msgid "Please enter a video link/URL:"
-msgstr "Bitte Link/URL zum Video einfügen:"
+#: ../../include/text.php:735
+msgid "Friday"
+msgstr "Freitag"
-#: ../../include/conversation.php:817
-msgid "Please enter an audio link/URL:"
-msgstr "Bitte Link/URL zum Audio einfügen:"
+#: ../../include/text.php:735
+msgid "Saturday"
+msgstr "Samstag"
-#: ../../include/conversation.php:818
-msgid "Tag term:"
-msgstr "Tag:"
+#: ../../include/text.php:735
+msgid "Sunday"
+msgstr "Sonntag"
-#: ../../include/conversation.php:819
-msgid "Where are you right now?"
-msgstr "Wo hältst du dich jetzt gerade auf?"
+#: ../../include/text.php:739
+msgid "January"
+msgstr "Januar"
-#: ../../include/conversation.php:820
-msgid "Enter a title for this item"
-msgstr "Gib den Titel für diesen Beitrag ein"
+#: ../../include/text.php:739
+msgid "February"
+msgstr "Februar"
-#: ../../include/conversation.php:864
-msgid "upload photo"
-msgstr "Bild hochladen"
+#: ../../include/text.php:739
+msgid "March"
+msgstr "März"
-#: ../../include/conversation.php:866
-msgid "attach file"
-msgstr "Datei anhängen"
+#: ../../include/text.php:739
+msgid "April"
+msgstr "April"
-#: ../../include/conversation.php:868
-msgid "web link"
-msgstr "Weblink"
+#: ../../include/text.php:739
+msgid "May"
+msgstr "Mai"
-#: ../../include/conversation.php:869
-msgid "Insert video link"
-msgstr "Video-Adresse einfügen"
+#: ../../include/text.php:739
+msgid "June"
+msgstr "Juni"
-#: ../../include/conversation.php:870
-msgid "video link"
-msgstr "Video-Link"
+#: ../../include/text.php:739
+msgid "July"
+msgstr "Juli"
-#: ../../include/conversation.php:871
-msgid "Insert audio link"
-msgstr "Audio-Adresse einfügen"
+#: ../../include/text.php:739
+msgid "August"
+msgstr "August"
-#: ../../include/conversation.php:872
-msgid "audio link"
-msgstr "Audio-Link"
+#: ../../include/text.php:739
+msgid "September"
+msgstr "September"
-#: ../../include/conversation.php:874
-msgid "set location"
-msgstr "Ort setzen"
+#: ../../include/text.php:739
+msgid "October"
+msgstr "Oktober"
-#: ../../include/conversation.php:876
-msgid "clear location"
-msgstr "Ort löschen"
+#: ../../include/text.php:739
+msgid "November"
+msgstr "November"
-#: ../../include/conversation.php:878
-msgid "Set title"
-msgstr "Titel setzen"
+#: ../../include/text.php:739
+msgid "December"
+msgstr "Dezember"
-#: ../../include/conversation.php:881
-msgid "permissions"
-msgstr "Zugriffsrechte"
+#: ../../include/text.php:809
+msgid "bytes"
+msgstr "Byte"
-#: ../../include/notifier.php:628 ../../include/delivery.php:415
-msgid "(no subject)"
-msgstr "(kein Betreff)"
+#: ../../include/text.php:901
+msgid "Select an alternate language"
+msgstr "Alternative Sprache auswählen"
-#: ../../include/notifier.php:635 ../../include/enotify.php:16
-msgid "noreply"
-msgstr "noreply"
+#: ../../include/text.php:913
+msgid "default"
+msgstr "standard"
#: ../../include/diaspora.php:570
msgid "Sharing notification from Diaspora network"
msgstr "Freigabe-Benachrichtigung von Diaspora"
-#: ../../include/diaspora.php:1862
+#: ../../include/diaspora.php:1895
msgid "Attachments:"
msgstr "Anhänge:"
-#: ../../include/diaspora.php:2045
+#: ../../include/diaspora.php:2078
#, php-format
msgid "[Relayed] Comment authored by %s from network %s"
msgstr "[Weitergeleitet] Kommentar von %s aus dem %s Netzwerk"
-#: ../../include/bb2diaspora.php:53
-msgid "view full size"
-msgstr "Volle Größe anzeigen"
-
-#: ../../include/bb2diaspora.php:102 ../../include/bb2diaspora.php:112
-msgid "image/photo"
-msgstr "Bild/Foto"
-
-#: ../../include/bb2diaspora.php:102 ../../addon/facebook/facebook.php:869
-#: ../../addon/facebook/facebook.php:878
-msgid "link"
-msgstr "Verweis"
-
-#: ../../include/acl_selectors.php:279
-msgid "Visible to everybody"
-msgstr "Für jeden sichtbar"
-
-#: ../../include/acl_selectors.php:280
-msgid "show"
-msgstr "zeigen"
-
-#: ../../include/acl_selectors.php:281
-msgid "don't show"
-msgstr "nicht zeigen"
-
-#: ../../include/enotify.php:8
-msgid "Friendica Notification"
-msgstr "Friendica-Benachrichtigung"
-
-#: ../../include/enotify.php:11
-msgid "Thank You,"
-msgstr "Danke,"
-
-#: ../../include/enotify.php:13
-#, php-format
-msgid "%s Administrator"
-msgstr "der Administrator von %s"
-
-#: ../../include/enotify.php:28
-#, php-format
-msgid "New mail received at %s"
-msgstr "Neue Nachricht auf %s empfangen"
-
-#: ../../include/enotify.php:30
-#, php-format
-msgid "%s sent you a new private message at %s."
-msgstr "%s hat dir eine neue private Nachricht auf %s geschrieben."
-
-#: ../../include/enotify.php:32
-#, php-format
-msgid "Please visit %s to view and/or reply to your private messages."
-msgstr ""
-"Bitte besuche %s, um deine privaten Nachrichten anzusehen und/oder zu "
-"beantworten."
-
-#: ../../include/enotify.php:40
-#, php-format
-msgid "%s commented on an item at %s"
-msgstr "%s kommentierte einen Beitrag auf %s"
-
-#: ../../include/enotify.php:41
-#, php-format
-msgid "%s commented on an item/conversation you have been following."
-msgstr "%s hat einen Beitrag kommentiert, dem du folgst."
-
-#: ../../include/enotify.php:42 ../../include/enotify.php:51
-#, php-format
-msgid "Please visit %s to view and/or reply to the conversation."
-msgstr ""
-"Bitte besuche %s, um die Konversation anzusehen und/oder zu kommentieren."
+#: ../../include/oembed.php:128
+msgid "Embedded content"
+msgstr "Eingebetteter Inhalt"
-#: ../../include/enotify.php:49
-#, php-format
-msgid "%s posted to your profile wall at %s"
-msgstr "%s hat auf deine Pinnwand bei %s gepostet"
+#: ../../include/oembed.php:137
+msgid "Embedding disabled"
+msgstr "Einbettungen deaktiviert"
-#: ../../include/enotify.php:58
-#, php-format
-msgid "Introduction received at %s"
-msgstr "Kontaktanfrage auf %s erhalten"
+#: ../../include/group.php:25
+msgid ""
+"A deleted group with this name was revived. Existing item permissions "
+"<strong>may</strong> apply to this group and any future members. If this is "
+"not what you intended, please create another group with a different name."
+msgstr "Eine gelöschte Gruppe mit diesem Namen wurde wiederbelebt. Bestehende Berechtigungseinstellungen <strong>könnten</strong> auf diese Gruppe oder zukünftige Mitglieder angewandt werden. Falls du dies nicht möchtest erstelle bitte eine andere Gruppe mit einem anderen Namen."
-#: ../../include/enotify.php:59
-#, php-format
-msgid "You've received an introduction from '%s' at %s"
-msgstr "Du hast eine Kontaktanfrage von '%s' auf %s erhalten"
+#: ../../include/group.php:168
+msgid "Everybody"
+msgstr "Alle Kontakte"
-#: ../../include/enotify.php:60 ../../include/enotify.php:73
-#, php-format
-msgid "You may visit their profile at %s"
-msgstr "Hier kannst du das Profil betrachten: %s"
+#: ../../include/group.php:191
+msgid "edit"
+msgstr "bearbeiten"
-#: ../../include/enotify.php:62
-#, php-format
-msgid "Please visit %s to approve or reject the introduction."
-msgstr "Bitte besuche %s, um die Kontaktanfrage anzunehmen oder abzulehnen."
+#: ../../include/group.php:212
+msgid "Groups"
+msgstr "Gruppen"
-#: ../../include/enotify.php:69
-#, php-format
-msgid "Friend suggestion received at %s"
-msgstr "Kontaktvorschlag empfangen auf %s"
+#: ../../include/group.php:213
+msgid "Edit group"
+msgstr "Gruppe bearbeiten"
-#: ../../include/enotify.php:70
-#, php-format
-msgid "You've received a friend suggestion from '%s' at %s"
-msgstr "Du hast von '%s' einen Kontaktvorschlag erhalten auf %s"
+#: ../../include/group.php:214
+msgid "Create a new group"
+msgstr "Neue Gruppe erstellen"
-#: ../../include/enotify.php:71
-msgid "Name:"
-msgstr "Name:"
+#: ../../include/nav.php:44 ../../boot.php:705
+msgid "Logout"
+msgstr "Abmelden"
-#: ../../include/enotify.php:72
-msgid "Photo:"
-msgstr "Foto:"
+#: ../../include/nav.php:44
+msgid "End this session"
+msgstr "Diese Sitzung beenden"
-#: ../../include/enotify.php:75
-#, php-format
-msgid "Please visit %s to approve or reject the suggestion."
-msgstr "Bitte besuche %s, um den Vorschlag zu akzeptieren oder abzulehnen."
+#: ../../include/nav.php:47 ../../boot.php:1327
+msgid "Status"
+msgstr "Status"
-#: ../../include/bbcode.php:166 ../../include/bbcode.php:225
-msgid "Image/photo"
-msgstr "Bild/Foto"
+#: ../../include/nav.php:47 ../../include/nav.php:111
+msgid "Your posts and conversations"
+msgstr "Deine Beiträge und Unterhaltungen"
-#: ../../include/contact_selectors.php:32
-msgid "Unknown | Not categorised"
-msgstr "Unbekannt | Nicht kategorisiert"
+#: ../../include/nav.php:48
+msgid "Your profile page"
+msgstr "Deine Profilseite"
-#: ../../include/contact_selectors.php:33
-msgid "Block immediately"
-msgstr "Sofort blockieren"
+#: ../../include/nav.php:49 ../../boot.php:1337
+msgid "Photos"
+msgstr "Bilder"
-#: ../../include/contact_selectors.php:34
-msgid "Shady, spammer, self-marketer"
-msgstr "Zwielichtig, Spammer, Selbstdarsteller"
+#: ../../include/nav.php:49
+msgid "Your photos"
+msgstr "Deine Fotos"
-#: ../../include/contact_selectors.php:35
-msgid "Known to me, but no opinion"
-msgstr "Ist mir bekannt, hab aber keine Meinung"
+#: ../../include/nav.php:50
+msgid "Your events"
+msgstr "Deine Ereignisse"
-#: ../../include/contact_selectors.php:36
-msgid "OK, probably harmless"
-msgstr "OK, wahrscheinlich harmlos"
+#: ../../include/nav.php:51
+msgid "Personal notes"
+msgstr "Persönliche Notizen"
-#: ../../include/contact_selectors.php:37
-msgid "Reputable, has my trust"
-msgstr "Seriös, hat mein Vertrauen"
+#: ../../include/nav.php:51
+msgid "Your personal photos"
+msgstr "Deine privaten Fotos"
-#: ../../include/contact_selectors.php:56
-msgid "Frequently"
-msgstr "Häufig"
+#: ../../include/nav.php:62
+msgid "Sign in"
+msgstr "Anmelden"
-#: ../../include/contact_selectors.php:57
-msgid "Hourly"
-msgstr "Stündlich"
+#: ../../include/nav.php:73
+msgid "Home Page"
+msgstr "Homepage"
-#: ../../include/contact_selectors.php:58
-msgid "Twice daily"
-msgstr "Zweimal Täglich"
+#: ../../include/nav.php:77
+msgid "Create an account"
+msgstr "Account erstellen"
-#: ../../include/contact_selectors.php:59
-msgid "Daily"
-msgstr "Täglich"
+#: ../../include/nav.php:82
+msgid "Help and documentation"
+msgstr "Hilfe und Dokumentation"
-#: ../../include/contact_selectors.php:60
-msgid "Weekly"
-msgstr "Wöchentlich"
+#: ../../include/nav.php:85
+msgid "Apps"
+msgstr "Apps"
-#: ../../include/contact_selectors.php:61
-msgid "Monthly"
-msgstr "Monatlich"
+#: ../../include/nav.php:85
+msgid "Addon applications, utilities, games"
+msgstr "Addon Anwendungen, Dienstprogramme, Spiele"
-#: ../../include/contact_selectors.php:77
-msgid "OStatus"
-msgstr "OStatus"
+#: ../../include/nav.php:87
+msgid "Search site content"
+msgstr "Inhalt der Seite durchsuchen"
-#: ../../include/contact_selectors.php:78
-msgid "RSS/Atom"
-msgstr "RSS/Atom"
+#: ../../include/nav.php:97
+msgid "Conversations on this site"
+msgstr "Unterhaltungen auf dieser Seite"
-#: ../../include/contact_selectors.php:81
-#: ../../addon/facebook/facebook.php:475
-msgid "Facebook"
-msgstr "Facebook"
+#: ../../include/nav.php:99
+msgid "Directory"
+msgstr "Verzeichnis"
-#: ../../include/contact_selectors.php:82
-msgid "Zot!"
-msgstr "Zott"
+#: ../../include/nav.php:99
+msgid "People directory"
+msgstr "Nutzerverzeichnis"
-#: ../../include/contact_selectors.php:83
-msgid "LinkedIn"
-msgstr "LinkedIn"
+#: ../../include/nav.php:109
+msgid "Conversations from your friends"
+msgstr "Unterhaltungen deiner Kontakte"
-#: ../../include/contact_selectors.php:84
-msgid "XMPP/IM"
-msgstr "XMPP/Chat"
+#: ../../include/nav.php:117
+msgid "Friend Requests"
+msgstr "Kontaktanfragen"
-#: ../../include/contact_selectors.php:85
-msgid "MySpace"
-msgstr "MySpace"
+#: ../../include/nav.php:119
+msgid "See all notifications"
+msgstr "Alle Benachrichtigungen anzeigen"
-#: ../../include/auth.php:27
-msgid "Logged out."
-msgstr "Abgemeldet."
+#: ../../include/nav.php:123
+msgid "Private mail"
+msgstr "Private Email"
-#: ../../include/oembed.php:128
-msgid "Embedded content"
-msgstr "Eingebetteter Inhalt"
+#: ../../include/nav.php:126
+msgid "Manage"
+msgstr "Verwalten"
-#: ../../include/oembed.php:137
-msgid "Embedding disabled"
-msgstr "Einbettungen deaktiviert"
+#: ../../include/nav.php:126
+msgid "Manage other pages"
+msgstr "Andere Seiten verwalten"
-#: ../../include/group.php:25
-msgid ""
-"A deleted group with this name was revived. Existing item permissions "
-"<strong>may</strong> apply to this group and any future members. If this is "
-"not what you intended, please create another group with a different name."
-msgstr ""
-"Eine gelöschte Gruppe mit diesem Namen wurde wiederbelebt. Bestehende "
-"Berechtigungseinstellungen <strong>könnten</strong> auf diese Gruppe oder "
-"zukünftige Mitglieder angewandt werden. Falls du dies nicht möchtest "
-"erstelle bitte eine andere Gruppe mit einem anderen Namen."
+#: ../../include/nav.php:130 ../../boot.php:936
+msgid "Profiles"
+msgstr "Profile"
-#: ../../include/group.php:168
-msgid "Everybody"
-msgstr "Alle Kontakte"
+#: ../../include/nav.php:130 ../../boot.php:936
+msgid "Manage/edit profiles"
+msgstr "Profile verwalten/editieren"
-#: ../../include/group.php:191
-msgid "edit"
-msgstr "bearbeiten"
+#: ../../include/nav.php:131
+msgid "Manage/edit friends and contacts"
+msgstr "Freunde und Kontakte verwalten/editieren"
-#: ../../include/group.php:212
-msgid "Groups"
-msgstr "Gruppen"
+#: ../../include/nav.php:138
+msgid "Admin"
+msgstr "Administration"
-#: ../../include/group.php:213
-msgid "Edit group"
-msgstr "Gruppe bearbeiten"
+#: ../../include/nav.php:138
+msgid "Site setup and configuration"
+msgstr "Einstellungen der Seite und Konfiguration"
-#: ../../include/group.php:214
-msgid "Create a new group"
-msgstr "Neue Gruppe erstellen"
+#: ../../include/nav.php:161
+msgid "Nothing new here"
+msgstr "Keine Neuigkeiten."
#: ../../include/contact_widgets.php:6
msgid "Add New Contact"
@@ -4946,766 +5119,519 @@ msgstr "Netzwerke"
msgid "All Networks"
msgstr "Alle Netzwerke"
-#: ../../addon/facebook/facebook.php:337
-msgid "Facebook disabled"
-msgstr "Facebook deaktiviert"
-
-#: ../../addon/facebook/facebook.php:342
-msgid "Updating contacts"
-msgstr "Aktualisiere Kontakte"
-
-#: ../../addon/facebook/facebook.php:351
-msgid "Facebook API key is missing."
-msgstr "Facebook-API-Schlüssel nicht gefunden"
-
-#: ../../addon/facebook/facebook.php:358
-msgid "Facebook Connect"
-msgstr "Mit Facebook verbinden"
-
-#: ../../addon/facebook/facebook.php:364
-msgid "Install Facebook connector for this account."
-msgstr "Facebook-Connector für diesen Account installieren."
-
-#: ../../addon/facebook/facebook.php:371
-msgid "Remove Facebook connector"
-msgstr "Facebook-Connector entfernen"
-
-#: ../../addon/facebook/facebook.php:376
-msgid ""
-"Re-authenticate [This is necessary whenever your Facebook password is "
-"changed.]"
-msgstr ""
-"Neu authentifizieren [Das ist immer dann nötig, wenn Du Dein Facebook-"
-"Passwort geändert hast.]"
-
-#: ../../addon/facebook/facebook.php:383
-msgid "Post to Facebook by default"
-msgstr "Veröffentliche standardmäßig bei Facebook"
-
-#: ../../addon/facebook/facebook.php:387
-msgid "Link all your Facebook friends and conversations on this website"
-msgstr ""
-"All meine Facebook-Kontakte und -Konversationen hier auf diese Website "
-"importieren"
-
-#: ../../addon/facebook/facebook.php:389
-msgid ""
-"Facebook conversations consist of your <em>profile wall</em> and your friend"
-" <em>stream</em>."
-msgstr ""
-"Facebook-Konversationen sind alles, was auf deiner <em>Pinnwand</em> "
-"erscheint, und die Beiträge deiner Freunde <em>(Stream).</em>"
-
-#: ../../addon/facebook/facebook.php:390
-msgid "On this website, your Facebook friend stream is only visible to you."
-msgstr ""
-"Hier auf dieser Webseite kannst nur du die Beiträge Deiner Facebook-Freunde "
-"(Stream) sehen."
-
-#: ../../addon/facebook/facebook.php:391
-msgid ""
-"The following settings determine the privacy of your Facebook profile wall "
-"on this website."
-msgstr ""
-"Mit den folgenden Einstellungen kannst Du die Privatsphäre der Kopie Deiner "
-"Facebook-Pinnwand hier auf dieser Seite einstellen."
-
-#: ../../addon/facebook/facebook.php:395
-msgid ""
-"On this website your Facebook profile wall conversations will only be "
-"visible to you"
-msgstr ""
-"Meine Facebook-Pinnwand hier auf dieser Webseite nur für mich sichtbar "
-"machen"
+#: ../../include/auth.php:29
+msgid "Logged out."
+msgstr "Abgemeldet."
-#: ../../addon/facebook/facebook.php:400
-msgid "Do not import your Facebook profile wall conversations"
-msgstr "Facebook-Pinnwand nicht importieren"
+#: ../../include/datetime.php:43 ../../include/datetime.php:45
+msgid "Miscellaneous"
+msgstr "Verschiedenes"
-#: ../../addon/facebook/facebook.php:402
-msgid ""
-"If you choose to link conversations and leave both of these boxes unchecked,"
-" your Facebook profile wall will be merged with your profile wall on this "
-"website and your privacy settings on this website will be used to determine "
-"who may see the conversations."
-msgstr ""
-"Wenn Du Facebook-Konversationen importierst und diese beiden Häkchen nicht "
-"setzt, wird Deine Facebook-Pinnwand mit der Pinnwand hier auf dieser "
-"Webseite vereinigt. Die Privatsphäre-Einstellungen für Deine Pinnwand auf "
-"dieser Webseite geben dann an, wer die Konversationen sehen kann."
+#: ../../include/datetime.php:121 ../../include/datetime.php:253
+msgid "year"
+msgstr "Jahr"
-#: ../../addon/facebook/facebook.php:407
-msgid "Comma separated applications to ignore"
-msgstr "Komma separierte Liste von Anwendungen die ignoriert werden sollen"
+#: ../../include/datetime.php:126 ../../include/datetime.php:254
+msgid "month"
+msgstr "Monat"
-#: ../../addon/facebook/facebook.php:476
-msgid "Facebook Connector Settings"
-msgstr "Facebook-Verbindungseinstellungen"
+#: ../../include/datetime.php:131 ../../include/datetime.php:256
+msgid "day"
+msgstr "Tag"
-#: ../../addon/facebook/facebook.php:490
-msgid "Post to Facebook"
-msgstr "Bei Facebook veröffentlichen"
+#: ../../include/datetime.php:244
+msgid "never"
+msgstr "nie"
-#: ../../addon/facebook/facebook.php:581
-msgid ""
-"Post to Facebook cancelled because of multi-network access permission "
-"conflict."
-msgstr ""
-"Beitrag wurde nicht bei Facebook veröffentlicht, da Konflikte bei den Multi-"
-"Netzwerk-Zugriffsrechten vorliegen."
+#: ../../include/datetime.php:250
+msgid "less than a second ago"
+msgstr "vor weniger als einer Sekunde"
-#: ../../addon/facebook/facebook.php:644
-msgid "Image: "
-msgstr "Bild: "
+#: ../../include/datetime.php:253
+msgid "years"
+msgstr "Jahre"
-#: ../../addon/facebook/facebook.php:720
-msgid "View on Friendica"
-msgstr "In Friendica betrachten"
+#: ../../include/datetime.php:254
+msgid "months"
+msgstr "Monate"
-#: ../../addon/facebook/facebook.php:744
-msgid "Facebook post failed. Queued for retry."
-msgstr ""
-"Veröffentlichung bei Facebook gescheitert. Wir versuchen es später erneut."
+#: ../../include/datetime.php:255
+msgid "week"
+msgstr "Woche"
-#: ../../addon/wppost/wppost.php:41
-msgid "Post to Wordpress"
-msgstr "Bei WordPress veröffentlichen"
+#: ../../include/datetime.php:255
+msgid "weeks"
+msgstr "Wochen"
-#: ../../addon/wppost/wppost.php:73
-msgid "WordPress Post Settings"
-msgstr "WordPress-Beitragseinstellungen"
+#: ../../include/datetime.php:256
+msgid "days"
+msgstr "Tage"
-#: ../../addon/wppost/wppost.php:75
-msgid "Enable WordPress Post Plugin"
-msgstr "WordPress-Plugin aktivieren."
+#: ../../include/datetime.php:257
+msgid "hour"
+msgstr "Stunde"
-#: ../../addon/wppost/wppost.php:80
-msgid "WordPress username"
-msgstr "WordPress-Benutzername"
+#: ../../include/datetime.php:257
+msgid "hours"
+msgstr "Stunden"
-#: ../../addon/wppost/wppost.php:85
-msgid "WordPress password"
-msgstr "WordPress-Passwort"
+#: ../../include/datetime.php:258
+msgid "minute"
+msgstr "Minute"
-#: ../../addon/wppost/wppost.php:90
-msgid "WordPress API URL"
-msgstr "WordPress-API-URL"
+#: ../../include/datetime.php:258
+msgid "minutes"
+msgstr "Minuten"
-#: ../../addon/wppost/wppost.php:95
-msgid "Post to WordPress by default"
-msgstr "Standardmäßig auf WordPress veröffentlichen"
+#: ../../include/datetime.php:259
+msgid "second"
+msgstr "Sekunde"
-#: ../../addon/wppost/wppost.php:171 ../../addon/tumblr/tumblr.php:174
-#: ../../addon/posterous/posterous.php:172
-msgid "Post from Friendica"
-msgstr "Beitrag via Friendica"
+#: ../../include/datetime.php:259
+msgid "seconds"
+msgstr "Sekunden"
-#: ../../addon/uhremotestorage/uhremotestorage.php:56
+#: ../../include/datetime.php:267
#, php-format
-msgid ""
-"Allow to use your friendika id (%s) to connecto to external unhosted-enabled"
-" storage (like ownCloud)"
-msgstr ""
-"Erlaube die Verwendung deiner friendica ID (%s) zu externen unhosted-fähigen"
-" Speichern (wie z.B. ownCloud) zu verbinden."
-
-#: ../../addon/uhremotestorage/uhremotestorage.php:57
-msgid "Unhosted DAV storage url"
-msgstr "Unhosted DAV Speicher-URL"
-
-#: ../../addon/tumblr/tumblr.php:35
-msgid "Post to Tumblr"
-msgstr "Bei Tumblr veröffentlichen"
-
-#: ../../addon/tumblr/tumblr.php:66
-msgid "Tumblr Post Settings"
-msgstr "Tumblr-Beitragseinstellungen"
-
-#: ../../addon/tumblr/tumblr.php:68
-msgid "Enable Tumblr Post Plugin"
-msgstr "Tumblr-Plugin aktivieren"
-
-#: ../../addon/tumblr/tumblr.php:73
-msgid "Tumblr login"
-msgstr "Tumblr Login"
+msgid "%1$d %2$s ago"
+msgstr "%1$d %2$s her"
-#: ../../addon/tumblr/tumblr.php:78
-msgid "Tumblr password"
-msgstr "Tumblr Passwort"
-
-#: ../../addon/tumblr/tumblr.php:83
-msgid "Post to Tumblr by default"
-msgstr "Standardmäßig bei Tumblr veröffentlichen"
-
-#: ../../addon/oembed/oembed.php:30
-msgid "OEmbed settings updated"
-msgstr "OEmbed Einstellungen aktualisiert."
-
-#: ../../addon/oembed/oembed.php:43
-msgid "Use OEmbed for YouTube videos"
-msgstr "OEmbed für Youtube Videos verwenden"
+#: ../../include/poller.php:459
+msgid "From: "
+msgstr "Von: "
-#: ../../addon/oembed/oembed.php:71
-msgid "URL to embed:"
-msgstr "URL zum Einbetten:"
+#: ../../include/bbcode.php:166 ../../include/bbcode.php:225
+msgid "Image/photo"
+msgstr "Bild/Foto"
-#: ../../addon/posterous/posterous.php:35
-msgid "Post to Posterous"
-msgstr "Nach Posterous senden"
+#: ../../include/dba.php:39
+#, php-format
+msgid "Cannot locate DNS info for database server '%s'"
+msgstr "Kann die DNS Informationen für den Datenbanken Server '%s' nicht ermitteln."
-#: ../../addon/posterous/posterous.php:66
-msgid "Posterous Post Settings"
-msgstr "Posterous Beitrags-Einstellungen"
+#: ../../include/message.php:14
+msgid "[no subject]"
+msgstr "[kein Betreff]"
-#: ../../addon/posterous/posterous.php:68
-msgid "Enable Posterous Post Plugin"
-msgstr "Posterous-Plugin aktivieren"
+#: ../../include/acl_selectors.php:279
+msgid "Visible to everybody"
+msgstr "Für jeden sichtbar"
-#: ../../addon/posterous/posterous.php:73
-msgid "Posterous login"
-msgstr "Posterous-Anmeldename"
+#: ../../include/acl_selectors.php:280
+msgid "show"
+msgstr "zeigen"
-#: ../../addon/posterous/posterous.php:78
-msgid "Posterous password"
-msgstr "Posterous-Passwort"
+#: ../../include/acl_selectors.php:281
+msgid "don't show"
+msgstr "nicht zeigen"
-#: ../../addon/posterous/posterous.php:83
-msgid "Post to Posterous by default"
-msgstr "Veröffentliche öffentliche Beiträge standardmäßig bei Posterous"
+#: ../../include/enotify.php:8
+msgid "Friendica Notification"
+msgstr "Friendica-Benachrichtigung"
-#: ../../addon/js_upload/js_upload.php:43
-msgid "Upload a file"
-msgstr "Datei hochladen"
+#: ../../include/enotify.php:11
+msgid "Thank You,"
+msgstr "Danke,"
-#: ../../addon/js_upload/js_upload.php:44
-msgid "Drop files here to upload"
-msgstr "Ziehe die Dateien hierher die du hochladen willst"
+#: ../../include/enotify.php:13
+#, php-format
+msgid "%s Administrator"
+msgstr "der Administrator von %s"
-#: ../../addon/js_upload/js_upload.php:46
-msgid "Failed"
-msgstr "Fehlgeschlagen"
+#: ../../include/enotify.php:28
+#, php-format
+msgid "New mail received at %s"
+msgstr "Neue Nachricht auf %s empfangen"
-#: ../../addon/js_upload/js_upload.php:294
-msgid "No files were uploaded."
-msgstr "Keine Dateien hochgeladen."
+#: ../../include/enotify.php:30
+#, php-format
+msgid "%s sent you a new private message at %s."
+msgstr "%s hat dir eine neue private Nachricht auf %s geschrieben."
-#: ../../addon/js_upload/js_upload.php:300
-msgid "Uploaded file is empty"
-msgstr "Hochgeladene Datei ist leer"
+#: ../../include/enotify.php:32
+#, php-format
+msgid "Please visit %s to view and/or reply to your private messages."
+msgstr "Bitte besuche %s, um deine privaten Nachrichten anzusehen und/oder zu beantworten."
-#: ../../addon/js_upload/js_upload.php:323
-msgid "File has an invalid extension, it should be one of "
-msgstr ""
-"Die Dateierweiterung ist nicht erlaubt, sie muss eine der folgenden sein "
+#: ../../include/enotify.php:40
+#, php-format
+msgid "%s commented on an item at %s"
+msgstr "%s kommentierte einen Beitrag auf %s"
-#: ../../addon/js_upload/js_upload.php:334
-msgid "Upload was cancelled, or server error encountered"
-msgstr "Upload abgebrochen oder Serverfehler aufgetreten"
+#: ../../include/enotify.php:41
+#, php-format
+msgid "%s commented on an item/conversation you have been following."
+msgstr "%s hat einen Beitrag kommentiert, dem du folgst."
-#: ../../addon/buglink/buglink.php:15
-msgid "Report Bug"
-msgstr "Fehlerreport erstellen"
+#: ../../include/enotify.php:42 ../../include/enotify.php:51
+#: ../../include/enotify.php:60 ../../include/enotify.php:69
+#, php-format
+msgid "Please visit %s to view and/or reply to the conversation."
+msgstr "Bitte besuche %s, um die Konversation anzusehen und/oder zu kommentieren."
-#: ../../addon/statusnet/statusnet.php:141
-msgid "Post to StatusNet"
-msgstr "Bei StatusNet veröffentlichen"
+#: ../../include/enotify.php:49
+#, php-format
+msgid "%s posted to your profile wall at %s"
+msgstr "%s hat auf deine Pinnwand bei %s gepostet"
-#: ../../addon/statusnet/statusnet.php:183
-msgid ""
-"Please contact your site administrator.<br />The provided API URL is not "
-"valid."
-msgstr ""
-"Bitte kontaktiere den Administrator des Servers.<br />Die angegebene API-URL"
-" ist nicht gültig."
+#: ../../include/enotify.php:58
+#, php-format
+msgid "%s tagged you at %s"
+msgstr "%s hat dich auf %s erwähnt"
-#: ../../addon/statusnet/statusnet.php:211
-msgid "We could not contact the StatusNet API with the Path you entered."
-msgstr ""
-"Die StatusNet-API konnte mit dem angegebenen Pfad nicht erreicht werden."
+#: ../../include/enotify.php:67
+#, php-format
+msgid "%s tagged your post at %s"
+msgstr "%s hat deinen Beitrag auf %s getaggt"
-#: ../../addon/statusnet/statusnet.php:238
-msgid "StatusNet settings updated."
-msgstr "StatusNet Einstellungen aktualisiert."
+#: ../../include/enotify.php:76
+#, php-format
+msgid "Introduction received at %s"
+msgstr "Kontaktanfrage auf %s erhalten"
-#: ../../addon/statusnet/statusnet.php:261
-msgid "StatusNet Posting Settings"
-msgstr "StatusNet-Beitragseinstellungen"
+#: ../../include/enotify.php:77
+#, php-format
+msgid "You've received an introduction from '%s' at %s"
+msgstr "Du hast eine Kontaktanfrage von '%s' auf %s erhalten"
-#: ../../addon/statusnet/statusnet.php:275
-msgid "Globally Available StatusNet OAuthKeys"
-msgstr "Verfügbare OAuth Schlüssel für StatusNet"
+#: ../../include/enotify.php:78 ../../include/enotify.php:91
+#, php-format
+msgid "You may visit their profile at %s"
+msgstr "Hier kannst du das Profil betrachten: %s"
-#: ../../addon/statusnet/statusnet.php:276
-msgid ""
-"There are preconfigured OAuth key pairs for some StatusNet servers "
-"available. If you are useing one of them, please use these credentials. If "
-"not feel free to connect to any other StatusNet instance (see below)."
-msgstr ""
-"Für einige StatusNet Server sind OAuth Schlüsselpaare verfügbar. Solltest du"
-" einen dieser Server benutzen, dann verwende doch bitte diese Schlüssel. "
-"Falls nicht kannst du weiter unten deine eigenen OAuth Schlüssel eintragen."
+#: ../../include/enotify.php:80
+#, php-format
+msgid "Please visit %s to approve or reject the introduction."
+msgstr "Bitte besuche %s, um die Kontaktanfrage anzunehmen oder abzulehnen."
-#: ../../addon/statusnet/statusnet.php:284
-msgid "Provide your own OAuth Credentials"
-msgstr "Eigene OAuth Schlüssel eintragen"
+#: ../../include/enotify.php:87
+#, php-format
+msgid "Friend suggestion received at %s"
+msgstr "Kontaktvorschlag empfangen auf %s"
-#: ../../addon/statusnet/statusnet.php:285
-msgid ""
-"No consumer key pair for StatusNet found. Register your Friendica Account as"
-" an desktop client on your StatusNet account, copy the consumer key pair "
-"here and enter the API base root.<br />Before you register your own OAuth "
-"key pair ask the administrator if there is already a key pair for this "
-"Friendica installation at your favorited StatusNet installation."
-msgstr ""
-"Kein Consumer-Schlüsselpaar für StatusNet gefunden. Registriere deinen "
-"Friendica-Account als Desktop-Client, kopiere das Consumer-Schlüsselpaar "
-"hierher und gib die API-URL ein.<br />Bevor du dein eigenes Consumer-"
-"Schlüsselpaar registrierst, frage den Administrator dieses Friendica-"
-"Servers, ob schon ein Schlüsselpaar für diesen Friendica-Server auf diesem "
-"StatusNet-Server existiert."
-
-#: ../../addon/statusnet/statusnet.php:287
-msgid "OAuth Consumer Key"
-msgstr "OAuth Consumer Key"
+#: ../../include/enotify.php:88
+#, php-format
+msgid "You've received a friend suggestion from '%s' at %s"
+msgstr "Du hast von '%s' einen Kontaktvorschlag erhalten auf %s"
-#: ../../addon/statusnet/statusnet.php:290
-msgid "OAuth Consumer Secret"
-msgstr "OAuth Consumer Secret"
+#: ../../include/enotify.php:89
+msgid "Name:"
+msgstr "Name:"
-#: ../../addon/statusnet/statusnet.php:293
-msgid "Base API Path (remember the trailing /)"
-msgstr "Basis-URL der StatusNet-API (vergiss den abschließenden / nicht)"
+#: ../../include/enotify.php:90
+msgid "Photo:"
+msgstr "Foto:"
-#: ../../addon/statusnet/statusnet.php:314
-msgid ""
-"To connect to your StatusNet account click the button below to get a "
-"security code from StatusNet which you have to copy into the input box below"
-" and submit the form. Only your <strong>public</strong> posts will be posted"
-" to StatusNet."
-msgstr ""
-"Um deinen Account mit einem StatusNet-Account zu verknüpfen, klicke den "
-"Button an, um einen Sicherheitscode von StatusNet zu erhalten, und kopiere "
-"diesen in das Eingabefeld weiter unten. Es werden ausschließlich deine "
-"<strong>öffentlichen</strong> Nachrichten an StatusNet gesendet."
+#: ../../include/enotify.php:93
+#, php-format
+msgid "Please visit %s to approve or reject the suggestion."
+msgstr "Bitte besuche %s, um den Vorschlag zu akzeptieren oder abzulehnen."
-#: ../../addon/statusnet/statusnet.php:315
-msgid "Log in with StatusNet"
-msgstr "Bei StatusNet anmelden"
+#: ../../include/items.php:2450
+msgid "A new person is sharing with you at "
+msgstr "Eine neue Person teilt mit dir auf "
-#: ../../addon/statusnet/statusnet.php:317
-msgid "Copy the security code from StatusNet here"
-msgstr "Kopiere den Sicherheitscode von StatusNet hier hin"
+#: ../../include/items.php:2450
+msgid "You have a new follower at "
+msgstr "Du hast einen neuen Kontakt auf "
-#: ../../addon/statusnet/statusnet.php:323
-msgid "Cancel Connection Process"
-msgstr "Verbindungsprozess abbrechen"
+#: ../../include/bb2diaspora.php:64
+msgid "view full size"
+msgstr "Volle Größe anzeigen"
-#: ../../addon/statusnet/statusnet.php:325
-msgid "Current StatusNet API is"
-msgstr "Derzeitige StatusNet-API-URL lautet"
+#: ../../include/bb2diaspora.php:113 ../../include/bb2diaspora.php:123
+#: ../../include/bb2diaspora.php:124
+msgid "image/photo"
+msgstr "Bild/Foto"
-#: ../../addon/statusnet/statusnet.php:326
-msgid "Cancel StatusNet Connection"
-msgstr "Verbindung zum StatusNet Server abbrechen"
+#: ../../include/security.php:20
+msgid "Welcome "
+msgstr "Willkommen "
-#: ../../addon/statusnet/statusnet.php:337 ../../addon/twitter/twitter.php:188
-msgid "Currently connected to: "
-msgstr "Momentan verbunden mit: "
+#: ../../include/security.php:21
+msgid "Please upload a profile photo."
+msgstr "Bitte lade ein Profilbild hoch."
-#: ../../addon/statusnet/statusnet.php:338
-msgid ""
-"If enabled all your <strong>public</strong> postings can be posted to the "
-"associated StatusNet account. You can choose to do so by default (here) or "
-"for every posting separately in the posting options when writing the entry."
-msgstr ""
-"Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf "
-"dem verbundenen StatusNet Konto veröffentlicht werden. Du kannst das (hier) "
-"als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den "
-"Beitragsoptionen festlegen."
+#: ../../include/security.php:24
+msgid "Welcome back "
+msgstr "Willkommen zurück "
-#: ../../addon/statusnet/statusnet.php:340
-msgid "Allow posting to StatusNet"
-msgstr "Veröffentlichung bei StatusNet erlauben"
+#: ../../include/Contact.php:131 ../../include/conversation.php:744
+msgid "View status"
+msgstr "Status anzeigen"
-#: ../../addon/statusnet/statusnet.php:343
-msgid "Send public postings to StatusNet by default"
-msgstr "Veröffentliche öffentliche Beiträge standardmäßig bei StatusNet"
+#: ../../include/Contact.php:132 ../../include/conversation.php:745
+msgid "View profile"
+msgstr "Profil anzeigen"
-#: ../../addon/statusnet/statusnet.php:348 ../../addon/twitter/twitter.php:199
-msgid "Clear OAuth configuration"
-msgstr "OAuth-Konfiguration löschen"
+#: ../../include/Contact.php:133 ../../include/conversation.php:746
+msgid "View photos"
+msgstr "Fotos ansehen"
-#: ../../addon/statusnet/statusnet.php:478
-msgid "API URL"
-msgstr "API-URL"
+#: ../../include/Contact.php:134 ../../include/Contact.php:147
+#: ../../include/conversation.php:747
+msgid "View recent"
+msgstr "Neueste anzeigen"
-#: ../../addon/widgets/widgets.php:55
-msgid "Generate new key"
-msgstr "Neuen Schlüssel erstellen"
+#: ../../include/Contact.php:136 ../../include/Contact.php:147
+#: ../../include/conversation.php:749
+msgid "Send PM"
+msgstr "Private Nachricht senden"
-#: ../../addon/widgets/widgets.php:58
-msgid "Widgets key"
-msgstr "Widgets Schlüssel"
+#: ../../include/conversation.php:141
+msgid "post/item"
+msgstr "Nachricht/Beitrag"
-#: ../../addon/widgets/widgets.php:60
-msgid "Widgets available"
-msgstr "Verfügbare Widgets"
+#: ../../include/conversation.php:142
+#, php-format
+msgid "%1$s marked %2$s's %3$s as favorite"
+msgstr "%1$s hat %2$s\\s %3$s als Favorit markiert"
-#: ../../addon/widgets/widget_friends.php:40
-msgid "Connect on Friendica!"
-msgstr "In Friendica verbinden!"
+#: ../../include/conversation.php:279 ../../include/conversation.php:535
+msgid "Select"
+msgstr "Auswählen"
-#: ../../addon/widgets/widget_like.php:58
+#: ../../include/conversation.php:294 ../../include/conversation.php:623
+#: ../../include/conversation.php:624
#, php-format
-msgid "%d person likes this"
-msgid_plural "%d people like this"
-msgstr[0] "%d Person mag das"
-msgstr[1] "%d Leuten mögen das"
+msgid "View %s's profile @ %s"
+msgstr "Das Profil von %s auf %s betrachten."
-#: ../../addon/widgets/widget_like.php:61
+#: ../../include/conversation.php:303 ../../include/conversation.php:635
#, php-format
-msgid "%d person doesn't like this"
-msgid_plural "%d people don't like this"
-msgstr[0] " %d Person mag das nicht"
-msgstr[1] "%d Leute mögen das nicht"
-
-#: ../../addon/twitter/twitter.php:78
-msgid "Post to Twitter"
-msgstr "Bei Twitter veröffentlichen"
-
-#: ../../addon/twitter/twitter.php:123
-msgid "Twitter settings updated."
-msgstr "Twitter Einstellungen aktualisiert."
-
-#: ../../addon/twitter/twitter.php:145
-msgid "Twitter Posting Settings"
-msgstr "Twitter-Beitragseinstellungen"
-
-#: ../../addon/twitter/twitter.php:152
-msgid ""
-"No consumer key pair for Twitter found. Please contact your site "
-"administrator."
-msgstr ""
-"Kein Consumer-Schlüsselpaar für Twitter gefunden. Bitte wende dich an den "
-"Administrator der Seite."
-
-#: ../../addon/twitter/twitter.php:171
-msgid ""
-"At this Friendica instance the Twitter plugin was enabled but you have not "
-"yet connected your account to your Twitter account. To do so click the "
-"button below to get a PIN from Twitter which you have to copy into the input"
-" box below and submit the form. Only your <strong>public</strong> posts will"
-" be posted to Twitter."
-msgstr ""
-"Auf diesem Friendica-Server wurde das Twitter-Plugin aktiviert, aber du hast"
-" deinen Account noch nicht mit deinem Twitter-Account verbunden. Klicke dazu"
-" die Schaltfläche unten. Du erhältst dann eine PIN von Twitter, die du in "
-"das Eingabefeld unten kopieren musst. Nicht vergessen, den Senden-Knopf zu "
-"drücken! Nur <strong>öffentliche</strong> Beiträge werden bei Twitter "
-"veröffentlicht."
-
-#: ../../addon/twitter/twitter.php:172
-msgid "Log in with Twitter"
-msgstr "bei Twitter anmelden"
-
-#: ../../addon/twitter/twitter.php:174
-msgid "Copy the PIN from Twitter here"
-msgstr "Kopiere die Twitter-PIN hier her"
-
-#: ../../addon/twitter/twitter.php:189
-msgid ""
-"If enabled all your <strong>public</strong> postings can be posted to the "
-"associated Twitter account. You can choose to do so by default (here) or for"
-" every posting separately in the posting options when writing the entry."
-msgstr ""
-"Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf "
-"dem verbundenen Twitter Konto veröffentlicht werden. Du kannst dies (hier) "
-"als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den "
-"Beitragsoptionen festlegen."
-
-#: ../../addon/twitter/twitter.php:191
-msgid "Allow posting to Twitter"
-msgstr "Veröffentlichung bei Twitter erlauben"
-
-#: ../../addon/twitter/twitter.php:194
-msgid "Send public postings to Twitter by default"
-msgstr "Veröffentliche öffentliche Beiträge standardmäßig bei Twitter"
-
-#: ../../addon/twitter/twitter.php:301
-msgid "Consumer key"
-msgstr "Consumer Key"
-
-#: ../../addon/twitter/twitter.php:302
-msgid "Consumer secret"
-msgstr "Consumer Secret"
-
-#: ../../addon/impressum/impressum.php:25
-msgid "Impressum"
-msgstr "Impressum"
-
-#: ../../addon/impressum/impressum.php:38
-#: ../../addon/impressum/impressum.php:40
-#: ../../addon/impressum/impressum.php:70
-msgid "Site Owner"
-msgstr "Betreiber der Seite"
+msgid "%s from %s"
+msgstr "%s von %s"
-#: ../../addon/impressum/impressum.php:38
-#: ../../addon/impressum/impressum.php:74
-msgid "Email Address"
-msgstr "Email Adresse"
+#: ../../include/conversation.php:319
+msgid "View in context"
+msgstr "Im Zusammenhang betrachten"
-#: ../../addon/impressum/impressum.php:43
-#: ../../addon/impressum/impressum.php:72
-msgid "Postal Address"
-msgstr "Postalische Anschrift"
+#: ../../include/conversation.php:434
+#, php-format
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] "%d Kommentar"
+msgstr[1] "%d Kommentare"
-#: ../../addon/impressum/impressum.php:49
-msgid ""
-"The impressum addon needs to be configured!<br />Please add at least the "
-"<tt>owner</tt> variable to your config file. For other variables please "
-"refer to the README file of the addon."
-msgstr ""
-"Das Impressums-Plugin muss noch konfiguriert werden.<br />Bitte gebe "
-"mindestens den <tt>Betreiber</tt> in der Konfiguration an. Alle weiteren "
-"Parameter werden in der README-Datei des Addons erläutert."
+#: ../../include/conversation.php:437 ../../boot.php:444
+msgid "show more"
+msgstr "mehr anzeigen"
-#: ../../addon/impressum/impressum.php:71
-msgid "Site Owners Profile"
-msgstr "Profil des Seitenbetreibers"
+#: ../../include/conversation.php:497
+msgid "like"
+msgstr "mag ich"
-#: ../../addon/impressum/impressum.php:73
-msgid "Notes"
-msgstr "Hinweise"
+#: ../../include/conversation.php:498
+msgid "dislike"
+msgstr "mag ich nicht"
-#: ../../addon/tictac/tictac.php:20
-msgid "Three Dimensional Tic-Tac-Toe"
-msgstr "Dreidimensionales Tic-Tac-Toe"
+#: ../../include/conversation.php:500
+msgid "Share this"
+msgstr "Teilen"
-#: ../../addon/tictac/tictac.php:53
-msgid "3D Tic-Tac-Toe"
-msgstr "3D Tic-Tac-Toe"
+#: ../../include/conversation.php:500
+msgid "share"
+msgstr "Teilen"
-#: ../../addon/tictac/tictac.php:58
-msgid "New game"
-msgstr "Neues Spiel"
+#: ../../include/conversation.php:545
+msgid "add star"
+msgstr "markieren"
-#: ../../addon/tictac/tictac.php:59
-msgid "New game with handicap"
-msgstr "Neues Handicap Spiel"
+#: ../../include/conversation.php:546
+msgid "remove star"
+msgstr "Markierung entfernen"
-#: ../../addon/tictac/tictac.php:60
-msgid ""
-"Three dimensional tic-tac-toe is just like the traditional game except that "
-"it is played on multiple levels simultaneously. "
-msgstr ""
-"3D-Tic-Tac-Toe ist genauso wie das herkömmliche Spiel, nur dass man es auf "
-"mehreren Ebenen gleichzeitig spielt."
+#: ../../include/conversation.php:547
+msgid "toggle star status"
+msgstr "Markierung umschalten"
-#: ../../addon/tictac/tictac.php:61
-msgid ""
-"In this case there are three levels. You win by getting three in a row on "
-"any level, as well as up, down, and diagonally across the different levels."
-msgstr ""
-"In diesem Fall sind es drei Ebenen. Man gewinnt indem man drei in einer "
-"Reihe auf einer beliebigen Reihe schafft, oder drei übereinander oder "
-"diagonal auf verschiedenen Ebenen."
+#: ../../include/conversation.php:550
+msgid "starred"
+msgstr "markiert"
-#: ../../addon/tictac/tictac.php:63
-msgid ""
-"The handicap game disables the center position on the middle level because "
-"the player claiming this square often has an unfair advantage."
-msgstr ""
-"Beim Handicap-Spiel wird die zentrale Position der mittleren Ebene gesperrt "
-"da der Spieler der diese Ebene besitzt oft einen unfairen Vorteil genießt."
+#: ../../include/conversation.php:551
+msgid "add tag"
+msgstr "Tag hinzufügen"
-#: ../../addon/tictac/tictac.php:182
-msgid "You go first..."
-msgstr "Du fängst an..."
+#: ../../include/conversation.php:625
+msgid "to"
+msgstr "to"
-#: ../../addon/tictac/tictac.php:187
-msgid "I'm going first this time..."
-msgstr "Diesmal fange ich an..."
+#: ../../include/conversation.php:626
+msgid "Wall-to-Wall"
+msgstr "Wall-to-Wall"
-#: ../../addon/tictac/tictac.php:193
-msgid "You won!"
-msgstr "Du gewinnst!"
+#: ../../include/conversation.php:627
+msgid "via Wall-To-Wall:"
+msgstr "via Wall-To-Wall:"
-#: ../../addon/tictac/tictac.php:199 ../../addon/tictac/tictac.php:224
-msgid "\"Cat\" game!"
-msgstr "Unentschieden!"
+#: ../../include/conversation.php:669
+msgid "Delete Selected Items"
+msgstr "Lösche die markierten Beiträge"
-#: ../../addon/tictac/tictac.php:222
-msgid "I won!"
-msgstr "Ich gewinne!"
+#: ../../include/conversation.php:801
+#, php-format
+msgid "%s likes this."
+msgstr "%s mag das."
-#: ../../addon/piwik/piwik.php:70
-msgid ""
-"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
-"analytics tool."
-msgstr ""
-"Diese Website benutzt <a href='http://www.piwik.org'>Piwik</a>, eine Open "
-"Source-Software zur statistischen Auswertung der Besucherzugriffe."
+#: ../../include/conversation.php:801
+#, php-format
+msgid "%s doesn't like this."
+msgstr "%s mag das nicht."
-#: ../../addon/piwik/piwik.php:73
+#: ../../include/conversation.php:805
#, php-format
-msgid ""
-"If you do not want that your visits are logged this way you <a href='%s'>can"
-" set a cookie to prevent Piwik from tracking further visits of the site</a> "
-"(opt-out)."
-msgstr ""
-"Wenn Du nicht willst, dass Deine Besuche auf diese Weise gespeichert werden,"
-" kannst Du <a href='%s'>ein Cookie setzen</a>. Dann wird Piwik Dich auf "
-"dieser Website nicht mehr verfolgen (opt-out)."
+msgid "<span %1$s>%2$d people</span> like this."
+msgstr "<span %1$s>%2$d Leute</span> mögen das."
-#: ../../addon/piwik/piwik.php:82
-msgid "Piwik Base URL"
-msgstr "Piwik Basis URL"
+#: ../../include/conversation.php:807
+#, php-format
+msgid "<span %1$s>%2$d people</span> don't like this."
+msgstr "<span %1$s>%2$d Leute</span> mögen das nicht."
-#: ../../addon/piwik/piwik.php:83
-msgid "Site ID"
-msgstr "Seiten ID"
+#: ../../include/conversation.php:813
+msgid "and"
+msgstr "und"
-#: ../../addon/piwik/piwik.php:84
-msgid "Show opt-out cookie link?"
-msgstr "Link zum Setzen des Opt-Out Cookies anzeigen?"
+#: ../../include/conversation.php:816
+#, php-format
+msgid ", and %d other people"
+msgstr " und %d andere"
-#: ../../addon/membersince/membersince.php:17
+#: ../../include/conversation.php:817
#, php-format
-msgid " - Member since: %s"
-msgstr " - Mitglied seit: %s"
+msgid "%s like this."
+msgstr "%s mögen das."
-#: ../../addon/communityhome/communityhome.php:29
-msgid "OpenID"
-msgstr "OpenID"
+#: ../../include/conversation.php:817
+#, php-format
+msgid "%s don't like this."
+msgstr "%s mögen das nicht."
-#: ../../addon/communityhome/communityhome.php:38
-msgid "Last users"
-msgstr "Letzte Nutzer"
+#: ../../include/conversation.php:842
+msgid "Visible to <strong>everybody</strong>"
+msgstr "Für <strong>Jedermann</strong> sichtbar"
-#: ../../addon/communityhome/communityhome.php:81
-msgid "Most active users"
-msgstr "Aktivste Nutzer"
+#: ../../include/conversation.php:844
+msgid "Please enter a video link/URL:"
+msgstr "Bitte Link/URL zum Video einfügen:"
-#: ../../addon/communityhome/communityhome.php:98
-msgid "Last photos"
-msgstr "Letzte Fotos"
+#: ../../include/conversation.php:845
+msgid "Please enter an audio link/URL:"
+msgstr "Bitte Link/URL zum Audio einfügen:"
-#: ../../addon/communityhome/communityhome.php:133
-msgid "Last likes"
-msgstr "Zuletzt gemocht"
+#: ../../include/conversation.php:846
+msgid "Tag term:"
+msgstr "Tag:"
-#: ../../addon/pageheader/pageheader.php:47
-msgid "\"pageheader\" Settings"
-msgstr "\"pageheader\"-Einstellungen"
+#: ../../include/conversation.php:847
+msgid "Where are you right now?"
+msgstr "Wo hältst du dich jetzt gerade auf?"
-#: ../../addon/pageheader/pageheader.php:65
-msgid "pageheader Settings saved."
-msgstr "pageheader-Einstellungen gespeichert."
+#: ../../include/conversation.php:848
+msgid "Enter a title for this item"
+msgstr "Gib den Titel für diesen Beitrag ein"
-#: ../../addon/randplace/randplace.php:170
-msgid "Randplace Settings"
-msgstr "Randplace-Einstellungen"
+#: ../../include/conversation.php:891
+msgid "upload photo"
+msgstr "Bild hochladen"
-#: ../../addon/randplace/randplace.php:172
-msgid "Enable Randplace Plugin"
-msgstr "Randplace-Plugin aktivieren"
+#: ../../include/conversation.php:893
+msgid "attach file"
+msgstr "Datei anhängen"
-#: ../../addon/blockem/blockem.php:47
-msgid "\"Blockem\" Settings"
-msgstr "\"Blockem\"-Einstellungen"
+#: ../../include/conversation.php:895
+msgid "web link"
+msgstr "Weblink"
-#: ../../addon/blockem/blockem.php:49
-msgid "Comma separated profile URLS to block"
-msgstr "Profil-URLs, die blockiert werden sollen (durch Kommas getrennt)"
+#: ../../include/conversation.php:896
+msgid "Insert video link"
+msgstr "Video-Adresse einfügen"
-#: ../../addon/blockem/blockem.php:66
-msgid "BLOCKEM Settings saved."
-msgstr "BLOCKEM-Einstellungen gesichert."
+#: ../../include/conversation.php:897
+msgid "video link"
+msgstr "Video-Link"
-#: ../../addon/blockem/blockem.php:104
-#, php-format
-msgid "Blocked %s - Click to open/close"
-msgstr "%s blockiert - Zum Öffnen/Schließen klicken"
+#: ../../include/conversation.php:898
+msgid "Insert audio link"
+msgstr "Audio-Adresse einfügen"
-#: ../../addon/nsfw/nsfw.php:47
-msgid "\"Not Safe For Work\" Settings"
-msgstr "\"Not Safe For Work\"-Einstellungen"
+#: ../../include/conversation.php:899
+msgid "audio link"
+msgstr "Audio-Link"
-#: ../../addon/nsfw/nsfw.php:49
-msgid "Comma separated words to treat as NSFW"
-msgstr "Wörter, die gefiltert werden sollen (durch Kommas getrennt)"
+#: ../../include/conversation.php:901
+msgid "set location"
+msgstr "Ort setzen"
-#: ../../addon/nsfw/nsfw.php:66
-msgid "NSFW Settings saved."
-msgstr "NSFW-Einstellungen gespeichert"
+#: ../../include/conversation.php:903
+msgid "clear location"
+msgstr "Ort löschen"
-#: ../../addon/nsfw/nsfw.php:102
-#, php-format
-msgid "%s - Click to open/close"
-msgstr "%s – Zum Öffnen/Schließen klicken"
+#: ../../include/conversation.php:908
+msgid "permissions"
+msgstr "Zugriffsrechte"
-#: ../../boot.php:437
+#: ../../boot.php:442
msgid "Delete this item?"
msgstr "Diesen Beitrag löschen?"
-#: ../../boot.php:440
+#: ../../boot.php:445
msgid "show fewer"
msgstr "weniger anzeigen"
-#: ../../boot.php:683
+#: ../../boot.php:688
msgid "Create a New Account"
msgstr "Neuen Account erstellen"
-#: ../../boot.php:703
+#: ../../boot.php:708
msgid "Nickname or Email address: "
msgstr "Spitzname oder Email-Adresse: "
-#: ../../boot.php:704
+#: ../../boot.php:709
msgid "Password: "
msgstr "Passwort: "
-#: ../../boot.php:707
+#: ../../boot.php:712
msgid "Or login using OpenID: "
msgstr "Oder melde dich mit deiner OpenID an: "
-#: ../../boot.php:713
+#: ../../boot.php:718
msgid "Forgot your password?"
msgstr "Passwort vergessen?"
-#: ../../boot.php:860
+#: ../../boot.php:875
msgid "Edit profile"
msgstr "Profil bearbeiten"
-#: ../../boot.php:1027 ../../boot.php:1098
+#: ../../boot.php:1042 ../../boot.php:1113
msgid "g A l F d"
msgstr "l. d, F G \\U\\h\\\\r"
-#: ../../boot.php:1028 ../../boot.php:1099
+#: ../../boot.php:1043 ../../boot.php:1114
msgid "F d"
msgstr "d. F"
-#: ../../boot.php:1053
+#: ../../boot.php:1068
msgid "Birthday Reminders"
msgstr "Geburtstagserinnerungen"
-#: ../../boot.php:1054
+#: ../../boot.php:1069
msgid "Birthdays this week:"
msgstr "Geburtstage diese Woche:"
-#: ../../boot.php:1077 ../../boot.php:1141
+#: ../../boot.php:1092 ../../boot.php:1156
msgid "[today]"
msgstr "[heute]"
-#: ../../boot.php:1122
+#: ../../boot.php:1137
msgid "Event Reminders"
msgstr "Veranstaltungserinnerungen"
-#: ../../boot.php:1123
+#: ../../boot.php:1138
msgid "Events this week:"
msgstr "Veranstaltungen diese Woche"
-#: ../../boot.php:1135
+#: ../../boot.php:1150
msgid "[No description]"
msgstr "[keine Beschreibung]"
-
-
diff --git a/view/de/strings.php b/view/de/strings.php
index 391d66ca3..166880f0d 100755
--- a/view/de/strings.php
+++ b/view/de/strings.php
@@ -4,54 +4,289 @@ function string_plural_select_de($n){
return ($n != 1);
}
;
-$a->strings["Permission denied."] = "Zugriff verweigert.";
-$a->strings["Friends of %s"] = "Freunde von %s";
-$a->strings["No friends to display."] = "Keine Freunde zum Anzeigen.";
+$a->strings["Post successful."] = "Beitrag erfolgreich veröffentlicht.";
$a->strings["[Embedded content - reload page to view]"] = "[Eingebetteter Inhalt - Seite neu laden zum Betrachten]";
+$a->strings["Contact settings applied."] = "Einstellungen zum Kontakt angewandt.";
+$a->strings["Contact update failed."] = "Konnte den Kontakt nicht aktualisieren.";
+$a->strings["Permission denied."] = "Zugriff verweigert.";
+$a->strings["Contact not found."] = "Kontakt nicht gefunden.";
+$a->strings["Repair Contact Settings"] = "Kontakt-Einstellungen reparieren";
+$a->strings["<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact may stop working."] = "<strong>ACHTUNG: Das sind Experten-Einstellungen!</strong> Wenn Du etwas falsches eingibst, funktioniert die Kommunikation mit diesem Kontakt evtl. nicht mehr.";
+$a->strings["Please use your browser 'Back' button <strong>now</strong> if you are uncertain what to do on this page."] = "Bitte nutze den Zurück-Button deines Browsers <strong>jetzt</strong>, wenn du dir unsicher bist, was auf dieser Seite gemacht wird.";
+$a->strings["Return to contact editor"] = "Zurück zum Kontakteditor";
+$a->strings["Name"] = "Name";
+$a->strings["Account Nickname"] = "Account-Spitzname";
+$a->strings["@Tagname - overrides Name/Nickname"] = "@Tagname - überschreibt Name/Spitzname";
+$a->strings["Account URL"] = "Account-URL";
+$a->strings["Friend Request URL"] = "URL für Freundschaftsanfragen";
+$a->strings["Friend Confirm URL"] = "URL für Bestätigungen von Freundschaftsanfragen";
+$a->strings["Notification Endpoint URL"] = "URL-Endpunkt für Benachrichtigungen";
+$a->strings["Poll/Feed URL"] = "Pull/Feed-URL";
+$a->strings["New photo from this URL"] = "Neues Foto von dieser URL";
+$a->strings["Submit"] = "Senden";
+$a->strings["Help:"] = "Hilfe:";
+$a->strings["Help"] = "Hilfe";
+$a->strings["Not Found"] = "Nicht gefunden";
+$a->strings["Page not found."] = "Seite nicht gefunden.";
+$a->strings["File exceeds size limit of %d"] = "Die Datei ist größer als das erlaubte Limit von %d";
+$a->strings["File upload failed."] = "Hochladen der Datei fehlgeschlagen.";
+$a->strings["Friend suggestion sent."] = "Kontaktvorschlag gesendet.";
+$a->strings["Suggest Friends"] = "Kontakte vorschlagen";
+$a->strings["Suggest a friend for %s"] = "Schlage %s einen Kontakt vor";
+$a->strings["Event description and start time are required."] = "Ereignis Beschreibung und Startzeit sind erforderlich.";
+$a->strings["Events"] = "Veranstaltungen";
+$a->strings["Create New Event"] = "Neue Veranstaltung erstellen";
+$a->strings["Previous"] = "Vorherige";
+$a->strings["Next"] = "Nächste";
+$a->strings["l, F j"] = "l, F j";
+$a->strings["Edit event"] = "Veranstaltung bearbeiten";
+$a->strings["link to source"] = "Link zum Originalbeitrag";
+$a->strings["hour:minute"] = "Stunde:Minute";
+$a->strings["Event details"] = "Veranstaltungsdetails";
+$a->strings["Format is %s %s. Starting date and Description are required."] = "Format ist %s %s. Anfangsdatum und Beschreibung sind notwendig.";
+$a->strings["Event Starts:"] = "Veranstaltungsbeginn:";
+$a->strings["Finish date/time is not known or not relevant"] = "Enddatum/-zeit ist nicht bekannt oder nicht relevant";
+$a->strings["Event Finishes:"] = "Veranstaltungsende:";
+$a->strings["Adjust for viewer timezone"] = "An Zeitzone des Betrachters anpassen";
+$a->strings["Description:"] = "Beschreibung";
+$a->strings["Location:"] = "Ort:";
+$a->strings["Share this event"] = "Veranstaltung teilen";
+$a->strings["Cancel"] = "Abbrechen";
+$a->strings["Tag removed"] = "Tag entfernt";
+$a->strings["Remove Item Tag"] = "Gegenstands-Tag entfernen";
+$a->strings["Select a tag to remove: "] = "Wähle ein Tag zum Entfernen aus: ";
+$a->strings["Remove"] = "Entfernen";
+$a->strings["%s welcomes %s"] = "%s heißt %s herzlich willkommen";
+$a->strings["Authorize application connection"] = "Verbindung der Applikation authorisieren";
+$a->strings["Return to your app and insert this Securty Code:"] = "Gehe zu deiner Anwendung zurück und trage dort folgenden Sicherheitscode ein:";
+$a->strings["Please login to continue."] = "Bitte melde dich an um fortzufahren.";
+$a->strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Möchtest du dieser Anwendung den Zugriff auf deine Beiträge und Kontakte sowie die Erstellung neuer Beiträge in deinem Namen gestatten?";
+$a->strings["Yes"] = "Ja";
+$a->strings["No"] = "Nein";
+$a->strings["Photo Albums"] = "Fotoalben";
+$a->strings["Contact Photos"] = "Kontaktbilder";
+$a->strings["Upload New Photos"] = "Weitere Fotos hochladen";
+$a->strings["everybody"] = "jeder";
+$a->strings["Contact information unavailable"] = "Kontaktinformationen nicht verfügbar";
+$a->strings["Profile Photos"] = "Profilbilder";
+$a->strings["Album not found."] = "Album nicht gefunden.";
+$a->strings["Delete Album"] = "Album löschen";
+$a->strings["Delete Photo"] = "Foto löschen";
+$a->strings["was tagged in a"] = "wurde getaggt in einem";
+$a->strings["photo"] = "Foto";
+$a->strings["by"] = "von";
+$a->strings["Image exceeds size limit of "] = "Die Bildgröße übersteigt das Limit von ";
+$a->strings["Image file is empty."] = "Bilddatei ist leer.";
+$a->strings["Unable to process image."] = "Konnte das Bild nicht bearbeiten.";
+$a->strings["Image upload failed."] = "Hochladen des Bildes gescheitert.";
$a->strings["Public access denied."] = "Öffentlicher Zugriff verweigert.";
-$a->strings["Global Directory"] = "Weltweites Verzeichnis";
-$a->strings["Normal site view"] = "Normale Seitenansicht";
-$a->strings["Admin - View all site entries"] = "Admin: Alle Einträge dieses Servers anzeigen";
-$a->strings["Find on this site"] = "Auf diesem Server suchen";
-$a->strings["Finding: "] = "Funde: ";
-$a->strings["Site Directory"] = "Verzeichnis";
-$a->strings["Find"] = "Finde";
-$a->strings["Age: "] = "Alter: ";
-$a->strings["Gender: "] = "Geschlecht:";
-$a->strings["No entries (some entries may be hidden)."] = "Keine Einträge (einige Einträge könnten versteckt sein).";
-$a->strings["Item not found."] = "Beitrag nicht gefunden.";
-$a->strings["Access denied."] = "Zugriff verweigert.";
-$a->strings["Welcome to Friendica"] = "Willkommen bei Friendica";
-$a->strings["New Member Checklist"] = "Checkliste für neue Mitglieder";
-$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page."] = "Wir möchten dir einige Tipps und Links anbieten, um deine Erfahrung mit Friendica so angenehm wie möglich zu machen. Klicke einfach einen Aspekt an, um weitere Informationen zu erhalten.";
-$a->strings["On your <em>Settings</em> page - change your initial password. Also make a note of your Identity Address. This will be useful in making friends."] = "Ändere dein anfängliches Passwort auf der <em>Einstellungen</em> Seite. Bei dieser Gelegenheit solltest du dir die Adresse deines Profils merken, diese wird benötigt um mit Anderen in Kontakt zu treten.";
-$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "Überprüfe die restlichen Einstellungen, insbesondere die Einstellungen zur Privatsphäre. Wenn du dein Profil nicht veröffentlichst ist das wie wenn niemand deine Telefonnummer kennt. Im Allgemeinen solltest du es veröffentlichen - außer all deine Freunde und potentiellen Freunde wissen wie man dich findet.";
-$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "Lade ein Profilbild hoch falls du es noch nicht getan hast. Studien haben gezeigt, dass es zehnmal wahrscheinlicher ist neue Freunde zu finden, wenn du ein Bild von dir selbst verwendest als wenn du dies nicht tust.";
-$a->strings["Authorise the Facebook Connector if you currently have a Facebook account and we will (optionally) import all your Facebook friends and conversations."] = "Richte die Verbindung zu Facebook ein, wenn du im Augenblick ein Facebook Konto hast und (optional) deine Facebook Freunde und Unterhaltungen importieren willst.";
-$a->strings["Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "Gib deine E-Mail-Zugangsinformationen auf der Connector-Einstellungsseite ein, falls du E-Mails aus deinem Posteingang importieren und mit Freunden und Mailinglisten interagieren willlst.";
-$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "Editiere dein <strong>Standard</strong> Profil nach deinen Vorlieben. Überprüfe die Einstellungen zum Verbergen deiner Freundesliste vor unbekannten Betrachtern des Profils.";
-$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "Trage ein paar öffentliche Stichwörter in dein Standardprofil ein, die deine Interessen beschreiben. Eventuell sind wir in der Lage Leute zu finden, die deine Interessen teilen und können dir dann Kontakte vorschlagen.";
-$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Add New Contact</em> dialog."] = "Die Kontakte-Seite ist die Einstiegsseite, von der aus du Kontakte verwalten und dich mit Freunden in anderen Netzwerken verbinden kannst. Normalerweise gibst du dazu einfach ihre Adresse oder die URL der Seite im Kasten <em>Neuen Kontakt hinzufügen</em> ein.";
-$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "Ãœber die Verzeichnisseite kannst du andere Personen auf diesem Server oder anderen verteilten Seiten finden. Halte nach einem <em>Verbinden</em> oder <em>Folgen</em> Link auf deren Profilseiten Ausschau und gib deine eigene Profiladresse an falls du danach gefragt wirst.";
-$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "Sobald du einige Freunde gefunden hast, organisiere sie in Gruppen zur privaten Kommunikation im Seitenmenü der Kontakte-Seite. Du kannst dann mit jeder dieser Gruppen von der Netzwerkseite aus privat interagieren.";
-$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "Unsere <strong>Hilfe</strong> Seiten können herangezogen werden, um weitere Einzelheiten zu andern Programm Features zu erhalten.";
+$a->strings["No photos selected"] = "Keine Bilder ausgewählt";
+$a->strings["Access to this item is restricted."] = "Zugriff zu diesem Eintrag wurde eingeschränkt.";
+$a->strings["Upload Photos"] = "Bilder hochladen";
+$a->strings["New album name: "] = "Name des neuen Albums: ";
+$a->strings["or existing album name: "] = "oder existierender Albumname: ";
+$a->strings["Do not show a status post for this upload"] = "Keine Status-Mitteilung für diesen Beitrag anzeigen";
+$a->strings["Permissions"] = "Berechtigungen";
+$a->strings["Edit Album"] = "Album bearbeiten";
+$a->strings["View Photo"] = "Fotos betrachten";
+$a->strings["Permission denied. Access to this item may be restricted."] = "Zugriff verweigert. Zugriff zu diesem Eintrag könnte eingeschränkt sein.";
+$a->strings["Photo not available"] = "Foto nicht verfügbar";
+$a->strings["View photo"] = "Fotos ansehen";
+$a->strings["Edit photo"] = "Foto bearbeiten";
+$a->strings["Use as profile photo"] = "Als Profilbild verwenden";
+$a->strings["Private Message"] = "Private Nachricht";
+$a->strings["View Full Size"] = "Betrachte Originalgröße";
+$a->strings["Tags: "] = "Tags: ";
+$a->strings["[Remove any tag]"] = "[Tag entfernen]";
+$a->strings["New album name"] = "Name des neuen Albums";
+$a->strings["Caption"] = "Bildunterschrift";
+$a->strings["Add a Tag"] = "Tag hinzufügen";
+$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "Beispiel: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping";
+$a->strings["I like this (toggle)"] = "Ich mag das (toggle)";
+$a->strings["I don't like this (toggle)"] = "Ich mag das nicht (toggle)";
+$a->strings["Share"] = "Teilen";
+$a->strings["Please wait"] = "Bitte warten";
+$a->strings["This is you"] = "Das bist du";
+$a->strings["Comment"] = "Kommentar";
+$a->strings["Preview"] = "Vorschau";
+$a->strings["Delete"] = "Löschen";
+$a->strings["View Album"] = "Album betrachten";
+$a->strings["Recent Photos"] = "Neueste Fotos";
+$a->strings["Not available."] = "Nicht verfügbar.";
+$a->strings["Community"] = "Gemeinschaft";
+$a->strings["No results."] = "Keine Ergebnisse.";
+$a->strings["This is Friendica, version"] = "Dies ist Friendica version";
+$a->strings["running at web location"] = "die unter folgender Webadresse zu finden ist";
+$a->strings["Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn more about the Friendica project."] = "Bitte besuche <a href=\"http://friendica.com\">Friendica.com</a> um mehr über das Friendica Projekt zu erfahren.";
+$a->strings["Bug reports and issues: please visit"] = "Probleme oder Fehler gefunden? Bitte besuche";
+$a->strings["Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - dot com"] = "Vorschläge, Lob, Spenden usw.: E-Mail an \"Info\" at Friendica - dot com";
+$a->strings["Installed plugins/addons/apps"] = "Installierte Plugins/Erweiterungen/Apps";
+$a->strings["No installed plugins/addons/apps"] = "Keine Plugins/Erweiterungen/Apps installiert";
+$a->strings["Item not found"] = "Beitrag nicht gefunden";
+$a->strings["Edit post"] = "Beitrag bearbeiten";
+$a->strings["Post to Email"] = "An E-Mail senden";
+$a->strings["Edit"] = "Bearbeiten";
+$a->strings["Upload photo"] = "Foto hochladen";
+$a->strings["Attach file"] = "Datei anhängen";
+$a->strings["Insert web link"] = "Weblink einfügen";
+$a->strings["Insert YouTube video"] = "YouTube-Video einfügen";
+$a->strings["Insert Vorbis [.ogg] video"] = "Vorbis [.ogg] Video einfügen";
+$a->strings["Insert Vorbis [.ogg] audio"] = "Vorbis [.ogg] Audio einfügen";
+$a->strings["Set your location"] = "Deinen Standort festlegen";
+$a->strings["Clear browser location"] = "Browser-Standort leeren";
+$a->strings["Permission settings"] = "Berechtigungseinstellungen";
+$a->strings["CC: email addresses"] = "Cc:-E-Mail-Addressen";
+$a->strings["Public post"] = "Öffentlicher Beitrag";
+$a->strings["Set title"] = "Titel setzen";
+$a->strings["Example: bob@example.com, mary@example.com"] = "Z.B.: bob@example.com, mary@example.com";
+$a->strings["This introduction has already been accepted."] = "Diese Kontaktanfrage wurde bereits akzeptiert.";
+$a->strings["Profile location is not valid or does not contain profile information."] = "Profiladresse ist ungültig oder stellt einige Profildaten nicht zur Verfügung.";
+$a->strings["Warning: profile location has no identifiable owner name."] = "Warnung: Es konnte kein Name des Besitzers von der angegebenen Profiladresse gefunden werden.";
+$a->strings["Warning: profile location has no profile photo."] = "Warnung: Es konnte kein Profilbild bei der angegebenen Profiladresse gefunden werden.";
+$a->strings["%d required parameter was not found at the given location"] = array(
+ 0 => "%d benötigter Parameter wurde an der angegebenen Stelle nicht gefunden",
+ 1 => "%d benötigte Parameter wurden an der angegebenen Stelle nicht gefunden",
+);
+$a->strings["Introduction complete."] = "Kontaktanfrage abgeschlossen.";
+$a->strings["Unrecoverable protocol error."] = "Nicht behebbarer Protokollfehler.";
+$a->strings["Profile unavailable."] = "Profil nicht verfügbar.";
+$a->strings["%s has received too many connection requests today."] = "%s hat heute zu viele Freundschaftsanfragen erhalten.";
+$a->strings["Spam protection measures have been invoked."] = "Maßnahmen zum Spamschutz wurden ergriffen.";
+$a->strings["Friends are advised to please try again in 24 hours."] = "Freunde sind angehalten, es in 24 Stunden erneut zu versuchen.";
+$a->strings["Invalid locator"] = "Ungültiger Locator";
+$a->strings["Unable to resolve your name at the provided location."] = "Konnte deinen Namen an der angegebenen Stelle nicht finden.";
+$a->strings["You have already introduced yourself here."] = "Du hast dich hier bereits vorgestellt.";
+$a->strings["Apparently you are already friends with %s."] = "Es scheint so, als ob du bereits ein Freund von %s bist.";
+$a->strings["Invalid profile URL."] = "Ungültige Profil-URL.";
$a->strings["Disallowed profile URL."] = "Nicht erlaubte Profil-URL.";
-$a->strings["Connect URL missing."] = "Connect-URL fehlt";
-$a->strings["This site is not configured to allow communications with other networks."] = "Diese Seite ist so konfiguriert, dass keine Kommunikation mit anderen Netzwerken erfolgen kann.";
-$a->strings["No compatible communication protocols or feeds were discovered."] = "Es wurden keine kompatiblen Kommunikationsprotokolle oder Feeds gefunden.";
-$a->strings["The profile address specified does not provide adequate information."] = "Die angegebene Profiladresse liefert unzureichende Informationen.";
-$a->strings["An author or name was not found."] = "Es wurde kein Autor oder Name gefunden.";
-$a->strings["No browser URL could be matched to this address."] = "Zu dieser Adresse konnte keine passende Browser URL gefunden werden.";
-$a->strings["The profile address specified belongs to a network which has been disabled on this site."] = "Die Adresse dieses Profils gehört zu einem Netzwerk mit dem die Kommunikation auf dieser Seite ausgeschaltet wurde.";
-$a->strings["Limited profile. This person will be unable to receive direct/personal notifications from you."] = "Eingeschränktes Profil. Diese Person wird keine direkten/privaten Nachrichten von dir erhalten können.";
-$a->strings["Unable to retrieve contact information."] = "Konnte die Kontaktinformationen nicht empfangen.";
-$a->strings["following"] = "folgen";
-$a->strings["People Search"] = "Personen Suche";
+$a->strings["Failed to update contact record."] = "Aktualisierung der Kontaktdaten fehlgeschlagen.";
+$a->strings["Your introduction has been sent."] = "Deine Kontaktanfrage wurde gesendet.";
+$a->strings["Please login to confirm introduction."] = "Bitte melde dich an, um die Kontaktanfrage zu bestätigen.";
+$a->strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "Incorrect identity currently logged in. Please login to <strong>this</strong> profile.";
+$a->strings["Welcome home %s."] = "Willkommen zurück %s.";
+$a->strings["Please confirm your introduction/connection request to %s."] = "Bitte bestätige deine Kontaktanfrage bei %s.";
+$a->strings["Confirm"] = "Bestätigen";
+$a->strings["[Name Withheld]"] = "[Name Zurückgehalten]";
+$a->strings["Diaspora members: Please do not use this form. Instead, enter \"%s\" into your Diaspora search bar."] = "Diaspora-User: Bitte nicht dieses Formular benutzen! Gebt statt dessen \"%s\" in der Diaspora-Suchleiste ein.";
+$a->strings["Please enter your 'Identity Address' from one of the following supported social networks:"] = "Bitte gib die Adresse deines Profils in einem der unterstützten sozialen Netzwerke an:";
+$a->strings["Friend/Connection Request"] = "Freundschafts-/Kontaktanfrage";
+$a->strings["Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"] = "Beispiele: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca";
+$a->strings["Please answer the following:"] = "Bitte beantworte folgende Fragen:";
+$a->strings["Does %s know you?"] = "Kennt %s dich?";
+$a->strings["Add a personal note:"] = "Eine persönliche Notiz anfügen:";
+$a->strings["Friendica"] = "Friendica";
+$a->strings["StatusNet/Federated Social Web"] = "StatusNet/Federated Social Web";
+$a->strings["Diaspora"] = "Diaspora";
+$a->strings["- please share from your own site as noted above"] = "- bitte fange von Deiner eigenen Seite aus zu teilen an";
+$a->strings["Your Identity Address:"] = "Adresse deines Profils:";
+$a->strings["Submit Request"] = "Anfrage abschicken";
+$a->strings["Friendica Social Communications Server - Setup"] = "Friendica-Server für soziale Netzwerke – Setup";
+$a->strings["Database connection"] = "Datenbank-Verbindung";
+$a->strings["Could not connect to database."] = "Verbindung zur Datenbank gescheitert";
+$a->strings["Could not create table."] = "Konnte Tabelle nicht erstellen.";
+$a->strings["Your Friendica site database has been installed."] = "Die Datenbank deiner Friendica Seite wurde installiert.";
+$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "WICHTIG: Du musst [manuell] einen Cronjob (o.ä.) für den Poller einrichten.";
+$a->strings["Please see the file \"INSTALL.txt\"."] = "Lies bitte die \"INSTALL.txt\".";
+$a->strings["Proceed to registration"] = "Mit der Registrierung fortfahren";
+$a->strings["Proceed with Installation"] = "Mit der Installation fortfahren";
+$a->strings["You may need to import the file \"database.sql\" manually using phpmyadmin or mysql."] = "Möglicherweise musst du die Datei \"database.sql\" manuell mit phpmyadmin oder mysql importieren.";
+$a->strings["Database import failed."] = "Import der Datenbank schlug fehl.";
+$a->strings["System check"] = "Systemtest";
+$a->strings["Check again"] = "Noch einmal testen";
+$a->strings["In order to install Friendica we need to know how to connect to your database."] = "Um Friendica installieren zu können müssen wir wissen wie wir zu deiner Datenbank Kontakt aufnehmen können.";
+$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Bitte kontaktiere den Hosting Provider oder den Administrator der Seite, falls du Fragen zu diesen Einstellungen haben solltest.";
+$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "Die Datenbank, die du unten angibst, sollte bereits existieren. Ist dies noch nicht der Fall, erzeuge sie bitte bevor du mit der Installation fortfährst.";
+$a->strings["Database Server Name"] = "Datenbank-Server";
+$a->strings["Database Login Name"] = "Datenbank-Nutzer";
+$a->strings["Database Login Password"] = "Datenbank-Passwort";
+$a->strings["Database Name"] = "Datenbank-Name";
+$a->strings["Site administrator email address"] = "E-Mail-Adresse des Administrators";
+$a->strings["Your account email address must match this in order to use the web admin panel."] = "Die E-Mail-Adresse, die in deinem Friendica-Account eingetragen, muss mit dieser Adresse übereinstimmen, damit du das Admin-Panel benutzen kannst.";
+$a->strings["Please select a default timezone for your website"] = "Bitte wähle die Standardzeitzone deiner Webseite";
+$a->strings["Site settings"] = "Server-Einstellungen";
+$a->strings["Could not find a command line version of PHP in the web server PATH."] = "Konnte keine Kommandozeilenversion von PHP im PATH des Servers finden.";
+$a->strings["PHP executable path"] = "Pfad zu PHP";
+$a->strings["Enter full path to php executable"] = "Kompletter Pfad zum PHP-Executable";
+$a->strings["Command line PHP"] = "Kommadozeilen-PHP";
+$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "Die Kommandozeilenversion von PHP auf deinem System hat \"register_argc_argv\" nicht aktiviert.";
+$a->strings["This is required for message delivery to work."] = "Dies wird für die Auslieferung von Nachrichten benötigt.";
+$a->strings["PHP \"register_argc_argv\""] = "PHP \"register_argc_argv\"";
+$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Fehler: Die Funktion \"openssl_pkey_new\" auf diesem System ist nicht in der Lage, Verschlüsselungsschlüssel zu erzeugen";
+$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Wenn der Server unter Windows läuft, schau dir bitte \"http://www.php.net/manual/en/openssl.installation.php\" an.";
+$a->strings["Generate encryption keys"] = "Schlüssel erzeugen";
+$a->strings["libCurl PHP module"] = "PHP: libCurl-Modul";
+$a->strings["GD graphics PHP module"] = "PHP: GD-Grafikmodul";
+$a->strings["OpenSSL PHP module"] = "PHP: OpenSSL-Modul";
+$a->strings["mysqli PHP module"] = "PHP: mysqli-Modul";
+$a->strings["mb_string PHP module"] = "PHP: mb_string-Modul";
+$a->strings["Apace mod_rewrite module"] = "Apache: mod_rewrite-Modul";
+$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Fehler: Das Apache-Modul mod-rewrite wird benötigt, es ist allerdings nicht installiert.";
+$a->strings["Error: libCURL PHP module required but not installed."] = "Fehler: Das libCURL PHP Modul wird benötigt ist aber nicht installiert.";
+$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Fehler: Das GD-Graphikmodul für PHP mit JPEG-Unterstützung ist nicht installiert.";
+$a->strings["Error: openssl PHP module required but not installed."] = "Fehler: Das openssl-Modul von PHP ist nicht installiert.";
+$a->strings["Error: mysqli PHP module required but not installed."] = "Fehler: Das mysqli-Modul von PHP ist nicht installiert.";
+$a->strings["Error: mb_string PHP module required but not installed."] = "Fehler: mb_string PHP Module wird benötigt ist aber nicht installiert.";
+$a->strings["The web installer needs to be able to create a file called \".htconfig.php\ in the top folder of your web server and it is unable to do so."] = "Der Installationswizard muss in der Lage sein, eine Datei im Stammverzeichnis deines Webservers anzulegen, ist allerdings derzeit nicht in der Lage, dies zu tun.";
+$a->strings["This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can."] = "In den meisten Fällen ist dies ein Problem mit den Schreibrechten, der Webserver könnte keine Schreiberlaubnis haben, selbst wenn du sie hast.";
+$a->strings["Please check with your site documentation or support people to see if this situation can be corrected."] = "Bitte überprüfe die Einstellungen und frage im Zweifelsfall dein Support Team, um diese Situation zu beheben.";
+$a->strings["If not, you may be required to perform a manual installation. Please see the file \"INSTALL.txt\" for instructions."] = "Sollte dies nicht möglich sein, musst du die Installation manuell durchführen. Lies dazu bitte in der Datei \"INSTALL.txt\".";
+$a->strings[".htconfig.php is writable"] = "Schreibrechte auf .htconfig.php";
+$a->strings["The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = "Die Konfigurationsdatei \".htconfig.php\" konnte nicht angelegt werden. Bitte verwende den angefügten Text um die Datei im Stammverzeichnis deiner Friendica-Installation zu erzeugen.";
+$a->strings["Errors encountered creating database tables."] = "Fehler aufgetreten während der Erzeugung der Datenbanktabellen.";
+$a->strings["l F d, Y \\@ g:i A"] = "l F d, Y \\@ g:i A";
+$a->strings["Time Conversion"] = "Zeitumrechnung";
+$a->strings["Friendika provides this service for sharing events with other networks and friends in unknown timezones."] = "Friendica bietet diese Funktion an, um das teilen von Events mit Kontakten zu vereinfachen, deren Zeitzone nicht ermittelt werden kann.";
+$a->strings["UTC time: %s"] = "UTC Zeit: %s";
+$a->strings["Current timezone: %s"] = "Aktuelle Zeitzone: %s";
+$a->strings["Converted localtime: %s"] = "Umgerechnete lokale Zeit: %s";
+$a->strings["Please select your timezone:"] = "Bitte wähle deine Zeitzone.";
+$a->strings["Profile Match"] = "Profilübereinstimmungen";
+$a->strings["No keywords to match. Please add keywords to your default profile."] = "Keine Schlüsselwörter zum Abgleichen gefunden. Bitte füge einige Schlüsselwörter zu deinem Standardprofil hinzu.";
+$a->strings["is interested in:"] = "ist interessiert an:";
+$a->strings["Connect"] = "Verbinden";
$a->strings["No matches"] = "Keine Ãœbereinstimmungen";
+$a->strings["Remote privacy information not available."] = "Entfernte Privatsphäreneinstellungen nicht verfügbar.";
+$a->strings["Visible to:"] = "Sichtbar für:";
+$a->strings["Welcome to %s"] = "Willkommen zu %s";
+$a->strings["Invalid request identifier."] = "Invalid request identifier.";
+$a->strings["Discard"] = "Verwerfen";
+$a->strings["Ignore"] = "Ignorieren";
+$a->strings["Network"] = "Netzwerk";
+$a->strings["Personal"] = "Persönlich";
+$a->strings["Home"] = "Pinnwand";
+$a->strings["Introductions"] = "Kontaktanfragen";
+$a->strings["Messages"] = "Nachrichten";
+$a->strings["Show Ignored Requests"] = "Zeige ignorierte Anfragen";
+$a->strings["Hide Ignored Requests"] = "Verberge ignorierte Anfragen";
+$a->strings["Notification type: "] = "Benachrichtigungstyp: ";
+$a->strings["Friend Suggestion"] = "Kontaktvorschlag";
+$a->strings["suggested by %s"] = "vorgeschlagen von %s";
+$a->strings["Hide this contact from others"] = "Verberge diesen Kontakt vor anderen";
+$a->strings["Post a new friend activity"] = "Neue-Kontakt Nachricht senden";
+$a->strings["if applicable"] = "falls anwendbar";
+$a->strings["Approve"] = "Genehmigen";
+$a->strings["Claims to be known to you: "] = "Behauptet dich zu kennen: ";
+$a->strings["yes"] = "ja";
+$a->strings["no"] = "nein";
+$a->strings["Approve as: "] = "Genehmigen als: ";
+$a->strings["Friend"] = "Freund";
+$a->strings["Sharer"] = "Teilenden";
+$a->strings["Fan/Admirer"] = "Fan/Verehrer";
+$a->strings["Friend/Connect Request"] = "Kontakt-/Freundschaftsanfrage";
+$a->strings["New Follower"] = "Neuer Bewunderer";
+$a->strings["No introductions."] = "Keine Kontaktanfragen.";
+$a->strings["Notifications"] = "Benachrichtigungen";
+$a->strings["%s liked %s's post"] = "%s mag %ss Beitrag";
+$a->strings["%s disliked %s's post"] = "%s mag %ss Beitrag nicht";
+$a->strings["%s is now friends with %s"] = "%s ist jetzt mit %s befreundet";
+$a->strings["%s created a new post"] = "%s hat einen neuen Beitrag erstellt";
+$a->strings["%s commented on %s's post"] = "%s hat %ss Beitrag kommentiert";
+$a->strings["No more network notifications."] = "Keine weiteren Netzwerk-Benachrichtigungen.";
+$a->strings["No more personal notifications."] = "Keine weiteren persönlichen Benachrichtigungen";
+$a->strings["No more home notifications."] = "Keine weiteren Pinnwand-Benachrichtigungen";
$a->strings["Could not access contact record."] = "Konnte nicht auf die Kontaktdaten zugreifen.";
$a->strings["Could not locate selected profile."] = "Konnte das ausgewählte Profil nicht finden.";
$a->strings["Contact updated."] = "Kontakt aktualisiert.";
-$a->strings["Failed to update contact record."] = "Aktualisierung der Kontaktdaten fehlgeschlagen.";
$a->strings["Contact has been blocked"] = "Kontakt wurde blockiert";
$a->strings["Contact has been unblocked"] = "Kontakt wurde wieder freigegeben";
$a->strings["Contact has been ignored"] = "Der Kontakt wurde ignoriert";
@@ -75,10 +310,8 @@ $a->strings["View all contacts"] = "Alle Kontakte anzeigen";
$a->strings["Unblock"] = "Entsperren";
$a->strings["Block"] = "Sperren";
$a->strings["Unignore"] = "Ignorieren aufheben";
-$a->strings["Ignore"] = "Ignorieren";
$a->strings["Repair"] = "Reparieren";
$a->strings["Contact Editor"] = "Kontakt Editor";
-$a->strings["Submit"] = "Senden";
$a->strings["Profile Visibility"] = "Profil Anzeige";
$a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Bitte wähle eines deiner Profile das angezeigt werden soll, wenn %s dein Profil aufruft.";
$a->strings["Contact Information / Notes"] = "Kontakt Informationen / Notizen";
@@ -94,17 +327,33 @@ $a->strings["Update public posts"] = "Öffentliche Beiträge aktualisieren";
$a->strings["Update now"] = "Jetzt aktualisieren";
$a->strings["Currently blocked"] = "Derzeit geblockt";
$a->strings["Currently ignored"] = "Derzeit ignoriert";
-$a->strings["Hide this contact from others"] = "Verberge diesen Kontakt vor anderen";
$a->strings["Replies/likes to your public posts <strong>may</strong> still be visible"] = "Antworten/Likes auf deine öffentlichen Beiträge <strong>könnten</strong> weiterhin sichtbar sein";
$a->strings["Contacts"] = "Kontakte";
-$a->strings["Show Blocked Connections"] = "Zeige geblockte Verbindungen";
-$a->strings["Hide Blocked Connections"] = "Verstecke geblockte Verbindungen";
+$a->strings["Show Unblocked Contacts"] = "Nicht geblockte Kontakte anzeigen";
+$a->strings["Show Blocked Contacts"] = "Blockierte Kontakte anzeigen";
+$a->strings["Show All Contacts"] = "Alle Kontakte anzeigen";
$a->strings["Search your contacts"] = "Suche in deinen Kontakten";
+$a->strings["Finding: "] = "Funde: ";
+$a->strings["Find"] = "Finde";
$a->strings["Mutual Friendship"] = "Beidseitige Freundschaft";
$a->strings["is a fan of yours"] = "ist ein Fan von dir";
$a->strings["you are a fan of"] = "du bist Fan von";
$a->strings["Edit contact"] = "Kontakt bearbeiten";
-$a->strings["everybody"] = "jeder";
+$a->strings["No valid account found."] = "Kein gültiger Account gefunden.";
+$a->strings["Password reset request issued. Check your email."] = "Zurücksetzen des Passworts eingeleitet. Bitte überprüfe deine E-Mail.";
+$a->strings["Password reset requested at %s"] = "Anfrage zum Zurücksetzen des Passworts auf %s erhalten";
+$a->strings["Administrator"] = "Administrator";
+$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "Anfrage konnte nicht verifiziert werden. (Eventuell hast du bereits ähnliche Anfrage gestellt.) Zurücksetzen des Passworts gescheitert.";
+$a->strings["Password Reset"] = "Passwort zurücksetzen";
+$a->strings["Your password has been reset as requested."] = "Dein Passwort wurde wie gewünscht zurückgesetzt.";
+$a->strings["Your new password is"] = "Dein neues Passwort lautet";
+$a->strings["Save or copy your new password - and then"] = "Speichere oder kopiere dein neues Passwort - und dann";
+$a->strings["click here to login"] = "hier klicken, um dich anzumelden";
+$a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Du kannst das Passwort in den <em>Einstellungen</em> ändern sobald du dich erfolgreich angemeldet hast.";
+$a->strings["Forgot your Password?"] = "Hast du dein Passwort vergessen?";
+$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Gib deine Email-Adresse an und fordere ein neues Passwort an. Es werden dir dann weitere Informationen per Mail zugesendet.";
+$a->strings["Nickname or Email: "] = "Spitzname oder Email:";
+$a->strings["Reset"] = "Zurücksetzen";
$a->strings["Missing some important data!"] = "Wichtige Daten fehlen!";
$a->strings["Update"] = "Aktualisierungen";
$a->strings["Failed to connect with email account using the settings provided."] = "Konnte das Email Konto mit den angegebenen Einstellungen nicht erreichen.";
@@ -124,23 +373,18 @@ $a->strings["Plugin settings"] = "Plugin-Einstellungen";
$a->strings["Connections"] = "Verbindungen";
$a->strings["Export personal data"] = "Persönliche Daten exportieren";
$a->strings["Add application"] = "Programm hinzufügen";
-$a->strings["Cancel"] = "Abbrechen";
-$a->strings["Name"] = "Name";
$a->strings["Consumer Key"] = "Consumer Key";
$a->strings["Consumer Secret"] = "Consumer Secret";
$a->strings["Redirect"] = "Umleiten";
$a->strings["Icon url"] = "Icon URL";
$a->strings["You can't edit this application."] = "Du kannst dieses Programm nicht bearbeiten.";
$a->strings["Connected Apps"] = "Verbundene Programme";
-$a->strings["Edit"] = "Bearbeiten";
-$a->strings["Delete"] = "Löschen";
$a->strings["Client key starts with"] = "Anwender Schlüssel beginnt mit";
$a->strings["No name"] = "Kein Name";
$a->strings["Remove authorization"] = "Authorisierung entziehen";
$a->strings["No Plugin settings configured"] = "Keine Plugin-Einstellungen konfiguriert";
$a->strings["Plugin Settings"] = "Plugin-Einstellungen";
$a->strings["Built-in support for %s connectivity is %s"] = "Eingebaute Unterstützung für Verbindungen zu %s ist %s";
-$a->strings["Diaspora"] = "Diaspora";
$a->strings["enabled"] = "eingeschaltet";
$a->strings["disabled"] = "ausgeschaltet";
$a->strings["StatusNet"] = "StatusNet";
@@ -168,8 +412,6 @@ $a->strings["Automatically approve all connection/friend requests as friends"] =
$a->strings["OpenID:"] = "OpenID:";
$a->strings["(Optional) Allow this OpenID to login to this account."] = "(Optional) Erlaube die Anmeldung für diesen Account mit dieser OpenID.";
$a->strings["Publish your default profile in your local site directory?"] = "Veröffentliche dein Standardprofil im Verzeichnis der lokalen Seite?";
-$a->strings["No"] = "Nein";
-$a->strings["Yes"] = "Ja";
$a->strings["Publish your default profile in the global social directory?"] = "Veröffentliche dein Standardprofil im weltweiten Verzeichnis?";
$a->strings["Hide your contact/friend list from viewers of your default profile?"] = "Liste der Kontakte vor Betrachtern des Standardprofils verbergen?";
$a->strings["Hide your profile details from unknown viewers?"] = "Profil-Details vor unbekannten Betrachtern verbergen?";
@@ -179,7 +421,7 @@ $a->strings["Allow us to suggest you as a potential friend to new members?"] = "
$a->strings["Profile is <strong>not published</strong>."] = "Profil ist <strong>nicht veröffentlicht</strong>.";
$a->strings["or"] = "oder";
$a->strings["Your Identity Address is"] = "Die Adresse deines Profils lautet:";
-$a->strings["Automatically expire posts after days:"] = "Beiträge verfallen automatisch nach Tagen:";
+$a->strings["Automatically expire posts after this many days:"] = "Beiträge verfallen automatisch nach dieser Anzahl von Tagen";
$a->strings["If empty, posts will not expire. Expired posts will be deleted"] = "Wenn leer verfallen Beiträge nie automatisch. Verfallene Beiträge werden gelöscht.";
$a->strings["Advanced expiration settings"] = "Erweiterte Verfallseinstellungen";
$a->strings["Advanced Expiration"] = "Erweitertes Verfallen";
@@ -214,221 +456,69 @@ $a->strings["Someone writes on your profile wall"] = "Jemand etwas auf deine Pin
$a->strings["Someone writes a followup comment"] = "Jemand auch einen Kommentar verfasst";
$a->strings["You receive a private message"] = "Du eine private Nachricht erhältst";
$a->strings["You receive a friend suggestion"] = "Du eine Empfehlung erhältst";
+$a->strings["You are tagged in a post"] = "Du wurdest in einem Beitrag erwähnt";
$a->strings["Advanced Page Settings"] = "Erweiterte Seiten-Einstellungen";
-$a->strings["Contact settings applied."] = "Einstellungen zum Kontakt angewandt.";
-$a->strings["Contact update failed."] = "Konnte den Kontakt nicht aktualisieren.";
-$a->strings["Contact not found."] = "Kontakt nicht gefunden.";
-$a->strings["Repair Contact Settings"] = "Kontakt-Einstellungen reparieren";
-$a->strings["<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact may stop working."] = "<strong>ACHTUNG: Das sind Experten-Einstellungen!</strong> Wenn Du etwas falsches eingibst, funktioniert die Kommunikation mit diesem Kontakt evtl. nicht mehr.";
-$a->strings["Please use your browser 'Back' button <strong>now</strong> if you are uncertain what to do on this page."] = "Bitte nutze den Zurück-Button deines Browsers <strong>jetzt</strong>, wenn du dir unsicher bist, was auf dieser Seite gemacht wird.";
-$a->strings["Account Nickname"] = "Account-Spitzname";
-$a->strings["@Tagname - overrides Name/Nickname"] = "@Tagname - überschreibt Name/Spitzname";
-$a->strings["Account URL"] = "Account-URL";
-$a->strings["Friend Request URL"] = "URL für Freundschaftsanfragen";
-$a->strings["Friend Confirm URL"] = "URL für Bestätigungen von Freundschaftsanfragen";
-$a->strings["Notification Endpoint URL"] = "URL-Endpunkt für Benachrichtigungen";
-$a->strings["Poll/Feed URL"] = "Pull/Feed-URL";
-$a->strings["New photo from this URL"] = "Neues Foto von dieser URL";
-$a->strings["This introduction has already been accepted."] = "Diese Kontaktanfrage wurde bereits akzeptiert.";
-$a->strings["Profile location is not valid or does not contain profile information."] = "Profiladresse ist ungültig oder stellt einige Profildaten nicht zur Verfügung.";
-$a->strings["Warning: profile location has no identifiable owner name."] = "Warnung: Es konnte kein Name des Besitzers von der angegebenen Profiladresse gefunden werden.";
-$a->strings["Warning: profile location has no profile photo."] = "Warnung: Es konnte kein Profilbild bei der angegebenen Profiladresse gefunden werden.";
-$a->strings["%d required parameter was not found at the given location"] = array(
- 0 => "",
- 1 => "",
-);
-$a->strings["Introduction complete."] = "Kontaktanfrage abgeschlossen.";
-$a->strings["Unrecoverable protocol error."] = "Nicht behebbarer Protokollfehler.";
-$a->strings["Profile unavailable."] = "Profil nicht verfügbar.";
-$a->strings["%s has received too many connection requests today."] = "%s hat heute zu viele Freundschaftsanfragen erhalten.";
-$a->strings["Spam protection measures have been invoked."] = "Maßnahmen zum Spamschutz wurden ergriffen.";
-$a->strings["Friends are advised to please try again in 24 hours."] = "Freunde sind angehalten, es in 24 Stunden erneut zu versuchen.";
-$a->strings["Invalid locator"] = "Ungültiger Locator";
-$a->strings["Unable to resolve your name at the provided location."] = "Konnte deinen Namen an der angegebenen Stelle nicht finden.";
-$a->strings["You have already introduced yourself here."] = "Du hast dich hier bereits vorgestellt.";
-$a->strings["Apparently you are already friends with %s."] = "Es scheint so, als ob du bereits ein Freund von %s bist.";
-$a->strings["Invalid profile URL."] = "Ungültige Profil-URL.";
-$a->strings["Your introduction has been sent."] = "Deine Kontaktanfrage wurde gesendet.";
-$a->strings["Please login to confirm introduction."] = "Bitte melde dich an, um die Kontaktanfrage zu bestätigen.";
-$a->strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "Incorrect identity currently logged in. Please login to <strong>this</strong> profile.";
-$a->strings["Welcome home %s."] = "Willkommen zurück %s.";
-$a->strings["Please confirm your introduction/connection request to %s."] = "Bitte bestätige deine Kontaktanfrage bei %s.";
-$a->strings["Confirm"] = "Bestätigen";
-$a->strings["[Name Withheld]"] = "[Name Zurückgehalten]";
-$a->strings["Diaspora members: Please do not use this form. Instead, enter \"%s\" into your Diaspora search bar."] = "Diaspora-User: Bitte nicht dieses Formular benutzen! Gebt statt dessen \"%s\" in der Diaspora-Suchleiste ein.";
-$a->strings["Please enter your 'Identity Address' from one of the following supported social networks:"] = "Bitte gib die Adresse deines Profils in einem der unterstützten sozialen Netzwerke an:";
-$a->strings["Friend/Connection Request"] = "Freundschafts-/Kontaktanfrage";
-$a->strings["Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"] = "Beispiele: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca";
-$a->strings["Please answer the following:"] = "Bitte beantworte folgende Fragen:";
-$a->strings["Does %s know you?"] = "Kennt %s dich?";
-$a->strings["Add a personal note:"] = "Eine persönliche Notiz anfügen:";
-$a->strings["Friendica"] = "Friendica";
-$a->strings["StatusNet/Federated Social Web"] = "StatusNet/Federated Social Web";
-$a->strings["- please share from your own site as noted above"] = "- bitte fange von Deiner eigenen Seite aus zu teilen an";
-$a->strings["Your Identity Address:"] = "Adresse deines Profils:";
-$a->strings["Submit Request"] = "Anfrage abschicken";
-$a->strings["Invalid request identifier."] = "Invalid request identifier.";
-$a->strings["Discard"] = "Verwerfen";
-$a->strings["Network"] = "Netzwerk";
-$a->strings["Personal"] = "Persönlich";
-$a->strings["Home"] = "Pinnwand";
-$a->strings["Introductions"] = "Kontaktanfragen";
-$a->strings["Messages"] = "Nachrichten";
-$a->strings["Show Ignored Requests"] = "Zeige ignorierte Anfragen";
-$a->strings["Hide Ignored Requests"] = "Verberge ignorierte Anfragen";
-$a->strings["Notification type: "] = "Benachrichtigungstyp: ";
-$a->strings["Friend Suggestion"] = "Kontaktvorschlag";
-$a->strings["suggested by %s"] = "vorgeschlagen von %s";
-$a->strings["Approve"] = "Genehmigen";
-$a->strings["Claims to be known to you: "] = "Behauptet dich zu kennen: ";
-$a->strings["yes"] = "ja";
-$a->strings["no"] = "nein";
-$a->strings["Approve as: "] = "Genehmigen als: ";
-$a->strings["Friend"] = "Freund";
-$a->strings["Sharer"] = "Teilenden";
-$a->strings["Fan/Admirer"] = "Fan/Verehrer";
-$a->strings["Friend/Connect Request"] = "Kontakt-/Freundschaftsanfrage";
-$a->strings["New Follower"] = "Neuer Bewunderer";
-$a->strings["No introductions."] = "Keine Kontaktanfragen.";
-$a->strings["Notifications"] = "Benachrichtigungen";
-$a->strings["%s liked %s's post"] = "%s mag %ss Beitrag";
-$a->strings["%s disliked %s's post"] = "%s mag %ss Beitrag nicht";
-$a->strings["%s is now friends with %s"] = "%s ist jetzt mit %s befreundet";
-$a->strings["%s created a new post"] = "%s hat einen neuen Beitrag erstellt";
-$a->strings["%s commented on %s's post"] = "%s hat %ss Beitrag kommentiert";
-$a->strings["No more network notifications."] = "Keine weiteren Netzwerk-Benachrichtigungen.";
-$a->strings["No more personal notifications."] = "Keine weiteren persönlichen Benachrichtigungen";
-$a->strings["No more home notifications."] = "Keine weiteren Pinnwand-Benachrichtigungen";
-$a->strings["No recipient selected."] = "Kein Empfänger gewählt.";
-$a->strings["Unable to locate contact information."] = "Konnte die Kontaktinformationen nicht finden.";
-$a->strings["Message could not be sent."] = "Nachricht konnte nicht gesendet werden.";
-$a->strings["Message collection failure."] = "Konnte Nachrichten nicht abrufen.";
-$a->strings["Message sent."] = "Nachricht gesendet.";
-$a->strings["Inbox"] = "Eingang";
-$a->strings["Outbox"] = "Ausgang";
-$a->strings["New Message"] = "Neue Nachricht";
-$a->strings["Message deleted."] = "Nachricht gelöscht.";
-$a->strings["Conversation removed."] = "Unterhaltung gelöscht.";
-$a->strings["Please enter a link URL:"] = "Bitte gib die URL des Links ein:";
-$a->strings["Send Private Message"] = "Private Nachricht senden";
-$a->strings["To:"] = "An:";
-$a->strings["Subject:"] = "Betreff:";
-$a->strings["Your message:"] = "Deine Nachricht:";
-$a->strings["Upload photo"] = "Foto hochladen";
-$a->strings["Insert web link"] = "Weblink einfügen";
-$a->strings["Please wait"] = "Bitte warten";
-$a->strings["No messages."] = "Keine Nachrichten.";
-$a->strings["Delete conversation"] = "Unterhaltung löschen";
-$a->strings["D, d M Y - g:i A"] = "D, d. M Y - g:i A";
-$a->strings["Message not available."] = "Nachricht nicht verfügbar.";
-$a->strings["Delete message"] = "Nachricht löschen";
-$a->strings["Send Reply"] = "Antwort senden";
-$a->strings["Image exceeds size limit of %d"] = "Bildgröße überschreitet das Limit von %d";
-$a->strings["Unable to process image."] = "Konnte das Bild nicht bearbeiten.";
-$a->strings["Wall Photos"] = "Pinnwand-Bilder";
-$a->strings["Image upload failed."] = "Hochladen des Bildes gescheitert.";
-$a->strings["File exceeds size limit of %d"] = "Die Datei ist größer als das erlaubte Limit von %d";
-$a->strings["File upload failed."] = "Hochladen der Datei fehlgeschlagen.";
-$a->strings["Image uploaded but image cropping failed."] = "Bilder hochgeladen, aber das Zuschneiden ist fehlgeschlagen.";
-$a->strings["Profile Photos"] = "Profilbilder";
-$a->strings["Image size reduction [%s] failed."] = "Verkleinern der Bildgröße von [%s] ist gescheitert.";
-$a->strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Drücke Umschalt+Neu Laden oder leere den Browser-Cache, falls das neue Foto nicht gleich angezeigt wird.";
-$a->strings["Unable to process image"] = "Bild konnte nicht verarbeitet werden";
-$a->strings["Upload File:"] = "Datei hochladen:";
-$a->strings["Upload Profile Photo"] = "Profilbild hochladen";
-$a->strings["Upload"] = "Hochladen";
-$a->strings["skip this step"] = "diesen Schritt überspringen";
-$a->strings["select a photo from your photo albums"] = "wähle ein Foto von deinen Fotoalben";
-$a->strings["Crop Image"] = "Bild zurechtschneiden";
-$a->strings["Please adjust the image cropping for optimum viewing."] = "Passe bitte den Bildausschnitt an, damit das Bild optimal dargestellt werden kann.";
-$a->strings["Done Editing"] = "Bearbeitung abgeschlossen";
-$a->strings["Image uploaded successfully."] = "Bild erfolgreich auf den Server geladen.";
-$a->strings["Welcome back %s"] = "Willkommen zurück %s";
$a->strings["Manage Identities and/or Pages"] = "Verwalte Identitäten und/oder Seiten";
-$a->strings["(Toggle between different identities or community/group pages which share your account details.)"] = "(Wähle zwischen verschiedenen Identitäten oder Gemeinschafts/Gruppen-Seiten, die deine Accountdetails teilen.)";
+$a->strings["Toggle between different identities or community/group pages which share your account details or which you have been granted \"manage\" permissions"] = "Wechsle zwischen verschiedenen Identitäten oder Gemeinschafts-/Gruppen Seiten die deine Zugangsdetails teilen oder zu denen du \"Manage\" Befugnisse bekommen hast.";
$a->strings["Select an identity to manage: "] = "Wähle eine Identität zum Verwalten: ";
-$a->strings["photo"] = "Foto";
-$a->strings["status"] = "Status";
-$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s hat %2\$ss %3\$s mit %4\$s getaggt";
-$a->strings["Common Friends"] = "Gemeinsame Freunde";
-$a->strings["No friends in common."] = "Keine gemeinsamen Freunde.";
-$a->strings["Profile not found."] = "Profil nicht gefunden.";
-$a->strings["Profile Name is required."] = "Profilname ist erforderlich.";
-$a->strings["Profile updated."] = "Profil aktualisiert.";
-$a->strings["Profile deleted."] = "Profil gelöscht.";
-$a->strings["Profile-"] = "Profil-";
-$a->strings["New profile created."] = "Neues Profil angelegt.";
-$a->strings["Profile unavailable to clone."] = "Profil nicht zum Duplizieren verfügbar.";
-$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Liste der Kontakte vor Betrachtern dieses Profils verbergen?";
-$a->strings["Edit Profile Details"] = "Profil bearbeiten";
-$a->strings["View this profile"] = "Dieses Profil anzeigen";
-$a->strings["Create a new profile using these settings"] = "Neues Profil anlegen und diese Einstellungen verwenden";
-$a->strings["Clone this profile"] = "Dieses Profil duplizieren";
-$a->strings["Delete this profile"] = "Dieses Profil löschen";
-$a->strings["Profile Name:"] = "Profilname:";
-$a->strings["Your Full Name:"] = "Dein kompletter Name:";
-$a->strings["Title/Description:"] = "Titel/Beschreibung:";
-$a->strings["Your Gender:"] = "Dein Geschlecht:";
-$a->strings["Birthday (%s):"] = "Geburtstag (%s):";
-$a->strings["Street Address:"] = "Adresse:";
-$a->strings["Locality/City:"] = "Wohnort/Stadt:";
-$a->strings["Postal/Zip Code:"] = "Postleitzahl:";
-$a->strings["Country:"] = "Land:";
-$a->strings["Region/State:"] = "Region/Bundesstaat:";
-$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "<span class=\"heart\">&hearts;</span> Beziehungsstatus:";
-$a->strings["Who: (if applicable)"] = "Wer: (falls anwendbar)";
-$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Beispiele: cathy123, Cathy Williams, cathy@example.com";
-$a->strings["Sexual Preference:"] = "Sexuelle Vorlieben:";
-$a->strings["Homepage URL:"] = "Adresse der Homepage:";
-$a->strings["Political Views:"] = "Politische Ansichten:";
-$a->strings["Religious Views:"] = "Religiöse Ansichten:";
-$a->strings["Public Keywords:"] = "Öffentliche Schlüsselwörter:";
-$a->strings["Private Keywords:"] = "Private Schlüsselwörter:";
-$a->strings["Example: fishing photography software"] = "Beispiel: Fischen Fotografie Software";
-$a->strings["(Used for suggesting potential friends, can be seen by others)"] = "(Wird verwendet um potentielle Freunde zu finden, könnte von Fremden eingesehen werden)";
-$a->strings["(Used for searching profiles, never shown to others)"] = "(Wird für die Suche nach Profilen verwendet und niemals veröffentlicht)";
-$a->strings["Tell us about yourself..."] = "Erzähle uns ein bisschen von dir …";
-$a->strings["Hobbies/Interests"] = "Hobbies/Interessen";
-$a->strings["Contact information and Social Networks"] = "Kontaktinformationen und Soziale Netzwerke";
-$a->strings["Musical interests"] = "Musikalische Interessen";
-$a->strings["Books, literature"] = "Literatur/Bücher";
-$a->strings["Television"] = "Fernsehen";
-$a->strings["Film/dance/culture/entertainment"] = "Filme/Tänze/Kultur/Unterhaltung";
-$a->strings["Love/romance"] = "Liebesleben";
-$a->strings["Work/employment"] = "Arbeit/Beschäftigung";
-$a->strings["School/education"] = "Schule/Ausbildung";
-$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Dies ist dein <strong>öffentliches</strong> Profil.<br />Es <strong>könnte</strong> für jeden Nutzer des Internets sichtbar sein.";
-$a->strings["Edit/Manage Profiles"] = "Verwalte/Editiere Profile";
-$a->strings["Change profile photo"] = "Profilbild ändern";
-$a->strings["Create New Profile"] = "Neues Profil anlegen";
-$a->strings["Profile Image"] = "Profilbild";
-$a->strings["visible to everybody"] = "sichtbar für jeden";
-$a->strings["Edit visibility"] = "Sichtbarkeit bearbeiten";
-$a->strings["Login failed."] = "Annmeldung fehlgeschlagen.";
-$a->strings["Welcome "] = "Willkommen ";
-$a->strings["Please upload a profile photo."] = "Bitte lade ein Profilbild hoch.";
-$a->strings["Welcome back "] = "Willkommen zurück ";
-$a->strings["l F d, Y \\@ g:i A"] = "l F d, Y \\@ g:i A";
-$a->strings["Time Conversion"] = "Zeitumrechnung";
-$a->strings["Friendika provides this service for sharing events with other networks and friends in unknown timezones."] = "Friendica bietet diese Funktion an, um das teilen von Events mit Kontakten zu vereinfachen, deren Zeitzone nicht ermittelt werden kann.";
-$a->strings["UTC time: %s"] = "UTC Zeit: %s";
-$a->strings["Current timezone: %s"] = "Aktuelle Zeitzone: %s";
-$a->strings["Converted localtime: %s"] = "Umgerechnete lokale Zeit: %s";
-$a->strings["Please select your timezone:"] = "Bitte wähle deine Zeitzone.";
-$a->strings["%s : Not a valid email address."] = "%s: Keine gültige Email Adresse.";
-$a->strings["Please join my network on %s"] = "Bitte trete meinem Netzwerk auf %s bei";
-$a->strings["%s : Message delivery failed."] = "%s: Zustellung der Nachricht fehlgeschlagen.";
-$a->strings["%d message sent."] = array(
- 0 => "%d Nachricht gesendet.",
- 1 => "%d Nachrichten gesendet.",
+$a->strings["Search Results For:"] = "Suchergebnisse für:";
+$a->strings["Remove term"] = "Begriff entfernen";
+$a->strings["Saved Searches"] = "Gespeicherte Suchen";
+$a->strings["add"] = "hinzufügen";
+$a->strings["Commented Order"] = "Neueste Kommentare";
+$a->strings["Posted Order"] = "Neueste Beiträge";
+$a->strings["New"] = "Neue";
+$a->strings["Starred"] = "Markierte";
+$a->strings["Bookmarks"] = "Lesezeichen";
+$a->strings["Warning: This group contains %s member from an insecure network."] = array(
+ 0 => "Warnung: Diese Gruppe beinhaltet %s Person aus einem unsicheren Netzwerk.",
+ 1 => "Warnung: Diese Gruppe beinhaltet %s Personen aus unsicheren Netzwerken.",
);
-$a->strings["You have no more invitations available"] = "Du hast keine weiteren Einladungen";
-$a->strings["Send invitations"] = "Einladungen senden";
-$a->strings["Enter email addresses, one per line:"] = "E-Mail-Adressen eingeben, eine pro Zeile:";
-$a->strings["Please join my social network on %s"] = "Bitte trete meinem Sozialen Netzwerk auf %s bei";
-$a->strings["To accept this invitation, please visit:"] = "Um diese Einladung anzunehmen besuche bitte:";
-$a->strings["You will need to supply this invitation code: \$invite_code"] = "Du benötigst den folgenden Einladungs Code: \$invite_code";
-$a->strings["Once you have registered, please connect with me via my profile page at:"] = "Sobald du registriert bist, kontaktiere mich bitte auf meiner Profilseite:";
+$a->strings["Private messages to this group are at risk of public disclosure."] = "Private Nachrichten an diese Gruppe könnten an die Öffentlichkeit geraten.";
+$a->strings["No such group"] = "Es gibt keine solche Gruppe";
+$a->strings["Group is empty"] = "Gruppe ist leer";
+$a->strings["Group: "] = "Gruppe: ";
+$a->strings["Contact: "] = "Kontakt: ";
+$a->strings["Private messages to this person are at risk of public disclosure."] = "Private Nachrichten an diese Person könnten an die Öffentlichkeit gelangen.";
+$a->strings["Invalid contact."] = "Ungültiger Kontakt.";
+$a->strings["Personal Notes"] = "Persönliche Notizen";
+$a->strings["Save"] = "Speichern";
+$a->strings["Welcome to Friendica"] = "Willkommen bei Friendica";
+$a->strings["New Member Checklist"] = "Checkliste für neue Mitglieder";
+$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page."] = "Wir möchten dir einige Tipps und Links anbieten, um deine Erfahrung mit Friendica so angenehm wie möglich zu machen. Klicke einfach einen Aspekt an, um weitere Informationen zu erhalten.";
+$a->strings["On your <em>Settings</em> page - change your initial password. Also make a note of your Identity Address. This will be useful in making friends."] = "Ändere dein anfängliches Passwort auf der <em>Einstellungen</em> Seite. Bei dieser Gelegenheit solltest du dir die Adresse deines Profils merken, diese wird benötigt um mit Anderen in Kontakt zu treten.";
+$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "Überprüfe die restlichen Einstellungen, insbesondere die Einstellungen zur Privatsphäre. Wenn du dein Profil nicht veröffentlichst ist das wie wenn niemand deine Telefonnummer kennt. Im Allgemeinen solltest du es veröffentlichen - außer all deine Freunde und potentiellen Freunde wissen wie man dich findet.";
+$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "Lade ein Profilbild hoch falls du es noch nicht getan hast. Studien haben gezeigt, dass es zehnmal wahrscheinlicher ist neue Freunde zu finden, wenn du ein Bild von dir selbst verwendest als wenn du dies nicht tust.";
+$a->strings["Authorise the Facebook Connector if you currently have a Facebook account and we will (optionally) import all your Facebook friends and conversations."] = "Richte die Verbindung zu Facebook ein, wenn du im Augenblick ein Facebook Konto hast und (optional) deine Facebook Freunde und Unterhaltungen importieren willst.";
+$a->strings["Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "Gib deine E-Mail-Zugangsinformationen auf der Connector-Einstellungsseite ein, falls du E-Mails aus deinem Posteingang importieren und mit Freunden und Mailinglisten interagieren willlst.";
+$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "Editiere dein <strong>Standard</strong> Profil nach deinen Vorlieben. Überprüfe die Einstellungen zum Verbergen deiner Freundesliste vor unbekannten Betrachtern des Profils.";
+$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "Trage ein paar öffentliche Stichwörter in dein Standardprofil ein, die deine Interessen beschreiben. Eventuell sind wir in der Lage Leute zu finden, die deine Interessen teilen und können dir dann Kontakte vorschlagen.";
+$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Add New Contact</em> dialog."] = "Die Kontakte-Seite ist die Einstiegsseite, von der aus du Kontakte verwalten und dich mit Freunden in anderen Netzwerken verbinden kannst. Normalerweise gibst du dazu einfach ihre Adresse oder die URL der Seite im Kasten <em>Neuen Kontakt hinzufügen</em> ein.";
+$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "Ãœber die Verzeichnisseite kannst du andere Personen auf diesem Server oder anderen verteilten Seiten finden. Halte nach einem <em>Verbinden</em> oder <em>Folgen</em> Link auf deren Profilseiten Ausschau und gib deine eigene Profiladresse an falls du danach gefragt wirst.";
+$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "Sobald du einige Freunde gefunden hast, organisiere sie in Gruppen zur privaten Kommunikation im Seitenmenü der Kontakte-Seite. Du kannst dann mit jeder dieser Gruppen von der Netzwerkseite aus privat interagieren.";
+$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "Unsere <strong>Hilfe</strong> Seiten können herangezogen werden, um weitere Einzelheiten zu andern Programm Features zu erhalten.";
+$a->strings["Item not available."] = "Beitrag nicht verfügbar.";
+$a->strings["Item was not found."] = "Beitrag konnte nicht gefunden werden.";
+$a->strings["Group created."] = "Gruppe erstellt.";
+$a->strings["Could not create group."] = "Konnte die Gruppe nicht erstellen.";
+$a->strings["Group not found."] = "Gruppe nicht gefunden.";
+$a->strings["Group name changed."] = "Gruppenname geändert.";
+$a->strings["Permission denied"] = "Zugriff verweigert";
+$a->strings["Create a group of contacts/friends."] = "Eine Gruppe von Kontakten/Freunden anlegen.";
+$a->strings["Group Name: "] = "Gruppenname:";
+$a->strings["Group removed."] = "Gruppe entfernt.";
+$a->strings["Unable to remove group."] = "Konnte die Gruppe nicht entfernen.";
+$a->strings["Click on a contact to add or remove."] = "Klicke einen Kontakt an, um ihn hinzuzufügen oder zu entfernen";
+$a->strings["Group Editor"] = "Gruppeneditor";
+$a->strings["Members"] = "Mitglieder";
+$a->strings["All Contacts"] = "Alle Kontakte";
+$a->strings["Invalid profile identifier."] = "Ungültiger Profil-Bezeichner";
+$a->strings["Profile Visibility Editor"] = "Editor für die Profil-Sichtbarkeit";
+$a->strings["Profile"] = "Profil";
+$a->strings["Visible To"] = "Sichtbar für";
+$a->strings["All Contacts (with secure profile access)"] = "Alle Kontakte (mit gesichertem Profilzugriff)";
+$a->strings["View Contacts"] = "Kontakte anzeigen";
+$a->strings["No contacts."] = "Keine Kontakte.";
$a->strings["An invitation is required."] = "Du benötigst eine Einladung.";
$a->strings["Invitation could not be verified."] = "Die Einladung konnte nicht überprüft werden.";
$a->strings["Invalid OpenID url"] = "Ungültige OpenID URL";
@@ -445,7 +535,6 @@ $a->strings["SERIOUS ERROR: Generation of security keys failed."] = "SERIOUS ERR
$a->strings["An error occurred during registration. Please try again."] = "Wärend der Anmeldung ist ein Fehler aufgetreten. Bitte versuche es noch einmal.";
$a->strings["An error occurred creating your default profile. Please try again."] = "Bei der Erstellung des Standard-Profils ist ein Fehler aufgetreten. Bitte versuche es noch einmal.";
$a->strings["Registration details for %s"] = "Details der Registration von %s";
-$a->strings["Administrator"] = "Administrator";
$a->strings["Registration successful. Please check your email for further instructions."] = "Registrierung erfolgreich. Eine E-Mail mit weiteren Anweisungen wurde an dich gesendet.";
$a->strings["Failed to send email message. Here is the message that failed."] = "Konnte die E-Mail nicht versenden. Hier ist die Nachricht, die nicht gesendet werden konnte.";
$a->strings["Your registration can not be processed."] = "Deine Registrierung konnte nicht verarbeitet werden.";
@@ -464,114 +553,64 @@ $a->strings["Your Email Address: "] = "Deine E-Mail-Adresse: ";
$a->strings["Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be '<strong>nickname@\$sitename</strong>'."] = "Wähle einen Spitznamen für dein Profil. Dieser muss mit einem Buchstaben beginnen. Die Adresse deines Profils auf dieser Seite wird '<strong>spitzname@\$sitename</strong>' sein.";
$a->strings["Choose a nickname: "] = "Spitznamen wählen: ";
$a->strings["Register"] = "Registrieren";
-$a->strings["Applications"] = "Anwendungen";
-$a->strings["No installed applications."] = "Keine Applikationen installiert.";
+$a->strings["People Search"] = "Personen Suche";
+$a->strings["status"] = "Status";
+$a->strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s mag %2\$ss %3\$s";
+$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s mag %2\$ss %3\$s nicht";
+$a->strings["Item not found."] = "Beitrag nicht gefunden.";
+$a->strings["Access denied."] = "Zugriff verweigert.";
+$a->strings["Account approved."] = "Account freigegeben.";
+$a->strings["Registration revoked for %s"] = "Registrierung für %s wurde zurückgezogen";
+$a->strings["Please login."] = "Bitte melde dich an.";
+$a->strings["Unable to locate original post."] = "Konnte den Originalbeitrag nicht finden.";
+$a->strings["Empty post discarded."] = "Leerer Beitrag wurde verworfen.";
+$a->strings["Wall Photos"] = "Pinnwand-Bilder";
+$a->strings["System error. Post not saved."] = "Systemfehler. Beitrag konnte nicht gespeichert werden.";
+$a->strings["This message was sent to you by %s, a member of the Friendica social network."] = "Diese Nachricht wurde dir von %s geschickt, einem Mitglied des Sozialen Netzwerks Friendica.";
+$a->strings["You may visit them online at %s"] = "Du kannst sie online unter %s besuchen";
+$a->strings["Please contact the sender by replying to this post if you do not wish to receive these messages."] = "Falls du diese Beiträge nicht erhalten möchtest, kontaktiere bitte den Autor, indem du auf diese Nachricht antwortest.";
+$a->strings["%s posted an update."] = "%s hat ein Update veröffentlicht.";
+$a->strings["Image uploaded but image cropping failed."] = "Bilder hochgeladen, aber das Zuschneiden ist fehlgeschlagen.";
+$a->strings["Image size reduction [%s] failed."] = "Verkleinern der Bildgröße von [%s] ist gescheitert.";
+$a->strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Drücke Umschalt+Neu Laden oder leere den Browser-Cache, falls das neue Foto nicht gleich angezeigt wird.";
+$a->strings["Unable to process image"] = "Bild konnte nicht verarbeitet werden";
+$a->strings["Image exceeds size limit of %d"] = "Bildgröße überschreitet das Limit von %d";
+$a->strings["Upload File:"] = "Datei hochladen:";
+$a->strings["Upload Profile Photo"] = "Profilbild hochladen";
+$a->strings["Upload"] = "Hochladen";
+$a->strings["skip this step"] = "diesen Schritt überspringen";
+$a->strings["select a photo from your photo albums"] = "wähle ein Foto von deinen Fotoalben";
+$a->strings["Crop Image"] = "Bild zurechtschneiden";
+$a->strings["Please adjust the image cropping for optimum viewing."] = "Passe bitte den Bildausschnitt an, damit das Bild optimal dargestellt werden kann.";
+$a->strings["Done Editing"] = "Bearbeitung abgeschlossen";
+$a->strings["Image uploaded successfully."] = "Bild erfolgreich auf den Server geladen.";
$a->strings["No profile"] = "Kein Profil";
-$a->strings["Friend suggestion sent."] = "Kontaktvorschlag gesendet.";
-$a->strings["Suggest Friends"] = "Kontakte vorschlagen";
-$a->strings["Suggest a friend for %s"] = "Schlage %s einen Kontakt vor";
-$a->strings["{0} wants to be your friend"] = "{0} möchte mit dir in Kontakt treten";
-$a->strings["{0} sent you a message"] = "{0} hat dir eine Nachricht geschickt";
-$a->strings["{0} requested registration"] = "{0} möchte sich registrieren";
-$a->strings["{0} commented %s's post"] = "{0} kommentierte einen Beitrag von %s";
-$a->strings["{0} liked %s's post"] = "{0} mag %ss Beitrag";
-$a->strings["{0} disliked %s's post"] = "{0} mag %ss Beitrag nicht";
-$a->strings["{0} is now friends with %s"] = "{0} ist jetzt mit %s befreundet";
-$a->strings["{0} posted"] = "{0} hat etwas veröffentlicht";
-$a->strings["{0} tagged %s's post with #%s"] = "{0} hat %ss Beitrag mit dem Schlagwort #%s versehen";
-$a->strings["{0} mentioned you in a post"] = "{0} hat dich in einem Beitrag erwähnt";
-$a->strings["No valid account found."] = "Kein gültiger Account gefunden.";
-$a->strings["Password reset request issued. Check your email."] = "Zurücksetzen des Passworts eingeleitet. Bitte überprüfe deine E-Mail.";
-$a->strings["Password reset requested at %s"] = "Anfrage zum Zurücksetzen des Passworts auf %s erhalten";
-$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "Anfrage konnte nicht verifiziert werden. (Eventuell hast du bereits ähnliche Anfrage gestellt.) Zurücksetzen des Passworts gescheitert.";
-$a->strings["Password Reset"] = "Passwort zurücksetzen";
-$a->strings["Your password has been reset as requested."] = "Dein Passwort wurde wie gewünscht zurückgesetzt.";
-$a->strings["Your new password is"] = "Dein neues Passwort lautet";
-$a->strings["Save or copy your new password - and then"] = "Speichere oder kopiere dein neues Passwort - und dann";
-$a->strings["click here to login"] = "hier klicken, um dich anzumelden";
-$a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Du kannst das Passwort in den <em>Einstellungen</em> ändern sobald du dich erfolgreich angemeldet hast.";
-$a->strings["Forgot your Password?"] = "Hast du dein Passwort vergessen?";
-$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Gib deine Email-Adresse an und fordere ein neues Passwort an. Es werden dir dann weitere Informationen per Mail zugesendet.";
-$a->strings["Nickname or Email: "] = "Spitzname oder Email:";
-$a->strings["Reset"] = "Zurücksetzen";
-$a->strings["Item not found"] = "Beitrag nicht gefunden";
-$a->strings["Edit post"] = "Beitrag bearbeiten";
-$a->strings["Post to Email"] = "An E-Mail senden";
-$a->strings["Attach file"] = "Datei anhängen";
-$a->strings["Insert YouTube video"] = "YouTube-Video einfügen";
-$a->strings["Insert Vorbis [.ogg] video"] = "Vorbis [.ogg] Video einfügen";
-$a->strings["Insert Vorbis [.ogg] audio"] = "Vorbis [.ogg] Audio einfügen";
-$a->strings["Set your location"] = "Deinen Standort festlegen";
-$a->strings["Clear browser location"] = "Browser-Standort leeren";
-$a->strings["Permission settings"] = "Berechtigungseinstellungen";
-$a->strings["CC: email addresses"] = "Cc:-E-Mail-Addressen";
-$a->strings["Public post"] = "Öffentlicher Beitrag";
-$a->strings["Example: bob@example.com, mary@example.com"] = "Z.B.: bob@example.com, mary@example.com";
$a->strings["Remove My Account"] = "Account löschen";
$a->strings["This will completely remove your account. Once this has been done it is not recoverable."] = "Dies wird deinen Account endgültig löschen. Es gibt keine Möglichkeit, ihn wiederherzustellen.";
$a->strings["Please enter your password for verification:"] = "Bitte gib dein Passwort zur Verifikation ein:";
-$a->strings["Account approved."] = "Account freigegeben.";
-$a->strings["Registration revoked for %s"] = "Registrierung für %s wurde zurückgezogen";
-$a->strings["Please login."] = "Bitte melde dich an.";
-$a->strings["Friendica Social Communications Server - Setup"] = "Friendica-Server für soziale Netzwerke – Setup";
-$a->strings["Database connection"] = "Datenbank-Verbindung";
-$a->strings["Could not connect to database."] = "Verbindung zur Datenbank gescheitert";
-$a->strings["Could not create table."] = "Konnte Tabelle nicht erstellen.";
-$a->strings["Your Friendica site database has been installed."] = "Die Datenbank deiner Friendica Seite wurde installiert.";
-$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "WICHTIG: Du musst [manuell] einen Cronjob (o.ä.) für den Poller einrichten.";
-$a->strings["Please see the file \"INSTALL.txt\"."] = "Lies bitte die \"INSTALL.txt\".";
-$a->strings["Proceed to registration"] = "Mit der Registrierung fortfahren";
-$a->strings["Proceed with Installation"] = "Mit der Installation fortfahren";
-$a->strings["You may need to import the file \"database.sql\" manually using phpmyadmin or mysql."] = "Möglicherweise musst du die Datei \"database.sql\" manuell mit phpmyadmin oder mysql importieren.";
-$a->strings["Database import failed."] = "Import der Datenbank schlug fehl.";
-$a->strings["System check"] = "Systemtest";
-$a->strings["Next"] = "Nächste";
-$a->strings["Check again"] = "Noch einmal testen";
-$a->strings["In order to install Friendica we need to know how to connect to your database."] = "Um Friendica installieren zu können müssen wir wissen wie wir zu deiner Datenbank Kontakt aufnehmen können.";
-$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Bitte kontaktiere den Hosting Provider oder den Administrator der Seite, falls du Fragen zu diesen Einstellungen haben solltest.";
-$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "Die Datenbank, die du unten angibst, sollte bereits existieren. Ist dies noch nicht der Fall, erzeuge sie bitte bevor du mit der Installation fortfährst.";
-$a->strings["Database Server Name"] = "Datenbank-Server";
-$a->strings["Database Login Name"] = "Datenbank-Nutzer";
-$a->strings["Database Login Password"] = "Datenbank-Passwort";
-$a->strings["Database Name"] = "Datenbank-Name";
-$a->strings["Site administrator email address"] = "E-Mail-Adresse des Administrators";
-$a->strings["Your account email address must match this in order to use the web admin panel."] = "Die E-Mail-Adresse, die in deinem Friendica-Account eingetragen, muss mit dieser Adresse übereinstimmen, damit du das Admin-Panel benutzen kannst.";
-$a->strings["Please select a default timezone for your website"] = "Bitte wähle die Standardzeitzone deiner Webseite";
-$a->strings["Site settings"] = "Server-Einstellungen";
-$a->strings["Could not find a command line version of PHP in the web server PATH."] = "Konnte keine Kommandozeilenversion von PHP im PATH des Servers finden.";
-$a->strings["PHP executable path"] = "Pfad zu PHP";
-$a->strings["Enter full path to php executable"] = "Kompletter Pfad zum PHP-Executable";
-$a->strings["Command line PHP"] = "Kommadozeilen-PHP";
-$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "Die Kommandozeilenversion von PHP auf deinem System hat \"register_argc_argv\" nicht aktiviert.";
-$a->strings["This is required for message delivery to work."] = "Dies wird für die Auslieferung von Nachrichten benötigt.";
-$a->strings["PHP \"register_argc_argv\""] = "PHP \"register_argc_argv\"";
-$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Fehler: Die Funktion \"openssl_pkey_new\" auf diesem System ist nicht in der Lage, Verschlüsselungsschlüssel zu erzeugen";
-$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Wenn der Server unter Windows läuft, schau dir bitte \"http://www.php.net/manual/en/openssl.installation.php\" an.";
-$a->strings["Generate encryption keys"] = "Schlüssel erzeugen";
-$a->strings["libCurl PHP module"] = "PHP: libCurl-Modul";
-$a->strings["GD graphics PHP module"] = "PHP: GD-Grafikmodul";
-$a->strings["OpenSSL PHP module"] = "PHP: OpenSSL-Modul";
-$a->strings["mysqli PHP module"] = "PHP: mysqli-Modul";
-$a->strings["mb_string PHP module"] = "PHP: mb_string-Modul";
-$a->strings["Apace mod_rewrite module"] = "Apache: mod_rewrite-Modul";
-$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Fehler: Das Apache-Modul mod-rewrite wird benötigt, es ist allerdings nicht installiert.";
-$a->strings["Error: libCURL PHP module required but not installed."] = "Fehler: Das libCURL PHP Modul wird benötigt ist aber nicht installiert.";
-$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Fehler: Das GD-Graphikmodul für PHP mit JPEG-Unterstützung ist nicht installiert.";
-$a->strings["Error: openssl PHP module required but not installed."] = "Fehler: Das openssl-Modul von PHP ist nicht installiert.";
-$a->strings["Error: mysqli PHP module required but not installed."] = "Fehler: Das mysqli-Modul von PHP ist nicht installiert.";
-$a->strings["Error: mb_string PHP module required but not installed."] = "Fehler: mb_string PHP Module wird benötigt ist aber nicht installiert.";
-$a->strings["The web installer needs to be able to create a file called \".htconfig.php\ in the top folder of your web server and it is unable to do so."] = "Der Installationswizard muss in der Lage sein, eine Datei im Stammverzeichnis deines Webservers anzulegen, ist allerdings derzeit nicht in der Lage, dies zu tun.";
-$a->strings["This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can."] = "In den meisten Fällen ist dies ein Problem mit den Schreibrechten, der Webserver könnte keine Schreiberlaubnis haben, selbst wenn du sie hast.";
-$a->strings["Please check with your site documentation or support people to see if this situation can be corrected."] = "Bitte überprüfe die Einstellungen und frage im Zweifelsfall dein Support Team, um diese Situation zu beheben.";
-$a->strings["If not, you may be required to perform a manual installation. Please see the file \"INSTALL.txt\" for instructions."] = "Sollte dies nicht möglich sein, musst du die Installation manuell durchführen. Lies dazu bitte in der Datei \"INSTALL.txt\".";
-$a->strings[".htconfig.php is writable"] = "Schreibrechte auf .htconfig.php";
-$a->strings["The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = "Die Konfigurationsdatei \".htconfig.php\" konnte nicht angelegt werden. Bitte verwende den angefügten Text um die Datei im Stammverzeichnis deiner Friendica-Installation zu erzeugen.";
-$a->strings["Errors encountered creating database tables."] = "Fehler aufgetreten während der Erzeugung der Datenbanktabellen.";
-$a->strings["Not available."] = "Nicht verfügbar.";
-$a->strings["Community"] = "Gemeinschaft";
-$a->strings["No results."] = "Keine Ergebnisse.";
-$a->strings["Shared content is covered by the <a href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons Attribution 3.0</a> license."] = "Geteilte Inhalte innerhalb des Friendica-Netzwerks sind unter der <a href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons Attribution 3.0</a> verfügbar.";
-$a->strings["Post successful."] = "Beitrag erfolgreich veröffentlicht.";
+$a->strings["No recipient selected."] = "Kein Empfänger gewählt.";
+$a->strings["Unable to locate contact information."] = "Konnte die Kontaktinformationen nicht finden.";
+$a->strings["Message could not be sent."] = "Nachricht konnte nicht gesendet werden.";
+$a->strings["Message collection failure."] = "Konnte Nachrichten nicht abrufen.";
+$a->strings["Message sent."] = "Nachricht gesendet.";
+$a->strings["Inbox"] = "Eingang";
+$a->strings["Outbox"] = "Ausgang";
+$a->strings["New Message"] = "Neue Nachricht";
+$a->strings["Message deleted."] = "Nachricht gelöscht.";
+$a->strings["Conversation removed."] = "Unterhaltung gelöscht.";
+$a->strings["Please enter a link URL:"] = "Bitte gib die URL des Links ein:";
+$a->strings["Send Private Message"] = "Private Nachricht senden";
+$a->strings["To:"] = "An:";
+$a->strings["Subject:"] = "Betreff:";
+$a->strings["Your message:"] = "Deine Nachricht:";
+$a->strings["No messages."] = "Keine Nachrichten.";
+$a->strings["Delete conversation"] = "Unterhaltung löschen";
+$a->strings["D, d M Y - g:i A"] = "D, d. M Y - g:i A";
+$a->strings["Message not available."] = "Nachricht nicht verfügbar.";
+$a->strings["Delete message"] = "Nachricht löschen";
+$a->strings["Send Reply"] = "Antwort senden";
+$a->strings["Friends of %s"] = "Freunde von %s";
+$a->strings["No friends to display."] = "Keine Freunde zum Anzeigen.";
$a->strings["Site"] = "Seite";
$a->strings["Users"] = "Nutzer";
$a->strings["Plugins"] = "Plugins";
@@ -657,23 +696,122 @@ $a->strings["FTP Host"] = "FTP Host";
$a->strings["FTP Path"] = "FTP Pfad";
$a->strings["FTP User"] = "FTP Nutzername";
$a->strings["FTP Password"] = "FTP Passwort";
+$a->strings["Requested profile is not available."] = "Profil nicht vorhanden.";
+$a->strings["Access to this profile has been restricted."] = "Der Zugriff zu diesem Profil wurde eingeschränkt.";
+$a->strings["Tips for New Members"] = "Tipps für neue Nutzer";
+$a->strings["{0} wants to be your friend"] = "{0} möchte mit dir in Kontakt treten";
+$a->strings["{0} sent you a message"] = "{0} hat dir eine Nachricht geschickt";
+$a->strings["{0} requested registration"] = "{0} möchte sich registrieren";
+$a->strings["{0} commented %s's post"] = "{0} kommentierte einen Beitrag von %s";
+$a->strings["{0} liked %s's post"] = "{0} mag %ss Beitrag";
+$a->strings["{0} disliked %s's post"] = "{0} mag %ss Beitrag nicht";
+$a->strings["{0} is now friends with %s"] = "{0} ist jetzt mit %s befreundet";
+$a->strings["{0} posted"] = "{0} hat etwas veröffentlicht";
+$a->strings["{0} tagged %s's post with #%s"] = "{0} hat %ss Beitrag mit dem Schlagwort #%s versehen";
+$a->strings["{0} mentioned you in a post"] = "{0} hat dich in einem Beitrag erwähnt";
+$a->strings["Login failed."] = "Annmeldung fehlgeschlagen.";
+$a->strings["Connect URL missing."] = "Connect-URL fehlt";
+$a->strings["This site is not configured to allow communications with other networks."] = "Diese Seite ist so konfiguriert, dass keine Kommunikation mit anderen Netzwerken erfolgen kann.";
+$a->strings["No compatible communication protocols or feeds were discovered."] = "Es wurden keine kompatiblen Kommunikationsprotokolle oder Feeds gefunden.";
+$a->strings["The profile address specified does not provide adequate information."] = "Die angegebene Profiladresse liefert unzureichende Informationen.";
+$a->strings["An author or name was not found."] = "Es wurde kein Autor oder Name gefunden.";
+$a->strings["No browser URL could be matched to this address."] = "Zu dieser Adresse konnte keine passende Browser URL gefunden werden.";
+$a->strings["The profile address specified belongs to a network which has been disabled on this site."] = "Die Adresse dieses Profils gehört zu einem Netzwerk mit dem die Kommunikation auf dieser Seite ausgeschaltet wurde.";
+$a->strings["Limited profile. This person will be unable to receive direct/personal notifications from you."] = "Eingeschränktes Profil. Diese Person wird keine direkten/privaten Nachrichten von dir erhalten können.";
+$a->strings["Unable to retrieve contact information."] = "Konnte die Kontaktinformationen nicht empfangen.";
+$a->strings["following"] = "folgen";
+$a->strings["Common Friends"] = "Gemeinsame Freunde";
+$a->strings["No friends in common."] = "Keine gemeinsamen Freunde.";
+$a->strings["Item has been removed."] = "Eintrag wurde entfernt.";
+$a->strings["Applications"] = "Anwendungen";
+$a->strings["No installed applications."] = "Keine Applikationen installiert.";
+$a->strings["Search This Site"] = "Diese Seite durchsuchen";
+$a->strings["Profile not found."] = "Profil nicht gefunden.";
+$a->strings["Profile Name is required."] = "Profilname ist erforderlich.";
+$a->strings["Profile updated."] = "Profil aktualisiert.";
+$a->strings["Profile deleted."] = "Profil gelöscht.";
+$a->strings["Profile-"] = "Profil-";
+$a->strings["New profile created."] = "Neues Profil angelegt.";
+$a->strings["Profile unavailable to clone."] = "Profil nicht zum Duplizieren verfügbar.";
+$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Liste der Kontakte vor Betrachtern dieses Profils verbergen?";
+$a->strings["Edit Profile Details"] = "Profil bearbeiten";
+$a->strings["View this profile"] = "Dieses Profil anzeigen";
+$a->strings["Create a new profile using these settings"] = "Neues Profil anlegen und diese Einstellungen verwenden";
+$a->strings["Clone this profile"] = "Dieses Profil duplizieren";
+$a->strings["Delete this profile"] = "Dieses Profil löschen";
+$a->strings["Profile Name:"] = "Profilname:";
+$a->strings["Your Full Name:"] = "Dein kompletter Name:";
+$a->strings["Title/Description:"] = "Titel/Beschreibung:";
+$a->strings["Your Gender:"] = "Dein Geschlecht:";
+$a->strings["Birthday (%s):"] = "Geburtstag (%s):";
+$a->strings["Street Address:"] = "Adresse:";
+$a->strings["Locality/City:"] = "Wohnort/Stadt:";
+$a->strings["Postal/Zip Code:"] = "Postleitzahl:";
+$a->strings["Country:"] = "Land:";
+$a->strings["Region/State:"] = "Region/Bundesstaat:";
+$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "<span class=\"heart\">&hearts;</span> Beziehungsstatus:";
+$a->strings["Who: (if applicable)"] = "Wer: (falls anwendbar)";
+$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Beispiele: cathy123, Cathy Williams, cathy@example.com";
+$a->strings["Sexual Preference:"] = "Sexuelle Vorlieben:";
+$a->strings["Homepage URL:"] = "Adresse der Homepage:";
+$a->strings["Political Views:"] = "Politische Ansichten:";
+$a->strings["Religious Views:"] = "Religiöse Ansichten:";
+$a->strings["Public Keywords:"] = "Öffentliche Schlüsselwörter:";
+$a->strings["Private Keywords:"] = "Private Schlüsselwörter:";
+$a->strings["Example: fishing photography software"] = "Beispiel: Fischen Fotografie Software";
+$a->strings["(Used for suggesting potential friends, can be seen by others)"] = "(Wird verwendet um potentielle Freunde zu finden, könnte von Fremden eingesehen werden)";
+$a->strings["(Used for searching profiles, never shown to others)"] = "(Wird für die Suche nach Profilen verwendet und niemals veröffentlicht)";
+$a->strings["Tell us about yourself..."] = "Erzähle uns ein bisschen von dir …";
+$a->strings["Hobbies/Interests"] = "Hobbies/Interessen";
+$a->strings["Contact information and Social Networks"] = "Kontaktinformationen und Soziale Netzwerke";
+$a->strings["Musical interests"] = "Musikalische Interessen";
+$a->strings["Books, literature"] = "Literatur/Bücher";
+$a->strings["Television"] = "Fernsehen";
+$a->strings["Film/dance/culture/entertainment"] = "Filme/Tänze/Kultur/Unterhaltung";
+$a->strings["Love/romance"] = "Liebesleben";
+$a->strings["Work/employment"] = "Arbeit/Beschäftigung";
+$a->strings["School/education"] = "Schule/Ausbildung";
+$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Dies ist dein <strong>öffentliches</strong> Profil.<br />Es <strong>könnte</strong> für jeden Nutzer des Internets sichtbar sein.";
+$a->strings["Age: "] = "Alter: ";
+$a->strings["Edit/Manage Profiles"] = "Verwalte/Editiere Profile";
+$a->strings["Change profile photo"] = "Profilbild ändern";
+$a->strings["Create New Profile"] = "Neues Profil anlegen";
+$a->strings["Profile Image"] = "Profilbild";
+$a->strings["visible to everybody"] = "sichtbar für jeden";
+$a->strings["Edit visibility"] = "Sichtbarkeit bearbeiten";
+$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s hat %2\$ss %3\$s mit %4\$s getaggt";
+$a->strings["No potential page delegates located."] = "Keine potentiellen Bevollmächtigte für die Seite gefunden.";
+$a->strings["Delegate Page Management"] = "Delegiere das Management für die Seite";
+$a->strings["Delegates are able to manage all aspects of this account/page except for basic account settings. Please do not delegate your personal account to anybody that you do not trust completely."] = "Bevollmächtigte sind in der Lage alle Aspekte dieses Accounts/dieser Seite zu verwalten, abgesehen von den Grundeinstellungen des Accounts. Bitte gib Niemandem eine Bevollmächtigung für deinen privaten Account dem du nicht absolut vertraust.";
+$a->strings["Existing Page Managers"] = "Vorhandene Seiten Manager";
+$a->strings["Existing Page Delegates"] = "Vorhandene Bevollmächtigte für die Seite";
+$a->strings["Potential Delegates"] = "Potentielle Bevollmächtigte";
+$a->strings["Add"] = "Hinzufügen";
+$a->strings["No entries."] = "Keine Einträge";
$a->strings["Friend Suggestions"] = "Kontaktvorschläge";
$a->strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Keine Vorschläge. Falls der Server frisch aufgesetzt wurde, versuche es bitte in 24 Stunden noch einmal.";
-$a->strings["Connect"] = "Verbinden";
$a->strings["Ignore/Hide"] = "Ignorieren/Verbergen";
-$a->strings["Access to this profile has been restricted."] = "Der Zugriff zu diesem Profil wurde eingeschränkt.";
-$a->strings["Item has been removed."] = "Eintrag wurde entfernt.";
-$a->strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s mag %2\$ss %3\$s";
-$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s mag %2\$ss %3\$s nicht";
-$a->strings["Profile Match"] = "Profilübereinstimmungen";
-$a->strings["No keywords to match. Please add keywords to your default profile."] = "Keine Schlüsselwörter zum Abgleichen gefunden. Bitte füge einige Schlüsselwörter zu deinem Standardprofil hinzu.";
-$a->strings["is interested in:"] = "ist interessiert an:";
-$a->strings["Personal Notes"] = "Persönliche Notizen";
-$a->strings["Save"] = "Speichern";
-$a->strings["Help:"] = "Hilfe:";
-$a->strings["Help"] = "Hilfe";
-$a->strings["Not Found"] = "Nicht gefunden";
-$a->strings["Page not found."] = "Seite nicht gefunden.";
+$a->strings["Global Directory"] = "Weltweites Verzeichnis";
+$a->strings["Normal site view"] = "Normale Seitenansicht";
+$a->strings["Admin - View all site entries"] = "Admin: Alle Einträge dieses Servers anzeigen";
+$a->strings["Find on this site"] = "Auf diesem Server suchen";
+$a->strings["Site Directory"] = "Verzeichnis";
+$a->strings["Gender: "] = "Geschlecht:";
+$a->strings["No entries (some entries may be hidden)."] = "Keine Einträge (einige Einträge könnten versteckt sein).";
+$a->strings["%s : Not a valid email address."] = "%s: Keine gültige Email Adresse.";
+$a->strings["Please join my network on %s"] = "Bitte trete meinem Netzwerk auf %s bei";
+$a->strings["%s : Message delivery failed."] = "%s: Zustellung der Nachricht fehlgeschlagen.";
+$a->strings["%d message sent."] = array(
+ 0 => "%d Nachricht gesendet.",
+ 1 => "%d Nachrichten gesendet.",
+);
+$a->strings["You have no more invitations available"] = "Du hast keine weiteren Einladungen";
+$a->strings["Send invitations"] = "Einladungen senden";
+$a->strings["Enter email addresses, one per line:"] = "E-Mail-Adressen eingeben, eine pro Zeile:";
+$a->strings["Please join my social network on %s"] = "Bitte trete meinem Sozialen Netzwerk auf %s bei";
+$a->strings["To accept this invitation, please visit:"] = "Um diese Einladung anzunehmen besuche bitte:";
+$a->strings["You will need to supply this invitation code: \$invite_code"] = "Du benötigst den folgenden Einladungs Code: \$invite_code";
+$a->strings["Once you have registered, please connect with me via my profile page at:"] = "Sobald du registriert bist, kontaktiere mich bitte auf meiner Profilseite:";
$a->strings["Response from remote site was not understood."] = "Antwort der entfernten Gegenstelle unverständlich.";
$a->strings["Unexpected response from remote site: "] = "Unerwartete Antwort der Gegenstelle: ";
$a->strings["Confirmation completed successfully."] = "Bestätigung erfolgreich abgeschlossen.";
@@ -691,227 +829,195 @@ $a->strings["The ID provided by your system is a duplicate on our system. It sho
$a->strings["Unable to set your contact credentials on our system."] = "Deine Kontaktreferenzen konnten nicht in unserem System gespeichert werden.";
$a->strings["Unable to update your contact profile details on our system"] = "Die Updates für dein Profil konnten nicht gespeichert werden";
$a->strings["Connection accepted at %s"] = "Auf %s wurde die Verbindung akzeptiert";
-$a->strings["Requested profile is not available."] = "Profil nicht vorhanden.";
-$a->strings["Tips for New Members"] = "Tipps für neue Nutzer";
-$a->strings["Unable to locate original post."] = "Konnte den Originalbeitrag nicht finden.";
-$a->strings["Empty post discarded."] = "Leerer Beitrag wurde verworfen.";
-$a->strings["System error. Post not saved."] = "Systemfehler. Beitrag konnte nicht gespeichert werden.";
-$a->strings["This message was sent to you by %s, a member of the Friendica social network."] = "Diese Nachricht wurde dir von %s geschickt, einem Mitglied des Sozialen Netzwerks Friendica.";
-$a->strings["You may visit them online at %s"] = "Du kannst sie online unter %s besuchen";
-$a->strings["Please contact the sender by replying to this post if you do not wish to receive these messages."] = "Falls du diese Beiträge nicht erhalten möchtest, kontaktiere bitte den Autor, indem du auf diese Nachricht antwortest.";
-$a->strings["%s posted an update."] = "%s hat ein Update veröffentlicht.";
-$a->strings["Saved Searches"] = "Gespeicherte Suchen";
-$a->strings["Remove term"] = "Begriff entfernen";
-$a->strings["Search This Site"] = "Diese Seite durchsuchen";
-$a->strings["Photo Albums"] = "Fotoalben";
-$a->strings["Contact Photos"] = "Kontaktbilder";
-$a->strings["Contact information unavailable"] = "Kontaktinformationen nicht verfügbar";
-$a->strings["Album not found."] = "Album nicht gefunden.";
-$a->strings["Delete Album"] = "Album löschen";
-$a->strings["Delete Photo"] = "Foto löschen";
-$a->strings["was tagged in a"] = "wurde getaggt in einem";
-$a->strings["by"] = "von";
-$a->strings["Image exceeds size limit of "] = "Die Bildgröße übersteigt das Limit von ";
-$a->strings["Image file is empty."] = "Bilddatei ist leer.";
-$a->strings["No photos selected"] = "Keine Bilder ausgewählt";
-$a->strings["Access to this item is restricted."] = "Zugriff zu diesem Eintrag wurde eingeschränkt.";
-$a->strings["Upload Photos"] = "Bilder hochladen";
-$a->strings["New album name: "] = "Name des neuen Albums: ";
-$a->strings["or existing album name: "] = "oder existierender Albumname: ";
-$a->strings["Do not show a status post for this upload"] = "Keine Status-Mitteilung für diesen Beitrag anzeigen";
-$a->strings["Permissions"] = "Berechtigungen";
-$a->strings["Edit Album"] = "Album bearbeiten";
-$a->strings["View Photo"] = "Fotos betrachten";
-$a->strings["Permission denied. Access to this item may be restricted."] = "Zugriff verweigert. Zugriff zu diesem Eintrag könnte eingeschränkt sein.";
-$a->strings["Photo not available"] = "Foto nicht verfügbar";
-$a->strings["View photo"] = "Fotos ansehen";
-$a->strings["Edit photo"] = "Foto bearbeiten";
-$a->strings["Use as profile photo"] = "Als Profilbild verwenden";
-$a->strings["Private Message"] = "Private Nachricht";
-$a->strings["View Full Size"] = "Betrachte Originalgröße";
-$a->strings["Tags: "] = "Tags: ";
-$a->strings["[Remove any tag]"] = "[Tag entfernen]";
-$a->strings["New album name"] = "Name des neuen Albums";
-$a->strings["Caption"] = "Bildunterschrift";
-$a->strings["Add a Tag"] = "Tag hinzufügen";
-$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "Beispiel: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping";
-$a->strings["I like this (toggle)"] = "Ich mag das (toggle)";
-$a->strings["I don't like this (toggle)"] = "Ich mag das nicht (toggle)";
-$a->strings["Share"] = "Teilen";
-$a->strings["This is you"] = "Das bist du";
-$a->strings["Comment"] = "Kommentar";
-$a->strings["Preview"] = "Vorschau";
-$a->strings["View Album"] = "Album betrachten";
-$a->strings["Recent Photos"] = "Neueste Fotos";
-$a->strings["Upload New Photos"] = "Weitere Fotos hochladen";
-$a->strings["Search Results For:"] = "Suchergebnisse für:";
-$a->strings["add"] = "hinzufügen";
-$a->strings["Commented Order"] = "Neueste Kommentare";
-$a->strings["Posted Order"] = "Neueste Beiträge";
-$a->strings["New"] = "Neue";
-$a->strings["Starred"] = "Markierte";
-$a->strings["Bookmarks"] = "Lesezeichen";
-$a->strings["Warning: This group contains %s member from an insecure network."] = array(
- 0 => "",
- 1 => "",
+$a->strings["Facebook disabled"] = "Facebook deaktiviert";
+$a->strings["Updating contacts"] = "Aktualisiere Kontakte";
+$a->strings["Facebook API key is missing."] = "Facebook-API-Schlüssel nicht gefunden";
+$a->strings["Facebook Connect"] = "Mit Facebook verbinden";
+$a->strings["Install Facebook connector for this account."] = "Facebook-Connector für diesen Account installieren.";
+$a->strings["Remove Facebook connector"] = "Facebook-Connector entfernen";
+$a->strings["Re-authenticate [This is necessary whenever your Facebook password is changed.]"] = "Neu authentifizieren [Das ist immer dann nötig, wenn Du Dein Facebook-Passwort geändert hast.]";
+$a->strings["Post to Facebook by default"] = "Veröffentliche standardmäßig bei Facebook";
+$a->strings["Link all your Facebook friends and conversations on this website"] = "All meine Facebook-Kontakte und -Konversationen hier auf diese Website importieren";
+$a->strings["Facebook conversations consist of your <em>profile wall</em> and your friend <em>stream</em>."] = "Facebook-Konversationen sind alles, was auf deiner <em>Pinnwand</em> erscheint, und die Beiträge deiner Freunde <em>(Stream).</em>";
+$a->strings["On this website, your Facebook friend stream is only visible to you."] = "Hier auf dieser Webseite kannst nur du die Beiträge Deiner Facebook-Freunde (Stream) sehen.";
+$a->strings["The following settings determine the privacy of your Facebook profile wall on this website."] = "Mit den folgenden Einstellungen kannst Du die Privatsphäre der Kopie Deiner Facebook-Pinnwand hier auf dieser Seite einstellen.";
+$a->strings["On this website your Facebook profile wall conversations will only be visible to you"] = "Meine Facebook-Pinnwand hier auf dieser Webseite nur für mich sichtbar machen";
+$a->strings["Do not import your Facebook profile wall conversations"] = "Facebook-Pinnwand nicht importieren";
+$a->strings["If you choose to link conversations and leave both of these boxes unchecked, your Facebook profile wall will be merged with your profile wall on this website and your privacy settings on this website will be used to determine who may see the conversations."] = "Wenn Du Facebook-Konversationen importierst und diese beiden Häkchen nicht setzt, wird Deine Facebook-Pinnwand mit der Pinnwand hier auf dieser Webseite vereinigt. Die Privatsphäre-Einstellungen für Deine Pinnwand auf dieser Webseite geben dann an, wer die Konversationen sehen kann.";
+$a->strings["Comma separated applications to ignore"] = "Komma separierte Liste von Anwendungen die ignoriert werden sollen";
+$a->strings["Facebook"] = "Facebook";
+$a->strings["Facebook Connector Settings"] = "Facebook-Verbindungseinstellungen";
+$a->strings["Post to Facebook"] = "Bei Facebook veröffentlichen";
+$a->strings["Post to Facebook cancelled because of multi-network access permission conflict."] = "Beitrag wurde nicht bei Facebook veröffentlicht, da Konflikte bei den Multi-Netzwerk-Zugriffsrechten vorliegen.";
+$a->strings["Image: "] = "Bild: ";
+$a->strings["View on Friendica"] = "In Friendica betrachten";
+$a->strings["Facebook post failed. Queued for retry."] = "Veröffentlichung bei Facebook gescheitert. Wir versuchen es später erneut.";
+$a->strings["link"] = "Verweis";
+$a->strings["%d person likes this"] = array(
+ 0 => "%d Person mag das",
+ 1 => "%d Leuten mögen das",
);
-$a->strings["Private messages to this group are at risk of public disclosure."] = "Private Nachrichten an diese Gruppe könnten an die Öffentlichkeit geraten.";
-$a->strings["No such group"] = "Es gibt keine solche Gruppe";
-$a->strings["Group is empty"] = "Gruppe ist leer";
-$a->strings["Group: "] = "Gruppe: ";
-$a->strings["Contact: "] = "Kontakt: ";
-$a->strings["Private messages to this person are at risk of public disclosure."] = "Private Nachrichten an diese Person könnten an die Öffentlichkeit gelangen.";
-$a->strings["Invalid contact."] = "Ungültiger Kontakt.";
-$a->strings["Authorize application connection"] = "Verbindung der Applikation authorisieren";
-$a->strings["Return to your app and insert this Securty Code:"] = "Gehe zu deiner Anwendung zurück und trage dort folgenden Sicherheitscode ein:";
-$a->strings["Please login to continue."] = "Bitte melde dich an um fortzufahren.";
-$a->strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Möchtest du dieser Anwendung den Zugriff auf deine Beiträge und Kontakte sowie die Erstellung neuer Beiträge in deinem Namen gestatten?";
-$a->strings["This is Friendica, version"] = "Dies ist Friendica version";
-$a->strings["running at web location"] = "die unter folgender Webadresse zu finden ist";
-$a->strings["Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn more about the Friendica project."] = "Bitte besuche <a href=\"http://friendica.com\">Friendica.com</a> um mehr über das Friendica Projekt zu erfahren.";
-$a->strings["Bug reports and issues: please visit"] = "Probleme oder Fehler gefunden? Bitte besuche";
-$a->strings["Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - dot com"] = "Vorschläge, Lob, Spenden usw.: E-Mail an \"Info\" at Friendica - dot com";
-$a->strings["Installed plugins/addons/apps"] = "Installierte Plugins/Erweiterungen/Apps";
-$a->strings["No installed plugins/addons/apps"] = "Keine Plugins/Erweiterungen/Apps installiert";
-$a->strings["Item not available."] = "Beitrag nicht verfügbar.";
-$a->strings["Item was not found."] = "Beitrag konnte nicht gefunden werden.";
-$a->strings["View Contacts"] = "Kontakte anzeigen";
-$a->strings["No contacts."] = "Keine Kontakte.";
-$a->strings["Tag removed"] = "Tag entfernt";
-$a->strings["Remove Item Tag"] = "Gegenstands-Tag entfernen";
-$a->strings["Select a tag to remove: "] = "Wähle ein Tag zum Entfernen aus: ";
-$a->strings["Remove"] = "Entfernen";
-$a->strings["Group created."] = "Gruppe erstellt.";
-$a->strings["Could not create group."] = "Konnte die Gruppe nicht erstellen.";
-$a->strings["Group not found."] = "Gruppe nicht gefunden.";
-$a->strings["Group name changed."] = "Gruppenname geändert.";
-$a->strings["Permission denied"] = "Zugriff verweigert";
-$a->strings["Create a group of contacts/friends."] = "Eine Gruppe von Kontakten/Freunden anlegen.";
-$a->strings["Group Name: "] = "Gruppenname:";
-$a->strings["Group removed."] = "Gruppe entfernt.";
-$a->strings["Unable to remove group."] = "Konnte die Gruppe nicht entfernen.";
-$a->strings["Click on a contact to add or remove."] = "Klicke einen Kontakt an, um ihn hinzuzufügen oder zu entfernen";
-$a->strings["Group Editor"] = "Gruppeneditor";
-$a->strings["Members"] = "Mitglieder";
-$a->strings["All Contacts"] = "Alle Kontakte";
-$a->strings["Event description and start time are required."] = "Ereignis Beschreibung und Startzeit sind erforderlich.";
-$a->strings["Events"] = "Veranstaltungen";
-$a->strings["Create New Event"] = "Neue Veranstaltung erstellen";
-$a->strings["Previous"] = "Vorherige";
-$a->strings["l, F j"] = "l, F j";
-$a->strings["Edit event"] = "Veranstaltung bearbeiten";
-$a->strings["link to source"] = "Link zum Originalbeitrag";
-$a->strings["hour:minute"] = "Stunde:Minute";
-$a->strings["Event details"] = "Veranstaltungsdetails";
-$a->strings["Format is %s %s. Starting date and Description are required."] = "Format ist %s %s. Anfangsdatum und Beschreibung sind notwendig.";
-$a->strings["Event Starts:"] = "Veranstaltungsbeginn:";
-$a->strings["Finish date/time is not known or not relevant"] = "Enddatum/-zeit ist nicht bekannt oder nicht relevant";
-$a->strings["Event Finishes:"] = "Veranstaltungsende:";
-$a->strings["Adjust for viewer timezone"] = "An Zeitzone des Betrachters anpassen";
-$a->strings["Description:"] = "Beschreibung";
-$a->strings["Location:"] = "Ort:";
-$a->strings["Share this event"] = "Veranstaltung teilen";
-$a->strings["Invalid profile identifier."] = "Ungültiger Profil-Bezeichner";
-$a->strings["Profile Visibility Editor"] = "Editor für die Profil-Sichtbarkeit";
-$a->strings["Profile"] = "Profil";
-$a->strings["Visible To"] = "Sichtbar für";
-$a->strings["All Contacts (with secure profile access)"] = "Alle Kontakte (mit gesichertem Profilzugriff)";
-$a->strings["%s welcomes %s"] = "%s heißt %s herzlich willkommen";
-$a->strings["Remote privacy information not available."] = "Entfernte Privatsphäreneinstellungen nicht verfügbar.";
-$a->strings["Visible to:"] = "Sichtbar für:";
-$a->strings["Welcome to %s"] = "Willkommen zu %s";
-$a->strings["Miscellaneous"] = "Verschiedenes";
-$a->strings["year"] = "Jahr";
-$a->strings["month"] = "Monat";
-$a->strings["day"] = "Tag";
-$a->strings["never"] = "nie";
-$a->strings["less than a second ago"] = "vor weniger als einer Sekunde";
-$a->strings["years"] = "Jahre";
-$a->strings["months"] = "Monate";
-$a->strings["week"] = "Woche";
-$a->strings["weeks"] = "Wochen";
-$a->strings["days"] = "Tage";
-$a->strings["hour"] = "Stunde";
-$a->strings["hours"] = "Stunden";
-$a->strings["minute"] = "Minute";
-$a->strings["minutes"] = "Minuten";
-$a->strings["second"] = "Sekunde";
-$a->strings["seconds"] = "Sekunden";
-$a->strings[" ago"] = " her";
-$a->strings["Birthday:"] = "Geburtstag:";
-$a->strings["Cannot locate DNS info for database server '%s'"] = "Kann die DNS Informationen für den Datenbanken Server '%s' nicht ermitteln.";
-$a->strings["prev"] = "vorige";
-$a->strings["first"] = "erste";
-$a->strings["last"] = "letzte";
-$a->strings["next"] = "nächste";
-$a->strings["No contacts"] = "Keine Kontakte";
-$a->strings["%d Contact"] = array(
- 0 => "%d Kontakt",
- 1 => "%d Kontakte",
+$a->strings["%d person doesn't like this"] = array(
+ 0 => " %d Person mag das nicht",
+ 1 => "%d Leute mögen das nicht",
);
-$a->strings["Search"] = "Suche";
-$a->strings["Monday"] = "Montag";
-$a->strings["Tuesday"] = "Dienstag";
-$a->strings["Wednesday"] = "Mittwoch";
-$a->strings["Thursday"] = "Donnerstag";
-$a->strings["Friday"] = "Freitag";
-$a->strings["Saturday"] = "Samstag";
-$a->strings["Sunday"] = "Sonntag";
-$a->strings["January"] = "Januar";
-$a->strings["February"] = "Februar";
-$a->strings["March"] = "März";
-$a->strings["April"] = "April";
-$a->strings["May"] = "Mai";
-$a->strings["June"] = "Juni";
-$a->strings["July"] = "Juli";
-$a->strings["August"] = "August";
-$a->strings["September"] = "September";
-$a->strings["October"] = "Oktober";
-$a->strings["November"] = "November";
-$a->strings["December"] = "Dezember";
-$a->strings["bytes"] = "Byte";
-$a->strings["Select an alternate language"] = "Alternative Sprache auswählen";
-$a->strings["default"] = "standard";
-$a->strings["From: "] = "Von: ";
-$a->strings["Logout"] = "Abmelden";
-$a->strings["End this session"] = "Diese Sitzung beenden";
-$a->strings["Status"] = "Status";
-$a->strings["Your posts and conversations"] = "Deine Beiträge und Unterhaltungen";
-$a->strings["Your profile page"] = "Deine Profilseite";
-$a->strings["Photos"] = "Bilder";
-$a->strings["Your photos"] = "Deine Fotos";
-$a->strings["Your events"] = "Deine Ereignisse";
-$a->strings["Personal notes"] = "Persönliche Notizen";
-$a->strings["Your personal photos"] = "Deine privaten Fotos";
+$a->strings["Generate new key"] = "Neuen Schlüssel erstellen";
+$a->strings["Widgets key"] = "Widgets Schlüssel";
+$a->strings["Widgets available"] = "Verfügbare Widgets";
+$a->strings["Connect on Friendica!"] = "In Friendica verbinden!";
+$a->strings["YourLS Settings"] = "YourLS Einstellungen";
+$a->strings["URL: http://"] = "URL: http://";
+$a->strings["Username:"] = "Nutzername:";
+$a->strings["Password:"] = "Passwort:";
+$a->strings["Use SSL "] = "SSL Verwenden ";
+$a->strings["yourls Settings saved."] = "yourls Einstellungen gespeichert";
+$a->strings["\"Not Safe For Work\" Settings"] = "\"Not Safe For Work\"-Einstellungen";
+$a->strings["Enable NSFW filter"] = "NSFW Filter aktivieren";
+$a->strings["Comma separated words to treat as NSFW"] = "Wörter, die gefiltert werden sollen (durch Kommas getrennt)";
+$a->strings["Use /expression/ to provide regular expressions"] = "Verwende /expression/ um Reguläre Ausdrücke zu verwenden";
+$a->strings["NSFW Settings saved."] = "NSFW-Einstellungen gespeichert";
+$a->strings["%s - Click to open/close"] = "%s – Zum Öffnen/Schließen klicken";
$a->strings["Login"] = "Anmeldung";
-$a->strings["Sign in"] = "Anmelden";
-$a->strings["Home Page"] = "Homepage";
-$a->strings["Create an account"] = "Account erstellen";
-$a->strings["Help and documentation"] = "Hilfe und Dokumentation";
-$a->strings["Apps"] = "Apps";
-$a->strings["Addon applications, utilities, games"] = "Addon Anwendungen, Dienstprogramme, Spiele";
-$a->strings["Search site content"] = "Inhalt der Seite durchsuchen";
-$a->strings["Conversations on this site"] = "Unterhaltungen auf dieser Seite";
-$a->strings["Directory"] = "Verzeichnis";
-$a->strings["People directory"] = "Nutzerverzeichnis";
-$a->strings["Conversations from your friends"] = "Unterhaltungen deiner Kontakte";
-$a->strings["Friend Requests"] = "Kontaktanfragen";
-$a->strings["Private mail"] = "Private Email";
-$a->strings["Manage"] = "Verwalten";
-$a->strings["Manage other pages"] = "Andere Seiten verwalten";
-$a->strings["Profiles"] = "Profile";
-$a->strings["Manage/edit profiles"] = "Profile verwalten/editieren";
-$a->strings["Manage/edit friends and contacts"] = "Freunde und Kontakte verwalten/editieren";
-$a->strings["Admin"] = "Administration";
-$a->strings["Site setup and configuration"] = "Einstellungen der Seite und Konfiguration";
-$a->strings["Nothing new here"] = "Keine Neuigkeiten.";
-$a->strings["[no subject]"] = "[kein Betreff]";
+$a->strings["OpenID"] = "OpenID";
+$a->strings["Last users"] = "Letzte Nutzer";
+$a->strings["Most active users"] = "Aktivste Nutzer";
+$a->strings["Last photos"] = "Letzte Fotos";
+$a->strings["Last likes"] = "Zuletzt gemocht";
+$a->strings["event"] = "Veranstaltung";
+$a->strings["Allow to use your friendica id (%s) to connecto to external unhosted-enabled storage (like ownCloud). See <a href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>"] = "Ermöglicht es deine friendica id (%s) mit externen unhosted-fähigen Speichern (z.B. ownCloud) zu verbinden. Siehe <a href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>";
+$a->strings["Template URL (with {category})"] = "Vorlagen URL (mit {Kategorie})";
+$a->strings["OAuth end-point"] = "OAuth end-point";
+$a->strings["Api"] = "Api";
+$a->strings["Member since:"] = "Mitglied seit:";
+$a->strings["Three Dimensional Tic-Tac-Toe"] = "Dreidimensionales Tic-Tac-Toe";
+$a->strings["3D Tic-Tac-Toe"] = "3D Tic-Tac-Toe";
+$a->strings["New game"] = "Neues Spiel";
+$a->strings["New game with handicap"] = "Neues Handicap Spiel";
+$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "3D-Tic-Tac-Toe ist genauso wie das herkömmliche Spiel, nur dass man es auf mehreren Ebenen gleichzeitig spielt.";
+$a->strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "In diesem Fall sind es drei Ebenen. Man gewinnt indem man drei in einer Reihe auf einer beliebigen Reihe schafft, oder drei übereinander oder diagonal auf verschiedenen Ebenen.";
+$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "Beim Handicap-Spiel wird die zentrale Position der mittleren Ebene gesperrt da der Spieler der diese Ebene besitzt oft einen unfairen Vorteil genießt.";
+$a->strings["You go first..."] = "Du fängst an...";
+$a->strings["I'm going first this time..."] = "Diesmal fange ich an...";
+$a->strings["You won!"] = "Du gewinnst!";
+$a->strings["\"Cat\" game!"] = "Unentschieden!";
+$a->strings["I won!"] = "Ich gewinne!";
+$a->strings["Randplace Settings"] = "Randplace-Einstellungen";
+$a->strings["Enable Randplace Plugin"] = "Randplace-Plugin aktivieren";
+$a->strings["Post to Drupal"] = "Bei Drupal veröffentlichen";
+$a->strings["Drupal Post Settings"] = "Drupal-Beitragseinstellungen";
+$a->strings["Enable Drupal Post Plugin"] = "Veröffentlichung bei Drupal erlauben";
+$a->strings["Drupal username"] = "Drupal Nutzername";
+$a->strings["Drupal password"] = "Drupal Passwort";
+$a->strings["Post Type - article,page,or blog"] = "Beitragstyp - Artikel, Seite oder Blog";
+$a->strings["Drupal site URL"] = "URL der Drupal Seite";
+$a->strings["Drupal site uses clean URLS"] = "Drupal Seite verwendet bereinigte URLs";
+$a->strings["Post to Drupal by default"] = "Veröffentliche öffentliche Beiträge standardmäßig bei Drupal";
+$a->strings["Post from Friendica"] = "Beitrag via Friendica";
+$a->strings["Geonames settings updated."] = "Geonames Einstellungen aktualisiert";
+$a->strings["Geonames Settings"] = "Geonames Einstellungen";
+$a->strings["Enable Geonames Plugin"] = "Geonames Plugin aktivieren";
+$a->strings["Upload a file"] = "Datei hochladen";
+$a->strings["Drop files here to upload"] = "Ziehe die Dateien hierher die du hochladen willst";
+$a->strings["Failed"] = "Fehlgeschlagen";
+$a->strings["No files were uploaded."] = "Keine Dateien hochgeladen.";
+$a->strings["Uploaded file is empty"] = "Hochgeladene Datei ist leer";
+$a->strings["File has an invalid extension, it should be one of "] = "Die Dateierweiterung ist nicht erlaubt, sie muss eine der folgenden sein ";
+$a->strings["Upload was cancelled, or server error encountered"] = "Upload abgebrochen oder Serverfehler aufgetreten";
+$a->strings["OEmbed settings updated"] = "OEmbed Einstellungen aktualisiert.";
+$a->strings["Use OEmbed for YouTube videos"] = "OEmbed für Youtube Videos verwenden";
+$a->strings["URL to embed:"] = "URL zum Einbetten:";
+$a->strings["Impressum"] = "Impressum";
+$a->strings["Site Owner"] = "Betreiber der Seite";
+$a->strings["Email Address"] = "Email Adresse";
+$a->strings["Postal Address"] = "Postalische Anschrift";
+$a->strings["The impressum addon needs to be configured!<br />Please add at least the <tt>owner</tt> variable to your config file. For other variables please refer to the README file of the addon."] = "Das Impressums-Plugin muss noch konfiguriert werden.<br />Bitte gebe mindestens den <tt>Betreiber</tt> in der Konfiguration an. Alle weiteren Parameter werden in der README-Datei des Addons erläutert.";
+$a->strings["Site Owners Profile"] = "Profil des Seitenbetreibers";
+$a->strings["Notes"] = "Hinweise";
+$a->strings["Report Bug"] = "Fehlerreport erstellen";
+$a->strings["\"Blockem\" Settings"] = "\"Blockem\"-Einstellungen";
+$a->strings["Comma separated profile URLS to block"] = "Profil-URLs, die blockiert werden sollen (durch Kommas getrennt)";
+$a->strings["BLOCKEM Settings saved."] = "BLOCKEM-Einstellungen gesichert.";
+$a->strings["Blocked %s - Click to open/close"] = "%s blockiert - Zum Öffnen/Schließen klicken";
+$a->strings["Unblock Author"] = "Autor freischalten";
+$a->strings["Block Author"] = "Autor blockieren";
+$a->strings["blockem settings updated"] = "blockem Einstellungen aktualisiert";
+$a->strings["Editplain settings updated."] = "Editplain Einstellungen aktualisiert";
+$a->strings["Editplain Settings"] = "Editplain Einstellungen";
+$a->strings["Disable richtext status editor"] = "RichText Editor deaktivieren";
+$a->strings["\"pageheader\" Settings"] = "\"pageheader\"-Einstellungen";
+$a->strings["pageheader Settings saved."] = "pageheader-Einstellungen gespeichert.";
+$a->strings["View Source"] = "Quelle ansehen";
+$a->strings["Post to StatusNet"] = "Bei StatusNet veröffentlichen";
+$a->strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "Bitte kontaktiere den Administrator des Servers.<br />Die angegebene API-URL ist nicht gültig.";
+$a->strings["We could not contact the StatusNet API with the Path you entered."] = "Die StatusNet-API konnte mit dem angegebenen Pfad nicht erreicht werden.";
+$a->strings["StatusNet settings updated."] = "StatusNet Einstellungen aktualisiert.";
+$a->strings["StatusNet Posting Settings"] = "StatusNet-Beitragseinstellungen";
+$a->strings["Globally Available StatusNet OAuthKeys"] = "Verfügbare OAuth Schlüssel für StatusNet";
+$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "Für einige StatusNet Server sind OAuth Schlüsselpaare verfügbar. Solltest du einen dieser Server benutzen, dann verwende doch bitte diese Schlüssel. Falls nicht kannst du weiter unten deine eigenen OAuth Schlüssel eintragen.";
+$a->strings["Provide your own OAuth Credentials"] = "Eigene OAuth Schlüssel eintragen";
+$a->strings["No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet account, copy the consumer key pair here and enter the API base root.<br />Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendica installation at your favorited StatusNet installation."] = "Kein Consumer-Schlüsselpaar für StatusNet gefunden. Registriere deinen Friendica-Account als Desktop-Client, kopiere das Consumer-Schlüsselpaar hierher und gib die API-URL ein.<br />Bevor du dein eigenes Consumer-Schlüsselpaar registrierst, frage den Administrator dieses Friendica-Servers, ob schon ein Schlüsselpaar für diesen Friendica-Server auf diesem StatusNet-Server existiert.";
+$a->strings["OAuth Consumer Key"] = "OAuth Consumer Key";
+$a->strings["OAuth Consumer Secret"] = "OAuth Consumer Secret";
+$a->strings["Base API Path (remember the trailing /)"] = "Basis-URL der StatusNet-API (vergiss den abschließenden / nicht)";
+$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to StatusNet."] = "Um deinen Account mit einem StatusNet-Account zu verknüpfen, klicke den Button an, um einen Sicherheitscode von StatusNet zu erhalten, und kopiere diesen in das Eingabefeld weiter unten. Es werden ausschließlich deine <strong>öffentlichen</strong> Nachrichten an StatusNet gesendet.";
+$a->strings["Log in with StatusNet"] = "Bei StatusNet anmelden";
+$a->strings["Copy the security code from StatusNet here"] = "Kopiere den Sicherheitscode von StatusNet hier hin";
+$a->strings["Cancel Connection Process"] = "Verbindungsprozess abbrechen";
+$a->strings["Current StatusNet API is"] = "Derzeitige StatusNet-API-URL lautet";
+$a->strings["Cancel StatusNet Connection"] = "Verbindung zum StatusNet Server abbrechen";
+$a->strings["Currently connected to: "] = "Momentan verbunden mit: ";
+$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf dem verbundenen StatusNet Konto veröffentlicht werden. Du kannst das (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen.";
+$a->strings["Allow posting to StatusNet"] = "Veröffentlichung bei StatusNet erlauben";
+$a->strings["Send public postings to StatusNet by default"] = "Veröffentliche öffentliche Beiträge standardmäßig bei StatusNet";
+$a->strings["Clear OAuth configuration"] = "OAuth-Konfiguration löschen";
+$a->strings["API URL"] = "API-URL";
+$a->strings["Post to Tumblr"] = "Bei Tumblr veröffentlichen";
+$a->strings["Tumblr Post Settings"] = "Tumblr-Beitragseinstellungen";
+$a->strings["Enable Tumblr Post Plugin"] = "Tumblr-Plugin aktivieren";
+$a->strings["Tumblr login"] = "Tumblr Login";
+$a->strings["Tumblr password"] = "Tumblr Passwort";
+$a->strings["Post to Tumblr by default"] = "Standardmäßig bei Tumblr veröffentlichen";
+$a->strings["Numfriends settings updated."] = "Numfriends Einstellungen aktualisiert";
+$a->strings["Numfriends Settings"] = "Numfriends Einstellungen";
+$a->strings["How many contacts to display on profile sidebar"] = "Wie viele Kontakte sollen in der Seitenleiste angezeigt werden";
+$a->strings["Post to Wordpress"] = "Bei WordPress veröffentlichen";
+$a->strings["WordPress Post Settings"] = "WordPress-Beitragseinstellungen";
+$a->strings["Enable WordPress Post Plugin"] = "WordPress-Plugin aktivieren.";
+$a->strings["WordPress username"] = "WordPress-Benutzername";
+$a->strings["WordPress password"] = "WordPress-Passwort";
+$a->strings["WordPress API URL"] = "WordPress-API-URL";
+$a->strings["Post to WordPress by default"] = "Standardmäßig auf WordPress veröffentlichen";
+$a->strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "Diese Website benutzt <a href='http://www.piwik.org'>Piwik</a>, eine Open Source-Software zur statistischen Auswertung der Besucherzugriffe.";
+$a->strings["If you do not want that your visits are logged this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out)."] = "Wenn Du nicht willst, dass Deine Besuche auf diese Weise gespeichert werden, kannst Du <a href='%s'>ein Cookie setzen</a>. Dann wird Piwik Dich auf dieser Website nicht mehr verfolgen (opt-out).";
+$a->strings["Piwik Base URL"] = "Piwik Basis URL";
+$a->strings["Site ID"] = "Seiten ID";
+$a->strings["Show opt-out cookie link?"] = "Link zum Setzen des Opt-Out Cookies anzeigen?";
+$a->strings["Post to Twitter"] = "Bei Twitter veröffentlichen";
+$a->strings["Twitter settings updated."] = "Twitter Einstellungen aktualisiert.";
+$a->strings["Twitter Posting Settings"] = "Twitter-Beitragseinstellungen";
+$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Kein Consumer-Schlüsselpaar für Twitter gefunden. Bitte wende dich an den Administrator der Seite.";
+$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Auf diesem Friendica-Server wurde das Twitter-Plugin aktiviert, aber du hast deinen Account noch nicht mit deinem Twitter-Account verbunden. Klicke dazu die Schaltfläche unten. Du erhältst dann eine PIN von Twitter, die du in das Eingabefeld unten kopieren musst. Nicht vergessen, den Senden-Knopf zu drücken! Nur <strong>öffentliche</strong> Beiträge werden bei Twitter veröffentlicht.";
+$a->strings["Log in with Twitter"] = "bei Twitter anmelden";
+$a->strings["Copy the PIN from Twitter here"] = "Kopiere die Twitter-PIN hier her";
+$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf dem verbundenen Twitter Konto veröffentlicht werden. Du kannst dies (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen.";
+$a->strings["Allow posting to Twitter"] = "Veröffentlichung bei Twitter erlauben";
+$a->strings["Send public postings to Twitter by default"] = "Veröffentliche öffentliche Beiträge standardmäßig bei Twitter";
+$a->strings["Consumer key"] = "Consumer Key";
+$a->strings["Consumer secret"] = "Consumer Secret";
+$a->strings["Post to Posterous"] = "Nach Posterous senden";
+$a->strings["Posterous Post Settings"] = "Posterous Beitrags-Einstellungen";
+$a->strings["Enable Posterous Post Plugin"] = "Posterous-Plugin aktivieren";
+$a->strings["Posterous login"] = "Posterous-Anmeldename";
+$a->strings["Posterous password"] = "Posterous-Passwort";
+$a->strings["Post to Posterous by default"] = "Veröffentliche öffentliche Beiträge standardmäßig bei Posterous";
$a->strings["Gender:"] = "Geschlecht:";
$a->strings["j F, Y"] = "j F, Y";
$a->strings["j F"] = "j F";
+$a->strings["Birthday:"] = "Geburtstag:";
$a->strings["Age:"] = "Alter:";
$a->strings["Status:"] = "Status:";
$a->strings["Homepage:"] = "Homepage:";
+$a->strings["Tags:"] = "Tags";
$a->strings["Religion:"] = "Religion:";
$a->strings["About:"] = "Ãœber:";
$a->strings["Hobbies/Interests:"] = "Hobbies/Interessen:";
@@ -923,10 +1029,24 @@ $a->strings["Film/dance/culture/entertainment:"] = "Filme/Tänze/Kultur/Unterhal
$a->strings["Love/Romance:"] = "Liebesleben:";
$a->strings["Work/employment:"] = "Arbeit/Beschäftigung:";
$a->strings["School/education:"] = "Schule/Ausbildung:";
-$a->strings["Starts:"] = "Beginnt:";
-$a->strings["Finishes:"] = "Endet:";
-$a->strings["A new person is sharing with you at "] = "Eine neue Person teilt mit dir auf ";
-$a->strings["You have a new follower at "] = "Du hast einen neuen Kontakt auf ";
+$a->strings["Unknown | Not categorised"] = "Unbekannt | Nicht kategorisiert";
+$a->strings["Block immediately"] = "Sofort blockieren";
+$a->strings["Shady, spammer, self-marketer"] = "Zwielichtig, Spammer, Selbstdarsteller";
+$a->strings["Known to me, but no opinion"] = "Ist mir bekannt, hab aber keine Meinung";
+$a->strings["OK, probably harmless"] = "OK, wahrscheinlich harmlos";
+$a->strings["Reputable, has my trust"] = "Seriös, hat mein Vertrauen";
+$a->strings["Frequently"] = "Häufig";
+$a->strings["Hourly"] = "Stündlich";
+$a->strings["Twice daily"] = "Zweimal Täglich";
+$a->strings["Daily"] = "Täglich";
+$a->strings["Weekly"] = "Wöchentlich";
+$a->strings["Monthly"] = "Monatlich";
+$a->strings["OStatus"] = "OStatus";
+$a->strings["RSS/Atom"] = "RSS/Atom";
+$a->strings["Zot!"] = "Zott";
+$a->strings["LinkedIn"] = "LinkedIn";
+$a->strings["XMPP/IM"] = "XMPP/Chat";
+$a->strings["MySpace"] = "MySpace";
$a->strings["Male"] = "Männlich";
$a->strings["Female"] = "Weiblich";
$a->strings["Currently Male"] = "Momentan männlich";
@@ -980,12 +1100,161 @@ $a->strings["Uncertain"] = "Unsicher";
$a->strings["Complicated"] = "Kompliziert";
$a->strings["Don't care"] = "Ist mir nicht wichtig";
$a->strings["Ask me"] = "Frag mich";
+$a->strings["Starts:"] = "Beginnt:";
+$a->strings["Finishes:"] = "Endet:";
+$a->strings["(no subject)"] = "(kein Betreff)";
+$a->strings["noreply"] = "noreply";
+$a->strings["prev"] = "vorige";
+$a->strings["first"] = "erste";
+$a->strings["last"] = "letzte";
+$a->strings["next"] = "nächste";
+$a->strings["No contacts"] = "Keine Kontakte";
+$a->strings["%d Contact"] = array(
+ 0 => "%d Kontakt",
+ 1 => "%d Kontakte",
+);
+$a->strings["Search"] = "Suche";
+$a->strings["Monday"] = "Montag";
+$a->strings["Tuesday"] = "Dienstag";
+$a->strings["Wednesday"] = "Mittwoch";
+$a->strings["Thursday"] = "Donnerstag";
+$a->strings["Friday"] = "Freitag";
+$a->strings["Saturday"] = "Samstag";
+$a->strings["Sunday"] = "Sonntag";
+$a->strings["January"] = "Januar";
+$a->strings["February"] = "Februar";
+$a->strings["March"] = "März";
+$a->strings["April"] = "April";
+$a->strings["May"] = "Mai";
+$a->strings["June"] = "Juni";
+$a->strings["July"] = "Juli";
+$a->strings["August"] = "August";
+$a->strings["September"] = "September";
+$a->strings["October"] = "Oktober";
+$a->strings["November"] = "November";
+$a->strings["December"] = "Dezember";
+$a->strings["bytes"] = "Byte";
+$a->strings["Select an alternate language"] = "Alternative Sprache auswählen";
+$a->strings["default"] = "standard";
+$a->strings["Sharing notification from Diaspora network"] = "Freigabe-Benachrichtigung von Diaspora";
+$a->strings["Attachments:"] = "Anhänge:";
+$a->strings["[Relayed] Comment authored by %s from network %s"] = "[Weitergeleitet] Kommentar von %s aus dem %s Netzwerk";
+$a->strings["Embedded content"] = "Eingebetteter Inhalt";
+$a->strings["Embedding disabled"] = "Einbettungen deaktiviert";
+$a->strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Eine gelöschte Gruppe mit diesem Namen wurde wiederbelebt. Bestehende Berechtigungseinstellungen <strong>könnten</strong> auf diese Gruppe oder zukünftige Mitglieder angewandt werden. Falls du dies nicht möchtest erstelle bitte eine andere Gruppe mit einem anderen Namen.";
+$a->strings["Everybody"] = "Alle Kontakte";
+$a->strings["edit"] = "bearbeiten";
+$a->strings["Groups"] = "Gruppen";
+$a->strings["Edit group"] = "Gruppe bearbeiten";
+$a->strings["Create a new group"] = "Neue Gruppe erstellen";
+$a->strings["Logout"] = "Abmelden";
+$a->strings["End this session"] = "Diese Sitzung beenden";
+$a->strings["Status"] = "Status";
+$a->strings["Your posts and conversations"] = "Deine Beiträge und Unterhaltungen";
+$a->strings["Your profile page"] = "Deine Profilseite";
+$a->strings["Photos"] = "Bilder";
+$a->strings["Your photos"] = "Deine Fotos";
+$a->strings["Your events"] = "Deine Ereignisse";
+$a->strings["Personal notes"] = "Persönliche Notizen";
+$a->strings["Your personal photos"] = "Deine privaten Fotos";
+$a->strings["Sign in"] = "Anmelden";
+$a->strings["Home Page"] = "Homepage";
+$a->strings["Create an account"] = "Account erstellen";
+$a->strings["Help and documentation"] = "Hilfe und Dokumentation";
+$a->strings["Apps"] = "Apps";
+$a->strings["Addon applications, utilities, games"] = "Addon Anwendungen, Dienstprogramme, Spiele";
+$a->strings["Search site content"] = "Inhalt der Seite durchsuchen";
+$a->strings["Conversations on this site"] = "Unterhaltungen auf dieser Seite";
+$a->strings["Directory"] = "Verzeichnis";
+$a->strings["People directory"] = "Nutzerverzeichnis";
+$a->strings["Conversations from your friends"] = "Unterhaltungen deiner Kontakte";
+$a->strings["Friend Requests"] = "Kontaktanfragen";
+$a->strings["See all notifications"] = "Alle Benachrichtigungen anzeigen";
+$a->strings["Private mail"] = "Private Email";
+$a->strings["Manage"] = "Verwalten";
+$a->strings["Manage other pages"] = "Andere Seiten verwalten";
+$a->strings["Profiles"] = "Profile";
+$a->strings["Manage/edit profiles"] = "Profile verwalten/editieren";
+$a->strings["Manage/edit friends and contacts"] = "Freunde und Kontakte verwalten/editieren";
+$a->strings["Admin"] = "Administration";
+$a->strings["Site setup and configuration"] = "Einstellungen der Seite und Konfiguration";
+$a->strings["Nothing new here"] = "Keine Neuigkeiten.";
+$a->strings["Add New Contact"] = "Neuen Kontakt hinzufügen";
+$a->strings["Enter address or web location"] = "Adresse oder Web-Link eingeben";
+$a->strings["Example: bob@example.com, http://example.com/barbara"] = "Beispiel: bob@example.com, http://example.com/barbara";
+$a->strings["Invite Friends"] = "Freunde einladen";
+$a->strings["%d invitation available"] = array(
+ 0 => "%d Einladung verfügbar",
+ 1 => "%d Einladungen verfügbar",
+);
+$a->strings["Find People"] = "Leute finden";
+$a->strings["Enter name or interest"] = "Name oder Interessen eingeben";
+$a->strings["Connect/Follow"] = "Verbinden/Folgen";
+$a->strings["Examples: Robert Morgenstein, Fishing"] = "Beispiel: Robert Morgenstein, Angeln";
+$a->strings["Similar Interests"] = "Ähnliche Interessen";
+$a->strings["Networks"] = "Netzwerke";
+$a->strings["All Networks"] = "Alle Netzwerke";
+$a->strings["Logged out."] = "Abgemeldet.";
+$a->strings["Miscellaneous"] = "Verschiedenes";
+$a->strings["year"] = "Jahr";
+$a->strings["month"] = "Monat";
+$a->strings["day"] = "Tag";
+$a->strings["never"] = "nie";
+$a->strings["less than a second ago"] = "vor weniger als einer Sekunde";
+$a->strings["years"] = "Jahre";
+$a->strings["months"] = "Monate";
+$a->strings["week"] = "Woche";
+$a->strings["weeks"] = "Wochen";
+$a->strings["days"] = "Tage";
+$a->strings["hour"] = "Stunde";
+$a->strings["hours"] = "Stunden";
+$a->strings["minute"] = "Minute";
+$a->strings["minutes"] = "Minuten";
+$a->strings["second"] = "Sekunde";
+$a->strings["seconds"] = "Sekunden";
+$a->strings["%1\$d %2\$s ago"] = "%1\$d %2\$s her";
+$a->strings["From: "] = "Von: ";
+$a->strings["Image/photo"] = "Bild/Foto";
+$a->strings["Cannot locate DNS info for database server '%s'"] = "Kann die DNS Informationen für den Datenbanken Server '%s' nicht ermitteln.";
+$a->strings["[no subject]"] = "[kein Betreff]";
+$a->strings["Visible to everybody"] = "Für jeden sichtbar";
+$a->strings["show"] = "zeigen";
+$a->strings["don't show"] = "nicht zeigen";
+$a->strings["Friendica Notification"] = "Friendica-Benachrichtigung";
+$a->strings["Thank You,"] = "Danke,";
+$a->strings["%s Administrator"] = "der Administrator von %s";
+$a->strings["New mail received at %s"] = "Neue Nachricht auf %s empfangen";
+$a->strings["%s sent you a new private message at %s."] = "%s hat dir eine neue private Nachricht auf %s geschrieben.";
+$a->strings["Please visit %s to view and/or reply to your private messages."] = "Bitte besuche %s, um deine privaten Nachrichten anzusehen und/oder zu beantworten.";
+$a->strings["%s commented on an item at %s"] = "%s kommentierte einen Beitrag auf %s";
+$a->strings["%s commented on an item/conversation you have been following."] = "%s hat einen Beitrag kommentiert, dem du folgst.";
+$a->strings["Please visit %s to view and/or reply to the conversation."] = "Bitte besuche %s, um die Konversation anzusehen und/oder zu kommentieren.";
+$a->strings["%s posted to your profile wall at %s"] = "%s hat auf deine Pinnwand bei %s gepostet";
+$a->strings["%s tagged you at %s"] = "%s hat dich auf %s erwähnt";
+$a->strings["%s tagged your post at %s"] = "%s hat deinen Beitrag auf %s getaggt";
+$a->strings["Introduction received at %s"] = "Kontaktanfrage auf %s erhalten";
+$a->strings["You've received an introduction from '%s' at %s"] = "Du hast eine Kontaktanfrage von '%s' auf %s erhalten";
+$a->strings["You may visit their profile at %s"] = "Hier kannst du das Profil betrachten: %s";
+$a->strings["Please visit %s to approve or reject the introduction."] = "Bitte besuche %s, um die Kontaktanfrage anzunehmen oder abzulehnen.";
+$a->strings["Friend suggestion received at %s"] = "Kontaktvorschlag empfangen auf %s";
+$a->strings["You've received a friend suggestion from '%s' at %s"] = "Du hast von '%s' einen Kontaktvorschlag erhalten auf %s";
+$a->strings["Name:"] = "Name:";
+$a->strings["Photo:"] = "Foto:";
+$a->strings["Please visit %s to approve or reject the suggestion."] = "Bitte besuche %s, um den Vorschlag zu akzeptieren oder abzulehnen.";
+$a->strings["A new person is sharing with you at "] = "Eine neue Person teilt mit dir auf ";
+$a->strings["You have a new follower at "] = "Du hast einen neuen Kontakt auf ";
+$a->strings["view full size"] = "Volle Größe anzeigen";
+$a->strings["image/photo"] = "Bild/Foto";
+$a->strings["Welcome "] = "Willkommen ";
+$a->strings["Please upload a profile photo."] = "Bitte lade ein Profilbild hoch.";
+$a->strings["Welcome back "] = "Willkommen zurück ";
$a->strings["View status"] = "Status anzeigen";
$a->strings["View profile"] = "Profil anzeigen";
$a->strings["View photos"] = "Fotos ansehen";
$a->strings["View recent"] = "Neueste anzeigen";
$a->strings["Send PM"] = "Private Nachricht senden";
-$a->strings["event"] = "Veranstaltung";
+$a->strings["post/item"] = "Nachricht/Beitrag";
+$a->strings["%1\$s marked %2\$s's %3\$s as favorite"] = "%1\$s hat %2\$s\\s %3\$s als Favorit markiert";
$a->strings["Select"] = "Auswählen";
$a->strings["View %s's profile @ %s"] = "Das Profil von %s auf %s betrachten.";
$a->strings["%s from %s"] = "%s von %s";
@@ -1031,227 +1300,7 @@ $a->strings["Insert audio link"] = "Audio-Adresse einfügen";
$a->strings["audio link"] = "Audio-Link";
$a->strings["set location"] = "Ort setzen";
$a->strings["clear location"] = "Ort löschen";
-$a->strings["Set title"] = "Titel setzen";
$a->strings["permissions"] = "Zugriffsrechte";
-$a->strings["(no subject)"] = "(kein Betreff)";
-$a->strings["noreply"] = "noreply";
-$a->strings["Sharing notification from Diaspora network"] = "Freigabe-Benachrichtigung von Diaspora";
-$a->strings["Attachments:"] = "Anhänge:";
-$a->strings["[Relayed] Comment authored by %s from network %s"] = "[Weitergeleitet] Kommentar von %s aus dem %s Netzwerk";
-$a->strings["view full size"] = "Volle Größe anzeigen";
-$a->strings["image/photo"] = "Bild/Foto";
-$a->strings["link"] = "Verweis";
-$a->strings["Visible to everybody"] = "Für jeden sichtbar";
-$a->strings["show"] = "zeigen";
-$a->strings["don't show"] = "nicht zeigen";
-$a->strings["Friendica Notification"] = "Friendica-Benachrichtigung";
-$a->strings["Thank You,"] = "Danke,";
-$a->strings["%s Administrator"] = "der Administrator von %s";
-$a->strings["New mail received at %s"] = "Neue Nachricht auf %s empfangen";
-$a->strings["%s sent you a new private message at %s."] = "%s hat dir eine neue private Nachricht auf %s geschrieben.";
-$a->strings["Please visit %s to view and/or reply to your private messages."] = "Bitte besuche %s, um deine privaten Nachrichten anzusehen und/oder zu beantworten.";
-$a->strings["%s commented on an item at %s"] = "%s kommentierte einen Beitrag auf %s";
-$a->strings["%s commented on an item/conversation you have been following."] = "%s hat einen Beitrag kommentiert, dem du folgst.";
-$a->strings["Please visit %s to view and/or reply to the conversation."] = "Bitte besuche %s, um die Konversation anzusehen und/oder zu kommentieren.";
-$a->strings["%s posted to your profile wall at %s"] = "%s hat auf deine Pinnwand bei %s gepostet";
-$a->strings["Introduction received at %s"] = "Kontaktanfrage auf %s erhalten";
-$a->strings["You've received an introduction from '%s' at %s"] = "Du hast eine Kontaktanfrage von '%s' auf %s erhalten";
-$a->strings["You may visit their profile at %s"] = "Hier kannst du das Profil betrachten: %s";
-$a->strings["Please visit %s to approve or reject the introduction."] = "Bitte besuche %s, um die Kontaktanfrage anzunehmen oder abzulehnen.";
-$a->strings["Friend suggestion received at %s"] = "Kontaktvorschlag empfangen auf %s";
-$a->strings["You've received a friend suggestion from '%s' at %s"] = "Du hast von '%s' einen Kontaktvorschlag erhalten auf %s";
-$a->strings["Name:"] = "Name:";
-$a->strings["Photo:"] = "Foto:";
-$a->strings["Please visit %s to approve or reject the suggestion."] = "Bitte besuche %s, um den Vorschlag zu akzeptieren oder abzulehnen.";
-$a->strings["Image/photo"] = "Bild/Foto";
-$a->strings["Unknown | Not categorised"] = "Unbekannt | Nicht kategorisiert";
-$a->strings["Block immediately"] = "Sofort blockieren";
-$a->strings["Shady, spammer, self-marketer"] = "Zwielichtig, Spammer, Selbstdarsteller";
-$a->strings["Known to me, but no opinion"] = "Ist mir bekannt, hab aber keine Meinung";
-$a->strings["OK, probably harmless"] = "OK, wahrscheinlich harmlos";
-$a->strings["Reputable, has my trust"] = "Seriös, hat mein Vertrauen";
-$a->strings["Frequently"] = "Häufig";
-$a->strings["Hourly"] = "Stündlich";
-$a->strings["Twice daily"] = "Zweimal Täglich";
-$a->strings["Daily"] = "Täglich";
-$a->strings["Weekly"] = "Wöchentlich";
-$a->strings["Monthly"] = "Monatlich";
-$a->strings["OStatus"] = "OStatus";
-$a->strings["RSS/Atom"] = "RSS/Atom";
-$a->strings["Facebook"] = "Facebook";
-$a->strings["Zot!"] = "Zott";
-$a->strings["LinkedIn"] = "LinkedIn";
-$a->strings["XMPP/IM"] = "XMPP/Chat";
-$a->strings["MySpace"] = "MySpace";
-$a->strings["Logged out."] = "Abgemeldet.";
-$a->strings["Embedded content"] = "Eingebetteter Inhalt";
-$a->strings["Embedding disabled"] = "Einbettungen deaktiviert";
-$a->strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Eine gelöschte Gruppe mit diesem Namen wurde wiederbelebt. Bestehende Berechtigungseinstellungen <strong>könnten</strong> auf diese Gruppe oder zukünftige Mitglieder angewandt werden. Falls du dies nicht möchtest erstelle bitte eine andere Gruppe mit einem anderen Namen.";
-$a->strings["Everybody"] = "Alle Kontakte";
-$a->strings["edit"] = "bearbeiten";
-$a->strings["Groups"] = "Gruppen";
-$a->strings["Edit group"] = "Gruppe bearbeiten";
-$a->strings["Create a new group"] = "Neue Gruppe erstellen";
-$a->strings["Add New Contact"] = "Neuen Kontakt hinzufügen";
-$a->strings["Enter address or web location"] = "Adresse oder Web-Link eingeben";
-$a->strings["Example: bob@example.com, http://example.com/barbara"] = "Beispiel: bob@example.com, http://example.com/barbara";
-$a->strings["Invite Friends"] = "Freunde einladen";
-$a->strings["%d invitation available"] = array(
- 0 => "%d Einladung verfügbar",
- 1 => "%d Einladungen verfügbar",
-);
-$a->strings["Find People"] = "Leute finden";
-$a->strings["Enter name or interest"] = "Name oder Interessen eingeben";
-$a->strings["Connect/Follow"] = "Verbinden/Folgen";
-$a->strings["Examples: Robert Morgenstein, Fishing"] = "Beispiel: Robert Morgenstein, Angeln";
-$a->strings["Similar Interests"] = "Ähnliche Interessen";
-$a->strings["Networks"] = "Netzwerke";
-$a->strings["All Networks"] = "Alle Netzwerke";
-$a->strings["Facebook disabled"] = "Facebook deaktiviert";
-$a->strings["Updating contacts"] = "Aktualisiere Kontakte";
-$a->strings["Facebook API key is missing."] = "Facebook-API-Schlüssel nicht gefunden";
-$a->strings["Facebook Connect"] = "Mit Facebook verbinden";
-$a->strings["Install Facebook connector for this account."] = "Facebook-Connector für diesen Account installieren.";
-$a->strings["Remove Facebook connector"] = "Facebook-Connector entfernen";
-$a->strings["Re-authenticate [This is necessary whenever your Facebook password is changed.]"] = "Neu authentifizieren [Das ist immer dann nötig, wenn Du Dein Facebook-Passwort geändert hast.]";
-$a->strings["Post to Facebook by default"] = "Veröffentliche standardmäßig bei Facebook";
-$a->strings["Link all your Facebook friends and conversations on this website"] = "All meine Facebook-Kontakte und -Konversationen hier auf diese Website importieren";
-$a->strings["Facebook conversations consist of your <em>profile wall</em> and your friend <em>stream</em>."] = "Facebook-Konversationen sind alles, was auf deiner <em>Pinnwand</em> erscheint, und die Beiträge deiner Freunde <em>(Stream).</em>";
-$a->strings["On this website, your Facebook friend stream is only visible to you."] = "Hier auf dieser Webseite kannst nur du die Beiträge Deiner Facebook-Freunde (Stream) sehen.";
-$a->strings["The following settings determine the privacy of your Facebook profile wall on this website."] = "Mit den folgenden Einstellungen kannst Du die Privatsphäre der Kopie Deiner Facebook-Pinnwand hier auf dieser Seite einstellen.";
-$a->strings["On this website your Facebook profile wall conversations will only be visible to you"] = "Meine Facebook-Pinnwand hier auf dieser Webseite nur für mich sichtbar machen";
-$a->strings["Do not import your Facebook profile wall conversations"] = "Facebook-Pinnwand nicht importieren";
-$a->strings["If you choose to link conversations and leave both of these boxes unchecked, your Facebook profile wall will be merged with your profile wall on this website and your privacy settings on this website will be used to determine who may see the conversations."] = "Wenn Du Facebook-Konversationen importierst und diese beiden Häkchen nicht setzt, wird Deine Facebook-Pinnwand mit der Pinnwand hier auf dieser Webseite vereinigt. Die Privatsphäre-Einstellungen für Deine Pinnwand auf dieser Webseite geben dann an, wer die Konversationen sehen kann.";
-$a->strings["Comma separated applications to ignore"] = "Komma separierte Liste von Anwendungen die ignoriert werden sollen";
-$a->strings["Facebook Connector Settings"] = "Facebook-Verbindungseinstellungen";
-$a->strings["Post to Facebook"] = "Bei Facebook veröffentlichen";
-$a->strings["Post to Facebook cancelled because of multi-network access permission conflict."] = "Beitrag wurde nicht bei Facebook veröffentlicht, da Konflikte bei den Multi-Netzwerk-Zugriffsrechten vorliegen.";
-$a->strings["Image: "] = "Bild: ";
-$a->strings["View on Friendica"] = "In Friendica betrachten";
-$a->strings["Facebook post failed. Queued for retry."] = "Veröffentlichung bei Facebook gescheitert. Wir versuchen es später erneut.";
-$a->strings["Post to Wordpress"] = "Bei WordPress veröffentlichen";
-$a->strings["WordPress Post Settings"] = "WordPress-Beitragseinstellungen";
-$a->strings["Enable WordPress Post Plugin"] = "WordPress-Plugin aktivieren.";
-$a->strings["WordPress username"] = "WordPress-Benutzername";
-$a->strings["WordPress password"] = "WordPress-Passwort";
-$a->strings["WordPress API URL"] = "WordPress-API-URL";
-$a->strings["Post to WordPress by default"] = "Standardmäßig auf WordPress veröffentlichen";
-$a->strings["Post from Friendica"] = "Beitrag via Friendica";
-$a->strings["Allow to use your friendika id (%s) to connecto to external unhosted-enabled storage (like ownCloud)"] = "Erlaube die Verwendung deiner friendica ID (%s) zu externen unhosted-fähigen Speichern (wie z.B. ownCloud) zu verbinden.";
-$a->strings["Unhosted DAV storage url"] = "Unhosted DAV Speicher-URL";
-$a->strings["Post to Tumblr"] = "Bei Tumblr veröffentlichen";
-$a->strings["Tumblr Post Settings"] = "Tumblr-Beitragseinstellungen";
-$a->strings["Enable Tumblr Post Plugin"] = "Tumblr-Plugin aktivieren";
-$a->strings["Tumblr login"] = "Tumblr Login";
-$a->strings["Tumblr password"] = "Tumblr Passwort";
-$a->strings["Post to Tumblr by default"] = "Standardmäßig bei Tumblr veröffentlichen";
-$a->strings["OEmbed settings updated"] = "OEmbed Einstellungen aktualisiert.";
-$a->strings["Use OEmbed for YouTube videos"] = "OEmbed für Youtube Videos verwenden";
-$a->strings["URL to embed:"] = "URL zum Einbetten:";
-$a->strings["Post to Posterous"] = "Nach Posterous senden";
-$a->strings["Posterous Post Settings"] = "Posterous Beitrags-Einstellungen";
-$a->strings["Enable Posterous Post Plugin"] = "Posterous-Plugin aktivieren";
-$a->strings["Posterous login"] = "Posterous-Anmeldename";
-$a->strings["Posterous password"] = "Posterous-Passwort";
-$a->strings["Post to Posterous by default"] = "Veröffentliche öffentliche Beiträge standardmäßig bei Posterous";
-$a->strings["Upload a file"] = "Datei hochladen";
-$a->strings["Drop files here to upload"] = "Ziehe die Dateien hierher die du hochladen willst";
-$a->strings["Failed"] = "Fehlgeschlagen";
-$a->strings["No files were uploaded."] = "Keine Dateien hochgeladen.";
-$a->strings["Uploaded file is empty"] = "Hochgeladene Datei ist leer";
-$a->strings["File has an invalid extension, it should be one of "] = "Die Dateierweiterung ist nicht erlaubt, sie muss eine der folgenden sein ";
-$a->strings["Upload was cancelled, or server error encountered"] = "Upload abgebrochen oder Serverfehler aufgetreten";
-$a->strings["Report Bug"] = "Fehlerreport erstellen";
-$a->strings["Post to StatusNet"] = "Bei StatusNet veröffentlichen";
-$a->strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "Bitte kontaktiere den Administrator des Servers.<br />Die angegebene API-URL ist nicht gültig.";
-$a->strings["We could not contact the StatusNet API with the Path you entered."] = "Die StatusNet-API konnte mit dem angegebenen Pfad nicht erreicht werden.";
-$a->strings["StatusNet settings updated."] = "StatusNet Einstellungen aktualisiert.";
-$a->strings["StatusNet Posting Settings"] = "StatusNet-Beitragseinstellungen";
-$a->strings["Globally Available StatusNet OAuthKeys"] = "Verfügbare OAuth Schlüssel für StatusNet";
-$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "Für einige StatusNet Server sind OAuth Schlüsselpaare verfügbar. Solltest du einen dieser Server benutzen, dann verwende doch bitte diese Schlüssel. Falls nicht kannst du weiter unten deine eigenen OAuth Schlüssel eintragen.";
-$a->strings["Provide your own OAuth Credentials"] = "Eigene OAuth Schlüssel eintragen";
-$a->strings["No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet account, copy the consumer key pair here and enter the API base root.<br />Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendica installation at your favorited StatusNet installation."] = "Kein Consumer-Schlüsselpaar für StatusNet gefunden. Registriere deinen Friendica-Account als Desktop-Client, kopiere das Consumer-Schlüsselpaar hierher und gib die API-URL ein.<br />Bevor du dein eigenes Consumer-Schlüsselpaar registrierst, frage den Administrator dieses Friendica-Servers, ob schon ein Schlüsselpaar für diesen Friendica-Server auf diesem StatusNet-Server existiert.";
-$a->strings["OAuth Consumer Key"] = "OAuth Consumer Key";
-$a->strings["OAuth Consumer Secret"] = "OAuth Consumer Secret";
-$a->strings["Base API Path (remember the trailing /)"] = "Basis-URL der StatusNet-API (vergiss den abschließenden / nicht)";
-$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to StatusNet."] = "Um deinen Account mit einem StatusNet-Account zu verknüpfen, klicke den Button an, um einen Sicherheitscode von StatusNet zu erhalten, und kopiere diesen in das Eingabefeld weiter unten. Es werden ausschließlich deine <strong>öffentlichen</strong> Nachrichten an StatusNet gesendet.";
-$a->strings["Log in with StatusNet"] = "Bei StatusNet anmelden";
-$a->strings["Copy the security code from StatusNet here"] = "Kopiere den Sicherheitscode von StatusNet hier hin";
-$a->strings["Cancel Connection Process"] = "Verbindungsprozess abbrechen";
-$a->strings["Current StatusNet API is"] = "Derzeitige StatusNet-API-URL lautet";
-$a->strings["Cancel StatusNet Connection"] = "Verbindung zum StatusNet Server abbrechen";
-$a->strings["Currently connected to: "] = "Momentan verbunden mit: ";
-$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf dem verbundenen StatusNet Konto veröffentlicht werden. Du kannst das (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen.";
-$a->strings["Allow posting to StatusNet"] = "Veröffentlichung bei StatusNet erlauben";
-$a->strings["Send public postings to StatusNet by default"] = "Veröffentliche öffentliche Beiträge standardmäßig bei StatusNet";
-$a->strings["Clear OAuth configuration"] = "OAuth-Konfiguration löschen";
-$a->strings["API URL"] = "API-URL";
-$a->strings["Generate new key"] = "Neuen Schlüssel erstellen";
-$a->strings["Widgets key"] = "Widgets Schlüssel";
-$a->strings["Widgets available"] = "Verfügbare Widgets";
-$a->strings["Connect on Friendica!"] = "In Friendica verbinden!";
-$a->strings["%d person likes this"] = array(
- 0 => "%d Person mag das",
- 1 => "%d Leuten mögen das",
-);
-$a->strings["%d person doesn't like this"] = array(
- 0 => " %d Person mag das nicht",
- 1 => "%d Leute mögen das nicht",
-);
-$a->strings["Post to Twitter"] = "Bei Twitter veröffentlichen";
-$a->strings["Twitter settings updated."] = "Twitter Einstellungen aktualisiert.";
-$a->strings["Twitter Posting Settings"] = "Twitter-Beitragseinstellungen";
-$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Kein Consumer-Schlüsselpaar für Twitter gefunden. Bitte wende dich an den Administrator der Seite.";
-$a->strings["At this Friendica instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "Auf diesem Friendica-Server wurde das Twitter-Plugin aktiviert, aber du hast deinen Account noch nicht mit deinem Twitter-Account verbunden. Klicke dazu die Schaltfläche unten. Du erhältst dann eine PIN von Twitter, die du in das Eingabefeld unten kopieren musst. Nicht vergessen, den Senden-Knopf zu drücken! Nur <strong>öffentliche</strong> Beiträge werden bei Twitter veröffentlicht.";
-$a->strings["Log in with Twitter"] = "bei Twitter anmelden";
-$a->strings["Copy the PIN from Twitter here"] = "Kopiere die Twitter-PIN hier her";
-$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Wenn aktiviert können all deine <strong>öffentlichen</strong> Einträge auf dem verbundenen Twitter Konto veröffentlicht werden. Du kannst dies (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen.";
-$a->strings["Allow posting to Twitter"] = "Veröffentlichung bei Twitter erlauben";
-$a->strings["Send public postings to Twitter by default"] = "Veröffentliche öffentliche Beiträge standardmäßig bei Twitter";
-$a->strings["Consumer key"] = "Consumer Key";
-$a->strings["Consumer secret"] = "Consumer Secret";
-$a->strings["Impressum"] = "Impressum";
-$a->strings["Site Owner"] = "Betreiber der Seite";
-$a->strings["Email Address"] = "Email Adresse";
-$a->strings["Postal Address"] = "Postalische Anschrift";
-$a->strings["The impressum addon needs to be configured!<br />Please add at least the <tt>owner</tt> variable to your config file. For other variables please refer to the README file of the addon."] = "Das Impressums-Plugin muss noch konfiguriert werden.<br />Bitte gebe mindestens den <tt>Betreiber</tt> in der Konfiguration an. Alle weiteren Parameter werden in der README-Datei des Addons erläutert.";
-$a->strings["Site Owners Profile"] = "Profil des Seitenbetreibers";
-$a->strings["Notes"] = "Hinweise";
-$a->strings["Three Dimensional Tic-Tac-Toe"] = "Dreidimensionales Tic-Tac-Toe";
-$a->strings["3D Tic-Tac-Toe"] = "3D Tic-Tac-Toe";
-$a->strings["New game"] = "Neues Spiel";
-$a->strings["New game with handicap"] = "Neues Handicap Spiel";
-$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "3D-Tic-Tac-Toe ist genauso wie das herkömmliche Spiel, nur dass man es auf mehreren Ebenen gleichzeitig spielt.";
-$a->strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "In diesem Fall sind es drei Ebenen. Man gewinnt indem man drei in einer Reihe auf einer beliebigen Reihe schafft, oder drei übereinander oder diagonal auf verschiedenen Ebenen.";
-$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "Beim Handicap-Spiel wird die zentrale Position der mittleren Ebene gesperrt da der Spieler der diese Ebene besitzt oft einen unfairen Vorteil genießt.";
-$a->strings["You go first..."] = "Du fängst an...";
-$a->strings["I'm going first this time..."] = "Diesmal fange ich an...";
-$a->strings["You won!"] = "Du gewinnst!";
-$a->strings["\"Cat\" game!"] = "Unentschieden!";
-$a->strings["I won!"] = "Ich gewinne!";
-$a->strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "Diese Website benutzt <a href='http://www.piwik.org'>Piwik</a>, eine Open Source-Software zur statistischen Auswertung der Besucherzugriffe.";
-$a->strings["If you do not want that your visits are logged this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out)."] = "Wenn Du nicht willst, dass Deine Besuche auf diese Weise gespeichert werden, kannst Du <a href='%s'>ein Cookie setzen</a>. Dann wird Piwik Dich auf dieser Website nicht mehr verfolgen (opt-out).";
-$a->strings["Piwik Base URL"] = "Piwik Basis URL";
-$a->strings["Site ID"] = "Seiten ID";
-$a->strings["Show opt-out cookie link?"] = "Link zum Setzen des Opt-Out Cookies anzeigen?";
-$a->strings[" - Member since: %s"] = " - Mitglied seit: %s";
-$a->strings["OpenID"] = "OpenID";
-$a->strings["Last users"] = "Letzte Nutzer";
-$a->strings["Most active users"] = "Aktivste Nutzer";
-$a->strings["Last photos"] = "Letzte Fotos";
-$a->strings["Last likes"] = "Zuletzt gemocht";
-$a->strings["\"pageheader\" Settings"] = "\"pageheader\"-Einstellungen";
-$a->strings["pageheader Settings saved."] = "pageheader-Einstellungen gespeichert.";
-$a->strings["Randplace Settings"] = "Randplace-Einstellungen";
-$a->strings["Enable Randplace Plugin"] = "Randplace-Plugin aktivieren";
-$a->strings["\"Blockem\" Settings"] = "\"Blockem\"-Einstellungen";
-$a->strings["Comma separated profile URLS to block"] = "Profil-URLs, die blockiert werden sollen (durch Kommas getrennt)";
-$a->strings["BLOCKEM Settings saved."] = "BLOCKEM-Einstellungen gesichert.";
-$a->strings["Blocked %s - Click to open/close"] = "%s blockiert - Zum Öffnen/Schließen klicken";
-$a->strings["\"Not Safe For Work\" Settings"] = "\"Not Safe For Work\"-Einstellungen";
-$a->strings["Comma separated words to treat as NSFW"] = "Wörter, die gefiltert werden sollen (durch Kommas getrennt)";
-$a->strings["NSFW Settings saved."] = "NSFW-Einstellungen gespeichert";
-$a->strings["%s - Click to open/close"] = "%s – Zum Öffnen/Schließen klicken";
$a->strings["Delete this item?"] = "Diesen Beitrag löschen?";
$a->strings["show fewer"] = "weniger anzeigen";
$a->strings["Create a New Account"] = "Neuen Account erstellen";
diff --git a/view/event.tpl b/view/event.tpl
new file mode 100644
index 000000000..ac9f889ec
--- /dev/null
+++ b/view/event.tpl
@@ -0,0 +1,10 @@
+{{ for $events as $event }}
+ <div class="event">
+
+ {{ if $event.item.author-name }}<a href="$event.item.author-link" ><img src="$event.item.author-avatar" height="32" width="32" />$event.item.author-name</a>{{ endif }}
+ $event.html
+ {{ if $event.item.plink }}<a href="$event.plink.0" title="$event.plink.1" target="external-link" class="plink-event-link icon s22 remote-link"></a>{{ endif }}
+ {{ if $event.edit }}<a href="$event.edit.0" title="$event.edit.1" class="edit-event-link icon s22 pencil"></a>{{ endif }}
+ </div>
+ <div class="clear"></div>
+{{ endfor }}
diff --git a/view/event_form.tpl b/view/event_form.tpl
index 6de471aca..7d5f8cf4a 100755
--- a/view/event_form.tpl
+++ b/view/event_form.tpl
@@ -1,7 +1,7 @@
-<h3>$e_text</h3>
+<h3>$title</h3>
<p>
-$e_desc
+$desc
</p>
<form action="$post" method="post" >
diff --git a/view/event_head.tpl b/view/event_head.tpl
index fe0b8fe2a..498ac9941 100755
--- a/view/event_head.tpl
+++ b/view/event_head.tpl
@@ -1,3 +1,64 @@
+<link rel='stylesheet' type='text/css' href='$baseurl/library/fullcalendar/fullcalendar.css' />
+<script language="javascript" type="text/javascript"
+ src="$baseurl/library/fullcalendar/fullcalendar.min.js"></script>
+
+<script>
+ $(document).ready(function() {
+ $('#events-calendar').fullCalendar({
+ events: '$baseurl/events/json/',
+ header: {
+ left: 'prev,next today',
+ center: 'title',
+ right: 'month,agendaWeek,agendaDay'
+ },
+ timeFormat: 'H(:mm)',
+ eventClick: function(calEvent, jsEvent, view) {
+ $.get(
+ '$baseurl/events/?id='+calEvent.id,
+ function(data){
+ $.fancybox(data);
+ }
+ );
+ },
+
+ eventRender: function(event, element, view) {
+ //console.log(view.name);
+ if (event.item['author-name']==null) return;
+ switch(view.name){
+ case "month":
+ element.find(".fc-event-title").html(
+ "<img src='{0}' style='height:10px;width:10px'>{1} : {2}".format(
+ event.item['author-avatar'],
+ event.item['author-name'],
+ event.title
+ ));
+ break;
+ case "agendaWeek":
+ element.find(".fc-event-title").html(
+ "<img src='{0}' style='height:12px; width:12px'>{1}<p>{2}</p><p>{3}</p>".format(
+ event.item['author-avatar'],
+ event.item['author-name'],
+ event.item.desc,
+ event.item.location
+ ));
+ break;
+ case "agendaDay":
+ element.find(".fc-event-title").html(
+ "<img src='{0}' style='height:24px;width:24px'>{1}<p>{2}</p><p>{3}</p>".format(
+ event.item['author-avatar'],
+ event.item['author-name'],
+ event.item.desc,
+ event.item.location
+ ));
+ break;
+ }
+ }
+
+ })
+ });
+</script>
+
+
<script language="javascript" type="text/javascript"
src="$baseurl/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
<script language="javascript" type="text/javascript">
@@ -24,9 +85,9 @@ tinyMCE.init({
theme_advanced_path : false,
setup : function(ed) {
ed.onInit.add(function(ed) {
- ed.pasteAsPlainText = true;
- });
- }
+ ed.pasteAsPlainText = true;
+ });
+ }
});
diff --git a/view/events-js.tpl b/view/events-js.tpl
new file mode 100644
index 000000000..b0e182c56
--- /dev/null
+++ b/view/events-js.tpl
@@ -0,0 +1,6 @@
+$tabs
+<h2>$title</h2>
+
+<div id="new-event-link"><a href="$new_event.0" >$new_event.1</a></div>
+
+<div id="events-calendar"></div>
diff --git a/view/events.tpl b/view/events.tpl
new file mode 100644
index 000000000..5a9787de3
--- /dev/null
+++ b/view/events.tpl
@@ -0,0 +1,24 @@
+$tabs
+<h2>$title</h2>
+
+<div id="new-event-link"><a href="$new_event.0" >$new_event.1</a></div>
+
+<div id="event-calendar-wrapper">
+ <a href="$previus.0" class="prevcal $previus.2"><div id="event-calendar-prev" class="icon s22 prev" title="$previus.1"></div></a>
+ $calendar
+ <a href="$next.0" class="nextcal $next.2"><div id="event-calendar-prev" class="icon s22 next" title="$next.1"></div></a>
+</div>
+<div class="event-calendar-end"></div>
+
+
+{{ for $events as $event }}
+ <div class="event">
+ {{ if $event.is_first }}<hr /><a name="link-$event.j" ><div class="event-list-date">$event.d</div></a>{{ endif }}
+ {{ if $event.item.author-name }}<a href="$event.item.author-link" ><img src="$event.item.author-avatar" height="32" width="32" />$event.item.author-name</a>{{ endif }}
+ $event.html
+ {{ if $event.item.plink }}<a href="$event.plink.0" title="$event.plink.1" target="external-link" class="plink-event-link icon s22 remote-link"></a>{{ endif }}
+ {{ if $event.edit }}<a href="$event.edit.0" title="$event.edit.1" class="edit-event-link icon s22 pencil"></a>{{ endif }}
+ </div>
+ <div class="clear"></div>
+
+{{ endfor }}
diff --git a/view/head.tpl b/view/head.tpl
index 9fe5a63b3..2a1837088 100755
--- a/view/head.tpl
+++ b/view/head.tpl
@@ -46,6 +46,23 @@
}
}
+
+ function commentInsert(obj,id) {
+ var tmpStr = $("#comment-edit-text-" + id).val();
+ if(tmpStr == '$comment') {
+ tmpStr = '';
+ $("#comment-edit-text-" + id).addClass("comment-edit-text-full");
+ $("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
+ openMenu("comment-edit-submit-wrapper-" + id);
+ }
+ var ins = $(obj).html();
+ ins = ins.replace('&lt;','<');
+ ins = ins.replace('&gt;','>');
+ ins = ins.replace('&amp;','&');
+ ins = ins.replace('&quot;','"');
+ $("#comment-edit-text-" + id).val(tmpStr + ins);
+ }
+
function showHideComments(id) {
if( $('#collapsed-comments-' + id).is(':visible')) {
$('#collapsed-comments-' + id).hide();
diff --git a/view/install_checks.tpl b/view/install_checks.tpl
index 538bdf0ba..a1a75ade6 100755
--- a/view/install_checks.tpl
+++ b/view/install_checks.tpl
@@ -1,6 +1,6 @@
<h1>$title</h1>
<h2>$pass</h2>
-<form action="$baseurl/install" method="POST">
+<form action="$baseurl/install" method="post">
<table>
{{ for $checks as $check }}
<tr><td>$check.title </td><td><span class="icon s22 {{if $check.status}}on{{else}}off{{endif}}"></td><td>{{if $check.required}}(required){{endif}}</td></tr>
diff --git a/view/intros.tpl b/view/intros.tpl
index d02fd57e6..e7fd53ca4 100755
--- a/view/intros.tpl
+++ b/view/intros.tpl
@@ -15,6 +15,7 @@
<form class="intro-approve-form" action="dfrn_confirm" method="post">
{{inc field_checkbox.tpl with $field=$hidden }}{{endinc}}
+{{inc field_checkbox.tpl with $field=$activity }}{{endinc}}
<input type="hidden" name="dfrn_id" value="$dfrn_id" >
<input type="hidden" name="intro_id" value="$intro_id" >
<input type="hidden" name="contact_id" value="$contact_id" >
diff --git a/view/jot-header.tpl b/view/jot-header.tpl
index d998e977a..007f639b6 100755
--- a/view/jot-header.tpl
+++ b/view/jot-header.tpl
@@ -3,14 +3,27 @@
var editor=false;
var textlen = 0;
+var plaintext = '$editselect';
function initEditor(cb){
if (editor==false){
- $("#profile-jot-text-loading").show();
+ $("#profile-jot-text-loading").show();
+ if(plaintext == 'none') {
+ $("#profile-jot-text-loading").hide();
+ $("#profile-jot-text").css({ 'height': 200, 'color': '#000' });
+ editor = true;
+ $("a#jot-perms-icon").fancybox({
+ 'transitionIn' : 'elastic',
+ 'transitionOut' : 'elastic'
+ });
+ $(".jothidden").show();
+ if (typeof cb!="undefined") cb();
+ return;
+ }
tinyMCE.init({
theme : "advanced",
mode : "specific_textareas",
- editor_selector: /(profile-jot-text|prvmail-text)/,
+ editor_selector: $editselect,
auto_focus: "profile-jot-text",
plugins : "bbcode,paste,autoresize",
theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor,formatselect,code",
@@ -105,7 +118,7 @@ function enableOnUser(){
}
</script>
-<script type="text/javascript" src="js/ajaxupload.js" ></script>
+<script type="text/javascript" src="$baseurl/js/ajaxupload.js" ></script>
<script>
var ispublic = '$ispublic';
var addtitle = '$addtitle';
@@ -123,7 +136,7 @@ function enableOnUser(){
name: 'userfile',
onSubmit: function(file,ext) { $('#profile-rotator').show(); },
onComplete: function(file,response) {
- tinyMCE.execCommand('mceInsertRawHTML',false,response);
+ addeditortext(response);
$('#profile-rotator').hide();
}
}
@@ -134,7 +147,7 @@ function enableOnUser(){
name: 'userfile',
onSubmit: function(file,ext) { $('#profile-rotator').show(); },
onComplete: function(file,response) {
- tinyMCE.execCommand('mceInsertRawHTML',false,response);
+ addeditortext(response);
$('#profile-rotator').hide();
}
}
@@ -167,7 +180,7 @@ function enableOnUser(){
reply = bin2hex(reply);
$('#profile-rotator').show();
$.get('parse_url?binurl=' + reply, function(data) {
- tinyMCE.execCommand('mceInsertRawHTML',false,data);
+ addeditortext(data);
$('#profile-rotator').hide();
});
}
@@ -176,14 +189,14 @@ function enableOnUser(){
function jotVideoURL() {
reply = prompt("$vidurl");
if(reply && reply.length) {
- tinyMCE.execCommand('mceInsertRawHTML',false,'[video]' + reply + '[/video]');
+ addeditortext('[video]' + reply + '[/video]');
}
}
function jotAudioURL() {
reply = prompt("$audurl");
if(reply && reply.length) {
- tinyMCE.execCommand('mceInsertRawHTML',false,'[audio]' + reply + '[/audio]');
+ addeditortext('[audio]' + reply + '[/audio]');
}
}
@@ -196,11 +209,13 @@ function enableOnUser(){
}
function jotShare(id) {
+ if ($('#jot-popup').length != 0) $('#jot-popup').show();
+
$('#like-rotator-' + id).show();
$.get('share/' + id, function(data) {
if (!editor) $("#profile-jot-text").val("");
initEditor(function(){
- tinyMCE.execCommand('mceInsertRawHTML',false,data);
+ addeditortext(data);
$('#like-rotator-' + id).hide();
$(window).scrollTop(0);
});
@@ -224,7 +239,7 @@ function enableOnUser(){
$.get('parse_url?binurl=' + reply, function(data) {
if (!editor) $("#profile-jot-text").val("");
initEditor(function(){
- tinyMCE.execCommand('mceInsertRawHTML',false,data);
+ addeditortext(data);
$('#profile-rotator').hide();
});
});
@@ -253,6 +268,15 @@ function enableOnUser(){
$('#profile-nolocation-wrapper').hide();
}
+ function addeditortext(data) {
+ if(plaintext == 'none') {
+ var currentText = $("#profile-jot-text").val();
+ $("#profile-jot-text").val(currentText + data);
+ }
+ else
+ tinyMCE.execCommand('mceInsertRawHTML',false,data);
+ }
+
$geotag
</script>
diff --git a/view/jot.tpl b/view/jot.tpl
index f116dc0f0..1c19dd6fa 100755
--- a/view/jot.tpl
+++ b/view/jot.tpl
@@ -13,9 +13,7 @@
<input type="hidden" name="preview" id="jot-preview" value="0" />
<textarea rows="5" cols="64" class="profile-jot-text" id="profile-jot-text" name="body" >{{ if $content }}$content{{ else }}$share{{ endif }}</textarea>
- {{ if $content }}<script>initEditor();</script>{{ endif }}
-
-
+
<ul id="jot-tools" class="jothidden" style="display:none">
<li><a href="#" onclick="return false;" id="wall-image-upload" title="$upload">$shortupload</a></a></li>
<li><a href="#" onclick="return false;" id="wall-file-upload" title="$attach">$shortattach</a></li>
@@ -45,6 +43,7 @@
</form>
+{{ if $content }}<script>initEditor();</script>{{ endif }}
diff --git a/view/mail_conv.tpl b/view/mail_conv.tpl
index be0632620..ed36a7bb2 100755
--- a/view/mail_conv.tpl
+++ b/view/mail_conv.tpl
@@ -7,7 +7,7 @@
<div class="mail-conv-date">$date</div>
<div class="mail-conv-subject">$subject</div>
<div class="mail-conv-body">$body</div>
- <div class="mail-conv-delete-wrapper" id="mail-conv-delete-wrapper-$id" ><a href="message/drop/$id" onclick="return confirmDelete();" ><img src="images/b_drophide.gif" alt="$delete" title="$delete" id="mail-conv-delete-icon-$id" class="mail-conv-delete-icon" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a></div><div class="mail-conv-delete-end"></div>
+ <div class="mail-conv-delete-wrapper" id="mail-conv-delete-wrapper-$id" ><a href="message/drop/$id" class="icon drophide delete-icon mail-list-delete-icon" onclick="return confirmDelete();" title="$delete" id="mail-conv-delete-icon-$id" class="mail-conv-delete-icon" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a></div><div class="mail-conv-delete-end"></div>
<div class="mail-conv-outside-wrapper-end"></div>
</div>
</div>
diff --git a/view/nav.tpl b/view/nav.tpl
index a5d845987..dffa6e520 100755
--- a/view/nav.tpl
+++ b/view/nav.tpl
@@ -79,7 +79,7 @@
<a class=" $nav.apps.2" href="#" rel="#nav-apps-menu" title="$nav.apps.3" >$nav.apps.1</a>
<ul id="nav-apps-menu" class="menu-popup">
{{ for $apps as $ap }}
- <li><a href="$ap.url">$ap.name</a></li>
+ <li>$ap</li>
{{ endfor }}
</ul>
</li>
diff --git a/view/profile_advanced.tpl b/view/profile_advanced.tpl
index 136edf8d7..470404fc3 100755
--- a/view/profile_advanced.tpl
+++ b/view/profile_advanced.tpl
@@ -1,75 +1,82 @@
<h2>$title</h2>
-<dl>
+<dl id="aprofile-fullname" class="aprofile">
<dt>$profile.fullname.0</dt>
<dd>$profile.fullname.1</dd>
</dl>
{{ if $profile.gender }}
-<dl>
+<dl id="aprofile-gender" class="aprofile">
<dt>$profile.gender.0</dt>
<dd>$profile.gender.1</dd>
</dl>
{{ endif }}
{{ if $profile.birthday }}
-<dl>
+<dl id="aprofile-birthday" class="aprofile">
<dt>$profile.birthday.0</dt>
<dd>$profile.birthday.1</dd>
</dl>
{{ endif }}
{{ if $profile.age }}
-<dl>
+<dl id="aprofile-age" class="aprofile">
<dt>$profile.age.0</dt>
<dd>$profile.age.1</dd>
</dl>
{{ endif }}
{{ if $profile.marital }}
-<dl>
+<dl id="aprofile-marital" class="aprofile">
<dt><span class="heart">&hearts;</span> $profile.marital.0</dt>
<dd>$profile.marital.1 {{ if $profile.marital.with }}($profile.marital.with){{ endif }}</dd>
</dl>
{{ endif }}
{{ if $profile.sexual }}
-<dl>
+<dl id="aprofile-sexual" class="aprofile">
<dt>$profile.sexual.0</dt>
<dd>$profile.sexual.1</dd>
</dl>
{{ endif }}
+{{ if $profile.pub_keywords }}
+<dl id="aprofile-tags" class="aprofile">
+ <dt>$profile.pub_keywords.0</dt>
+ <dd>$profile.pub_keywords.1</dd>
+</dl>
+{{ endif }}
+
{{ if $profile.homepage }}
-<dl>
+<dl id="aprofile-homepage" class="aprofile">
<dt>$profile.homepage.0</dt>
<dd>$profile.homepage.1</dd>
</dl>
{{ endif }}
{{ if $profile.politic }}
-<dl>
+<dl id="aprofile-politic" class="aprofile">
<dt>$profile.politic.0</dt>
<dd>$profile.politic.1</dd>
</dl>
{{ endif }}
{{ if $profile.religion }}
-<dl>
+<dl id="aprofile-religion" class="aprofile">
<dt>$profile.religion.0</dt>
<dd>$profile.religion.1</dd>
</dl>
{{ endif }}
{{ if $profile.about }}
-<dl>
+<dl id="aprofile-about" class="aprofile">
<dt>$profile.about.0</dt>
<dd>$profile.about.1</dd>
</dl>
{{ endif }}
{{ if $profile.interest }}
-<dl>
+<dl id="aprofile-interest" class="aprofile">
<dt>$profile.interest.0</dt>
<dd>$profile.interest.1</dd>
</dl>
@@ -77,7 +84,7 @@
{{ if $profile.contact }}
-<dl>
+<dl id="aprofile-contact" class="aprofile">
<dt>$profile.contact.0</dt>
<dd>$profile.contact.1</dd>
</dl>
@@ -85,7 +92,7 @@
{{ if $profile.music }}
-<dl>
+<dl id="aprofile-music" class="aprofile">
<dt>$profile.music.0</dt>
<dd>$profile.music.1</dd>
</dl>
@@ -93,7 +100,7 @@
{{ if $profile.book }}
-<dl>
+<dl id="aprofile-book" class="aprofile">
<dt>$profile.book.0</dt>
<dd>$profile.book.1</dd>
</dl>
@@ -101,7 +108,7 @@
{{ if $profile.tv }}
-<dl>
+<dl id="aprofile-tv" class="aprofile">
<dt>$profile.tv.0</dt>
<dd>$profile.tv.1</dd>
</dl>
@@ -109,7 +116,7 @@
{{ if $profile.film }}
-<dl>
+<dl id="aprofile-film" class="aprofile">
<dt>$profile.film.0</dt>
<dd>$profile.film.1</dd>
</dl>
@@ -117,7 +124,7 @@
{{ if $profile.romance }}
-<dl>
+<dl id="aprofile-romance" class="aprofile">
<dt>$profile.romance.0</dt>
<dd>$profile.romance.1</dd>
</dl>
@@ -125,14 +132,14 @@
{{ if $profile.work }}
-<dl>
+<dl id="aprofile-work" class="aprofile">
<dt>$profile.work.0</dt>
<dd>$profile.work.1</dd>
</dl>
{{ endif }}
{{ if $profile.education }}
-<dl>
+<dl id="aprofile-education" class="aprofile">
<dt>$profile.education.0</dt>
<dd>$profile.education.1</dd>
</dl>
diff --git a/view/search_item.tpl b/view/search_item.tpl
index c4f3ccac7..de8bd2396 100755
--- a/view/search_item.tpl
+++ b/view/search_item.tpl
@@ -78,6 +78,14 @@
<div class="wall-item-bottom">
<div class="wall-item-links"></div>
<div class="wall-item-like" id="wall-item-like-$id">$like</div>
- <div class="wall-item-dislike" id="wall-item-dislike-$id">$dislike</div>
+ <div class="wall-item-dislike" id="wall-item-dislike-$id">$dislike</div>
+ {{ if $conv }}
+ <div class="wall-item-conv" id="wall-item-conv-$id" >
+ <a href='$conv.href' id='context-$id' title='$conv.title'>$conv.title</a>
+ {{ endif }}
+ </div>
</div>
+
+
</div>
+
diff --git a/view/settings.tpl b/view/settings.tpl
index 6310ff47e..1172df8b9 100755
--- a/view/settings.tpl
+++ b/view/settings.tpl
@@ -108,6 +108,7 @@ $suggestme
{{inc field_intcheckbox.tpl with $field=$notify4 }}{{endinc}}
{{inc field_intcheckbox.tpl with $field=$notify5 }}{{endinc}}
{{inc field_intcheckbox.tpl with $field=$notify6 }}{{endinc}}
+{{inc field_intcheckbox.tpl with $field=$notify7 }}{{endinc}}
</div>
diff --git a/view/theme/dispy/jot-header.tpl b/view/theme/dispy/jot-header.tpl
index 79db0ec5a..8dccf71ed 100755
--- a/view/theme/dispy/jot-header.tpl
+++ b/view/theme/dispy/jot-header.tpl
@@ -9,6 +9,33 @@ function initEditor(cb) {
if (editor==false) {
$("#profile-jot-text-loading").show();
$("#jot-title-desc").show();
+ if(plaintext == 'none') {
+ $("#profile-jot-text-loading").hide();
+ $("#profile-jot-text").css({ 'height': 200, 'color': '#000' });
+ $(".jothidden").show();
+ editor = true;
+ $("a#jot-perms-icon").fancybox({
+ 'transitionIn' : 'elastic',
+ 'transitionOut' : 'elastic'
+ });
+ $("#profile-jot-submit-wrapper").show();
+ {{ if $newpost }}
+ $("#profile-upload-wrapper").show();
+ $("#profile-attach-wrapper").show();
+ $("#profile-link-wrapper").show();
+ $("#profile-video-wrapper").show();
+ $("#profile-audio-wrapper").show();
+ $("#profile-location-wrapper").show();
+ $("#profile-nolocation-wrapper").show();
+ $("#profile-title-wrapper").show();
+ $("#profile-jot-plugin-wrapper").show();
+ $("#jot-preview-link").show();
+ {{ endif }}
+
+
+ if (typeof cb!="undefined") cb();
+ return;
+ }
tinyMCE.init({
theme : "advanced",
mode : "specific_textareas",
@@ -132,7 +159,7 @@ function initEditor(cb) {
name: 'userfile',
onSubmit: function(file,ext) { $('#profile-rotator').show(); },
onComplete: function(file,response) {
- tinyMCE.execCommand('mceInsertRawHTML',false,response);
+ addeditortext(response);
$('#profile-rotator').hide();
}
}
@@ -143,7 +170,7 @@ function initEditor(cb) {
name: 'userfile',
onSubmit: function(file,ext) { $('#profile-rotator').show(); },
onComplete: function(file,response) {
- tinyMCE.execCommand('mceInsertRawHTML',false,response);
+ addeditortext(response);
$('#profile-rotator').hide();
}
}
@@ -190,7 +217,7 @@ function initEditor(cb) {
reply = bin2hex(reply);
$('#profile-rotator').show();
$.get('parse_url?binurl=' + reply, function(data) {
- tinyMCE.execCommand('mceInsertRawHTML',false,data);
+ addeditortext(data);
$('#profile-rotator').hide();
});
}
@@ -199,21 +226,21 @@ function initEditor(cb) {
function jotGetVideo() {
reply = prompt("$utubeurl");
if(reply && reply.length) {
- tinyMCE.execCommand('mceInsertRawHTML',false,'[youtube]' + reply + '[/youtube]');
+ addeditortext('[youtube]' + reply + '[/youtube]');
}
}
function jotVideoURL() {
reply = prompt("$vidurl");
if(reply && reply.length) {
- tinyMCE.execCommand('mceInsertRawHTML',false,'[video]' + reply + '[/video]');
+ addeditortext('[video]' + reply + '[/video]');
}
}
function jotAudioURL() {
reply = prompt("$audurl");
if(reply && reply.length) {
- tinyMCE.execCommand('mceInsertRawHTML',false,'[audio]' + reply + '[/audio]');
+ addeditortext('[audio]' + reply + '[/audio]');
}
}
@@ -237,7 +264,7 @@ function initEditor(cb) {
$.get('share/' + id, function(data) {
if (!editor) $("#profile-jot-text").val("");
initEditor(function(){
- tinyMCE.execCommand('mceInsertRawHTML',false,data);
+ addeditortext(data);
$('#like-rotator-' + id).hide();
$(window).scrollTop(0);
});
@@ -260,7 +287,7 @@ function initEditor(cb) {
$.get('parse_url?binurl=' + reply, function(data) {
if (!editor) $("#profile-jot-text").val("");
initEditor(function(){
- tinyMCE.execCommand('mceInsertRawHTML',false,data);
+ addeditortext(data);
$('#profile-rotator').hide();
});
});
@@ -272,6 +299,15 @@ function initEditor(cb) {
$('#profile-nolocation-wrapper').hide();
}
+ function addeditortext(data) {
+ if(plaintext == 'none') {
+ var currentText = $("#profile-jot-text").val();
+ $("#profile-jot-text").val(currentText + data);
+ }
+ else
+ tinyMCE.execCommand('mceInsertRawHTML',false,data);
+ }
+
$geotag
</script>
diff --git a/view/theme/dispy/jot.tpl b/view/theme/dispy/jot.tpl
index 0ceddb3b7..c312d221a 100755
--- a/view/theme/dispy/jot.tpl
+++ b/view/theme/dispy/jot.tpl
@@ -24,7 +24,6 @@
<img id="profile-jot-text-loading" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
<textarea rows="5" cols="64" class="profile-jot-text" id="profile-jot-text" name="body" >{{ if $content }}$content{{ else }}$share{{ endif }}</textarea>
- {{ if $content }}<script>initEditor();</script>{{ endif }}
<div id="profile-jot-submit-wrapper" style="display:none">
@@ -73,3 +72,4 @@
<div id="profile-jot-end"></div>
</form>
</div>
+ {{ if $content }}<script>initEditor();</script>{{ endif }}
diff --git a/view/theme/dispy/style.css b/view/theme/dispy/style.css
index f2807b36f..5bc1450db 100755
--- a/view/theme/dispy/style.css
+++ b/view/theme/dispy/style.css
@@ -1291,3 +1291,11 @@ footer { display: block; margin: 50px 20%; clear: both; }
.acpopupitem.selected {
color: #2e3436; background-color: #eeeeec;
}
+.qcomment {
+ opacity: 0;
+ filter:alpha(opacity=0);
+}
+.qcomment:hover {
+ opacity: 1.0;
+ filter:alpha(opacity=100);
+}
diff --git a/view/theme/dispy/wall_item.tpl b/view/theme/dispy/wall_item.tpl
index 51431d4eb..9c3703f5f 100755
--- a/view/theme/dispy/wall_item.tpl
+++ b/view/theme/dispy/wall_item.tpl
@@ -29,7 +29,7 @@
<div class="wall-item-like-buttons" id="wall-item-like-buttons-$id">
<a href="#" class="icon like" title="$vote.like.0" onclick="dolike($id,'like'); return false"></a>
<a href="#" class="icon dislike" title="$vote.dislike.0" onclick="dolike($id,'dislike'); return false"></a>
- {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title=""$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
+ {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title="$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
<img id="like-rotator-$id" class="like-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
</div>
{{ endif }}
diff --git a/view/theme/dispy/wallwall_item.tpl b/view/theme/dispy/wallwall_item.tpl
index 4b2b52b85..95c68220a 100755
--- a/view/theme/dispy/wallwall_item.tpl
+++ b/view/theme/dispy/wallwall_item.tpl
@@ -34,7 +34,7 @@
<div class="wall-item-like-buttons" id="wall-item-like-buttons-$id">
<a href="#" class="icon like" title="$vote.like.0" onclick="dolike($id,'like'); return false"></a>
<a href="#" class="icon dislike" title="$vote.dislike.0" onclick="dolike($id,'dislike'); return false"></a>
- {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title=""$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
+ {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title="$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
<img id="like-rotator-$id" class="like-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
</div>
{{ endif }}
diff --git a/view/theme/duepuntozero/comment_item.tpl b/view/theme/duepuntozero/comment_item.tpl
new file mode 100755
index 000000000..b29735227
--- /dev/null
+++ b/view/theme/duepuntozero/comment_item.tpl
@@ -0,0 +1,32 @@
+ <div class="comment-$wwedit-wrapper" id="comment-edit-wrapper-$id" style="display: block;">
+ <form class="comment-edit-form" id="comment-edit-form-$id" action="item" method="post" onsubmit="post_comment($id); return false;">
+ <input type="hidden" name="type" value="$type" />
+ <input type="hidden" name="profile_uid" value="$profile_uid" />
+ <input type="hidden" name="parent" value="$parent" />
+ <input type="hidden" name="return" value="$return_path" />
+ <input type="hidden" name="jsreload" value="$jsreload" />
+ <input type="hidden" name="preview" id="comment-preview-inp-$id" value="0" />
+
+ <div class="comment-edit-photo" id="comment-edit-photo-$id" >
+ <a class="comment-edit-photo-link" href="$mylink" title="$mytitle"><img class="my-comment-photo" src="$myphoto" alt="$mytitle" title="$mytitle" /></a>
+ </div>
+ <div class="comment-edit-photo-end"></div>
+ <textarea id="comment-edit-text-$id" class="comment-edit-text-empty" name="body" onFocus="commentOpen(this,$id);" onBlur="commentClose(this,$id);" >$comment</textarea>
+ {{ if $qcomment }}
+ {{ for $qcomment as $qc }}
+ <span class="fakelink qcomment" onclick="commentInsert(this,$id); return false;" >$qc</span>
+ &nbsp;
+ {{ endfor }}
+ {{ endif }}
+
+ <div class="comment-edit-text-end"></div>
+ <div class="comment-edit-submit-wrapper" id="comment-edit-submit-wrapper-$id" style="display: none;" >
+ <input type="submit" onclick="post_comment($id); return false;" id="comment-edit-submit-$id" class="comment-edit-submit" name="submit" value="$submit" />
+ <span onclick="preview_comment($id);" id="comment-edit-preview-link-$id" class="fakelink">$preview</span>
+ <div id="comment-edit-preview-$id" class="comment-edit-preview" style="display:none;"></div>
+ </div>
+
+ <div class="comment-edit-end"></div>
+ </form>
+
+ </div>
diff --git a/view/theme/duepuntozero/jot.tpl b/view/theme/duepuntozero/jot.tpl
index ade1614b7..e356d1d8f 100755
--- a/view/theme/duepuntozero/jot.tpl
+++ b/view/theme/duepuntozero/jot.tpl
@@ -18,7 +18,6 @@
<img id="profile-jot-text-loading" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
<textarea rows="5" cols="64" class="profile-jot-text" id="profile-jot-text" name="body" >{{ if $content }}$content{{ else }}$share{{ endif }}</textarea>
- {{ if $content }}<script>initEditor();</script>{{ endif }}
<div id="profile-jot-submit-wrapper" class="jothidden">
<input type="submit" id="profile-jot-submit" name="submit" value="$share" />
@@ -81,3 +80,4 @@
<div id="profile-jot-end"></div>
</form>
</div>
+ {{ if $content }}<script>initEditor();</script>{{ endif }}
diff --git a/view/theme/duepuntozero/style.css b/view/theme/duepuntozero/style.css
index 1a96e7f17..cf7505ad0 100755
--- a/view/theme/duepuntozero/style.css
+++ b/view/theme/duepuntozero/style.css
@@ -809,6 +809,9 @@ input#dfrn-url {
width: 120px;
height: 120px;
}
+#contacts-search-end {
+ margin-bottom: 10px;
+}
.contact-entry-direction-icon {
margin-top: 24px;
@@ -824,6 +827,7 @@ input#dfrn-url {
.contact-entry-name {
float: left;
margin-left: 0px;
+ margin-right: 10px;
width: 120px;
overflow: hidden;
}
@@ -2535,6 +2539,7 @@ aside input[type='text'] {
margin-top: 15px;
}
+#crepair-name-label,
#crepair-nick-label,
#crepair-attag-label,
#crepair-url-label,
@@ -2548,6 +2553,7 @@ aside input[type='text'] {
margin-bottom: 15px;
}
+#crepair-name,
#crepair-nick,
#crepair-attag,
#crepair-url,
@@ -2947,3 +2953,17 @@ div.jGrowl div.info {
color: #ffffff;
padding-left: 58px;
}
+
+.qcomment {
+ border: 1px solid #EEE;
+ padding: 3px;
+}
+
+.qcomment {
+ opacity: 0;
+ filter:alpha(opacity=0);
+}
+.qcomment:hover {
+ opacity: 1.0;
+ filter:alpha(opacity=100);
+}
diff --git a/view/theme/duepuntozero/wall_item.tpl b/view/theme/duepuntozero/wall_item.tpl
index 5d54a1d6a..a5136eed3 100755
--- a/view/theme/duepuntozero/wall_item.tpl
+++ b/view/theme/duepuntozero/wall_item.tpl
@@ -42,7 +42,7 @@
<div class="wall-item-like-buttons" id="wall-item-like-buttons-$id">
<a href="#" class="icon like" title="$vote.like.0" onclick="dolike($id,'like'); return false"></a>
<a href="#" class="icon dislike" title="$vote.dislike.0" onclick="dolike($id,'dislike'); return false"></a>
- {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title=""$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
+ {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title="$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
<img id="like-rotator-$id" class="like-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
</div>
{{ endif }}
diff --git a/view/theme/duepuntozero/wallwall_item.tpl b/view/theme/duepuntozero/wallwall_item.tpl
index 3ccd1224b..ea9a218b4 100755
--- a/view/theme/duepuntozero/wallwall_item.tpl
+++ b/view/theme/duepuntozero/wallwall_item.tpl
@@ -46,7 +46,7 @@
<div class="wall-item-like-buttons" id="wall-item-like-buttons-$id">
<a href="#" class="icon like" title="$vote.like.0" onclick="dolike($id,'like'); return false"></a>
<a href="#" class="icon dislike" title="$vote.dislike.0" onclick="dolike($id,'dislike'); return false"></a>
- {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title=""$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
+ {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title="$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
<img id="like-rotator-$id" class="like-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
</div>
{{ endif }}
diff --git a/view/theme/loozah/comment_item.tpl b/view/theme/loozah/comment_item.tpl
new file mode 100755
index 000000000..b29735227
--- /dev/null
+++ b/view/theme/loozah/comment_item.tpl
@@ -0,0 +1,32 @@
+ <div class="comment-$wwedit-wrapper" id="comment-edit-wrapper-$id" style="display: block;">
+ <form class="comment-edit-form" id="comment-edit-form-$id" action="item" method="post" onsubmit="post_comment($id); return false;">
+ <input type="hidden" name="type" value="$type" />
+ <input type="hidden" name="profile_uid" value="$profile_uid" />
+ <input type="hidden" name="parent" value="$parent" />
+ <input type="hidden" name="return" value="$return_path" />
+ <input type="hidden" name="jsreload" value="$jsreload" />
+ <input type="hidden" name="preview" id="comment-preview-inp-$id" value="0" />
+
+ <div class="comment-edit-photo" id="comment-edit-photo-$id" >
+ <a class="comment-edit-photo-link" href="$mylink" title="$mytitle"><img class="my-comment-photo" src="$myphoto" alt="$mytitle" title="$mytitle" /></a>
+ </div>
+ <div class="comment-edit-photo-end"></div>
+ <textarea id="comment-edit-text-$id" class="comment-edit-text-empty" name="body" onFocus="commentOpen(this,$id);" onBlur="commentClose(this,$id);" >$comment</textarea>
+ {{ if $qcomment }}
+ {{ for $qcomment as $qc }}
+ <span class="fakelink qcomment" onclick="commentInsert(this,$id); return false;" >$qc</span>
+ &nbsp;
+ {{ endfor }}
+ {{ endif }}
+
+ <div class="comment-edit-text-end"></div>
+ <div class="comment-edit-submit-wrapper" id="comment-edit-submit-wrapper-$id" style="display: none;" >
+ <input type="submit" onclick="post_comment($id); return false;" id="comment-edit-submit-$id" class="comment-edit-submit" name="submit" value="$submit" />
+ <span onclick="preview_comment($id);" id="comment-edit-preview-link-$id" class="fakelink">$preview</span>
+ <div id="comment-edit-preview-$id" class="comment-edit-preview" style="display:none;"></div>
+ </div>
+
+ <div class="comment-edit-end"></div>
+ </form>
+
+ </div>
diff --git a/view/theme/loozah/jot.tpl b/view/theme/loozah/jot.tpl
index 9bda1868e..ac64223fb 100755
--- a/view/theme/loozah/jot.tpl
+++ b/view/theme/loozah/jot.tpl
@@ -19,7 +19,6 @@
<img id="profile-jot-text-loading" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
<textarea rows="5" cols="64" class="profile-jot-text" id="profile-jot-text" name="body" >{{ if $content }}$content{{ else }}$share{{ endif }}</textarea>
- {{ if $content }}<script>initEditor();</script>{{ endif }}
<div id="profile-jot-submit-wrapper" style="display:none" class="jothidden">
<input type="submit" id="profile-jot-submit" name="submit" value="$share" />
@@ -82,3 +81,4 @@
<div id="profile-jot-end"></div>
</form>
</div>
+ {{ if $content }}<script>initEditor();</script>{{ endif }}
diff --git a/view/theme/loozah/wall_item.tpl b/view/theme/loozah/wall_item.tpl
index e2b7c9c5a..727e3d1c2 100755
--- a/view/theme/loozah/wall_item.tpl
+++ b/view/theme/loozah/wall_item.tpl
@@ -36,7 +36,7 @@
<div class="wall-item-like-buttons" id="wall-item-like-buttons-$id">
<a href="#" class="icon like" title="$vote.like.0" onclick="dolike($id,'like'); return false"></a>
<a href="#" class="icon dislike" title="$vote.dislike.0" onclick="dolike($id,'dislike'); return false"></a>
- {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title=""$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
+ {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title="$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
<img id="like-rotator-$id" class="like-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
</div>
{{ endif }}
diff --git a/view/theme/loozah/wallwall_item.tpl b/view/theme/loozah/wallwall_item.tpl
index aaa542760..09de86c7b 100755
--- a/view/theme/loozah/wallwall_item.tpl
+++ b/view/theme/loozah/wallwall_item.tpl
@@ -40,7 +40,7 @@
<div class="wall-item-like-buttons" id="wall-item-like-buttons-$id">
<a href="#" class="icon like" title="$vote.like.0" onclick="dolike($id,'like'); return false"></a>
<a href="#" class="icon dislike" title="$vote.dislike.0" onclick="dolike($id,'dislike'); return false"></a>
- {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title=""$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
+ {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title="$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
<img id="like-rotator-$id" class="like-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
</div>
{{ endif }}
diff --git a/view/theme/quattro-green/colors.less b/view/theme/quattro-green/colors.less
new file mode 100755
index 000000000..fd32b1043
--- /dev/null
+++ b/view/theme/quattro-green/colors.less
@@ -0,0 +1,94 @@
+// Quattro Theme LESS file
+
+// "Echo" palette from Inkscape
+@Blue1:rgb(25,174,255);
+@Blue2:rgb(0,132,200);
+@Blue3:rgb(0,92,148);
+@Red1:rgb(255,65,65);
+@Red2:rgb(220,0,0);
+@Red3:rgb(181,0,0);
+@Orange1:rgb(255,255,62);
+@Orange2:rgb(255,153,0);
+@Orange3:rgb(255,102,0);
+@Brown1:rgb(255,192,34);
+@Brown2:rgb(184,129,0);
+@Brown3:rgb(128,77,0);
+@Green1:rgb(204,255,66);
+@Green2:rgb(154,222,0);
+@Green3:rgb(0,145,0);
+@Purple1:rgb(241,202,255);
+@Purple2:rgb(215,108,255);
+@Purple3:rgb(186,0,255);
+@Metalic1:rgb(189,205,212);
+@Metalic2:rgb(158,171,176);
+@Metalic3:rgb(54,78,89);
+@Metalic4:rgb(14,35,46);
+@Grey1:rgb(255,255,255);
+@Grey2:rgb(204,204,204);
+@Grey3:rgb(153,153,153);
+@Grey4:rgb(102,102,102);
+@Grey5:rgb(45,45,45);
+
+
+// Theme colors
+@BodyBackground: @Grey1;
+@BodyColor: @Grey5;
+
+@Link: @Green3;
+@LinkHover: @Green3;
+@LinkVisited: @Green3;
+
+
+@ButtonColor: @Grey1;
+@ButtonBackgroundColor: @Grey5;
+
+@Banner: @Grey1;
+
+@NavbarBackground:@Green3;
+@NavbarSelectedBg:@Metalic3;
+@NavbarSelectedBorder: @Metalic2;
+@NavbarNotifBg: @Red2;
+
+@Menu: @Grey5;
+@MenuBg: @Grey1;
+@MenuBorder: @Metalic3;
+@MenuItem: @Grey5;
+@MenuItemHoverBg: @Green1;
+@MenuItemSeparator: @Metalic2;
+@MenuEmpty: @Metalic2;
+@MenuItemDetail: @Metalic2;
+
+@AsideBorder: @Metalic1;
+@AsideConnect: @Grey1;
+@AsideConnectBg: @Green3;
+@AsideConnectHoverBg: @Green1;
+@VCardLabelColor: @Grey3;
+
+@InfoColor: @Grey1;
+@InfoBackgroundColor: @Metalic3;
+
+@NoticeColor: @Grey1;
+@NoticeBackgroundColor: #511919;
+
+@ThreadBackgroundColor: #f6f7f8;
+
+@CommentBoxEmptyColor: @Grey3;
+@CommentBoxEmptyBorderColor: @Grey3;
+@CommentBoxFullColor: @Grey5;
+@CommentBoxFullBorderColor: @Grey5;
+
+@TagColor: @Grey1;
+
+@JotToolsBackgroundColor: @Green3;
+@JotToolsBorderColor: @Metalic2;
+@JotToolsOverBackgroundColor: @Green2;
+@JotToolsOverBorderColor: @Metalic1;
+@JotToolsText: @Grey5;
+@JotSubmitBackgroundColor: @Grey2;
+@JotSubmitText: @Grey4;
+@JotSubmitOverBackgroundColor: @Green1;
+@JotSubmitOverText: @Grey4;
+@JotPermissionUnlockBackgroundColor: @Grey2;
+@JotPermissionLockBackgroundColor: @Grey4;
+@JotLoadingBackgroundColor: @Grey1;
+
diff --git a/view/theme/quattro-green/contact_template.tpl b/view/theme/quattro-green/contact_template.tpl
new file mode 100755
index 000000000..f2749656a
--- /dev/null
+++ b/view/theme/quattro-green/contact_template.tpl
@@ -0,0 +1,21 @@
+
+<div class="contact-wrapper" id="contact-entry-wrapper-$id" >
+ <div class="contact-photo-wrapper" >
+ <div class="contact-photo mframe" id="contact-entry-photo-$id"
+ onmouseover="if (typeof t$id != 'undefined') clearTimeout(t$id); openMenu('contact-photo-menu-button-$id')" onmouseout="t$id=setTimeout('closeMenu(\'contact-photo-menu-button-$id\'); closeMenu(\'contact-photo-menu-$id\');',200)" >
+
+ <a href="$url" title="$img_hover" /><img src="$thumb" $sparkle alt="$name" /></a>
+
+ <a href="#" rel="#contact-photo-menu-$id" class="contact-photo-menu-button icon s16 menu" id="contact-photo-menu-button-$id">menu</a>
+ <ul class="contact-photo-menu menu-popup" id="contact-photo-menu-$id">
+ $contact_photo_menu
+ </ul>
+
+ </div>
+
+ </div>
+ <div class="contact-name" id="contact-entry-name-$id" >$name</div>
+
+
+</div>
+
diff --git a/view/theme/darkbubble/experimental b/view/theme/quattro-green/experimental
index e69de29bb..e69de29bb 100755
--- a/view/theme/darkbubble/experimental
+++ b/view/theme/quattro-green/experimental
diff --git a/view/theme/quattro-green/style.css b/view/theme/quattro-green/style.css
new file mode 100755
index 000000000..8dad50971
--- /dev/null
+++ b/view/theme/quattro-green/style.css
@@ -0,0 +1,1374 @@
+/**
+ * Fabio Comuni <http://kirgroup.com/profile/fabrixxm>
+ **/
+/* icons */
+.icon {
+ background-color: transparent ;
+ background-repeat: no-repeat;
+ background-position: left center;
+ display: block;
+ overflow: hidden;
+ text-indent: -9999px;
+ padding: 1px;
+}
+.icon.text {
+ text-indent: 0px;
+}
+.icon.s10 {
+ min-width: 10px;
+ height: 10px;
+}
+.icon.s10.notify {
+ background-image: url("../../../images/icons/10/notify_off.png");
+}
+.icon.s10.gear {
+ background-image: url("../../../images/icons/10/gear.png");
+}
+.icon.s10.add {
+ background-image: url("../../../images/icons/10/add.png");
+}
+.icon.s10.delete {
+ background-image: url("../../../images/icons/10/delete.png");
+}
+.icon.s10.edit {
+ background-image: url("../../../images/icons/10/edit.png");
+}
+.icon.s10.star {
+ background-image: url("../../../images/icons/10/star.png");
+}
+.icon.s10.menu {
+ background-image: url("../../../images/icons/10/menu.png");
+}
+.icon.s10.link {
+ background-image: url("../../../images/icons/10/link.png");
+}
+.icon.s10.lock {
+ background-image: url("../../../images/icons/10/lock.png");
+}
+.icon.s10.unlock {
+ background-image: url("../../../images/icons/10/unlock.png");
+}
+.icon.s10.text {
+ padding: 2px 0px 0px 15px;
+}
+.icon.s16 {
+ min-width: 16px;
+ height: 16px;
+}
+.icon.s16.notify {
+ background-image: url("../../../images/icons/16/notify_off.png");
+}
+.icon.s16.gear {
+ background-image: url("../../../images/icons/16/gear.png");
+}
+.icon.s16.add {
+ background-image: url("../../../images/icons/16/add.png");
+}
+.icon.s16.delete {
+ background-image: url("../../../images/icons/16/delete.png");
+}
+.icon.s16.edit {
+ background-image: url("../../../images/icons/16/edit.png");
+}
+.icon.s16.star {
+ background-image: url("../../../images/icons/16/star.png");
+}
+.icon.s16.menu {
+ background-image: url("../../../images/icons/16/menu.png");
+}
+.icon.s16.link {
+ background-image: url("../../../images/icons/16/link.png");
+}
+.icon.s16.lock {
+ background-image: url("../../../images/icons/16/lock.png");
+}
+.icon.s16.unlock {
+ background-image: url("../../../images/icons/16/unlock.png");
+}
+.icon.s16.text {
+ padding: 4px 0px 0px 20px;
+}
+.icon.s22 {
+ min-width: 22px;
+ height: 22px;
+}
+.icon.s22.notify {
+ background-image: url("../../../images/icons/22/notify_off.png");
+}
+.icon.s22.gear {
+ background-image: url("../../../images/icons/22/gear.png");
+}
+.icon.s22.add {
+ background-image: url("../../../images/icons/22/add.png");
+}
+.icon.s22.delete {
+ background-image: url("../../../images/icons/22/delete.png");
+}
+.icon.s22.edit {
+ background-image: url("../../../images/icons/22/edit.png");
+}
+.icon.s22.star {
+ background-image: url("../../../images/icons/22/star.png");
+}
+.icon.s22.menu {
+ background-image: url("../../../images/icons/22/menu.png");
+}
+.icon.s22.link {
+ background-image: url("../../../images/icons/22/link.png");
+}
+.icon.s22.lock {
+ background-image: url("../../../images/icons/22/lock.png");
+}
+.icon.s22.unlock {
+ background-image: url("../../../images/icons/22/unlock.png");
+}
+.icon.s22.text {
+ padding: 10px 0px 0px 25px;
+}
+.icon.s48 {
+ width: 48px;
+ height: 48px;
+}
+.icon.s48.notify {
+ background-image: url("../../../images/icons/48/notify_off.png");
+}
+.icon.s48.gear {
+ background-image: url("../../../images/icons/48/gear.png");
+}
+.icon.s48.add {
+ background-image: url("../../../images/icons/48/add.png");
+}
+.icon.s48.delete {
+ background-image: url("../../../images/icons/48/delete.png");
+}
+.icon.s48.edit {
+ background-image: url("../../../images/icons/48/edit.png");
+}
+.icon.s48.star {
+ background-image: url("../../../images/icons/48/star.png");
+}
+.icon.s48.menu {
+ background-image: url("../../../images/icons/48/menu.png");
+}
+.icon.s48.link {
+ background-image: url("../../../images/icons/48/link.png");
+}
+.icon.s48.lock {
+ background-image: url("../../../images/icons/48/lock.png");
+}
+.icon.s48.unlock {
+ background-image: url("../../../images/icons/48/unlock.png");
+}
+/* global */
+body {
+ font-family: Liberation Sans, helvetica, arial, clean, sans-serif;
+ font-size: 11px;
+ background-color: #ffffff;
+ color: #2d2d2d;
+ margin: 50px 0px 0px 0px;
+ display: table;
+}
+h4 {
+ font-size: 1.1em;
+}
+a, a:link {
+ color: #009100;
+ text-decoration: none;
+}
+a:visited {
+ color: #009100;
+ text-decoration: none;
+}
+a:hover {
+ color: #009100;
+ text-decoration: underline;
+}
+.left {
+ float: left;
+}
+.right {
+ float: right;
+}
+.hidden {
+ display: none;
+}
+.clear {
+ clear: both;
+}
+.fakelink {
+ color: #009100;
+ text-decoration: none;
+ cursor: pointer;
+}
+.fakelink:hover {
+ color: #009100;
+ text-decoration: underline;
+}
+code {
+ font-family: Courier, monospace;
+ white-space: pre;
+ display: block;
+ overflow: auto;
+ border: 1px solid #444;
+ background: #EEE;
+ color: #444;
+ padding: 10px;
+ margin-top: 20px;
+}
+#panel {
+ position: absolute;
+ width: 10em;
+ background: #ffffff;
+ color: #2d2d2d;
+ margin: 0px;
+ padding: 1em;
+ list-style: none;
+ border: 3px solid #364e59;
+ z-index: 100000;
+ -webkit-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
+ -moz-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
+ box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
+}
+/* tool */
+.tool {
+ height: auto;
+ overflow: auto;
+}
+.tool .label {
+ float: left;
+}
+.tool .action {
+ float: right;
+}
+/* popup notifications */
+div.jGrowl div.notice {
+ background: #511919 url("../../../images/icons/48/notice.png") no-repeat 5px center;
+ color: #ffffff;
+ padding-left: 58px;
+}
+div.jGrowl div.info {
+ background: #364e59 url("../../../images/icons/48/info.png") no-repeat 5px center;
+ color: #ffffff;
+ padding-left: 58px;
+}
+/* header */
+header {
+ position: fixed;
+ left: 43%;
+ right: 43%;
+ top: 0px;
+ margin: 0px;
+ padding: 0px;
+ /*width: 100%; height: 12px; */
+
+ z-index: 110;
+ color: #ffffff;
+}
+header #site-location {
+ display: none;
+}
+header #banner {
+ overflow: hidden;
+ text-align: center;
+ width: 100%;
+}
+header #banner a,
+header #banner a:active,
+header #banner a:visited,
+header #banner a:link,
+header #banner a:hover {
+ color: #ffffff;
+ text-decoration: none;
+ outline: none;
+ vertical-align: bottom;
+}
+header #banner #logo-img {
+ height: 22px;
+ margin-top: 5px;
+}
+header #banner #logo-text {
+ font-size: 22px;
+}
+/* nav */
+nav {
+ width: 100%;
+ height: 32px;
+ position: fixed;
+ left: 0px;
+ top: 0px;
+ padding: 0px;
+ background-color: #009100;
+ color: #ffffff;
+ z-index: 100;
+ -webkit-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7);
+ -moz-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7);
+ box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7);
+}
+nav a,
+nav a:active,
+nav a:visited,
+nav a:link,
+nav a:hover {
+ color: #ffffff;
+ text-decoration: none;
+ outline: none;
+}
+nav ul {
+ margin: 0px;
+ padding: 0px 20px;
+}
+nav ul li {
+ list-style: none;
+ margin: 0px;
+ padding: 0px;
+ float: left;
+}
+nav ul li .menu-popup {
+ left: 0px;
+ right: auto;
+}
+nav .nav-menu-icon {
+ position: relative;
+ height: 22px;
+ padding: 5px;
+ margin: 0px 10px;
+ -moz-border-radius: 5px 5px 0 0;
+ -webkit-border-radius: 5px 5px 0 0;
+ border-radius: 5px 5px 0 0;
+}
+nav .nav-menu-icon.selected {
+ background-color: #364e59;
+}
+nav .nav-menu-icon img {
+ width: 22px;
+ height: 22px;
+}
+nav .nav-menu-icon .nav-notify {
+ top: 3px;
+}
+nav .nav-menu {
+ position: relative;
+ height: 16px;
+ padding: 5px;
+ margin: 3px 15px 0px;
+ font-size: 14px;
+ border-bottom: 3px solid #009100;
+}
+nav .nav-menu.selected {
+ border-bottom: 3px solid #9eabb0;
+}
+nav .nav-notify {
+ display: none;
+ position: absolute;
+ background-color: #dc0000;
+ -moz-border-radius: 5px 5px 5px 5px;
+ -webkit-border-radius: 5px 5px 5px 5px;
+ border-radius: 5px 5px 5px 5px;
+ font-size: 10px;
+ padding: 1px 3px;
+ top: 0px;
+ right: -10px;
+ min-width: 15px;
+ text-align: right;
+}
+nav .nav-notify.show {
+ display: block;
+}
+nav #nav-help-link,
+nav #nav-search-link,
+nav #nav-directory-link,
+nav #nav-apps-link,
+nav #nav-site-linkmenu {
+ float: right;
+}
+nav #nav-help-link .menu-popup,
+nav #nav-search-link .menu-popup,
+nav #nav-directory-link .menu-popup,
+nav #nav-apps-link .menu-popup,
+nav #nav-site-linkmenu .menu-popup {
+ right: 0px;
+ left: auto;
+}
+nav #nav-notifications-linkmenu.on .icon.s22.notify, nav #nav-notifications-linkmenu.selected .icon.s22.notify {
+ background-image: url("../../../images/icons/22/notify_on.png");
+}
+nav #nav-apps-link.selected {
+ background-color: #364e59;
+}
+ul.menu-popup {
+ position: absolute;
+ display: none;
+ width: 10em;
+ background: #ffffff;
+ color: #2d2d2d;
+ margin: 0px;
+ padding: 0px;
+ list-style: none;
+ border: 3px solid #364e59;
+ z-index: 100000;
+ -webkit-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
+ -moz-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
+ box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
+}
+ul.menu-popup a {
+ display: block;
+ color: #2d2d2d;
+ padding: 5px 10px;
+ text-decoration: none;
+}
+ul.menu-popup a:hover {
+ background-color: #ccff42;
+}
+ul.menu-popup .menu-sep {
+ border-top: 1px solid #9eabb0;
+}
+ul.menu-popup li {
+ float: none;
+ overflow: auto;
+ height: auto;
+ display: block;
+}
+ul.menu-popup li img {
+ float: left;
+ width: 16px;
+ height: 16px;
+ padding-right: 5px;
+}
+ul.menu-popup .empty {
+ padding: 5px;
+ text-align: center;
+ color: #9eabb0;
+}
+/* autocomplete popup */
+.acpopup {
+ max-height: 150px;
+ background-color: #ffffff;
+ color: #2d2d2d;
+ border: 1px solid #MenuBorder;
+ overflow: auto;
+ z-index: 100000;
+ -webkit-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
+ -moz-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
+ box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
+}
+.acpopupitem {
+ color: #2d2d2d;
+ padding: 4px;
+ clear: left;
+}
+.acpopupitem img {
+ float: left;
+ margin-right: 4px;
+}
+.acpopupitem.selected {
+ background-color: #ccff42;
+}
+#nav-notifications-menu {
+ width: 400px;
+ max-height: 550px;
+ overflow: auto;
+}
+#nav-notifications-menu img {
+ float: left;
+ margin-right: 5px;
+}
+#nav-notifications-menu .contactname {
+ font-weight: bold;
+}
+#nav-notifications-menu .notif-when {
+ font-size: 10px;
+ color: #9eabb0;
+ display: block;
+}
+/* aside */
+aside {
+ display: table-cell;
+ vertical-align: top;
+ width: 200px;
+ padding: 0px 10px 0px 20px;
+ border-right: 1px solid #bdcdd4;
+}
+aside .vcard .fn {
+ font-size: 16px;
+ font-weight: bold;
+ margin-bottom: 5px;
+}
+aside .vcard .title {
+ margin-bottom: 5px;
+}
+aside .vcard dl {
+ height: auto;
+ overflow: auto;
+}
+aside .vcard dt {
+ float: left;
+ margin-left: 0px;
+ width: 35%;
+ text-align: right;
+ color: #999999;
+}
+aside .vcard dd {
+ float: left;
+ margin-left: 4px;
+ width: 60%;
+}
+aside #profile-extra-links ul {
+ padding: 0px;
+ margin: 0px;
+}
+aside #profile-extra-links li {
+ padding: 0px;
+ margin: 0px;
+ list-style: none;
+}
+aside #dfrn-request-link {
+ display: block;
+ -moz-border-radius: 5px 5px 5px 5px;
+ -webkit-border-radius: 5px 5px 5px 5px;
+ border-radius: 5px 5px 5px 5px;
+ color: #ffffff;
+ background: #009100 url('../../../images/connect-bg.png') no-repeat left center;
+ font-weight: bold;
+ text-transform: uppercase;
+ padding: 4px 2px 2px 35px;
+}
+aside #dfrn-request-link:hover {
+ text-decoration: none;
+ background-color: #ccff42;
+}
+aside #profiles-menu {
+ width: 20em;
+}
+#contact-block {
+ overflow: auto;
+ height: auto;
+}
+#contact-block .contact-block-h4 {
+ float: left;
+ margin: 5px 0px;
+}
+#contact-block .allcontact-link {
+ float: right;
+ margin: 5px 0px;
+}
+#contact-block .contact-block-content {
+ clear: both;
+ overflow: auto;
+ height: auto;
+}
+#contact-block .contact-block-link {
+ float: left;
+ margin: 0px 2px 2px 0px;
+}
+#contact-block .contact-block-link img {
+ widht: 48px;
+ height: 58px;
+}
+/* group member */
+#contact-edit-drop-link, .mail-list-delete-wrapper, .group-delete-wrapper {
+ float: right;
+ margin-right: 50px;
+}
+#contact-edit-drop-link .drophide, .mail-list-delete-wrapper .drophide, .group-delete-wrapper .drophide {
+ background-image: url('../../../images/icons/22/delete.png');
+ display: block;
+ width: 22px;
+ height: 22px;
+ opacity: 0.3;
+ position: relative;
+ top: -50px;
+}
+#contact-edit-drop-link .drop, .mail-list-delete-wrapper .drop, .group-delete-wrapper .drop {
+ background-image: url('../../../images/icons/22/delete.png');
+ display: block;
+ width: 22px;
+ height: 22px;
+ position: relative;
+ top: -50px;
+}
+#group-members {
+ margin-top: 20px;
+ padding: 10px;
+ height: 250px;
+ overflow: auto;
+ border: 1px solid #ddd;
+}
+#group-members-end {
+ clear: both;
+}
+#group-all-contacts {
+ padding: 10px;
+ height: 450px;
+ overflow: auto;
+ border: 1px solid #ddd;
+}
+#group-all-contacts-end {
+ clear: both;
+ margin-bottom: 10px;
+}
+.contact-block-div {
+ float: left;
+ width: 52px;
+ height: 52px;
+}
+/* widget */
+.widget {
+ margin-bottom: 2em;
+ /*.action .s10 { width: 10px; overflow: hidden; padding: 0px;}
+ .action .s16 { width: 16px; overflow: hidden; padding: 0px;}*/
+
+}
+.widget h3 {
+ padding: 0px;
+ margin: 2px;
+}
+.widget .action {
+ opacity: 0.1;
+ -webkit-transition: all 0.2s ease-in-out;
+ -moz-transition: all 0.2s ease-in-out;
+ -o-transition: all 0.2s ease-in-out;
+ -ms-transition: all 0.2s ease-in-out;
+ transition: all 0.2s ease-in-out;
+}
+.widget input.action {
+ opacity: 0.5;
+ -webkit-transition: all 0.2s ease-in-out;
+ -moz-transition: all 0.2s ease-in-out;
+ -o-transition: all 0.2s ease-in-out;
+ -ms-transition: all 0.2s ease-in-out;
+ transition: all 0.2s ease-in-out;
+}
+.widget:hover .title .action {
+ opacity: 1;
+ -webkit-transition: all 0.2s ease-in-out;
+ -moz-transition: all 0.2s ease-in-out;
+ -o-transition: all 0.2s ease-in-out;
+ -ms-transition: all 0.2s ease-in-out;
+ transition: all 0.2s ease-in-out;
+}
+.widget .tool:hover .action {
+ opacity: 1;
+ -webkit-transition: all 0.2s ease-in-out;
+ -moz-transition: all 0.2s ease-in-out;
+ -o-transition: all 0.2s ease-in-out;
+ -ms-transition: all 0.2s ease-in-out;
+ transition: all 0.2s ease-in-out;
+}
+.widget .tool:hover .action.ticked {
+ opacity: 1;
+ -webkit-transition: all 0.2s ease-in-out;
+ -moz-transition: all 0.2s ease-in-out;
+ -o-transition: all 0.2s ease-in-out;
+ -ms-transition: all 0.2s ease-in-out;
+ transition: all 0.2s ease-in-out;
+}
+.widget ul {
+ padding: 0px;
+}
+.widget ul li {
+ padding-left: 16px;
+ min-height: 16px;
+ list-style: none;
+}
+.widget .tool.selected {
+ background: url('../../../images/selected.png') no-repeat left center;
+}
+/* widget: search */
+#add-search-popup {
+ width: 200px;
+ top: 18px;
+}
+/* section */
+section {
+ display: table-cell;
+ vertical-align: top;
+ width: 800px;
+ padding: 0px 20px 0px 10px;
+}
+/* wall item */
+.tread-wrapper {
+ background-color: #f6f7f8;
+ position: relative;
+ padding: 10px;
+ margin-bottom: 20px;
+ width: 780px;
+}
+.wall-item-decor {
+ position: absolute;
+ left: 790px;
+ top: -10px;
+ width: 16px;
+}
+.unstarred {
+ display: none;
+}
+.wall-item-container {
+ display: table;
+ width: 780px;
+}
+.wall-item-container .wall-item-item, .wall-item-container .wall-item-bottom {
+ display: table-row;
+}
+.wall-item-container .wall-item-bottom {
+ opacity: 0.5;
+ -webkit-transition: all 0.2s ease-in-out;
+ -moz-transition: all 0.2s ease-in-out;
+ -o-transition: all 0.2s ease-in-out;
+ -ms-transition: all 0.2s ease-in-out;
+ transition: all 0.2s ease-in-out;
+}
+.wall-item-container:hover .wall-item-bottom {
+ opacity: 1;
+ -webkit-transition: all 0.2s ease-in-out;
+ -moz-transition: all 0.2s ease-in-out;
+ -o-transition: all 0.2s ease-in-out;
+ -ms-transition: all 0.2s ease-in-out;
+ transition: all 0.2s ease-in-out;
+}
+.wall-item-container .wall-item-info {
+ display: table-cell;
+ vertical-align: top;
+ text-align: left;
+ width: 60px;
+}
+.wall-item-container .wall-item-location {
+ word-wrap: break-word;
+ width: 50px;
+}
+.wall-item-container .wall-item-content {
+ display: table-cell;
+ font-size: 12px;
+ max-width: 720px;
+ word-wrap: break-word;
+}
+.wall-item-container .wall-item-content img {
+ max-width: 710px;
+}
+.wall-item-container .wall-item-links, .wall-item-container .wall-item-actions {
+ display: table-cell;
+ vertical-align: middle;
+}
+.wall-item-container .wall-item-links .icon, .wall-item-container .wall-item-actions .icon {
+ opacity: 0.5;
+ -webkit-transition: all 0.2s ease-in-out;
+ -moz-transition: all 0.2s ease-in-out;
+ -o-transition: all 0.2s ease-in-out;
+ -ms-transition: all 0.2s ease-in-out;
+ transition: all 0.2s ease-in-out;
+}
+.wall-item-container .wall-item-links .icon:hover, .wall-item-container .wall-item-actions .icon:hover {
+ opacity: 1;
+ -webkit-transition: all 0.2s ease-in-out;
+ -moz-transition: all 0.2s ease-in-out;
+ -o-transition: all 0.2s ease-in-out;
+ -ms-transition: all 0.2s ease-in-out;
+ transition: all 0.2s ease-in-out;
+}
+.wall-item-container .wall-item-ago {
+ padding-right: 40px;
+}
+.wall-item-container .wall-item-name {
+ font-weight: bold;
+}
+.wall-item-container .wall-item-actions-author {
+ float: left;
+ width: 20em;
+ margin-top: 0.5em;
+}
+.wall-item-container .wall-item-actions-social {
+ float: left;
+ margin-top: 0.5em;
+}
+.wall-item-container .wall-item-actions-social a {
+ margin-right: 3em;
+}
+.wall-item-container .wall-item-actions-tools {
+ float: right;
+ width: 15%;
+}
+.wall-item-container .wall-item-actions-tools a {
+ float: right;
+}
+.wall-item-container .wall-item-actions-tools input {
+ float: right;
+}
+.wall-item-container.comment {
+ /*margin-top: 50px;*/
+
+}
+.wall-item-container.comment .contact-photo {
+ width: 32px;
+ height: 32px;
+ margin-left: 16px;
+ /*background: url(../../../images/icons/22/user.png) no-repeat center center;*/
+
+}
+.wall-item-container.comment .contact-photo-menu-button {
+ top: 15px !important;
+ left: 15px !important;
+}
+.wall-item-container.comment .wall-item-links {
+ padding-left: 12px;
+}
+.wall-item-comment-wrapper {
+ margin: 30px 2em 2em 60px;
+}
+.wall-item-comment-wrapper .comment-edit-photo {
+ display: none;
+}
+.wall-item-comment-wrapper textarea {
+ height: 1em;
+ width: 100%;
+ font-size: 10px;
+ color: #999999;
+ border: 1px solid #999999;
+ padding: 0.3em;
+}
+.wall-item-comment-wrapper .comment-edit-text-full {
+ font-size: 14px;
+ height: 4em;
+ color: #2d2d2d;
+ border: 1px solid #2d2d2d;
+}
+.comment-edit-preview {
+ width: 710px;
+ border: 1px solid #2d2d2d;
+ margin-top: 10px;
+}
+.comment-edit-preview .contact-photo {
+ width: 32px;
+ height: 32px;
+ margin-left: 16px;
+ /*background: url(../../../images/icons/22/user.png) no-repeat center center;*/
+
+}
+.comment-edit-preview .contact-photo-menu-button {
+ top: 15px !important;
+ left: 15px !important;
+}
+.comment-edit-preview .wall-item-links {
+ padding-left: 12px;
+}
+.comment-edit-preview .wall-item-container {
+ width: 700px;
+}
+.comment-edit-preview .tread-wrapper {
+ width: 700px;
+ padding: 0;
+ margin: 10px 0;
+}
+.wall-item-tags {
+ padding-top: 5px;
+}
+.tag {
+ background: url("../../../images/tag_b.png") no-repeat center left;
+ color: #ffffff;
+ padding-left: 3px;
+}
+.tag a {
+ padding-right: 8px;
+ background: url("../../../images/tag.png") no-repeat center right;
+ color: #ffffff;
+}
+.wwto {
+ position: absolute !important;
+ width: 25px;
+ height: 25px;
+ background: #FFFFFF;
+ border: 2px solid #364e59;
+ height: 25px;
+ width: 25px;
+ overflow: hidden;
+ padding: 1px;
+ position: absolute !important;
+ top: 40px;
+ left: 30px;
+ -webkit-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7);
+ -moz-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7);
+ box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7);
+}
+.wwto .contact-photo {
+ width: 25px;
+ height: 25px;
+}
+#pause {
+ position: fixed;
+ bottom: 5px;
+ right: 5px;
+}
+/* contacts menu */
+.contact-photo-wrapper {
+ position: relative;
+}
+.contact-photo {
+ width: 48px;
+ height: 48px;
+ overflow: hidden;
+ display: block;
+}
+.contact-photo img {
+ width: 48px;
+ height: 48px;
+}
+.contact-photo-menu-button {
+ display: none;
+ position: absolute;
+ left: -2px;
+ top: 31px;
+}
+.contact-wrapper {
+ float: left;
+ width: 90px;
+ height: 90px;
+ margin-bottom: 15px;
+}
+.contact-wrapper .contact-photo {
+ width: 80px;
+ height: 80px;
+}
+.contact-wrapper .contact-photo img {
+ width: 80px;
+ height: 80px;
+}
+.contact-wrapper .contact-photo-menu-button {
+ left: 0px;
+ top: 63px;
+}
+.directory-item {
+ float: left;
+ width: 200px;
+ height: 200px;
+}
+.directory-item .contact-photo {
+ width: 175px;
+ height: 175px;
+}
+.directory-item .contact-photo img {
+ width: 175px;
+ height: 175px;
+}
+.contact-name {
+ text-align: center;
+ font-weight: bold;
+}
+.contact-details {
+ color: #999999;
+}
+/* editor */
+.jothidden {
+ display: none;
+}
+#jot {
+ width: 100%;
+ margin: 0px 2em 20px 0px;
+}
+#jot .profile-jot-text {
+ height: 1em;
+ width: 99%;
+ font-size: 10px;
+ color: #999999;
+ border: 1px solid #999999;
+ padding: 0.3em;
+}
+#jot #jot-tools {
+ margin: 0px;
+ padding: 0px;
+ height: 40px;
+ overflow: none;
+ width: 800px;
+ background-color: #009100;
+ border-bottom: 2px solid #9eabb0;
+}
+#jot #jot-tools li {
+ list-style: none;
+ float: left;
+ width: 80px;
+ height: 40px;
+ border-bottom: 2px solid #9eabb0;
+}
+#jot #jot-tools li a {
+ display: block;
+ color: #2d2d2d;
+ width: 100%;
+ height: 40px;
+ text-align: center;
+ line-height: 40px;
+ overflow: hidden;
+}
+#jot #jot-tools li:hover {
+ background-color: #9ade00;
+ border-bottom: 2px solid #bdcdd4;
+}
+#jot #jot-tools li.perms {
+ float: right;
+ width: 40px;
+}
+#jot #jot-tools li.perms a.unlock {
+ width: 30px;
+ border-left: 10px solid #cccccc;
+ background-color: #cccccc;
+}
+#jot #jot-tools li.perms a.lock {
+ width: 30px;
+ border-left: 10px solid #666666;
+ background-color: #666666;
+}
+#jot #jot-tools li.submit {
+ float: right;
+ background-color: #cccccc;
+ border-bottom: 2px solid #cccccc;
+ border-right: 1px solid #666666;
+ border-left: 1px solid #666666;
+}
+#jot #jot-tools li.submit input {
+ border: 0px;
+ margin: 0px;
+ padding: 0px;
+ background-color: #cccccc;
+ color: #666666;
+ width: 80px;
+ height: 40px;
+ line-height: 40px;
+}
+#jot #jot-tools li.submit input:hover {
+ background-color: #ccff42;
+ color: #666666;
+}
+#jot #jot-tools li.loading {
+ float: right;
+ background-color: #ffffff;
+ width: 20px;
+ vertical-align: center;
+ text-align: center;
+ border-top: 2px solid #9eabb0;
+ height: 38px;
+}
+#jot #jot-tools li.loading img {
+ margin-top: 10px;
+}
+#jot #jot-title {
+ border: 0px;
+ margin: 0px;
+ height: 20px;
+ width: 700px;
+ font-weight: bold;
+ border: 1px solid #ffffff;
+}
+#jot #jot-title:-webkit-input-placeholder {
+ font-weight: normal;
+}
+#jot #jot-title:-moz-placeholder {
+ font-weight: normal;
+}
+#jot #jot-title:hover {
+ border: 1px solid #999999;
+}
+#jot #jot-title:focus {
+ border: 1px solid #999999;
+}
+#jot #character-counter {
+ width: 80px;
+ float: right;
+ text-align: right;
+ height: 20px;
+ line-height: 20px;
+ padding-right: 20px;
+}
+/** buttons **/
+/*input[type="submit"] {
+ border: 0px;
+ background-color: @ButtonBackgroundColor;
+ color: @ButtonColor;
+ padding: 0px 10px;
+ .rounded(5px);
+ height: 18px;
+}*/
+/** acl **/
+#photo-edit-perms-select, #photos-upload-permissions-wrapper, #profile-jot-acl-wrapper {
+ display: block!important;
+}
+#acl-wrapper {
+ width: 690px;
+ float: left;
+}
+#acl-search {
+ float: right;
+ background: #ffffff url("../../../images/search_18.png") no-repeat right center;
+ padding-right: 20px;
+}
+#acl-showall {
+ float: left;
+ display: block;
+ width: auto;
+ height: 18px;
+ background-color: #cccccc;
+ background-image: url("../../../images/show_all_off.png");
+ background-position: 7px 7px;
+ background-repeat: no-repeat;
+ padding: 7px 5px 0px 30px;
+ color: #999999;
+ -moz-border-radius: 5px 5px 5px 5px;
+ -webkit-border-radius: 5px 5px 5px 5px;
+ border-radius: 5px 5px 5px 5px;
+}
+#acl-showall.selected {
+ color: #000000;
+ background-color: #ff9900;
+ background-image: url("../../../images/show_all_on.png");
+}
+#acl-list {
+ height: 210px;
+ border: 1px solid #cccccc;
+ clear: both;
+ margin-top: 30px;
+ overflow: auto;
+}
+.acl-list-item {
+ display: block;
+ width: 150px;
+ height: 30px;
+ border: 1px solid #cccccc;
+ margin: 5px;
+ float: left;
+}
+.acl-list-item img {
+ width: 22px;
+ height: 22px;
+ float: left;
+ margin: 4px;
+}
+.acl-list-item p {
+ height: 12px;
+ font-size: 10px;
+ margin: 0px;
+ padding: 2px 0px 1px;
+ overflow: hidden;
+}
+.acl-list-item a {
+ font-size: 8px;
+ display: block;
+ width: 40px;
+ height: 10px;
+ float: left;
+ color: #999999;
+ background-color: #cccccc;
+ background-position: 3px 3px;
+ background-repeat: no-repeat;
+ margin-right: 5px;
+ -webkit-border-radius: 2px ;
+ -moz-border-radius: 2px;
+ border-radius: 2px;
+ padding-left: 15px;
+}
+#acl-wrapper a:hover {
+ text-decoration: none;
+ color: #000000;
+}
+.acl-button-show {
+ background-image: url("../../../images/show_off.png");
+}
+.acl-button-hide {
+ background-image: url("../../../images/hide_off.png");
+}
+.acl-button-show.selected {
+ color: #000000;
+ background-color: #9ade00;
+ background-image: url("../../../images/show_on.png");
+}
+.acl-button-hide.selected {
+ color: #000000;
+ background-color: #ff4141;
+ background-image: url("../../../images/hide_on.png");
+}
+.acl-list-item.groupshow {
+ border-color: #9ade00;
+}
+.acl-list-item.grouphide {
+ border-color: #ff4141;
+}
+/** /acl **/
+/** tab buttons **/
+ul.tabs {
+ list-style-type: none;
+ padding-bottom: 10px;
+}
+ul.tabs li {
+ float: left;
+ margin-left: 20px;
+}
+ul.tabs li .active {
+ border-bottom: 1px solid #009100;
+}
+/**
+ * Form fields
+ */
+.field {
+ margin-bottom: 10px;
+ padding-bottom: 10px;
+ overflow: auto;
+ width: 100%;
+}
+.field label {
+ float: left;
+ width: 200px;
+}
+.field input, .field textarea {
+ width: 400px;
+}
+.field textarea {
+ height: 100px;
+}
+.field .field_help {
+ display: block;
+ margin-left: 200px;
+ color: #666666;
+}
+.field .onoff {
+ float: left;
+ width: 80px;
+}
+.field .onoff a {
+ display: block;
+ border: 1px solid #666666;
+ background-image: url("../../../images/onoff.jpg");
+ background-repeat: no-repeat;
+ padding: 4px 2px 2px 2px;
+ height: 16px;
+ text-decoration: none;
+}
+.field .onoff .off {
+ border-color: #666666;
+ padding-left: 40px;
+ background-position: left center;
+ background-color: #cccccc;
+ color: #666666;
+ text-align: right;
+}
+.field .onoff .on {
+ border-color: #204A87;
+ padding-right: 40px;
+ background-position: right center;
+ background-color: #D7E3F1;
+ color: #204A87;
+ text-align: left;
+}
+.field .hidden {
+ display: none!important;
+}
+.field.radio .field_help {
+ margin-left: 0px;
+}
+#profile-edit-links li {
+ list-style: none;
+ margin-top: 10px;
+}
+#profile-edit-default-desc {
+ color: #FF0000;
+ border: 1px solid #FF8888;
+ background-color: #FFEEEE;
+ padding: 7px;
+}
+#profile-edit-profile-name-label,
+#profile-edit-name-label,
+#profile-edit-pdesc-label,
+#profile-edit-gender-label,
+#profile-edit-dob-label,
+#profile-edit-address-label,
+#profile-edit-locality-label,
+#profile-edit-region-label,
+#profile-edit-postal-code-label,
+#profile-edit-country-name-label,
+#profile-edit-marital-label,
+#profile-edit-with-label,
+#profile-edit-sexual-label,
+#profile-edit-politic-label,
+#profile-edit-religion-label,
+#profile-edit-pubkeywords-label,
+#profile-edit-prvkeywords-label,
+#profile-edit-gender-select,
+#profile-edit-homepage-label {
+ float: left;
+ width: 175px;
+ padding-top: 7px;
+}
+#profile-edit-profile-name,
+#profile-edit-name,
+#gender-select,
+#profile-edit-pdesc,
+#profile-edit-gender,
+#profile-edit-dob,
+#profile-edit-address,
+#profile-edit-locality,
+#profile-edit-region,
+#profile-edit-postal-code,
+#profile-edit-country-name,
+#profile-edit-marital,
+#profile-edit-with,
+#profile-edit-sexual,
+#profile-edit-politic,
+#profile-edit-religion,
+#profile-edit-pubkeywords,
+#profile-edit-prvkeywords,
+#profile-edit-homepage {
+ margin-top: 5px;
+}
+/* oauth */
+.oauthapp {
+ height: auto;
+ overflow: auto;
+ border-bottom: 2px solid #cccccc;
+ padding-bottom: 1em;
+ margin-bottom: 1em;
+}
+.oauthapp img {
+ float: left;
+ width: 48px;
+ height: 48px;
+ margin: 10px;
+}
+.oauthapp img.noicon {
+ background-image: url("../../../images/icons/48/plugin.png");
+ background-position: center center;
+ background-repeat: no-repeat;
+}
+.oauthapp a {
+ float: left;
+}
+/* contacts */
+.contact-entry-wrapper {
+ width: 50px;
+ float: left;
+}
+/* photo */
+.lframe {
+ float: left;
+ margin: 0px 10px 10px 0px;
+}
+/* profile match wrapper */
+.profile-match-wrapper {
+ float: left;
+ width: 90px;
+ height: 90px;
+ margin-bottom: 20px;
+}
+.profile-match-wrapper .contact-photo {
+ width: 80px;
+ height: 80px;
+}
+.profile-match-wrapper .contact-photo img {
+ width: 80px;
+ height: 80px;
+}
+.profile-match-wrapper .contact-photo-menu-button {
+ left: 0px;
+ top: 63px;
+}
+/* page footer */
+footer {
+ height: 100px;
+ display: table-row;
+}
+.pager {
+ margin-top: 25px;
+ clear: both;
+}
diff --git a/view/theme/quattro-green/style.less b/view/theme/quattro-green/style.less
new file mode 100755
index 000000000..f8b0bb31c
--- /dev/null
+++ b/view/theme/quattro-green/style.less
@@ -0,0 +1,14 @@
+/**
+ * Fabio Comuni <http://kirgroup.com/profile/fabrixxm>
+ **/
+// Less file http://lesscss.org/
+// compile with lessc
+// $ lessc style.less > style.css
+
+@import "colors";
+@import "../quattro/icons";
+@import "../quattro/quattro";
+
+
+
+
diff --git a/view/theme/quattro/icons.less b/view/theme/quattro/icons.less
index f87327703..e314fba1f 100755
--- a/view/theme/quattro/icons.less
+++ b/view/theme/quattro/icons.less
@@ -13,6 +13,11 @@
&.link { background-image: url("../../../images/icons/@{size}/link.png"); }
&.lock { background-image: url("../../../images/icons/@{size}/lock.png"); }
&.unlock { background-image: url("../../../images/icons/@{size}/unlock.png"); }
+ &.type-unkn { background-image: url("../../../images/icons/@{size}/zip.png"); }
+ &.type-audio{ background-image: url("../../../images/icons/@{size}/audio.png"); }
+ &.type-video{ background-image: url("../../../images/icons/@{size}/video.png"); }
+ &.type-image{ background-image: url("../../../images/icons/@{size}/image.png"); }
+ &.type-text { background-image: url("../../../images/icons/@{size}/text.png"); }
}
diff --git a/view/theme/quattro/quattro.less b/view/theme/quattro/quattro.less
index 8fcf7f817..ac84e0eff 100755
--- a/view/theme/quattro/quattro.less
+++ b/view/theme/quattro/quattro.less
@@ -318,7 +318,51 @@ aside {
}
}
-
+/* group member */
+#contact-edit-drop-link,
+.mail-list-delete-wrapper,
+.group-delete-wrapper {
+ float: right;
+ margin-right: 50px;
+ .drophide {
+ background-image: url('../../../images/icons/22/delete.png');
+ display: block; width: 22px; height: 22px;
+ opacity: 0.3;
+ position: relative;
+ top: -50px;
+ }
+ .drop {
+ background-image: url('../../../images/icons/22/delete.png');
+ display: block; width: 22px; height: 22px;
+ position: relative;
+ top: -50px;
+ }
+}
+#group-members {
+ margin-top: 20px;
+ padding: 10px;
+ height: 250px;
+ overflow: auto;
+ border: 1px solid #ddd;
+}
+#group-members-end {
+ clear: both;
+}
+#group-all-contacts {
+ padding: 10px;
+ height: 450px;
+ overflow: auto;
+ border: 1px solid #ddd;
+}
+#group-all-contacts-end {
+ clear: both;
+ margin-bottom: 10px;
+}
+.contact-block-div {
+ float: left;
+ width: 52px;
+ height: 52px;
+}
/* widget */
.widget {
margin-bottom: 2em;
@@ -503,6 +547,13 @@ section {
}
.wwto .contact-photo { width: 25px; height: 25px; }
+
+#pause {
+ position: fixed;
+ bottom: 5px;
+ right: 5px;
+}
+
/* contacts menu */
.contact-photo-wrapper { position: relative; }
.contact-photo {
@@ -852,6 +903,58 @@ ul.tabs {
#profile-edit-links li {
list-style: none;
+ margin-top: 10px;
+}
+
+#profile-edit-default-desc {
+ color: #FF0000;
+ border: 1px solid #FF8888;
+ background-color: #FFEEEE;
+ padding: 7px;
+}
+#profile-edit-profile-name-label,
+#profile-edit-name-label,
+#profile-edit-pdesc-label,
+#profile-edit-gender-label,
+#profile-edit-dob-label,
+#profile-edit-address-label,
+#profile-edit-locality-label,
+#profile-edit-region-label,
+#profile-edit-postal-code-label,
+#profile-edit-country-name-label,
+#profile-edit-marital-label,
+#profile-edit-with-label,
+#profile-edit-sexual-label,
+#profile-edit-politic-label,
+#profile-edit-religion-label,
+#profile-edit-pubkeywords-label,
+#profile-edit-prvkeywords-label,
+#profile-edit-gender-select,
+#profile-edit-homepage-label {
+ float: left;
+ width: 175px;
+ padding-top: 7px;
+}
+#profile-edit-profile-name,
+#profile-edit-name,
+#gender-select,
+#profile-edit-pdesc,
+#profile-edit-gender,
+#profile-edit-dob,
+#profile-edit-address,
+#profile-edit-locality,
+#profile-edit-region,
+#profile-edit-postal-code,
+#profile-edit-country-name,
+#profile-edit-marital,
+#profile-edit-with,
+#profile-edit-sexual,
+#profile-edit-politic,
+#profile-edit-religion,
+#profile-edit-pubkeywords,
+#profile-edit-prvkeywords,
+#profile-edit-homepage {
+ margin-top: 5px;
}
/* oauth */
@@ -910,3 +1013,4 @@ footer { height: 100px; display: table-row; }
margin-top: 25px;
clear: both;
}
+
diff --git a/view/theme/quattro/style.css b/view/theme/quattro/style.css
index 3f90f8915..4c24ade8e 100755
--- a/view/theme/quattro/style.css
+++ b/view/theme/quattro/style.css
@@ -48,6 +48,21 @@
.icon.s10.unlock {
background-image: url("../../../images/icons/10/unlock.png");
}
+.icon.s10.type-unkn {
+ background-image: url("../../../images/icons/10/zip.png");
+}
+.icon.s10.type-audio {
+ background-image: url("../../../images/icons/10/audio.png");
+}
+.icon.s10.type-video {
+ background-image: url("../../../images/icons/10/video.png");
+}
+.icon.s10.type-image {
+ background-image: url("../../../images/icons/10/image.png");
+}
+.icon.s10.type-text {
+ background-image: url("../../../images/icons/10/text.png");
+}
.icon.s10.text {
padding: 2px 0px 0px 15px;
}
@@ -85,6 +100,21 @@
.icon.s16.unlock {
background-image: url("../../../images/icons/16/unlock.png");
}
+.icon.s16.type-unkn {
+ background-image: url("../../../images/icons/16/zip.png");
+}
+.icon.s16.type-audio {
+ background-image: url("../../../images/icons/16/audio.png");
+}
+.icon.s16.type-video {
+ background-image: url("../../../images/icons/16/video.png");
+}
+.icon.s16.type-image {
+ background-image: url("../../../images/icons/16/image.png");
+}
+.icon.s16.type-text {
+ background-image: url("../../../images/icons/16/text.png");
+}
.icon.s16.text {
padding: 4px 0px 0px 20px;
}
@@ -122,6 +152,21 @@
.icon.s22.unlock {
background-image: url("../../../images/icons/22/unlock.png");
}
+.icon.s22.type-unkn {
+ background-image: url("../../../images/icons/22/zip.png");
+}
+.icon.s22.type-audio {
+ background-image: url("../../../images/icons/22/audio.png");
+}
+.icon.s22.type-video {
+ background-image: url("../../../images/icons/22/video.png");
+}
+.icon.s22.type-image {
+ background-image: url("../../../images/icons/22/image.png");
+}
+.icon.s22.type-text {
+ background-image: url("../../../images/icons/22/text.png");
+}
.icon.s22.text {
padding: 10px 0px 0px 25px;
}
@@ -159,6 +204,21 @@
.icon.s48.unlock {
background-image: url("../../../images/icons/48/unlock.png");
}
+.icon.s48.type-unkn {
+ background-image: url("../../../images/icons/48/zip.png");
+}
+.icon.s48.type-audio {
+ background-image: url("../../../images/icons/48/audio.png");
+}
+.icon.s48.type-video {
+ background-image: url("../../../images/icons/48/video.png");
+}
+.icon.s48.type-image {
+ background-image: url("../../../images/icons/48/image.png");
+}
+.icon.s48.type-text {
+ background-image: url("../../../images/icons/48/text.png");
+}
/* global */
body {
font-family: Liberation Sans, helvetica, arial, clean, sans-serif;
@@ -564,6 +624,53 @@ aside #profiles-menu {
widht: 48px;
height: 58px;
}
+/* group member */
+#contact-edit-drop-link, .mail-list-delete-wrapper, .group-delete-wrapper {
+ float: right;
+ margin-right: 50px;
+}
+#contact-edit-drop-link .drophide, .mail-list-delete-wrapper .drophide, .group-delete-wrapper .drophide {
+ background-image: url('../../../images/icons/22/delete.png');
+ display: block;
+ width: 22px;
+ height: 22px;
+ opacity: 0.3;
+ position: relative;
+ top: -50px;
+}
+#contact-edit-drop-link .drop, .mail-list-delete-wrapper .drop, .group-delete-wrapper .drop {
+ background-image: url('../../../images/icons/22/delete.png');
+ display: block;
+ width: 22px;
+ height: 22px;
+ position: relative;
+ top: -50px;
+}
+#group-members {
+ margin-top: 20px;
+ padding: 10px;
+ height: 250px;
+ overflow: auto;
+ border: 1px solid #ddd;
+}
+#group-members-end {
+ clear: both;
+}
+#group-all-contacts {
+ padding: 10px;
+ height: 450px;
+ overflow: auto;
+ border: 1px solid #ddd;
+}
+#group-all-contacts-end {
+ clear: both;
+ margin-bottom: 10px;
+}
+.contact-block-div {
+ float: left;
+ width: 52px;
+ height: 52px;
+}
/* widget */
.widget {
margin-bottom: 2em;
@@ -844,6 +951,11 @@ section {
width: 25px;
height: 25px;
}
+#pause {
+ position: fixed;
+ bottom: 5px;
+ right: 5px;
+}
/* contacts menu */
.contact-photo-wrapper {
position: relative;
@@ -1208,6 +1320,57 @@ ul.tabs li .active {
}
#profile-edit-links li {
list-style: none;
+ margin-top: 10px;
+}
+#profile-edit-default-desc {
+ color: #FF0000;
+ border: 1px solid #FF8888;
+ background-color: #FFEEEE;
+ padding: 7px;
+}
+#profile-edit-profile-name-label,
+#profile-edit-name-label,
+#profile-edit-pdesc-label,
+#profile-edit-gender-label,
+#profile-edit-dob-label,
+#profile-edit-address-label,
+#profile-edit-locality-label,
+#profile-edit-region-label,
+#profile-edit-postal-code-label,
+#profile-edit-country-name-label,
+#profile-edit-marital-label,
+#profile-edit-with-label,
+#profile-edit-sexual-label,
+#profile-edit-politic-label,
+#profile-edit-religion-label,
+#profile-edit-pubkeywords-label,
+#profile-edit-prvkeywords-label,
+#profile-edit-gender-select,
+#profile-edit-homepage-label {
+ float: left;
+ width: 175px;
+ padding-top: 7px;
+}
+#profile-edit-profile-name,
+#profile-edit-name,
+#gender-select,
+#profile-edit-pdesc,
+#profile-edit-gender,
+#profile-edit-dob,
+#profile-edit-address,
+#profile-edit-locality,
+#profile-edit-region,
+#profile-edit-postal-code,
+#profile-edit-country-name,
+#profile-edit-marital,
+#profile-edit-with,
+#profile-edit-sexual,
+#profile-edit-politic,
+#profile-edit-religion,
+#profile-edit-pubkeywords,
+#profile-edit-prvkeywords,
+#profile-edit-homepage {
+ margin-top: 5px;
}
/* oauth */
.oauthapp {
diff --git a/view/theme/testbubble/comment_item.tpl b/view/theme/testbubble/comment_item.tpl
index cad572f4e..bc75eb1a6 100755
--- a/view/theme/testbubble/comment_item.tpl
+++ b/view/theme/testbubble/comment_item.tpl
@@ -11,6 +11,13 @@
<a class="comment-edit-photo-link" href="$mylink" title="$mytitle"><img class="my-comment-photo" src="$myphoto" alt="$mytitle" title="$mytitle" /></a>
</div>
<div class="comment-edit-photo-end"></div>
+ {{ if $qcomment }}
+ {{ for $qcomment as $qc }}
+ <span class="fakelink qcomment" onclick="commentInsert(this,$id); return false;" >$qc</span>
+ &nbsp;
+ {{ endfor }}
+ {{ endif }}
+
<textarea id="comment-edit-text-$id" class="comment-edit-text-empty" name="body" onFocus="commentOpen(this,$id);" onBlur="commentClose(this,$id);" >$comment</textarea>
<div class="comment-edit-text-end"></div>
diff --git a/view/theme/testbubble/jot-header.tpl b/view/theme/testbubble/jot-header.tpl
index 0d9a824f7..b44ea78fd 100755
--- a/view/theme/testbubble/jot-header.tpl
+++ b/view/theme/testbubble/jot-header.tpl
@@ -4,10 +4,38 @@
var editor=false;
var textlen = 0;
+var plaintext = '$editselect';
function initEditor(cb) {
if (editor==false) {
$("#profile-jot-text-loading").show();
+ if(plaintext == 'none') {
+ $("#profile-jot-text-loading").hide();
+ $("#profile-jot-text").css({ 'height': 200, 'color': '#000' });
+ $(".jothidden").show();
+ editor = true;
+ $("a#jot-perms-icon").fancybox({
+ 'transitionIn' : 'elastic',
+ 'transitionOut' : 'elastic'
+ });
+ $("#profile-jot-submit-wrapper").show();
+ {{ if $newpost }}
+ $("#profile-upload-wrapper").show();
+ $("#profile-attach-wrapper").show();
+ $("#profile-link-wrapper").show();
+ $("#profile-video-wrapper").show();
+ $("#profile-audio-wrapper").show();
+ $("#profile-location-wrapper").show();
+ $("#profile-nolocation-wrapper").show();
+ $("#profile-title-wrapper").show();
+ $("#profile-jot-plugin-wrapper").show();
+ $("#jot-preview-link").show();
+ {{ endif }}
+
+
+ if (typeof cb!="undefined") cb();
+ return;
+ }
tinyMCE.init({
theme : "advanced",
mode : "specific_textareas",
@@ -132,7 +160,7 @@ function initEditor(cb) {
name: 'userfile',
onSubmit: function(file,ext) { $('#profile-rotator').show(); },
onComplete: function(file,response) {
- tinyMCE.execCommand('mceInsertRawHTML',false,response);
+ addeditortext(response);
$('#profile-rotator').hide();
}
}
@@ -143,7 +171,7 @@ function initEditor(cb) {
name: 'userfile',
onSubmit: function(file,ext) { $('#profile-rotator').show(); },
onComplete: function(file,response) {
- tinyMCE.execCommand('mceInsertRawHTML',false,response);
+ addeditortext(response);
$('#profile-rotator').hide();
}
}
@@ -190,7 +218,7 @@ function initEditor(cb) {
reply = bin2hex(reply);
$('#profile-rotator').show();
$.get('parse_url?binurl=' + reply, function(data) {
- tinyMCE.execCommand('mceInsertRawHTML',false,data);
+ addeditortext(data);
$('#profile-rotator').hide();
});
}
@@ -199,14 +227,14 @@ function initEditor(cb) {
function jotVideoURL() {
reply = prompt("$vidurl");
if(reply && reply.length) {
- tinyMCE.execCommand('mceInsertRawHTML',false,'[video]' + reply + '[/video]');
+ addeditortext('[video]' + reply + '[/video]');
}
}
function jotAudioURL() {
reply = prompt("$audurl");
if(reply && reply.length) {
- tinyMCE.execCommand('mceInsertRawHTML',false,'[audio]' + reply + '[/audio]');
+ addeditortext('[audio]' + reply + '[/audio]');
}
}
@@ -230,7 +258,7 @@ function initEditor(cb) {
$.get('share/' + id, function(data) {
if (!editor) $("#profile-jot-text").val("");
initEditor(function(){
- tinyMCE.execCommand('mceInsertRawHTML',false,data);
+ addeditortext(data);
$('#like-rotator-' + id).hide();
$(window).scrollTop(0);
});
@@ -253,7 +281,7 @@ function initEditor(cb) {
$.get('parse_url?binurl=' + reply, function(data) {
if (!editor) $("#profile-jot-text").val("");
initEditor(function(){
- tinyMCE.execCommand('mceInsertRawHTML',false,data);
+ addeditortext(data);
$('#profile-rotator').hide();
});
});
@@ -282,6 +310,16 @@ function initEditor(cb) {
$('#profile-nolocation-wrapper').hide();
}
+ function addeditortext(data) {
+ if(plaintext == 'none') {
+ var currentText = $("#profile-jot-text").val();
+ $("#profile-jot-text").val(currentText + data);
+ }
+ else
+ tinyMCE.execCommand('mceInsertRawHTML',false,data);
+ }
+
+
$geotag
</script>
diff --git a/view/theme/testbubble/jot.tpl b/view/theme/testbubble/jot.tpl
index e2fd7132a..5bb5b4673 100755
--- a/view/theme/testbubble/jot.tpl
+++ b/view/theme/testbubble/jot.tpl
@@ -20,7 +20,6 @@
<img id="profile-jot-text-loading" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
<textarea rows="5" cols="64" class="profile-jot-text" id="profile-jot-text" name="body" >{{ if $content }}$content{{ else }}$share{{ endif }}</textarea>
- {{ if $content }}<script>initEditor();</script>{{ endif }}
<div id="profile-upload-wrapper" class="jot-tool" style="display: none;" >
<div id="wall-image-upload-div" ><a onclick="return false;" id="wall-image-upload" class="icon border camera" title="$upload"></a></div>
@@ -72,3 +71,4 @@
<div id="profile-jot-end"></div>
</form>
</div>
+ {{ if $content }}<script>initEditor();</script>{{ endif }}
diff --git a/view/theme/testbubble/style.css b/view/theme/testbubble/style.css
index 118fc2e7c..fcb7bea7a 100755
--- a/view/theme/testbubble/style.css
+++ b/view/theme/testbubble/style.css
@@ -3259,3 +3259,12 @@ ul.menu-popup {
background-color:#b20202;
order-bottom: none;
}
+
+.qcomment {
+ opacity: 0;
+ filter:alpha(opacity=0);
+}
+.qcomment:hover {
+ opacity: 1.0;
+ filter:alpha(opacity=100);
+}
diff --git a/view/theme/testbubble/wall_item.tpl b/view/theme/testbubble/wall_item.tpl
index 4fe819f4b..2b0e6740a 100755
--- a/view/theme/testbubble/wall_item.tpl
+++ b/view/theme/testbubble/wall_item.tpl
@@ -39,7 +39,7 @@
<div class="wall-item-like-buttons" id="wall-item-like-buttons-$id">
<a href="#" class="icon like" title="$vote.like.0" onclick="dolike($id,'like'); return false"></a>
<a href="#" class="icon dislike" title="$vote.dislike.0" onclick="dolike($id,'dislike'); return false"></a>
- {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title=""$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
+ {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title="$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
<img id="like-rotator-$id" class="like-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
</div>
{{ endif }}
diff --git a/view/theme/testbubble/wallwall_item.tpl b/view/theme/testbubble/wallwall_item.tpl
index 015e62f3e..cd4def7fc 100755
--- a/view/theme/testbubble/wallwall_item.tpl
+++ b/view/theme/testbubble/wallwall_item.tpl
@@ -26,12 +26,23 @@
{{ if $lock }}<div class="wall-item-lock"><img src="images/lock_icon.gif" class="lockview" alt="$lock" onclick="lockview(event,$id);" /></div>
{{ else }}<div class="wall-item-lock"></div>{{ endif }}
</div>
+ <div class="wall-item-content" id="wall-item-content-$id" >
+ <div class="wall-item-title" id="wall-item-title-$id">$title</div>
+ <div class="wall-item-title-end"></div>
+ <div class="wall-item-body" id="wall-item-body-$id" >$body
+ <div class="body-tag">
+ {{ for $tags as $tag }}
+ <span class='tag'>$tag</span>
+ {{ endfor }}
+ </div>
+ </div>
+ </div>
<div class="wall-item-tools" id="wall-item-tools-$id">
{{ if $vote }}
<div class="wall-item-like-buttons" id="wall-item-like-buttons-$id">
<a href="#" class="icon like" title="$vote.like.0" onclick="dolike($id,'like'); return false"></a>
<a href="#" class="icon dislike" title="$vote.dislike.0" onclick="dolike($id,'dislike'); return false"></a>
- {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title=""$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
+ {{ if $vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title="$vote.share.0" onclick="jotShare($id); return false"></a>{{ endif }}
<img id="like-rotator-$id" class="like-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
</div>
{{ endif }}
@@ -53,17 +64,6 @@
{{ if $drop.dropping }}<input type="checkbox" onclick="checkboxhighlight(this);" title="$drop.select" class="item-select" name="itemselected[]" value="$id" />{{ endif }}
<div class="wall-item-delete-end"></div>
</div>
- <div class="wall-item-content" id="wall-item-content-$id" >
- <div class="wall-item-title" id="wall-item-title-$id">$title</div>
- <div class="wall-item-title-end"></div>
- <div class="wall-item-body" id="wall-item-body-$id" >$body
- <div class="body-tag">
- {{ for $tags as $tag }}
- <span class='tag'>$tag</span>
- {{ endfor }}
- </div>
- </div>
- </div>
<div class="wall-item-author">
<a href="$profile_url" title="$linktitle" class="wall-item-name-link"><span class="wall-item-name$sparkle" id="wall-item-name-$id" >$name</span></a>
<div class="wall-item-ago" id="wall-item-ago-$id">$ago</div>
diff --git a/view/theme/vier/style.css b/view/theme/vier/style.css
index a9ff22f78..d4084c05d 100644
--- a/view/theme/vier/style.css
+++ b/view/theme/vier/style.css
@@ -200,9 +200,15 @@
.icon.s16.delete {
background-image: url("../../../images/icons/16/delete.png");
}
+<<<<<<< HEAD
/*.icon.s16.edit {
background-image: url("../../../images/icons/16/edit.png");
}*/
+=======
+.icon.s16.edit {
+ background-image: url("../../../images/icons/16/edit.png");
+}
+>>>>>>> upstream/master
.icon.s16.star {
background-image: url("../../../images/icons/16/star.png");
}
@@ -913,7 +919,11 @@ section {
}
.wall-item-container .wall-item-actions-tools {
float: right;
+<<<<<<< HEAD
width: 80px;
+=======
+ width: 60px;
+>>>>>>> upstream/master
}
.wall-item-container .wall-item-actions-tools a {
float: right;
@@ -1028,6 +1038,7 @@ section {
/* contacts menu */
.contact-photo-wrapper {
position: relative;
+<<<<<<< HEAD
width: 80px;
}
@@ -1035,6 +1046,9 @@ section {
width: 25px;
}
+=======
+}
+>>>>>>> upstream/master
.contact-photo {
width: 48px;
height: 48px;
@@ -1396,6 +1410,7 @@ ul.tabs li .active {
.field.radio .field_help {
margin-left: 0px;
}
+<<<<<<< HEAD
#profile-edit-links-end {
clear: both;
@@ -1424,6 +1439,11 @@ ul.tabs li .active {
color: #B20202;
}
+=======
+#profile-edit-links li {
+ list-style: none;
+}
+>>>>>>> upstream/master
/* oauth */
.oauthapp {
height: auto;
@@ -1480,6 +1500,7 @@ footer {
height: 100px;
display: table-row;
}
+<<<<<<< HEAD
blockquote {
border-left: 1px solid #D2D2D2;
@@ -1515,3 +1536,5 @@ blockquote {
#group-separator,
#prof-separator { display: none;}
*/
+=======
+>>>>>>> upstream/master