Merge remote branch 'upstream/master'

Conflicts:
	view/theme/vier/style.css
This commit is contained in:
Michael 2012-02-19 20:09:42 +01:00
commit cafd400352
161 changed files with 23434 additions and 8142 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

BIN
images/beer_mug.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

BIN
images/coffee.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 231 B

BIN
images/icons/10/audio.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 470 B

BIN
images/icons/10/image.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 455 B

BIN
images/icons/10/text.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 435 B

BIN
images/icons/10/video.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 454 B

BIN
images/icons/10/zip.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 468 B

BIN
images/icons/16/audio.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 599 B

BIN
images/icons/16/image.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 667 B

BIN
images/icons/16/text.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 503 B

BIN
images/icons/16/video.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 527 B

BIN
images/icons/16/zip.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 623 B

BIN
images/icons/22/audio.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 713 B

BIN
images/icons/22/image.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 916 B

BIN
images/icons/22/text.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 583 B

BIN
images/icons/22/video.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 616 B

BIN
images/icons/22/zip.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 785 B

BIN
images/icons/48/audio.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
images/icons/48/image.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
images/icons/48/text.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 972 B

BIN
images/icons/48/video.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1,022 B

BIN
images/icons/48/zip.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

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

BIN
images/icons/audio.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

BIN
images/icons/image.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
images/icons/text.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6 KiB

BIN
images/icons/video.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6 KiB

BIN
images/icons/zip.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 885 B

BIN
images/smiley-facepalm.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 582 B

View file

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

View file

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

View file

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

View file

@ -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 centered text
$Text = preg_replace("(\[center\](.*?)\[\/center\])ism","<div style=\"text-align:center;\">$1</div>",$Text);
// Check for list text
if(stristr($Text,'[/list]'))
$Text = str_replace("[*]", "<li>", $Text);
if(stristr($Text,'[/list]'))
$Text = str_replace("[*]", "<li>", $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))

View file

@ -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');
$plaintext = false;
if(local_user() && intval(get_pconfig(local_user(),'system','plaintext')))
$plaintext = true;
$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')
));
$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')
));
$tpl = get_markup_template("jot.tpl");
$tpl = get_markup_template("jot.tpl");
$jotplugins = '';
$jotnets = '';
$jotplugins = '';
$jotnets = '';
$mail_disabled = ((function_exists('imap_open') && (! get_config('system','imap_disabled'))) ? 0 : 1);
$mail_disabled = ((function_exists('imap_open') && (! get_config('system','imap_disabled'))) ? 0 : 1);
$mail_enabled = false;
$pubmail_enabled = false;
$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(($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);
call_hooks('jot_tool', $jotplugins);
call_hooks('jot_networks', $jotnets);
if($notes_cid)
$jotnets .= '<input type="hidden" name="contact_allow[]" value="' . $notes_cid .'" />';
if($notes_cid)
$jotnets .= '<input type="hidden" name="contact_allow[]" value="' . $notes_cid .'" />';
$tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins));
$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'),
));
$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'),
));
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;
}

View file

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

View file

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

View file

@ -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'],

View file

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

View file

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

View file

@ -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()),

View file

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

View file

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

View file

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

View file

@ -56,25 +56,29 @@ function reload_plugins() {
if(count($parr)) {
foreach($parr as $pl) {
$pl = trim($pl);
$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();
$fname = 'addon/' . $pl . '/' . $pl . '.php';
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'])
);
}
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'])
);
}
}
}

View file

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

View file

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

View file

@ -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);
);
call_hooks('smilie', $s);
$params = array('texts' => $texts, 'icons' => $icons, 'string' => $s);
call_hooks('smilie', $params);
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;
}}

View file

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

View file

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

View file

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

View file

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

View file

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

114
library/fullcalendar/fullcalendar.min.js vendored Normal file
View file

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

View file

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

View file

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

View file

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

12
library/spam/README Normal file
View file

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

503
library/spam/b8/b8.php Normal file
View file

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

503
library/spam/b8/b8.php.ORIG Normal file
View file

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

View file

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

View file

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

View file

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

View file

@ -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();
}
}
?>

View file

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

View file

@ -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();
}
}
}
?>

View file

@ -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();
}
}
}
?>

504
library/spam/doc/COPYING Normal file
View file

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

179
library/spam/doc/ChangeLog Normal file
View file

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

707
library/spam/doc/readme.htm Normal file
View file

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

371
library/spam/doc/readme.rst Normal file
View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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'),

View file

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

View file

@ -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;
if(($a->argc == 2) && ($a->argv[1] === 'all'))
$_SESSION['return_url'] = $a->query_string;
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'])) : '');
$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
$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));
));
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']),

View file

@ -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...
if(isset($new_relation) && $new_relation == CONTACT_IS_FRIEND) {
$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($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)) {
require_once('include/items.php');
$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;
$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;
$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['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");
$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.

View file

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

View file

@ -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'],

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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'),

View file

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

View file

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

View file

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

View file

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

View file

@ -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;
}
if($r[0]['duplex'] && $r[0]['dfrn-id']) {
$orig_id = $r[0]['dfrn-id'];
$dfrn_id = '0:' . $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 );
}
$sec = random_string();
if(local_user())
$handle = $a->user['nickname'] . '@' . substr($a->get_baseurl(),strpos($a->get_baseurl(),'://')+3);
if(remote_user())
$handle = $_SESSION['handle'];
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)
);
if($url) {
$url = str_replace('{zid}','&zid=' . $handle,$url);
goaway($url);
}
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());
}

View file

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

View file

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

View file

@ -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'),

3
mod/smilies.php Executable file
View file

@ -0,0 +1,3 @@
<?php
function smilies_content(&$a) { return smilies('',true); }

View file

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

View file

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

View file

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

8
util/fpostit/README Normal file
View file

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

11
util/fpostit/fpostit.js Normal file
View file

@ -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()
}
})()

129
util/fpostit/fpostit.php Normal file
View file

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

@ -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,98 +17,2108 @@ 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."
#: ../../mod/oexchange.php:27
msgid "Post successful."
msgstr ""
#: ../../mod/allfriends.php:34
#, php-format
msgid "Friends of %s"
msgstr ""
#: ../../mod/allfriends.php:40
msgid "No friends to display."
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
#: ../../mod/crepair.php:102
msgid "Contact settings applied."
msgstr ""
#: ../../mod/crepair.php:104
msgid "Contact update failed."
msgstr ""
#: ../../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/crepair.php:129 ../../mod/fsuggest.php:20
#: ../../mod/fsuggest.php:92 ../../mod/dfrn_confirm.php:118
msgid "Contact not found."
msgstr ""
#: ../../mod/crepair.php:135
msgid "Repair Contact Settings"
msgstr ""
#: ../../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/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/crepair.php:144
msgid "Return to contact editor"
msgstr ""
#: ../../mod/crepair.php:148 ../../mod/settings.php:455
#: ../../mod/settings.php:481 ../../mod/admin.php:464 ../../mod/admin.php:473
msgid "Name"
msgstr ""
#: ../../mod/crepair.php:149
msgid "Account Nickname"
msgstr ""
#: ../../mod/crepair.php:150
msgid "@Tagname - overrides Name/Nickname"
msgstr ""
#: ../../mod/crepair.php:151
msgid "Account URL"
msgstr ""
#: ../../mod/crepair.php:152
msgid "Friend Request URL"
msgstr ""
#: ../../mod/crepair.php:153
msgid "Friend Confirm URL"
msgstr ""
#: ../../mod/crepair.php:154
msgid "Notification Endpoint URL"
msgstr ""
#: ../../mod/crepair.php:155
msgid "Poll/Feed URL"
msgstr ""
#: ../../mod/crepair.php:156
msgid "New photo from this URL"
msgstr ""
#: ../../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/help.php:30
msgid "Help:"
msgstr ""
#: ../../mod/help.php:34 ../../include/nav.php:82
msgid "Help"
msgstr ""
#: ../../mod/help.php:38 ../../index.php:221
msgid "Not Found"
msgstr ""
#: ../../mod/help.php:41 ../../index.php:224
msgid "Page not found."
msgstr ""
#: ../../mod/wall_attach.php:57
#, php-format
msgid "File exceeds size limit of %d"
msgstr ""
#: ../../mod/wall_attach.php:85 ../../mod/wall_attach.php:96
msgid "File upload failed."
msgstr ""
#: ../../mod/fsuggest.php:63
msgid "Friend suggestion sent."
msgstr ""
#: ../../mod/fsuggest.php:97
msgid "Suggest Friends"
msgstr ""
#: ../../mod/fsuggest.php:99
#, php-format
msgid "Suggest a friend for %s"
msgstr ""
#: ../../mod/events.php:61
msgid "Event description and start time are required."
msgstr ""
#: ../../mod/events.php:117 ../../include/nav.php:50 ../../boot.php:1345
msgid "Events"
msgstr ""
#: ../../mod/events.php:207
msgid "Create New Event"
msgstr ""
#: ../../mod/events.php:210
msgid "Previous"
msgstr ""
#: ../../mod/events.php:213 ../../mod/install.php:210
msgid "Next"
msgstr ""
#: ../../mod/events.php:220
msgid "l, F j"
msgstr ""
#: ../../mod/events.php:235
msgid "Edit event"
msgstr ""
#: ../../mod/events.php:237 ../../include/text.php:883
msgid "link to source"
msgstr ""
#: ../../mod/events.php:305
msgid "hour:minute"
msgstr ""
#: ../../mod/events.php:314
msgid "Event details"
msgstr ""
#: ../../mod/events.php:315
#, php-format
msgid "Format is %s %s. Starting date and Description are required."
msgstr ""
#: ../../mod/events.php:316
msgid "Event Starts:"
msgstr ""
#: ../../mod/events.php:319
msgid "Finish date/time is not known or not relevant"
msgstr ""
#: ../../mod/events.php:321
msgid "Event Finishes:"
msgstr ""
#: ../../mod/events.php:324
msgid "Adjust for viewer timezone"
msgstr ""
#: ../../mod/events.php:326
msgid "Description:"
msgstr ""
#: ../../mod/events.php:328 ../../include/event.php:37
#: ../../include/bb2diaspora.php:271 ../../boot.php:976
msgid "Location:"
msgstr ""
#: ../../mod/events.php:330
msgid "Share this event"
msgstr ""
#: ../../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/tagrm.php:41
msgid "Tag removed"
msgstr ""
#: ../../mod/tagrm.php:79
msgid "Remove Item Tag"
msgstr ""
#: ../../mod/tagrm.php:81
msgid "Select a tag to remove: "
msgstr ""
#: ../../mod/tagrm.php:93 ../../mod/delegate.php:130
msgid "Remove"
msgstr ""
#: ../../mod/dfrn_poll.php:91 ../../mod/dfrn_poll.php:517
#, php-format
msgid "%s welcomes %s"
msgstr ""
#: ../../mod/api.php:76 ../../mod/api.php:102
msgid "Authorize application connection"
msgstr ""
#: ../../mod/api.php:77
msgid "Return to your app and insert this Securty Code:"
msgstr ""
#: ../../mod/api.php:89
msgid "Please login to continue."
msgstr ""
#: ../../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/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/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/photos.php:42
msgid "Photo Albums"
msgstr ""
#: ../../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/photos.php:57 ../../mod/photos.php:975 ../../mod/photos.php:1413
msgid "Upload New Photos"
msgstr ""
#: ../../mod/photos.php:68 ../../mod/settings.php:11
msgid "everybody"
msgstr ""
#: ../../mod/photos.php:139
msgid "Contact information unavailable"
msgstr ""
#: ../../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/photos.php:160
msgid "Album not found."
msgstr ""
#: ../../mod/photos.php:178 ../../mod/photos.php:959
msgid "Delete Album"
msgstr ""
#: ../../mod/photos.php:241 ../../mod/photos.php:1183
msgid "Delete Photo"
msgstr ""
#: ../../mod/photos.php:528
msgid "was tagged in a"
msgstr ""
#: ../../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/photos.php:528
msgid "by"
msgstr ""
#: ../../mod/photos.php:631 ../../addon/js_upload/js_upload.php:312
msgid "Image exceeds size limit of "
msgstr ""
#: ../../mod/photos.php:639
msgid "Image file is empty."
msgstr ""
#: ../../mod/photos.php:653 ../../mod/profile_photo.php:122
#: ../../mod/wall_upload.php:65
msgid "Unable to process image."
msgstr ""
#: ../../mod/photos.php:673 ../../mod/profile_photo.php:251
#: ../../mod/wall_upload.php:84
msgid "Image upload failed."
msgstr ""
#: ../../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/directory.php:49
msgid "Global Directory"
#: ../../mod/photos.php:769
msgid "No photos selected"
msgstr ""
#: ../../mod/directory.php:55
msgid "Normal site view"
#: ../../mod/photos.php:846
msgid "Access to this item is restricted."
msgstr ""
#: ../../mod/directory.php:57
msgid "Admin - View all site entries"
#: ../../mod/photos.php:907
msgid "Upload Photos"
msgstr ""
#: ../../mod/directory.php:63
msgid "Find on this site"
#: ../../mod/photos.php:910 ../../mod/photos.php:954
msgid "New album name: "
msgstr ""
#: ../../mod/directory.php:65 ../../mod/contacts.php:372
#: ../../mod/photos.php:911
msgid "or existing album name: "
msgstr ""
#: ../../mod/photos.php:912
msgid "Do not show a status post for this upload"
msgstr ""
#: ../../mod/photos.php:914 ../../mod/photos.php:1178
msgid "Permissions"
msgstr ""
#: ../../mod/photos.php:969
msgid "Edit Album"
msgstr ""
#: ../../mod/photos.php:984 ../../mod/photos.php:1396
msgid "View Photo"
msgstr ""
#: ../../mod/photos.php:1019
msgid "Permission denied. Access to this item may be restricted."
msgstr ""
#: ../../mod/photos.php:1021
msgid "Photo not available"
msgstr ""
#: ../../mod/photos.php:1071
msgid "View photo"
msgstr ""
#: ../../mod/photos.php:1071
msgid "Edit photo"
msgstr ""
#: ../../mod/photos.php:1072
msgid "Use as profile photo"
msgstr ""
#: ../../mod/photos.php:1078 ../../include/conversation.php:450
msgid "Private Message"
msgstr ""
#: ../../mod/photos.php:1089
msgid "View Full Size"
msgstr ""
#: ../../mod/photos.php:1157
msgid "Tags: "
msgstr ""
#: ../../mod/photos.php:1160
msgid "[Remove any tag]"
msgstr ""
#: ../../mod/photos.php:1171
msgid "New album name"
msgstr ""
#: ../../mod/photos.php:1174
msgid "Caption"
msgstr ""
#: ../../mod/photos.php:1176
msgid "Add a Tag"
msgstr ""
#: ../../mod/photos.php:1180
msgid "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
msgstr ""
#: ../../mod/photos.php:1200 ../../include/conversation.php:497
msgid "I like this (toggle)"
msgstr ""
#: ../../mod/photos.php:1201 ../../include/conversation.php:498
msgid "I don't like this (toggle)"
msgstr ""
#: ../../mod/photos.php:1202 ../../include/conversation.php:889
msgid "Share"
msgstr ""
#: ../../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/photos.php:1219 ../../mod/photos.php:1259
#: ../../mod/photos.php:1290 ../../include/conversation.php:512
msgid "This is you"
msgstr ""
#: ../../mod/photos.php:1221 ../../mod/photos.php:1261
#: ../../mod/photos.php:1292 ../../include/conversation.php:514
#: ../../boot.php:443
msgid "Comment"
msgstr ""
#: ../../mod/photos.php:1223 ../../mod/editpost.php:119
#: ../../include/conversation.php:516 ../../include/conversation.php:924
msgid "Preview"
msgstr ""
#: ../../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/photos.php:1402
msgid "View Album"
msgstr ""
#: ../../mod/photos.php:1411
msgid "Recent Photos"
msgstr ""
#: ../../mod/community.php:21
msgid "Not available."
msgstr ""
#: ../../mod/community.php:30 ../../include/nav.php:97
msgid "Community"
msgstr ""
#: ../../mod/community.php:60 ../../mod/search.php:118
msgid "No results."
msgstr ""
#: ../../mod/friendica.php:43
msgid "This is Friendica, version"
msgstr ""
#: ../../mod/friendica.php:44
msgid "running at web location"
msgstr ""
#: ../../mod/friendica.php:46
msgid ""
"Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn "
"more about the Friendica project."
msgstr ""
#: ../../mod/friendica.php:48
msgid "Bug reports and issues: please visit"
msgstr ""
#: ../../mod/friendica.php:49
msgid ""
"Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - "
"dot com"
msgstr ""
#: ../../mod/friendica.php:54
msgid "Installed plugins/addons/apps"
msgstr ""
#: ../../mod/friendica.php:62
msgid "No installed plugins/addons/apps"
msgstr ""
#: ../../mod/editpost.php:17 ../../mod/editpost.php:27
msgid "Item not found"
msgstr ""
#: ../../mod/editpost.php:32
msgid "Edit post"
msgstr ""
#: ../../mod/editpost.php:76 ../../include/conversation.php:875
msgid "Post to Email"
msgstr ""
#: ../../mod/editpost.php:91 ../../mod/settings.php:512
#: ../../include/conversation.php:523
msgid "Edit"
msgstr ""
#: ../../mod/editpost.php:92 ../../mod/message.php:153
#: ../../mod/message.php:294 ../../include/conversation.php:890
msgid "Upload photo"
msgstr ""
#: ../../mod/editpost.php:93 ../../include/conversation.php:892
msgid "Attach file"
msgstr ""
#: ../../mod/editpost.php:94 ../../mod/message.php:154
#: ../../mod/message.php:295 ../../include/conversation.php:894
msgid "Insert web link"
msgstr ""
#: ../../mod/editpost.php:95
msgid "Insert YouTube video"
msgstr ""
#: ../../mod/editpost.php:96
msgid "Insert Vorbis [.ogg] video"
msgstr ""
#: ../../mod/editpost.php:97
msgid "Insert Vorbis [.ogg] audio"
msgstr ""
#: ../../mod/editpost.php:98 ../../include/conversation.php:900
msgid "Set your location"
msgstr ""
#: ../../mod/editpost.php:99 ../../include/conversation.php:902
msgid "Clear browser location"
msgstr ""
#: ../../mod/editpost.php:101 ../../include/conversation.php:907
msgid "Permission settings"
msgstr ""
#: ../../mod/editpost.php:109 ../../include/conversation.php:916
msgid "CC: email addresses"
msgstr ""
#: ../../mod/editpost.php:110 ../../include/conversation.php:917
msgid "Public post"
msgstr ""
#: ../../mod/editpost.php:113 ../../include/conversation.php:905
msgid "Set title"
msgstr ""
#: ../../mod/editpost.php:114 ../../include/conversation.php:919
msgid "Example: bob@example.com, mary@example.com"
msgstr ""
#: ../../mod/dfrn_request.php:92
msgid "This introduction has already been accepted."
msgstr ""
#: ../../mod/dfrn_request.php:116 ../../mod/dfrn_request.php:381
msgid "Profile location is not valid or does not contain profile information."
msgstr ""
#: ../../mod/dfrn_request.php:121 ../../mod/dfrn_request.php:386
msgid "Warning: profile location has no identifiable owner name."
msgstr ""
#: ../../mod/dfrn_request.php:123 ../../mod/dfrn_request.php:388
msgid "Warning: profile location has no profile photo."
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."
msgstr ""
#: ../../mod/dfrn_request.php:191
msgid "Unrecoverable protocol error."
msgstr ""
#: ../../mod/dfrn_request.php:219
msgid "Profile unavailable."
msgstr ""
#: ../../mod/dfrn_request.php:244
#, php-format
msgid "%s has received too many connection requests today."
msgstr ""
#: ../../mod/dfrn_request.php:245
msgid "Spam protection measures have been invoked."
msgstr ""
#: ../../mod/dfrn_request.php:246
msgid "Friends are advised to please try again in 24 hours."
msgstr ""
#: ../../mod/dfrn_request.php:306
msgid "Invalid locator"
msgstr ""
#: ../../mod/dfrn_request.php:326
msgid "Unable to resolve your name at the provided location."
msgstr ""
#: ../../mod/dfrn_request.php:339
msgid "You have already introduced yourself here."
msgstr ""
#: ../../mod/dfrn_request.php:343
#, php-format
msgid "Apparently you are already friends with %s."
msgstr ""
#: ../../mod/dfrn_request.php:364
msgid "Invalid profile URL."
msgstr ""
#: ../../mod/dfrn_request.php:370 ../../mod/follow.php:20
msgid "Disallowed profile URL."
msgstr ""
#: ../../mod/dfrn_request.php:439 ../../mod/contacts.php:102
msgid "Failed to update contact record."
msgstr ""
#: ../../mod/dfrn_request.php:460
msgid "Your introduction has been sent."
msgstr ""
#: ../../mod/dfrn_request.php:513
msgid "Please login to confirm introduction."
msgstr ""
#: ../../mod/dfrn_request.php:527
msgid ""
"Incorrect identity currently logged in. Please login to <strong>this</"
"strong> profile."
msgstr ""
#: ../../mod/dfrn_request.php:539
#, php-format
msgid "Welcome home %s."
msgstr ""
#: ../../mod/dfrn_request.php:540
#, 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:2443
msgid "[Name Withheld]"
msgstr ""
#: ../../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/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"
msgstr ""
#: ../../mod/dfrn_request.php:672
msgid ""
"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
"testuser@identi.ca"
msgstr ""
#: ../../mod/dfrn_request.php:673
msgid "Please answer the following:"
msgstr ""
#: ../../mod/dfrn_request.php:674
#, php-format
msgid "Does %s know you?"
msgstr ""
#: ../../mod/dfrn_request.php:677
msgid "Add a personal note:"
msgstr ""
#: ../../mod/dfrn_request.php:679 ../../include/contact_selectors.php:76
msgid "Friendica"
msgstr ""
#: ../../mod/dfrn_request.php:680
msgid "StatusNet/Federated Social Web"
msgstr ""
#: ../../mod/dfrn_request.php:681 ../../mod/settings.php:548
#: ../../include/contact_selectors.php:80
msgid "Diaspora"
msgstr ""
#: ../../mod/dfrn_request.php:682
msgid "- please share from your own site as noted above"
msgstr ""
#: ../../mod/dfrn_request.php:683
msgid "Your Identity Address:"
msgstr ""
#: ../../mod/dfrn_request.php:684
msgid "Submit Request"
msgstr ""
#: ../../mod/install.php:111
msgid "Friendica Social Communications Server - Setup"
msgstr ""
#: ../../mod/install.php:117 ../../mod/install.php:157
#: ../../mod/install.php:230
msgid "Database connection"
msgstr ""
#: ../../mod/install.php:124
msgid "Could not connect to database."
msgstr ""
#: ../../mod/install.php:128
msgid "Could not create table."
msgstr ""
#: ../../mod/install.php:133
msgid "Your Friendica site database has been installed."
msgstr ""
#: ../../mod/install.php:134
msgid ""
"IMPORTANT: You will need to [manually] setup a scheduled task for the poller."
msgstr ""
#: ../../mod/install.php:135 ../../mod/install.php:151
#: ../../mod/install.php:209
msgid "Please see the file \"INSTALL.txt\"."
msgstr ""
#: ../../mod/install.php:137
msgid "Proceed to registration"
msgstr ""
#: ../../mod/install.php:143
msgid "Proceed with Installation"
msgstr ""
#: ../../mod/install.php:150
msgid ""
"You may need to import the file \"database.sql\" manually using phpmyadmin "
"or mysql."
msgstr ""
#: ../../mod/install.php:158
msgid "Database import failed."
msgstr ""
#: ../../mod/install.php:206
msgid "System check"
msgstr ""
#: ../../mod/install.php:211
msgid "Check again"
msgstr ""
#: ../../mod/install.php:231
msgid ""
"In order to install Friendica we need to know how to connect to your "
"database."
msgstr ""
#: ../../mod/install.php:232
msgid ""
"Please contact your hosting provider or site administrator if you have "
"questions about these settings."
msgstr ""
#: ../../mod/install.php:233
msgid ""
"The database you specify below should already exist. If it does not, please "
"create it before continuing."
msgstr ""
#: ../../mod/install.php:237
msgid "Database Server Name"
msgstr ""
#: ../../mod/install.php:238
msgid "Database Login Name"
msgstr ""
#: ../../mod/install.php:239
msgid "Database Login Password"
msgstr ""
#: ../../mod/install.php:240
msgid "Database Name"
msgstr ""
#: ../../mod/install.php:241 ../../mod/install.php:280
msgid "Site administrator email address"
msgstr ""
#: ../../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/install.php:245 ../../mod/install.php:283
msgid "Please select a default timezone for your website"
msgstr ""
#: ../../mod/install.php:270
msgid "Site settings"
msgstr ""
#: ../../mod/install.php:323
msgid "Could not find a command line version of PHP in the web server PATH."
msgstr ""
#: ../../mod/install.php:326
msgid "PHP executable path"
msgstr ""
#: ../../mod/install.php:326
msgid "Enter full path to php executable"
msgstr ""
#: ../../mod/install.php:331
msgid "Command line PHP"
msgstr ""
#: ../../mod/install.php:340
msgid ""
"The command line version of PHP on your system does not have "
"\"register_argc_argv\" enabled."
msgstr ""
#: ../../mod/install.php:341
msgid "This is required for message delivery to work."
msgstr ""
#: ../../mod/install.php:343
msgid "PHP \"register_argc_argv\""
msgstr ""
#: ../../mod/install.php:364
msgid ""
"Error: the \"openssl_pkey_new\" function on this system is not able to "
"generate encryption keys"
msgstr ""
#: ../../mod/install.php:365
msgid ""
"If running under Windows, please see \"http://www.php.net/manual/en/openssl."
"installation.php\"."
msgstr ""
#: ../../mod/install.php:367
msgid "Generate encryption keys"
msgstr ""
#: ../../mod/install.php:374
msgid "libCurl PHP module"
msgstr ""
#: ../../mod/install.php:375
msgid "GD graphics PHP module"
msgstr ""
#: ../../mod/install.php:376
msgid "OpenSSL PHP module"
msgstr ""
#: ../../mod/install.php:377
msgid "mysqli PHP module"
msgstr ""
#: ../../mod/install.php:378
msgid "mb_string PHP module"
msgstr ""
#: ../../mod/install.php:383 ../../mod/install.php:385
msgid "Apace mod_rewrite module"
msgstr ""
#: ../../mod/install.php:383
msgid ""
"Error: Apache webserver mod-rewrite module is required but not installed."
msgstr ""
#: ../../mod/install.php:390
msgid "Error: libCURL PHP module required but not installed."
msgstr ""
#: ../../mod/install.php:394
msgid ""
"Error: GD graphics PHP module with JPEG support required but not installed."
msgstr ""
#: ../../mod/install.php:398
msgid "Error: openssl PHP module required but not installed."
msgstr ""
#: ../../mod/install.php:402
msgid "Error: mysqli PHP module required but not installed."
msgstr ""
#: ../../mod/install.php:406
msgid "Error: mb_string PHP module required but not installed."
msgstr ""
#: ../../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/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/install.php:425
msgid ""
"Please check with your site documentation or support people to see if this "
"situation can be corrected."
msgstr ""
#: ../../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/install.php:429
msgid ".htconfig.php is writable"
msgstr ""
#: ../../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/install.php:461
msgid "Errors encountered creating database tables."
msgstr ""
#: ../../mod/localtime.php:12 ../../include/event.php:11
#: ../../include/bb2diaspora.php:249
msgid "l F d, Y \\@ g:i A"
msgstr ""
#: ../../mod/localtime.php:24
msgid "Time Conversion"
msgstr ""
#: ../../mod/localtime.php:26
msgid ""
"Friendika provides this service for sharing events with other networks and "
"friends in unknown timezones."
msgstr ""
#: ../../mod/localtime.php:30
#, php-format
msgid "UTC time: %s"
msgstr ""
#: ../../mod/localtime.php:33
#, php-format
msgid "Current timezone: %s"
msgstr ""
#: ../../mod/localtime.php:36
#, php-format
msgid "Converted localtime: %s"
msgstr ""
#: ../../mod/localtime.php:41
msgid "Please select your timezone:"
msgstr ""
#: ../../mod/match.php:12
msgid "Profile Match"
msgstr ""
#: ../../mod/match.php:20
msgid "No keywords to match. Please add keywords to your default profile."
msgstr ""
#: ../../mod/match.php:57
msgid "is interested in:"
msgstr ""
#: ../../mod/match.php:58 ../../mod/suggest.php:59
#: ../../include/contact_widgets.php:9 ../../boot.php:926
msgid "Connect"
msgstr ""
#: ../../mod/match.php:65 ../../mod/dirfind.php:57
msgid "No matches"
msgstr ""
#: ../../mod/lockview.php:39
msgid "Remote privacy information not available."
msgstr ""
#: ../../mod/lockview.php:43
msgid "Visible to:"
msgstr ""
#: ../../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: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:177
msgid "Personal"
msgstr ""
#: ../../mod/notifications.php:81 ../../include/nav.php:73
#: ../../include/nav.php:111
msgid "Home"
msgstr ""
#: ../../mod/notifications.php:86 ../../include/nav.php:117
msgid "Introductions"
msgstr ""
#: ../../mod/notifications.php:91 ../../mod/message.php:76
#: ../../include/nav.php:123
msgid "Messages"
msgstr ""
#: ../../mod/notifications.php:110
msgid "Show Ignored Requests"
msgstr ""
#: ../../mod/notifications.php:110
msgid "Hide Ignored Requests"
msgstr ""
#: ../../mod/notifications.php:136 ../../mod/notifications.php:182
msgid "Notification type: "
msgstr ""
#: ../../mod/notifications.php:137
msgid "Friend Suggestion"
msgstr ""
#: ../../mod/notifications.php:139
#, php-format
msgid "suggested by %s"
msgstr ""
#: ../../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:168
msgid "Claims to be known to you: "
msgstr ""
#: ../../mod/notifications.php:168
msgid "yes"
msgstr ""
#: ../../mod/notifications.php:168
msgid "no"
msgstr ""
#: ../../mod/notifications.php:175
msgid "Approve as: "
msgstr ""
#: ../../mod/notifications.php:176
msgid "Friend"
msgstr ""
#: ../../mod/notifications.php:177
msgid "Sharer"
msgstr ""
#: ../../mod/notifications.php:177
msgid "Fan/Admirer"
msgstr ""
#: ../../mod/notifications.php:183
msgid "Friend/Connect Request"
msgstr ""
#: ../../mod/notifications.php:183
msgid "New Follower"
msgstr ""
#: ../../mod/notifications.php:204
msgid "No introductions."
msgstr ""
#: ../../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:244 ../../mod/notifications.php:339
#: ../../mod/notifications.php:426
#, php-format
msgid "%s liked %s's post"
msgstr ""
#: ../../mod/notifications.php:253 ../../mod/notifications.php:348
#: ../../mod/notifications.php:435
#, php-format
msgid "%s disliked %s's post"
msgstr ""
#: ../../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:274 ../../mod/notifications.php:369
#, php-format
msgid "%s created a new post"
msgstr ""
#: ../../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:289
msgid "No more network notifications."
msgstr ""
#: ../../mod/notifications.php:384
msgid "No more personal notifications."
msgstr ""
#: ../../mod/notifications.php:465
msgid "No more home notifications."
msgstr ""
#: ../../mod/contacts.php:63 ../../mod/contacts.php:143
msgid "Could not access contact record."
msgstr ""
#: ../../mod/contacts.php:77
msgid "Could not locate selected profile."
msgstr ""
#: ../../mod/contacts.php:100
msgid "Contact updated."
msgstr ""
#: ../../mod/contacts.php:165
msgid "Contact has been blocked"
msgstr ""
#: ../../mod/contacts.php:165
msgid "Contact has been unblocked"
msgstr ""
#: ../../mod/contacts.php:179
msgid "Contact has been ignored"
msgstr ""
#: ../../mod/contacts.php:179
msgid "Contact has been unignored"
msgstr ""
#: ../../mod/contacts.php:200
msgid "stopped following"
msgstr ""
#: ../../mod/contacts.php:221
msgid "Contact has been removed."
msgstr ""
#: ../../mod/contacts.php:245
#, php-format
msgid "You are mutual friends with %s"
msgstr ""
#: ../../mod/contacts.php:249
#, php-format
msgid "You are sharing with %s"
msgstr ""
#: ../../mod/contacts.php:254
#, php-format
msgid "%s is sharing with you"
msgstr ""
#: ../../mod/contacts.php:271
msgid "Private communications are not available for this contact."
msgstr ""
#: ../../mod/contacts.php:274
msgid "Never"
msgstr ""
#: ../../mod/contacts.php:278
msgid "(Update was successful)"
msgstr ""
#: ../../mod/contacts.php:278
msgid "(Update was not successful)"
msgstr ""
#: ../../mod/contacts.php:280
msgid "Suggest friends"
msgstr ""
#: ../../mod/contacts.php:284
#, php-format
msgid "Network type: %s"
msgstr ""
#: ../../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/contacts.php:297 ../../mod/contacts.php:344
#: ../../mod/admin.php:470
msgid "Unblock"
msgstr ""
#: ../../mod/contacts.php:297 ../../mod/contacts.php:344
#: ../../mod/admin.php:469
msgid "Block"
msgstr ""
#: ../../mod/contacts.php:302 ../../mod/contacts.php:345
msgid "Unignore"
msgstr ""
#: ../../mod/contacts.php:307
msgid "Repair"
msgstr ""
#: ../../mod/contacts.php:317
msgid "Contact Editor"
msgstr ""
#: ../../mod/contacts.php:320
msgid "Profile Visibility"
msgstr ""
#: ../../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/contacts.php:322
msgid "Contact Information / Notes"
msgstr ""
#: ../../mod/contacts.php:323
msgid "Edit contact notes"
msgstr ""
#: ../../mod/contacts.php:328 ../../mod/contacts.php:458
#: ../../mod/viewcontacts.php:61
#, php-format
msgid "Visit %s's profile [%s]"
msgstr ""
#: ../../mod/contacts.php:329
msgid "Block/Unblock contact"
msgstr ""
#: ../../mod/contacts.php:330
msgid "Ignore contact"
msgstr ""
#: ../../mod/contacts.php:331
msgid "Repair URL settings"
msgstr ""
#: ../../mod/contacts.php:332
msgid "View conversations"
msgstr ""
#: ../../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 ""
"Replies/likes to your public posts <strong>may</strong> still be visible"
msgstr ""
#: ../../mod/contacts.php:387 ../../include/nav.php:131
msgid "Contacts"
msgstr ""
#: ../../mod/contacts.php:389
msgid "Show Unblocked Contacts"
msgstr ""
#: ../../mod/contacts.php:389
msgid "Show Blocked Contacts"
msgstr ""
#: ../../mod/contacts.php:391
msgid "Show All Contacts"
msgstr ""
#: ../../mod/contacts.php:393
msgid "Search your contacts"
msgstr ""
#: ../../mod/contacts.php:394 ../../mod/directory.php:65
msgid "Finding: "
msgstr ""
#: ../../mod/directory.php:66
msgid "Site Directory"
msgstr ""
#: ../../mod/directory.php:67 ../../mod/contacts.php:373
#: ../../mod/contacts.php:395 ../../mod/directory.php:67
#: ../../include/contact_widgets.php:34
msgid "Find"
msgstr ""
#: ../../mod/directory.php:122 ../../mod/profiles.php:426
msgid "Age: "
#: ../../mod/contacts.php:434
msgid "Mutual Friendship"
msgstr ""
#: ../../mod/directory.php:125
msgid "Gender: "
#: ../../mod/contacts.php:438
msgid "is a fan of yours"
msgstr ""
#: ../../mod/directory.php:151
msgid "No entries (some entries may be hidden)."
#: ../../mod/contacts.php:442
msgid "you are a fan of"
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/contacts.php:459 ../../include/Contact.php:135
#: ../../include/conversation.php:748
msgid "Edit contact"
msgstr ""
#: ../../mod/viewsrc.php:7
msgid "Access denied."
#: ../../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 "Password reset requested at %s"
msgstr ""
#: ../../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/lostpass.php:64
msgid ""
"Request could not be verified. (You may have previously submitted it.) "
"Password reset failed."
msgstr ""
#: ../../mod/lostpass.php:82 ../../boot.php:719
msgid "Password Reset"
msgstr ""
#: ../../mod/lostpass.php:83
msgid "Your password has been reset as requested."
msgstr ""
#: ../../mod/lostpass.php:84
msgid "Your new password is"
msgstr ""
#: ../../mod/lostpass.php:85
msgid "Save or copy your new password - and then"
msgstr ""
#: ../../mod/lostpass.php:86
msgid "click here to login"
msgstr ""
#: ../../mod/lostpass.php:87
msgid ""
"Your password may be changed from the <em>Settings</em> page after "
"successful login."
msgstr ""
#: ../../mod/lostpass.php:118
msgid "Forgot your Password?"
msgstr ""
#: ../../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/lostpass.php:120
msgid "Nickname or Email: "
msgstr ""
#: ../../mod/lostpass.php:121
msgid "Reset"
msgstr ""
#: ../../mod/settings.php:70
msgid "Missing some important data!"
msgstr ""
#: ../../mod/settings.php:73 ../../mod/settings.php:479 ../../mod/admin.php:62
msgid "Update"
msgstr ""
#: ../../mod/settings.php:168
msgid "Failed to connect with email account using the settings provided."
msgstr ""
#: ../../mod/settings.php:173
msgid "Email settings updated."
msgstr ""
#: ../../mod/settings.php:191
msgid "Passwords do not match. Password unchanged."
msgstr ""
#: ../../mod/settings.php:196
msgid "Empty passwords are not allowed. Password unchanged."
msgstr ""
#: ../../mod/settings.php:207
msgid "Password changed."
msgstr ""
#: ../../mod/settings.php:209
msgid "Password update failed. Please try again."
msgstr ""
#: ../../mod/settings.php:273
msgid " Please use a shorter name."
msgstr ""
#: ../../mod/settings.php:275
msgid " Name too short."
msgstr ""
#: ../../mod/settings.php:281
msgid " Not valid email."
msgstr ""
#: ../../mod/settings.php:283
msgid " Cannot change to that email."
msgstr ""
#: ../../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/settings.php:415 ../../include/nav.php:129
msgid "Account settings"
msgstr ""
#: ../../mod/settings.php:420
msgid "Connector settings"
msgstr ""
#: ../../mod/settings.php:425
msgid "Plugin settings"
msgstr ""
#: ../../mod/settings.php:430
msgid "Connections"
msgstr ""
#: ../../mod/settings.php:435
msgid "Export personal data"
msgstr ""
#: ../../mod/settings.php:452 ../../mod/settings.php:478
#: ../../mod/settings.php:511
msgid "Add application"
msgstr ""
#: ../../mod/settings.php:456 ../../mod/settings.php:482
#: ../../addon/statusnet/statusnet.php:489
msgid "Consumer Key"
msgstr ""
#: ../../mod/settings.php:457 ../../mod/settings.php:483
#: ../../addon/statusnet/statusnet.php:488
msgid "Consumer Secret"
msgstr ""
#: ../../mod/settings.php:458 ../../mod/settings.php:484
msgid "Redirect"
msgstr ""
#: ../../mod/settings.php:459 ../../mod/settings.php:485
msgid "Icon url"
msgstr ""
#: ../../mod/settings.php:470
msgid "You can't edit this application."
msgstr ""
#: ../../mod/settings.php:510
msgid "Connected Apps"
msgstr ""
#: ../../mod/settings.php:514
msgid "Client key starts with"
msgstr ""
#: ../../mod/settings.php:515
msgid "No name"
msgstr ""
#: ../../mod/settings.php:516
msgid "Remove authorization"
msgstr ""
#: ../../mod/settings.php:528
msgid "No Plugin settings configured"
msgstr ""
#: ../../mod/settings.php:535 ../../addon/widgets/widgets.php:122
msgid "Plugin Settings"
msgstr ""
#: ../../mod/settings.php:548 ../../mod/settings.php:549
#, php-format
msgid "Built-in support for %s connectivity is %s"
msgstr ""
#: ../../mod/settings.php:548 ../../mod/settings.php:549
msgid "enabled"
msgstr ""
#: ../../mod/settings.php:548 ../../mod/settings.php:549
msgid "disabled"
msgstr ""
#: ../../mod/settings.php:549
msgid "StatusNet"
msgstr ""
#: ../../mod/settings.php:575
msgid "Connector Settings"
msgstr ""
#: ../../mod/settings.php:581
msgid "Email/Mailbox Setup"
msgstr ""
#: ../../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/settings.php:583
msgid "Last successful email check:"
msgstr ""
#: ../../mod/settings.php:584
msgid "Email access is disabled on this site."
msgstr ""
#: ../../mod/settings.php:585
msgid "IMAP server name:"
msgstr ""
#: ../../mod/settings.php:586
msgid "IMAP port:"
msgstr ""
#: ../../mod/settings.php:587
msgid "Security:"
msgstr ""
#: ../../mod/settings.php:587
msgid "None"
msgstr ""
#: ../../mod/settings.php:588
msgid "Email login name:"
msgstr ""
#: ../../mod/settings.php:589
msgid "Email password:"
msgstr ""
#: ../../mod/settings.php:590
msgid "Reply-to address:"
msgstr ""
#: ../../mod/settings.php:591
msgid "Send public posts to all email contacts:"
msgstr ""
#: ../../mod/settings.php:648 ../../mod/admin.php:126 ../../mod/admin.php:443
msgid "Normal Account"
msgstr ""
#: ../../mod/settings.php:649
msgid "This account is a normal personal profile"
msgstr ""
#: ../../mod/settings.php:652 ../../mod/admin.php:127 ../../mod/admin.php:444
msgid "Soapbox Account"
msgstr ""
#: ../../mod/settings.php:653
msgid "Automatically approve all connection/friend requests as read-only fans"
msgstr ""
#: ../../mod/settings.php:656 ../../mod/admin.php:128 ../../mod/admin.php:445
msgid "Community/Celebrity Account"
msgstr ""
#: ../../mod/settings.php:657
msgid "Automatically approve all connection/friend requests as read-write fans"
msgstr ""
#: ../../mod/settings.php:660 ../../mod/admin.php:129 ../../mod/admin.php:446
msgid "Automatic Friend Account"
msgstr ""
#: ../../mod/settings.php:661
msgid "Automatically approve all connection/friend requests as friends"
msgstr ""
#: ../../mod/settings.php:671
msgid "OpenID:"
msgstr ""
#: ../../mod/settings.php:671
msgid "(Optional) Allow this OpenID to login to this account."
msgstr ""
#: ../../mod/settings.php:681
msgid "Publish your default profile in your local site directory?"
msgstr ""
#: ../../mod/settings.php:687
msgid "Publish your default profile in the global social directory?"
msgstr ""
#: ../../mod/settings.php:695
msgid "Hide your contact/friend list from viewers of your default profile?"
msgstr ""
#: ../../mod/settings.php:699
msgid "Hide your profile details from unknown viewers?"
msgstr ""
#: ../../mod/settings.php:704
msgid "Allow friends to post to your profile page?"
msgstr ""
#: ../../mod/settings.php:710
msgid "Allow friends to tag your posts?"
msgstr ""
#: ../../mod/settings.php:716
msgid "Allow us to suggest you as a potential friend to new members?"
msgstr ""
#: ../../mod/settings.php:725
msgid "Profile is <strong>not published</strong>."
msgstr ""
#: ../../mod/settings.php:744 ../../mod/profile_photo.php:206
msgid "or"
msgstr ""
#: ../../mod/settings.php:749
msgid "Your Identity Address is"
msgstr ""
#: ../../mod/settings.php:760
msgid "Automatically expire posts after this many days:"
msgstr ""
#: ../../mod/settings.php:760
msgid "If empty, posts will not expire. Expired posts will be deleted"
msgstr ""
#: ../../mod/settings.php:761
msgid "Advanced expiration settings"
msgstr ""
#: ../../mod/settings.php:762
msgid "Advanced Expiration"
msgstr ""
#: ../../mod/settings.php:763
msgid "Expire posts:"
msgstr ""
#: ../../mod/settings.php:764
msgid "Expire personal notes:"
msgstr ""
#: ../../mod/settings.php:765
msgid "Expire starred posts:"
msgstr ""
#: ../../mod/settings.php:766
msgid "Expire photos:"
msgstr ""
#: ../../mod/settings.php:771
msgid "Account Settings"
msgstr ""
#: ../../mod/settings.php:779
msgid "Password Settings"
msgstr ""
#: ../../mod/settings.php:780
msgid "New Password:"
msgstr ""
#: ../../mod/settings.php:781
msgid "Confirm:"
msgstr ""
#: ../../mod/settings.php:781
msgid "Leave password fields blank unless changing"
msgstr ""
#: ../../mod/settings.php:785
msgid "Basic Settings"
msgstr ""
#: ../../mod/settings.php:786 ../../include/profile_advanced.php:15
msgid "Full Name:"
msgstr ""
#: ../../mod/settings.php:787
msgid "Email Address:"
msgstr ""
#: ../../mod/settings.php:788
msgid "Your Timezone:"
msgstr ""
#: ../../mod/settings.php:789
msgid "Default Post Location:"
msgstr ""
#: ../../mod/settings.php:790
msgid "Use Browser Location:"
msgstr ""
#: ../../mod/settings.php:791
msgid "Display Theme:"
msgstr ""
#: ../../mod/settings.php:792
msgid "Update browser every xx seconds"
msgstr ""
#: ../../mod/settings.php:792
msgid "Minimum of 10 seconds, no maximum"
msgstr ""
#: ../../mod/settings.php:794
msgid "Security and Privacy Settings"
msgstr ""
#: ../../mod/settings.php:796
msgid "Maximum Friend Requests/Day:"
msgstr ""
#: ../../mod/settings.php:796
msgid "(to prevent spam abuse)"
msgstr ""
#: ../../mod/settings.php:797
msgid "Default Post Permissions"
msgstr ""
#: ../../mod/settings.php:798
msgid "(click to open/close)"
msgstr ""
#: ../../mod/settings.php:813
msgid "Notification Settings"
msgstr ""
#: ../../mod/settings.php:814
msgid "Send a notification email when:"
msgstr ""
#: ../../mod/settings.php:815
msgid "You receive an introduction"
msgstr ""
#: ../../mod/settings.php:816
msgid "Your introductions are confirmed"
msgstr ""
#: ../../mod/settings.php:817
msgid "Someone writes on your profile wall"
msgstr ""
#: ../../mod/settings.php:818
msgid "Someone writes a followup comment"
msgstr ""
#: ../../mod/settings.php:819
msgid "You receive a private message"
msgstr ""
#: ../../mod/settings.php:820
msgid "You receive a friend suggestion"
msgstr ""
#: ../../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 ""
"Toggle between different identities or community/group pages which share "
"your account details or which you have been granted \"manage\" permissions"
msgstr ""
#: ../../mod/manage.php:95
msgid "Select an identity to manage: "
msgstr ""
#: ../../mod/network.php:43
msgid "Search Results For:"
msgstr ""
#: ../../mod/network.php:77 ../../mod/search.php:16
msgid "Remove term"
msgstr ""
#: ../../mod/network.php:86 ../../mod/search.php:13
msgid "Saved Searches"
msgstr ""
#: ../../mod/network.php:87 ../../include/group.php:216
msgid "add"
msgstr ""
#: ../../mod/network.php:166
msgid "Commented Order"
msgstr ""
#: ../../mod/network.php:171
msgid "Posted Order"
msgstr ""
#: ../../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 "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/network.php:304
msgid "No such group"
msgstr ""
#: ../../mod/network.php:315
msgid "Group is empty"
msgstr ""
#: ../../mod/network.php:319
msgid "Group: "
msgstr ""
#: ../../mod/network.php:329
msgid "Contact: "
msgstr ""
#: ../../mod/network.php:331
msgid "Private messages to this person are at risk of public disclosure."
msgstr ""
#: ../../mod/network.php:336
msgid "Invalid contact."
msgstr ""
#: ../../mod/notes.php:44 ../../boot.php:1350
msgid "Personal Notes"
msgstr ""
#: ../../mod/notes.php:63 ../../include/text.php:639
msgid "Save"
msgstr ""
#: ../../mod/newmember.php:6
@ -200,1711 +2210,94 @@ msgid ""
"features and resources."
msgstr ""
#: ../../mod/follow.php:20 ../../mod/dfrn_request.php:370
msgid "Disallowed profile URL."
#: ../../mod/attach.php:8
msgid "Item not available."
msgstr ""
#: ../../mod/follow.php:27
msgid "Connect URL missing."
#: ../../mod/attach.php:20
msgid "Item was not found."
msgstr ""
#: ../../mod/follow.php:47
msgid ""
"This site is not configured to allow communications with other networks."
#: ../../mod/group.php:27
msgid "Group created."
msgstr ""
#: ../../mod/follow.php:48 ../../mod/follow.php:58
msgid "No compatible communication protocols or feeds were discovered."
#: ../../mod/group.php:33
msgid "Could not create group."
msgstr ""
#: ../../mod/follow.php:56
msgid "The profile address specified does not provide adequate information."
#: ../../mod/group.php:43 ../../mod/group.php:123
msgid "Group not found."
msgstr ""
#: ../../mod/follow.php:60
msgid "An author or name was not found."
#: ../../mod/group.php:56
msgid "Group name changed."
msgstr ""
#: ../../mod/follow.php:62
msgid "No browser URL could be matched to this address."
#: ../../mod/group.php:67 ../../mod/profperm.php:19 ../../index.php:287
msgid "Permission denied"
msgstr ""
#: ../../mod/follow.php:69
msgid ""
"The profile address specified belongs to a network which has been disabled "
"on this site."
#: ../../mod/group.php:82
msgid "Create a group of contacts/friends."
msgstr ""
#: ../../mod/follow.php:74
msgid ""
"Limited profile. This person will be unable to receive direct/personal "
"notifications from you."
#: ../../mod/group.php:83 ../../mod/group.php:166
msgid "Group Name: "
msgstr ""
#: ../../mod/follow.php:144
msgid "Unable to retrieve contact information."
#: ../../mod/group.php:98
msgid "Group removed."
msgstr ""
#: ../../mod/follow.php:190
msgid "following"
#: ../../mod/group.php:100
msgid "Unable to remove group."
msgstr ""
#: ../../mod/dirfind.php:23
msgid "People Search"
#: ../../mod/group.php:164 ../../mod/profperm.php:105
msgid "Click on a contact to add or remove."
msgstr ""
#: ../../mod/dirfind.php:57 ../../mod/match.php:65
msgid "No matches"
#: ../../mod/group.php:165
msgid "Group Editor"
msgstr ""
#: ../../mod/contacts.php:62 ../../mod/contacts.php:135
msgid "Could not access contact record."
#: ../../mod/group.php:179
msgid "Members"
msgstr ""
#: ../../mod/contacts.php:76
msgid "Could not locate selected profile."
#: ../../mod/group.php:194
msgid "All Contacts"
msgstr ""
#: ../../mod/contacts.php:99
msgid "Contact updated."
#: ../../mod/profperm.php:25 ../../mod/profperm.php:55
msgid "Invalid profile identifier."
msgstr ""
#: ../../mod/contacts.php:101 ../../mod/dfrn_request.php:439
msgid "Failed to update contact record."
#: ../../mod/profperm.php:101
msgid "Profile Visibility Editor"
msgstr ""
#: ../../mod/contacts.php:157
msgid "Contact has been blocked"
#: ../../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/contacts.php:157
msgid "Contact has been unblocked"
#: ../../mod/profperm.php:114
msgid "Visible To"
msgstr ""
#: ../../mod/contacts.php:171
msgid "Contact has been ignored"
#: ../../mod/profperm.php:130
msgid "All Contacts (with secure profile access)"
msgstr ""
#: ../../mod/contacts.php:171
msgid "Contact has been unignored"
#: ../../mod/viewcontacts.php:25 ../../include/text.php:578
msgid "View Contacts"
msgstr ""
#: ../../mod/contacts.php:192
msgid "stopped following"
msgstr ""
#: ../../mod/contacts.php:213
msgid "Contact has been removed."
msgstr ""
#: ../../mod/contacts.php:234
#, php-format
msgid "You are mutual friends with %s"
msgstr ""
#: ../../mod/contacts.php:238
#, php-format
msgid "You are sharing with %s"
msgstr ""
#: ../../mod/contacts.php:243
#, php-format
msgid "%s is sharing with you"
msgstr ""
#: ../../mod/contacts.php:260
msgid "Private communications are not available for this contact."
msgstr ""
#: ../../mod/contacts.php:263
msgid "Never"
msgstr ""
#: ../../mod/contacts.php:267
msgid "(Update was successful)"
msgstr ""
#: ../../mod/contacts.php:267
msgid "(Update was not successful)"
msgstr ""
#: ../../mod/contacts.php:269
msgid "Suggest friends"
msgstr ""
#: ../../mod/contacts.php:273
#, php-format
msgid "Network type: %s"
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"
msgstr ""
#: ../../mod/contacts.php:286 ../../mod/contacts.php:333
#: ../../mod/admin.php:470
msgid "Unblock"
msgstr ""
#: ../../mod/contacts.php:286 ../../mod/contacts.php:333
#: ../../mod/admin.php:469
msgid "Block"
msgstr ""
#: ../../mod/contacts.php:291 ../../mod/contacts.php:334
msgid "Unignore"
msgstr ""
#: ../../mod/contacts.php:291 ../../mod/contacts.php:334
#: ../../mod/notifications.php:47 ../../mod/notifications.php:149
#: ../../mod/notifications.php:194
msgid "Ignore"
msgstr ""
#: ../../mod/contacts.php:296
msgid "Repair"
msgstr ""
#: ../../mod/contacts.php:306
msgid "Contact Editor"
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"
msgstr ""
#: ../../mod/contacts.php:309
msgid "Profile Visibility"
msgstr ""
#: ../../mod/contacts.php:310
#, php-format
msgid ""
"Please choose the profile you would like to display to %s when viewing your "
"profile securely."
msgstr ""
#: ../../mod/contacts.php:311
msgid "Contact Information / Notes"
msgstr ""
#: ../../mod/contacts.php:312
msgid "Edit contact notes"
msgstr ""
#: ../../mod/contacts.php:317 ../../mod/contacts.php:433
#: ../../mod/viewcontacts.php:61
#, php-format
msgid "Visit %s's profile [%s]"
msgstr ""
#: ../../mod/contacts.php:318
msgid "Block/Unblock contact"
msgstr ""
#: ../../mod/contacts.php:319
msgid "Ignore contact"
msgstr ""
#: ../../mod/contacts.php:320
msgid "Repair URL settings"
msgstr ""
#: ../../mod/contacts.php:321
msgid "View conversations"
msgstr ""
#: ../../mod/contacts.php:323
msgid "Delete contact"
msgstr ""
#: ../../mod/contacts.php:327
msgid "Last update:"
msgstr ""
#: ../../mod/contacts.php:328
msgid "Update public posts"
msgstr ""
#: ../../mod/contacts.php:330 ../../mod/admin.php:701
msgid "Update now"
msgstr ""
#: ../../mod/contacts.php:337
msgid "Currently blocked"
msgstr ""
#: ../../mod/contacts.php:338
msgid "Currently ignored"
msgstr ""
#: ../../mod/contacts.php:339 ../../mod/notifications.php:144
#: ../../mod/notifications.php:189
msgid "Hide this contact from others"
msgstr ""
#: ../../mod/contacts.php:339
msgid ""
"Replies/likes to your public posts <strong>may</strong> still be visible"
msgstr ""
#: ../../mod/contacts.php:367 ../../include/nav.php:130
msgid "Contacts"
msgstr ""
#: ../../mod/contacts.php:369
msgid "Show Blocked Connections"
msgstr ""
#: ../../mod/contacts.php:369
msgid "Hide Blocked Connections"
msgstr ""
#: ../../mod/contacts.php:371
msgid "Search your contacts"
msgstr ""
#: ../../mod/contacts.php:409
msgid "Mutual Friendship"
msgstr ""
#: ../../mod/contacts.php:413
msgid "is a fan of yours"
msgstr ""
#: ../../mod/contacts.php:417
msgid "you are a fan of"
msgstr ""
#: ../../mod/contacts.php:434 ../../include/Contact.php:129
#: ../../include/conversation.php:727
msgid "Edit contact"
msgstr ""
#: ../../mod/settings.php:11 ../../mod/photos.php:64
msgid "everybody"
msgstr ""
#: ../../mod/settings.php:69
msgid "Missing some important data!"
msgstr ""
#: ../../mod/settings.php:72 ../../mod/settings.php:473 ../../mod/admin.php:62
msgid "Update"
msgstr ""
#: ../../mod/settings.php:167
msgid "Failed to connect with email account using the settings provided."
msgstr ""
#: ../../mod/settings.php:172
msgid "Email settings updated."
msgstr ""
#: ../../mod/settings.php:190
msgid "Passwords do not match. Password unchanged."
msgstr ""
#: ../../mod/settings.php:195
msgid "Empty passwords are not allowed. Password unchanged."
msgstr ""
#: ../../mod/settings.php:206
msgid "Password changed."
msgstr ""
#: ../../mod/settings.php:208
msgid "Password update failed. Please try again."
msgstr ""
#: ../../mod/settings.php:272
msgid " Please use a shorter name."
msgstr ""
#: ../../mod/settings.php:274
msgid " Name too short."
msgstr ""
#: ../../mod/settings.php:280
msgid " Not valid email."
msgstr ""
#: ../../mod/settings.php:282
msgid " Cannot change to that email."
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."
msgstr ""
#: ../../mod/settings.php:409 ../../include/nav.php:128
msgid "Account settings"
msgstr ""
#: ../../mod/settings.php:414
msgid "Connector settings"
msgstr ""
#: ../../mod/settings.php:419
msgid "Plugin settings"
msgstr ""
#: ../../mod/settings.php:424
msgid "Connections"
msgstr ""
#: ../../mod/settings.php:429
msgid "Export personal data"
msgstr ""
#: ../../mod/settings.php:446 ../../mod/settings.php:472
#: ../../mod/settings.php:505
msgid "Add application"
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"
msgstr ""
#: ../../mod/settings.php:449 ../../mod/settings.php:475
#: ../../mod/crepair.php:144 ../../mod/admin.php:464 ../../mod/admin.php:473
msgid "Name"
msgstr ""
#: ../../mod/settings.php:450 ../../mod/settings.php:476
#: ../../addon/statusnet/statusnet.php:480
msgid "Consumer Key"
msgstr ""
#: ../../mod/settings.php:451 ../../mod/settings.php:477
#: ../../addon/statusnet/statusnet.php:479
msgid "Consumer Secret"
msgstr ""
#: ../../mod/settings.php:452 ../../mod/settings.php:478
msgid "Redirect"
msgstr ""
#: ../../mod/settings.php:453 ../../mod/settings.php:479
msgid "Icon url"
msgstr ""
#: ../../mod/settings.php:464
msgid "You can't edit this application."
msgstr ""
#: ../../mod/settings.php:504
msgid "Connected Apps"
msgstr ""
#: ../../mod/settings.php:506 ../../mod/editpost.php:90
#: ../../include/conversation.php:496
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"
msgstr ""
#: ../../mod/settings.php:529 ../../addon/widgets/widgets.php:122
msgid "Plugin Settings"
msgstr ""
#: ../../mod/settings.php:542 ../../mod/settings.php:543
#, php-format
msgid "Built-in support for %s connectivity is %s"
msgstr ""
#: ../../mod/settings.php:542 ../../mod/dfrn_request.php:681
#: ../../include/contact_selectors.php:80
msgid "Diaspora"
msgstr ""
#: ../../mod/settings.php:542 ../../mod/settings.php:543
msgid "enabled"
msgstr ""
#: ../../mod/settings.php:542 ../../mod/settings.php:543
msgid "disabled"
msgstr ""
#: ../../mod/settings.php:543
msgid "StatusNet"
msgstr ""
#: ../../mod/settings.php:569
msgid "Connector Settings"
msgstr ""
#: ../../mod/settings.php:575
msgid "Email/Mailbox Setup"
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."
msgstr ""
#: ../../mod/settings.php:577
msgid "Last successful email check:"
msgstr ""
#: ../../mod/settings.php:578
msgid "Email access is disabled on this site."
msgstr ""
#: ../../mod/settings.php:579
msgid "IMAP server name:"
msgstr ""
#: ../../mod/settings.php:580
msgid "IMAP port:"
msgstr ""
#: ../../mod/settings.php:581
msgid "Security:"
msgstr ""
#: ../../mod/settings.php:581
msgid "None"
msgstr ""
#: ../../mod/settings.php:582
msgid "Email login name:"
msgstr ""
#: ../../mod/settings.php:583
msgid "Email password:"
msgstr ""
#: ../../mod/settings.php:584
msgid "Reply-to address:"
msgstr ""
#: ../../mod/settings.php:585
msgid "Send public posts to all email contacts:"
msgstr ""
#: ../../mod/settings.php:642 ../../mod/admin.php:126 ../../mod/admin.php:443
msgid "Normal Account"
msgstr ""
#: ../../mod/settings.php:643
msgid "This account is a normal personal profile"
msgstr ""
#: ../../mod/settings.php:646 ../../mod/admin.php:127 ../../mod/admin.php:444
msgid "Soapbox Account"
msgstr ""
#: ../../mod/settings.php:647
msgid "Automatically approve all connection/friend requests as read-only fans"
msgstr ""
#: ../../mod/settings.php:650 ../../mod/admin.php:128 ../../mod/admin.php:445
msgid "Community/Celebrity Account"
msgstr ""
#: ../../mod/settings.php:651
msgid "Automatically approve all connection/friend requests as read-write fans"
msgstr ""
#: ../../mod/settings.php:654 ../../mod/admin.php:129 ../../mod/admin.php:446
msgid "Automatic Friend Account"
msgstr ""
#: ../../mod/settings.php:655
msgid "Automatically approve all connection/friend requests as friends"
msgstr ""
#: ../../mod/settings.php:665
msgid "OpenID:"
msgstr ""
#: ../../mod/settings.php:665
msgid "(Optional) Allow this OpenID to login to this account."
msgstr ""
#: ../../mod/settings.php:675
msgid "Publish your default profile in your local site directory?"
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"
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"
msgstr ""
#: ../../mod/settings.php:681
msgid "Publish your default profile in the global social directory?"
msgstr ""
#: ../../mod/settings.php:689
msgid "Hide your contact/friend list from viewers of your default profile?"
msgstr ""
#: ../../mod/settings.php:693
msgid "Hide your profile details from unknown viewers?"
msgstr ""
#: ../../mod/settings.php:698
msgid "Allow friends to post to your profile page?"
msgstr ""
#: ../../mod/settings.php:704
msgid "Allow friends to tag your posts?"
msgstr ""
#: ../../mod/settings.php:710
msgid "Allow us to suggest you as a potential friend to new members?"
msgstr ""
#: ../../mod/settings.php:719
msgid "Profile is <strong>not published</strong>."
msgstr ""
#: ../../mod/settings.php:738 ../../mod/profile_photo.php:206
msgid "or"
msgstr ""
#: ../../mod/settings.php:743
msgid "Your Identity Address is"
msgstr ""
#: ../../mod/settings.php:754
msgid "Automatically expire posts after days:"
msgstr ""
#: ../../mod/settings.php:754
msgid "If empty, posts will not expire. Expired posts will be deleted"
msgstr ""
#: ../../mod/settings.php:755
msgid "Advanced expiration settings"
msgstr ""
#: ../../mod/settings.php:756
msgid "Advanced Expiration"
msgstr ""
#: ../../mod/settings.php:757
msgid "Expire posts:"
msgstr ""
#: ../../mod/settings.php:758
msgid "Expire personal notes:"
msgstr ""
#: ../../mod/settings.php:759
msgid "Expire starred posts:"
msgstr ""
#: ../../mod/settings.php:760
msgid "Expire photos:"
msgstr ""
#: ../../mod/settings.php:765
msgid "Account Settings"
msgstr ""
#: ../../mod/settings.php:773
msgid "Password Settings"
msgstr ""
#: ../../mod/settings.php:774
msgid "New Password:"
msgstr ""
#: ../../mod/settings.php:775
msgid "Confirm:"
msgstr ""
#: ../../mod/settings.php:775
msgid "Leave password fields blank unless changing"
msgstr ""
#: ../../mod/settings.php:779
msgid "Basic Settings"
msgstr ""
#: ../../mod/settings.php:780 ../../include/profile_advanced.php:15
msgid "Full Name:"
msgstr ""
#: ../../mod/settings.php:781
msgid "Email Address:"
msgstr ""
#: ../../mod/settings.php:782
msgid "Your Timezone:"
msgstr ""
#: ../../mod/settings.php:783
msgid "Default Post Location:"
msgstr ""
#: ../../mod/settings.php:784
msgid "Use Browser Location:"
msgstr ""
#: ../../mod/settings.php:785
msgid "Display Theme:"
msgstr ""
#: ../../mod/settings.php:786
msgid "Update browser every xx seconds"
msgstr ""
#: ../../mod/settings.php:786
msgid "Minimum of 10 seconds, no maximum"
msgstr ""
#: ../../mod/settings.php:788
msgid "Security and Privacy Settings"
msgstr ""
#: ../../mod/settings.php:790
msgid "Maximum Friend Requests/Day:"
msgstr ""
#: ../../mod/settings.php:790
msgid "(to prevent spam abuse)"
msgstr ""
#: ../../mod/settings.php:791
msgid "Default Post Permissions"
msgstr ""
#: ../../mod/settings.php:792
msgid "(click to open/close)"
msgstr ""
#: ../../mod/settings.php:807
msgid "Notification Settings"
msgstr ""
#: ../../mod/settings.php:808
msgid "Send a notification email when:"
msgstr ""
#: ../../mod/settings.php:809
msgid "You receive an introduction"
msgstr ""
#: ../../mod/settings.php:810
msgid "Your introductions are confirmed"
msgstr ""
#: ../../mod/settings.php:811
msgid "Someone writes on your profile wall"
msgstr ""
#: ../../mod/settings.php:812
msgid "Someone writes a followup comment"
msgstr ""
#: ../../mod/settings.php:813
msgid "You receive a private message"
msgstr ""
#: ../../mod/settings.php:814
msgid "You receive a friend suggestion"
msgstr ""
#: ../../mod/settings.php:817
msgid "Advanced Page Settings"
msgstr ""
#: ../../mod/crepair.php:100
msgid "Contact settings applied."
msgstr ""
#: ../../mod/crepair.php:102
msgid "Contact update failed."
msgstr ""
#: ../../mod/crepair.php:127 ../../mod/fsuggest.php:20
#: ../../mod/fsuggest.php:92 ../../mod/dfrn_confirm.php:116
msgid "Contact not found."
msgstr ""
#: ../../mod/crepair.php:133
msgid "Repair Contact Settings"
msgstr ""
#: ../../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 ""
#: ../../mod/crepair.php:136
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"
msgstr ""
#: ../../mod/crepair.php:148
msgid "Friend Request URL"
msgstr ""
#: ../../mod/crepair.php:149
msgid "Friend Confirm URL"
msgstr ""
#: ../../mod/crepair.php:150
msgid "Notification Endpoint URL"
msgstr ""
#: ../../mod/crepair.php:151
msgid "Poll/Feed URL"
msgstr ""
#: ../../mod/crepair.php:152
msgid "New photo from this URL"
msgstr ""
#: ../../mod/dfrn_request.php:92
msgid "This introduction has already been accepted."
msgstr ""
#: ../../mod/dfrn_request.php:116 ../../mod/dfrn_request.php:381
msgid "Profile location is not valid or does not contain profile information."
msgstr ""
#: ../../mod/dfrn_request.php:121 ../../mod/dfrn_request.php:386
msgid "Warning: profile location has no identifiable owner name."
msgstr ""
#: ../../mod/dfrn_request.php:123 ../../mod/dfrn_request.php:388
msgid "Warning: profile location has no profile photo."
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."
msgstr ""
#: ../../mod/dfrn_request.php:191
msgid "Unrecoverable protocol error."
msgstr ""
#: ../../mod/dfrn_request.php:219
msgid "Profile unavailable."
msgstr ""
#: ../../mod/dfrn_request.php:244
#, php-format
msgid "%s has received too many connection requests today."
msgstr ""
#: ../../mod/dfrn_request.php:245
msgid "Spam protection measures have been invoked."
msgstr ""
#: ../../mod/dfrn_request.php:246
msgid "Friends are advised to please try again in 24 hours."
msgstr ""
#: ../../mod/dfrn_request.php:306
msgid "Invalid locator"
msgstr ""
#: ../../mod/dfrn_request.php:326
msgid "Unable to resolve your name at the provided location."
msgstr ""
#: ../../mod/dfrn_request.php:339
msgid "You have already introduced yourself here."
msgstr ""
#: ../../mod/dfrn_request.php:343
#, php-format
msgid "Apparently you are already friends with %s."
msgstr ""
#: ../../mod/dfrn_request.php:364
msgid "Invalid profile URL."
msgstr ""
#: ../../mod/dfrn_request.php:460
msgid "Your introduction has been sent."
msgstr ""
#: ../../mod/dfrn_request.php:513
msgid "Please login to confirm introduction."
msgstr ""
#: ../../mod/dfrn_request.php:527
msgid ""
"Incorrect identity currently logged in. Please login to <strong>this</"
"strong> profile."
msgstr ""
#: ../../mod/dfrn_request.php:539
#, php-format
msgid "Welcome home %s."
msgstr ""
#: ../../mod/dfrn_request.php:540
#, 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]"
msgstr ""
#: ../../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/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"
msgstr ""
#: ../../mod/dfrn_request.php:672
msgid ""
"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
"testuser@identi.ca"
msgstr ""
#: ../../mod/dfrn_request.php:673
msgid "Please answer the following:"
msgstr ""
#: ../../mod/dfrn_request.php:674
#, php-format
msgid "Does %s know you?"
msgstr ""
#: ../../mod/dfrn_request.php:677
msgid "Add a personal note:"
msgstr ""
#: ../../mod/dfrn_request.php:679 ../../include/contact_selectors.php:76
msgid "Friendica"
msgstr ""
#: ../../mod/dfrn_request.php:680
msgid "StatusNet/Federated Social Web"
msgstr ""
#: ../../mod/dfrn_request.php:682
msgid "- please share from your own site as noted above"
msgstr ""
#: ../../mod/dfrn_request.php:683
msgid "Your Identity Address:"
msgstr ""
#: ../../mod/dfrn_request.php:684
msgid "Submit Request"
msgstr ""
#: ../../mod/notifications.php:26
msgid "Invalid request identifier."
msgstr ""
#: ../../mod/notifications.php:35 ../../mod/notifications.php:150
#: ../../mod/notifications.php:195
msgid "Discard"
msgstr ""
#: ../../mod/notifications.php:71 ../../include/nav.php:109
msgid "Network"
msgstr ""
#: ../../mod/notifications.php:76 ../../mod/network.php:169
msgid "Personal"
msgstr ""
#: ../../mod/notifications.php:81 ../../include/nav.php:73
#: ../../include/nav.php:111
msgid "Home"
msgstr ""
#: ../../mod/notifications.php:86 ../../include/nav.php:117
msgid "Introductions"
msgstr ""
#: ../../mod/notifications.php:91 ../../mod/message.php:76
#: ../../include/nav.php:122
msgid "Messages"
msgstr ""
#: ../../mod/notifications.php:110
msgid "Show Ignored Requests"
msgstr ""
#: ../../mod/notifications.php:110
msgid "Hide Ignored Requests"
msgstr ""
#: ../../mod/notifications.php:136 ../../mod/notifications.php:180
msgid "Notification type: "
msgstr ""
#: ../../mod/notifications.php:137
msgid "Friend Suggestion"
msgstr ""
#: ../../mod/notifications.php:139
#, php-format
msgid "suggested by %s"
msgstr ""
#: ../../mod/notifications.php:146 ../../mod/notifications.php:192
#: ../../mod/admin.php:466
msgid "Approve"
msgstr ""
#: ../../mod/notifications.php:166
msgid "Claims to be known to you: "
msgstr ""
#: ../../mod/notifications.php:166
msgid "yes"
msgstr ""
#: ../../mod/notifications.php:166
msgid "no"
msgstr ""
#: ../../mod/notifications.php:173
msgid "Approve as: "
msgstr ""
#: ../../mod/notifications.php:174
msgid "Friend"
msgstr ""
#: ../../mod/notifications.php:175
msgid "Sharer"
msgstr ""
#: ../../mod/notifications.php:175
msgid "Fan/Admirer"
msgstr ""
#: ../../mod/notifications.php:181
msgid "Friend/Connect Request"
msgstr ""
#: ../../mod/notifications.php:181
msgid "New Follower"
msgstr ""
#: ../../mod/notifications.php:201
msgid "No introductions."
msgstr ""
#: ../../mod/notifications.php:204 ../../mod/notifications.php:290
#: ../../mod/notifications.php:385 ../../mod/notifications.php:466
#: ../../include/nav.php:118
msgid "Notifications"
msgstr ""
#: ../../mod/notifications.php:241 ../../mod/notifications.php:336
#: ../../mod/notifications.php:423
#, php-format
msgid "%s liked %s's post"
msgstr ""
#: ../../mod/notifications.php:250 ../../mod/notifications.php:345
#: ../../mod/notifications.php:432
#, php-format
msgid "%s disliked %s's post"
msgstr ""
#: ../../mod/notifications.php:264 ../../mod/notifications.php:359
#: ../../mod/notifications.php:446
#, php-format
msgid "%s is now friends with %s"
msgstr ""
#: ../../mod/notifications.php:271 ../../mod/notifications.php:366
#, php-format
msgid "%s created a new post"
msgstr ""
#: ../../mod/notifications.php:272 ../../mod/notifications.php:367
#: ../../mod/notifications.php:455
#, php-format
msgid "%s commented on %s's post"
msgstr ""
#: ../../mod/notifications.php:286
msgid "No more network notifications."
msgstr ""
#: ../../mod/notifications.php:381
msgid "No more personal notifications."
msgstr ""
#: ../../mod/notifications.php:462
msgid "No more home notifications."
msgstr ""
#: ../../mod/message.php:23
msgid "No recipient selected."
msgstr ""
#: ../../mod/message.php:26
msgid "Unable to locate contact information."
msgstr ""
#: ../../mod/message.php:29
msgid "Message could not be sent."
msgstr ""
#: ../../mod/message.php:32
msgid "Message collection failure."
msgstr ""
#: ../../mod/message.php:35
msgid "Message sent."
msgstr ""
#: ../../mod/message.php:55
msgid "Inbox"
msgstr ""
#: ../../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:815
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:153 ../../mod/message.php:294
#: ../../mod/editpost.php:91 ../../include/conversation.php:863
msgid "Upload photo"
msgstr ""
#: ../../mod/message.php:154 ../../mod/message.php:295
#: ../../mod/editpost.php:93 ../../include/conversation.php:867
msgid "Insert web link"
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"
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/wall_upload.php:56 ../../mod/profile_photo.php:113
#, php-format
msgid "Image exceeds size limit of %d"
msgstr ""
#: ../../mod/wall_upload.php:65 ../../mod/profile_photo.php:122
#: ../../mod/photos.php:649
msgid "Unable to process image."
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"
msgstr ""
#: ../../mod/wall_upload.php:84 ../../mod/profile_photo.php:251
#: ../../mod/photos.php:669
msgid "Image upload failed."
msgstr ""
#: ../../mod/wall_attach.php:57
#, php-format
msgid "File exceeds size limit of %d"
msgstr ""
#: ../../mod/wall_attach.php:87 ../../mod/wall_attach.php:98
msgid "File upload failed."
msgstr ""
#: ../../mod/profile_photo.php:28
msgid "Image uploaded but image cropping failed."
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"
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."
msgstr ""
#: ../../mod/profile_photo.php:89
msgid ""
"Shift-reload the page or clear browser cache if the new photo does not "
"display immediately."
msgstr ""
#: ../../mod/profile_photo.php:99
msgid "Unable to process image"
msgstr ""
#: ../../mod/profile_photo.php:203
msgid "Upload File:"
msgstr ""
#: ../../mod/profile_photo.php:204
msgid "Upload Profile Photo"
msgstr ""
#: ../../mod/profile_photo.php:205
msgid "Upload"
msgstr ""
#: ../../mod/profile_photo.php:206
msgid "skip this step"
msgstr ""
#: ../../mod/profile_photo.php:206
msgid "select a photo from your photo albums"
msgstr ""
#: ../../mod/profile_photo.php:219
msgid "Crop Image"
msgstr ""
#: ../../mod/profile_photo.php:220
msgid "Please adjust the image cropping for optimum viewing."
msgstr ""
#: ../../mod/profile_photo.php:221
msgid "Done Editing"
msgstr ""
#: ../../mod/profile_photo.php:249
msgid "Image uploaded successfully."
msgstr ""
#: ../../mod/manage.php:37
#, php-format
msgid "Welcome back %s"
msgstr ""
#: ../../mod/manage.php:87
msgid "Manage Identities and/or Pages"
msgstr ""
#: ../../mod/manage.php:90
msgid ""
"(Toggle between different identities or community/group pages which share "
"your account details.)"
msgstr ""
#: ../../mod/manage.php:92
msgid "Select an identity to manage: "
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"
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"
msgstr ""
#: ../../mod/tagger.php:103 ../../include/conversation.php:116
#, php-format
msgid "%1$s tagged %2$s's %3$s with %4$s"
msgstr ""
#: ../../mod/common.php:34
msgid "Common Friends"
msgstr ""
#: ../../mod/common.php:42
msgid "No friends in common."
msgstr ""
#: ../../mod/profiles.php:21 ../../mod/profiles.php:239
#: ../../mod/profiles.php:344 ../../mod/dfrn_confirm.php:62
msgid "Profile not found."
msgstr ""
#: ../../mod/profiles.php:28
msgid "Profile Name is required."
msgstr ""
#: ../../mod/profiles.php:198
msgid "Profile updated."
msgstr ""
#: ../../mod/profiles.php:256
msgid "Profile deleted."
msgstr ""
#: ../../mod/profiles.php:272 ../../mod/profiles.php:303
msgid "Profile-"
msgstr ""
#: ../../mod/profiles.php:291 ../../mod/profiles.php:330
msgid "New profile created."
msgstr ""
#: ../../mod/profiles.php:309
msgid "Profile unavailable to clone."
msgstr ""
#: ../../mod/profiles.php:356
msgid "Hide your contact/friend list from viewers of this profile?"
msgstr ""
#: ../../mod/profiles.php:374
msgid "Edit Profile Details"
msgstr ""
#: ../../mod/profiles.php:376
msgid "View this profile"
msgstr ""
#: ../../mod/profiles.php:377
msgid "Create a new profile using these settings"
msgstr ""
#: ../../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/profiles.php:384
#, php-format
msgid "Birthday (%s):"
msgstr ""
#: ../../mod/profiles.php:385
msgid "Street Address:"
msgstr ""
#: ../../mod/profiles.php:386
msgid "Locality/City:"
msgstr ""
#: ../../mod/profiles.php:387
msgid "Postal/Zip Code:"
msgstr ""
#: ../../mod/profiles.php:388
msgid "Country:"
msgstr ""
#: ../../mod/profiles.php:389
msgid "Region/State:"
msgstr ""
#: ../../mod/profiles.php:390
msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
msgstr ""
#: ../../mod/profiles.php:391
msgid "Who: (if applicable)"
msgstr ""
#: ../../mod/profiles.php:392
msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
msgstr ""
#: ../../mod/profiles.php:393 ../../include/profile_advanced.php:43
msgid "Sexual Preference:"
msgstr ""
#: ../../mod/profiles.php:394
msgid "Homepage URL:"
msgstr ""
#: ../../mod/profiles.php:395 ../../include/profile_advanced.php:47
msgid "Political Views:"
msgstr ""
#: ../../mod/profiles.php:396
msgid "Religious Views:"
msgstr ""
#: ../../mod/profiles.php:397
msgid "Public Keywords:"
msgstr ""
#: ../../mod/profiles.php:398
msgid "Private Keywords:"
msgstr ""
#: ../../mod/profiles.php:399
msgid "Example: fishing photography software"
msgstr ""
#: ../../mod/profiles.php:400
msgid "(Used for suggesting potential friends, can be seen by others)"
msgstr ""
#: ../../mod/profiles.php:401
msgid "(Used for searching profiles, never shown to others)"
msgstr ""
#: ../../mod/profiles.php:402
msgid "Tell us about yourself..."
msgstr ""
#: ../../mod/profiles.php:403
msgid "Hobbies/Interests"
msgstr ""
#: ../../mod/profiles.php:404
msgid "Contact information and Social Networks"
msgstr ""
#: ../../mod/profiles.php:405
msgid "Musical interests"
msgstr ""
#: ../../mod/profiles.php:406
msgid "Books, literature"
msgstr ""
#: ../../mod/profiles.php:407
msgid "Television"
msgstr ""
#: ../../mod/profiles.php:408
msgid "Film/dance/culture/entertainment"
msgstr ""
#: ../../mod/profiles.php:409
msgid "Love/romance"
msgstr ""
#: ../../mod/profiles.php:410
msgid "Work/employment"
msgstr ""
#: ../../mod/profiles.php:411
msgid "School/education"
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."
msgstr ""
#: ../../mod/profiles.php:461
msgid "Edit/Manage Profiles"
msgstr ""
#: ../../mod/profiles.php:462 ../../boot.php:927
msgid "Change profile photo"
msgstr ""
#: ../../mod/profiles.php:463 ../../boot.php:928
msgid "Create New Profile"
msgstr ""
#: ../../mod/profiles.php:473 ../../boot.php:938
msgid "Profile Image"
msgstr ""
#: ../../mod/profiles.php:475 ../../boot.php:941
msgid "visible to everybody"
msgstr ""
#: ../../mod/profiles.php:476 ../../boot.php:942
msgid "Edit visibility"
msgstr ""
#: ../../mod/openid.php:63 ../../mod/openid.php:123 ../../include/auth.php:122
#: ../../include/auth.php:147 ../../include/auth.php:201
msgid "Login failed."
msgstr ""
#: ../../mod/openid.php:79 ../../include/auth.php:217
msgid "Welcome "
msgstr ""
#: ../../mod/openid.php:80 ../../include/auth.php:218
msgid "Please upload a profile photo."
msgstr ""
#: ../../mod/openid.php:83 ../../include/auth.php:221
msgid "Welcome back "
msgstr ""
#: ../../mod/localtime.php:12 ../../include/event.php:11
#: ../../include/bb2diaspora.php:237
msgid "l F d, Y \\@ g:i A"
msgstr ""
#: ../../mod/localtime.php:24
msgid "Time Conversion"
msgstr ""
#: ../../mod/localtime.php:26
msgid ""
"Friendika provides this service for sharing events with other networks and "
"friends in unknown timezones."
msgstr ""
#: ../../mod/localtime.php:30
#, php-format
msgid "UTC time: %s"
msgstr ""
#: ../../mod/localtime.php:33
#, php-format
msgid "Current timezone: %s"
msgstr ""
#: ../../mod/localtime.php:36
#, php-format
msgid "Converted localtime: %s"
msgstr ""
#: ../../mod/localtime.php:41
msgid "Please select your timezone:"
msgstr ""
#: ../../mod/invite.php:35
#, php-format
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/invite.php:92
msgid "You have no more invitations available"
msgstr ""
#: ../../mod/invite.php:99
msgid "Send invitations"
msgstr ""
#: ../../mod/invite.php:100
msgid "Enter email addresses, one per line:"
msgstr ""
#: ../../mod/invite.php:102
#, php-format
msgid "Please join my social network on %s"
msgstr ""
#: ../../mod/invite.php:103
msgid "To accept this invitation, please visit:"
msgstr ""
#: ../../mod/invite.php:104
msgid "You will need to supply this invitation code: $invite_code"
msgstr ""
#: ../../mod/invite.php:104
msgid ""
"Once you have registered, please connect with me via my profile page at:"
#: ../../mod/viewcontacts.php:40
msgid "No contacts."
msgstr ""
#: ../../mod/register.php:62
@ -1974,13 +2367,6 @@ msgstr ""
msgid "Registration details for %s"
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"
msgstr ""
#: ../../mod/register.php:386
msgid ""
"Registration successful. Please check your email for further instructions."
@ -2060,207 +2446,44 @@ msgstr ""
msgid "Choose a nickname: "
msgstr ""
#: ../../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 ""
#: ../../mod/apps.php:4
msgid "Applications"
#: ../../mod/dirfind.php:23
msgid "People Search"
msgstr ""
#: ../../mod/apps.php:7
msgid "No installed applications."
#: ../../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/hcard.php:10
msgid "No profile"
msgstr ""
#: ../../mod/fsuggest.php:63
msgid "Friend suggestion sent."
msgstr ""
#: ../../mod/fsuggest.php:97
msgid "Suggest Friends"
msgstr ""
#: ../../mod/fsuggest.php:99
#: ../../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 "Suggest a friend for %s"
msgid "%1$s likes %2$s's %3$s"
msgstr ""
#: ../../mod/ping.php:148
msgid "{0} wants to be your friend"
msgstr ""
#: ../../mod/ping.php:153
msgid "{0} sent you a message"
msgstr ""
#: ../../mod/ping.php:158
msgid "{0} requested registration"
msgstr ""
#: ../../mod/ping.php:164
#: ../../mod/like.php:146 ../../include/conversation.php:46
#, php-format
msgid "{0} commented %s's post"
msgid "%1$s doesn't like %2$s's %3$s"
msgstr ""
#: ../../mod/ping.php:169
#, php-format
msgid "{0} liked %s's post"
#: ../../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/ping.php:174
#, php-format
msgid "{0} disliked %s's post"
msgstr ""
#: ../../mod/ping.php:179
#, php-format
msgid "{0} is now friends with %s"
msgstr ""
#: ../../mod/ping.php:184
msgid "{0} posted"
msgstr ""
#: ../../mod/ping.php:189
#, php-format
msgid "{0} tagged %s's post with #%s"
msgstr ""
#: ../../mod/ping.php:195
msgid "{0} mentioned you in a post"
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 "Password reset requested at %s"
msgstr ""
#: ../../mod/lostpass.php:64
msgid ""
"Request could not be verified. (You may have previously submitted it.) "
"Password reset failed."
msgstr ""
#: ../../mod/lostpass.php:82 ../../boot.php:714
msgid "Password Reset"
msgstr ""
#: ../../mod/lostpass.php:83
msgid "Your password has been reset as requested."
msgstr ""
#: ../../mod/lostpass.php:84
msgid "Your new password is"
msgstr ""
#: ../../mod/lostpass.php:85
msgid "Save or copy your new password - and then"
msgstr ""
#: ../../mod/lostpass.php:86
msgid "click here to login"
msgstr ""
#: ../../mod/lostpass.php:87
msgid ""
"Your password may be changed from the <em>Settings</em> page after "
"successful login."
msgstr ""
#: ../../mod/lostpass.php:118
msgid "Forgot your Password?"
msgstr ""
#: ../../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/lostpass.php:120
msgid "Nickname or Email: "
msgstr ""
#: ../../mod/lostpass.php:121
msgid "Reset"
msgstr ""
#: ../../mod/editpost.php:17 ../../mod/editpost.php:27
msgid "Item not found"
msgstr ""
#: ../../mod/editpost.php:32
msgid "Edit post"
msgstr ""
#: ../../mod/editpost.php:75 ../../include/conversation.php:848
msgid "Post to Email"
msgstr ""
#: ../../mod/editpost.php:92 ../../include/conversation.php:865
msgid "Attach file"
msgstr ""
#: ../../mod/editpost.php:94
msgid "Insert YouTube video"
msgstr ""
#: ../../mod/editpost.php:95
msgid "Insert Vorbis [.ogg] video"
msgstr ""
#: ../../mod/editpost.php:96
msgid "Insert Vorbis [.ogg] audio"
msgstr ""
#: ../../mod/editpost.php:97 ../../include/conversation.php:873
msgid "Set your location"
msgstr ""
#: ../../mod/editpost.php:98 ../../include/conversation.php:875
msgid "Clear browser location"
msgstr ""
#: ../../mod/editpost.php:100 ../../include/conversation.php:880
msgid "Permission settings"
msgstr ""
#: ../../mod/editpost.php:108 ../../include/conversation.php:889
msgid "CC: email addresses"
msgstr ""
#: ../../mod/editpost.php:109 ../../include/conversation.php:890
msgid "Public post"
msgstr ""
#: ../../mod/editpost.php:111 ../../include/conversation.php:892
msgid "Example: bob@example.com, mary@example.com"
msgstr ""
#: ../../mod/removeme.php:42 ../../mod/removeme.php:45
msgid "Remove My Account"
msgstr ""
#: ../../mod/removeme.php:43
msgid ""
"This will completely remove your account. Once this has been done it is not "
"recoverable."
msgstr ""
#: ../../mod/removeme.php:44
msgid "Please enter your password for verification:"
#: ../../mod/viewsrc.php:7 ../../mod/viewd.php:6
msgid "Access denied."
msgstr ""
#: ../../mod/regmod.php:61
@ -2276,274 +2499,217 @@ msgstr ""
msgid "Please login."
msgstr ""
#: ../../mod/install.php:111
msgid "Friendica Social Communications Server - Setup"
#: ../../mod/item.php:88
msgid "Unable to locate original post."
msgstr ""
#: ../../mod/install.php:117 ../../mod/install.php:157
#: ../../mod/install.php:229
msgid "Database connection"
#: ../../mod/item.php:248
msgid "Empty post discarded."
msgstr ""
#: ../../mod/install.php:124
msgid "Could not connect to database."
#: ../../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/install.php:128
msgid "Could not create table."
#: ../../mod/item.php:827
msgid "System error. Post not saved."
msgstr ""
#: ../../mod/install.php:133
msgid "Your Friendica site database has been installed."
msgstr ""
#: ../../mod/install.php:134
#: ../../mod/item.php:852
#, php-format
msgid ""
"IMPORTANT: You will need to [manually] setup a scheduled task for the poller."
"This message was sent to you by %s, a member of the Friendica social network."
msgstr ""
#: ../../mod/install.php:135 ../../mod/install.php:151
#: ../../mod/install.php:209
msgid "Please see the file \"INSTALL.txt\"."
#: ../../mod/item.php:854
#, php-format
msgid "You may visit them online at %s"
msgstr ""
#: ../../mod/install.php:137
msgid "Proceed to registration"
msgstr ""
#: ../../mod/install.php:143
msgid "Proceed with Installation"
msgstr ""
#: ../../mod/install.php:150
#: ../../mod/item.php:855
msgid ""
"You may need to import the file \"database.sql\" manually using phpmyadmin "
"or mysql."
"Please contact the sender by replying to this post if you do not wish to "
"receive these messages."
msgstr ""
#: ../../mod/install.php:158
msgid "Database import failed."
#: ../../mod/item.php:857
#, php-format
msgid "%s posted an update."
msgstr ""
#: ../../mod/install.php:206
msgid "System check"
#: ../../mod/profile_photo.php:28
msgid "Image uploaded but image cropping failed."
msgstr ""
#: ../../mod/install.php:210 ../../mod/events.php:213
msgid "Next"
#: ../../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:211
msgid "Check again"
msgstr ""
#: ../../mod/install.php:230
#: ../../mod/profile_photo.php:89
msgid ""
"In order to install Friendica we need to know how to connect to your "
"database."
"Shift-reload the page or clear browser cache if the new photo does not "
"display immediately."
msgstr ""
#: ../../mod/install.php:231
#: ../../mod/profile_photo.php:99
msgid "Unable to process image"
msgstr ""
#: ../../mod/profile_photo.php:113 ../../mod/wall_upload.php:56
#, php-format
msgid "Image exceeds size limit of %d"
msgstr ""
#: ../../mod/profile_photo.php:203
msgid "Upload File:"
msgstr ""
#: ../../mod/profile_photo.php:204
msgid "Upload Profile Photo"
msgstr ""
#: ../../mod/profile_photo.php:205
msgid "Upload"
msgstr ""
#: ../../mod/profile_photo.php:206
msgid "skip this step"
msgstr ""
#: ../../mod/profile_photo.php:206
msgid "select a photo from your photo albums"
msgstr ""
#: ../../mod/profile_photo.php:219
msgid "Crop Image"
msgstr ""
#: ../../mod/profile_photo.php:220
msgid "Please adjust the image cropping for optimum viewing."
msgstr ""
#: ../../mod/profile_photo.php:221
msgid "Done Editing"
msgstr ""
#: ../../mod/profile_photo.php:249
msgid "Image uploaded successfully."
msgstr ""
#: ../../mod/hcard.php:10
msgid "No profile"
msgstr ""
#: ../../mod/removeme.php:45 ../../mod/removeme.php:48
msgid "Remove My Account"
msgstr ""
#: ../../mod/removeme.php:46
msgid ""
"Please contact your hosting provider or site administrator if you have "
"questions about these settings."
"This will completely remove your account. Once this has been done it is not "
"recoverable."
msgstr ""
#: ../../mod/install.php:232
msgid ""
"The database you specify below should already exist. If it does not, please "
"create it before continuing."
#: ../../mod/removeme.php:47
msgid "Please enter your password for verification:"
msgstr ""
#: ../../mod/install.php:236
msgid "Database Server Name"
#: ../../mod/message.php:23
msgid "No recipient selected."
msgstr ""
#: ../../mod/install.php:237
msgid "Database Login Name"
#: ../../mod/message.php:26
msgid "Unable to locate contact information."
msgstr ""
#: ../../mod/install.php:238
msgid "Database Login Password"
#: ../../mod/message.php:29
msgid "Message could not be sent."
msgstr ""
#: ../../mod/install.php:239
msgid "Database Name"
#: ../../mod/message.php:32
msgid "Message collection failure."
msgstr ""
#: ../../mod/install.php:240 ../../mod/install.php:279
msgid "Site administrator email address"
#: ../../mod/message.php:35
msgid "Message sent."
msgstr ""
#: ../../mod/install.php:240 ../../mod/install.php:279
msgid ""
"Your account email address must match this in order to use the web admin "
"panel."
#: ../../mod/message.php:55
msgid "Inbox"
msgstr ""
#: ../../mod/install.php:244 ../../mod/install.php:282
msgid "Please select a default timezone for your website"
#: ../../mod/message.php:60
msgid "Outbox"
msgstr ""
#: ../../mod/install.php:269
msgid "Site settings"
#: ../../mod/message.php:65
msgid "New Message"
msgstr ""
#: ../../mod/install.php:322
msgid "Could not find a command line version of PHP in the web server PATH."
#: ../../mod/message.php:91
msgid "Message deleted."
msgstr ""
#: ../../mod/install.php:325
msgid "PHP executable path"
#: ../../mod/message.php:121
msgid "Conversation removed."
msgstr ""
#: ../../mod/install.php:325
msgid "Enter full path to php executable"
#: ../../mod/message.php:137 ../../include/conversation.php:843
msgid "Please enter a link URL:"
msgstr ""
#: ../../mod/install.php:330
msgid "Command line PHP"
#: ../../mod/message.php:145
msgid "Send Private Message"
msgstr ""
#: ../../mod/install.php:339
msgid ""
"The command line version of PHP on your system does not have "
"\"register_argc_argv\" enabled."
#: ../../mod/message.php:146 ../../mod/message.php:287
msgid "To:"
msgstr ""
#: ../../mod/install.php:340
msgid "This is required for message delivery to work."
#: ../../mod/message.php:147 ../../mod/message.php:288
msgid "Subject:"
msgstr ""
#: ../../mod/install.php:342
msgid "PHP \"register_argc_argv\""
#: ../../mod/message.php:150 ../../mod/message.php:291
#: ../../mod/invite.php:101
msgid "Your message:"
msgstr ""
#: ../../mod/install.php:363
msgid ""
"Error: the \"openssl_pkey_new\" function on this system is not able to "
"generate encryption keys"
#: ../../mod/message.php:188
msgid "No messages."
msgstr ""
#: ../../mod/install.php:364
msgid ""
"If running under Windows, please see \"http://www.php.net/manual/en/openssl."
"installation.php\"."
#: ../../mod/message.php:201
msgid "Delete conversation"
msgstr ""
#: ../../mod/install.php:366
msgid "Generate encryption keys"
#: ../../mod/message.php:204
msgid "D, d M Y - g:i A"
msgstr ""
#: ../../mod/install.php:373
msgid "libCurl PHP module"
#: ../../mod/message.php:239
msgid "Message not available."
msgstr ""
#: ../../mod/install.php:374
msgid "GD graphics PHP module"
#: ../../mod/message.php:276
msgid "Delete message"
msgstr ""
#: ../../mod/install.php:375
msgid "OpenSSL PHP module"
#: ../../mod/message.php:286
msgid "Send Reply"
msgstr ""
#: ../../mod/install.php:376
msgid "mysqli PHP module"
#: ../../mod/allfriends.php:34
#, php-format
msgid "Friends of %s"
msgstr ""
#: ../../mod/install.php:377
msgid "mb_string PHP module"
msgstr ""
#: ../../mod/install.php:382 ../../mod/install.php:384
msgid "Apace mod_rewrite module"
msgstr ""
#: ../../mod/install.php:382
msgid ""
"Error: Apache webserver mod-rewrite module is required but not installed."
msgstr ""
#: ../../mod/install.php:389
msgid "Error: libCURL PHP module required but not installed."
msgstr ""
#: ../../mod/install.php:393
msgid ""
"Error: GD graphics PHP module with JPEG support required but not installed."
msgstr ""
#: ../../mod/install.php:397
msgid "Error: openssl PHP module required but not installed."
msgstr ""
#: ../../mod/install.php:401
msgid "Error: mysqli PHP module required but not installed."
msgstr ""
#: ../../mod/install.php:405
msgid "Error: mb_string PHP module required but not installed."
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."
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."
msgstr ""
#: ../../mod/install.php:424
msgid ""
"Please check with your site documentation or support people to see if this "
"situation can be corrected."
msgstr ""
#: ../../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 ""
#: ../../mod/install.php:428
msgid ".htconfig.php is writable"
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."
msgstr ""
#: ../../mod/install.php:460
msgid "Errors encountered creating database tables."
msgstr ""
#: ../../mod/community.php:21
msgid "Not available."
msgstr ""
#: ../../mod/community.php:30 ../../include/nav.php:97
msgid "Community"
msgstr ""
#: ../../mod/community.php:60 ../../mod/search.php:118
msgid "No results."
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."
msgstr ""
#: ../../mod/oexchange.php:27
msgid "Post successful."
#: ../../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,6 +3049,393 @@ msgstr ""
msgid "FTP Password"
msgstr ""
#: ../../mod/profile.php:15 ../../boot.php:841
msgid "Requested profile is not available."
msgstr ""
#: ../../mod/profile.php:111 ../../mod/display.php:66
msgid "Access to this profile has been restricted."
msgstr ""
#: ../../mod/profile.php:131
msgid "Tips for New Members"
msgstr ""
#: ../../mod/ping.php:148
msgid "{0} wants to be your friend"
msgstr ""
#: ../../mod/ping.php:153
msgid "{0} sent you a message"
msgstr ""
#: ../../mod/ping.php:158
msgid "{0} requested registration"
msgstr ""
#: ../../mod/ping.php:164
#, php-format
msgid "{0} commented %s's post"
msgstr ""
#: ../../mod/ping.php:169
#, php-format
msgid "{0} liked %s's post"
msgstr ""
#: ../../mod/ping.php:174
#, php-format
msgid "{0} disliked %s's post"
msgstr ""
#: ../../mod/ping.php:179
#, php-format
msgid "{0} is now friends with %s"
msgstr ""
#: ../../mod/ping.php:184
msgid "{0} posted"
msgstr ""
#: ../../mod/ping.php:189
#, php-format
msgid "{0} tagged %s's post with #%s"
msgstr ""
#: ../../mod/ping.php:195
msgid "{0} mentioned you in a post"
msgstr ""
#: ../../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/follow.php:27
msgid "Connect URL missing."
msgstr ""
#: ../../mod/follow.php:47
msgid ""
"This site is not configured to allow communications with other networks."
msgstr ""
#: ../../mod/follow.php:48 ../../mod/follow.php:58
msgid "No compatible communication protocols or feeds were discovered."
msgstr ""
#: ../../mod/follow.php:56
msgid "The profile address specified does not provide adequate information."
msgstr ""
#: ../../mod/follow.php:60
msgid "An author or name was not found."
msgstr ""
#: ../../mod/follow.php:62
msgid "No browser URL could be matched to this address."
msgstr ""
#: ../../mod/follow.php:69
msgid ""
"The profile address specified belongs to a network which has been disabled "
"on this site."
msgstr ""
#: ../../mod/follow.php:74
msgid ""
"Limited profile. This person will be unable to receive direct/personal "
"notifications from you."
msgstr ""
#: ../../mod/follow.php:144
msgid "Unable to retrieve contact information."
msgstr ""
#: ../../mod/follow.php:190
msgid "following"
msgstr ""
#: ../../mod/common.php:34
msgid "Common Friends"
msgstr ""
#: ../../mod/common.php:42
msgid "No friends in common."
msgstr ""
#: ../../mod/display.php:109
msgid "Item has been removed."
msgstr ""
#: ../../mod/apps.php:4
msgid "Applications"
msgstr ""
#: ../../mod/apps.php:7
msgid "No installed applications."
msgstr ""
#: ../../mod/search.php:83
msgid "Search This Site"
msgstr ""
#: ../../mod/profiles.php:21 ../../mod/profiles.php:239
#: ../../mod/profiles.php:344 ../../mod/dfrn_confirm.php:62
msgid "Profile not found."
msgstr ""
#: ../../mod/profiles.php:28
msgid "Profile Name is required."
msgstr ""
#: ../../mod/profiles.php:198
msgid "Profile updated."
msgstr ""
#: ../../mod/profiles.php:256
msgid "Profile deleted."
msgstr ""
#: ../../mod/profiles.php:272 ../../mod/profiles.php:303
msgid "Profile-"
msgstr ""
#: ../../mod/profiles.php:291 ../../mod/profiles.php:330
msgid "New profile created."
msgstr ""
#: ../../mod/profiles.php:309
msgid "Profile unavailable to clone."
msgstr ""
#: ../../mod/profiles.php:356
msgid "Hide your contact/friend list from viewers of this profile?"
msgstr ""
#: ../../mod/profiles.php:374
msgid "Edit Profile Details"
msgstr ""
#: ../../mod/profiles.php:376
msgid "View this profile"
msgstr ""
#: ../../mod/profiles.php:377
msgid "Create a new profile using these settings"
msgstr ""
#: ../../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/profiles.php:384
#, php-format
msgid "Birthday (%s):"
msgstr ""
#: ../../mod/profiles.php:385
msgid "Street Address:"
msgstr ""
#: ../../mod/profiles.php:386
msgid "Locality/City:"
msgstr ""
#: ../../mod/profiles.php:387
msgid "Postal/Zip Code:"
msgstr ""
#: ../../mod/profiles.php:388
msgid "Country:"
msgstr ""
#: ../../mod/profiles.php:389
msgid "Region/State:"
msgstr ""
#: ../../mod/profiles.php:390
msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
msgstr ""
#: ../../mod/profiles.php:391
msgid "Who: (if applicable)"
msgstr ""
#: ../../mod/profiles.php:392
msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
msgstr ""
#: ../../mod/profiles.php:393 ../../include/profile_advanced.php:43
msgid "Sexual Preference:"
msgstr ""
#: ../../mod/profiles.php:394
msgid "Homepage URL:"
msgstr ""
#: ../../mod/profiles.php:395 ../../include/profile_advanced.php:49
msgid "Political Views:"
msgstr ""
#: ../../mod/profiles.php:396
msgid "Religious Views:"
msgstr ""
#: ../../mod/profiles.php:397
msgid "Public Keywords:"
msgstr ""
#: ../../mod/profiles.php:398
msgid "Private Keywords:"
msgstr ""
#: ../../mod/profiles.php:399
msgid "Example: fishing photography software"
msgstr ""
#: ../../mod/profiles.php:400
msgid "(Used for suggesting potential friends, can be seen by others)"
msgstr ""
#: ../../mod/profiles.php:401
msgid "(Used for searching profiles, never shown to others)"
msgstr ""
#: ../../mod/profiles.php:402
msgid "Tell us about yourself..."
msgstr ""
#: ../../mod/profiles.php:403
msgid "Hobbies/Interests"
msgstr ""
#: ../../mod/profiles.php:404
msgid "Contact information and Social Networks"
msgstr ""
#: ../../mod/profiles.php:405
msgid "Musical interests"
msgstr ""
#: ../../mod/profiles.php:406
msgid "Books, literature"
msgstr ""
#: ../../mod/profiles.php:407
msgid "Television"
msgstr ""
#: ../../mod/profiles.php:408
msgid "Film/dance/culture/entertainment"
msgstr ""
#: ../../mod/profiles.php:409
msgid "Love/romance"
msgstr ""
#: ../../mod/profiles.php:410
msgid "Work/employment"
msgstr ""
#: ../../mod/profiles.php:411
msgid "School/education"
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."
msgstr ""
#: ../../mod/profiles.php:426 ../../mod/directory.php:122
msgid "Age: "
msgstr ""
#: ../../mod/profiles.php:461
msgid "Edit/Manage Profiles"
msgstr ""
#: ../../mod/profiles.php:462 ../../boot.php:942
msgid "Change profile photo"
msgstr ""
#: ../../mod/profiles.php:463 ../../boot.php:943
msgid "Create New Profile"
msgstr ""
#: ../../mod/profiles.php:473 ../../boot.php:953
msgid "Profile Image"
msgstr ""
#: ../../mod/profiles.php:475 ../../boot.php:956
msgid "visible to everybody"
msgstr ""
#: ../../mod/profiles.php:476 ../../boot.php:957
msgid "Edit visibility"
msgstr ""
#: ../../mod/tagger.php:103 ../../include/conversation.php:116
#, php-format
msgid "%1$s tagged %2$s's %3$s with %4$s"
msgstr ""
#: ../../mod/delegate.php:95
msgid "No potential page delegates located."
msgstr ""
#: ../../mod/delegate.php:121
msgid "Delegate Page Management"
msgstr ""
#: ../../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/delegate.php:124
msgid "Existing Page Managers"
msgstr ""
#: ../../mod/delegate.php:126
msgid "Existing Page Delegates"
msgstr ""
#: ../../mod/delegate.php:128
msgid "Potential Delegates"
msgstr ""
#: ../../mod/delegate.php:131
msgid "Add"
msgstr ""
#: ../../mod/delegate.php:132
msgid "No entries."
msgstr ""
#: ../../mod/suggest.php:38 ../../include/contact_widgets.php:35
msgid "Friend Suggestions"
msgstr ""
@ -2893,1018 +3446,945 @@ msgid ""
"hours."
msgstr ""
#: ../../mod/suggest.php:59 ../../mod/match.php:58
#: ../../include/contact_widgets.php:9 ../../boot.php:911
msgid "Connect"
msgstr ""
#: ../../mod/suggest.php:61
msgid "Ignore/Hide"
msgstr ""
#: ../../mod/display.php:66 ../../mod/profile.php:111
msgid "Access to this profile has been restricted."
#: ../../mod/directory.php:49
msgid "Global Directory"
msgstr ""
#: ../../mod/display.php:108
msgid "Item has been removed."
#: ../../mod/directory.php:55
msgid "Normal site view"
msgstr ""
#: ../../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 ""
#: ../../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/invite.php:35
#, php-format
msgid "%1$s likes %2$s's %3$s"
msgid "%s : Not a valid email address."
msgstr ""
#: ../../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"
msgid "Please join my network on %s"
msgstr ""
#: ../../mod/match.php:12
msgid "Profile Match"
#: ../../mod/invite.php:69
#, php-format
msgid "%s : Message delivery failed."
msgstr ""
#: ../../mod/match.php:20
msgid "No keywords to match. Please add keywords to your default profile."
#: ../../mod/invite.php:73
#, php-format
msgid "%d message sent."
msgid_plural "%d messages sent."
msgstr[0] ""
msgstr[1] ""
#: ../../mod/invite.php:92
msgid "You have no more invitations available"
msgstr ""
#: ../../mod/match.php:57
msgid "is interested in:"
#: ../../mod/invite.php:99
msgid "Send invitations"
msgstr ""
#: ../../mod/notes.php:44 ../../boot.php:1335
msgid "Personal Notes"
#: ../../mod/invite.php:100
msgid "Enter email addresses, one per line:"
msgstr ""
#: ../../mod/notes.php:63 ../../include/text.php:635
msgid "Save"
#: ../../mod/invite.php:102
#, php-format
msgid "Please join my social network on %s"
msgstr ""
#: ../../mod/help.php:30
msgid "Help:"
#: ../../mod/invite.php:103
msgid "To accept this invitation, please visit:"
msgstr ""
#: ../../mod/help.php:34 ../../include/nav.php:82
msgid "Help"
#: ../../mod/invite.php:104
msgid "You will need to supply this invitation code: $invite_code"
msgstr ""
#: ../../mod/help.php:38 ../../index.php:221
msgid "Not Found"
#: ../../mod/invite.php:104
msgid ""
"Once you have registered, please connect with me via my profile page at:"
msgstr ""
#: ../../mod/help.php:41 ../../index.php:224
msgid "Page not found."
msgstr ""
#: ../../mod/dfrn_confirm.php:236
#: ../../mod/dfrn_confirm.php:238
msgid "Response from remote site was not understood."
msgstr ""
#: ../../mod/dfrn_confirm.php:245
#: ../../mod/dfrn_confirm.php:247
msgid "Unexpected response from remote site: "
msgstr ""
#: ../../mod/dfrn_confirm.php:253
#: ../../mod/dfrn_confirm.php:255
msgid "Confirmation completed successfully."
msgstr ""
#: ../../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 ""
#: ../../mod/dfrn_confirm.php:267
#: ../../mod/dfrn_confirm.php:269
msgid "Temporary failure. Please wait and try again."
msgstr ""
#: ../../mod/dfrn_confirm.php:274
#: ../../mod/dfrn_confirm.php:276
msgid "Introduction failed or was revoked."
msgstr ""
#: ../../mod/dfrn_confirm.php:416
#: ../../mod/dfrn_confirm.php:421
msgid "Unable to set contact photo."
msgstr ""
#: ../../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 ""
#: ../../mod/dfrn_confirm.php:537
#: ../../mod/dfrn_confirm.php:543
#, php-format
msgid "No user record found for '%s' "
msgstr ""
#: ../../mod/dfrn_confirm.php:547
#: ../../mod/dfrn_confirm.php:553
msgid "Our site encryption key is apparently messed up."
msgstr ""
#: ../../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 ""
#: ../../mod/dfrn_confirm.php:579
#: ../../mod/dfrn_confirm.php:585
msgid "Contact record was not found for you on our site."
msgstr ""
#: ../../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 ""
#: ../../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 ""
#: ../../mod/dfrn_confirm.php:624
#: ../../mod/dfrn_confirm.php:630
msgid "Unable to set your contact credentials on our system."
msgstr ""
#: ../../mod/dfrn_confirm.php:678
#: ../../mod/dfrn_confirm.php:684
msgid "Unable to update your contact profile details on our system"
msgstr ""
#: ../../mod/dfrn_confirm.php:708
#: ../../mod/dfrn_confirm.php:714
#, php-format
msgid "Connection accepted at %s"
msgstr ""
#: ../../mod/profile.php:15 ../../boot.php:836
msgid "Requested profile is not available."
#: ../../addon/facebook/facebook.php:337
msgid "Facebook disabled"
msgstr ""
#: ../../mod/profile.php:131
msgid "Tips for New Members"
#: ../../addon/facebook/facebook.php:342
msgid "Updating contacts"
msgstr ""
#: ../../mod/item.php:89
msgid "Unable to locate original post."
#: ../../addon/facebook/facebook.php:351
msgid "Facebook API key is missing."
msgstr ""
#: ../../mod/item.php:206
msgid "Empty post discarded."
#: ../../addon/facebook/facebook.php:358
msgid "Facebook Connect"
msgstr ""
#: ../../mod/item.php:778
msgid "System error. Post not saved."
#: ../../addon/facebook/facebook.php:364
msgid "Install Facebook connector for this account."
msgstr ""
#: ../../mod/item.php:803
#, php-format
#: ../../addon/facebook/facebook.php:371
msgid "Remove Facebook connector"
msgstr ""
#: ../../addon/facebook/facebook.php:376
msgid ""
"This message was sent to you by %s, a member of the Friendica social network."
"Re-authenticate [This is necessary whenever your Facebook password is "
"changed.]"
msgstr ""
#: ../../mod/item.php:805
#, php-format
msgid "You may visit them online at %s"
#: ../../addon/facebook/facebook.php:383
msgid "Post to Facebook by default"
msgstr ""
#: ../../mod/item.php:806
#: ../../addon/facebook/facebook.php:387
msgid "Link all your Facebook friends and conversations on this website"
msgstr ""
#: ../../addon/facebook/facebook.php:389
msgid ""
"Please contact the sender by replying to this post if you do not wish to "
"receive these messages."
"Facebook conversations consist of your <em>profile wall</em> and your friend "
"<em>stream</em>."
msgstr ""
#: ../../mod/item.php:808
#: ../../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"
msgstr ""
#: ../../addon/facebook/facebook.php:400
msgid "Do not import your Facebook profile wall conversations"
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."
msgstr ""
#: ../../addon/facebook/facebook.php:407
msgid "Comma separated applications to ignore"
msgstr ""
#: ../../addon/facebook/facebook.php:475
#: ../../include/contact_selectors.php:81
msgid "Facebook"
msgstr ""
#: ../../addon/facebook/facebook.php:476
msgid "Facebook Connector Settings"
msgstr ""
#: ../../addon/facebook/facebook.php:490
msgid "Post to Facebook"
msgstr ""
#: ../../addon/facebook/facebook.php:581
msgid ""
"Post to Facebook cancelled because of multi-network access permission "
"conflict."
msgstr ""
#: ../../addon/facebook/facebook.php:650
msgid "Image: "
msgstr ""
#: ../../addon/facebook/facebook.php:727
msgid "View on Friendica"
msgstr ""
#: ../../addon/facebook/facebook.php:751
msgid "Facebook post failed. Queued for retry."
msgstr ""
#: ../../addon/facebook/facebook.php:876 ../../addon/facebook/facebook.php:885
#: ../../include/bb2diaspora.php:113
msgid "link"
msgstr ""
#: ../../addon/widgets/widget_like.php:58
#, php-format
msgid "%s posted an update."
msgstr ""
#: ../../mod/search.php:13 ../../mod/network.php:84
msgid "Saved Searches"
msgstr ""
#: ../../mod/search.php:16 ../../mod/network.php:75
msgid "Remove term"
msgstr ""
#: ../../mod/search.php:83
msgid "Search This Site"
msgstr ""
#: ../../mod/photos.php:42
msgid "Photo Albums"
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"
msgstr ""
#: ../../mod/photos.php:135
msgid "Contact information unavailable"
msgstr ""
#: ../../mod/photos.php:156
msgid "Album not found."
msgstr ""
#: ../../mod/photos.php:174 ../../mod/photos.php:947
msgid "Delete Album"
msgstr ""
#: ../../mod/photos.php:237 ../../mod/photos.php:1166
msgid "Delete Photo"
msgstr ""
#: ../../mod/photos.php:524
msgid "was tagged in a"
msgstr ""
#: ../../mod/photos.php:524
msgid "by"
msgstr ""
#: ../../mod/photos.php:627 ../../addon/js_upload/js_upload.php:312
msgid "Image exceeds size limit of "
msgstr ""
#: ../../mod/photos.php:635
msgid "Image file is empty."
msgstr ""
#: ../../mod/photos.php:764
msgid "No photos selected"
msgstr ""
#: ../../mod/photos.php:841
msgid "Access to this item is restricted."
msgstr ""
#: ../../mod/photos.php:895
msgid "Upload Photos"
msgstr ""
#: ../../mod/photos.php:898 ../../mod/photos.php:942
msgid "New album name: "
msgstr ""
#: ../../mod/photos.php:899
msgid "or existing album name: "
msgstr ""
#: ../../mod/photos.php:900
msgid "Do not show a status post for this upload"
msgstr ""
#: ../../mod/photos.php:902 ../../mod/photos.php:1161
msgid "Permissions"
msgstr ""
#: ../../mod/photos.php:957
msgid "Edit Album"
msgstr ""
#: ../../mod/photos.php:967 ../../mod/photos.php:1379
msgid "View Photo"
msgstr ""
#: ../../mod/photos.php:1002
msgid "Permission denied. Access to this item may be restricted."
msgstr ""
#: ../../mod/photos.php:1004
msgid "Photo not available"
msgstr ""
#: ../../mod/photos.php:1054
msgid "View photo"
msgstr ""
#: ../../mod/photos.php:1054
msgid "Edit photo"
msgstr ""
#: ../../mod/photos.php:1055
msgid "Use as profile photo"
msgstr ""
#: ../../mod/photos.php:1061 ../../include/conversation.php:423
msgid "Private Message"
msgstr ""
#: ../../mod/photos.php:1072
msgid "View Full Size"
msgstr ""
#: ../../mod/photos.php:1140
msgid "Tags: "
msgstr ""
#: ../../mod/photos.php:1143
msgid "[Remove any tag]"
msgstr ""
#: ../../mod/photos.php:1154
msgid "New album name"
msgstr ""
#: ../../mod/photos.php:1157
msgid "Caption"
msgstr ""
#: ../../mod/photos.php:1159
msgid "Add a Tag"
msgstr ""
#: ../../mod/photos.php:1163
msgid "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
msgstr ""
#: ../../mod/photos.php:1183 ../../include/conversation.php:470
msgid "I like this (toggle)"
msgstr ""
#: ../../mod/photos.php:1184 ../../include/conversation.php:471
msgid "I don't like this (toggle)"
msgstr ""
#: ../../mod/photos.php:1185 ../../include/conversation.php:862
msgid "Share"
msgstr ""
#: ../../mod/photos.php:1202 ../../mod/photos.php:1242
#: ../../mod/photos.php:1273 ../../include/conversation.php:485
msgid "This is you"
msgstr ""
#: ../../mod/photos.php:1204 ../../mod/photos.php:1244
#: ../../mod/photos.php:1275 ../../include/conversation.php:487
#: ../../boot.php:438
msgid "Comment"
msgstr ""
#: ../../mod/photos.php:1206 ../../include/conversation.php:489
#: ../../include/conversation.php:897
msgid "Preview"
msgstr ""
#: ../../mod/photos.php:1385
msgid "View Album"
msgstr ""
#: ../../mod/photos.php:1394
msgid "Recent Photos"
msgstr ""
#: ../../mod/photos.php:1396
msgid "Upload New Photos"
msgstr ""
#: ../../mod/network.php:43
msgid "Search Results For:"
msgstr ""
#: ../../mod/network.php:85 ../../include/group.php:216
msgid "add"
msgstr ""
#: ../../mod/network.php:158
msgid "Commented Order"
msgstr ""
#: ../../mod/network.php:163
msgid "Posted Order"
msgstr ""
#: ../../mod/network.php:174
msgid "New"
msgstr ""
#: ../../mod/network.php:179
msgid "Starred"
msgstr ""
#: ../../mod/network.php:184
msgid "Bookmarks"
msgstr ""
#: ../../mod/network.php:232
#, 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 "%d person likes this"
msgid_plural "%d people like this"
msgstr[0] ""
msgstr[1] ""
#: ../../mod/network.php:235
msgid "Private messages to this group are at risk of public disclosure."
msgstr ""
#: ../../mod/network.php:286
msgid "No such group"
msgstr ""
#: ../../mod/network.php:297
msgid "Group is empty"
msgstr ""
#: ../../mod/network.php:301
msgid "Group: "
msgstr ""
#: ../../mod/network.php:311
msgid "Contact: "
msgstr ""
#: ../../mod/network.php:313
msgid "Private messages to this person are at risk of public disclosure."
msgstr ""
#: ../../mod/network.php:318
msgid "Invalid contact."
msgstr ""
#: ../../mod/api.php:76 ../../mod/api.php:102
msgid "Authorize application connection"
msgstr ""
#: ../../mod/api.php:77
msgid "Return to your app and insert this Securty Code:"
msgstr ""
#: ../../mod/api.php:89
msgid "Please login to continue."
msgstr ""
#: ../../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/friendica.php:43
msgid "This is Friendica, version"
msgstr ""
#: ../../mod/friendica.php:44
msgid "running at web location"
msgstr ""
#: ../../mod/friendica.php:46
msgid ""
"Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn "
"more about the Friendica project."
msgstr ""
#: ../../mod/friendica.php:48
msgid "Bug reports and issues: please visit"
msgstr ""
#: ../../mod/friendica.php:49
msgid ""
"Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - "
"dot com"
msgstr ""
#: ../../mod/friendica.php:54
msgid "Installed plugins/addons/apps"
msgstr ""
#: ../../mod/friendica.php:62
msgid "No installed plugins/addons/apps"
msgstr ""
#: ../../mod/attach.php:8
msgid "Item not available."
msgstr ""
#: ../../mod/attach.php:20
msgid "Item was not found."
msgstr ""
#: ../../mod/viewcontacts.php:25 ../../include/text.php:574
msgid "View Contacts"
msgstr ""
#: ../../mod/viewcontacts.php:40
msgid "No contacts."
msgstr ""
#: ../../mod/tagrm.php:41
msgid "Tag removed"
msgstr ""
#: ../../mod/tagrm.php:79
msgid "Remove Item Tag"
msgstr ""
#: ../../mod/tagrm.php:81
msgid "Select a tag to remove: "
msgstr ""
#: ../../mod/tagrm.php:93
msgid "Remove"
msgstr ""
#: ../../mod/group.php:27
msgid "Group created."
msgstr ""
#: ../../mod/group.php:33
msgid "Could not create group."
msgstr ""
#: ../../mod/group.php:43 ../../mod/group.php:123
msgid "Group not found."
msgstr ""
#: ../../mod/group.php:56
msgid "Group name changed."
msgstr ""
#: ../../mod/group.php:67 ../../mod/profperm.php:19 ../../index.php:287
msgid "Permission denied"
msgstr ""
#: ../../mod/group.php:82
msgid "Create a group of contacts/friends."
msgstr ""
#: ../../mod/group.php:83 ../../mod/group.php:166
msgid "Group Name: "
msgstr ""
#: ../../mod/group.php:98
msgid "Group removed."
msgstr ""
#: ../../mod/group.php:100
msgid "Unable to remove group."
msgstr ""
#: ../../mod/group.php:164 ../../mod/profperm.php:105
msgid "Click on a contact to add or remove."
msgstr ""
#: ../../mod/group.php:165
msgid "Group Editor"
msgstr ""
#: ../../mod/group.php:179
msgid "Members"
msgstr ""
#: ../../mod/group.php:194
msgid "All Contacts"
msgstr ""
#: ../../mod/events.php:61
msgid "Event description and start time are required."
msgstr ""
#: ../../mod/events.php:117 ../../include/nav.php:50 ../../boot.php:1330
msgid "Events"
msgstr ""
#: ../../mod/events.php:207
msgid "Create New Event"
msgstr ""
#: ../../mod/events.php:210
msgid "Previous"
msgstr ""
#: ../../mod/events.php:220
msgid "l, F j"
msgstr ""
#: ../../mod/events.php:235
msgid "Edit event"
msgstr ""
#: ../../mod/events.php:237 ../../include/text.php:867
msgid "link to source"
msgstr ""
#: ../../mod/events.php:305
msgid "hour:minute"
msgstr ""
#: ../../mod/events.php:314
msgid "Event details"
msgstr ""
#: ../../mod/events.php:315
#: ../../addon/widgets/widget_like.php:61
#, php-format
msgid "Format is %s %s. Starting date and Description are required."
msgstr ""
#: ../../mod/events.php:316
msgid "Event Starts:"
msgstr ""
#: ../../mod/events.php:319
msgid "Finish date/time is not known or not relevant"
msgstr ""
#: ../../mod/events.php:321
msgid "Event Finishes:"
msgstr ""
#: ../../mod/events.php:324
msgid "Adjust for viewer timezone"
msgstr ""
#: ../../mod/events.php:326
msgid "Description:"
msgstr ""
#: ../../mod/events.php:328 ../../include/event.php:37
#: ../../include/bb2diaspora.php:259 ../../boot.php:961
msgid "Location:"
msgstr ""
#: ../../mod/events.php:330
msgid "Share this event"
msgstr ""
#: ../../mod/profperm.php:25 ../../mod/profperm.php:55
msgid "Invalid profile identifier."
msgstr ""
#: ../../mod/profperm.php:101
msgid "Profile Visibility Editor"
msgstr ""
#: ../../mod/profperm.php:103 ../../include/nav.php:48
#: ../../include/profile_advanced.php:7 ../../include/profile_advanced.php:74
#: ../../boot.php:1317
msgid "Profile"
msgstr ""
#: ../../mod/profperm.php:114
msgid "Visible To"
msgstr ""
#: ../../mod/profperm.php:130
msgid "All Contacts (with secure profile access)"
msgstr ""
#: ../../mod/dfrn_poll.php:90 ../../mod/dfrn_poll.php:516
#, php-format
msgid "%s welcomes %s"
msgstr ""
#: ../../mod/lockview.php:39
msgid "Remote privacy information not available."
msgstr ""
#: ../../mod/lockview.php:43
msgid "Visible to:"
msgstr ""
#: ../../mod/home.php:26 ../../addon/communityhome/communityhome.php:179
#, php-format
msgid "Welcome to %s"
msgstr ""
#: ../../include/datetime.php:43 ../../include/datetime.php:45
msgid "Miscellaneous"
msgstr ""
#: ../../include/datetime.php:121 ../../include/datetime.php:253
msgid "year"
msgstr ""
#: ../../include/datetime.php:126 ../../include/datetime.php:254
msgid "month"
msgstr ""
#: ../../include/datetime.php:131 ../../include/datetime.php:256
msgid "day"
msgstr ""
#: ../../include/datetime.php:244
msgid "never"
msgstr ""
#: ../../include/datetime.php:250
msgid "less than a second ago"
msgstr ""
#: ../../include/datetime.php:253
msgid "years"
msgstr ""
#: ../../include/datetime.php:254
msgid "months"
msgstr ""
#: ../../include/datetime.php:255
msgid "week"
msgstr ""
#: ../../include/datetime.php:255
msgid "weeks"
msgstr ""
#: ../../include/datetime.php:256
msgid "days"
msgstr ""
#: ../../include/datetime.php:257
msgid "hour"
msgstr ""
#: ../../include/datetime.php:257
msgid "hours"
msgstr ""
#: ../../include/datetime.php:258
msgid "minute"
msgstr ""
#: ../../include/datetime.php:258
msgid "minutes"
msgstr ""
#: ../../include/datetime.php:259
msgid "second"
msgstr ""
#: ../../include/datetime.php:259
msgid "seconds"
msgstr ""
#: ../../include/datetime.php:266
msgid " ago"
msgstr ""
#: ../../include/datetime.php:437 ../../include/profile_advanced.php:30
#: ../../include/items.php:1285
msgid "Birthday:"
msgstr ""
#: ../../include/dba.php:39
#, php-format
msgid "Cannot locate DNS info for database server '%s'"
msgstr ""
#: ../../include/text.php:232
msgid "prev"
msgstr ""
#: ../../include/text.php:234
msgid "first"
msgstr ""
#: ../../include/text.php:263
msgid "last"
msgstr ""
#: ../../include/text.php:266
msgid "next"
msgstr ""
#: ../../include/text.php:553
msgid "No contacts"
msgstr ""
#: ../../include/text.php:562
#, php-format
msgid "%d Contact"
msgid_plural "%d Contacts"
msgid "%d person doesn't like this"
msgid_plural "%d people don't like this"
msgstr[0] ""
msgstr[1] ""
#: ../../include/text.php:633 ../../include/nav.php:87
msgid "Search"
#: ../../addon/widgets/widgets.php:55
msgid "Generate new key"
msgstr ""
#: ../../include/text.php:719
msgid "Monday"
#: ../../addon/widgets/widgets.php:58
msgid "Widgets key"
msgstr ""
#: ../../include/text.php:719
msgid "Tuesday"
#: ../../addon/widgets/widgets.php:60
msgid "Widgets available"
msgstr ""
#: ../../include/text.php:719
msgid "Wednesday"
#: ../../addon/widgets/widget_friends.php:40
msgid "Connect on Friendica!"
msgstr ""
#: ../../include/text.php:719
msgid "Thursday"
#: ../../addon/yourls/yourls.php:55
msgid "YourLS Settings"
msgstr ""
#: ../../include/text.php:719
msgid "Friday"
#: ../../addon/yourls/yourls.php:57
msgid "URL: http://"
msgstr ""
#: ../../include/text.php:719
msgid "Saturday"
#: ../../addon/yourls/yourls.php:62
msgid "Username:"
msgstr ""
#: ../../include/text.php:719
msgid "Sunday"
#: ../../addon/yourls/yourls.php:67
msgid "Password:"
msgstr ""
#: ../../include/text.php:723
msgid "January"
#: ../../addon/yourls/yourls.php:72
msgid "Use SSL "
msgstr ""
#: ../../include/text.php:723
msgid "February"
#: ../../addon/yourls/yourls.php:92
msgid "yourls Settings saved."
msgstr ""
#: ../../include/text.php:723
msgid "March"
#: ../../addon/nsfw/nsfw.php:47
msgid "\"Not Safe For Work\" Settings"
msgstr ""
#: ../../include/text.php:723
msgid "April"
#: ../../addon/nsfw/nsfw.php:50
msgid "Enable NSFW filter"
msgstr ""
#: ../../include/text.php:723
msgid "May"
#: ../../addon/nsfw/nsfw.php:53
msgid "Comma separated words to treat as NSFW"
msgstr ""
#: ../../include/text.php:723
msgid "June"
#: ../../addon/nsfw/nsfw.php:58
msgid "Use /expression/ to provide regular expressions"
msgstr ""
#: ../../include/text.php:723
msgid "July"
#: ../../addon/nsfw/nsfw.php:74
msgid "NSFW Settings saved."
msgstr ""
#: ../../include/text.php:723
msgid "August"
#: ../../addon/nsfw/nsfw.php:120
#, php-format
msgid "%s - Click to open/close"
msgstr ""
#: ../../include/text.php:723
msgid "September"
msgstr ""
#: ../../include/text.php:723
msgid "October"
msgstr ""
#: ../../include/text.php:723
msgid "November"
msgstr ""
#: ../../include/text.php:723
msgid "December"
msgstr ""
#: ../../include/text.php:793
msgid "bytes"
msgstr ""
#: ../../include/text.php:885
msgid "Select an alternate language"
msgstr ""
#: ../../include/text.php:897
msgid "default"
msgstr ""
#: ../../include/poller.php:459
msgid "From: "
msgstr ""
#: ../../include/nav.php:44 ../../boot.php:700
msgid "Logout"
msgstr ""
#: ../../include/nav.php:44
msgid "End this session"
msgstr ""
#: ../../include/nav.php:47 ../../boot.php:1312
msgid "Status"
msgstr ""
#: ../../include/nav.php:47 ../../include/nav.php:111
msgid "Your posts and conversations"
msgstr ""
#: ../../include/nav.php:48
msgid "Your profile page"
msgstr ""
#: ../../include/nav.php:49 ../../boot.php:1322
msgid "Photos"
msgstr ""
#: ../../include/nav.php:49
msgid "Your photos"
msgstr ""
#: ../../include/nav.php:50
msgid "Your events"
msgstr ""
#: ../../include/nav.php:51
msgid "Personal notes"
msgstr ""
#: ../../include/nav.php:51
msgid "Your personal photos"
msgstr ""
#: ../../include/nav.php:62 ../../addon/communityhome/communityhome.php:28
#: ../../addon/communityhome/communityhome.php:34 ../../boot.php:701
#: ../../addon/communityhome/communityhome.php:28
#: ../../addon/communityhome/communityhome.php:34 ../../include/nav.php:62
#: ../../boot.php:706
msgid "Login"
msgstr ""
#: ../../include/nav.php:62
msgid "Sign in"
#: ../../addon/communityhome/communityhome.php:29
msgid "OpenID"
msgstr ""
#: ../../include/nav.php:73
msgid "Home Page"
#: ../../addon/communityhome/communityhome.php:38
msgid "Last users"
msgstr ""
#: ../../include/nav.php:77
msgid "Create an account"
#: ../../addon/communityhome/communityhome.php:81
msgid "Most active users"
msgstr ""
#: ../../include/nav.php:82
msgid "Help and documentation"
#: ../../addon/communityhome/communityhome.php:98
msgid "Last photos"
msgstr ""
#: ../../include/nav.php:85
msgid "Apps"
#: ../../addon/communityhome/communityhome.php:133
msgid "Last likes"
msgstr ""
#: ../../include/nav.php:85
msgid "Addon applications, utilities, games"
#: ../../addon/communityhome/communityhome.php:155
#: ../../include/conversation.php:23 ../../include/conversation.php:96
msgid "event"
msgstr ""
#: ../../include/nav.php:87
msgid "Search site content"
#: ../../addon/uhremotestorage/uhremotestorage.php:84
#, php-format
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 ""
#: ../../include/nav.php:97
msgid "Conversations on this site"
#: ../../addon/uhremotestorage/uhremotestorage.php:85
msgid "Template URL (with {category})"
msgstr ""
#: ../../include/nav.php:99
msgid "Directory"
#: ../../addon/uhremotestorage/uhremotestorage.php:86
msgid "OAuth end-point"
msgstr ""
#: ../../include/nav.php:99
msgid "People directory"
#: ../../addon/uhremotestorage/uhremotestorage.php:87
msgid "Api"
msgstr ""
#: ../../include/nav.php:109
msgid "Conversations from your friends"
#: ../../addon/membersince/membersince.php:18
msgid "Member since:"
msgstr ""
#: ../../include/nav.php:117
msgid "Friend Requests"
#: ../../addon/tictac/tictac.php:20
msgid "Three Dimensional Tic-Tac-Toe"
msgstr ""
#: ../../include/nav.php:122
msgid "Private mail"
#: ../../addon/tictac/tictac.php:53
msgid "3D Tic-Tac-Toe"
msgstr ""
#: ../../include/nav.php:125
msgid "Manage"
#: ../../addon/tictac/tictac.php:58
msgid "New game"
msgstr ""
#: ../../include/nav.php:125
msgid "Manage other pages"
#: ../../addon/tictac/tictac.php:59
msgid "New game with handicap"
msgstr ""
#: ../../include/nav.php:129 ../../boot.php:921
msgid "Profiles"
#: ../../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 ""
#: ../../include/nav.php:129 ../../boot.php:921
msgid "Manage/edit profiles"
#: ../../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 ""
#: ../../include/nav.php:130
msgid "Manage/edit friends and contacts"
#: ../../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 ""
#: ../../include/nav.php:137
msgid "Admin"
#: ../../addon/tictac/tictac.php:182
msgid "You go first..."
msgstr ""
#: ../../include/nav.php:137
msgid "Site setup and configuration"
#: ../../addon/tictac/tictac.php:187
msgid "I'm going first this time..."
msgstr ""
#: ../../include/nav.php:160
msgid "Nothing new here"
#: ../../addon/tictac/tictac.php:193
msgid "You won!"
msgstr ""
#: ../../include/message.php:14
msgid "[no subject]"
#: ../../addon/tictac/tictac.php:199 ../../addon/tictac/tictac.php:224
msgid "\"Cat\" game!"
msgstr ""
#: ../../include/profile_advanced.php:17 ../../boot.php:963
#: ../../addon/tictac/tictac.php:222
msgid "I won!"
msgstr ""
#: ../../addon/randplace/randplace.php:171
msgid "Randplace Settings"
msgstr ""
#: ../../addon/randplace/randplace.php:173
msgid "Enable Randplace Plugin"
msgstr ""
#: ../../addon/drpost/drpost.php:35
msgid "Post to Drupal"
msgstr ""
#: ../../addon/drpost/drpost.php:72
msgid "Drupal Post Settings"
msgstr ""
#: ../../addon/drpost/drpost.php:74
msgid "Enable Drupal Post Plugin"
msgstr ""
#: ../../addon/drpost/drpost.php:79
msgid "Drupal username"
msgstr ""
#: ../../addon/drpost/drpost.php:84
msgid "Drupal password"
msgstr ""
#: ../../addon/drpost/drpost.php:89
msgid "Post Type - article,page,or blog"
msgstr ""
#: ../../addon/drpost/drpost.php:94
msgid "Drupal site URL"
msgstr ""
#: ../../addon/drpost/drpost.php:99
msgid "Drupal site uses clean URLS"
msgstr ""
#: ../../addon/drpost/drpost.php:104
msgid "Post to Drupal by default"
msgstr ""
#: ../../addon/drpost/drpost.php:184 ../../addon/wppost/wppost.php:172
#: ../../addon/posterous/posterous.php:173
msgid "Post from Friendica"
msgstr ""
#: ../../addon/geonames/geonames.php:143
msgid "Geonames settings updated."
msgstr ""
#: ../../addon/geonames/geonames.php:179
msgid "Geonames Settings"
msgstr ""
#: ../../addon/geonames/geonames.php:181
msgid "Enable Geonames Plugin"
msgstr ""
#: ../../addon/js_upload/js_upload.php:43
msgid "Upload a file"
msgstr ""
#: ../../addon/js_upload/js_upload.php:44
msgid "Drop files here to upload"
msgstr ""
#: ../../addon/js_upload/js_upload.php:46
msgid "Failed"
msgstr ""
#: ../../addon/js_upload/js_upload.php:294
msgid "No files were uploaded."
msgstr ""
#: ../../addon/js_upload/js_upload.php:300
msgid "Uploaded file is empty"
msgstr ""
#: ../../addon/js_upload/js_upload.php:323
msgid "File has an invalid extension, it should be one of "
msgstr ""
#: ../../addon/js_upload/js_upload.php:334
msgid "Upload was cancelled, or server error encountered"
msgstr ""
#: ../../addon/oembed.old/oembed.php:30
msgid "OEmbed settings updated"
msgstr ""
#: ../../addon/oembed.old/oembed.php:43
msgid "Use OEmbed for YouTube videos"
msgstr ""
#: ../../addon/oembed.old/oembed.php:71
msgid "URL to embed:"
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."
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 "Blocked %s - Click to open/close"
msgstr ""
#: ../../addon/blockem/blockem.php:160
msgid "Unblock Author"
msgstr ""
#: ../../addon/blockem/blockem.php:162
msgid "Block Author"
msgstr ""
#: ../../addon/blockem/blockem.php:194
msgid "blockem settings updated"
msgstr ""
#: ../../addon/editplain/editplain.php:46
msgid "Editplain settings updated."
msgstr ""
#: ../../addon/editplain/editplain.php:76
msgid "Editplain Settings"
msgstr ""
#: ../../addon/editplain/editplain.php:78
msgid "Disable richtext status editor"
msgstr ""
#: ../../addon/pageheader/pageheader.php:47
msgid "\"pageheader\" Settings"
msgstr ""
#: ../../addon/pageheader/pageheader.php:65
msgid "pageheader Settings saved."
msgstr ""
#: ../../addon/viewsrc/viewsrc.php:25
msgid "View Source"
msgstr ""
#: ../../addon/statusnet/statusnet.php:140
msgid "Post to StatusNet"
msgstr ""
#: ../../addon/statusnet/statusnet.php:182
msgid ""
"Please contact your site administrator.<br />The provided API URL is not "
"valid."
msgstr ""
#: ../../addon/statusnet/statusnet.php:210
msgid "We could not contact the StatusNet API with the Path you entered."
msgstr ""
#: ../../addon/statusnet/statusnet.php:236
msgid "StatusNet settings updated."
msgstr ""
#: ../../addon/statusnet/statusnet.php:259
msgid "StatusNet Posting Settings"
msgstr ""
#: ../../addon/statusnet/statusnet.php:273
msgid "Globally Available StatusNet OAuthKeys"
msgstr ""
#: ../../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 ""
#: ../../addon/statusnet/statusnet.php:282
msgid "Provide your own OAuth Credentials"
msgstr ""
#: ../../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 ""
#: ../../addon/statusnet/statusnet.php:285
msgid "OAuth Consumer Key"
msgstr ""
#: ../../addon/statusnet/statusnet.php:288
msgid "OAuth Consumer Secret"
msgstr ""
#: ../../addon/statusnet/statusnet.php:291
msgid "Base API Path (remember the trailing /)"
msgstr ""
#: ../../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 ""
#: ../../addon/statusnet/statusnet.php:313
msgid "Log in with StatusNet"
msgstr ""
#: ../../addon/statusnet/statusnet.php:315
msgid "Copy the security code from StatusNet here"
msgstr ""
#: ../../addon/statusnet/statusnet.php:321
msgid "Cancel Connection Process"
msgstr ""
#: ../../addon/statusnet/statusnet.php:323
msgid "Current StatusNet API is"
msgstr ""
#: ../../addon/statusnet/statusnet.php:324
msgid "Cancel StatusNet Connection"
msgstr ""
#: ../../addon/statusnet/statusnet.php:335 ../../addon/twitter/twitter.php:189
msgid "Currently connected to: "
msgstr ""
#: ../../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 ""
#: ../../addon/statusnet/statusnet.php:338
msgid "Allow posting to StatusNet"
msgstr ""
#: ../../addon/statusnet/statusnet.php:341
msgid "Send public postings to StatusNet by default"
msgstr ""
#: ../../addon/statusnet/statusnet.php:346 ../../addon/twitter/twitter.php:200
msgid "Clear OAuth configuration"
msgstr ""
#: ../../addon/statusnet/statusnet.php:487
msgid "API URL"
msgstr ""
#: ../../addon/tumblr/tumblr.php:36
msgid "Post to Tumblr"
msgstr ""
#: ../../addon/tumblr/tumblr.php:67
msgid "Tumblr Post Settings"
msgstr ""
#: ../../addon/tumblr/tumblr.php:69
msgid "Enable Tumblr Post Plugin"
msgstr ""
#: ../../addon/tumblr/tumblr.php:74
msgid "Tumblr login"
msgstr ""
#: ../../addon/tumblr/tumblr.php:79
msgid "Tumblr password"
msgstr ""
#: ../../addon/tumblr/tumblr.php:84
msgid "Post to Tumblr by default"
msgstr ""
#: ../../addon/numfriends/numfriends.php:46
msgid "Numfriends settings updated."
msgstr ""
#: ../../addon/numfriends/numfriends.php:77
msgid "Numfriends Settings"
msgstr ""
#: ../../addon/numfriends/numfriends.php:79
msgid "How many contacts to display on profile sidebar"
msgstr ""
#: ../../addon/wppost/wppost.php:42
msgid "Post to Wordpress"
msgstr ""
#: ../../addon/wppost/wppost.php:74
msgid "WordPress Post Settings"
msgstr ""
#: ../../addon/wppost/wppost.php:76
msgid "Enable WordPress Post Plugin"
msgstr ""
#: ../../addon/wppost/wppost.php:81
msgid "WordPress username"
msgstr ""
#: ../../addon/wppost/wppost.php:86
msgid "WordPress password"
msgstr ""
#: ../../addon/wppost/wppost.php:91
msgid "WordPress API URL"
msgstr ""
#: ../../addon/wppost/wppost.php:96
msgid "Post to WordPress by default"
msgstr ""
#: ../../addon/piwik/piwik.php:70
msgid ""
"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
"analytics tool."
msgstr ""
#: ../../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 ""
#: ../../addon/piwik/piwik.php:82
msgid "Piwik Base URL"
msgstr ""
#: ../../addon/piwik/piwik.php:83
msgid "Site ID"
msgstr ""
#: ../../addon/piwik/piwik.php:84
msgid "Show opt-out cookie link?"
msgstr ""
#: ../../addon/twitter/twitter.php:78
msgid "Post to Twitter"
msgstr ""
#: ../../addon/twitter/twitter.php:124
msgid "Twitter settings updated."
msgstr ""
#: ../../addon/twitter/twitter.php:146
msgid "Twitter Posting Settings"
msgstr ""
#: ../../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,444 +4745,155 @@ msgstr ""
msgid "Ask me"
msgstr ""
#: ../../include/Contact.php:125 ../../include/conversation.php:723
msgid "View status"
#: ../../include/event.php:17 ../../include/bb2diaspora.php:255
msgid "Starts:"
msgstr ""
#: ../../include/Contact.php:126 ../../include/conversation.php:724
msgid "View profile"
#: ../../include/event.php:27 ../../include/bb2diaspora.php:263
msgid "Finishes:"
msgstr ""
#: ../../include/Contact.php:127 ../../include/conversation.php:725
msgid "View photos"
msgstr ""
#: ../../include/Contact.php:128 ../../include/Contact.php:141
#: ../../include/conversation.php:726
msgid "View recent"
msgstr ""
#: ../../include/Contact.php:130 ../../include/Contact.php:141
#: ../../include/conversation.php:728
msgid "Send PM"
msgstr ""
#: ../../include/conversation.php:23 ../../include/conversation.php:96
#: ../../addon/communityhome/communityhome.php:155
msgid "event"
msgstr ""
#: ../../include/conversation.php:252 ../../include/conversation.php:508
msgid "Select"
msgstr ""
#: ../../include/conversation.php:267 ../../include/conversation.php:602
#: ../../include/conversation.php:603
#, php-format
msgid "View %s's profile @ %s"
msgstr ""
#: ../../include/conversation.php:276 ../../include/conversation.php:614
#, php-format
msgid "%s from %s"
msgstr ""
#: ../../include/conversation.php:292
msgid "View in context"
msgstr ""
#: ../../include/conversation.php:407
#, php-format
msgid "%d comment"
msgid_plural "%d comments"
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"
msgstr ""
#: ../../include/conversation.php:793
#, php-format
msgid ", and %d other people"
msgstr ""
#: ../../include/conversation.php:794
#, php-format
msgid "%s like this."
msgstr ""
#: ../../include/conversation.php:794
#, php-format
msgid "%s don't like this."
msgstr ""
#: ../../include/conversation.php:814
msgid "Visible to <strong>everybody</strong>"
msgstr ""
#: ../../include/conversation.php:816
msgid "Please enter a video link/URL:"
msgstr ""
#: ../../include/conversation.php:817
msgid "Please enter an audio link/URL:"
msgstr ""
#: ../../include/conversation.php:818
msgid "Tag term:"
msgstr ""
#: ../../include/conversation.php:819
msgid "Where are you right now?"
msgstr ""
#: ../../include/conversation.php:820
msgid "Enter a title for this item"
msgstr ""
#: ../../include/conversation.php:864
msgid "upload photo"
msgstr ""
#: ../../include/conversation.php:866
msgid "attach file"
msgstr ""
#: ../../include/conversation.php:868
msgid "web link"
msgstr ""
#: ../../include/conversation.php:869
msgid "Insert video link"
msgstr ""
#: ../../include/conversation.php:870
msgid "video link"
msgstr ""
#: ../../include/conversation.php:871
msgid "Insert audio link"
msgstr ""
#: ../../include/conversation.php:872
msgid "audio link"
msgstr ""
#: ../../include/conversation.php:874
msgid "set location"
msgstr ""
#: ../../include/conversation.php:876
msgid "clear location"
msgstr ""
#: ../../include/conversation.php:878
msgid "Set title"
msgstr ""
#: ../../include/conversation.php:881
msgid "permissions"
msgstr ""
#: ../../include/notifier.php:628 ../../include/delivery.php:415
#: ../../include/delivery.php:416 ../../include/notifier.php:629
msgid "(no subject)"
msgstr ""
#: ../../include/notifier.php:635 ../../include/enotify.php:16
#: ../../include/delivery.php:423 ../../include/enotify.php:16
#: ../../include/notifier.php:636
msgid "noreply"
msgstr ""
#: ../../include/text.php:232
msgid "prev"
msgstr ""
#: ../../include/text.php:234
msgid "first"
msgstr ""
#: ../../include/text.php:263
msgid "last"
msgstr ""
#: ../../include/text.php:266
msgid "next"
msgstr ""
#: ../../include/text.php:557
msgid "No contacts"
msgstr ""
#: ../../include/text.php:566
#, php-format
msgid "%d Contact"
msgid_plural "%d Contacts"
msgstr[0] ""
msgstr[1] ""
#: ../../include/text.php:637 ../../include/nav.php:87
msgid "Search"
msgstr ""
#: ../../include/text.php:735
msgid "Monday"
msgstr ""
#: ../../include/text.php:735
msgid "Tuesday"
msgstr ""
#: ../../include/text.php:735
msgid "Wednesday"
msgstr ""
#: ../../include/text.php:735
msgid "Thursday"
msgstr ""
#: ../../include/text.php:735
msgid "Friday"
msgstr ""
#: ../../include/text.php:735
msgid "Saturday"
msgstr ""
#: ../../include/text.php:735
msgid "Sunday"
msgstr ""
#: ../../include/text.php:739
msgid "January"
msgstr ""
#: ../../include/text.php:739
msgid "February"
msgstr ""
#: ../../include/text.php:739
msgid "March"
msgstr ""
#: ../../include/text.php:739
msgid "April"
msgstr ""
#: ../../include/text.php:739
msgid "May"
msgstr ""
#: ../../include/text.php:739
msgid "June"
msgstr ""
#: ../../include/text.php:739
msgid "July"
msgstr ""
#: ../../include/text.php:739
msgid "August"
msgstr ""
#: ../../include/text.php:739
msgid "September"
msgstr ""
#: ../../include/text.php:739
msgid "October"
msgstr ""
#: ../../include/text.php:739
msgid "November"
msgstr ""
#: ../../include/text.php:739
msgid "December"
msgstr ""
#: ../../include/text.php:809
msgid "bytes"
msgstr ""
#: ../../include/text.php:901
msgid "Select an alternate language"
msgstr ""
#: ../../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."
msgstr ""
#: ../../include/enotify.php:49
#, php-format
msgid "%s posted to your profile wall at %s"
msgstr ""
#: ../../include/enotify.php:58
#, php-format
msgid "Introduction received at %s"
msgstr ""
#: ../../include/enotify.php:59
#, php-format
msgid "You've received an introduction from '%s' at %s"
msgstr ""
#: ../../include/enotify.php:60 ../../include/enotify.php:73
#, php-format
msgid "You may visit their profile at %s"
msgstr ""
#: ../../include/enotify.php:62
#, php-format
msgid "Please visit %s to approve or reject the introduction."
msgstr ""
#: ../../include/enotify.php:69
#, php-format
msgid "Friend suggestion received at %s"
msgstr ""
#: ../../include/enotify.php:70
#, php-format
msgid "You've received a friend suggestion from '%s' at %s"
msgstr ""
#: ../../include/enotify.php:71
msgid "Name:"
msgstr ""
#: ../../include/enotify.php:72
msgid "Photo:"
msgstr ""
#: ../../include/enotify.php:75
#, php-format
msgid "Please visit %s to approve or reject the suggestion."
msgstr ""
#: ../../include/bbcode.php:166 ../../include/bbcode.php:225
msgid "Image/photo"
msgstr ""
#: ../../include/contact_selectors.php:32
msgid "Unknown | Not categorised"
msgstr ""
#: ../../include/contact_selectors.php:33
msgid "Block immediately"
msgstr ""
#: ../../include/contact_selectors.php:34
msgid "Shady, spammer, self-marketer"
msgstr ""
#: ../../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:81
#: ../../addon/facebook/facebook.php:475
msgid "Facebook"
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/auth.php:27
msgid "Logged out."
msgstr ""
#: ../../include/oembed.php:128
msgid "Embedded content"
msgstr ""
@ -4673,6 +4929,134 @@ msgstr ""
msgid "Create a new group"
msgstr ""
#: ../../include/nav.php:44 ../../boot.php:705
msgid "Logout"
msgstr ""
#: ../../include/nav.php:44
msgid "End this session"
msgstr ""
#: ../../include/nav.php:47 ../../boot.php:1327
msgid "Status"
msgstr ""
#: ../../include/nav.php:47 ../../include/nav.php:111
msgid "Your posts and conversations"
msgstr ""
#: ../../include/nav.php:48
msgid "Your profile page"
msgstr ""
#: ../../include/nav.php:49 ../../boot.php:1337
msgid "Photos"
msgstr ""
#: ../../include/nav.php:49
msgid "Your photos"
msgstr ""
#: ../../include/nav.php:50
msgid "Your events"
msgstr ""
#: ../../include/nav.php:51
msgid "Personal notes"
msgstr ""
#: ../../include/nav.php:51
msgid "Your personal photos"
msgstr ""
#: ../../include/nav.php:62
msgid "Sign in"
msgstr ""
#: ../../include/nav.php:73
msgid "Home Page"
msgstr ""
#: ../../include/nav.php:77
msgid "Create an account"
msgstr ""
#: ../../include/nav.php:82
msgid "Help and documentation"
msgstr ""
#: ../../include/nav.php:85
msgid "Apps"
msgstr ""
#: ../../include/nav.php:85
msgid "Addon applications, utilities, games"
msgstr ""
#: ../../include/nav.php:87
msgid "Search site content"
msgstr ""
#: ../../include/nav.php:97
msgid "Conversations on this site"
msgstr ""
#: ../../include/nav.php:99
msgid "Directory"
msgstr ""
#: ../../include/nav.php:99
msgid "People directory"
msgstr ""
#: ../../include/nav.php:109
msgid "Conversations from your friends"
msgstr ""
#: ../../include/nav.php:117
msgid "Friend Requests"
msgstr ""
#: ../../include/nav.php:119
msgid "See all notifications"
msgstr ""
#: ../../include/nav.php:123
msgid "Private mail"
msgstr ""
#: ../../include/nav.php:126
msgid "Manage"
msgstr ""
#: ../../include/nav.php:126
msgid "Manage other pages"
msgstr ""
#: ../../include/nav.php:130 ../../boot.php:936
msgid "Profiles"
msgstr ""
#: ../../include/nav.php:130 ../../boot.php:936
msgid "Manage/edit profiles"
msgstr ""
#: ../../include/nav.php:131
msgid "Manage/edit friends and contacts"
msgstr ""
#: ../../include/nav.php:138
msgid "Admin"
msgstr ""
#: ../../include/nav.php:138
msgid "Site setup and configuration"
msgstr ""
#: ../../include/nav.php:161
msgid "Nothing new here"
msgstr ""
#: ../../include/contact_widgets.php:6
msgid "Add New Contact"
msgstr ""
@ -4724,695 +5108,519 @@ msgstr ""
msgid "All Networks"
msgstr ""
#: ../../addon/facebook/facebook.php:337
msgid "Facebook disabled"
#: ../../include/auth.php:29
msgid "Logged out."
msgstr ""
#: ../../addon/facebook/facebook.php:342
msgid "Updating contacts"
#: ../../include/datetime.php:43 ../../include/datetime.php:45
msgid "Miscellaneous"
msgstr ""
#: ../../addon/facebook/facebook.php:351
msgid "Facebook API key is missing."
#: ../../include/datetime.php:121 ../../include/datetime.php:253
msgid "year"
msgstr ""
#: ../../addon/facebook/facebook.php:358
msgid "Facebook Connect"
#: ../../include/datetime.php:126 ../../include/datetime.php:254
msgid "month"
msgstr ""
#: ../../addon/facebook/facebook.php:364
msgid "Install Facebook connector for this account."
#: ../../include/datetime.php:131 ../../include/datetime.php:256
msgid "day"
msgstr ""
#: ../../addon/facebook/facebook.php:371
msgid "Remove Facebook connector"
#: ../../include/datetime.php:244
msgid "never"
msgstr ""
#: ../../addon/facebook/facebook.php:376
msgid ""
"Re-authenticate [This is necessary whenever your Facebook password is "
"changed.]"
#: ../../include/datetime.php:250
msgid "less than a second ago"
msgstr ""
#: ../../addon/facebook/facebook.php:383
msgid "Post to Facebook by default"
#: ../../include/datetime.php:253
msgid "years"
msgstr ""
#: ../../addon/facebook/facebook.php:387
msgid "Link all your Facebook friends and conversations on this website"
#: ../../include/datetime.php:254
msgid "months"
msgstr ""
#: ../../addon/facebook/facebook.php:389
msgid ""
"Facebook conversations consist of your <em>profile wall</em> and your friend "
"<em>stream</em>."
#: ../../include/datetime.php:255
msgid "week"
msgstr ""
#: ../../addon/facebook/facebook.php:390
msgid "On this website, your Facebook friend stream is only visible to you."
#: ../../include/datetime.php:255
msgid "weeks"
msgstr ""
#: ../../addon/facebook/facebook.php:391
msgid ""
"The following settings determine the privacy of your Facebook profile wall "
"on this website."
#: ../../include/datetime.php:256
msgid "days"
msgstr ""
#: ../../addon/facebook/facebook.php:395
msgid ""
"On this website your Facebook profile wall conversations will only be "
"visible to you"
#: ../../include/datetime.php:257
msgid "hour"
msgstr ""
#: ../../addon/facebook/facebook.php:400
msgid "Do not import your Facebook profile wall conversations"
#: ../../include/datetime.php:257
msgid "hours"
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:258
msgid "minute"
msgstr ""
#: ../../addon/facebook/facebook.php:407
msgid "Comma separated applications to ignore"
#: ../../include/datetime.php:258
msgid "minutes"
msgstr ""
#: ../../addon/facebook/facebook.php:476
msgid "Facebook Connector Settings"
#: ../../include/datetime.php:259
msgid "second"
msgstr ""
#: ../../addon/facebook/facebook.php:490
msgid "Post to Facebook"
#: ../../include/datetime.php:259
msgid "seconds"
msgstr ""
#: ../../addon/facebook/facebook.php:581
msgid ""
"Post to Facebook cancelled because of multi-network access permission "
"conflict."
msgstr ""
#: ../../addon/facebook/facebook.php:644
msgid "Image: "
msgstr ""
#: ../../addon/facebook/facebook.php:720
msgid "View on Friendica"
msgstr ""
#: ../../addon/facebook/facebook.php:744
msgid "Facebook post failed. Queued for retry."
msgstr ""
#: ../../addon/wppost/wppost.php:41
msgid "Post to Wordpress"
msgstr ""
#: ../../addon/wppost/wppost.php:73
msgid "WordPress Post Settings"
msgstr ""
#: ../../addon/wppost/wppost.php:75
msgid "Enable WordPress Post Plugin"
msgstr ""
#: ../../addon/wppost/wppost.php:80
msgid "WordPress username"
msgstr ""
#: ../../addon/wppost/wppost.php:85
msgid "WordPress password"
msgstr ""
#: ../../addon/wppost/wppost.php:90
msgid "WordPress API URL"
msgstr ""
#: ../../addon/wppost/wppost.php:95
msgid "Post to WordPress by default"
msgstr ""
#: ../../addon/wppost/wppost.php:171 ../../addon/tumblr/tumblr.php:174
#: ../../addon/posterous/posterous.php:172
msgid "Post from Friendica"
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"
#: ../../include/poller.php:459
msgid "From: "
msgstr ""
#: ../../addon/tumblr/tumblr.php:35
msgid "Post to Tumblr"
#: ../../include/bbcode.php:166 ../../include/bbcode.php:225
msgid "Image/photo"
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"
msgstr ""
#: ../../addon/oembed/oembed.php:30
msgid "OEmbed settings updated"
msgstr ""
#: ../../addon/oembed/oembed.php:43
msgid "Use OEmbed for YouTube videos"
msgstr ""
#: ../../addon/oembed/oembed.php:71
msgid "URL to embed:"
msgstr ""
#: ../../addon/posterous/posterous.php:35
msgid "Post to Posterous"
msgstr ""
#: ../../addon/posterous/posterous.php:66
msgid "Posterous Post Settings"
msgstr ""
#: ../../addon/posterous/posterous.php:68
msgid "Enable Posterous Post Plugin"
msgstr ""
#: ../../addon/posterous/posterous.php:73
msgid "Posterous login"
msgstr ""
#: ../../addon/posterous/posterous.php:78
msgid "Posterous password"
msgstr ""
#: ../../addon/posterous/posterous.php:83
msgid "Post to Posterous by default"
msgstr ""
#: ../../addon/js_upload/js_upload.php:43
msgid "Upload a file"
msgstr ""
#: ../../addon/js_upload/js_upload.php:44
msgid "Drop files here to upload"
msgstr ""
#: ../../addon/js_upload/js_upload.php:46
msgid "Failed"
msgstr ""
#: ../../addon/js_upload/js_upload.php:294
msgid "No files were uploaded."
msgstr ""
#: ../../addon/js_upload/js_upload.php:300
msgid "Uploaded file is empty"
msgstr ""
#: ../../addon/js_upload/js_upload.php:323
msgid "File has an invalid extension, it should be one of "
msgstr ""
#: ../../addon/js_upload/js_upload.php:334
msgid "Upload was cancelled, or server error encountered"
msgstr ""
#: ../../addon/buglink/buglink.php:15
msgid "Report Bug"
msgstr ""
#: ../../addon/statusnet/statusnet.php:141
msgid "Post to StatusNet"
msgstr ""
#: ../../addon/statusnet/statusnet.php:183
msgid ""
"Please contact your site administrator.<br />The provided API URL is not "
"valid."
msgstr ""
#: ../../addon/statusnet/statusnet.php:211
msgid "We could not contact the StatusNet API with the Path you entered."
msgstr ""
#: ../../addon/statusnet/statusnet.php:238
msgid "StatusNet settings updated."
msgstr ""
#: ../../addon/statusnet/statusnet.php:261
msgid "StatusNet Posting Settings"
msgstr ""
#: ../../addon/statusnet/statusnet.php:275
msgid "Globally Available StatusNet OAuthKeys"
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)."
msgstr ""
#: ../../addon/statusnet/statusnet.php:284
msgid "Provide your own OAuth Credentials"
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."
msgstr ""
#: ../../addon/statusnet/statusnet.php:287
msgid "OAuth Consumer Key"
msgstr ""
#: ../../addon/statusnet/statusnet.php:290
msgid "OAuth Consumer Secret"
msgstr ""
#: ../../addon/statusnet/statusnet.php:293
msgid "Base API Path (remember the trailing /)"
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."
msgstr ""
#: ../../addon/statusnet/statusnet.php:315
msgid "Log in with StatusNet"
msgstr ""
#: ../../addon/statusnet/statusnet.php:317
msgid "Copy the security code from StatusNet here"
msgstr ""
#: ../../addon/statusnet/statusnet.php:323
msgid "Cancel Connection Process"
msgstr ""
#: ../../addon/statusnet/statusnet.php:325
msgid "Current StatusNet API is"
msgstr ""
#: ../../addon/statusnet/statusnet.php:326
msgid "Cancel StatusNet Connection"
msgstr ""
#: ../../addon/statusnet/statusnet.php:337 ../../addon/twitter/twitter.php:188
msgid "Currently connected to: "
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."
msgstr ""
#: ../../addon/statusnet/statusnet.php:340
msgid "Allow posting to StatusNet"
msgstr ""
#: ../../addon/statusnet/statusnet.php:343
msgid "Send public postings to StatusNet by default"
msgstr ""
#: ../../addon/statusnet/statusnet.php:348 ../../addon/twitter/twitter.php:199
msgid "Clear OAuth configuration"
msgstr ""
#: ../../addon/statusnet/statusnet.php:478
msgid "API URL"
msgstr ""
#: ../../addon/widgets/widgets.php:55
msgid "Generate new key"
msgstr ""
#: ../../addon/widgets/widgets.php:58
msgid "Widgets key"
msgstr ""
#: ../../addon/widgets/widgets.php:60
msgid "Widgets available"
msgstr ""
#: ../../addon/widgets/widget_friends.php:40
msgid "Connect on Friendica!"
msgstr ""
#: ../../addon/widgets/widget_like.php:58
#: ../../include/dba.php:39
#, php-format
msgid "%d person likes this"
msgid_plural "%d people like this"
msgid "Cannot locate DNS info for database server '%s'"
msgstr ""
#: ../../include/message.php:14
msgid "[no subject]"
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
#: ../../include/enotify.php:60 ../../include/enotify.php:69
#, php-format
msgid "Please visit %s to view and/or reply to the conversation."
msgstr ""
#: ../../include/enotify.php:49
#, php-format
msgid "%s posted to your profile wall at %s"
msgstr ""
#: ../../include/enotify.php:58
#, php-format
msgid "%s tagged you at %s"
msgstr ""
#: ../../include/enotify.php:67
#, php-format
msgid "%s tagged your post at %s"
msgstr ""
#: ../../include/enotify.php:76
#, php-format
msgid "Introduction received at %s"
msgstr ""
#: ../../include/enotify.php:77
#, php-format
msgid "You've received an introduction from '%s' at %s"
msgstr ""
#: ../../include/enotify.php:78 ../../include/enotify.php:91
#, php-format
msgid "You may visit their profile at %s"
msgstr ""
#: ../../include/enotify.php:80
#, php-format
msgid "Please visit %s to approve or reject the introduction."
msgstr ""
#: ../../include/enotify.php:87
#, php-format
msgid "Friend suggestion received at %s"
msgstr ""
#: ../../include/enotify.php:88
#, php-format
msgid "You've received a friend suggestion from '%s' at %s"
msgstr ""
#: ../../include/enotify.php:89
msgid "Name:"
msgstr ""
#: ../../include/enotify.php:90
msgid "Photo:"
msgstr ""
#: ../../include/enotify.php:93
#, php-format
msgid "Please visit %s to approve or reject the suggestion."
msgstr ""
#: ../../include/items.php:2450
msgid "A new person is sharing with you at "
msgstr ""
#: ../../include/items.php:2450
msgid "You have a new follower at "
msgstr ""
#: ../../include/bb2diaspora.php:64
msgid "view full size"
msgstr ""
#: ../../include/bb2diaspora.php:113 ../../include/bb2diaspora.php:123
#: ../../include/bb2diaspora.php:124
msgid "image/photo"
msgstr ""
#: ../../include/security.php:20
msgid "Welcome "
msgstr ""
#: ../../include/security.php:21
msgid "Please upload a profile photo."
msgstr ""
#: ../../include/security.php:24
msgid "Welcome back "
msgstr ""
#: ../../include/Contact.php:131 ../../include/conversation.php:744
msgid "View status"
msgstr ""
#: ../../include/Contact.php:132 ../../include/conversation.php:745
msgid "View profile"
msgstr ""
#: ../../include/Contact.php:133 ../../include/conversation.php:746
msgid "View photos"
msgstr ""
#: ../../include/Contact.php:134 ../../include/Contact.php:147
#: ../../include/conversation.php:747
msgid "View recent"
msgstr ""
#: ../../include/Contact.php:136 ../../include/Contact.php:147
#: ../../include/conversation.php:749
msgid "Send PM"
msgstr ""
#: ../../include/conversation.php:141
msgid "post/item"
msgstr ""
#: ../../include/conversation.php:142
#, php-format
msgid "%1$s marked %2$s's %3$s as favorite"
msgstr ""
#: ../../include/conversation.php:279 ../../include/conversation.php:535
msgid "Select"
msgstr ""
#: ../../include/conversation.php:294 ../../include/conversation.php:623
#: ../../include/conversation.php:624
#, php-format
msgid "View %s's profile @ %s"
msgstr ""
#: ../../include/conversation.php:303 ../../include/conversation.php:635
#, php-format
msgid "%s from %s"
msgstr ""
#: ../../include/conversation.php:319
msgid "View in context"
msgstr ""
#: ../../include/conversation.php:434
#, php-format
msgid "%d comment"
msgid_plural "%d comments"
msgstr[0] ""
msgstr[1] ""
#: ../../addon/widgets/widget_like.php:61
#: ../../include/conversation.php:437 ../../boot.php:444
msgid "show more"
msgstr ""
#: ../../include/conversation.php:497
msgid "like"
msgstr ""
#: ../../include/conversation.php:498
msgid "dislike"
msgstr ""
#: ../../include/conversation.php:500
msgid "Share this"
msgstr ""
#: ../../include/conversation.php:500
msgid "share"
msgstr ""
#: ../../include/conversation.php:545
msgid "add star"
msgstr ""
#: ../../include/conversation.php:546
msgid "remove star"
msgstr ""
#: ../../include/conversation.php:547
msgid "toggle star status"
msgstr ""
#: ../../include/conversation.php:550
msgid "starred"
msgstr ""
#: ../../include/conversation.php:551
msgid "add tag"
msgstr ""
#: ../../include/conversation.php:625
msgid "to"
msgstr ""
#: ../../include/conversation.php:626
msgid "Wall-to-Wall"
msgstr ""
#: ../../include/conversation.php:627
msgid "via Wall-To-Wall:"
msgstr ""
#: ../../include/conversation.php:669
msgid "Delete Selected Items"
msgstr ""
#: ../../include/conversation.php:801
#, php-format
msgid "%d person doesn't like this"
msgid_plural "%d people don't like this"
msgstr[0] ""
msgstr[1] ""
#: ../../addon/twitter/twitter.php:78
msgid "Post to Twitter"
msgid "%s likes this."
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."
msgstr ""
#: ../../addon/impressum/impressum.php:71
msgid "Site Owners Profile"
msgstr ""
#: ../../addon/impressum/impressum.php:73
msgid "Notes"
msgstr ""
#: ../../addon/tictac/tictac.php:20
msgid "Three Dimensional Tic-Tac-Toe"
msgstr ""
#: ../../addon/tictac/tictac.php:53
msgid "3D Tic-Tac-Toe"
msgstr ""
#: ../../addon/tictac/tictac.php:58
msgid "New game"
msgstr ""
#: ../../addon/tictac/tictac.php:59
msgid "New game with handicap"
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. "
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."
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."
msgstr ""
#: ../../addon/tictac/tictac.php:182
msgid "You go first..."
msgstr ""
#: ../../addon/tictac/tictac.php:187
msgid "I'm going first this time..."
msgstr ""
#: ../../addon/tictac/tictac.php:193
msgid "You won!"
msgstr ""
#: ../../addon/tictac/tictac.php:199 ../../addon/tictac/tictac.php:224
msgid "\"Cat\" game!"
msgstr ""
#: ../../addon/tictac/tictac.php:222
msgid "I won!"
msgstr ""
#: ../../addon/piwik/piwik.php:70
msgid ""
"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
"analytics tool."
msgstr ""
#: ../../addon/piwik/piwik.php:73
#: ../../include/conversation.php:801
#, 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 "%s doesn't like this."
msgstr ""
#: ../../addon/piwik/piwik.php:82
msgid "Piwik Base URL"
msgstr ""
#: ../../addon/piwik/piwik.php:83
msgid "Site ID"
msgstr ""
#: ../../addon/piwik/piwik.php:84
msgid "Show opt-out cookie link?"
msgstr ""
#: ../../addon/membersince/membersince.php:17
#: ../../include/conversation.php:805
#, php-format
msgid " - Member since: %s"
msgid "<span %1$s>%2$d people</span> like this."
msgstr ""
#: ../../addon/communityhome/communityhome.php:29
msgid "OpenID"
msgstr ""
#: ../../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/pageheader/pageheader.php:47
msgid "\"pageheader\" Settings"
msgstr ""
#: ../../addon/pageheader/pageheader.php:65
msgid "pageheader Settings saved."
msgstr ""
#: ../../addon/randplace/randplace.php:170
msgid "Randplace Settings"
msgstr ""
#: ../../addon/randplace/randplace.php:172
msgid "Enable Randplace Plugin"
msgstr ""
#: ../../addon/blockem/blockem.php:47
msgid "\"Blockem\" Settings"
msgstr ""
#: ../../addon/blockem/blockem.php:49
msgid "Comma separated profile URLS to block"
msgstr ""
#: ../../addon/blockem/blockem.php:66
msgid "BLOCKEM Settings saved."
msgstr ""
#: ../../addon/blockem/blockem.php:104
#: ../../include/conversation.php:807
#, php-format
msgid "Blocked %s - Click to open/close"
msgid "<span %1$s>%2$d people</span> don't like this."
msgstr ""
#: ../../addon/nsfw/nsfw.php:47
msgid "\"Not Safe For Work\" Settings"
#: ../../include/conversation.php:813
msgid "and"
msgstr ""
#: ../../addon/nsfw/nsfw.php:49
msgid "Comma separated words to treat as NSFW"
msgstr ""
#: ../../addon/nsfw/nsfw.php:66
msgid "NSFW Settings saved."
msgstr ""
#: ../../addon/nsfw/nsfw.php:102
#: ../../include/conversation.php:816
#, php-format
msgid "%s - Click to open/close"
msgid ", and %d other people"
msgstr ""
#: ../../boot.php:437
#: ../../include/conversation.php:817
#, php-format
msgid "%s like this."
msgstr ""
#: ../../include/conversation.php:817
#, php-format
msgid "%s don't like this."
msgstr ""
#: ../../include/conversation.php:842
msgid "Visible to <strong>everybody</strong>"
msgstr ""
#: ../../include/conversation.php:844
msgid "Please enter a video link/URL:"
msgstr ""
#: ../../include/conversation.php:845
msgid "Please enter an audio link/URL:"
msgstr ""
#: ../../include/conversation.php:846
msgid "Tag term:"
msgstr ""
#: ../../include/conversation.php:847
msgid "Where are you right now?"
msgstr ""
#: ../../include/conversation.php:848
msgid "Enter a title for this item"
msgstr ""
#: ../../include/conversation.php:891
msgid "upload photo"
msgstr ""
#: ../../include/conversation.php:893
msgid "attach file"
msgstr ""
#: ../../include/conversation.php:895
msgid "web link"
msgstr ""
#: ../../include/conversation.php:896
msgid "Insert video link"
msgstr ""
#: ../../include/conversation.php:897
msgid "video link"
msgstr ""
#: ../../include/conversation.php:898
msgid "Insert audio link"
msgstr ""
#: ../../include/conversation.php:899
msgid "audio link"
msgstr ""
#: ../../include/conversation.php:901
msgid "set location"
msgstr ""
#: ../../include/conversation.php:903
msgid "clear location"
msgstr ""
#: ../../include/conversation.php:908
msgid "permissions"
msgstr ""
#: ../../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 ""

View file

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

View file

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

8522
view/de/messages.po Executable file → Normal file
View file

@ -13,1142 +13,685 @@ 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/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 "Zugriff verweigert."
#: ../../mod/oexchange.php:27
msgid "Post successful."
msgstr "Beitrag erfolgreich veröffentlicht."
#: ../../mod/allfriends.php:34
#, php-format
msgid "Friends of %s"
msgstr "Freunde von %s"
#: ../../mod/allfriends.php:40
msgid "No friends to display."
msgstr "Keine Freunde zum Anzeigen."
#: ../../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 "[Eingebetteter Inhalt - Seite neu laden zum Betrachten]"
#: ../../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 "Öffentlicher Zugriff verweigert."
#: ../../mod/directory.php:49
msgid "Global Directory"
msgstr "Weltweites Verzeichnis"
#: ../../mod/directory.php:55
msgid "Normal site view"
msgstr "Normale Seitenansicht"
#: ../../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:65 ../../mod/contacts.php:372
msgid "Finding: "
msgstr "Funde: "
#: ../../mod/directory.php:66
msgid "Site Directory"
msgstr "Verzeichnis"
#: ../../mod/directory.php:67 ../../mod/contacts.php:373
#: ../../include/contact_widgets.php:34
msgid "Find"
msgstr "Finde"
#: ../../mod/directory.php:122 ../../mod/profiles.php:426
msgid "Age: "
msgstr "Alter: "
#: ../../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/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/viewsrc.php:7
msgid "Access denied."
msgstr "Zugriff verweigert."
#: ../../mod/newmember.php:6
msgid "Welcome to Friendica"
msgstr "Willkommen bei Friendica"
#: ../../mod/newmember.php:8
msgid "New Member Checklist"
msgstr "Checkliste für neue Mitglieder"
#: ../../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 ""
"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/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 ""
"Ä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/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 ""
"Ü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/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."
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/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 ""
"Richte die Verbindung zu Facebook ein, wenn du im Augenblick ein Facebook "
"Konto hast und (optional) deine Facebook Freunde und Unterhaltungen "
"importieren willst."
#: ../../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 ""
"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/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 ""
"Editiere dein <strong>Standard</strong> Profil nach deinen Vorlieben. "
"Überprüfe die Einstellungen zum Verbergen deiner Freundesliste vor "
"unbekannten Betrachtern des Profils."
#: ../../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/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/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/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/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/follow.php:20 ../../mod/dfrn_request.php:370
msgid "Disallowed profile URL."
msgstr "Nicht erlaubte Profil-URL."
#: ../../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/dirfind.php:23
msgid "People Search"
msgstr "Personen Suche"
#: ../../mod/dirfind.php:57 ../../mod/match.php:65
msgid "No matches"
msgstr "Keine Übereinstimmungen"
#: ../../mod/contacts.php:62 ../../mod/contacts.php:135
msgid "Could not access contact record."
msgstr "Konnte nicht auf die Kontaktdaten zugreifen."
#: ../../mod/contacts.php:76
msgid "Could not locate selected profile."
msgstr "Konnte das ausgewählte Profil nicht finden."
#: ../../mod/contacts.php:99
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
msgid "Contact has been blocked"
msgstr "Kontakt wurde blockiert"
#: ../../mod/contacts.php:157
msgid "Contact has been unblocked"
msgstr "Kontakt wurde wieder freigegeben"
#: ../../mod/contacts.php:171
msgid "Contact has been ignored"
msgstr "Der Kontakt wurde ignoriert"
#: ../../mod/contacts.php:171
msgid "Contact has been unignored"
msgstr "Kontakt wurde ignoriert"
#: ../../mod/contacts.php:192
msgid "stopped following"
msgstr "wird nicht mehr gefolgt"
#: ../../mod/contacts.php:213
msgid "Contact has been removed."
msgstr "Kontakt wurde entfernt."
#: ../../mod/contacts.php:234
#, php-format
msgid "You are mutual friends with %s"
msgstr "Du hast mit %s eine beidseitige Freundschaft"
#: ../../mod/contacts.php:238
#, php-format
msgid "You are sharing with %s"
msgstr "Du teilst mit %s"
#: ../../mod/contacts.php:243
#, php-format
msgid "%s is sharing with you"
msgstr "%s teilt mit Dir"
#: ../../mod/contacts.php:260
msgid "Private communications are not available for this contact."
msgstr "Private Kommunikation ist für diesen Kontakt nicht verfügbar."
#: ../../mod/contacts.php:263
msgid "Never"
msgstr "Niemals"
#: ../../mod/contacts.php:267
msgid "(Update was successful)"
msgstr "(Aktualisierung war erfolgreich)"
#: ../../mod/contacts.php:267
msgid "(Update was not successful)"
msgstr "(Aktualisierung war nicht erfolgreich)"
#: ../../mod/contacts.php:269
msgid "Suggest friends"
msgstr "Kontakte vorschlagen"
#: ../../mod/contacts.php:273
#, php-format
msgid "Network type: %s"
msgstr "Netzwerk Typ: %s"
#: ../../mod/contacts.php:276
#, 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
msgid "View all contacts"
msgstr "Alle Kontakte anzeigen"
#: ../../mod/contacts.php:286 ../../mod/contacts.php:333
#: ../../mod/admin.php:470
msgid "Unblock"
msgstr "Entsperren"
#: ../../mod/contacts.php:286 ../../mod/contacts.php:333
#: ../../mod/admin.php:469
msgid "Block"
msgstr "Sperren"
#: ../../mod/contacts.php:291 ../../mod/contacts.php:334
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
msgid "Repair"
msgstr "Reparieren"
#: ../../mod/contacts.php:306
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
msgid "Profile Visibility"
msgstr "Profil Anzeige"
#: ../../mod/contacts.php:310
#, 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."
#: ../../mod/contacts.php:311
msgid "Contact Information / Notes"
msgstr "Kontakt Informationen / Notizen"
#: ../../mod/contacts.php:312
msgid "Edit contact notes"
msgstr "Notizen zum Kontakt bearbiten"
#: ../../mod/contacts.php:317 ../../mod/contacts.php:433
#: ../../mod/viewcontacts.php:61
#, php-format
msgid "Visit %s's profile [%s]"
msgstr "Besuche %ss Profil [%s]"
#: ../../mod/contacts.php:318
msgid "Block/Unblock contact"
msgstr "Kontakt blockieren/freischalten"
#: ../../mod/contacts.php:319
msgid "Ignore contact"
msgstr "Ignoriere den Kontakt"
#: ../../mod/contacts.php:320
msgid "Repair URL settings"
msgstr "URL Einstellungen reparieren"
#: ../../mod/contacts.php:321
msgid "View conversations"
msgstr "Unterhaltungen anzeigen"
#: ../../mod/contacts.php:323
msgid "Delete contact"
msgstr "Lösche den Kontakt"
#: ../../mod/contacts.php:327
msgid "Last update:"
msgstr "letzte Aktualisierung:"
#: ../../mod/contacts.php:328
msgid "Update public posts"
msgstr "Öffentliche Beiträge aktualisieren"
#: ../../mod/contacts.php:330 ../../mod/admin.php:701
msgid "Update now"
msgstr "Jetzt aktualisieren"
#: ../../mod/contacts.php:337
msgid "Currently blocked"
msgstr "Derzeit geblockt"
#: ../../mod/contacts.php:338
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
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"
#: ../../mod/contacts.php:367 ../../include/nav.php:130
msgid "Contacts"
msgstr "Kontakte"
#: ../../mod/contacts.php:369
msgid "Show Blocked Connections"
msgstr "Zeige geblockte Verbindungen"
#: ../../mod/contacts.php:369
msgid "Hide Blocked Connections"
msgstr "Verstecke geblockte Verbindungen"
#: ../../mod/contacts.php:371
msgid "Search your contacts"
msgstr "Suche in deinen Kontakten"
#: ../../mod/contacts.php:409
msgid "Mutual Friendship"
msgstr "Beidseitige Freundschaft"
#: ../../mod/contacts.php:413
msgid "is a fan of yours"
msgstr "ist ein Fan von dir"
#: ../../mod/contacts.php:417
msgid "you are a fan of"
msgstr "du bist Fan von"
#: ../../mod/contacts.php:434 ../../include/Contact.php:129
#: ../../include/conversation.php:727
msgid "Edit contact"
msgstr "Kontakt bearbeiten"
#: ../../mod/settings.php:11 ../../mod/photos.php:64
msgid "everybody"
msgstr "jeder"
#: ../../mod/settings.php:69
msgid "Missing some important data!"
msgstr "Wichtige Daten fehlen!"
#: ../../mod/settings.php:72 ../../mod/settings.php:473 ../../mod/admin.php:62
msgid "Update"
msgstr "Aktualisierungen"
#: ../../mod/settings.php:167
msgid "Failed to connect with email account using the settings provided."
msgstr ""
"Konnte das Email Konto mit den angegebenen Einstellungen nicht erreichen."
#: ../../mod/settings.php:172
msgid "Email settings updated."
msgstr "EMail Einstellungen bearbeitet."
#: ../../mod/settings.php:190
msgid "Passwords do not match. Password unchanged."
msgstr ""
"Die Passwörter stimmen nicht überein. Das Passwort bleibt unverändert."
#: ../../mod/settings.php:195
msgid "Empty passwords are not allowed. Password unchanged."
msgstr "Leere Passwörter sind nicht erlaubt. Passwort bleibt unverändert."
#: ../../mod/settings.php:206
msgid "Password changed."
msgstr "Passwort ändern."
#: ../../mod/settings.php:208
msgid "Password update failed. Please try again."
msgstr ""
"Aktualisierung des Passworts gescheitert, bitte versuche es noch einmal."
#: ../../mod/settings.php:272
msgid " Please use a shorter name."
msgstr " Bitte verwende einen kürzeren Namen."
#: ../../mod/settings.php:274
msgid " Name too short."
msgstr " Name ist zu kurz."
#: ../../mod/settings.php:280
msgid " Not valid email."
msgstr " Keine gültige E-Mail."
#: ../../mod/settings.php:282
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
msgid "Settings updated."
msgstr "Einstellungen aktualisiert."
#: ../../mod/settings.php:409 ../../include/nav.php:128
msgid "Account settings"
msgstr "Account Einstellungen"
#: ../../mod/settings.php:414
msgid "Connector settings"
msgstr "Connector-Einstellungen"
#: ../../mod/settings.php:419
msgid "Plugin settings"
msgstr "Plugin-Einstellungen"
#: ../../mod/settings.php:424
msgid "Connections"
msgstr "Verbindungen"
#: ../../mod/settings.php:429
msgid "Export personal data"
msgstr "Persönliche Daten exportieren"
#: ../../mod/settings.php:446 ../../mod/settings.php:472
#: ../../mod/settings.php:505
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
msgid "Consumer Key"
msgstr "Consumer Key"
#: ../../mod/settings.php:451 ../../mod/settings.php:477
#: ../../addon/statusnet/statusnet.php:479
msgid "Consumer Secret"
msgstr "Consumer Secret"
#: ../../mod/settings.php:452 ../../mod/settings.php:478
msgid "Redirect"
msgstr "Umleiten"
#: ../../mod/settings.php:453 ../../mod/settings.php:479
msgid "Icon url"
msgstr "Icon URL"
#: ../../mod/settings.php:464
msgid "You can't edit this application."
msgstr "Du kannst dieses Programm nicht bearbeiten."
#: ../../mod/settings.php:504
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
msgid "Client key starts with"
msgstr "Anwender Schlüssel beginnt mit"
#: ../../mod/settings.php:509
msgid "No name"
msgstr "Kein Name"
#: ../../mod/settings.php:510
msgid "Remove authorization"
msgstr "Authorisierung entziehen"
#: ../../mod/settings.php:522
msgid "No Plugin settings configured"
msgstr "Keine Plugin-Einstellungen konfiguriert"
#: ../../mod/settings.php:529 ../../addon/widgets/widgets.php:122
msgid "Plugin Settings"
msgstr "Plugin-Einstellungen"
#: ../../mod/settings.php:542 ../../mod/settings.php:543
#, 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
msgid "enabled"
msgstr "eingeschaltet"
#: ../../mod/settings.php:542 ../../mod/settings.php:543
msgid "disabled"
msgstr "ausgeschaltet"
#: ../../mod/settings.php:543
msgid "StatusNet"
msgstr "StatusNet"
#: ../../mod/settings.php:569
msgid "Connector Settings"
msgstr "Verbindungs-Einstellungen"
#: ../../mod/settings.php:575
msgid "Email/Mailbox Setup"
msgstr "E-Mail/Postfach-Einstellungen"
#: ../../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."
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
msgid "Last successful email check:"
msgstr "Letzter erfolgreicher Email Check"
#: ../../mod/settings.php:578
msgid "Email access is disabled on this site."
msgstr "Zugriff auf E-Mails für diese Seite deaktiviert."
#: ../../mod/settings.php:579
msgid "IMAP server name:"
msgstr "IMAP-Server-Name:"
#: ../../mod/settings.php:580
msgid "IMAP port:"
msgstr "IMAP-Port:"
#: ../../mod/settings.php:581
msgid "Security:"
msgstr "Sicherheit:"
#: ../../mod/settings.php:581
msgid "None"
msgstr "Keine"
#: ../../mod/settings.php:582
msgid "Email login name:"
msgstr "E-Mail-Login-Name:"
#: ../../mod/settings.php:583
msgid "Email password:"
msgstr "E-Mail-Passwort:"
#: ../../mod/settings.php:584
msgid "Reply-to address:"
msgstr "Reply-to Adresse:"
#: ../../mod/settings.php:585
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
msgid "Normal Account"
msgstr "Normaler Account"
#: ../../mod/settings.php:643
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
msgid "Soapbox Account"
msgstr "Sandkasten-Account"
#: ../../mod/settings.php:647
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
msgid "Community/Celebrity Account"
msgstr "Gemeinschafts/Promi-Account"
#: ../../mod/settings.php:651
msgid ""
"Automatically approve all connection/friend requests as read-write fans"
msgstr ""
"Freundschaftsanfragen werden automatisch als Lese-und-Schreib-Fans "
"akzeptiert"
#: ../../mod/settings.php:654 ../../mod/admin.php:129 ../../mod/admin.php:446
msgid "Automatic Friend Account"
msgstr "Automatischer Freundesaccount"
#: ../../mod/settings.php:655
msgid "Automatically approve all connection/friend requests as friends"
msgstr "Freundschaftsanfragen werden automatisch als Freund akzeptiert"
#: ../../mod/settings.php:665
msgid "OpenID:"
msgstr "OpenID:"
#: ../../mod/settings.php:665
msgid "(Optional) Allow this OpenID to login to this account."
msgstr ""
"(Optional) Erlaube die Anmeldung für diesen Account mit dieser OpenID."
#: ../../mod/settings.php:675
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
msgid "Publish your default profile in the global social directory?"
msgstr "Veröffentliche dein Standardprofil im weltweiten Verzeichnis?"
#: ../../mod/settings.php:689
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
msgid "Hide your profile details from unknown viewers?"
msgstr "Profil-Details vor unbekannten Betrachtern verbergen?"
#: ../../mod/settings.php:698
msgid "Allow friends to post to your profile page?"
msgstr "Deinen Kontakten erlauben, auf deine Pinnwand zu schreiben?"
#: ../../mod/settings.php:704
msgid "Allow friends to tag your posts?"
msgstr ""
"Deinen Kontakten erlauben, deine Beiträge mit Schlagwörtern zu versehen?"
#: ../../mod/settings.php:710
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?"
#: ../../mod/settings.php:719
msgid "Profile is <strong>not published</strong>."
msgstr "Profil ist <strong>nicht veröffentlicht</strong>."
#: ../../mod/settings.php:738 ../../mod/profile_photo.php:206
msgid "or"
msgstr "oder"
#: ../../mod/settings.php:743
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:754
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."
#: ../../mod/settings.php:755
msgid "Advanced expiration settings"
msgstr "Erweiterte Verfallseinstellungen"
#: ../../mod/settings.php:756
msgid "Advanced Expiration"
msgstr "Erweitertes Verfallen"
#: ../../mod/settings.php:757
msgid "Expire posts:"
msgstr "Beiträge verfallen lassen:"
#: ../../mod/settings.php:758
msgid "Expire personal notes:"
msgstr "Persönliche Notizen verfallen lassen:"
#: ../../mod/settings.php:759
msgid "Expire starred posts:"
msgstr "Markierte Beiträge verfallen lassen:"
#: ../../mod/settings.php:760
msgid "Expire photos:"
msgstr "Fotos verfallen lassen:"
#: ../../mod/settings.php:765
msgid "Account Settings"
msgstr "Account-Einstellungen"
#: ../../mod/settings.php:773
msgid "Password Settings"
msgstr "Passwort-Einstellungen"
#: ../../mod/settings.php:774
msgid "New Password:"
msgstr "Neues Passwort:"
#: ../../mod/settings.php:775
msgid "Confirm:"
msgstr "Bestätigen:"
#: ../../mod/settings.php:775
msgid "Leave password fields blank unless changing"
msgstr "Lass die Passwort-Felder leer, außer du willst das Passwort ändern"
#: ../../mod/settings.php:779
msgid "Basic Settings"
msgstr "Grundeinstellungen"
#: ../../mod/settings.php:780 ../../include/profile_advanced.php:15
msgid "Full Name:"
msgstr "Kompletter Name:"
#: ../../mod/settings.php:781
msgid "Email Address:"
msgstr "Emailadresse:"
#: ../../mod/settings.php:782
msgid "Your Timezone:"
msgstr "Deine Zeitzone:"
#: ../../mod/settings.php:783
msgid "Default Post Location:"
msgstr "Standardstandort:"
#: ../../mod/settings.php:784
msgid "Use Browser Location:"
msgstr "Verwende den Standort des Browsers:"
#: ../../mod/settings.php:785
msgid "Display Theme:"
msgstr "Theme:"
#: ../../mod/settings.php:786
msgid "Update browser every xx seconds"
msgstr "Browser alle xx Sekunden aktualisieren"
#: ../../mod/settings.php:786
msgid "Minimum of 10 seconds, no maximum"
msgstr "Minimal 10 Sekunden, kein Maximum"
#: ../../mod/settings.php:788
msgid "Security and Privacy Settings"
msgstr "Sicherheits- und Privatsphäre-Einstellungen"
#: ../../mod/settings.php:790
msgid "Maximum Friend Requests/Day:"
msgstr "Maximale Anzahl von Freundschaftsanfragen/Tag:"
#: ../../mod/settings.php:790
msgid "(to prevent spam abuse)"
msgstr "(um SPAM zu vermeiden)"
#: ../../mod/settings.php:791
msgid "Default Post Permissions"
msgstr "Standard-Zugriffsrechte für Beiträge"
#: ../../mod/settings.php:792
msgid "(click to open/close)"
msgstr "(klicke zum öffnen/schließen)"
#: ../../mod/settings.php:807
msgid "Notification Settings"
msgstr "Benachrichtigungseinstellungen"
#: ../../mod/settings.php:808
msgid "Send a notification email when:"
msgstr "Benachrichtigungs-E-Mail senden wenn:"
#: ../../mod/settings.php:809
msgid "You receive an introduction"
msgstr "Du eine Kontaktanfrage erhältst"
#: ../../mod/settings.php:810
msgid "Your introductions are confirmed"
msgstr "Eine deiner Kontaktanfragen akzeptiert wurde"
#: ../../mod/settings.php:811
msgid "Someone writes on your profile wall"
msgstr "Jemand etwas auf deine Pinnwand schreibt"
#: ../../mod/settings.php:812
msgid "Someone writes a followup comment"
msgstr "Jemand auch einen Kommentar verfasst"
#: ../../mod/settings.php:813
msgid "You receive a private message"
msgstr "Du eine private Nachricht erhältst"
#: ../../mod/settings.php:814
msgid "You receive a friend suggestion"
msgstr "Du eine Empfehlung erhältst"
#: ../../mod/settings.php:817
msgid "Advanced Page Settings"
msgstr "Erweiterte Seiten-Einstellungen"
#: ../../mod/crepair.php:100
#: ../../mod/crepair.php:102
msgid "Contact settings applied."
msgstr "Einstellungen zum Kontakt angewandt."
#: ../../mod/crepair.php:102
#: ../../mod/crepair.php:104
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
#: ../../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 "Zugriff verweigert."
#: ../../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:133
#: ../../mod/crepair.php:135
msgid "Repair Contact Settings"
msgstr "Kontakt-Einstellungen reparieren"
#: ../../mod/crepair.php:135
#: ../../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."
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:136
#: ../../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."
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
#: ../../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:146
#: ../../mod/crepair.php:150
msgid "@Tagname - overrides Name/Nickname"
msgstr "@Tagname - überschreibt Name/Spitzname"
#: ../../mod/crepair.php:147
#: ../../mod/crepair.php:151
msgid "Account URL"
msgstr "Account-URL"
#: ../../mod/crepair.php:148
#: ../../mod/crepair.php:152
msgid "Friend Request URL"
msgstr "URL für Freundschaftsanfragen"
#: ../../mod/crepair.php:149
#: ../../mod/crepair.php:153
msgid "Friend Confirm URL"
msgstr "URL für Bestätigungen von Freundschaftsanfragen"
#: ../../mod/crepair.php:150
#: ../../mod/crepair.php:154
msgid "Notification Endpoint URL"
msgstr "URL-Endpunkt für Benachrichtigungen"
#: ../../mod/crepair.php:151
#: ../../mod/crepair.php:155
msgid "Poll/Feed URL"
msgstr "Pull/Feed-URL"
#: ../../mod/crepair.php:152
#: ../../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 "File exceeds size limit of %d"
msgstr "Die Datei ist größer als das erlaubte Limit von %d"
#: ../../mod/wall_attach.php:85 ../../mod/wall_attach.php:96
msgid "File upload failed."
msgstr "Hochladen der Datei fehlgeschlagen."
#: ../../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/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/photos.php:769
msgid "No photos selected"
msgstr "Keine Bilder ausgewählt"
#: ../../mod/photos.php:846
msgid "Access to this item is restricted."
msgstr "Zugriff zu diesem Eintrag wurde eingeschränkt."
#: ../../mod/photos.php:907
msgid "Upload Photos"
msgstr "Bilder hochladen"
#: ../../mod/photos.php:910 ../../mod/photos.php:954
msgid "New album name: "
msgstr "Name des neuen Albums: "
#: ../../mod/photos.php:911
msgid "or existing album name: "
msgstr "oder existierender Albumname: "
#: ../../mod/photos.php:912
msgid "Do not show a status post for this upload"
msgstr "Keine Status-Mitteilung für diesen Beitrag anzeigen"
#: ../../mod/photos.php:914 ../../mod/photos.php:1178
msgid "Permissions"
msgstr "Berechtigungen"
#: ../../mod/photos.php:969
msgid "Edit Album"
msgstr "Album bearbeiten"
#: ../../mod/photos.php:984 ../../mod/photos.php:1396
msgid "View Photo"
msgstr "Fotos betrachten"
#: ../../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/photos.php:1021
msgid "Photo not available"
msgstr "Foto nicht verfügbar"
#: ../../mod/photos.php:1071
msgid "View photo"
msgstr "Fotos ansehen"
#: ../../mod/photos.php:1071
msgid "Edit photo"
msgstr "Foto bearbeiten"
#: ../../mod/photos.php:1072
msgid "Use as profile photo"
msgstr "Als Profilbild verwenden"
#: ../../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 ""
"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
msgstr "Beispiel: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
#: ../../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 ""
"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"
#: ../../mod/friendica.php:49
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/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."
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."
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."
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"
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."
@ -1196,6 +739,14 @@ msgstr "Es scheint so, als ob du bereits ein Freund von %s bist."
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."
@ -1208,9 +759,7 @@ msgstr "Bitte melde dich an, um die Kontaktanfrage zu bestätigen."
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."
msgstr "Incorrect identity currently logged in. Please login to <strong>this</strong> profile."
#: ../../mod/dfrn_request.php:539
#, php-format
@ -1226,7 +775,7 @@ msgstr "Bitte bestätige deine Kontaktanfrage bei %s."
msgid "Confirm"
msgstr "Bestätigen"
#: ../../mod/dfrn_request.php:581 ../../include/items.php:2406
#: ../../mod/dfrn_request.php:581 ../../include/items.php:2443
msgid "[Name Withheld]"
msgstr "[Name Zurückgehalten]"
@ -1235,17 +784,13 @@ msgstr "[Name Zurückgehalten]"
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."
msgstr "Diaspora-User: Bitte nicht dieses Formular benutzen! Gebt statt dessen \"%s\" in der Diaspora-Suchleiste ein."
#: ../../mod/dfrn_request.php:668
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:"
msgstr "Bitte gib die Adresse deines Profils in einem der unterstützten sozialen Netzwerke an:"
#: ../../mod/dfrn_request.php:671
msgid "Friend/Connection Request"
@ -1255,9 +800,7 @@ msgstr "Freundschafts-/Kontaktanfrage"
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"
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:"
@ -1280,6 +823,11 @@ msgstr "Friendica"
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"
@ -1292,638 +840,253 @@ msgstr "Adresse deines Profils:"
msgid "Submit Request"
msgstr "Anfrage abschicken"
#: ../../mod/notifications.php:26
msgid "Invalid request identifier."
msgstr "Invalid request identifier."
#: ../../mod/install.php:111
msgid "Friendica Social Communications Server - Setup"
msgstr "Friendica-Server für soziale Netzwerke Setup"
#: ../../mod/notifications.php:35 ../../mod/notifications.php:150
#: ../../mod/notifications.php:195
msgid "Discard"
msgstr "Verwerfen"
#: ../../mod/install.php:117 ../../mod/install.php:157
#: ../../mod/install.php:230
msgid "Database connection"
msgstr "Datenbank-Verbindung"
#: ../../mod/notifications.php:71 ../../include/nav.php:109
msgid "Network"
msgstr "Netzwerk"
#: ../../mod/install.php:124
msgid "Could not connect to database."
msgstr "Verbindung zur Datenbank gescheitert"
#: ../../mod/notifications.php:76 ../../mod/network.php:169
msgid "Personal"
msgstr "Persönlich"
#: ../../mod/install.php:128
msgid "Could not create table."
msgstr "Konnte Tabelle nicht erstellen."
#: ../../mod/notifications.php:81 ../../include/nav.php:73
#: ../../include/nav.php:111
msgid "Home"
msgstr "Pinnwand"
#: ../../mod/install.php:133
msgid "Your Friendica site database has been installed."
msgstr "Die Datenbank deiner Friendica Seite wurde installiert."
#: ../../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."
#: ../../mod/profile_photo.php:89
#: ../../mod/install.php:134
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."
"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/profile_photo.php:99
msgid "Unable to process image"
msgstr "Bild konnte nicht verarbeitet werden"
#: ../../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/profile_photo.php:203
msgid "Upload File:"
msgstr "Datei hochladen:"
#: ../../mod/install.php:137
msgid "Proceed to registration"
msgstr "Mit der Registrierung fortfahren"
#: ../../mod/profile_photo.php:204
msgid "Upload Profile Photo"
msgstr "Profilbild hochladen"
#: ../../mod/install.php:143
msgid "Proceed with Installation"
msgstr "Mit der Installation fortfahren"
#: ../../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"
#: ../../mod/manage.php:90
#: ../../mod/install.php:150
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.)"
"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/manage.php:92
msgid "Select an identity to manage: "
msgstr "Wähle eine Identität zum Verwalten: "
#: ../../mod/install.php:158
msgid "Database import failed."
msgstr "Import der Datenbank schlug fehl."
#: ../../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/install.php:206
msgid "System check"
msgstr "Systemtest"
#: ../../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/install.php:211
msgid "Check again"
msgstr "Noch einmal testen"
#: ../../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"
#: ../../mod/profiles.php:416
#: ../../mod/install.php:231
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."
"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/profiles.php:461
msgid "Edit/Manage Profiles"
msgstr "Verwalte/Editiere Profile"
#: ../../mod/install.php:232
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/profiles.php:462 ../../boot.php:927
msgid "Change profile photo"
msgstr "Profilbild ändern"
#: ../../mod/install.php:233
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/profiles.php:463 ../../boot.php:928
msgid "Create New Profile"
msgstr "Neues Profil anlegen"
#: ../../mod/install.php:237
msgid "Database Server Name"
msgstr "Datenbank-Server"
#: ../../mod/profiles.php:473 ../../boot.php:938
msgid "Profile Image"
msgstr "Profilbild"
#: ../../mod/install.php:238
msgid "Database Login Name"
msgstr "Datenbank-Nutzer"
#: ../../mod/profiles.php:475 ../../boot.php:941
msgid "visible to everybody"
msgstr "sichtbar für jeden"
#: ../../mod/install.php:239
msgid "Database Login Password"
msgstr "Datenbank-Passwort"
#: ../../mod/profiles.php:476 ../../boot.php:942
msgid "Edit visibility"
msgstr "Sichtbarkeit bearbeiten"
#: ../../mod/install.php:240
msgid "Database Name"
msgstr "Datenbank-Name"
#: ../../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/install.php:241 ../../mod/install.php:280
msgid "Site administrator email address"
msgstr "E-Mail-Adresse des Administrators"
#: ../../mod/openid.php:79 ../../include/auth.php:217
msgid "Welcome "
msgstr "Willkommen "
#: ../../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 "Die E-Mail-Adresse, die in deinem Friendica-Account eingetragen, muss mit dieser Adresse übereinstimmen, damit du das Admin-Panel benutzen kannst."
#: ../../mod/openid.php:80 ../../include/auth.php:218
msgid "Please upload a profile photo."
msgstr "Bitte lade ein Profilbild hoch."
#: ../../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/openid.php:83 ../../include/auth.php:221
msgid "Welcome back "
msgstr "Willkommen zurück "
#: ../../mod/install.php:270
msgid "Site settings"
msgstr "Server-Einstellungen"
#: ../../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/install.php:326
msgid "PHP executable path"
msgstr "Pfad zu PHP"
#: ../../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 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/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 ""
"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/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/install.php:367
msgid "Generate encryption keys"
msgstr "Schlüssel erzeugen"
#: ../../mod/install.php:374
msgid "libCurl PHP module"
msgstr "PHP: libCurl-Modul"
#: ../../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:237
#: ../../include/bb2diaspora.php:249
msgid "l F d, Y \\@ g:i A"
msgstr "l F d, Y \\@ g:i A"
@ -1935,9 +1098,7 @@ msgstr "Zeitumrechnung"
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."
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
@ -1958,58 +1119,1195 @@ msgstr "Umgerechnete lokale Zeit: %s"
msgid "Please select your timezone:"
msgstr "Bitte wähle deine Zeitzone."
#: ../../mod/invite.php:35
#: ../../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/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 "%s : Not a valid email address."
msgstr "%s: Keine gültige Email Adresse."
msgid "Welcome to %s"
msgstr "Willkommen zu %s"
#: ../../mod/invite.php:59
#: ../../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 "Please join my network on %s"
msgstr "Bitte trete meinem Netzwerk auf %s bei"
msgid "suggested by %s"
msgstr "vorgeschlagen von %s"
#: ../../mod/invite.php:69
#: ../../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 : Message delivery failed."
msgstr "%s: Zustellung der Nachricht fehlgeschlagen."
msgid "%s liked %s's post"
msgstr "%s mag %ss Beitrag"
#: ../../mod/invite.php:73
#: ../../mod/notifications.php:253 ../../mod/notifications.php:348
#: ../../mod/notifications.php:435
#, php-format
msgid "%d message sent."
msgid_plural "%d messages sent."
msgstr[0] "%d Nachricht gesendet."
msgstr[1] "%d Nachrichten gesendet."
msgid "%s disliked %s's post"
msgstr "%s mag %ss Beitrag nicht"
#: ../../mod/invite.php:92
msgid "You have no more invitations available"
msgstr "Du hast keine weiteren Einladungen"
#: ../../mod/invite.php:99
msgid "Send invitations"
msgstr "Einladungen senden"
#: ../../mod/invite.php:100
msgid "Enter email addresses, one per line:"
msgstr "E-Mail-Adressen eingeben, eine pro Zeile:"
#: ../../mod/invite.php:102
#: ../../mod/notifications.php:267 ../../mod/notifications.php:362
#: ../../mod/notifications.php:449
#, php-format
msgid "Please join my social network on %s"
msgstr "Bitte trete meinem Sozialen Netzwerk auf %s bei"
msgid "%s is now friends with %s"
msgstr "%s ist jetzt mit %s befreundet"
#: ../../mod/invite.php:103
msgid "To accept this invitation, please visit:"
msgstr "Um diese Einladung anzunehmen besuche bitte:"
#: ../../mod/notifications.php:274 ../../mod/notifications.php:369
#, php-format
msgid "%s created a new post"
msgstr "%s hat einen neuen Beitrag erstellt"
#: ../../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/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/invite.php:104
#: ../../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:77
msgid "Could not locate selected profile."
msgstr "Konnte das ausgewählte Profil nicht finden."
#: ../../mod/contacts.php:100
msgid "Contact updated."
msgstr "Kontakt aktualisiert."
#: ../../mod/contacts.php:165
msgid "Contact has been blocked"
msgstr "Kontakt wurde blockiert"
#: ../../mod/contacts.php:165
msgid "Contact has been unblocked"
msgstr "Kontakt wurde wieder freigegeben"
#: ../../mod/contacts.php:179
msgid "Contact has been ignored"
msgstr "Der Kontakt wurde ignoriert"
#: ../../mod/contacts.php:179
msgid "Contact has been unignored"
msgstr "Kontakt wurde ignoriert"
#: ../../mod/contacts.php:200
msgid "stopped following"
msgstr "wird nicht mehr gefolgt"
#: ../../mod/contacts.php:221
msgid "Contact has been removed."
msgstr "Kontakt wurde entfernt."
#: ../../mod/contacts.php:245
#, php-format
msgid "You are mutual friends with %s"
msgstr "Du hast mit %s eine beidseitige Freundschaft"
#: ../../mod/contacts.php:249
#, php-format
msgid "You are sharing with %s"
msgstr "Du teilst mit %s"
#: ../../mod/contacts.php:254
#, php-format
msgid "%s is sharing with you"
msgstr "%s teilt mit Dir"
#: ../../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:274
msgid "Never"
msgstr "Niemals"
#: ../../mod/contacts.php:278
msgid "(Update was successful)"
msgstr "(Aktualisierung war erfolgreich)"
#: ../../mod/contacts.php:278
msgid "(Update was not successful)"
msgstr "(Aktualisierung war nicht erfolgreich)"
#: ../../mod/contacts.php:280
msgid "Suggest friends"
msgstr "Kontakte vorschlagen"
#: ../../mod/contacts.php:284
#, php-format
msgid "Network type: %s"
msgstr "Netzwerk Typ: %s"
#: ../../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:292
msgid "View all contacts"
msgstr "Alle Kontakte anzeigen"
#: ../../mod/contacts.php:297 ../../mod/contacts.php:344
#: ../../mod/admin.php:470
msgid "Unblock"
msgstr "Entsperren"
#: ../../mod/contacts.php:297 ../../mod/contacts.php:344
#: ../../mod/admin.php:469
msgid "Block"
msgstr "Sperren"
#: ../../mod/contacts.php:302 ../../mod/contacts.php:345
msgid "Unignore"
msgstr "Ignorieren aufheben"
#: ../../mod/contacts.php:307
msgid "Repair"
msgstr "Reparieren"
#: ../../mod/contacts.php:317
msgid "Contact Editor"
msgstr "Kontakt Editor"
#: ../../mod/contacts.php:320
msgid "Profile Visibility"
msgstr "Profil Anzeige"
#: ../../mod/contacts.php:321
#, php-format
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:"
"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."
#: ../../mod/contacts.php:322
msgid "Contact Information / Notes"
msgstr "Kontakt Informationen / Notizen"
#: ../../mod/contacts.php:323
msgid "Edit contact notes"
msgstr "Notizen zum Kontakt bearbiten"
#: ../../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:329
msgid "Block/Unblock contact"
msgstr "Kontakt blockieren/freischalten"
#: ../../mod/contacts.php:330
msgid "Ignore contact"
msgstr "Ignoriere den Kontakt"
#: ../../mod/contacts.php:331
msgid "Repair URL settings"
msgstr "URL Einstellungen reparieren"
#: ../../mod/contacts.php:332
msgid "View conversations"
msgstr "Unterhaltungen anzeigen"
#: ../../mod/contacts.php:334
msgid "Delete contact"
msgstr "Lösche den Kontakt"
#: ../../mod/contacts.php:338
msgid "Last update:"
msgstr "letzte Aktualisierung:"
#: ../../mod/contacts.php:339
msgid "Update public posts"
msgstr "Öffentliche Beiträge aktualisieren"
#: ../../mod/contacts.php:341 ../../mod/admin.php:701
msgid "Update now"
msgstr "Jetzt aktualisieren"
#: ../../mod/contacts.php:348
msgid "Currently blocked"
msgstr "Derzeit geblockt"
#: ../../mod/contacts.php:349
msgid "Currently ignored"
msgstr "Derzeit ignoriert"
#: ../../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"
#: ../../mod/contacts.php:387 ../../include/nav.php:131
msgid "Contacts"
msgstr "Kontakte"
#: ../../mod/contacts.php:389
msgid "Show Unblocked Contacts"
msgstr "Nicht geblockte Kontakte anzeigen"
#: ../../mod/contacts.php:389
msgid "Show Blocked Contacts"
msgstr "Blockierte Kontakte anzeigen"
#: ../../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: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:438
msgid "is a fan of yours"
msgstr "ist ein Fan von dir"
#: ../../mod/contacts.php:442
msgid "you are a fan of"
msgstr "du bist Fan von"
#: ../../mod/contacts.php:459 ../../include/Contact.php:135
#: ../../include/conversation.php:748
msgid "Edit contact"
msgstr "Kontakt bearbeiten"
#: ../../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/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:73 ../../mod/settings.php:479 ../../mod/admin.php:62
msgid "Update"
msgstr "Aktualisierungen"
#: ../../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."
#: ../../mod/settings.php:173
msgid "Email settings updated."
msgstr "EMail Einstellungen bearbeitet."
#: ../../mod/settings.php:191
msgid "Passwords do not match. Password unchanged."
msgstr "Die Passwörter stimmen nicht überein. Das Passwort bleibt unverändert."
#: ../../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:207
msgid "Password changed."
msgstr "Passwort ändern."
#: ../../mod/settings.php:209
msgid "Password update failed. Please try again."
msgstr "Aktualisierung des Passworts gescheitert, bitte versuche es noch einmal."
#: ../../mod/settings.php:273
msgid " Please use a shorter name."
msgstr " Bitte verwende einen kürzeren Namen."
#: ../../mod/settings.php:275
msgid " Name too short."
msgstr " Name ist zu kurz."
#: ../../mod/settings.php:281
msgid " Not valid email."
msgstr " Keine gültige E-Mail."
#: ../../mod/settings.php:283
msgid " Cannot change to that email."
msgstr " Cannot change to that email."
#: ../../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:415 ../../include/nav.php:129
msgid "Account settings"
msgstr "Account Einstellungen"
#: ../../mod/settings.php:420
msgid "Connector settings"
msgstr "Connector-Einstellungen"
#: ../../mod/settings.php:425
msgid "Plugin settings"
msgstr "Plugin-Einstellungen"
#: ../../mod/settings.php:430
msgid "Connections"
msgstr "Verbindungen"
#: ../../mod/settings.php:435
msgid "Export personal data"
msgstr "Persönliche Daten exportieren"
#: ../../mod/settings.php:452 ../../mod/settings.php:478
#: ../../mod/settings.php:511
msgid "Add application"
msgstr "Programm hinzufügen"
#: ../../mod/settings.php:456 ../../mod/settings.php:482
#: ../../addon/statusnet/statusnet.php:489
msgid "Consumer Key"
msgstr "Consumer Key"
#: ../../mod/settings.php:457 ../../mod/settings.php:483
#: ../../addon/statusnet/statusnet.php:488
msgid "Consumer Secret"
msgstr "Consumer Secret"
#: ../../mod/settings.php:458 ../../mod/settings.php:484
msgid "Redirect"
msgstr "Umleiten"
#: ../../mod/settings.php:459 ../../mod/settings.php:485
msgid "Icon url"
msgstr "Icon URL"
#: ../../mod/settings.php:470
msgid "You can't edit this application."
msgstr "Du kannst dieses Programm nicht bearbeiten."
#: ../../mod/settings.php:510
msgid "Connected Apps"
msgstr "Verbundene Programme"
#: ../../mod/settings.php:514
msgid "Client key starts with"
msgstr "Anwender Schlüssel beginnt mit"
#: ../../mod/settings.php:515
msgid "No name"
msgstr "Kein Name"
#: ../../mod/settings.php:516
msgid "Remove authorization"
msgstr "Authorisierung entziehen"
#: ../../mod/settings.php:528
msgid "No Plugin settings configured"
msgstr "Keine Plugin-Einstellungen konfiguriert"
#: ../../mod/settings.php:535 ../../addon/widgets/widgets.php:122
msgid "Plugin Settings"
msgstr "Plugin-Einstellungen"
#: ../../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:548 ../../mod/settings.php:549
msgid "enabled"
msgstr "eingeschaltet"
#: ../../mod/settings.php:548 ../../mod/settings.php:549
msgid "disabled"
msgstr "ausgeschaltet"
#: ../../mod/settings.php:549
msgid "StatusNet"
msgstr "StatusNet"
#: ../../mod/settings.php:575
msgid "Connector Settings"
msgstr "Verbindungs-Einstellungen"
#: ../../mod/settings.php:581
msgid "Email/Mailbox Setup"
msgstr "E-Mail/Postfach-Einstellungen"
#: ../../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."
#: ../../mod/settings.php:583
msgid "Last successful email check:"
msgstr "Letzter erfolgreicher Email Check"
#: ../../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:585
msgid "IMAP server name:"
msgstr "IMAP-Server-Name:"
#: ../../mod/settings.php:586
msgid "IMAP port:"
msgstr "IMAP-Port:"
#: ../../mod/settings.php:587
msgid "Security:"
msgstr "Sicherheit:"
#: ../../mod/settings.php:587
msgid "None"
msgstr "Keine"
#: ../../mod/settings.php:588
msgid "Email login name:"
msgstr "E-Mail-Login-Name:"
#: ../../mod/settings.php:589
msgid "Email password:"
msgstr "E-Mail-Passwort:"
#: ../../mod/settings.php:590
msgid "Reply-to address:"
msgstr "Reply-to Adresse:"
#: ../../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:648 ../../mod/admin.php:126 ../../mod/admin.php:443
msgid "Normal Account"
msgstr "Normaler Account"
#: ../../mod/settings.php:649
msgid "This account is a normal personal profile"
msgstr "Dieser Account ist ein normales persönliches Profil"
#: ../../mod/settings.php:652 ../../mod/admin.php:127 ../../mod/admin.php:444
msgid "Soapbox Account"
msgstr "Sandkasten-Account"
#: ../../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:656 ../../mod/admin.php:128 ../../mod/admin.php:445
msgid "Community/Celebrity Account"
msgstr "Gemeinschafts/Promi-Account"
#: ../../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"
#: ../../mod/settings.php:660 ../../mod/admin.php:129 ../../mod/admin.php:446
msgid "Automatic Friend Account"
msgstr "Automatischer Freundesaccount"
#: ../../mod/settings.php:661
msgid "Automatically approve all connection/friend requests as friends"
msgstr "Freundschaftsanfragen werden automatisch als Freund akzeptiert"
#: ../../mod/settings.php:671
msgid "OpenID:"
msgstr "OpenID:"
#: ../../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."
#: ../../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:687
msgid "Publish your default profile in the global social directory?"
msgstr "Veröffentliche dein Standardprofil im weltweiten Verzeichnis?"
#: ../../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:699
msgid "Hide your profile details from unknown viewers?"
msgstr "Profil-Details vor unbekannten Betrachtern verbergen?"
#: ../../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:710
msgid "Allow friends to tag your posts?"
msgstr "Deinen Kontakten erlauben, deine Beiträge mit Schlagwörtern zu versehen?"
#: ../../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?"
#: ../../mod/settings.php:725
msgid "Profile is <strong>not published</strong>."
msgstr "Profil ist <strong>nicht veröffentlicht</strong>."
#: ../../mod/settings.php:744 ../../mod/profile_photo.php:206
msgid "or"
msgstr "oder"
#: ../../mod/settings.php:749
msgid "Your Identity Address is"
msgstr "Die Adresse deines Profils lautet:"
#: ../../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: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."
#: ../../mod/settings.php:761
msgid "Advanced expiration settings"
msgstr "Erweiterte Verfallseinstellungen"
#: ../../mod/settings.php:762
msgid "Advanced Expiration"
msgstr "Erweitertes Verfallen"
#: ../../mod/settings.php:763
msgid "Expire posts:"
msgstr "Beiträge verfallen lassen:"
#: ../../mod/settings.php:764
msgid "Expire personal notes:"
msgstr "Persönliche Notizen verfallen lassen:"
#: ../../mod/settings.php:765
msgid "Expire starred posts:"
msgstr "Markierte Beiträge verfallen lassen:"
#: ../../mod/settings.php:766
msgid "Expire photos:"
msgstr "Fotos verfallen lassen:"
#: ../../mod/settings.php:771
msgid "Account Settings"
msgstr "Account-Einstellungen"
#: ../../mod/settings.php:779
msgid "Password Settings"
msgstr "Passwort-Einstellungen"
#: ../../mod/settings.php:780
msgid "New Password:"
msgstr "Neues Passwort:"
#: ../../mod/settings.php:781
msgid "Confirm:"
msgstr "Bestätigen:"
#: ../../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:785
msgid "Basic Settings"
msgstr "Grundeinstellungen"
#: ../../mod/settings.php:786 ../../include/profile_advanced.php:15
msgid "Full Name:"
msgstr "Kompletter Name:"
#: ../../mod/settings.php:787
msgid "Email Address:"
msgstr "Emailadresse:"
#: ../../mod/settings.php:788
msgid "Your Timezone:"
msgstr "Deine Zeitzone:"
#: ../../mod/settings.php:789
msgid "Default Post Location:"
msgstr "Standardstandort:"
#: ../../mod/settings.php:790
msgid "Use Browser Location:"
msgstr "Verwende den Standort des Browsers:"
#: ../../mod/settings.php:791
msgid "Display Theme:"
msgstr "Theme:"
#: ../../mod/settings.php:792
msgid "Update browser every xx seconds"
msgstr "Browser alle xx Sekunden aktualisieren"
#: ../../mod/settings.php:792
msgid "Minimum of 10 seconds, no maximum"
msgstr "Minimal 10 Sekunden, kein Maximum"
#: ../../mod/settings.php:794
msgid "Security and Privacy Settings"
msgstr "Sicherheits- und Privatsphäre-Einstellungen"
#: ../../mod/settings.php:796
msgid "Maximum Friend Requests/Day:"
msgstr "Maximale Anzahl von Freundschaftsanfragen/Tag:"
#: ../../mod/settings.php:796
msgid "(to prevent spam abuse)"
msgstr "(um SPAM zu vermeiden)"
#: ../../mod/settings.php:797
msgid "Default Post Permissions"
msgstr "Standard-Zugriffsrechte für Beiträge"
#: ../../mod/settings.php:798
msgid "(click to open/close)"
msgstr "(klicke zum öffnen/schließen)"
#: ../../mod/settings.php:813
msgid "Notification Settings"
msgstr "Benachrichtigungseinstellungen"
#: ../../mod/settings.php:814
msgid "Send a notification email when:"
msgstr "Benachrichtigungs-E-Mail senden wenn:"
#: ../../mod/settings.php:815
msgid "You receive an introduction"
msgstr "Du eine Kontaktanfrage erhältst"
#: ../../mod/settings.php:816
msgid "Your introductions are confirmed"
msgstr "Eine deiner Kontaktanfragen akzeptiert wurde"
#: ../../mod/settings.php:817
msgid "Someone writes on your profile wall"
msgstr "Jemand etwas auf deine Pinnwand schreibt"
#: ../../mod/settings.php:818
msgid "Someone writes a followup comment"
msgstr "Jemand auch einen Kommentar verfasst"
#: ../../mod/settings.php:819
msgid "You receive a private message"
msgstr "Du eine private Nachricht erhältst"
#: ../../mod/settings.php:820
msgid "You receive a friend suggestion"
msgstr "Du eine Empfehlung erhältst"
#: ../../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/manage.php:90
msgid "Manage Identities and/or Pages"
msgstr "Verwalte Identitäten und/oder Seiten"
#: ../../mod/manage.php:93
msgid ""
"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/manage.php:95
msgid "Select an identity to manage: "
msgstr "Wähle eine Identität zum Verwalten: "
#: ../../mod/network.php:43
msgid "Search Results For:"
msgstr "Suchergebnisse für:"
#: ../../mod/network.php:77 ../../mod/search.php:16
msgid "Remove term"
msgstr "Begriff entfernen"
#: ../../mod/network.php:86 ../../mod/search.php:13
msgid "Saved Searches"
msgstr "Gespeicherte Suchen"
#: ../../mod/network.php:87 ../../include/group.php:216
msgid "add"
msgstr "hinzufügen"
#: ../../mod/network.php:166
msgid "Commented Order"
msgstr "Neueste Kommentare"
#: ../../mod/network.php:171
msgid "Posted Order"
msgstr "Neueste Beiträge"
#: ../../mod/network.php:182
msgid "New"
msgstr "Neue"
#: ../../mod/network.php:187
msgid "Starred"
msgstr "Markierte"
#: ../../mod/network.php:192
msgid "Bookmarks"
msgstr "Lesezeichen"
#: ../../mod/network.php:250
#, 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: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/network.php:304
msgid "No such group"
msgstr "Es gibt keine solche Gruppe"
#: ../../mod/network.php:315
msgid "Group is empty"
msgstr "Gruppe ist leer"
#: ../../mod/network.php:319
msgid "Group: "
msgstr "Gruppe: "
#: ../../mod/network.php:329
msgid "Contact: "
msgstr "Kontakt: "
#: ../../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/network.php:336
msgid "Invalid contact."
msgstr "Ungültiger Kontakt."
#: ../../mod/notes.php:44 ../../boot.php:1350
msgid "Personal Notes"
msgstr "Persönliche Notizen"
#: ../../mod/notes.php:63 ../../include/text.php:639
msgid "Save"
msgstr "Speichern"
#: ../../mod/newmember.php:6
msgid "Welcome to Friendica"
msgstr "Willkommen bei Friendica"
#: ../../mod/newmember.php:8
msgid "New Member Checklist"
msgstr "Checkliste für neue Mitglieder"
#: ../../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 "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/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 "Ä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/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 "Ü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/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."
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/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 "Richte die Verbindung zu Facebook ein, wenn du im Augenblick ein Facebook Konto hast und (optional) deine Facebook Freunde und Unterhaltungen importieren willst."
#: ../../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 "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/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 "Editiere dein <strong>Standard</strong> Profil nach deinen Vorlieben. Überprüfe die Einstellungen zum Verbergen deiner Freundesliste vor unbekannten Betrachtern des Profils."
#: ../../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/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/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/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/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/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/group.php:27
msgid "Group created."
msgstr "Gruppe erstellt."
#: ../../mod/group.php:33
msgid "Could not create group."
msgstr "Konnte die Gruppe nicht erstellen."
#: ../../mod/group.php:43 ../../mod/group.php:123
msgid "Group not found."
msgstr "Gruppe nicht gefunden."
#: ../../mod/group.php:56
msgid "Group name changed."
msgstr "Gruppenname geändert."
#: ../../mod/group.php:67 ../../mod/profperm.php:19 ../../index.php:287
msgid "Permission denied"
msgstr "Zugriff verweigert"
#: ../../mod/group.php:82
msgid "Create a group of contacts/friends."
msgstr "Eine Gruppe von Kontakten/Freunden anlegen."
#: ../../mod/group.php:83 ../../mod/group.php:166
msgid "Group Name: "
msgstr "Gruppenname:"
#: ../../mod/group.php:98
msgid "Group removed."
msgstr "Gruppe entfernt."
#: ../../mod/group.php:100
msgid "Unable to remove group."
msgstr "Konnte die Gruppe nicht entfernen."
#: ../../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/group.php:165
msgid "Group Editor"
msgstr "Gruppeneditor"
#: ../../mod/group.php:179
msgid "Members"
msgstr "Mitglieder"
#: ../../mod/group.php:194
msgid "All Contacts"
msgstr "Alle Kontakte"
#: ../../mod/profperm.php:25 ../../mod/profperm.php:55
msgid "Invalid profile identifier."
msgstr "Ungültiger Profil-Bezeichner"
#: ../../mod/profperm.php:101
msgid "Profile Visibility Editor"
msgstr "Editor für die Profil-Sichtbarkeit"
#: ../../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/profperm.php:114
msgid "Visible To"
msgstr "Sichtbar für"
#: ../../mod/profperm.php:130
msgid "All Contacts (with secure profile access)"
msgstr "Alle Kontakte (mit gesichertem Profilzugriff)"
#: ../../mod/viewcontacts.php:25 ../../include/text.php:578
msgid "View Contacts"
msgstr "Kontakte anzeigen"
#: ../../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/dirfind.php:23
msgid "People Search"
msgstr "Personen Suche"
#: ../../mod/apps.php:7
msgid "No installed applications."
msgstr "Keine Applikationen installiert."
#: ../../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/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
#: ../../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 "Suggest a friend for %s"
msgstr "Schlage %s einen Kontakt vor"
msgid "%1$s likes %2$s's %3$s"
msgstr "%1$s mag %2$ss %3$s"
#: ../../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
#: ../../mod/like.php:146 ../../include/conversation.php:46
#, php-format
msgid "{0} commented %s's post"
msgstr "{0} kommentierte einen Beitrag von %s"
msgid "%1$s doesn't like %2$s's %3$s"
msgstr "%1$s mag %2$ss %3$s nicht"
#: ../../mod/ping.php:169
#, php-format
msgid "{0} liked %s's post"
msgstr "{0} mag %ss Beitrag"
#: ../../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/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/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: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"
#: ../../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/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/item.php:88
msgid "Unable to locate original post."
msgstr "Konnte den Originalbeitrag nicht finden."
#: ../../mod/install.php:117 ../../mod/install.php:157
#: ../../mod/install.php:229
msgid "Database connection"
msgstr "Datenbank-Verbindung"
#: ../../mod/item.php:248
msgid "Empty post discarded."
msgstr "Leerer Beitrag wurde verworfen."
#: ../../mod/install.php:124
msgid "Could not connect to database."
msgstr "Verbindung zur Datenbank gescheitert"
#: ../../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:128
msgid "Could not create table."
msgstr "Konnte Tabelle nicht erstellen."
#: ../../mod/item.php:827
msgid "System error. Post not saved."
msgstr "Systemfehler. Beitrag konnte nicht gespeichert werden."
#: ../../mod/install.php:133
msgid "Your Friendica site database has been installed."
msgstr "Die Datenbank deiner Friendica Seite wurde installiert."
#: ../../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."
"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:135 ../../mod/install.php:151
#: ../../mod/install.php:209
msgid "Please see the file \"INSTALL.txt\"."
msgstr "Lies bitte die \"INSTALL.txt\"."
#: ../../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: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
#: ../../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."
"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:158
msgid "Database import failed."
msgstr "Import der Datenbank schlug fehl."
#: ../../mod/item.php:857
#, php-format
msgid "%s posted an update."
msgstr "%s hat ein Update veröffentlicht."
#: ../../mod/install.php:206
msgid "System check"
msgstr "Systemtest"
#: ../../mod/profile_photo.php:28
msgid "Image uploaded but image cropping failed."
msgstr "Bilder hochgeladen, aber das Zuschneiden ist fehlgeschlagen."
#: ../../mod/install.php:210 ../../mod/events.php:213
msgid "Next"
msgstr "Nächste"
#: ../../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:211
msgid "Check again"
msgstr "Noch einmal testen"
#: ../../mod/install.php:230
#: ../../mod/profile_photo.php:89
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."
"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:231
#: ../../mod/profile_photo.php:99
msgid "Unable to process image"
msgstr "Bild konnte nicht verarbeitet werden"
#: ../../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/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/hcard.php:10
msgid "No profile"
msgstr "Kein Profil"
#: ../../mod/removeme.php:45 ../../mod/removeme.php:48
msgid "Remove My Account"
msgstr "Account löschen"
#: ../../mod/removeme.php:46
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."
"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:232
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/removeme.php:47
msgid "Please enter your password for verification:"
msgstr "Bitte gib dein Passwort zur Verifikation ein:"
#: ../../mod/install.php:236
msgid "Database Server Name"
msgstr "Datenbank-Server"
#: ../../mod/message.php:23
msgid "No recipient selected."
msgstr "Kein Empfänger gewählt."
#: ../../mod/install.php:237
msgid "Database Login Name"
msgstr "Datenbank-Nutzer"
#: ../../mod/message.php:26
msgid "Unable to locate contact information."
msgstr "Konnte die Kontaktinformationen nicht finden."
#: ../../mod/install.php:238
msgid "Database Login Password"
msgstr "Datenbank-Passwort"
#: ../../mod/message.php:29
msgid "Message could not be sent."
msgstr "Nachricht konnte nicht gesendet werden."
#: ../../mod/install.php:239
msgid "Database Name"
msgstr "Datenbank-Name"
#: ../../mod/message.php:32
msgid "Message collection failure."
msgstr "Konnte Nachrichten nicht abrufen."
#: ../../mod/install.php:240 ../../mod/install.php:279
msgid "Site administrator email address"
msgstr "E-Mail-Adresse des Administrators"
#: ../../mod/message.php:35
msgid "Message sent."
msgstr "Nachricht gesendet."
#: ../../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/message.php:55
msgid "Inbox"
msgstr "Eingang"
#: ../../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/message.php:60
msgid "Outbox"
msgstr "Ausgang"
#: ../../mod/install.php:269
msgid "Site settings"
msgstr "Server-Einstellungen"
#: ../../mod/message.php:65
msgid "New Message"
msgstr "Neue Nachricht"
#: ../../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/message.php:91
msgid "Message deleted."
msgstr "Nachricht gelöscht."
#: ../../mod/install.php:325
msgid "PHP executable path"
msgstr "Pfad zu PHP"
#: ../../mod/message.php:121
msgid "Conversation removed."
msgstr "Unterhaltung gelöscht."
#: ../../mod/install.php:325
msgid "Enter full path to php executable"
msgstr "Kompletter Pfad zum PHP-Executable"
#: ../../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:330
msgid "Command line PHP"
msgstr "Kommadozeilen-PHP"
#: ../../mod/message.php:145
msgid "Send Private Message"
msgstr "Private Nachricht senden"
#: ../../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/message.php:146 ../../mod/message.php:287
msgid "To:"
msgstr "An:"
#: ../../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/message.php:147 ../../mod/message.php:288
msgid "Subject:"
msgstr "Betreff:"
#: ../../mod/install.php:342
msgid "PHP \"register_argc_argv\""
msgstr "PHP \"register_argc_argv\""
#: ../../mod/message.php:150 ../../mod/message.php:291
#: ../../mod/invite.php:101
msgid "Your message:"
msgstr "Deine Nachricht:"
#: ../../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/message.php:188
msgid "No messages."
msgstr "Keine Nachrichten."
#: ../../mod/install.php:364
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/message.php:201
msgid "Delete conversation"
msgstr "Unterhaltung löschen"
#: ../../mod/install.php:366
msgid "Generate encryption keys"
msgstr "Schlüssel erzeugen"
#: ../../mod/message.php:204
msgid "D, d M Y - g:i A"
msgstr "D, d. M Y - g:i A"
#: ../../mod/install.php:373
msgid "libCurl PHP module"
msgstr "PHP: libCurl-Modul"
#: ../../mod/message.php:239
msgid "Message not available."
msgstr "Nachricht nicht verfügbar."
#: ../../mod/install.php:374
msgid "GD graphics PHP module"
msgstr "PHP: GD-Grafikmodul"
#: ../../mod/message.php:276
msgid "Delete message"
msgstr "Nachricht löschen"
#: ../../mod/install.php:375
msgid "OpenSSL PHP module"
msgstr "PHP: OpenSSL-Modul"
#: ../../mod/message.php:286
msgid "Send Reply"
msgstr "Antwort senden"
#: ../../mod/install.php:376
msgid "mysqli PHP module"
msgstr "PHP: mysqli-Modul"
#: ../../mod/allfriends.php:34
#, php-format
msgid "Friends of %s"
msgstr "Freunde von %s"
#: ../../mod/install.php:377
msgid "mb_string PHP module"
msgstr "PHP: mb_string-Modul"
#: ../../mod/install.php:382 ../../mod/install.php:384
msgid "Apace mod_rewrite module"
msgstr "Apache: mod_rewrite-Modul"
#: ../../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/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/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/install.php:397
msgid "Error: openssl PHP module required but not installed."
msgstr "Fehler: Das openssl-Modul von PHP ist nicht installiert."
#: ../../mod/install.php:401
msgid "Error: mysqli PHP module required but not installed."
msgstr "Fehler: Das mysqli-Modul von PHP ist nicht installiert."
#: ../../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/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/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/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/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/install.php:428
msgid ".htconfig.php is writable"
msgstr "Schreibrechte auf .htconfig.php"
#: ../../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/install.php:460
msgid "Errors encountered creating database tables."
msgstr "Fehler aufgetreten während der Erzeugung der Datenbanktabellen."
#: ../../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/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/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."
#: ../../addon/facebook/facebook.php:337
msgid "Facebook disabled"
msgstr "Facebook deaktiviert"
#: ../../mod/profile.php:131
msgid "Tips for New Members"
msgstr "Tipps für neue Nutzer"
#: ../../addon/facebook/facebook.php:342
msgid "Updating contacts"
msgstr "Aktualisiere Kontakte"
#: ../../mod/item.php:89
msgid "Unable to locate original post."
msgstr "Konnte den Originalbeitrag nicht finden."
#: ../../addon/facebook/facebook.php:351
msgid "Facebook API key is missing."
msgstr "Facebook-API-Schlüssel nicht gefunden"
#: ../../mod/item.php:206
msgid "Empty post discarded."
msgstr "Leerer Beitrag wurde verworfen."
#: ../../addon/facebook/facebook.php:358
msgid "Facebook Connect"
msgstr "Mit Facebook verbinden"
#: ../../mod/item.php:778
msgid "System error. Post not saved."
msgstr "Systemfehler. Beitrag konnte nicht gespeichert werden."
#: ../../addon/facebook/facebook.php:364
msgid "Install Facebook connector for this account."
msgstr "Facebook-Connector für diesen Account installieren."
#: ../../mod/item.php:803
#, php-format
#: ../../addon/facebook/facebook.php:371
msgid "Remove Facebook connector"
msgstr "Facebook-Connector entfernen"
#: ../../addon/facebook/facebook.php:376
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."
"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/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:383
msgid "Post to Facebook by default"
msgstr "Veröffentliche standardmäßig bei Facebook"
#: ../../mod/item.php:806
#: ../../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 ""
"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."
"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/item.php:808
#, php-format
msgid "%s posted an update."
msgstr "%s hat ein Update veröffentlicht."
#: ../../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/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"
#: ../../mod/photos.php:524
msgid "was tagged in a"
msgstr "wurde getaggt in einem"
#: ../../mod/photos.php:524
msgid "by"
msgstr "von"
#: ../../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 "
#: ../../mod/photos.php:635
msgid "Image file is empty."
msgstr "Bilddatei ist leer."
#: ../../mod/photos.php:764
msgid "No photos selected"
msgstr "Keine Bilder ausgewählt"
#: ../../mod/photos.php:841
msgid "Access to this item is restricted."
msgstr "Zugriff zu diesem Eintrag wurde eingeschränkt."
#: ../../mod/photos.php:895
msgid "Upload Photos"
msgstr "Bilder hochladen"
#: ../../mod/photos.php:898 ../../mod/photos.php:942
msgid "New album name: "
msgstr "Name des neuen Albums: "
#: ../../mod/photos.php:899
msgid "or existing album name: "
msgstr "oder existierender Albumname: "
#: ../../mod/photos.php:900
msgid "Do not show a status post for this upload"
msgstr "Keine Status-Mitteilung für diesen Beitrag anzeigen"
#: ../../mod/photos.php:902 ../../mod/photos.php:1161
msgid "Permissions"
msgstr "Berechtigungen"
#: ../../mod/photos.php:957
msgid "Edit Album"
msgstr "Album bearbeiten"
#: ../../mod/photos.php:967 ../../mod/photos.php:1379
msgid "View Photo"
msgstr "Fotos betrachten"
#: ../../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."
#: ../../mod/photos.php:1004
msgid "Photo not available"
msgstr "Foto nicht verfügbar"
#: ../../mod/photos.php:1054
msgid "View photo"
msgstr "Fotos ansehen"
#: ../../mod/photos.php:1054
msgid "Edit photo"
msgstr "Foto bearbeiten"
#: ../../mod/photos.php:1055
msgid "Use as profile photo"
msgstr "Als Profilbild verwenden"
#: ../../mod/photos.php:1061 ../../include/conversation.php:423
msgid "Private Message"
msgstr "Private Nachricht"
#: ../../mod/photos.php:1072
msgid "View Full Size"
msgstr "Betrachte Originalgröße"
#: ../../mod/photos.php:1140
msgid "Tags: "
msgstr "Tags: "
#: ../../mod/photos.php:1143
msgid "[Remove any tag]"
msgstr "[Tag entfernen]"
#: ../../mod/photos.php:1154
msgid "New album name"
msgstr "Name des neuen Albums"
#: ../../mod/photos.php:1157
msgid "Caption"
msgstr "Bildunterschrift"
#: ../../mod/photos.php:1159
msgid "Add a Tag"
msgstr "Tag hinzufügen"
#: ../../mod/photos.php:1163
#: ../../addon/facebook/facebook.php:391
msgid ""
"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
msgstr ""
"Beispiel: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
"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:1183 ../../include/conversation.php:470
msgid "I like this (toggle)"
msgstr "Ich mag das (toggle)"
#: ../../mod/photos.php:1184 ../../include/conversation.php:471
msgid "I don't like this (toggle)"
msgstr "Ich mag das nicht (toggle)"
#: ../../mod/photos.php:1185 ../../include/conversation.php:862
msgid "Share"
msgstr "Teilen"
#: ../../mod/photos.php:1202 ../../mod/photos.php:1242
#: ../../mod/photos.php:1273 ../../include/conversation.php:485
msgid "This is you"
msgstr "Das bist du"
#: ../../mod/photos.php:1204 ../../mod/photos.php:1244
#: ../../mod/photos.php:1275 ../../include/conversation.php:487
#: ../../boot.php:438
msgid "Comment"
msgstr "Kommentar"
#: ../../mod/photos.php:1206 ../../include/conversation.php:489
#: ../../include/conversation.php:897
msgid "Preview"
msgstr "Vorschau"
#: ../../mod/photos.php:1385
msgid "View Album"
msgstr "Album betrachten"
#: ../../mod/photos.php:1394
msgid "Recent Photos"
msgstr "Neueste Fotos"
#: ../../mod/photos.php:1396
msgid "Upload New Photos"
msgstr "Weitere Fotos hochladen"
#: ../../mod/network.php:43
msgid "Search Results For:"
msgstr "Suchergebnisse für:"
#: ../../mod/network.php:85 ../../include/group.php:216
msgid "add"
msgstr "hinzufügen"
#: ../../mod/network.php:158
msgid "Commented Order"
msgstr "Neueste Kommentare"
#: ../../mod/network.php:163
msgid "Posted Order"
msgstr "Neueste Beiträge"
#: ../../mod/network.php:174
msgid "New"
msgstr "Neue"
#: ../../mod/network.php:179
msgid "Starred"
msgstr "Markierte"
#: ../../mod/network.php:184
msgid "Bookmarks"
msgstr "Lesezeichen"
#: ../../mod/network.php:232
#, 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"
#: ../../mod/network.php:297
msgid "Group is empty"
msgstr "Gruppe ist leer"
#: ../../mod/network.php:301
msgid "Group: "
msgstr "Gruppe: "
#: ../../mod/network.php:311
msgid "Contact: "
msgstr "Kontakt: "
#: ../../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."
#: ../../mod/network.php:318
msgid "Invalid contact."
msgstr "Ungültiger Kontakt."
#: ../../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
#: ../../addon/facebook/facebook.php:395
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?"
"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/friendica.php:43
msgid "This is Friendica, version"
msgstr "Dies ist Friendica version"
#: ../../addon/facebook/facebook.php:400
msgid "Do not import your Facebook profile wall conversations"
msgstr "Facebook-Pinnwand nicht importieren"
#: ../../mod/friendica.php:44
msgid "running at web location"
msgstr "die unter folgender Webadresse zu finden ist"
#: ../../mod/friendica.php:46
#: ../../addon/facebook/facebook.php:402
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."
"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/friendica.php:48
msgid "Bug reports and issues: please visit"
msgstr "Probleme oder Fehler gefunden? Bitte besuche"
#: ../../addon/facebook/facebook.php:407
msgid "Comma separated applications to ignore"
msgstr "Komma separierte Liste von Anwendungen die ignoriert werden sollen"
#: ../../mod/friendica.php:49
#: ../../addon/facebook/facebook.php:475
#: ../../include/contact_selectors.php:81
msgid "Facebook"
msgstr "Facebook"
#: ../../addon/facebook/facebook.php:476
msgid "Facebook Connector Settings"
msgstr "Facebook-Verbindungseinstellungen"
#: ../../addon/facebook/facebook.php:490
msgid "Post to Facebook"
msgstr "Bei Facebook veröffentlichen"
#: ../../addon/facebook/facebook.php:581
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"
"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/friendica.php:54
msgid "Installed plugins/addons/apps"
msgstr "Installierte Plugins/Erweiterungen/Apps"
#: ../../addon/facebook/facebook.php:650
msgid "Image: "
msgstr "Bild: "
#: ../../mod/friendica.php:62
msgid "No installed plugins/addons/apps"
msgstr "Keine Plugins/Erweiterungen/Apps installiert"
#: ../../addon/facebook/facebook.php:727
msgid "View on Friendica"
msgstr "In Friendica betrachten"
#: ../../mod/attach.php:8
msgid "Item not available."
msgstr "Beitrag nicht verfügbar."
#: ../../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/attach.php:20
msgid "Item was not found."
msgstr "Beitrag konnte nicht gefunden werden."
#: ../../addon/facebook/facebook.php:876 ../../addon/facebook/facebook.php:885
#: ../../include/bb2diaspora.php:113
msgid "link"
msgstr "Verweis"
#: ../../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"
#: ../../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
msgid "Remove"
msgstr "Entfernen"
#: ../../mod/group.php:27
msgid "Group created."
msgstr "Gruppe erstellt."
#: ../../mod/group.php:33
msgid "Could not create group."
msgstr "Konnte die Gruppe nicht erstellen."
#: ../../mod/group.php:43 ../../mod/group.php:123
msgid "Group not found."
msgstr "Gruppe nicht gefunden."
#: ../../mod/group.php:56
msgid "Group name changed."
msgstr "Gruppenname geändert."
#: ../../mod/group.php:67 ../../mod/profperm.php:19 ../../index.php:287
msgid "Permission denied"
msgstr "Zugriff verweigert"
#: ../../mod/group.php:82
msgid "Create a group of contacts/friends."
msgstr "Eine Gruppe von Kontakten/Freunden anlegen."
#: ../../mod/group.php:83 ../../mod/group.php:166
msgid "Group Name: "
msgstr "Gruppenname:"
#: ../../mod/group.php:98
msgid "Group removed."
msgstr "Gruppe entfernt."
#: ../../mod/group.php:100
msgid "Unable to remove group."
msgstr "Konnte die Gruppe nicht entfernen."
#: ../../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/group.php:165
msgid "Group Editor"
msgstr "Gruppeneditor"
#: ../../mod/group.php:179
msgid "Members"
msgstr "Mitglieder"
#: ../../mod/group.php:194
msgid "All Contacts"
msgstr "Alle Kontakte"
#: ../../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:1330
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: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:867
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/events.php:315
#: ../../addon/widgets/widget_like.php:58
#, php-format
msgid "Format is %s %s. Starting date and Description are required."
msgstr "Format ist %s %s. Anfangsdatum und Beschreibung sind notwendig."
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/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:259 ../../boot.php:961
msgid "Location:"
msgstr "Ort:"
#: ../../mod/events.php:330
msgid "Share this event"
msgstr "Veranstaltung teilen"
#: ../../mod/profperm.php:25 ../../mod/profperm.php:55
msgid "Invalid profile identifier."
msgstr "Ungültiger Profil-Bezeichner"
#: ../../mod/profperm.php:101
msgid "Profile Visibility Editor"
msgstr "Editor für die Profil-Sichtbarkeit"
#: ../../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"
#: ../../mod/profperm.php:114
msgid "Visible To"
msgstr "Sichtbar für"
#: ../../mod/profperm.php:130
msgid "All Contacts (with secure profile access)"
msgstr "Alle Kontakte (mit gesichertem Profilzugriff)"
#: ../../mod/dfrn_poll.php:90 ../../mod/dfrn_poll.php:516
#: ../../addon/widgets/widget_like.php:61
#, php-format
msgid "%s welcomes %s"
msgstr "%s heißt %s herzlich willkommen"
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/lockview.php:39
msgid "Remote privacy information not available."
msgstr "Entfernte Privatsphäreneinstellungen nicht verfügbar."
#: ../../addon/widgets/widgets.php:55
msgid "Generate new key"
msgstr "Neuen Schlüssel erstellen"
#: ../../mod/lockview.php:43
msgid "Visible to:"
msgstr "Sichtbar für:"
#: ../../addon/widgets/widgets.php:58
msgid "Widgets key"
msgstr "Widgets Schlüssel"
#: ../../mod/home.php:26 ../../addon/communityhome/communityhome.php:179
#: ../../addon/widgets/widgets.php:60
msgid "Widgets available"
msgstr "Verfügbare Widgets"
#: ../../addon/widgets/widget_friends.php:40
msgid "Connect on Friendica!"
msgstr "In Friendica verbinden!"
#: ../../addon/yourls/yourls.php:55
msgid "YourLS Settings"
msgstr "YourLS Einstellungen"
#: ../../addon/yourls/yourls.php:57
msgid "URL: http://"
msgstr "URL: http://"
#: ../../addon/yourls/yourls.php:62
msgid "Username:"
msgstr "Nutzername:"
#: ../../addon/yourls/yourls.php:67
msgid "Password:"
msgstr "Passwort:"
#: ../../addon/yourls/yourls.php:72
msgid "Use SSL "
msgstr "SSL Verwenden "
#: ../../addon/yourls/yourls.php:92
msgid "yourls Settings saved."
msgstr "yourls Einstellungen gespeichert"
#: ../../addon/nsfw/nsfw.php:47
msgid "\"Not Safe For Work\" Settings"
msgstr "\"Not Safe For Work\"-Einstellungen"
#: ../../addon/nsfw/nsfw.php:50
msgid "Enable NSFW filter"
msgstr "NSFW Filter aktivieren"
#: ../../addon/nsfw/nsfw.php:53
msgid "Comma separated words to treat as NSFW"
msgstr "Wörter, die gefiltert werden sollen (durch Kommas getrennt)"
#: ../../addon/nsfw/nsfw.php:58
msgid "Use /expression/ to provide regular expressions"
msgstr "Verwende /expression/ um Reguläre Ausdrücke zu verwenden"
#: ../../addon/nsfw/nsfw.php:74
msgid "NSFW Settings saved."
msgstr "NSFW-Einstellungen gespeichert"
#: ../../addon/nsfw/nsfw.php:120
#, php-format
msgid "Welcome to %s"
msgstr "Willkommen zu %s"
msgid "%s - Click to open/close"
msgstr "%s Zum Öffnen/Schließen klicken"
#: ../../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"
#: ../../include/datetime.php:257
msgid "hour"
msgstr "Stunde"
#: ../../include/datetime.php:257
msgid "hours"
msgstr "Stunden"
#: ../../include/datetime.php:258
msgid "minute"
msgstr "Minute"
#: ../../include/datetime.php:258
msgid "minutes"
msgstr "Minuten"
#: ../../include/datetime.php:259
msgid "second"
msgstr "Sekunde"
#: ../../include/datetime.php:259
msgid "seconds"
msgstr "Sekunden"
#: ../../include/datetime.php:266
msgid " ago"
msgstr " her"
#: ../../include/datetime.php:437 ../../include/profile_advanced.php:30
#: ../../include/items.php:1285
msgid "Birthday:"
msgstr "Geburtstag:"
#: ../../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."
#: ../../include/text.php:232
msgid "prev"
msgstr "vorige"
#: ../../include/text.php:234
msgid "first"
msgstr "erste"
#: ../../include/text.php:263
msgid "last"
msgstr "letzte"
#: ../../include/text.php:266
msgid "next"
msgstr "nächste"
#: ../../include/text.php:553
msgid "No contacts"
msgstr "Keine Kontakte"
#: ../../include/text.php:562
#, php-format
msgid "%d Contact"
msgid_plural "%d Contacts"
msgstr[0] "%d Kontakt"
msgstr[1] "%d Kontakte"
#: ../../include/text.php:633 ../../include/nav.php:87
msgid "Search"
msgstr "Suche"
#: ../../include/text.php:719
msgid "Monday"
msgstr "Montag"
#: ../../include/text.php:719
msgid "Tuesday"
msgstr "Dienstag"
#: ../../include/text.php:719
msgid "Wednesday"
msgstr "Mittwoch"
#: ../../include/text.php:719
msgid "Thursday"
msgstr "Donnerstag"
#: ../../include/text.php:719
msgid "Friday"
msgstr "Freitag"
#: ../../include/text.php:719
msgid "Saturday"
msgstr "Samstag"
#: ../../include/text.php:719
msgid "Sunday"
msgstr "Sonntag"
#: ../../include/text.php:723
msgid "January"
msgstr "Januar"
#: ../../include/text.php:723
msgid "February"
msgstr "Februar"
#: ../../include/text.php:723
msgid "March"
msgstr "März"
#: ../../include/text.php:723
msgid "April"
msgstr "April"
#: ../../include/text.php:723
msgid "May"
msgstr "Mai"
#: ../../include/text.php:723
msgid "June"
msgstr "Juni"
#: ../../include/text.php:723
msgid "July"
msgstr "Juli"
#: ../../include/text.php:723
msgid "August"
msgstr "August"
#: ../../include/text.php:723
msgid "September"
msgstr "September"
#: ../../include/text.php:723
msgid "October"
msgstr "Oktober"
#: ../../include/text.php:723
msgid "November"
msgstr "November"
#: ../../include/text.php:723
msgid "December"
msgstr "Dezember"
#: ../../include/text.php:793
msgid "bytes"
msgstr "Byte"
#: ../../include/text.php:885
msgid "Select an alternate language"
msgstr "Alternative Sprache auswählen"
#: ../../include/text.php:897
msgid "default"
msgstr "standard"
#: ../../include/poller.php:459
msgid "From: "
msgstr "Von: "
#: ../../include/nav.php:44 ../../boot.php:700
msgid "Logout"
msgstr "Abmelden"
#: ../../include/nav.php:44
msgid "End this session"
msgstr "Diese Sitzung beenden"
#: ../../include/nav.php:47 ../../boot.php:1312
msgid "Status"
msgstr "Status"
#: ../../include/nav.php:47 ../../include/nav.php:111
msgid "Your posts and conversations"
msgstr "Deine Beiträge und Unterhaltungen"
#: ../../include/nav.php:48
msgid "Your profile page"
msgstr "Deine Profilseite"
#: ../../include/nav.php:49 ../../boot.php:1322
msgid "Photos"
msgstr "Bilder"
#: ../../include/nav.php:49
msgid "Your photos"
msgstr "Deine Fotos"
#: ../../include/nav.php:50
msgid "Your events"
msgstr "Deine Ereignisse"
#: ../../include/nav.php:51
msgid "Personal notes"
msgstr "Persönliche Notizen"
#: ../../include/nav.php:51
msgid "Your personal photos"
msgstr "Deine privaten Fotos"
#: ../../include/nav.php:62 ../../addon/communityhome/communityhome.php:28
#: ../../addon/communityhome/communityhome.php:34 ../../boot.php:701
#: ../../addon/communityhome/communityhome.php:28
#: ../../addon/communityhome/communityhome.php:34 ../../include/nav.php:62
#: ../../boot.php:706
msgid "Login"
msgstr "Anmeldung"
#: ../../include/nav.php:62
msgid "Sign in"
msgstr "Anmelden"
#: ../../addon/communityhome/communityhome.php:29
msgid "OpenID"
msgstr "OpenID"
#: ../../include/nav.php:73
msgid "Home Page"
msgstr "Homepage"
#: ../../addon/communityhome/communityhome.php:38
msgid "Last users"
msgstr "Letzte Nutzer"
#: ../../include/nav.php:77
msgid "Create an account"
msgstr "Account erstellen"
#: ../../addon/communityhome/communityhome.php:81
msgid "Most active users"
msgstr "Aktivste Nutzer"
#: ../../include/nav.php:82
msgid "Help and documentation"
msgstr "Hilfe und Dokumentation"
#: ../../addon/communityhome/communityhome.php:98
msgid "Last photos"
msgstr "Letzte Fotos"
#: ../../include/nav.php:85
msgid "Apps"
msgstr "Apps"
#: ../../addon/communityhome/communityhome.php:133
msgid "Last likes"
msgstr "Zuletzt gemocht"
#: ../../include/nav.php:85
msgid "Addon applications, utilities, games"
msgstr "Addon Anwendungen, Dienstprogramme, Spiele"
#: ../../addon/communityhome/communityhome.php:155
#: ../../include/conversation.php:23 ../../include/conversation.php:96
msgid "event"
msgstr "Veranstaltung"
#: ../../include/nav.php:87
msgid "Search site content"
msgstr "Inhalt der Seite durchsuchen"
#: ../../addon/uhremotestorage/uhremotestorage.php:84
#, php-format
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>"
#: ../../include/nav.php:97
msgid "Conversations on this site"
msgstr "Unterhaltungen auf dieser Seite"
#: ../../addon/uhremotestorage/uhremotestorage.php:85
msgid "Template URL (with {category})"
msgstr "Vorlagen URL (mit {Kategorie})"
#: ../../include/nav.php:99
msgid "Directory"
msgstr "Verzeichnis"
#: ../../addon/uhremotestorage/uhremotestorage.php:86
msgid "OAuth end-point"
msgstr "OAuth end-point"
#: ../../include/nav.php:99
msgid "People directory"
msgstr "Nutzerverzeichnis"
#: ../../addon/uhremotestorage/uhremotestorage.php:87
msgid "Api"
msgstr "Api"
#: ../../include/nav.php:109
msgid "Conversations from your friends"
msgstr "Unterhaltungen deiner Kontakte"
#: ../../addon/membersince/membersince.php:18
msgid "Member since:"
msgstr "Mitglied seit:"
#: ../../include/nav.php:117
msgid "Friend Requests"
msgstr "Kontaktanfragen"
#: ../../addon/tictac/tictac.php:20
msgid "Three Dimensional Tic-Tac-Toe"
msgstr "Dreidimensionales Tic-Tac-Toe"
#: ../../include/nav.php:122
msgid "Private mail"
msgstr "Private Email"
#: ../../addon/tictac/tictac.php:53
msgid "3D Tic-Tac-Toe"
msgstr "3D Tic-Tac-Toe"
#: ../../include/nav.php:125
msgid "Manage"
msgstr "Verwalten"
#: ../../addon/tictac/tictac.php:58
msgid "New game"
msgstr "Neues Spiel"
#: ../../include/nav.php:125
msgid "Manage other pages"
msgstr "Andere Seiten verwalten"
#: ../../addon/tictac/tictac.php:59
msgid "New game with handicap"
msgstr "Neues Handicap Spiel"
#: ../../include/nav.php:129 ../../boot.php:921
msgid "Profiles"
msgstr "Profile"
#: ../../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/nav.php:129 ../../boot.php:921
msgid "Manage/edit profiles"
msgstr "Profile verwalten/editieren"
#: ../../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/nav.php:130
msgid "Manage/edit friends and contacts"
msgstr "Freunde und Kontakte verwalten/editieren"
#: ../../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/nav.php:137
msgid "Admin"
msgstr "Administration"
#: ../../addon/tictac/tictac.php:182
msgid "You go first..."
msgstr "Du fängst an..."
#: ../../include/nav.php:137
msgid "Site setup and configuration"
msgstr "Einstellungen der Seite und Konfiguration"
#: ../../addon/tictac/tictac.php:187
msgid "I'm going first this time..."
msgstr "Diesmal fange ich an..."
#: ../../include/nav.php:160
msgid "Nothing new here"
msgstr "Keine Neuigkeiten."
#: ../../addon/tictac/tictac.php:193
msgid "You won!"
msgstr "Du gewinnst!"
#: ../../include/message.php:14
msgid "[no subject]"
msgstr "[kein Betreff]"
#: ../../addon/tictac/tictac.php:199 ../../addon/tictac/tictac.php:224
msgid "\"Cat\" game!"
msgstr "Unentschieden!"
#: ../../include/profile_advanced.php:17 ../../boot.php:963
#: ../../addon/tictac/tictac.php:222
msgid "I won!"
msgstr "Ich gewinne!"
#: ../../addon/randplace/randplace.php:171
msgid "Randplace Settings"
msgstr "Randplace-Einstellungen"
#: ../../addon/randplace/randplace.php:173
msgid "Enable Randplace Plugin"
msgstr "Randplace-Plugin aktivieren"
#: ../../addon/drpost/drpost.php:35
msgid "Post to Drupal"
msgstr "Bei Drupal veröffentlichen"
#: ../../addon/drpost/drpost.php:72
msgid "Drupal Post Settings"
msgstr "Drupal-Beitragseinstellungen"
#: ../../addon/drpost/drpost.php:74
msgid "Enable Drupal Post Plugin"
msgstr "Veröffentlichung bei Drupal erlauben"
#: ../../addon/drpost/drpost.php:79
msgid "Drupal username"
msgstr "Drupal Nutzername"
#: ../../addon/drpost/drpost.php:84
msgid "Drupal password"
msgstr "Drupal Passwort"
#: ../../addon/drpost/drpost.php:89
msgid "Post Type - article,page,or blog"
msgstr "Beitragstyp - Artikel, Seite oder Blog"
#: ../../addon/drpost/drpost.php:94
msgid "Drupal site URL"
msgstr "URL der Drupal Seite"
#: ../../addon/drpost/drpost.php:99
msgid "Drupal site uses clean URLS"
msgstr "Drupal Seite verwendet bereinigte URLs"
#: ../../addon/drpost/drpost.php:104
msgid "Post to Drupal by default"
msgstr "Veröffentliche öffentliche Beiträge standardmäßig bei Drupal"
#: ../../addon/drpost/drpost.php:184 ../../addon/wppost/wppost.php:172
#: ../../addon/posterous/posterous.php:173
msgid "Post from Friendica"
msgstr "Beitrag via Friendica"
#: ../../addon/geonames/geonames.php:143
msgid "Geonames settings updated."
msgstr "Geonames Einstellungen aktualisiert"
#: ../../addon/geonames/geonames.php:179
msgid "Geonames Settings"
msgstr "Geonames Einstellungen"
#: ../../addon/geonames/geonames.php:181
msgid "Enable Geonames Plugin"
msgstr "Geonames Plugin aktivieren"
#: ../../addon/js_upload/js_upload.php:43
msgid "Upload a file"
msgstr "Datei hochladen"
#: ../../addon/js_upload/js_upload.php:44
msgid "Drop files here to upload"
msgstr "Ziehe die Dateien hierher die du hochladen willst"
#: ../../addon/js_upload/js_upload.php:46
msgid "Failed"
msgstr "Fehlgeschlagen"
#: ../../addon/js_upload/js_upload.php:294
msgid "No files were uploaded."
msgstr "Keine Dateien hochgeladen."
#: ../../addon/js_upload/js_upload.php:300
msgid "Uploaded file is empty"
msgstr "Hochgeladene Datei ist leer"
#: ../../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 "
#: ../../addon/js_upload/js_upload.php:334
msgid "Upload was cancelled, or server error encountered"
msgstr "Upload abgebrochen oder Serverfehler aufgetreten"
#: ../../addon/oembed.old/oembed.php:30
msgid "OEmbed settings updated"
msgstr "OEmbed Einstellungen aktualisiert."
#: ../../addon/oembed.old/oembed.php:43
msgid "Use OEmbed for YouTube videos"
msgstr "OEmbed für Youtube Videos verwenden"
#: ../../addon/oembed.old/oembed.php:71
msgid "URL to embed:"
msgstr "URL zum Einbetten:"
#: ../../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"
#: ../../addon/impressum/impressum.php:38
#: ../../addon/impressum/impressum.php:74
msgid "Email Address"
msgstr "Email Adresse"
#: ../../addon/impressum/impressum.php:43
#: ../../addon/impressum/impressum.php:72
msgid "Postal Address"
msgstr "Postalische Anschrift"
#: ../../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."
#: ../../addon/impressum/impressum.php:71
msgid "Site Owners Profile"
msgstr "Profil des Seitenbetreibers"
#: ../../addon/impressum/impressum.php:73
msgid "Notes"
msgstr "Hinweise"
#: ../../addon/buglink/buglink.php:15
msgid "Report Bug"
msgstr "Fehlerreport erstellen"
#: ../../addon/blockem/blockem.php:51
msgid "\"Blockem\" Settings"
msgstr "\"Blockem\"-Einstellungen"
#: ../../addon/blockem/blockem.php:53
msgid "Comma separated profile URLS to block"
msgstr "Profil-URLs, die blockiert werden sollen (durch Kommas getrennt)"
#: ../../addon/blockem/blockem.php:70
msgid "BLOCKEM Settings saved."
msgstr "BLOCKEM-Einstellungen gesichert."
#: ../../addon/blockem/blockem.php:105
#, php-format
msgid "Blocked %s - Click to open/close"
msgstr "%s blockiert - Zum Öffnen/Schließen klicken"
#: ../../addon/blockem/blockem.php:160
msgid "Unblock Author"
msgstr "Autor freischalten"
#: ../../addon/blockem/blockem.php:162
msgid "Block Author"
msgstr "Autor blockieren"
#: ../../addon/blockem/blockem.php:194
msgid "blockem settings updated"
msgstr "blockem Einstellungen aktualisiert"
#: ../../addon/editplain/editplain.php:46
msgid "Editplain settings updated."
msgstr "Editplain Einstellungen aktualisiert"
#: ../../addon/editplain/editplain.php:76
msgid "Editplain Settings"
msgstr "Editplain Einstellungen"
#: ../../addon/editplain/editplain.php:78
msgid "Disable richtext status editor"
msgstr "RichText Editor deaktivieren"
#: ../../addon/pageheader/pageheader.php:47
msgid "\"pageheader\" Settings"
msgstr "\"pageheader\"-Einstellungen"
#: ../../addon/pageheader/pageheader.php:65
msgid "pageheader Settings saved."
msgstr "pageheader-Einstellungen gespeichert."
#: ../../addon/viewsrc/viewsrc.php:25
msgid "View Source"
msgstr "Quelle ansehen"
#: ../../addon/statusnet/statusnet.php:140
msgid "Post to StatusNet"
msgstr "Bei StatusNet veröffentlichen"
#: ../../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."
#: ../../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."
#: ../../addon/statusnet/statusnet.php:236
msgid "StatusNet settings updated."
msgstr "StatusNet Einstellungen aktualisiert."
#: ../../addon/statusnet/statusnet.php:259
msgid "StatusNet Posting Settings"
msgstr "StatusNet-Beitragseinstellungen"
#: ../../addon/statusnet/statusnet.php:273
msgid "Globally Available StatusNet OAuthKeys"
msgstr "Verfügbare OAuth Schlüssel für StatusNet"
#: ../../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."
#: ../../addon/statusnet/statusnet.php:282
msgid "Provide your own OAuth Credentials"
msgstr "Eigene OAuth Schlüssel eintragen"
#: ../../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."
#: ../../addon/statusnet/statusnet.php:285
msgid "OAuth Consumer Key"
msgstr "OAuth Consumer Key"
#: ../../addon/statusnet/statusnet.php:288
msgid "OAuth Consumer Secret"
msgstr "OAuth Consumer Secret"
#: ../../addon/statusnet/statusnet.php:291
msgid "Base API Path (remember the trailing /)"
msgstr "Basis-URL der StatusNet-API (vergiss den abschließenden / nicht)"
#: ../../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."
#: ../../addon/statusnet/statusnet.php:313
msgid "Log in with StatusNet"
msgstr "Bei StatusNet anmelden"
#: ../../addon/statusnet/statusnet.php:315
msgid "Copy the security code from StatusNet here"
msgstr "Kopiere den Sicherheitscode von StatusNet hier hin"
#: ../../addon/statusnet/statusnet.php:321
msgid "Cancel Connection Process"
msgstr "Verbindungsprozess abbrechen"
#: ../../addon/statusnet/statusnet.php:323
msgid "Current StatusNet API is"
msgstr "Derzeitige StatusNet-API-URL lautet"
#: ../../addon/statusnet/statusnet.php:324
msgid "Cancel StatusNet Connection"
msgstr "Verbindung zum StatusNet Server abbrechen"
#: ../../addon/statusnet/statusnet.php:335 ../../addon/twitter/twitter.php:189
msgid "Currently connected to: "
msgstr "Momentan verbunden mit: "
#: ../../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."
#: ../../addon/statusnet/statusnet.php:338
msgid "Allow posting to StatusNet"
msgstr "Veröffentlichung bei StatusNet erlauben"
#: ../../addon/statusnet/statusnet.php:341
msgid "Send public postings to StatusNet by default"
msgstr "Veröffentliche öffentliche Beiträge standardmäßig bei StatusNet"
#: ../../addon/statusnet/statusnet.php:346 ../../addon/twitter/twitter.php:200
msgid "Clear OAuth configuration"
msgstr "OAuth-Konfiguration löschen"
#: ../../addon/statusnet/statusnet.php:487
msgid "API URL"
msgstr "API-URL"
#: ../../addon/tumblr/tumblr.php:36
msgid "Post to Tumblr"
msgstr "Bei Tumblr veröffentlichen"
#: ../../addon/tumblr/tumblr.php:67
msgid "Tumblr Post Settings"
msgstr "Tumblr-Beitragseinstellungen"
#: ../../addon/tumblr/tumblr.php:69
msgid "Enable Tumblr Post Plugin"
msgstr "Tumblr-Plugin aktivieren"
#: ../../addon/tumblr/tumblr.php:74
msgid "Tumblr login"
msgstr "Tumblr Login"
#: ../../addon/tumblr/tumblr.php:79
msgid "Tumblr password"
msgstr "Tumblr Passwort"
#: ../../addon/tumblr/tumblr.php:84
msgid "Post to Tumblr by default"
msgstr "Standardmäßig bei Tumblr veröffentlichen"
#: ../../addon/numfriends/numfriends.php:46
msgid "Numfriends settings updated."
msgstr "Numfriends Einstellungen aktualisiert"
#: ../../addon/numfriends/numfriends.php:77
msgid "Numfriends Settings"
msgstr "Numfriends Einstellungen"
#: ../../addon/numfriends/numfriends.php:79
msgid "How many contacts to display on profile sidebar"
msgstr "Wie viele Kontakte sollen in der Seitenleiste angezeigt werden"
#: ../../addon/wppost/wppost.php:42
msgid "Post to Wordpress"
msgstr "Bei WordPress veröffentlichen"
#: ../../addon/wppost/wppost.php:74
msgid "WordPress Post Settings"
msgstr "WordPress-Beitragseinstellungen"
#: ../../addon/wppost/wppost.php:76
msgid "Enable WordPress Post Plugin"
msgstr "WordPress-Plugin aktivieren."
#: ../../addon/wppost/wppost.php:81
msgid "WordPress username"
msgstr "WordPress-Benutzername"
#: ../../addon/wppost/wppost.php:86
msgid "WordPress password"
msgstr "WordPress-Passwort"
#: ../../addon/wppost/wppost.php:91
msgid "WordPress API URL"
msgstr "WordPress-API-URL"
#: ../../addon/wppost/wppost.php:96
msgid "Post to WordPress by default"
msgstr "Standardmäßig auf WordPress veröffentlichen"
#: ../../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."
#: ../../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)."
#: ../../addon/piwik/piwik.php:82
msgid "Piwik Base URL"
msgstr "Piwik Basis URL"
#: ../../addon/piwik/piwik.php:83
msgid "Site ID"
msgstr "Seiten ID"
#: ../../addon/piwik/piwik.php:84
msgid "Show opt-out cookie link?"
msgstr "Link zum Setzen des Opt-Out Cookies anzeigen?"
#: ../../addon/twitter/twitter.php:78
msgid "Post to Twitter"
msgstr "Bei Twitter veröffentlichen"
#: ../../addon/twitter/twitter.php:124
msgid "Twitter settings updated."
msgstr "Twitter Einstellungen aktualisiert."
#: ../../addon/twitter/twitter.php:146
msgid "Twitter Posting Settings"
msgstr "Twitter-Beitragseinstellungen"
#: ../../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."
#: ../../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."
#: ../../addon/twitter/twitter.php:173
msgid "Log in with Twitter"
msgstr "bei Twitter anmelden"
#: ../../addon/twitter/twitter.php:175
msgid "Copy the PIN from Twitter here"
msgstr "Kopiere die Twitter-PIN hier her"
#: ../../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."
#: ../../addon/twitter/twitter.php:192
msgid "Allow posting to Twitter"
msgstr "Veröffentlichung bei Twitter erlauben"
#: ../../addon/twitter/twitter.php:195
msgid "Send public postings to Twitter by default"
msgstr "Veröffentliche öffentliche Beiträge standardmäßig bei Twitter"
#: ../../addon/twitter/twitter.php:317
msgid "Consumer key"
msgstr "Consumer Key"
#: ../../addon/twitter/twitter.php:318
msgid "Consumer secret"
msgstr "Consumer Secret"
#: ../../addon/posterous/posterous.php:36
msgid "Post to Posterous"
msgstr "Nach Posterous senden"
#: ../../addon/posterous/posterous.php:67
msgid "Posterous Post Settings"
msgstr "Posterous Beitrags-Einstellungen"
#: ../../addon/posterous/posterous.php:69
msgid "Enable Posterous Post Plugin"
msgstr "Posterous-Plugin aktivieren"
#: ../../addon/posterous/posterous.php:74
msgid "Posterous login"
msgstr "Posterous-Anmeldename"
#: ../../addon/posterous/posterous.php:79
msgid "Posterous password"
msgstr "Posterous-Passwort"
#: ../../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: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,447 +4756,155 @@ 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/event.php:17 ../../include/bb2diaspora.php:255
msgid "Starts:"
msgstr "Beginnt:"
#: ../../include/Contact.php:126 ../../include/conversation.php:724
msgid "View profile"
msgstr "Profil anzeigen"
#: ../../include/event.php:27 ../../include/bb2diaspora.php:263
msgid "Finishes:"
msgstr "Endet:"
#: ../../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/conversation.php:524
msgid "add tag"
msgstr "Tag hinzufügen"
#: ../../include/conversation.php:604
msgid "to"
msgstr "to"
#: ../../include/conversation.php:605
msgid "Wall-to-Wall"
msgstr "Wall-to-Wall"
#: ../../include/conversation.php:606
msgid "via Wall-To-Wall:"
msgstr "via Wall-To-Wall:"
#: ../../include/conversation.php:648
msgid "Delete Selected Items"
msgstr "Lösche die markierten Beiträge"
#: ../../include/conversation.php:778
#, php-format
msgid "%s likes this."
msgstr "%s mag das."
#: ../../include/conversation.php:778
#, php-format
msgid "%s doesn't like this."
msgstr "%s mag das nicht."
#: ../../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/conversation.php:784
#, 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."
#: ../../include/conversation.php:790
msgid "and"
msgstr "und"
#: ../../include/conversation.php:793
#, php-format
msgid ", and %d other people"
msgstr " und %d andere"
#: ../../include/conversation.php:794
#, php-format
msgid "%s like this."
msgstr "%s mögen das."
#: ../../include/conversation.php:794
#, php-format
msgid "%s don't like this."
msgstr "%s mögen das nicht."
#: ../../include/conversation.php:814
msgid "Visible to <strong>everybody</strong>"
msgstr "Für <strong>Jedermann</strong> sichtbar"
#: ../../include/conversation.php:816
msgid "Please enter a video link/URL:"
msgstr "Bitte Link/URL zum Video einfügen:"
#: ../../include/conversation.php:817
msgid "Please enter an audio link/URL:"
msgstr "Bitte Link/URL zum Audio einfügen:"
#: ../../include/conversation.php:818
msgid "Tag term:"
msgstr "Tag:"
#: ../../include/conversation.php:819
msgid "Where are you right now?"
msgstr "Wo hältst du dich jetzt gerade auf?"
#: ../../include/conversation.php:820
msgid "Enter a title for this item"
msgstr "Gib den Titel für diesen Beitrag ein"
#: ../../include/conversation.php:864
msgid "upload photo"
msgstr "Bild hochladen"
#: ../../include/conversation.php:866
msgid "attach file"
msgstr "Datei anhängen"
#: ../../include/conversation.php:868
msgid "web link"
msgstr "Weblink"
#: ../../include/conversation.php:869
msgid "Insert video link"
msgstr "Video-Adresse einfügen"
#: ../../include/conversation.php:870
msgid "video link"
msgstr "Video-Link"
#: ../../include/conversation.php:871
msgid "Insert audio link"
msgstr "Audio-Adresse einfügen"
#: ../../include/conversation.php:872
msgid "audio link"
msgstr "Audio-Link"
#: ../../include/conversation.php:874
msgid "set location"
msgstr "Ort setzen"
#: ../../include/conversation.php:876
msgid "clear location"
msgstr "Ort löschen"
#: ../../include/conversation.php:878
msgid "Set title"
msgstr "Titel setzen"
#: ../../include/conversation.php:881
msgid "permissions"
msgstr "Zugriffsrechte"
#: ../../include/notifier.php:628 ../../include/delivery.php:415
#: ../../include/delivery.php:416 ../../include/notifier.php:629
msgid "(no subject)"
msgstr "(kein Betreff)"
#: ../../include/notifier.php:635 ../../include/enotify.php:16
#: ../../include/delivery.php:423 ../../include/enotify.php:16
#: ../../include/notifier.php:636
msgid "noreply"
msgstr "noreply"
#: ../../include/text.php:232
msgid "prev"
msgstr "vorige"
#: ../../include/text.php:234
msgid "first"
msgstr "erste"
#: ../../include/text.php:263
msgid "last"
msgstr "letzte"
#: ../../include/text.php:266
msgid "next"
msgstr "nächste"
#: ../../include/text.php:557
msgid "No contacts"
msgstr "Keine Kontakte"
#: ../../include/text.php:566
#, php-format
msgid "%d Contact"
msgid_plural "%d Contacts"
msgstr[0] "%d Kontakt"
msgstr[1] "%d Kontakte"
#: ../../include/text.php:637 ../../include/nav.php:87
msgid "Search"
msgstr "Suche"
#: ../../include/text.php:735
msgid "Monday"
msgstr "Montag"
#: ../../include/text.php:735
msgid "Tuesday"
msgstr "Dienstag"
#: ../../include/text.php:735
msgid "Wednesday"
msgstr "Mittwoch"
#: ../../include/text.php:735
msgid "Thursday"
msgstr "Donnerstag"
#: ../../include/text.php:735
msgid "Friday"
msgstr "Freitag"
#: ../../include/text.php:735
msgid "Saturday"
msgstr "Samstag"
#: ../../include/text.php:735
msgid "Sunday"
msgstr "Sonntag"
#: ../../include/text.php:739
msgid "January"
msgstr "Januar"
#: ../../include/text.php:739
msgid "February"
msgstr "Februar"
#: ../../include/text.php:739
msgid "March"
msgstr "März"
#: ../../include/text.php:739
msgid "April"
msgstr "April"
#: ../../include/text.php:739
msgid "May"
msgstr "Mai"
#: ../../include/text.php:739
msgid "June"
msgstr "Juni"
#: ../../include/text.php:739
msgid "July"
msgstr "Juli"
#: ../../include/text.php:739
msgid "August"
msgstr "August"
#: ../../include/text.php:739
msgid "September"
msgstr "September"
#: ../../include/text.php:739
msgid "October"
msgstr "Oktober"
#: ../../include/text.php:739
msgid "November"
msgstr "November"
#: ../../include/text.php:739
msgid "December"
msgstr "Dezember"
#: ../../include/text.php:809
msgid "bytes"
msgstr "Byte"
#: ../../include/text.php:901
msgid "Select an alternate language"
msgstr "Alternative Sprache auswählen"
#: ../../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/enotify.php:49
#, php-format
msgid "%s posted to your profile wall at %s"
msgstr "%s hat auf deine Pinnwand bei %s gepostet"
#: ../../include/enotify.php:58
#, php-format
msgid "Introduction received at %s"
msgstr "Kontaktanfrage auf %s erhalten"
#: ../../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/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/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/enotify.php:69
#, php-format
msgid "Friend suggestion received at %s"
msgstr "Kontaktvorschlag empfangen auf %s"
#: ../../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/enotify.php:71
msgid "Name:"
msgstr "Name:"
#: ../../include/enotify.php:72
msgid "Photo:"
msgstr "Foto:"
#: ../../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/bbcode.php:166 ../../include/bbcode.php:225
msgid "Image/photo"
msgstr "Bild/Foto"
#: ../../include/contact_selectors.php:32
msgid "Unknown | Not categorised"
msgstr "Unbekannt | Nicht kategorisiert"
#: ../../include/contact_selectors.php:33
msgid "Block immediately"
msgstr "Sofort blockieren"
#: ../../include/contact_selectors.php:34
msgid "Shady, spammer, self-marketer"
msgstr "Zwielichtig, Spammer, Selbstdarsteller"
#: ../../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:81
#: ../../addon/facebook/facebook.php:475
msgid "Facebook"
msgstr "Facebook"
#: ../../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/auth.php:27
msgid "Logged out."
msgstr "Abgemeldet."
#: ../../include/oembed.php:128
msgid "Embedded content"
msgstr "Eingebetteter Inhalt"
@ -4869,11 +4918,7 @@ 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."
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/group.php:168
msgid "Everybody"
@ -4895,6 +4940,134 @@ msgstr "Gruppe bearbeiten"
msgid "Create a new group"
msgstr "Neue Gruppe erstellen"
#: ../../include/nav.php:44 ../../boot.php:705
msgid "Logout"
msgstr "Abmelden"
#: ../../include/nav.php:44
msgid "End this session"
msgstr "Diese Sitzung beenden"
#: ../../include/nav.php:47 ../../boot.php:1327
msgid "Status"
msgstr "Status"
#: ../../include/nav.php:47 ../../include/nav.php:111
msgid "Your posts and conversations"
msgstr "Deine Beiträge und Unterhaltungen"
#: ../../include/nav.php:48
msgid "Your profile page"
msgstr "Deine Profilseite"
#: ../../include/nav.php:49 ../../boot.php:1337
msgid "Photos"
msgstr "Bilder"
#: ../../include/nav.php:49
msgid "Your photos"
msgstr "Deine Fotos"
#: ../../include/nav.php:50
msgid "Your events"
msgstr "Deine Ereignisse"
#: ../../include/nav.php:51
msgid "Personal notes"
msgstr "Persönliche Notizen"
#: ../../include/nav.php:51
msgid "Your personal photos"
msgstr "Deine privaten Fotos"
#: ../../include/nav.php:62
msgid "Sign in"
msgstr "Anmelden"
#: ../../include/nav.php:73
msgid "Home Page"
msgstr "Homepage"
#: ../../include/nav.php:77
msgid "Create an account"
msgstr "Account erstellen"
#: ../../include/nav.php:82
msgid "Help and documentation"
msgstr "Hilfe und Dokumentation"
#: ../../include/nav.php:85
msgid "Apps"
msgstr "Apps"
#: ../../include/nav.php:85
msgid "Addon applications, utilities, games"
msgstr "Addon Anwendungen, Dienstprogramme, Spiele"
#: ../../include/nav.php:87
msgid "Search site content"
msgstr "Inhalt der Seite durchsuchen"
#: ../../include/nav.php:97
msgid "Conversations on this site"
msgstr "Unterhaltungen auf dieser Seite"
#: ../../include/nav.php:99
msgid "Directory"
msgstr "Verzeichnis"
#: ../../include/nav.php:99
msgid "People directory"
msgstr "Nutzerverzeichnis"
#: ../../include/nav.php:109
msgid "Conversations from your friends"
msgstr "Unterhaltungen deiner Kontakte"
#: ../../include/nav.php:117
msgid "Friend Requests"
msgstr "Kontaktanfragen"
#: ../../include/nav.php:119
msgid "See all notifications"
msgstr "Alle Benachrichtigungen anzeigen"
#: ../../include/nav.php:123
msgid "Private mail"
msgstr "Private Email"
#: ../../include/nav.php:126
msgid "Manage"
msgstr "Verwalten"
#: ../../include/nav.php:126
msgid "Manage other pages"
msgstr "Andere Seiten verwalten"
#: ../../include/nav.php:130 ../../boot.php:936
msgid "Profiles"
msgstr "Profile"
#: ../../include/nav.php:130 ../../boot.php:936
msgid "Manage/edit profiles"
msgstr "Profile verwalten/editieren"
#: ../../include/nav.php:131
msgid "Manage/edit friends and contacts"
msgstr "Freunde und Kontakte verwalten/editieren"
#: ../../include/nav.php:138
msgid "Admin"
msgstr "Administration"
#: ../../include/nav.php:138
msgid "Site setup and configuration"
msgstr "Einstellungen der Seite und Konfiguration"
#: ../../include/nav.php:161
msgid "Nothing new here"
msgstr "Keine Neuigkeiten."
#: ../../include/contact_widgets.php:6
msgid "Add New Contact"
msgstr "Neuen Kontakt hinzufügen"
@ -4946,766 +5119,519 @@ msgstr "Netzwerke"
msgid "All Networks"
msgstr "Alle Netzwerke"
#: ../../addon/facebook/facebook.php:337
msgid "Facebook disabled"
msgstr "Facebook deaktiviert"
#: ../../include/auth.php:29
msgid "Logged out."
msgstr "Abgemeldet."
#: ../../addon/facebook/facebook.php:342
msgid "Updating contacts"
msgstr "Aktualisiere Kontakte"
#: ../../include/datetime.php:43 ../../include/datetime.php:45
msgid "Miscellaneous"
msgstr "Verschiedenes"
#: ../../addon/facebook/facebook.php:351
msgid "Facebook API key is missing."
msgstr "Facebook-API-Schlüssel nicht gefunden"
#: ../../include/datetime.php:121 ../../include/datetime.php:253
msgid "year"
msgstr "Jahr"
#: ../../addon/facebook/facebook.php:358
msgid "Facebook Connect"
msgstr "Mit Facebook verbinden"
#: ../../include/datetime.php:126 ../../include/datetime.php:254
msgid "month"
msgstr "Monat"
#: ../../addon/facebook/facebook.php:364
msgid "Install Facebook connector for this account."
msgstr "Facebook-Connector für diesen Account installieren."
#: ../../include/datetime.php:131 ../../include/datetime.php:256
msgid "day"
msgstr "Tag"
#: ../../addon/facebook/facebook.php:371
msgid "Remove Facebook connector"
msgstr "Facebook-Connector entfernen"
#: ../../include/datetime.php:244
msgid "never"
msgstr "nie"
#: ../../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.]"
#: ../../include/datetime.php:250
msgid "less than a second ago"
msgstr "vor weniger als einer Sekunde"
#: ../../addon/facebook/facebook.php:383
msgid "Post to Facebook by default"
msgstr "Veröffentliche standardmäßig bei Facebook"
#: ../../include/datetime.php:253
msgid "years"
msgstr "Jahre"
#: ../../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"
#: ../../include/datetime.php:254
msgid "months"
msgstr "Monate"
#: ../../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>"
#: ../../include/datetime.php:255
msgid "week"
msgstr "Woche"
#: ../../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."
#: ../../include/datetime.php:255
msgid "weeks"
msgstr "Wochen"
#: ../../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."
#: ../../include/datetime.php:256
msgid "days"
msgstr "Tage"
#: ../../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/datetime.php:257
msgid "hour"
msgstr "Stunde"
#: ../../addon/facebook/facebook.php:400
msgid "Do not import your Facebook profile wall conversations"
msgstr "Facebook-Pinnwand nicht importieren"
#: ../../include/datetime.php:257
msgid "hours"
msgstr "Stunden"
#: ../../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:258
msgid "minute"
msgstr "Minute"
#: ../../addon/facebook/facebook.php:407
msgid "Comma separated applications to ignore"
msgstr "Komma separierte Liste von Anwendungen die ignoriert werden sollen"
#: ../../include/datetime.php:258
msgid "minutes"
msgstr "Minuten"
#: ../../addon/facebook/facebook.php:476
msgid "Facebook Connector Settings"
msgstr "Facebook-Verbindungseinstellungen"
#: ../../include/datetime.php:259
msgid "second"
msgstr "Sekunde"
#: ../../addon/facebook/facebook.php:490
msgid "Post to Facebook"
msgstr "Bei Facebook veröffentlichen"
#: ../../include/datetime.php:259
msgid "seconds"
msgstr "Sekunden"
#: ../../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."
#: ../../addon/facebook/facebook.php:644
msgid "Image: "
msgstr "Bild: "
#: ../../addon/facebook/facebook.php:720
msgid "View on Friendica"
msgstr "In Friendica betrachten"
#: ../../addon/facebook/facebook.php:744
msgid "Facebook post failed. Queued for retry."
msgstr ""
"Veröffentlichung bei Facebook gescheitert. Wir versuchen es später erneut."
#: ../../addon/wppost/wppost.php:41
msgid "Post to Wordpress"
msgstr "Bei WordPress veröffentlichen"
#: ../../addon/wppost/wppost.php:73
msgid "WordPress Post Settings"
msgstr "WordPress-Beitragseinstellungen"
#: ../../addon/wppost/wppost.php:75
msgid "Enable WordPress Post Plugin"
msgstr "WordPress-Plugin aktivieren."
#: ../../addon/wppost/wppost.php:80
msgid "WordPress username"
msgstr "WordPress-Benutzername"
#: ../../addon/wppost/wppost.php:85
msgid "WordPress password"
msgstr "WordPress-Passwort"
#: ../../addon/wppost/wppost.php:90
msgid "WordPress API URL"
msgstr "WordPress-API-URL"
#: ../../addon/wppost/wppost.php:95
msgid "Post to WordPress by default"
msgstr "Standardmäßig auf WordPress veröffentlichen"
#: ../../addon/wppost/wppost.php:171 ../../addon/tumblr/tumblr.php:174
#: ../../addon/posterous/posterous.php:172
msgid "Post from Friendica"
msgstr "Beitrag via Friendica"
#: ../../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."
msgid "%1$d %2$s ago"
msgstr "%1$d %2$s her"
#: ../../addon/uhremotestorage/uhremotestorage.php:57
msgid "Unhosted DAV storage url"
msgstr "Unhosted DAV Speicher-URL"
#: ../../include/poller.php:459
msgid "From: "
msgstr "Von: "
#: ../../addon/tumblr/tumblr.php:35
msgid "Post to Tumblr"
msgstr "Bei Tumblr veröffentlichen"
#: ../../include/bbcode.php:166 ../../include/bbcode.php:225
msgid "Image/photo"
msgstr "Bild/Foto"
#: ../../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"
#: ../../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"
#: ../../addon/oembed/oembed.php:71
msgid "URL to embed:"
msgstr "URL zum Einbetten:"
#: ../../addon/posterous/posterous.php:35
msgid "Post to Posterous"
msgstr "Nach Posterous senden"
#: ../../addon/posterous/posterous.php:66
msgid "Posterous Post Settings"
msgstr "Posterous Beitrags-Einstellungen"
#: ../../addon/posterous/posterous.php:68
msgid "Enable Posterous Post Plugin"
msgstr "Posterous-Plugin aktivieren"
#: ../../addon/posterous/posterous.php:73
msgid "Posterous login"
msgstr "Posterous-Anmeldename"
#: ../../addon/posterous/posterous.php:78
msgid "Posterous password"
msgstr "Posterous-Passwort"
#: ../../addon/posterous/posterous.php:83
msgid "Post to Posterous by default"
msgstr "Veröffentliche öffentliche Beiträge standardmäßig bei Posterous"
#: ../../addon/js_upload/js_upload.php:43
msgid "Upload a file"
msgstr "Datei hochladen"
#: ../../addon/js_upload/js_upload.php:44
msgid "Drop files here to upload"
msgstr "Ziehe die Dateien hierher die du hochladen willst"
#: ../../addon/js_upload/js_upload.php:46
msgid "Failed"
msgstr "Fehlgeschlagen"
#: ../../addon/js_upload/js_upload.php:294
msgid "No files were uploaded."
msgstr "Keine Dateien hochgeladen."
#: ../../addon/js_upload/js_upload.php:300
msgid "Uploaded file is empty"
msgstr "Hochgeladene Datei ist leer"
#: ../../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 "
#: ../../addon/js_upload/js_upload.php:334
msgid "Upload was cancelled, or server error encountered"
msgstr "Upload abgebrochen oder Serverfehler aufgetreten"
#: ../../addon/buglink/buglink.php:15
msgid "Report Bug"
msgstr "Fehlerreport erstellen"
#: ../../addon/statusnet/statusnet.php:141
msgid "Post to StatusNet"
msgstr "Bei StatusNet veröffentlichen"
#: ../../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."
#: ../../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."
#: ../../addon/statusnet/statusnet.php:238
msgid "StatusNet settings updated."
msgstr "StatusNet Einstellungen aktualisiert."
#: ../../addon/statusnet/statusnet.php:261
msgid "StatusNet Posting Settings"
msgstr "StatusNet-Beitragseinstellungen"
#: ../../addon/statusnet/statusnet.php:275
msgid "Globally Available StatusNet OAuthKeys"
msgstr "Verfügbare OAuth Schlüssel für StatusNet"
#: ../../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."
#: ../../addon/statusnet/statusnet.php:284
msgid "Provide your own OAuth Credentials"
msgstr "Eigene OAuth Schlüssel eintragen"
#: ../../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"
#: ../../addon/statusnet/statusnet.php:290
msgid "OAuth Consumer Secret"
msgstr "OAuth Consumer Secret"
#: ../../addon/statusnet/statusnet.php:293
msgid "Base API Path (remember the trailing /)"
msgstr "Basis-URL der StatusNet-API (vergiss den abschließenden / nicht)"
#: ../../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."
#: ../../addon/statusnet/statusnet.php:315
msgid "Log in with StatusNet"
msgstr "Bei StatusNet anmelden"
#: ../../addon/statusnet/statusnet.php:317
msgid "Copy the security code from StatusNet here"
msgstr "Kopiere den Sicherheitscode von StatusNet hier hin"
#: ../../addon/statusnet/statusnet.php:323
msgid "Cancel Connection Process"
msgstr "Verbindungsprozess abbrechen"
#: ../../addon/statusnet/statusnet.php:325
msgid "Current StatusNet API is"
msgstr "Derzeitige StatusNet-API-URL lautet"
#: ../../addon/statusnet/statusnet.php:326
msgid "Cancel StatusNet Connection"
msgstr "Verbindung zum StatusNet Server abbrechen"
#: ../../addon/statusnet/statusnet.php:337 ../../addon/twitter/twitter.php:188
msgid "Currently connected to: "
msgstr "Momentan verbunden mit: "
#: ../../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."
#: ../../addon/statusnet/statusnet.php:340
msgid "Allow posting to StatusNet"
msgstr "Veröffentlichung bei StatusNet erlauben"
#: ../../addon/statusnet/statusnet.php:343
msgid "Send public postings to StatusNet by default"
msgstr "Veröffentliche öffentliche Beiträge standardmäßig bei StatusNet"
#: ../../addon/statusnet/statusnet.php:348 ../../addon/twitter/twitter.php:199
msgid "Clear OAuth configuration"
msgstr "OAuth-Konfiguration löschen"
#: ../../addon/statusnet/statusnet.php:478
msgid "API URL"
msgstr "API-URL"
#: ../../addon/widgets/widgets.php:55
msgid "Generate new key"
msgstr "Neuen Schlüssel erstellen"
#: ../../addon/widgets/widgets.php:58
msgid "Widgets key"
msgstr "Widgets Schlüssel"
#: ../../addon/widgets/widgets.php:60
msgid "Widgets available"
msgstr "Verfügbare Widgets"
#: ../../addon/widgets/widget_friends.php:40
msgid "Connect on Friendica!"
msgstr "In Friendica verbinden!"
#: ../../addon/widgets/widget_like.php:58
#: ../../include/dba.php:39
#, 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 "Cannot locate DNS info for database server '%s'"
msgstr "Kann die DNS Informationen für den Datenbanken Server '%s' nicht ermitteln."
#: ../../addon/widgets/widget_like.php:61
#: ../../include/message.php:14
msgid "[no subject]"
msgstr "[kein Betreff]"
#: ../../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 "%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"
msgid "%s Administrator"
msgstr "der Administrator von %s"
#: ../../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"
#: ../../addon/impressum/impressum.php:38
#: ../../addon/impressum/impressum.php:74
msgid "Email Address"
msgstr "Email Adresse"
#: ../../addon/impressum/impressum.php:43
#: ../../addon/impressum/impressum.php:72
msgid "Postal Address"
msgstr "Postalische Anschrift"
#: ../../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."
#: ../../addon/impressum/impressum.php:71
msgid "Site Owners Profile"
msgstr "Profil des Seitenbetreibers"
#: ../../addon/impressum/impressum.php:73
msgid "Notes"
msgstr "Hinweise"
#: ../../addon/tictac/tictac.php:20
msgid "Three Dimensional Tic-Tac-Toe"
msgstr "Dreidimensionales Tic-Tac-Toe"
#: ../../addon/tictac/tictac.php:53
msgid "3D Tic-Tac-Toe"
msgstr "3D Tic-Tac-Toe"
#: ../../addon/tictac/tictac.php:58
msgid "New game"
msgstr "Neues Spiel"
#: ../../addon/tictac/tictac.php:59
msgid "New game with handicap"
msgstr "Neues Handicap Spiel"
#: ../../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."
#: ../../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."
#: ../../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."
#: ../../addon/tictac/tictac.php:182
msgid "You go first..."
msgstr "Du fängst an..."
#: ../../addon/tictac/tictac.php:187
msgid "I'm going first this time..."
msgstr "Diesmal fange ich an..."
#: ../../addon/tictac/tictac.php:193
msgid "You won!"
msgstr "Du gewinnst!"
#: ../../addon/tictac/tictac.php:199 ../../addon/tictac/tictac.php:224
msgid "\"Cat\" game!"
msgstr "Unentschieden!"
#: ../../addon/tictac/tictac.php:222
msgid "I won!"
msgstr "Ich gewinne!"
#: ../../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."
#: ../../addon/piwik/piwik.php:73
#: ../../include/enotify.php:28
#, 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 "New mail received at %s"
msgstr "Neue Nachricht auf %s empfangen"
#: ../../addon/piwik/piwik.php:82
msgid "Piwik Base URL"
msgstr "Piwik Basis URL"
#: ../../addon/piwik/piwik.php:83
msgid "Site ID"
msgstr "Seiten ID"
#: ../../addon/piwik/piwik.php:84
msgid "Show opt-out cookie link?"
msgstr "Link zum Setzen des Opt-Out Cookies anzeigen?"
#: ../../addon/membersince/membersince.php:17
#: ../../include/enotify.php:30
#, php-format
msgid " - Member since: %s"
msgstr " - Mitglied seit: %s"
msgid "%s sent you a new private message at %s."
msgstr "%s hat dir eine neue private Nachricht auf %s geschrieben."
#: ../../addon/communityhome/communityhome.php:29
msgid "OpenID"
msgstr "OpenID"
#: ../../addon/communityhome/communityhome.php:38
msgid "Last users"
msgstr "Letzte Nutzer"
#: ../../addon/communityhome/communityhome.php:81
msgid "Most active users"
msgstr "Aktivste Nutzer"
#: ../../addon/communityhome/communityhome.php:98
msgid "Last photos"
msgstr "Letzte Fotos"
#: ../../addon/communityhome/communityhome.php:133
msgid "Last likes"
msgstr "Zuletzt gemocht"
#: ../../addon/pageheader/pageheader.php:47
msgid "\"pageheader\" Settings"
msgstr "\"pageheader\"-Einstellungen"
#: ../../addon/pageheader/pageheader.php:65
msgid "pageheader Settings saved."
msgstr "pageheader-Einstellungen gespeichert."
#: ../../addon/randplace/randplace.php:170
msgid "Randplace Settings"
msgstr "Randplace-Einstellungen"
#: ../../addon/randplace/randplace.php:172
msgid "Enable Randplace Plugin"
msgstr "Randplace-Plugin aktivieren"
#: ../../addon/blockem/blockem.php:47
msgid "\"Blockem\" Settings"
msgstr "\"Blockem\"-Einstellungen"
#: ../../addon/blockem/blockem.php:49
msgid "Comma separated profile URLS to block"
msgstr "Profil-URLs, die blockiert werden sollen (durch Kommas getrennt)"
#: ../../addon/blockem/blockem.php:66
msgid "BLOCKEM Settings saved."
msgstr "BLOCKEM-Einstellungen gesichert."
#: ../../addon/blockem/blockem.php:104
#: ../../include/enotify.php:32
#, php-format
msgid "Blocked %s - Click to open/close"
msgstr "%s blockiert - Zum Öffnen/Schließen klicken"
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/nsfw/nsfw.php:47
msgid "\"Not Safe For Work\" Settings"
msgstr "\"Not Safe For Work\"-Einstellungen"
#: ../../addon/nsfw/nsfw.php:49
msgid "Comma separated words to treat as NSFW"
msgstr "Wörter, die gefiltert werden sollen (durch Kommas getrennt)"
#: ../../addon/nsfw/nsfw.php:66
msgid "NSFW Settings saved."
msgstr "NSFW-Einstellungen gespeichert"
#: ../../addon/nsfw/nsfw.php:102
#: ../../include/enotify.php:40
#, php-format
msgid "%s - Click to open/close"
msgstr "%s Zum Öffnen/Schließen klicken"
msgid "%s commented on an item at %s"
msgstr "%s kommentierte einen Beitrag auf %s"
#: ../../boot.php:437
#: ../../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
#: ../../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."
#: ../../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/enotify.php:58
#, php-format
msgid "%s tagged you at %s"
msgstr "%s hat dich auf %s erwähnt"
#: ../../include/enotify.php:67
#, php-format
msgid "%s tagged your post at %s"
msgstr "%s hat deinen Beitrag auf %s getaggt"
#: ../../include/enotify.php:76
#, php-format
msgid "Introduction received at %s"
msgstr "Kontaktanfrage auf %s erhalten"
#: ../../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"
#: ../../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"
#: ../../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."
#: ../../include/enotify.php:87
#, php-format
msgid "Friend suggestion received at %s"
msgstr "Kontaktvorschlag empfangen auf %s"
#: ../../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"
#: ../../include/enotify.php:89
msgid "Name:"
msgstr "Name:"
#: ../../include/enotify.php:90
msgid "Photo:"
msgstr "Foto:"
#: ../../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."
#: ../../include/items.php:2450
msgid "A new person is sharing with you at "
msgstr "Eine neue Person teilt mit dir auf "
#: ../../include/items.php:2450
msgid "You have a new follower at "
msgstr "Du hast einen neuen Kontakt auf "
#: ../../include/bb2diaspora.php:64
msgid "view full size"
msgstr "Volle Größe anzeigen"
#: ../../include/bb2diaspora.php:113 ../../include/bb2diaspora.php:123
#: ../../include/bb2diaspora.php:124
msgid "image/photo"
msgstr "Bild/Foto"
#: ../../include/security.php:20
msgid "Welcome "
msgstr "Willkommen "
#: ../../include/security.php:21
msgid "Please upload a profile photo."
msgstr "Bitte lade ein Profilbild hoch."
#: ../../include/security.php:24
msgid "Welcome back "
msgstr "Willkommen zurück "
#: ../../include/Contact.php:131 ../../include/conversation.php:744
msgid "View status"
msgstr "Status anzeigen"
#: ../../include/Contact.php:132 ../../include/conversation.php:745
msgid "View profile"
msgstr "Profil anzeigen"
#: ../../include/Contact.php:133 ../../include/conversation.php:746
msgid "View photos"
msgstr "Fotos ansehen"
#: ../../include/Contact.php:134 ../../include/Contact.php:147
#: ../../include/conversation.php:747
msgid "View recent"
msgstr "Neueste anzeigen"
#: ../../include/Contact.php:136 ../../include/Contact.php:147
#: ../../include/conversation.php:749
msgid "Send PM"
msgstr "Private Nachricht senden"
#: ../../include/conversation.php:141
msgid "post/item"
msgstr "Nachricht/Beitrag"
#: ../../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"
#: ../../include/conversation.php:279 ../../include/conversation.php:535
msgid "Select"
msgstr "Auswählen"
#: ../../include/conversation.php:294 ../../include/conversation.php:623
#: ../../include/conversation.php:624
#, php-format
msgid "View %s's profile @ %s"
msgstr "Das Profil von %s auf %s betrachten."
#: ../../include/conversation.php:303 ../../include/conversation.php:635
#, php-format
msgid "%s from %s"
msgstr "%s von %s"
#: ../../include/conversation.php:319
msgid "View in context"
msgstr "Im Zusammenhang betrachten"
#: ../../include/conversation.php:434
#, php-format
msgid "%d comment"
msgid_plural "%d comments"
msgstr[0] "%d Kommentar"
msgstr[1] "%d Kommentare"
#: ../../include/conversation.php:437 ../../boot.php:444
msgid "show more"
msgstr "mehr anzeigen"
#: ../../include/conversation.php:497
msgid "like"
msgstr "mag ich"
#: ../../include/conversation.php:498
msgid "dislike"
msgstr "mag ich nicht"
#: ../../include/conversation.php:500
msgid "Share this"
msgstr "Teilen"
#: ../../include/conversation.php:500
msgid "share"
msgstr "Teilen"
#: ../../include/conversation.php:545
msgid "add star"
msgstr "markieren"
#: ../../include/conversation.php:546
msgid "remove star"
msgstr "Markierung entfernen"
#: ../../include/conversation.php:547
msgid "toggle star status"
msgstr "Markierung umschalten"
#: ../../include/conversation.php:550
msgid "starred"
msgstr "markiert"
#: ../../include/conversation.php:551
msgid "add tag"
msgstr "Tag hinzufügen"
#: ../../include/conversation.php:625
msgid "to"
msgstr "to"
#: ../../include/conversation.php:626
msgid "Wall-to-Wall"
msgstr "Wall-to-Wall"
#: ../../include/conversation.php:627
msgid "via Wall-To-Wall:"
msgstr "via Wall-To-Wall:"
#: ../../include/conversation.php:669
msgid "Delete Selected Items"
msgstr "Lösche die markierten Beiträge"
#: ../../include/conversation.php:801
#, php-format
msgid "%s likes this."
msgstr "%s mag das."
#: ../../include/conversation.php:801
#, php-format
msgid "%s doesn't like this."
msgstr "%s mag das nicht."
#: ../../include/conversation.php:805
#, php-format
msgid "<span %1$s>%2$d people</span> like this."
msgstr "<span %1$s>%2$d Leute</span> mögen das."
#: ../../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."
#: ../../include/conversation.php:813
msgid "and"
msgstr "und"
#: ../../include/conversation.php:816
#, php-format
msgid ", and %d other people"
msgstr " und %d andere"
#: ../../include/conversation.php:817
#, php-format
msgid "%s like this."
msgstr "%s mögen das."
#: ../../include/conversation.php:817
#, php-format
msgid "%s don't like this."
msgstr "%s mögen das nicht."
#: ../../include/conversation.php:842
msgid "Visible to <strong>everybody</strong>"
msgstr "Für <strong>Jedermann</strong> sichtbar"
#: ../../include/conversation.php:844
msgid "Please enter a video link/URL:"
msgstr "Bitte Link/URL zum Video einfügen:"
#: ../../include/conversation.php:845
msgid "Please enter an audio link/URL:"
msgstr "Bitte Link/URL zum Audio einfügen:"
#: ../../include/conversation.php:846
msgid "Tag term:"
msgstr "Tag:"
#: ../../include/conversation.php:847
msgid "Where are you right now?"
msgstr "Wo hältst du dich jetzt gerade auf?"
#: ../../include/conversation.php:848
msgid "Enter a title for this item"
msgstr "Gib den Titel für diesen Beitrag ein"
#: ../../include/conversation.php:891
msgid "upload photo"
msgstr "Bild hochladen"
#: ../../include/conversation.php:893
msgid "attach file"
msgstr "Datei anhängen"
#: ../../include/conversation.php:895
msgid "web link"
msgstr "Weblink"
#: ../../include/conversation.php:896
msgid "Insert video link"
msgstr "Video-Adresse einfügen"
#: ../../include/conversation.php:897
msgid "video link"
msgstr "Video-Link"
#: ../../include/conversation.php:898
msgid "Insert audio link"
msgstr "Audio-Adresse einfügen"
#: ../../include/conversation.php:899
msgid "audio link"
msgstr "Audio-Link"
#: ../../include/conversation.php:901
msgid "set location"
msgstr "Ort setzen"
#: ../../include/conversation.php:903
msgid "clear location"
msgstr "Ort löschen"
#: ../../include/conversation.php:908
msgid "permissions"
msgstr "Zugriffsrechte"
#: ../../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]"

View file

@ -4,223 +4,17 @@ 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["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["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["No matches"] = "Keine Übereinstimmungen";
$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";
$a->strings["Contact has been unignored"] = "Kontakt wurde ignoriert";
$a->strings["stopped following"] = "wird nicht mehr gefolgt";
$a->strings["Contact has been removed."] = "Kontakt wurde entfernt.";
$a->strings["You are mutual friends with %s"] = "Du hast mit %s eine beidseitige Freundschaft";
$a->strings["You are sharing with %s"] = "Du teilst mit %s";
$a->strings["%s is sharing with you"] = "%s teilt mit Dir";
$a->strings["Private communications are not available for this contact."] = "Private Kommunikation ist für diesen Kontakt nicht verfügbar.";
$a->strings["Never"] = "Niemals";
$a->strings["(Update was successful)"] = "(Aktualisierung war erfolgreich)";
$a->strings["(Update was not successful)"] = "(Aktualisierung war nicht erfolgreich)";
$a->strings["Suggest friends"] = "Kontakte vorschlagen";
$a->strings["Network type: %s"] = "Netzwerk Typ: %s";
$a->strings["%d contact in common"] = array(
0 => "%d gemeinsamer Kontakt",
1 => "%d gemeinsame Kontakte",
);
$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";
$a->strings["Edit contact notes"] = "Notizen zum Kontakt bearbiten";
$a->strings["Visit %s's profile [%s]"] = "Besuche %ss Profil [%s]";
$a->strings["Block/Unblock contact"] = "Kontakt blockieren/freischalten";
$a->strings["Ignore contact"] = "Ignoriere den Kontakt";
$a->strings["Repair URL settings"] = "URL Einstellungen reparieren";
$a->strings["View conversations"] = "Unterhaltungen anzeigen";
$a->strings["Delete contact"] = "Lösche den Kontakt";
$a->strings["Last update:"] = "letzte Aktualisierung:";
$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["Search your contacts"] = "Suche in deinen Kontakten";
$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["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.";
$a->strings["Email settings updated."] = "EMail Einstellungen bearbeitet.";
$a->strings["Passwords do not match. Password unchanged."] = "Die Passwörter stimmen nicht überein. Das Passwort bleibt unverändert.";
$a->strings["Empty passwords are not allowed. Password unchanged."] = "Leere Passwörter sind nicht erlaubt. Passwort bleibt unverändert.";
$a->strings["Password changed."] = "Passwort ändern.";
$a->strings["Password update failed. Please try again."] = "Aktualisierung des Passworts gescheitert, bitte versuche es noch einmal.";
$a->strings[" Please use a shorter name."] = " Bitte verwende einen kürzeren Namen.";
$a->strings[" Name too short."] = " Name ist zu kurz.";
$a->strings[" Not valid email."] = " Keine gültige E-Mail.";
$a->strings[" Cannot change to that email."] = " Cannot change to that email.";
$a->strings["Settings updated."] = "Einstellungen aktualisiert.";
$a->strings["Account settings"] = "Account Einstellungen";
$a->strings["Connector settings"] = "Connector-Einstellungen";
$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";
$a->strings["Connector Settings"] = "Verbindungs-Einstellungen";
$a->strings["Email/Mailbox Setup"] = "E-Mail/Postfach-Einstellungen";
$a->strings["If you wish to communicate with email contacts using this service (optional), please specify how to connect to your mailbox."] = "Wenn du mit E-Mail-Kontakten über diesen Service kommunizieren möchtest (optional), gib bitte die Einstellungen für dein Postfach an.";
$a->strings["Last successful email check:"] = "Letzter erfolgreicher Email Check";
$a->strings["Email access is disabled on this site."] = "Zugriff auf E-Mails für diese Seite deaktiviert.";
$a->strings["IMAP server name:"] = "IMAP-Server-Name:";
$a->strings["IMAP port:"] = "IMAP-Port:";
$a->strings["Security:"] = "Sicherheit:";
$a->strings["None"] = "Keine";
$a->strings["Email login name:"] = "E-Mail-Login-Name:";
$a->strings["Email password:"] = "E-Mail-Passwort:";
$a->strings["Reply-to address:"] = "Reply-to Adresse:";
$a->strings["Send public posts to all email contacts:"] = "Sende öffentliche Beiträge an alle E-Mail-Kontakte:";
$a->strings["Normal Account"] = "Normaler Account";
$a->strings["This account is a normal personal profile"] = "Dieser Account ist ein normales persönliches Profil";
$a->strings["Soapbox Account"] = "Sandkasten-Account";
$a->strings["Automatically approve all connection/friend requests as read-only fans"] = "Freundschaftsanfragen werden automatisch als Nurlese-Fans akzeptiert";
$a->strings["Community/Celebrity Account"] = "Gemeinschafts/Promi-Account";
$a->strings["Automatically approve all connection/friend requests as read-write fans"] = "Freundschaftsanfragen werden automatisch als Lese-und-Schreib-Fans akzeptiert";
$a->strings["Automatic Friend Account"] = "Automatischer Freundesaccount";
$a->strings["Automatically approve all connection/friend requests as friends"] = "Freundschaftsanfragen werden automatisch als Freund akzeptiert";
$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?";
$a->strings["Allow friends to post to your profile page?"] = "Deinen Kontakten erlauben, auf deine Pinnwand zu schreiben?";
$a->strings["Allow friends to tag your posts?"] = "Deinen Kontakten erlauben, deine Beiträge mit Schlagwörtern zu versehen?";
$a->strings["Allow us to suggest you as a potential friend to new members?"] = "Erlaube uns dich als potentiellen Kontakt für neue Mitglieder vorzuschlagen?";
$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["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";
$a->strings["Expire posts:"] = "Beiträge verfallen lassen:";
$a->strings["Expire personal notes:"] = "Persönliche Notizen verfallen lassen:";
$a->strings["Expire starred posts:"] = "Markierte Beiträge verfallen lassen:";
$a->strings["Expire photos:"] = "Fotos verfallen lassen:";
$a->strings["Account Settings"] = "Account-Einstellungen";
$a->strings["Password Settings"] = "Passwort-Einstellungen";
$a->strings["New Password:"] = "Neues Passwort:";
$a->strings["Confirm:"] = "Bestätigen:";
$a->strings["Leave password fields blank unless changing"] = "Lass die Passwort-Felder leer, außer du willst das Passwort ändern";
$a->strings["Basic Settings"] = "Grundeinstellungen";
$a->strings["Full Name:"] = "Kompletter Name:";
$a->strings["Email Address:"] = "Emailadresse:";
$a->strings["Your Timezone:"] = "Deine Zeitzone:";
$a->strings["Default Post Location:"] = "Standardstandort:";
$a->strings["Use Browser Location:"] = "Verwende den Standort des Browsers:";
$a->strings["Display Theme:"] = "Theme:";
$a->strings["Update browser every xx seconds"] = "Browser alle xx Sekunden aktualisieren";
$a->strings["Minimum of 10 seconds, no maximum"] = "Minimal 10 Sekunden, kein Maximum";
$a->strings["Security and Privacy Settings"] = "Sicherheits- und Privatsphäre-Einstellungen";
$a->strings["Maximum Friend Requests/Day:"] = "Maximale Anzahl von Freundschaftsanfragen/Tag:";
$a->strings["(to prevent spam abuse)"] = "(um SPAM zu vermeiden)";
$a->strings["Default Post Permissions"] = "Standard-Zugriffsrechte für Beiträge";
$a->strings["(click to open/close)"] = "(klicke zum öffnen/schließen)";
$a->strings["Notification Settings"] = "Benachrichtigungseinstellungen";
$a->strings["Send a notification email when:"] = "Benachrichtigungs-E-Mail senden wenn:";
$a->strings["You receive an introduction"] = "Du eine Kontaktanfrage erhältst";
$a->strings["Your introductions are confirmed"] = "Eine deiner Kontaktanfragen akzeptiert wurde";
$a->strings["Someone writes on your profile wall"] = "Jemand etwas auf deine Pinnwand schreibt";
$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["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["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";
@ -229,13 +23,129 @@ $a->strings["Friend Confirm URL"] = "URL für Bestätigungen von Freundschaftsan
$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["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 => "",
1 => "",
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.";
@ -248,6 +158,8 @@ $a->strings["Unable to resolve your name at the provided location."] = "Konnte d
$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["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.";
@ -264,255 +176,10 @@ $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["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["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["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["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";
$a->strings["Please enter the required information."] = "Bitte trage die erforderlichen Informationen ein.";
$a->strings["Please use a shorter name."] = "Bitte verwende einen kürzeren Namen.";
$a->strings["Name too short."] = "Der Name ist zu kurz.";
$a->strings["That doesn't appear to be your full (First Last) name."] = "Das scheint nicht dein kompletter Name (Vor- und Nachname) zu sein.";
$a->strings["Your email domain is not among those allowed on this site."] = "Die Domain deiner E-Mail Adresse ist auf dieser Seite nicht erlaubt.";
$a->strings["Not a valid email address."] = "Keine gültige E-Mail-Adresse.";
$a->strings["Cannot use that email."] = "Konnte diese E-Mail-Adresse nicht verwenden.";
$a->strings["Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and must also begin with a letter."] = "Dein Spitzname darf nur aus Buchstaben und Zahlen (\"a-z\",\"0-9\", \"_\" und \"-\") bestehen, außerdem muss er mit einem Buchstaben beginnen.";
$a->strings["Nickname is already registered. Please choose another."] = "Dieser Spitzname ist bereits vergeben. Bitte wähle einen anderen.";
$a->strings["SERIOUS ERROR: Generation of security keys failed."] = "SERIOUS ERROR: Generation of security keys failed.";
$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.";
$a->strings["Registration request at %s"] = "Registrierungsanfrage auf %s";
$a->strings["Your registration is pending approval by the site owner."] = "Deine Registrierung muss noch vom Betreiber der Seite freigegeben werden.";
$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Die maximale Anzahl täglicher Registrierungen auf dieser Seite wurde überschritten. Bitte versuche es morgen noch einmal.";
$a->strings["You may (optionally) fill in this form via OpenID by supplying your OpenID and clicking 'Register'."] = "Du kannst dieses Formular auch (optional) mit deiner OpenID ausfüllen, indem du deine OpenID angibst und 'Registrieren' klickst.";
$a->strings["If you are not familiar with OpenID, please leave that field blank and fill in the rest of the items."] = "Wenn du nicht mit OpenID vertraut bist, lass dieses Feld bitte leer und fülle die restlichen Felder aus.";
$a->strings["Your OpenID (optional): "] = "Deine OpenID (optional): ";
$a->strings["Include your profile in member directory?"] = "Soll dein Profil im Nutzerverzeichnis angezeigt werden?";
$a->strings["Membership on this site is by invitation only."] = "Mitgliedschaft auf dieser Seite ist nur nach vorheriger Einladung möglich.";
$a->strings["Your invitation ID: "] = "ID deiner Einladung: ";
$a->strings["Registration"] = "Registrierung";
$a->strings["Your Full Name (e.g. Joe Smith): "] = "Vollständiger Name (z.B. Max Mustermann): ";
$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["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";
@ -525,7 +192,6 @@ $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.";
@ -567,11 +233,384 @@ $a->strings["If not, you may be required to perform a manual installation. Pleas
$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["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["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";
$a->strings["Contact has been unignored"] = "Kontakt wurde ignoriert";
$a->strings["stopped following"] = "wird nicht mehr gefolgt";
$a->strings["Contact has been removed."] = "Kontakt wurde entfernt.";
$a->strings["You are mutual friends with %s"] = "Du hast mit %s eine beidseitige Freundschaft";
$a->strings["You are sharing with %s"] = "Du teilst mit %s";
$a->strings["%s is sharing with you"] = "%s teilt mit Dir";
$a->strings["Private communications are not available for this contact."] = "Private Kommunikation ist für diesen Kontakt nicht verfügbar.";
$a->strings["Never"] = "Niemals";
$a->strings["(Update was successful)"] = "(Aktualisierung war erfolgreich)";
$a->strings["(Update was not successful)"] = "(Aktualisierung war nicht erfolgreich)";
$a->strings["Suggest friends"] = "Kontakte vorschlagen";
$a->strings["Network type: %s"] = "Netzwerk Typ: %s";
$a->strings["%d contact in common"] = array(
0 => "%d gemeinsamer Kontakt",
1 => "%d gemeinsame Kontakte",
);
$a->strings["View all contacts"] = "Alle Kontakte anzeigen";
$a->strings["Unblock"] = "Entsperren";
$a->strings["Block"] = "Sperren";
$a->strings["Unignore"] = "Ignorieren aufheben";
$a->strings["Repair"] = "Reparieren";
$a->strings["Contact Editor"] = "Kontakt Editor";
$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";
$a->strings["Edit contact notes"] = "Notizen zum Kontakt bearbiten";
$a->strings["Visit %s's profile [%s]"] = "Besuche %ss Profil [%s]";
$a->strings["Block/Unblock contact"] = "Kontakt blockieren/freischalten";
$a->strings["Ignore contact"] = "Ignoriere den Kontakt";
$a->strings["Repair URL settings"] = "URL Einstellungen reparieren";
$a->strings["View conversations"] = "Unterhaltungen anzeigen";
$a->strings["Delete contact"] = "Lösche den Kontakt";
$a->strings["Last update:"] = "letzte Aktualisierung:";
$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["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 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["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.";
$a->strings["Email settings updated."] = "EMail Einstellungen bearbeitet.";
$a->strings["Passwords do not match. Password unchanged."] = "Die Passwörter stimmen nicht überein. Das Passwort bleibt unverändert.";
$a->strings["Empty passwords are not allowed. Password unchanged."] = "Leere Passwörter sind nicht erlaubt. Passwort bleibt unverändert.";
$a->strings["Password changed."] = "Passwort ändern.";
$a->strings["Password update failed. Please try again."] = "Aktualisierung des Passworts gescheitert, bitte versuche es noch einmal.";
$a->strings[" Please use a shorter name."] = " Bitte verwende einen kürzeren Namen.";
$a->strings[" Name too short."] = " Name ist zu kurz.";
$a->strings[" Not valid email."] = " Keine gültige E-Mail.";
$a->strings[" Cannot change to that email."] = " Cannot change to that email.";
$a->strings["Settings updated."] = "Einstellungen aktualisiert.";
$a->strings["Account settings"] = "Account Einstellungen";
$a->strings["Connector settings"] = "Connector-Einstellungen";
$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["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["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["enabled"] = "eingeschaltet";
$a->strings["disabled"] = "ausgeschaltet";
$a->strings["StatusNet"] = "StatusNet";
$a->strings["Connector Settings"] = "Verbindungs-Einstellungen";
$a->strings["Email/Mailbox Setup"] = "E-Mail/Postfach-Einstellungen";
$a->strings["If you wish to communicate with email contacts using this service (optional), please specify how to connect to your mailbox."] = "Wenn du mit E-Mail-Kontakten über diesen Service kommunizieren möchtest (optional), gib bitte die Einstellungen für dein Postfach an.";
$a->strings["Last successful email check:"] = "Letzter erfolgreicher Email Check";
$a->strings["Email access is disabled on this site."] = "Zugriff auf E-Mails für diese Seite deaktiviert.";
$a->strings["IMAP server name:"] = "IMAP-Server-Name:";
$a->strings["IMAP port:"] = "IMAP-Port:";
$a->strings["Security:"] = "Sicherheit:";
$a->strings["None"] = "Keine";
$a->strings["Email login name:"] = "E-Mail-Login-Name:";
$a->strings["Email password:"] = "E-Mail-Passwort:";
$a->strings["Reply-to address:"] = "Reply-to Adresse:";
$a->strings["Send public posts to all email contacts:"] = "Sende öffentliche Beiträge an alle E-Mail-Kontakte:";
$a->strings["Normal Account"] = "Normaler Account";
$a->strings["This account is a normal personal profile"] = "Dieser Account ist ein normales persönliches Profil";
$a->strings["Soapbox Account"] = "Sandkasten-Account";
$a->strings["Automatically approve all connection/friend requests as read-only fans"] = "Freundschaftsanfragen werden automatisch als Nurlese-Fans akzeptiert";
$a->strings["Community/Celebrity Account"] = "Gemeinschafts/Promi-Account";
$a->strings["Automatically approve all connection/friend requests as read-write fans"] = "Freundschaftsanfragen werden automatisch als Lese-und-Schreib-Fans akzeptiert";
$a->strings["Automatic Friend Account"] = "Automatischer Freundesaccount";
$a->strings["Automatically approve all connection/friend requests as friends"] = "Freundschaftsanfragen werden automatisch als Freund akzeptiert";
$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["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?";
$a->strings["Allow friends to post to your profile page?"] = "Deinen Kontakten erlauben, auf deine Pinnwand zu schreiben?";
$a->strings["Allow friends to tag your posts?"] = "Deinen Kontakten erlauben, deine Beiträge mit Schlagwörtern zu versehen?";
$a->strings["Allow us to suggest you as a potential friend to new members?"] = "Erlaube uns dich als potentiellen Kontakt für neue Mitglieder vorzuschlagen?";
$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 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";
$a->strings["Expire posts:"] = "Beiträge verfallen lassen:";
$a->strings["Expire personal notes:"] = "Persönliche Notizen verfallen lassen:";
$a->strings["Expire starred posts:"] = "Markierte Beiträge verfallen lassen:";
$a->strings["Expire photos:"] = "Fotos verfallen lassen:";
$a->strings["Account Settings"] = "Account-Einstellungen";
$a->strings["Password Settings"] = "Passwort-Einstellungen";
$a->strings["New Password:"] = "Neues Passwort:";
$a->strings["Confirm:"] = "Bestätigen:";
$a->strings["Leave password fields blank unless changing"] = "Lass die Passwort-Felder leer, außer du willst das Passwort ändern";
$a->strings["Basic Settings"] = "Grundeinstellungen";
$a->strings["Full Name:"] = "Kompletter Name:";
$a->strings["Email Address:"] = "Emailadresse:";
$a->strings["Your Timezone:"] = "Deine Zeitzone:";
$a->strings["Default Post Location:"] = "Standardstandort:";
$a->strings["Use Browser Location:"] = "Verwende den Standort des Browsers:";
$a->strings["Display Theme:"] = "Theme:";
$a->strings["Update browser every xx seconds"] = "Browser alle xx Sekunden aktualisieren";
$a->strings["Minimum of 10 seconds, no maximum"] = "Minimal 10 Sekunden, kein Maximum";
$a->strings["Security and Privacy Settings"] = "Sicherheits- und Privatsphäre-Einstellungen";
$a->strings["Maximum Friend Requests/Day:"] = "Maximale Anzahl von Freundschaftsanfragen/Tag:";
$a->strings["(to prevent spam abuse)"] = "(um SPAM zu vermeiden)";
$a->strings["Default Post Permissions"] = "Standard-Zugriffsrechte für Beiträge";
$a->strings["(click to open/close)"] = "(klicke zum öffnen/schließen)";
$a->strings["Notification Settings"] = "Benachrichtigungseinstellungen";
$a->strings["Send a notification email when:"] = "Benachrichtigungs-E-Mail senden wenn:";
$a->strings["You receive an introduction"] = "Du eine Kontaktanfrage erhältst";
$a->strings["Your introductions are confirmed"] = "Eine deiner Kontaktanfragen akzeptiert wurde";
$a->strings["Someone writes on your profile wall"] = "Jemand etwas auf deine Pinnwand schreibt";
$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["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 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["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["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";
$a->strings["Please enter the required information."] = "Bitte trage die erforderlichen Informationen ein.";
$a->strings["Please use a shorter name."] = "Bitte verwende einen kürzeren Namen.";
$a->strings["Name too short."] = "Der Name ist zu kurz.";
$a->strings["That doesn't appear to be your full (First Last) name."] = "Das scheint nicht dein kompletter Name (Vor- und Nachname) zu sein.";
$a->strings["Your email domain is not among those allowed on this site."] = "Die Domain deiner E-Mail Adresse ist auf dieser Seite nicht erlaubt.";
$a->strings["Not a valid email address."] = "Keine gültige E-Mail-Adresse.";
$a->strings["Cannot use that email."] = "Konnte diese E-Mail-Adresse nicht verwenden.";
$a->strings["Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and must also begin with a letter."] = "Dein Spitzname darf nur aus Buchstaben und Zahlen (\"a-z\",\"0-9\", \"_\" und \"-\") bestehen, außerdem muss er mit einem Buchstaben beginnen.";
$a->strings["Nickname is already registered. Please choose another."] = "Dieser Spitzname ist bereits vergeben. Bitte wähle einen anderen.";
$a->strings["SERIOUS ERROR: Generation of security keys failed."] = "SERIOUS ERROR: Generation of security keys failed.";
$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["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.";
$a->strings["Registration request at %s"] = "Registrierungsanfrage auf %s";
$a->strings["Your registration is pending approval by the site owner."] = "Deine Registrierung muss noch vom Betreiber der Seite freigegeben werden.";
$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Die maximale Anzahl täglicher Registrierungen auf dieser Seite wurde überschritten. Bitte versuche es morgen noch einmal.";
$a->strings["You may (optionally) fill in this form via OpenID by supplying your OpenID and clicking 'Register'."] = "Du kannst dieses Formular auch (optional) mit deiner OpenID ausfüllen, indem du deine OpenID angibst und 'Registrieren' klickst.";
$a->strings["If you are not familiar with OpenID, please leave that field blank and fill in the rest of the items."] = "Wenn du nicht mit OpenID vertraut bist, lass dieses Feld bitte leer und fülle die restlichen Felder aus.";
$a->strings["Your OpenID (optional): "] = "Deine OpenID (optional): ";
$a->strings["Include your profile in member directory?"] = "Soll dein Profil im Nutzerverzeichnis angezeigt werden?";
$a->strings["Membership on this site is by invitation only."] = "Mitgliedschaft auf dieser Seite ist nur nach vorheriger Einladung möglich.";
$a->strings["Your invitation ID: "] = "ID deiner Einladung: ";
$a->strings["Registration"] = "Registrierung";
$a->strings["Your Full Name (e.g. Joe Smith): "] = "Vollständiger Name (z.B. Max Mustermann): ";
$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["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["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["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";

10
view/event.tpl Normal file
View file

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

View file

@ -1,7 +1,7 @@
<h3>$e_text</h3>
<h3>$title</h3>
<p>
$e_desc
$desc
</p>
<form action="$post" method="post" >

View file

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

6
view/events-js.tpl Normal file
View file

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

24
view/events.tpl Normal file
View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

1374
view/theme/quattro-green/style.css Executable file
View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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