diff --git a/LICENSE b/LICENSE
index 15c3e825b6..01f1c19d5c 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2010-2012 the Friendica Project
+Copyright (c) 2010-2013 the Friendica Project
All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy
diff --git a/README.translate b/README.translate
new file mode 100644
index 0000000000..2deba4388d
--- /dev/null
+++ b/README.translate
@@ -0,0 +1,97 @@
+Friendica translations
+======================
+
+Translation Process
+-------------------
+
+The strings used in the UI of Friendica is translated at Transifex [1] and then
+included in the git repository at github. If you want to help with translation
+for any language, be it correcting terms or translating friendica to a
+currently not supported language, please register an account at transifex.com
+and contact the friendica translation team there.
+
+Translating friendica is simple. Just use the online tool at transifex. If you
+don't want to deal with git & co. that is fine, we check the status of the
+translations regularly and import them into the source tree at github so that
+others can use them.
+
+We do not include every translation from transifex in the source tree to avoid
+a scattered and disturbed overall experience. As an uneducated guess we have a
+lower limit of 50% translated strings before we include the language. This
+limit is judging only by the amount of translated strings under the assumption
+that the most prominent strings for the UI will be translated first by a
+translation team. If you feel your translation useable before this limit,
+please contact us and we will probably include your teams work in the source
+tree.
+
+If you want to get your work into the source tree yourself, feel free to do so
+and contact us with and question that arises. The process is simple and
+friendica ships with all the tools necessary.
+
+The location of the translated files in the source tree is
+ /view/LNG-CODE/
+where LNG-CODE is the language code used, e.g. de for German or fr for French.
+For the email templates (the *.tpl files) just place them into the directory
+and you are done. The translated strings come as a "message.po" file from
+transifex which needs to be translated into the PHP file friendica uses. To do
+so, place the file in the directory mentioned above and use the "po2php"
+utility from the util directory of your friendica installation.
+
+Assuming you want to convert the German localization which is placed in
+view/de/message.po you would do the following.
+
+ 1. Navigate at the command prompt to the base directory of your
+ friendica installation
+
+ 2. Execute the po2php script, which will place the translation
+ in the strings.php file that is used by friendica.
+
+ $> php util/po2php.php view/de/message.po
+
+ The output of the script will be placed at view/de/strings.php where
+ froemdoca os expecting it, so you can test your translation mmediately.
+
+ 3. Visit your friendica page to check if it still works in the language you
+ just translated. If not try to find the error, most likely PHP will give
+ you a hint in the log/warnings.about the error.
+
+ For debugging you can also try to "run" the file with PHP. This should
+ not give any output if the file is ok but might give a hint for
+ searching the bug in the file.
+
+ $> php view/de/strings.php
+
+ 4. commit the two files with a meaningful commit message to your git
+ repository, push it to your fork of the friendica repository at github and
+ issue a pull request for that commit.
+
+Utilities
+---------
+
+Additional to the po2php script there are some more utilities for translation
+in the "util" directory of the friendica source tree. If you only want to
+translate friendica into another language you wont need any of these tools most
+likely but it gives you an idea how the translation process of friendica
+works.
+
+For further information see the utils/README file.
+
+Known Problems
+--------------
+
+Friendica uses the language setting of the visitors browser to determain the
+language for the UI. Most of the time this works, but there are some known
+quirks.
+
+One is that some browsers, like Safari, do the setting to "de-de" but friendica
+only has a "de" localisation. A workaround would be to add a symbolic link
+from
+ $friendica/view/de-de
+pointing to
+ $friendica/view/de
+
+Links
+-----
+
+[1] https://www.transifex.com/projects/p/friendica/
+
diff --git a/boot.php b/boot.php
index fa968ce42e..d77e653f14 100644
--- a/boot.php
+++ b/boot.php
@@ -12,9 +12,9 @@ require_once('library/Mobile_Detect/Mobile_Detect.php');
require_once('include/features.php');
define ( 'FRIENDICA_PLATFORM', 'Friendica');
-define ( 'FRIENDICA_VERSION', '3.1.1589' );
+define ( 'FRIENDICA_VERSION', '3.1.1612' );
define ( 'DFRN_PROTOCOL_VERSION', '2.23' );
-define ( 'DB_UPDATE_VERSION', 1159 );
+define ( 'DB_UPDATE_VERSION', 1161 );
define ( 'EOL', " \r\n" );
define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' );
@@ -824,14 +824,26 @@ function is_ajax() {
return (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
}
+function check_db() {
-// Primarily involved with database upgrade, but also sets the
-// base url for use in cmdline programs which don't have
+ $build = get_config('system','build');
+ if(! x($build)) {
+ set_config('system','build',DB_UPDATE_VERSION);
+ $build = DB_UPDATE_VERSION;
+ }
+ if($build != DB_UPDATE_VERSION)
+ proc_run('php', 'include/dbupdate.php');
+
+}
+
+
+
+
+// Sets the base url for use in cmdline programs which don't have
// $_SERVER variables
-
-if(! function_exists('check_config')) {
- function check_config(&$a) {
+if(! function_exists('check_url')) {
+ function check_url(&$a) {
$url = get_config('system','url');
@@ -846,6 +858,15 @@ if(! function_exists('check_config')) {
if((! link_compare($url,$a->get_baseurl())) && (! preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/",$a->get_hostname)))
$url = set_config('system','url',$a->get_baseurl());
+ return;
+ }
+}
+
+
+// Automatic database updates
+
+if(! function_exists('update_db')) {
+ function update_db(&$a) {
$build = get_config('system','build');
if(! x($build))
@@ -1327,7 +1348,7 @@ if(! function_exists('profile_sidebar')) {
}
}
- if(get_my_url() && $profile['unkmail'])
+ if( get_my_url() && $profile['unkmail'] && ($profile['uid'] != local_user()) )
$wallmessage = t('Message');
else
$wallmessage = false;
@@ -1364,9 +1385,15 @@ if(! function_exists('profile_sidebar')) {
}
-
-
}
+ if ($profile['uid'] == local_user() && !feature_enabled(local_user(),'multi_profiles')) {
+ $profile['edit'] = array($a->get_baseurl(). '/profiles/'.$profile['id'], t('Edit profile'),"", t('Edit profile'));
+ $profile['menu'] = array(
+ 'chg_photo' => t('Change profile photo'),
+ 'cr_new' => null,
+ 'entries' => array(),
+ );
+ }
@@ -1419,6 +1446,7 @@ if(! function_exists('profile_sidebar')) {
if($a->theme['template_engine'] === 'internal')
$location = template_escape($location);
+
$tpl = get_markup_template('profile_vcard.tpl');
$o .= replace_macros($tpl, array(
'$profile' => $p,
@@ -1935,6 +1963,36 @@ function build_querystring($params, $name=null) {
return $ret;
}
+function explode_querystring($query) {
+ $arg_st = strpos($query, '?');
+ if($arg_st !== false) {
+ $base = substr($query, 0, $arg_st);
+ $arg_st += 1;
+ }
+ else {
+ $base = '';
+ $arg_st = 0;
+ }
+
+ $args = explode('&', substr($query, $arg_st));
+ foreach($args as $k=>$arg) {
+ if($arg === '')
+ unset($args[$k]);
+ }
+ $args = array_values($args);
+
+ if(!$base) {
+ $base = $args[0];
+ unset($args[0]);
+ $args = array_values($args);
+ }
+
+ return array(
+ 'base' => $base,
+ 'args' => $args,
+ );
+}
+
/**
* Returns the complete URL of the current page, e.g.: http(s)://something.com/network
*
diff --git a/database.sql b/database.sql
index da0d8c3aae..f2c558241a 100644
--- a/database.sql
+++ b/database.sql
@@ -592,6 +592,7 @@ CREATE TABLE IF NOT EXISTS `item` (
KEY `uid_unseen` (`uid`, `unseen`),
KEY `mention` (`mention`),
KEY `resource-id` (`resource-id`),
+ KEY `event_id` (`event-id`),
FULLTEXT KEY `title` (`title`),
FULLTEXT KEY `body` (`body`),
FULLTEXT KEY `allow_cid` (`allow_cid`),
diff --git a/doc/Chats.md b/doc/Chats.md
new file mode 100644
index 0000000000..ba5a64bd88
--- /dev/null
+++ b/doc/Chats.md
@@ -0,0 +1,52 @@
+Chats
+=====
+
+* [Home](help)
+
+There are two possibilities to use a chat on your friendica site
+
+* IRC Chat
+* Jappix
+
+##IRC-Chat Plugin
+
+After activating the plugin, you can find the chat at [yoursite.com/irc](../irc). Note: you can use this chat without any login at your site so that everyone could use it.
+
+If you follow the link, you will see the login page of the IR chat. Now choose a nickname and a chatroom. You can choose every name for the room, even something like #superchatwhosenameisonlyknownbyme. At last, solve the captchas and click the connect button.
+
+The following window shows some text while connecting. This text isn't importend for you, just wait for the next window. The first line shows your name and your current IP address. The right part of the window shows all user. The lower part of the window contains an input field.
+
+##Jappix Mini
+
+The Jappix Mini Plugin creates a chatbox for jabber- and XMPP-contacts. You should already have a jabber/XMPP-account before setting up the plugin. You can find more information at http://www.jabber.org/
+
+You can use several server to create an account:
+
+* [https://jappix.com](https://jappix.com)
+* [http://xmpp.net](http://xmpp.net)
+
+**1. Basics**
+
+At first you have to get the current version (via github):
+
+cd /var/www/virtual/YOURSPACE/html/addon; git pull
+
+or as a normal download via: https://github.com/friendica/friendica-addons/blob/master/jappixmini.tgz (click at „view raw“).
+
+Just unpack the file and rename the directory to „jappixmini“. Next, upload this directory and the .tgz-file into your addon directory of your friendica installation.
+
+Now you can activate the plugin at the admin pages. Now you can find an entry of jappix at the plugin sidebar (where you can also find twitter, statusnet and other ones). The following page shows the settings of this plugin.
+
+Now you can activate the BOSH proxy.
+Next, go to the setting page of your account.
+
+**2. Settings**
+
+Go to the account settings and choose the plugin page. Scroll down until you find the Jappix Mini addon settings
+
+At first you have to activate the addon.
+
+Now add your Jabber/XMPP name, the domain/server (without "http"; just "jappix.com"). For „Jabber BOSH Host“ you could use "https://bind.jappix.com/". You can find further information in the „Configuration Help“-section below this fields.
+At last you have enter your password (there are some more optional options, you can choose). Finish these steps with "send" to save the entries. Now, you should find the chatbox at the lower right corner of your browser window.
+
+If you want to add contacts manually, you can click "add contact".
\ No newline at end of file
diff --git a/doc/FAQ.md b/doc/FAQ.md
new file mode 100644
index 0000000000..73a9968cff
--- /dev/null
+++ b/doc/FAQ.md
@@ -0,0 +1,140 @@
+Frequently Asked Questions - FAQ
+==============
+
+* [Home](help)
+
+User
+
+* **[Why do I getting warnings about certificates?](help/FAQ#ssl)**
+* **[Is it possible to have different avatars per profile?](help/FAQ#avatars)**
+* **[What is the difference between blocked|ignored|archived|hidden contacts?](help/FAQ#contacts)**
+* **[What happens when an account is removed? Is it truly deleted?](help/FAQ#removed)**
+* **[Can I subscribe to a hashtag?](help/FAQ#hashtag)**
+* **[How to create a RSS feed of the stream?](help/FAQ#rss)**
+* **[Where I can find help?](help/FAQ#help)**
+
+Admins
+
+* **[Can I configure multiple domains with the same code instance?](help/FAQ#multiple)**
+* **[Where can I find the source code of friendica, addons and themes?](help/FAQ#sources)**
+
+User
+--------
+*****
+
+
+**Why do I getting warnings about certificates?**
+
+Sometimes you get a browser warning about a missing certificate. These warnings can have three reasons:
+
+1. the server you are connected to doesn't have SSL;
+
+2. the server has a self-signed certificate (not recommended)
+
+3. the certificate is expired.
+
+*(SSL (Secure Socket Layer) is a technology to encrypt data as it passes between two computers).*
+
+If you dont have a SSL cert yet, there are three ways to get one: buy one, get a free one (eg. via StartSSL) or create your own (not recommended). [You can find more information about setting up SSL and why it's a bad idea to use self-signed SSL here.](help/SSL)
+
+Be aware that a browser warning about security issues is something that can make new users feel insecure about the whole friendica project.
+Because of this, Friendica Red will only accept SSL certs signed by a recognized CA and doesn't connect to servers without these kind of SSL. Despite of the negative aspects of SSL, this is a necessary solution until there is an established alternative for this technique.
+
+Also you can have problems with the connection to diaspora because some pods require a SSL-certificated connection.
+
+If you are just using friendica for a specified group of people on a single server without a connection to the rest of the friendica network, there is no need to use SSL. If you exclusively use public posts, there is also no need for it.
+
+If you havn't set up a server yet, it's wise to compare the different provider and their SSL conditions. Some allow the usage of free certificates or give you the access to their certificate for free. Other ones only allow bought certificates from themselves or other providers.
+
+
+
+**Is it possible to have different avatars per profile?**
+
+Yes. On your Edit/Manage Profiles page, you will find a "change profile photo" link. Clicking this will take you to a page where you can upload a photograph and select which profile it will be associated with. To avoid privacy leakage, we only display the photograph associated with your default profile as the avatar in your posts.
+
+
+
+**What is the difference between blocked|ignored|archived|hidden contacts?**
+
+We prevent direct communication with blocked contacts. They are not included in delivery, and their own posts to you are not imported; however their conversations with your friends will still be visible in your stream. If you remove a contact completely, they can send you another friend request. Blocked contacts cannot do this. They cannot communicate with you directly, only through friends.
+
+Ignored contacts are included in delivery - they will receive your posts. However we do not import their posts to you. Like blocking, you will still see this person's comments to posts made by your friends.
+
+[A plugin called "blockem" can be installed to collapse/hide all posts from a particular person in your stream if you desire complete blocking of an individual, including his/her conversations with your other friends.]
+
+An archived contact means that communication is not possible and will not be attempted (perhaps the person moved to a new site and removed the old profile); however unlike blocking, existing posts this person made before being archived will be visible in your stream.
+
+A hidden contact will not be displayed in any "friend list" (except to you). However a hidden contact will appear normally in conversations and this may expose his/her hidden status to anybody who can see the conversation.
+
+
+
+**What happens when an account is removed? Is it truly deleted?**
+
+If you delete your account, we will immediately remove all your content on your server, and then issue requests to all your contacts to remove you. This will also remove you from the global directory. Doing this requires that your account and profile still be "partially" available for up to 24 hours in order to establish contact with all your friends. We can block it in several ways so that it appears empty and all profile information erased, but will then wait for 24 hours (or after all of your contacts have been notified) before we can physically remove it.
+
+
+
+**Can I follow a hashtag?**
+
+No. The act of 'following' a hashtags is an interesting technology, but presents a few issues.
+
+1.) Posts which have to be copied to all sites on the network that are "listening" to that tag, which increases the storage demands to the detriment of small sites, and making the use of shared hosting practically impossible, and
+
+2.) Making spam easy (tag spam is quite a serious issue on identi.ca for instance)
+
+but mostly
+
+3.) It creates a natural bias towards large sites which hold more tagged content - if your network uses tagging instead of other conversation federation mechanisms such as groups/forums.
+
+Instead, we offer other mechanisms for wide-area conversations while retaining a 'level playing ground' for both large and small sites, such as forums and community pages and shared tags.
+
+
+
+**How to create a RSS feed of the stream?**
+
+If you want to share your public page via rss you can use one of the following links:
+
+RSS feed of your posts
+
+ basic-url.com/**dfrn_poll/profilename
+
+ Example: Friendica Support
+
+ https://helpers.pyxis.uberspace.de/dfrn_poll/helpers
+
+RSS feed of the conversations at your site
+
+ basic-url.com/dfrn_poll/profilename/converse
+
+ Example: Friendica Support
+
+ https://helpers.pyxis.uberspace.de/dfrn_poll/helpers/converse
+
+
+
+**Where I can find help?**
+
+If you have problems with your Friendica page, you can ask the community at the [Friendica Support Group](https://helpers.pyxis.uberspace.de/profile/helpers). If you can't use your default profile you can either use a test account [test server](http://friendica.com/node/31) respectively an account at a public site [list](http://dir.friendica.com/siteinfo) or you can use the Librelist mailing list. If you want to use the mailing list, please just send a mail to friendica AT librelist DOT com.
+
+If you are using Friendica Red, you will also find help at this forum: [Friendica Red Development](https://myfriendica.net/profile/friendicared).
+
+If you are a theme developer, you will find help at this forum: [Friendica Theme Developers](https://friendica.eu/profile/ftdevs).
+
+Admin
+--------
+*****
+
+
+**Can I configure multiple domains with the same code instance?**
+
+You can do that. What you can't do is point two different domains at the same database. As long as .htconfig.php exists to keep it from trying to do an install, you can keep the real config in include/$hostname/.htconfig.php All of the cache and lock stuff can be configured per instance.
+
+
+
+**Where can I find the source code of friendica, addons and themes?**
+
+You can find the main respository [here](https://github.com/friendica/friendica). There you will always find the current stable version of friendica. The source files of Friendica Red are [here](https://github.com/friendica/red).
+
+Addons are listed at [this page](https://github.com/friendica/friendica-addons).
+
+If you are searching for new themes, you can find them at [Friendica-Themes.com](http://friendica-themes.com/)
\ No newline at end of file
diff --git a/doc/Home.md b/doc/Home.md
index 4c33c64aa5..b54ce35856 100644
--- a/doc/Home.md
+++ b/doc/Home.md
@@ -1,22 +1,26 @@
Friendica Documentation and Resources
=====================================
-
**Contents**
-* [Account Basics](help/Account-Basics)
-* [New User Quick Start](help/Quick-Start-guide)
-* [Creating posts](help/Text_editor)
-* [Comment, sort and delete posts](help/Text_comment)
-* [Profiles](help/Profiles)
-* [Connectors](help/Connectors)
-* [Making Friends](help/Making-Friends)
-* [Groups and Privacy](help/Groups-and-Privacy)
-* [Tags and Mentions](help/Tags-and-Mentions)
-* [Community Forums](help/Forums)
-* [Move Account](help/Move-Account)
-* [Remove Account](help/Remove-Account)
-* [Bugs and Issues](help/Bugs-and-Issues)
+* Generell functions - first steps
+ * [Account Basics](help/Account-Basics)
+ * [New User Quick Start](help/Quick-Start-guide)
+ * [Creating posts](help/Text_editor)
+ * [Comment, sort and delete posts](help/Text_comment)
+ * [Profiles](help/Profiles)
+* You and other user
+ * [Connectors](help/Connectors)
+ * [Making Friends](help/Making-Friends)
+ * [Groups and Privacy](help/Groups-and-Privacy)
+ * [Tags and Mentions](help/Tags-and-Mentions)
+ * [Community Forums](help/Forums)
+ * [Chats](help/Chats)
+* Further information
+ * [Move Account](help/Move-Account)
+ * [Remove Account](help/Remove-Account)
+ * [Bugs and Issues](help/Bugs-and-Issues)
+ * [Frequently asked questions (FAQ)](help/FAQ)
**Technical Documentation**
@@ -25,6 +29,7 @@ Friendica Documentation and Resources
* [Plugins](help/Plugins)
* [Installing Connectors (Facebook/Twitter/StatusNet)](help/Installing-Connectors)
* [Message Flow](help/Message-Flow)
+* [Using SSL with Friendica](help/SSL)
* [Developers](help/Developers)
diff --git a/doc/SSL.md b/doc/SSL.md
new file mode 100644
index 0000000000..0067206e5f
--- /dev/null
+++ b/doc/SSL.md
@@ -0,0 +1,168 @@
+Using SSL with Friendica
+=====================================
+
+* [Home](help)
+
+If you are running your own Friendica site, you may want to use SSL (https) to encrypt communication between yourself and your server (communication between servers is encrypted anyway).
+
+To do that on a domain of your own, you have to obtain a certificate from a trusted organization (so-called self-signed certificates that are popular among geeks don’t work very well with Friendica, because they can cause disturbances in other people's browsers).
+
+If you are reading this document before actually installing Friendica, you might want to consider a very simple option: Go for a shared hosting account without your own domain name. That way, your address will be something like yourname.yourprovidersname.com, which isn't very fancy compared to yourname.com. But it will still be your very own site, and you will usually be able to hitch a lift on your provider's SSL certificate. That means that you won't need to configure SSL at all - it will simply work out of the box when people type https instead of http.
+
+If that isn't your idea of doing things, read on...
+
+**Shared hosts**
+
+If you are using a shared host on a domain of your own, your provider may well offer to obtain and install the certificate for you. You will then only need to apply and pay for it – and everything will be set up. If that is the case for you, the rest of this document need not concern you at all. Just make sure the certificate is for the address that Friendica uses: e.g. myownfriendica.com or friendica.myserver.com.
+
+The above ought to be the most common scenario for Friendica sites, making the rest of this article superfluous for most people.
+
+**Obtaining a certificate yourself**
+
+Alternatively, a few shared hosting providers may ask you to obtain and upload the certificate yourself.
+
+The next section describes the process of acquiring a certificate from StartSSL. The good thing about StartSSL is that you can get an entry-level, but perfectly sufficient certificate for free. That’s not the case with most other certificate issuers - so we will be concentrating on StartSSL in this document If you want to use a certificate from a different source, you will have to follow the instructions given by that organization. We can't cover every possibility here.
+
+Installing your certificate - once you have obtained it - depends on your provider’s way of doing things. But for shared hosts, there will usually be an easy web tool for this.
+
+Note: Your certificate is usually restricted to one subdomain. When you apply for the certificate, make sure it’s for the domain and subdomain Friendica uses: e.g. myownfriendica.com or friendica.myserver.com.
+
+**Getting a free StartSSL certificate**
+
+StartSSL’s website attempts to guide you through the process of obtaining a free certificate, but some people end up frustrated. We really recommend working your way through the steps on the site very slowly and carefully. Don't take things for granted - read every word before proceeding and don't close the browser window until everything is working. That said, there are three main stumbling blocks that can confuse users:
+
+When you initially sign up with StartSSL, the first certificate you receive is simply installed in your browser (though you should also store it somewhere safe, so that you can reinstall it in any other browser at a later date, for instance when you need to renew something). This authentication certificate is only used for logging on to the StartSSL website – it has nothing to do with the certificate you will need for your server. As a first-timer with StartSSL, start here: https://www.startssl.com/?app=12 and choose the Express Lane option to get that browser authentication certificate. Then seamlessly continue to the process of acquiring the desired certificate for your server (the one you actually came for). You can change the website’s language if that makes things easier for you.
+
+When you are first prompted for a domain to certify, you need to enter your top-level domain – not the subdomain Friendica uses. In the next step, you will be able to specify that subdomain. So if you have friendica.yourname.com on your server, you first enter yourname.com – and specify the subdomain friendica later.
+
+Don’t quit too fast when you have received your personal web server certificate at the end of the procedure. Depending on your server software, you will also require one or two generic files for use with this free StartSSL certificate. These are sub.class1.server.ca.pem and ca.pem. If you have already overlooked this step, you can download those files here: http://www.startssl.com/?app=21 But once again, the very best way of doing things is not to quit the StartSSL site until you are completely done and your https certificate is up and working.
+
+**Virtual private and dedicated servers (using StartSSL free)**
+
+The rest of this document is slightly more complicated, but it’s only for people running Friendica on a virtual private or dedicated server. Everyone else can stop reading at this point.
+
+Follow the instructions here ( http://www.startssl.com/?app=20 ) to configure the web server you are using (e.g. Apache) for your certificate.
+
+To illustrate the necessary changes, we will now assume you are running Apache. In essence, you can simply create a second httpd.conf entry for Friendica.
+
+To do this, you copy the existing one and change the end of the first line to read :443> instead of :80>, then add the following lines to that entry, as also shown in StartSSL’s instructions:
+
+ SSLEngine on
+ SSLProtocol all -SSLv2
+ SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM
+
+ SSLCertificateFile /usr/local/apache/conf/ssl.crt
+ SSLCertificateKeyFile /usr/local/apache/conf/ssl.key
+ SSLCertificateChainFile /usr/local/apache/conf/sub.class1.server.ca.pem
+ SSLCACertificateFile /usr/local/apache/conf/ca.pem
+ SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
+ CustomLog /usr/local/apache/logs/ssl_request_log \
+ "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
+
+(Note that the directory /usr/local/apache/conf/ may not exist on your machine. For Debian, for instance, the directory might be /etc/apache2/ - in which you can create an ssl subdirectory if it doesn’t already exist. Then you have /etc/apache2/ssl/… instead of /usr/local/apache/conf/…)
+
+You thus end up with two entries for your Friendica site - one for simple http and one for https.
+
+Note to those who want to force SSL: Don't redirect to SSL in your Apache settings. Friendica's own admin panel has a special setting for SSL policy. Please use this facility instead.
+
+**Mixing certificates on Apache – StartSSL and others (self-signed)**
+
+Many people using a virtual private or dedicated server will be running more than Friendica on it. They will probably want to use SSL for other sites they run on the server, too. To achieve this, they may wish to employ more than one certificate with a single IP – for instance, a trusted one for Friendica and a self-signed certificate for personal stuff (possibly a wildcard certificate covering arbitrary subdomains).
+
+For this to work, Apache offers a NameVirtualHost directive. You can see how to use it in httpd.conf in the following pattern. Note that wildcards (*) in httpd.conf break the NameVirtualHost method – you can’t use them in this new configuration. In other words, no more *80> or *443>. And you really must specify the IP, too, even if you only have one. Also note that you will soon be needing two additional NameVirtualHost lines at the top of the file to cater for IPv6.
+
+ NameVirtualHost 12.123.456.1:443
+ NameVirtualHost 12.123.456.1:80
+
+
+ DocumentRoot /var/www/anywhere
+ Servername www.anywhere.net
+
+
+
+ DocumentRoot /var/www/anywhere
+ Servername www.anywhere.net
+ SSLEngine On
+
+
+
+
+
+
+ DocumentRoot /var/www/somewhere-else
+ Servername www.somewhere-else.net
+
+
+
+ DocumentRoot /var/www/somewhere-else
+ Servername www.somewhere-else.net
+ SSLEngine On
+
+
+
+
+
+Of course, you may optionally be using other places like the sites-available directory to configure Apache, in which case only some of this information need be in httpd.conf or ports.conf - specifically, the NameVirtualHost lines must be there. But if you're savvy about alternatives like that, you will probably be able to figure out the details yourself.
+
+Just restart Apache when you're done, whichever way you decide to do it.
+
+**StartSSL on Nginx**
+
+First, update to the latest Friendica code. Then follow the above instructions to get your free certificate. But instead of following the Apache installation instructions, do this:
+
+Upload your certificate. It doesn't matter where to, as long as Nginx can find it. Some people use /home/randomlettersandnumbers to keep it in out of paranoia, but you can put it anywhere, so we'll call it /foo/bar.
+
+You can remove the password if you like. This is probably bad practice, but if you don't, you'll have to enter the password every time you restart nginx. To remove it:
+
+ openssl rsa -in ssl.key-pass -out ssl.key
+
+Now, grab the helper certificate:
+
+ wget http://www.startssl.com/certs/sub.class1.server.ca.pem
+
+Now you need to merge the files:
+
+ cat ssl.crt sub.class1.server.ca.pem > ssl.crt
+
+In some configurations there is a bug, and this doesn't quite work properly. You may now need to edit ssl.crt, so:
+
+ nano /foo/bar/ssl.crt
+
+You'll see two certificates in the same file. Halfway down, you may see:
+
+ -----END CERTIFICATE----------BEGIN CERTIFICATE-----
+
+This is bad. You need to see:
+
+ -----END CERTIFICATE-----
+ -----BEGIN CERTIFICATE-----
+
+You can enter the carriage return manually if the bug is present on your system. Note there is a single carriage return for -----BEGIN CERTIFICATE----- to start on a new line. There is no empty line.
+
+Now you need to tell Nginx about the certs.
+
+In /etc/nginx/sites-available/foo.com.conf you need something like:
+
+ server {
+
+ listen 80;
+
+ listen 443 ssl;
+
+ listen [::]:80;
+
+ listen [::]:443 ipv6only=on ssl;
+
+ ssl_certificate /foo/bar/ssl.crt;
+
+ ssl_certificate_key /foo/bar/ssl.key;
+
+ ...
+
+Now, restart nginx:
+
+ /etc/init.d/nginx restart
+
+And that's it.
+
+For multiple domains, we have it easier than Apache users: Just repeat the above for each certificate, and keep it in it's own {server...} section.
\ No newline at end of file
diff --git a/doc/andfinally.md b/doc/andfinally.md
new file mode 100644
index 0000000000..c4e8cb9480
--- /dev/null
+++ b/doc/andfinally.md
@@ -0,0 +1,26 @@
+[[!meta title="And Finally..."]]
+
+And that brings the Quick Start to an end.
+
+Here are some more things to help get you started:
+
+**Groups**
+
+
+- New Here - a group for people new to Friendica
+
+- Friendica Support - problems? This is the place to ask.
+
+- Public Stream - a place to talk about anything to anyone.
+
+- Let's Talk a group for finding people and groups who share similar interests.
+
+- Local Friendica a page for local Friendica groups
+
+
+**Documentation**
+
+- Connecting to more networks
+- Help Index
+
+
diff --git a/doc/de/Chats.md b/doc/de/Chats.md
new file mode 100644
index 0000000000..e538285d6a
--- /dev/null
+++ b/doc/de/Chats.md
@@ -0,0 +1,53 @@
+Chats
+=====
+
+* [Zur Startseite der Hilfe](help)
+
+Du hast derzeit zwei Möglichkeiten, einen Chat auf deiner Friendica-Seite zu betreiben
+
+* IRC - Internet Relay Chat
+* Jappix
+
+##IRC Plugin
+
+Sobald das Plugin aktiviert ist, kannst du den Chat unter [deineSeite.de/irc](../irc) finden. Beachte aber, dass dieser Chat auch ohne Anmeldung auf deiner Seite zugänglich ist und somit auch Fremde diesen Chat mitnutzen können.
+
+Wenn du dem Link folgst, dann kommst du zum Anmeldefenster des IR-Chats. Wähle nun einen Spitznamen (Nickname) aus und wähle einen Raum aus, in dem du chatten willst. Hier kannst du jeden Namen eingeben. Es ist also auch #tollerChatdessenNamenurichkenne sein. Gib als nächstes nur noch die Captchas ein, um zu zeigen, dass es sich bei dir um einen Menschen handelt. Gehe nun auf "Connect".
+
+Im nächsten Fenster siehst du zunächst viel Text beim Verbindungsaufbau, der allerdings für dich nicht weiter von Bedeutung ist. Anschließend öffnet sich das Chat-Fenster. In den ersten Zeilen wird dir dein Name und deine aktuelle IP-Adresse angezeigt. Rechts im Fenster siehst du alle Teilnehmer des Chats. Unten hast du ein Eingabefeld, um Beiträge zu schreiben.
+
+##Jappix Mini
+
+Das Jappix Mini Plugin erlaubt das Erstellen einer Chatbox für Jabber/XMPP-Kontakte. Ein Jabber/XMPP Account sollte vor der Installation bereits vorhanden sein.
+Eine ausführliche Anleitung dazu und eine Kontrolle, ob man nicht sogar schon über seinen E-Mail Anbieter einen Jabber-Account hat, findet man unter http://einfachjabber.de.
+Einige Server zum Anmelden eines neuen Accounts:
+
+* [https://jappix.com](https://jappix.com)
+* [https://www.jabme.de](https://www.jabme.de)
+* [http://www.jabber.de](http://www.jabber.de)
+* oder die Auswahl von [http://xmpp.net](http://xmpp.net) nutzen.
+
+**1. Grundsätzliches**
+
+Als erstes muss die aktuellste Version heruntergeladen werden, per Git:
+
+cd /var/www/virtual/DEINUBERSPACE/html/addon; git pull
+
+oder als normaler Download von hier: https://github.com/friendica/friendica-addons/blob/master/jappixmini.tgz (auf „view raw“ klicken)
+
+Diese Datei wird entpackt, ggf. den entpackten Ordner in „jappixmini“ umbenennen und sowohl den kompletten entpackten Ordner als auch die .tgz Datei in den Addon Ordner deiner Friendica Installation hochladen.
+
+Nach dem Upload gehts in den Friendica Adminbereich, dort zu den Plugins. Das Jappixmini Addon aktivieren und anschließend über die Plugins Seitenleiste (dort wo auch die Twitter-, Impressums-, StatusNet-, usw Einstellungen gemacht werden) zu den Jappix Grundeinstellungen gehen.
+
+Hier den Haken zur Aktivierung des BOSH Proxys setzen.
+Weiter gehts in den Einstellungen deines Friendica Account.
+
+**2. Einstellungen**
+
+In deinen Einstellungen (Account Settings), gehe bitte zu den Plugin-Einstellungen. Etwas scrollen bis zu Jappix Mini addon settings
+
+Hier zuerst das Addon aktvieren.
+
+Trage nun deinen Jabber/XMPP Namen ein, ebenfalls die entsprechende Domain bzw. den Server (ohne http, also zb einfach so: jappix.com). Bei „Jabber BOSH Host“ kannst du erstmal “https://bind.jappix.com/ “ eintragen. Siehe dazu auch die „Configuration Help“ weiter unten. Danach noch dein Passwort und damit ist eigentlich schon fast alles geschafft. Die weiteren Einstellmöglichkeiten bleiben dir überlassen, sind also optional. Jetzt noch auf „senden“ klicken und fertig.
+
+Falls du manuell Kontakte hinzufügen möchtest, einfach den „Add Contact“ Knopf nutzen. Deine Chatbox sollte jetzt irgendwo unten rechts im Browserfenster „kleben“. Viel Spass beim Chatten!
diff --git a/doc/de/FAQ.md b/doc/de/FAQ.md
new file mode 100644
index 0000000000..28cd2cf8c2
--- /dev/null
+++ b/doc/de/FAQ.md
@@ -0,0 +1,137 @@
+Häufig gestellte Fragen - FAQ
+==============
+
+* [Zur Startseite der Hilfe](help)
+
+Nutzer
+
+* **[Warum erhalte ich Warnungen über fehlende Zertifikate?](help/FAQ#ssl)**
+* **[Ist es möglich, bei mehreren Profilen verschiedene Avatare (Nutzerbilder) zu haben?](help/FAQ#avatars)**
+* **[Was ist der Unterschied zwischen blockierten|ignorierten|archivierten|versteckten Kontakten?](help/FAQ#contacts)**
+* **[Was passiert, wenn ein Account gelöscht ist? Ist dieser richtig gelöscht?](help/FAQ#removed)**
+* **[Kann ich einem hashtag folgen?](help/FAQ#hashtag)**
+* **[Wie kann ich einen RSS-Feed meiner Netzwerkseite (Stream) erstellen?](help/FAQ#rss)**
+* **[Wo finde ich Hilfe?](help/FAQ#help)**
+
+Admins
+
+* **[Kann ich mehrere Domains mit den selben Dateien aufsetzen?](help/FAQ#multiple)**
+* **[Wo kann ich den Quellcode von Friendica, Addons und Themes finden?](help/FAQ#sources)**
+
+Nutzer
+--------
+*****
+
+
+**Warum erhalte ich Warnungen über fehlende Zertifikate?**
+
+Manchmal erhältst du eine Browser-Warnung über fehlende Zertifikate. Diese Warnungen können drei Gründe haben:
+
+1. der Server, mit dem du verbunden bist, nutzt kein SSL;
+
+2. der Server hat ein selbst-signiertes Zertifikat (nicht empfohlen)
+
+3. das Zertifikat ist nicht mehr gültig.
+
+*(SSL (Secure Socket Layer) ist eine Technologie, die Daten auf ihrem Weg zwischen zwei Computern verschlüsselt.)*
+
+Wenn du noch kein SSL-Zertifikat hast, dann gibt es drei Wege, eines zu erhalten: kauf dir eines, hole dir ein kostenloses (z.B. bei StartSSL) oder kreiere dein eigenes (nicht empfohlen). [Weitere Informationen über die Einrichtung von SSL und warum es schlecht ist, selbst-signierte Zertifikate zu nutzen, findest du hier.](help/SSL)
+
+Sei dir bewusst, dass Browser-Warnungen über Sicherheitslücken etwas sind, wodurch neue Nutzer schnell das Vertrauen in das gesamte Friendica-Projekt verlieren können. Aus diesem Grund wird Friendica Red nur SSL-Zertifikate eines anerkannten Anbieters (CA, certificate authority) akzeptieren und nicht zu Seiten verbinden, die kein SSL nutzen. Unabhängig von den negativen Aspekten von SSL handelt es sich hierbei um eine notwendige Lösung, solange keine etablierte Alternative existiert.
+
+Abgesehen davon kann es ohne SSL auch Probleme mit der Verbindung zu Diaspora geben, da einige Diaspora-Pods eine zertifizierte Verbindung benötigen.
+
+Wenn du Friendica nur für eine bestimmte Gruppe von Leuten auf einem einzelnen Server nutzt, bei dem keine Verbindung zum restlichen Netzwerk besteht, dann benötigst du kein SSL. Ebenso benötigst du SSL nicht, wenn du ausschließlich öffentliche Beiträge auf deiner Seite veröffentlichst bzw. empfängst.
+
+Wenn du zum jetzigen Zeitpunkt noch keinen Server aufgesetzt hast, ist es sinnvoll, die verschiedenen Anbieter in Bezug auf SSL zu vergleichen. Einige erlauben die Nutzung von freien Zertifikaten oder lassen dich ihre eigenen Zertifikate mitnutzen. Andere erlauben nur kostenpflichtige Zertifikate als eigenes Angebot bzw. von anderen Anbietern.
+
+
+
+**Ist es möglich, bei mehreren Profilen verschiedene Avatare (Nutzerbilder) zu haben?**
+
+Ja. Auf deiner ["Profile verwalten/editieren"-Seite](../profiles) wählst du zunächst das gewünschte Profil aus. Anschließend siehst du eine Seite mit allen Infos zu diesem Profil. Klicke nun oben auf den Link "Profilbild ändern" und lade im nächsten Fenster ein Bild von deinem PC hoch. Um deine privaten Daten zu schützen, wird in Beiträgen nur das Bild aus deinem öffentlichen Profil angezeigt.
+
+
+
+**Was ist der Unterschied zwischen blockierten|ignorierten|archivierten|versteckten Kontakten?**
+
+Wir verhindern direkte Kommunikation mit blockierten Kontakten. Sie gehören nicht zu den Empfängern beim Versand von Beiträgen und deren Beiträge werden auch nicht importiert. Trotzdem werden deren Unterhaltungen mit deinen Freunden trotzdem in deinem Stream sichtbar sein. Wenn du einen Kontakt komplett löschst, können sie dir eine neue Freundschaftsanfrage schicken. Blockierte Kontakte können das nicht machen. Sie können nicht mit dir direkt kommunizieren, nur über Freunde.
+
+Ignorierte Kontakte können weiterhin Beiträge von dir erhalten. Deren Beiträge werden allerdings nicht importiert. Wie bei blockierten Beiträgen siehst du auch hier weiterhin die Kommentare dieser Person zu anderen Beiträgen deiner Freunde.
+
+[Ein Plugin namens "blockem" kann installiert werden, um alle Beiträge einer bestimmten Person in deinem Stream zu verstecken bzw. zu verkürzen. Dabei werden auch Kommentare dieser Person in Beiträgen deiner Freunde blockiert.]
+
+Ein archivierter Kontakt bedeutet, dass Kommunikation nicht möglich ist und auch nicht versucht wird (das ist z.B. sinnvoll, wenn eine Person zu einer neuen Seite gewechselt ist und das alte Profil gelöscht hat). Anders als beim Blockieren werden existierende Beiträge, die vor der Archivierung erstellt wurden, weiterhin angezeigt.
+
+Ein versteckter Kontakt wird in keiner "Freundeliste" erscheinen (außer für dich). Trotzdem wird ein versteckter Kontakt trotzdem normal in Unterhaltungen angezeigt, was jedoch für andere Kontakte ein Hinweis sein kann, dass diese Person als versteckter Kontakt in deiner Liste ist.
+
+
+
+**Was passiert, wenn ein Account gelöscht ist? Ist dieser richtig gelöscht?**
+
+Wenn du deinen Account löschst, wird sofort der gesamte Inhalt auf deinem Server gelöscht und ein Löschbefehl an alle deine Kontakte verschickt. Dadurch wirst du ebenfalls aus dem globalen Verzeichnis gelöscht. Dieses Vorgehen setzt voraus, dass dein Profil für 24 Stunden weiterhin "teilweise" verfügbar sein wird, um eine Verbindung zu allen deinen Kontakten ermöglicht. Wir können also dein Profil blockieren und es so erscheinen lassen, als wären alle Daten sofort gelöscht, allerdings warten wir 24 Stunden (bzw. bis alle deine Kontakte informiert wurden), bevor wir die Daten auch physikalisch löschen.
+
+
+
+**Kann ich einem hashtag folgen?**
+
+Nein. Die Möglichkeit, einem hashtag zu folgen, ist eine interessante Technik, führt aber zu einigen Schwierigkeiten.
+
+1.) Alle Beiträge, die diesen tag nutzen, müssten zu allen Seiten im Netzwerk kopiert werden. Das erhöht den Speicherbedarf und beeinträchtigt kleine Seiten. Die Nutzung von geteilten Hosting-Angeboten (Shared Hosting) wäre praktisch unmöglich.
+
+2.) Die Verbreitung von Spam wäre vereinfacht (tag-Spam ist z.B. bei identi.ca ein schwerwiegendes Problem)
+
+3.) Der wichtigste Grund der gegen diese Technik spricht ist, dass sie eine natürliche Ausrichtung auf größere Seiten mit mehr getaggten Inhalten zur Folge hat. Dies kann z.B. aufkommen, wenn dein Netzwerk tags anstelle von anderen Kommunikationsmitteln wie Gruppen oder Foren nutzt.
+
+Stattdessen bieten wir andere Mechanismen, um globale Unterhaltungen zu erreichen, dabei aber eine angemesse Basis für kleine und große Seiten zu bieten. Hierzu gehören Foren, Gruppen und geteilte tags.
+
+
+
+**Wie kann ich einen RSS-Feed meiner Netzwerkseite (Stream) erstellen?**
+
+Wenn du die Beiträge deines Accounts mit RSS teilen willst, dann kannst du einen der folgenden Links nutzen:
+
+RSS-Feed deiner Beiträge
+
+ deineSeite.de/**dfrn_poll/profilname
+
+ Beispiel: Friendica Support
+
+ https://helpers.pyxis.uberspace.de/dfrn_poll/helpers
+
+RSS-Feed aller Unterhaltungen auf deiner Seite
+
+ deineSeite.de/dfrn_poll/profilname/converse
+
+ Beispiel: Friendica Support
+
+ https://helpers.pyxis.uberspace.de/dfrn_poll/helpers/converse
+
+
+
+**Wo finde ich Hilfe?**
+
+Wenn du Probleme mit deiner Friendica-Seite hast, dann kannst du die Community in der [Friendica-Support-Gruppe](https://helpers.pyxis.uberspace.de/profile/helpers) oder im [deutschen Friendica-Support-Forum](http://toktan.org/profile/wiki) fragen oder dir das [deutsche Wiki](http://wiki.toktan.org/doku.php) anschauen. Wenn du deinen Account nicht nutzen kannst, kannst du entweder einen [Testaccount](http://friendica.com/node/31) bzw. einen Account auf einer öffentlichen Seite ([Liste](http://dir.friendica.com/siteinfo)) nutzen, oder du wählst die Librelist-mailing-Liste. Wenn du die Mailing-Liste nutzen willst, schicke eine Mail an friendica AT librelist PUNKT com.
+
+Wenn du Friendica Red nutzt, findest du außerdem in diesem Forum Hilfe: [Friendica Red Development](https://myfriendica.net/profile/friendicared).
+
+Wenn du ein Theme-Entwickler bist, wirst du in diesem Forum Hilfe finden: [Friendica Theme Developers](https://friendica.eu/profile/ftdevs).
+
+Admin
+--------
+*****
+
+
+**Kann ich mehrere Domains mit den selben Dateien aufsetzen?**
+
+Ja, das ist möglich. Es ist allerdings nicht möglich, eine Datenbank durch zwei Domains zu nutzen. Solange du deine .htconfig.php allerdings so einrichtest, dass das System nicht versucht, eine Installation durchzuführen, kannst du die richtige Config-Datei in include/$hostname/.htconfig.php hinterlegen. Alle Cache-Aspekte und der Zugriffsschutz können pro Instanz konfiguriert werden.
+
+
+
+**Wo kann ich den Quellcode von Friendica, Addons und Themes finden?**
+
+Du kannst den Friendica-Quellcode [hier](https://github.com/friendica/friendica) finden. Dort findest du immer die aktuellste stabile Version von Friendica. Der Quellcode von Friendica Red ist [hier](https://github.com/friendica/red) zu finden.
+
+Addons findest du auf [dieser Seite](https://github.com/friendica/friendica-addons).
+
+Wenn du neue Themen suchst, findest du sie auf [Friendica-Themes.com](http://friendica-themes.com/)
\ No newline at end of file
diff --git a/doc/de/Home.md b/doc/de/Home.md
index 9e92f2d834..b2d8c52e4f 100644
--- a/doc/de/Home.md
+++ b/doc/de/Home.md
@@ -3,20 +3,25 @@ Friendica - Dokumentation und Ressourcen
**Inhalte**
-* [Account - Basics](help/Account-Basics)
-* [Schnellstart für neue Benutzer](help/Quick-Start-guide)
-* [Beiträge erstellen](help/Text_editor)
-* [Beiträge kommentieren, einordnen und löschen](help/Text_comment)
-* [Profile](help/Profiles)
-* [Konnektoren (Connectors)](help/Connectors)
-* [Freunde finden](help/Making-Friends)
-* [Gruppen und Privatsphäre](help/Groups-and-Privacy)
-* [Tags und Erwähnungen](help/Tags-and-Mentions)
-* [Community-Foren](help/Forums)
-* [Account umziehen](help/Move-Account)
-* [Account löschen](help/Remove-Account)
-* [Bugs und Probleme](help/Bugs-and-Issues)
-
+* Allgemeine Funktionen - Erste Schritte
+ * [Account - Basics](help/Account-Basics)
+ * [Schnellstart für neue Benutzer](help/Quick-Start-guide)
+ * [Beiträge erstellen](help/Text_editor)
+ * [Beiträge kommentieren, einordnen und löschen](help/Text_comment)
+ * [Profile](help/Profiles)
+* Du und andere Nutzer
+ * [Konnektoren (Connectors)](help/Connectors)
+ * [Freunde finden](help/Making-Friends)
+ * [Gruppen und Privatsphäre](help/Groups-and-Privacy)
+ * [Tags und Erwähnungen](help/Tags-and-Mentions)
+ * [Community-Foren](help/Forums)
+ * [Chats](help/Chats)
+* Weiterführende Informationen
+ * [Account umziehen](help/Move-Account)
+ * [Account löschen](help/Remove-Account)
+ * [Bugs und Probleme](help/Bugs-and-Issues)
+ * [Häufig gestellte Fragen (FAQ)](help/FAQ)
+
**Technische Dokumentation**
* [Installation](help/Install)
@@ -24,6 +29,7 @@ Friendica - Dokumentation und Ressourcen
* [Plugins](help/Plugins)
* [Konnektoren (Connectors) installieren (Facebook/Twitter/StatusNet)](help/Installing-Connectors)
* [Nachrichtenfluss](help/Message-Flow)
+* [Betreibe deine Seite mit einem SSL-Zertifikat](help/SSL)
* [Entwickler](help/Developers)
diff --git a/doc/de/Quick-Start-guide.md b/doc/de/Quick-Start-guide.md
index 5006d7f9f3..eb0fd0539b 100644
--- a/doc/de/Quick-Start-guide.md
+++ b/doc/de/Quick-Start-guide.md
@@ -11,7 +11,7 @@ Hier sieht es ein wenig wie auf deiner Facebook-Seite aus. Hier findest du alle
Wenn du deinen Beitrag ("Post") geschrieben hast, kannst du auf das "Schloss"-Symbol klicken und festlegen, wer deinen Beitrag sehen kann. Wenn du dieses Symbol nicht anklickst, ist dein Beitrag öffentlich. Das bedeutet, dass jeder, der dein Profil ansieht, der auf dem "Community"-Tab deines Servers oder auf dem "Netzwerk"-Tab ("Beiträge deiner Kontakte") eines befreundeten Kontakts ist, den Beitrag sehen kann.
-Probiere es doch einfach mal aus. Wenn du fertg bist, schauen wir uns den "Netzwerk"-Tab an.
+Probiere es doch einfach mal aus. Wenn du fertig bist, schauen wir uns den "Netzwerk"-Tab an.
diff --git a/doc/de/SSL.md b/doc/de/SSL.md
new file mode 100644
index 0000000000..ecb10d9d3e
--- /dev/null
+++ b/doc/de/SSL.md
@@ -0,0 +1,169 @@
+Friendica mit SSL nutzen
+=====================================
+
+* [Zur Startseite der Hilfe](help)
+
+Wenn du deine eigene Friendica-Seite betreibst, willst du vielleicht SSL (https) nutzen, um die Kommunikation zwischen dir und deinem Server zu verschlüsseln (die Kommunikation zwischen den Servern ist bereits verschlüsselt).
+
+Wenn du das auf deiner eigenen Domain machen willst, musst du ein Zertifikat von einer anerkannten Organisation beschaffen (sogenannte selbst-signierte Zertifikate, die unter Computerfreaks beliebt sind, arbeiten nicht sehr gut mit Friendica, weil sie Warnungen im Browser hervorrufen können).
+
+Wenn du dieses Dokument liest, bevor du Friendica installierst, kannst du eine sehr einfache Option in Betracht ziehen: suche dir ein geteiltes Hosting-Angebot (shared hosting) ohne eigene Domain. Dadurch wirst du eine Adresse in der Form deinName.deinAnbietername.de erhalten, was nicht so schön wie deinName.de ist. Aber es wird trotzdem deine ganz persönliche Seite sein und du wirst unter Umständen die Möglichkeit haben, das SSL-Zertifikat deines Anbieters mitzubenutzen. Das bedeutet, dass du SSL überhaupt nicht konfigurieren musst - es wird einfach sofort funktionieren, wenn die Besucher deiner Seite https statt http eingeben.
+
+Wenn dir diese Lösung nicht gefällt, lies weiter...
+
+**Geteilte Hosting-Angebote/Shared hosts**
+
+Wenn du ein geteiltes Hosting-Angebot mit einer eigenen Domain nutzt, dann wird dir dein Anbieter ggf. anbieten, dir das Zertifikat zu besorgen und zu installieren. Du musst es nur beantragen und bezahlen und alles wird eingerichtet. Wenn das die Lösung für dich ist, musst du das weitere Dokument nicht lesen. Gehe nur sicher, dass das Zertifikat auch für die Domain gilt, die du für Friendica nutzt: z.B. meinfriendica.de oder friendica.meinserver.de.
+
+Das Vorangehende wird die häufigste Art sein, eine Friendica-Seite zu betreiben, so dass der Rest des Artikels für die meisten Leute nicht von Bedeutung ist.
+
+**Beschaffe dir das Zertifikat selbst**
+
+Alternativ kannst du dir auch selbst ein Zertifikat besorgen und hochladen, falls dein Anbieter das unterstützt.
+
+Der nächste Abschnitt beschreibt den Ablauf, um ein Zertifikat von StartSSL zu erhalten. Das Gute an StartSSL ist, dass du kostenlos ein einfaches, aber perfekt ausreichendes Zertifikat erhältst. Das ist bei vielen anderen Anbietern nicht so, weshalb wir uns in diesem Dokument auf StartSSL konzentrieren werden. Wenn du ein Zertifikat eines anderen Anbieters nutzen willst, musst du die Vorgaben dieser Organisation befolgen. Wir können hier nicht jede Möglichkeit abdecken.
+
+Die Installation deines erhaltenen Zertifikats hängt von den Vorgaben deines Anbieters ab. Aber generell nutzen solche Anbieter ein einfaches Web-Tool, um die Einrichtung zu unterstützen.
+
+Beachte: dein Zertifikat gilt gewöhnlich nur für eine Subdomain. Wenn du dein Zertifikat beantragst, sorge dafür, dass es für die Domain und die Subdomain gilt, die du für Friendica nutzt: z.B. meinfriendica.de oder friendica.meinserver.de.
+
+**Erhalte ein kostenloses StartSSL-Zertifikat**
+
+Die Webseite von StartSSL führt dich durch den Erstellungsprozess, aber manche Leute haben hier trotzdem Probleme. Wir empfehlen dir ausdrücklich, die Installationsanleitung Schritt für Schritt langsam und sorgfältig zu befolgen. Lese dir jedes Wort durch und schließe deinen Browser erst, wenn alles läuft. Es heißt, dass es drei Schritte gibt, die den Nutzer verwirren können:
+
+Wenn du dich erstmals bei StartSSL anmeldest, erhältst du ein erstes Zertifikat, dass sich einfach in deinem Browser installiert. Dieses Zertifikat solltest du zur Sicherheit irgendwo speichern, so dass du es für einen neuen Browser neu installieren kannst, wenn du z.B. etwas erneuern musst. Dieses Authentifizierungszertifikat wird nur für das Login benötigt und hat nichts mit dem Zertifikat zu tun, dass du später für deinen Server benötigst. Als Anfänger mit StartSSL kannst du [hier starten](https://www.startssl.com/?lang=de) und die "Express Lane" nutzen, um dein Browser-Zertifikiat zu erhalten. Im nächsten Schritt kannst du die Einrichtung deines Zertifikats fortsetzen.
+
+Wenn du zuerst nach einer Domain für dein Zertifikat gefragt wirst, musst du die Top-Level-Domain angeben, nicht die Subdomain, die Friendica nutzt. Im nächsten Schritt kannst du dann die Subdomain spezifizieren. Wenn du also friendica.deinName.de auf deinem Server hast, musst du zuerst deinName.de angeben.
+
+Höre nicht zu früh auf, wenn du am Ende der Einrichtung dein persönliches Server-Zertifikat erhalten hast. Abhängig von deiner Server-Software benötigst du ein oder zwei generische Dateien, die du mit deinem kostenlosen StartSSL-Zertifikat nutzen musst. Diese Dateien sind sub.class1.server.ca.pem und ca.pem. Wenn du diesen Schritt bereits übersprungen hast, kannst du die Dateien hier finden: [http://www.startssl.com/?app=21](http://www.startssl.com/?app=21). Aber am besten funktioniert es, wenn du StartSSL nicht beendest, bevor du den Vorgang komplett abgeschlossen hast und dein https-Zertifikat hochgeladen ist und funktioniert.
+
+**Virtuelle private und dedizierte Server (mit StartSSL free)**
+
+Der Rest dieses Dokuments ist etwas komplizierter, aber es ist auch nur für Personen, die Friendica auf einem virtuellen oder dedizierten Server nutzen. Jeder andere kann an dieser Stelle mit dem Lesen aufhören.
+
+Folge den weiteren Anleitungen [hier](http://www.startssl.com/?app=20), um den Webserver, den du benutzt (z.B. Apache), für dein Zertifikat einzurichten.
+
+Um die nötigen Schritte zu verdeutlichen, setzen wir nun voraus, dass Apache aktiv ist. Im Wesentlichen kannst du einfach einen zweiten httpd.conf-Eintrag für Friendica erstellen.
+
+Um das zu machen, kopiere den existierenden Eintrag und ändere das Ende der ersten Zeile auf "lesen" :443> anstelle von :80> und trage dann die folgenden Zeilen ein, wie du es auch in der Anleitung von StartSSL finden kannst:
+
+ SSLEngine on
+ SSLProtocol all -SSLv2
+ SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM
+
+ SSLCertificateFile /usr/local/apache/conf/ssl.crt
+ SSLCertificateKeyFile /usr/local/apache/conf/ssl.key
+ SSLCertificateChainFile /usr/local/apache/conf/sub.class1.server.ca.pem
+ SSLCACertificateFile /usr/local/apache/conf/ca.pem
+ SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
+ CustomLog /usr/local/apache/logs/ssl_request_log \
+ "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
+
+(Beachte, dass das Verzeichnis /usr/local/apache/conf/ möglicherweise nicht in deinem System existiert. In Debian ist der Pfad bspw. /etc/apache2/, in dem du ein SSL-Unterverzeichnis erstellen kannst, wenn dieses noch nicht vorhanden ist. Dann hast du /etc/apache2/ssl/… statt /usr/local/apache/conf/…)
+
+Du solltest nun zwei Einträgen für deine Friendica-Seite haben - einen für einfaches http und eines für https.
+
+Ein Hinweis für diejenigen, die SSL steuern wollen: setze keine Weiterleitung deines SSL in deine Apache-Einstellung. Friendicas Admin-Panel hat eine spezielle Einstellung für die SSL-Methode. Bitte nutze diese Einstellungen.
+
+**Vermische Zertifikate in Apache – StartSSL und andere (selbst-signierte)**
+
+Viele Leute nutzen einen virtuellen privaten oder einen dedizierten Server, um mehr als Friendica darauf laufen zu lassen. Sie wollen möglicherweise SSL auch für andere Seiten nutzen, die auf dem Server liegen. Um das zu erreichen, wollen sie mehrere Zertifikate für eine IP nutzen, z.B. ein Zertifikat eines anerkannten Anbieters für Friendica und ein selbst-signiertes für eine persönliche Inhalte (möglw. ein Wildcard-Zertifikat für mehrere Subdomains).
+
+Um das zum Laufen zu bringen, bietet Apache eine NameVirtualHost-Direktive. Du findest Informationen zur Nutzung in httpd.conf in den folgenden Ausschnitten. Beachte, dass Wildcards (*) in httpd.conf dazu führen, dass die NameVirtualHost-Methode nicht funktioniert; du kannst diese in dieser neuen Konfiguration nicht nutzen. Das bedeutet, dass *80> oder *443> nicht funktionieren. Und du musst unbedingt die IP definieren, selbst wenn du nur eine hast. Beachte außerdem, dass du bald zwei Zeilen zu Beginn der Datei hinzufügen musst, um NameVirtualHost für IPv6 vorzubereiten.
+
+ NameVirtualHost 12.123.456.1:443
+ NameVirtualHost 12.123.456.1:80
+
+
+ DocumentRoot /var/www/anywhere
+ Servername www.anywhere.net
+
+
+
+ DocumentRoot /var/www/anywhere
+ Servername www.anywhere.net
+ SSLEngine On
+
+
+
+
+
+
+ DocumentRoot /var/www/somewhere-else
+ Servername www.somewhere-else.net
+
+
+
+ DocumentRoot /var/www/somewhere-else
+ Servername www.somewhere-else.net
+ SSLEngine On
+
+
+
+
+
+Natürlich kannst du auch andere Verzeichnisse auf deinem Server nutzen, um Apache zu konfigurieren. In diesem Fall müssen nur einige Zeilen in httpd.conf oder ports.conf angepasst werden - vor allem die NameVirtualHost-Zeilen. Aber wenn du sicher im Umgang mit solchen Alternativen bist, wirst du sicherlich die nötigen Anpassungen herausfinden.
+
+Starte dein Apache abschließend neu.
+
+**StartSSL auf Nginx**
+
+Führe zunächst ein Update auf den neuesten Friendica-Code durch. Folge dann der Anleitung oben, um dein kostenloses Zertifikat zu erhalten. Aber statt der Apache-Installationsanleitung zu folgen, mache das Folgende:
+
+Lade dein Zertifikat hoch. Es ist nicht wichtig, wohin du es lädst, solange Nginx es finden kann. Einige Leute nutzen /home/verschiedeneNummernundBuchstaben, du kannst aber auch z.B. etwas wie /foo/bar nutzen.
+
+Du kannst das Passwort entfernen, wenn du willst. Es ist zwar möglicherweise nicht die beste Wahl, aber wenn du es nicht machst, wirst du das Passwort immer wieder eingeben müssen, wenn du Ngingx neustartest. Um es zu entfernen, gebe Folgendes ein:
+
+ openssl rsa -in ssl.key-pass -out ssl.key
+
+Nun hole dir das Hifs-Zertifikat:
+
+ wget http://www.startssl.com/certs/sub.class1.server.ca.pem
+
+Nun vereinige die Dateien:
+
+ cat ssl.crt sub.class1.server.ca.pem > ssl.crt
+
+In manchen Konfigurationen ist ein Bug enthalten, weshalb diese Schritte nicht ordentlich arbeiten. Du musst daher ggf. ssl.crt bearbeiten:
+
+ nano /foo/bar/ssl.crt
+
+Du wirst zwei Zertifikate in der gleichen Date sehen. In der Mitte findest du:
+
+ -----END CERTIFICATE----------BEGIN CERTIFICATE-----
+
+Das ist schlecht. Du brauchst die folgenden Einträge:
+
+ -----END CERTIFICATE-----
+ -----BEGIN CERTIFICATE-----
+
+
+Du kannst den Zeilenumbruch manuell eingeben, falls dein System vom Bug betroffen ist. Beachte, dass nach -----BEGIN CERTIFICATE----- nur ein Zeilenumbruch ist. Es gibt keine leere Zeile zwischen beiden Einträgen.
+
+Nun musst du Nginx über die Zertifikate informieren.
+
+In /etc/nginx/sites-available/foo.com.conf benötigst du etwas wie:
+
+ server {
+
+ listen 80;
+
+ listen 443 ssl;
+
+ listen [::]:80;
+
+ listen [::]:443 ipv6only=on ssl;
+
+ ssl_certificate /foo/bar/ssl.crt;
+
+ ssl_certificate_key /foo/bar/ssl.key;
+
+ ...
+
+Nun starte Nginx neu:
+
+ /etc/init.d/nginx restart
+
+Und das war es schon.
+
+Für multiple Domains ist es mit Nginx einfacher als mit Apache. Du musst du oben genannten Schritte nur für jedes Zertifikat wiederholen und die spezifischen Informationen im eigenen {server...}-Bereich spezifizieren.
\ No newline at end of file
diff --git a/doc/de/andfinally.md b/doc/de/andfinally.md
new file mode 100644
index 0000000000..06a1878ba9
--- /dev/null
+++ b/doc/de/andfinally.md
@@ -0,0 +1,27 @@
+... und zuletzt
+===============
+
+Und damit sind wir auch schon am Ende der Schnellstartanleitung.
+
+Hier sind noch einige weitere Dinge, die dir den Start vereinfachen können.
+
+**Gruppen**
+
+
+- Neu hier? - eine Gruppe für Leute, die neu bei Friendica sind
+
+- Friendica Support - Probleme? Dann ist das der Platz, um zu fragen!
+
+- Öffentlicher Stream - ein Platz, um über alles mit jedem zu reden.
+
+- Let's Talk eine Gruppe, um Leute und Gruppen mit gleichen Interessen zu finden
+
+- Local Friendica eine Seite für lokale Friendica-Gruppen
+
+
+**Dokumentation**
+
+- Zu weiteren Netzwerken verbinden
+- Zur Startseite der Hilfe
+
+
diff --git a/doc/de/groupsandpages.md b/doc/de/groupsandpages.md
new file mode 100644
index 0000000000..0b5f1fcedd
--- /dev/null
+++ b/doc/de/groupsandpages.md
@@ -0,0 +1,16 @@
+Gruppen und Seiten
+==========
+
+* [Zur Startseite der Hilfe](help)
+
+Hier siehst du das globale Verzeichnis. Wenn du dich mal verirrt hast, kannst du diesen Link klicken und wieder hierher kommen.
+
+Auf dieser Seite findest du eine Zusammenstellung von Gruppen, Foren und bekannten Seiten. Gruppen sind keine realen Personen. Sich mit diesen zu verbinden ist, als wenn man jemanden auf Facebook "liked" ("gefällt mir") oder wenn man sich in einem Forum anmeldet. Habe keine Sorge, falls du dich unbehaglich fühlst, wenn du dich einer neuen Person vorstellen sollst, da es sich nicht um Personen handelt.
+
+Wenn du dich mit einer Gruppe verbindest, erscheinen alle Nachrichten der Gruppe in deinem "Netzwerk"-Tab. Du kannst diese Beiträge kommentieren oder selbst in der Gruppe schreiben, ohne eine der Gruppenmitglieder persönlich hinzuzufügen. Das ist ein großartiger Weg, dynamisch neue Freunde zu gewinnen. Du findest Personen, die du magst, anstatt Fremde hinzuzufügen. Suche dir einfach eine Gruppe und füge sie so hinzu, wie du auch normale Freunde hinzufügst. Es gibt eine Menge Gruppen und möglicherweise findest du nicht wieder zu dieser Seite zurück. In diesem Fall nutze einfach den Link oben auf dieser Seite.
+
+Wenn du einige Gruppen hinzugefügt hast, gehe weiter zum nächsten Schritt.
+
+
+
+
diff --git a/doc/de/guide.md b/doc/de/guide.md
new file mode 100644
index 0000000000..a5ce54a1dc
--- /dev/null
+++ b/doc/de/guide.md
@@ -0,0 +1,17 @@
+Erste Schritte...
+==========
+
+* [Zur Startseite der Hilfe](help)
+
+Das Erste zum Anfang: geh sicher, dass du schon eingeloggt bist. Wenn du noch nicht eingeloggt bist, kannst du das in dem Fenster unten machen.
+
+Sobald du eingeloggt bist (oder wenn du bereits eingeloggt bist), kannst du unten nun auf deine Profilseite schauen.
+
+Hier sieht es ein wenig wie auf deiner Facebook-Seite aus. Hier findest du alle deine Statusmeldungen und Nachrichten deiner Freunde, die direkt auf deine Seite ("Wall") geschrieben haben. Um deinen Status einzutragen, klicke einfach auf die Box oben, in der "Teilen" steht. Wenn du das machst, vergrößert sich die Box. Nun kannst du einige Formatierungsoptionen wie Fett, kursiv, unterstrichen auswählen und ebenfalls Bilder und Links hinzufügen. Unten findest du in diesem Feld weitere Links, mit denen du Bilder und Dateien von deinem Computer hochladen, Webseiten mit einem Kurztext teilen und Video- und Audiodateien aus dem Internet einfügen kannst. Außerdem kannst du hier eintragen, wo du gerade bist.
+
+Wenn du deinen Beitrag ("Post") geschrieben hast, kannst du auf das "Schloss"-Symbol klicken und festlegen, wer deinen Beitrag sehen kann. Wenn du dieses Symbol nicht anklickst, ist dein Beitrag öffentlich. Das bedeutet, dass jeder, der dein Profil ansieht, der auf dem "Community"-Tab deines Servers oder auf dem "Netzwerk"-Tab ("Beiträge deiner Kontakte") eines befreundeten Kontakts ist, den Beitrag sehen kann.
+
+Probiere es doch einfach mal aus. Wenn du fertg bist, schauen wir uns den "Netzwerk"-Tab an.
+
+
+
diff --git a/doc/de/makingnewfriends.md b/doc/de/makingnewfriends.md
new file mode 100644
index 0000000000..911b7f4a89
--- /dev/null
+++ b/doc/de/makingnewfriends.md
@@ -0,0 +1,16 @@
+Neue Freunde finden
+==============
+
+* [Zur Startseite der Hilfe](help)
+
+Hier siehst du die Kontaktvorschläge. Wenn du dich mal verirrt hast, kannst du diesen Link klicken und wieder hierher kommen.
+
+Diese Seite ist ein wenig wie die Kontaktvorschläge in Facebook. Jeder auf dieser Liste hat zugestimmt, als Kontaktvorschlag zu erscheinen. Das bedeutet, das sie Anfragen meist nicht ablehnen, da sie neue Leute kennenlernen wollen.
+
+Siehst du jemanden, dessen Aussehen du magst? Klicke auf den "Verbinden"-Button beim Foto. Als nächstes kommst du zur Seite "Freundschafts-/Kontaktanfrage". Fülle das Formular wie vorgegeben aus und trage optional eine kleine Notiz ein. Nun musst du nur noch auf die Bestätigung warten. Beachte dabei, dass es sich um reale Personen handelt und es somit etwas dauern kann. Jetzt, nachdem du jemanden hinzugefügt hast, weißt du vielleicht nicht mehr, wie du zurückkommst. Klicke einfach auf den Link oben auf dieser Seite und du kommst zurück zur Seite mit den Kontaktvorschlägen, um weitere Personen hinzuzufügen.
+
+Du willst nicht einfach Personen hinzufügen, die du nicht kennst? Kein Problem - an dieser Stelle kommen wir zu den Gruppen und Seiten.
+
+
+
+
diff --git a/doc/de/network.md b/doc/de/network.md
new file mode 100644
index 0000000000..37eeec869d
--- /dev/null
+++ b/doc/de/network.md
@@ -0,0 +1,14 @@
+Deine "Netzwerk"-Seite
+==============
+
+* [Zur Startseite der Hilfe](help)
+
+Das ist dein "Netzwerk"-Tab. Wenn du dich mal verirrt hast, kannst du diesen Link klicken, um wieder hierher zu kommen.
+
+Diese Seite ist ein wenig wie die News-Seite in Facebook oder der Stream in Diaspora. Hier findest du alle Beiträge deiner Kontakte, Gruppen und Feeds, die du eingetragen hast. Wenn du neu bist, siehst du hier noch nichts, falls du deinen Status im letzten Schritt noch nicht eingetragen hast. Wenn du bereits ein paar Freunde eingetragen hast, findest du hier ihre Beiträge. Hier kannst du Beiträge kommentieren, eintragen, dass du den Beitrag magst oder ablehnst oder die Profile durch einen Klick auf deren Namen anschauen und auf deren Seite ("Wall") Nachrichten schreiben.
+
+Nun wollen wir diese Seite mit Inhalt füllen. Der erste Schritt ist es, Leute zu deinem Account hinzuzufügen.
+
+
+
+
diff --git a/doc/groupsandpages.md b/doc/groupsandpages.md
new file mode 100644
index 0000000000..5cfbc653cf
--- /dev/null
+++ b/doc/groupsandpages.md
@@ -0,0 +1,11 @@
+This is the global directory. If you get lost, you can click this link to bring yourself back here.
+
+On this page, you'll find a collection of groups, forums and celebrity pages. Groups are not real people. Connecting to them is similar to "liking" something on Facebook, or signing up for a new forum. You don't have to feel awkward about introducing yourself to a new person, because they're not people!
+
+When you connect to a group, all messages to that group will start appearing in your network tab. You can comment on these posts, or post to the group yourself without ever having to add any of the groups members. This is a great way to make friends dynamically - you'll find people you like and add each other naturally instead of adding random strangers. Simply find a group you're interested in, and connect to it the same way you did with people in the last section. There are a lot of groups, and you're likely to get lost. Remember the link at the top of this page will bring you back here.
+
+Once you've added some groups, move on to the next section.
+
+
+
+
diff --git a/doc/guide.md b/doc/guide.md
new file mode 100644
index 0000000000..d76af92e25
--- /dev/null
+++ b/doc/guide.md
@@ -0,0 +1,13 @@
+First things first, let's make sure you're logged in to your account. If you're not already logged in, do so in the frame below.
+
+Once you've logged in (or if you are already logged in), you'll now be looking at your profile page.
+
+This is a bit like your Facebook wall. It's where all your status messgages are kept, and where your friends come to post on your wall. To write your status, simply click in the box that says "share". When you do this, the box will expand. You can see some formatting options at the top such as Bold, Italics and Underline, as well as ways to add links and pictures. At the bottom you'll find some more links. You can use these to upload pictures and files from your computer, share websites with a bit of preview text, or embed video and audio files from elsewhere on the web. You can also set your post location here.
+
+Once you've finished writing your post, click on the padlock icon to select who can see it. If you do not use the padlock icon, your post will be public. This means it will appear to anybody who views your profile, and in the community tab if your site has it enabled, as well as in the network tab of any of your contacts.
+
+Play around with this a bit, then when you're ready to move on, we'll take a look at the Network Tab
+
+
+
+
diff --git a/doc/makingnewfriends.md b/doc/makingnewfriends.md
new file mode 100644
index 0000000000..7eff1eda10
--- /dev/null
+++ b/doc/makingnewfriends.md
@@ -0,0 +1,11 @@
+This is your Suggested Friends page. If you get lost, you can click this link to bring yourself back here.
+
+This is a bit like the Friend Suggestions page of Facebook. Everybody on this list has agreed that they may be suggested as a friend. This means they're unlikely to refuse an introduction you send, and they want to meet new people too!
+
+See somebody you like the look of? Click the connect button beneath their photograph. This will bring you to the introductions page. Fill in the form as instructed, and add a small note (optional). Now, wait a bit and they'll accept your request - note that these are real people, and it might take a while. Now you've added one, you're probably lost. Click the link at the top of this page to go back to the suggested friends list and add some more.
+
+Feel uncomfortable adding people you don't know? Don't worry - that's where Groups and Pages come in!
+
+
+
+
diff --git a/doc/network.md b/doc/network.md
new file mode 100644
index 0000000000..08ddca290e
--- /dev/null
+++ b/doc/network.md
@@ -0,0 +1,9 @@
+This is your Network Tab. If you get lost, you can click this link to bring yourself back here.
+
+This is a bit like the Newsfeed at Facebook or the Stream at Diaspora. It's where all the posts from your contacts, groups, and feeds will appear. If you're new, you won't see anything in this page, unless you posted your status in the last step. If you've already added a few friends, you'll be able to see their posts. Here, you can comment, like, or dislike posts, or click on somebody's name to visit their profile page where you can write on their wall.
+
+Now we need to fill it up, the first step, is to make some new friends.
+
+
+
+
diff --git a/include/Contact.php b/include/Contact.php
index d39d7a28b6..04d3fa9e5d 100644
--- a/include/Contact.php
+++ b/include/Contact.php
@@ -219,16 +219,16 @@ function contact_photo_menu($contact) {
$poke_link = $a->get_baseurl() . '/poke/?f=&c=' . $contact['id'];
$contact_url = $a->get_baseurl() . '/contacts/' . $contact['id'];
- $posts_link = $a->get_baseurl() . '/network/?cid=' . $contact['id'];
+ $posts_link = $a->get_baseurl() . '/network/0?nets=all&cid=' . $contact['id'];
$menu = Array(
- t("Poke") => $poke_link,
- t("View Status") => $status_link,
- t("View Profile") => $profile_link,
- t("View Photos") => $photos_link,
- t("Network Posts") => $posts_link,
- t("Edit Contact") => $contact_url,
- t("Send PM") => $pm_url,
+ 'poke' => array(t("Poke"), $poke_link),
+ 'status' => array(t("View Status"), $status_link),
+ 'profile' => array(t("View Profile"), $profile_link),
+ 'photos' => array(t("View Photos"), $photos_link),
+ 'network' => array(t("Network Posts"), $posts_link),
+ 'edit' => array(t("Edit Contact"), $contact_url),
+ 'pm' => array(t("Send PM"), $pm_url),
);
@@ -236,7 +236,7 @@ function contact_photo_menu($contact) {
call_hooks('contact_photo_menu', $args);
- $o = "";
+/* $o = "";
foreach($menu as $k=>$v){
if ($v!="") {
if(($k !== t("Network Posts")) && ($k !== t("Send PM")) && ($k !== t('Edit Contact')))
@@ -245,7 +245,16 @@ function contact_photo_menu($contact) {
$o .= "
';
}
return $o;
}}
@@ -978,8 +982,6 @@ function status_editor($a,$x, $notes_cid = 0, $popup=false) {
));
- $tpl = get_markup_template("jot.tpl");
-
$jotplugins = '';
$jotnets = '';
@@ -1010,10 +1012,31 @@ function status_editor($a,$x, $notes_cid = 0, $popup=false) {
if($notes_cid)
$jotnets .= '';
+
+ // Private/public post links for the non-JS ACL form
+ $private_post = 1;
+ if($_REQUEST['public'])
+ $private_post = 0;
+
+ $query_str = $a->query_string;
+ if(strpos($query_str, 'public=1') !== false)
+ $query_str = str_replace(array('?public=1', '&public=1'), array('', ''), $query_str);
+
+ // I think $a->query_string may never have ? in it, but I could be wrong
+ // It looks like it's from the index.php?q=[etc] rewrite that the web
+ // server does, which converts any ? to &, e.g. suggest&ignore=61 for suggest?ignore=61
+ if(strpos($query_str, '?') === false)
+ $public_post_link = '?public=1';
+ else
+ $public_post_link = '&public=1';
+
+
+
// $tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins));
+ $tpl = get_markup_template("jot.tpl");
$o .= replace_macros($tpl,array(
- '$return_path' => $a->query_string,
+ '$return_path' => $query_str,
'$action' => $a->get_baseurl(true) . '/item',
'$share' => (x($x,'button') ? $x['button'] : t('Share')),
'$upload' => t('Upload photo'),
@@ -1049,14 +1072,22 @@ function status_editor($a,$x, $notes_cid = 0, $popup=false) {
'$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' => ((feature_enabled($x['profile_uid'],'preview')) ? t('Preview') : ''),
'$jotplugins' => $jotplugins,
'$sourceapp' => t($a->sourcename),
'$cancel' => t('Cancel'),
- '$rand_num' => random_digits(12)
+ '$rand_num' => random_digits(12),
+
+ // ACL permissions box
+ '$acl' => $x['acl'],
+ '$acl_data' => $x['acl_data'],
+ '$group_perms' => t('Post to Groups'),
+ '$contact_perms' => t('Post to Contacts'),
+ '$private' => t('Private post'),
+ '$is_private' => $private_post,
+ '$public_link' => $public_post_link,
));
diff --git a/include/dbupdate.php b/include/dbupdate.php
index 6ae1bf10e7..eb2eda48da 100644
--- a/include/dbupdate.php
+++ b/include/dbupdate.php
@@ -19,7 +19,7 @@ function dbupdate_run(&$argv, &$argc) {
load_config('config');
load_config('system');
- check_config($a);
+ update_db($a);
}
if (array_search(__file__,get_included_files())===0){
diff --git a/include/enotify.php b/include/enotify.php
index 9c405c101b..b87b159eb6 100644
--- a/include/enotify.php
+++ b/include/enotify.php
@@ -56,12 +56,13 @@ function notification($params) {
$parent_id = $params['parent'];
- // Check to see if there was already a tag notify for this post.
+ // Check to see if there was already a tag notify or comment notify for this post.
// If so don't create a second notification
$p = null;
- $p = q("select id from notify where type = %d and link = '%s' and uid = %d limit 1",
+ $p = q("select id from notify where ( type = %d or type = %d ) and link = '%s' and uid = %d limit 1",
intval(NOTIFY_TAGSELF),
+ intval(NOTIFY_COMMENT),
dbesc($params['link']),
intval($params['uid'])
);
@@ -299,6 +300,38 @@ function notification($params) {
return;
}
+ // we seem to have a lot of duplicate comment notifications due to race conditions, mostly from forums
+ // After we've stored everything, look again to see if there are any duplicates and if so remove them
+
+ $p = null;
+ $p = q("select id from notify where ( type = %d or type = %d ) and link = '%s' and uid = %d order by id",
+ intval(NOTIFY_TAGSELF),
+ intval(NOTIFY_COMMENT),
+ dbesc($params['link']),
+ intval($params['uid'])
+ );
+ if($p && (count($p) > 1)) {
+ for ($d = 1; $d < count($p); $d ++) {
+ q("delete from notify where id = %d limit 1",
+ intval($p[$d]['id'])
+ );
+ }
+
+ // only continue on if we stored the first one
+
+ if($notify_id != $p[0]['id']) {
+ pop_lang();
+ return;
+ }
+ }
+
+
+
+
+
+
+
+
$itemlink = $a->get_baseurl() . '/notify/view/' . $notify_id;
$msg = replace_macros($epreamble,array('$itemlink' => $itemlink));
$r = q("update notify set msg = '%s' where id = %d and uid = %d limit 1",
diff --git a/include/items.php b/include/items.php
index 13566075ba..46eafdc25b 100755
--- a/include/items.php
+++ b/include/items.php
@@ -3665,7 +3665,7 @@ function fix_private_photos($s, $uid, $item = null, $cid = 0) {
// Only embed locally hosted photos
$replace = false;
$i = basename($image);
- $i = str_replace(array('.jpg','.png'),array('',''),$i);
+ $i = str_replace(array('.jpg','.png','.gif'),array('','',''),$i);
$x = strpos($i,'-');
if($x) {
@@ -3676,7 +3676,7 @@ function fix_private_photos($s, $uid, $item = null, $cid = 0) {
intval($res),
intval($uid)
);
- if(count($r)) {
+ if($r) {
// Check to see if we should replace this photo link with an embedded image
// 1. No need to do so if the photo is public
@@ -3945,6 +3945,34 @@ function drop_item($id,$interactive = true) {
if((local_user() == $item['uid']) || ($cid) || (! $interactive)) {
+ // Check if we should do HTML-based delete confirmation
+ if($_REQUEST['confirm']) {
+ // ');n.setAttribute("action",t.action),n.setAttribute("target",e.name),n.style.display="none",document.body.appendChild(n);for(var r in t.data)if(t.data.hasOwnProperty(r)){var i=document.createElement("input");i.setAttribute("type","hidden"),i.setAttribute("name",r),i.setAttribute("value",t.data[r]),n.appendChild(i)}return n},_getResponse:function(iframe,file){var toDeleteFlag=!1,self=this,settings=this._settings;addEvent(iframe,"load",function(){if(iframe.src=="javascript:'%3Chtml%3E%3C/html%3E';"||iframe.src=="javascript:'';"){toDeleteFlag&&setTimeout(function(){removeNode(iframe)},0);return}var doc=iframe.contentDocument?iframe.contentDocument:window.frames[iframe.id].document;if(doc.readyState&&doc.readyState!="complete")return;if(doc.body&&doc.body.innerHTML=="false")return;var response;doc.XMLDocument?response=doc.XMLDocument:doc.body?(response=doc.body.innerHTML,settings.responseType&&settings.responseType.toLowerCase()=="json"&&(doc.body.firstChild&&doc.body.firstChild.nodeName.toUpperCase()=="PRE"&&(doc.normalize(),response=doc.body.firstChild.firstChild.nodeValue),response?response=eval("("+response+")"):response={})):response=doc,settings.onComplete.call(self,file,response),toDeleteFlag=!0,iframe.src="javascript:'';"})},submit:function(){var e=this,t=this._settings;if(!this._input||this._input.value==="")return;var n=fileFromPath(this._input.value);if(!1===t.onSubmit.call(this,n,getExt(n))){this._clearInput();return}var r=this._createIframe(),i=this._createForm(r);removeNode(this._input.parentNode),removeClass(e._button,e._settings.hoverClass),removeClass(e._button,e._settings.focusClass),i.appendChild(this._input),i.submit(),removeNode(i),i=null,removeNode(this._input),this._input=null,this._getResponse(r,n),this._createInput()}}})();
\ No newline at end of file
+(function(){function log(){if(typeof console!="undefined"&&typeof console.log=="function"){Array.prototype.unshift.call(arguments,"[Ajax Upload]");console.log(Array.prototype.join.call(arguments," "))}}function addEvent(el,type,fn){if(el.addEventListener){el.addEventListener(type,fn,false)}else if(el.attachEvent){el.attachEvent("on"+type,function(){fn.call(el)})}else{throw new Error("not supported or DOM not loaded")}}function addResizeEvent(fn){var timeout;addEvent(window,"resize",function(){if(timeout){clearTimeout(timeout)}timeout=setTimeout(fn,100)})}if(document.documentElement.getBoundingClientRect){var getOffset=function(el){var box=el.getBoundingClientRect();var doc=el.ownerDocument;var body=doc.body;var docElem=doc.documentElement;var clientTop=docElem.clientTop||body.clientTop||0;var clientLeft=docElem.clientLeft||body.clientLeft||0;var zoom=1;if(body.getBoundingClientRect){var bound=body.getBoundingClientRect();zoom=(bound.right-bound.left)/body.clientWidth}if(zoom>1){clientTop=0;clientLeft=0}var top=box.top/zoom+(window.pageYOffset||docElem&&docElem.scrollTop/zoom||body.scrollTop/zoom)-clientTop,left=box.left/zoom+(window.pageXOffset||docElem&&docElem.scrollLeft/zoom||body.scrollLeft/zoom)-clientLeft;return{top:top,left:left}}}else{var getOffset=function(el){var top=0,left=0;do{top+=el.offsetTop||0;left+=el.offsetLeft||0;el=el.offsetParent}while(el);return{left:left,top:top}}}function getBox(el){var left,right,top,bottom;var offset=getOffset(el);left=offset.left;top=offset.top;right=left+el.offsetWidth;bottom=top+el.offsetHeight;return{left:left,right:right,top:top,bottom:bottom}}function addStyles(el,styles){for(var name in styles){if(styles.hasOwnProperty(name)){el.style[name]=styles[name]}}}function copyLayout(from,to){var box=getBox(from);addStyles(to,{position:"absolute",left:box.left+"px",top:box.top+"px",width:from.offsetWidth+"px",height:from.offsetHeight+"px"});to.title=from.title}var toElement=function(){var div=document.createElement("div");return function(html){div.innerHTML=html;var el=div.firstChild;return div.removeChild(el)}}();var getUID=function(){var id=0;return function(){return"ValumsAjaxUpload"+id++}}();function fileFromPath(file){return file.replace(/.*(\/|\\)/,"")}function getExt(file){return-1!==file.indexOf(".")?file.replace(/.*[.]/,""):""}function hasClass(el,name){var re=new RegExp("\\b"+name+"\\b");return re.test(el.className)}function addClass(el,name){if(!hasClass(el,name)){el.className+=" "+name}}function removeClass(el,name){var re=new RegExp("\\b"+name+"\\b");el.className=el.className.replace(re,"")}function removeNode(el){el.parentNode.removeChild(el)}window.AjaxUpload=function(button,options){this._settings={action:"upload.php",name:"userfile",data:{},autoSubmit:true,responseType:false,hoverClass:"hover",focusClass:"focus",disabledClass:"disabled",onChange:function(file,extension){},onSubmit:function(file,extension){},onComplete:function(file,response){}};for(var i in options){if(options.hasOwnProperty(i)){this._settings[i]=options[i]}}if(button.jquery){button=button[0]}else if(typeof button=="string"){if(/^#.*/.test(button)){button=button.slice(1)}button=document.getElementById(button)}if(!button||button.nodeType!==1){throw new Error("Please make sure that you're passing a valid element")}if(button.nodeName.toUpperCase()=="A"){addEvent(button,"click",function(e){if(e&&e.preventDefault){e.preventDefault()}else if(window.event){window.event.returnValue=false}})}this._button=button;this._input=null;this._disabled=false;this.enable();this._rerouteClicks()};AjaxUpload.prototype={setData:function(data){this._settings.data=data},disable:function(){addClass(this._button,this._settings.disabledClass);this._disabled=true;var nodeName=this._button.nodeName.toUpperCase();if(nodeName=="INPUT"||nodeName=="BUTTON"){this._button.setAttribute("disabled","disabled")}if(this._input){this._input.parentNode.style.visibility="hidden"}},enable:function(){removeClass(this._button,this._settings.disabledClass);this._button.removeAttribute("disabled");this._disabled=false},_createInput:function(){var self=this;var input=document.createElement("input");input.setAttribute("type","file");input.setAttribute("name",this._settings.name);addStyles(input,{position:"absolute",right:0,margin:0,padding:0,fontSize:"480px",fontFamily:"sans-serif",cursor:"pointer"});var div=document.createElement("div");addStyles(div,{display:"block",position:"absolute",overflow:"hidden",margin:0,padding:0,opacity:0,direction:"ltr",zIndex:2147483583,cursor:"pointer"});if(div.style.opacity!=="0"){if(typeof div.filters=="undefined"){throw new Error("Opacity not supported by the browser")}div.style.filter="alpha(opacity=0)"}addEvent(input,"change",function(){if(!input||input.value===""){return}var file=fileFromPath(input.value);if(false===self._settings.onChange.call(self,file,getExt(file))){self._clearInput();return}if(self._settings.autoSubmit){self.submit()}});addEvent(input,"mouseover",function(){addClass(self._button,self._settings.hoverClass)});addEvent(input,"mouseout",function(){removeClass(self._button,self._settings.hoverClass);removeClass(self._button,self._settings.focusClass);input.parentNode.style.visibility="hidden"});addEvent(input,"focus",function(){addClass(self._button,self._settings.focusClass)});addEvent(input,"blur",function(){removeClass(self._button,self._settings.focusClass)});div.appendChild(input);document.body.appendChild(div);this._input=input},_clearInput:function(){if(!this._input){return}removeNode(this._input.parentNode);this._input=null;this._createInput();removeClass(this._button,this._settings.hoverClass);removeClass(this._button,this._settings.focusClass)},_rerouteClicks:function(){var self=this;addEvent(self._button,"mouseover",function(){if(self._disabled){return}if(!self._input){self._createInput()}var div=self._input.parentNode;copyLayout(self._button,div);div.style.visibility="visible"})},_createIframe:function(){var id=getUID();var iframe=toElement('');iframe.setAttribute("id",id);iframe.style.display="none";document.body.appendChild(iframe);return iframe},_createForm:function(iframe){var settings=this._settings;var form=toElement('');form.setAttribute("action",settings.action);form.setAttribute("target",iframe.name);form.style.display="none";document.body.appendChild(form);for(var prop in settings.data){if(settings.data.hasOwnProperty(prop)){var el=document.createElement("input");el.setAttribute("type","hidden");el.setAttribute("name",prop);el.setAttribute("value",settings.data[prop]);form.appendChild(el)}}return form},_getResponse:function(iframe,file){var toDeleteFlag=false,self=this,settings=this._settings;addEvent(iframe,"load",function(){if(iframe.src=="javascript:'%3Chtml%3E%3C/html%3E';"||iframe.src=="javascript:'';"){if(toDeleteFlag){setTimeout(function(){removeNode(iframe)},0)}return}var doc=iframe.contentDocument?iframe.contentDocument:window.frames[iframe.id].document;if(doc.readyState&&doc.readyState!="complete"){return}if(doc.body&&doc.body.innerHTML=="false"){return}var response;if(doc.XMLDocument){response=doc.XMLDocument}else if(doc.body){response=doc.body.innerHTML;if(settings.responseType&&settings.responseType.toLowerCase()=="json"){if(doc.body.firstChild&&doc.body.firstChild.nodeName.toUpperCase()=="PRE"){doc.normalize();response=doc.body.firstChild.firstChild.nodeValue}if(response){response=eval("("+response+")")}else{response={}}}}else{response=doc}settings.onComplete.call(self,file,response);toDeleteFlag=true;iframe.src="javascript:'';"})},submit:function(){var self=this,settings=this._settings;if(!this._input||this._input.value===""){return}var file=fileFromPath(this._input.value);if(false===settings.onSubmit.call(this,file,getExt(file))){this._clearInput();return}var iframe=this._createIframe();var form=this._createForm(iframe);removeNode(this._input.parentNode);removeClass(self._button,self._settings.hoverClass);removeClass(self._button,self._settings.focusClass);form.appendChild(this._input);form.submit();removeNode(form);form=null;removeNode(this._input);this._input=null;this._getResponse(iframe,file);this._createInput()}}})();
\ No newline at end of file
diff --git a/js/country.min.js b/js/country.min.js
index df293530e9..90b335d666 100644
--- a/js/country.min.js
+++ b/js/country.min.js
@@ -1,11 +1,2 @@
-//
+
+
+
This content comes from a hidden element on this page.
+
The inline option preserves bound JavaScript events and changes, and it puts the content back where it came from when it is closed.